added rest of game in current state
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
v "bitbucket.org/hackerbots/vector"
|
||||
"log"
|
||||
)
|
||||
|
||||
type weapon struct {
|
||||
Strength float64 `json:"strength"`
|
||||
Radius float64 `json:"radius"`
|
||||
}
|
||||
|
||||
type stats struct {
|
||||
Speed float64 `json:"speed"`
|
||||
Hp int `json:"hp"`
|
||||
WeaponRadius int `json:"weapon_radius"`
|
||||
ScannerRadius int `json:"scanner_radius"`
|
||||
}
|
||||
|
||||
func (s stats) valid() bool {
|
||||
total := int(s.Speed) + s.Hp + s.WeaponRadius + s.ScannerRadius
|
||||
log.Printf("total: %d", total)
|
||||
if total > 500 {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
type scanner struct {
|
||||
Position v.Point2d `json:"position"`
|
||||
Stats stats `json:"stats"`
|
||||
}
|
||||
|
||||
type robot struct {
|
||||
Id string `json:"id"`
|
||||
Stats stats `json:"stats"`
|
||||
Health int `json:"health"`
|
||||
Position v.Point2d `json:"position"`
|
||||
MoveTo v.Point2d `json:"move_to"`
|
||||
FireAt v.Point2d `json:"fire_at"`
|
||||
Scanners []scanner `json:"scanners"`
|
||||
}
|
||||
|
||||
type robotSorter struct {
|
||||
robots []robot
|
||||
}
|
||||
|
||||
func (s robotSorter) Len() int {
|
||||
return len(s.robots)
|
||||
}
|
||||
|
||||
func (s robotSorter) Swap(i, j int) {
|
||||
s.robots[i], s.robots[j] = s.robots[j], s.robots[i]
|
||||
}
|
||||
|
||||
func (s robotSorter) Less(i, j int) bool {
|
||||
return s.robots[i].Id < s.robots[j].Id
|
||||
}
|
||||
|
||||
type projectile struct {
|
||||
Id string `json:"id"`
|
||||
Position v.Point2d `json:"position"`
|
||||
MoveTo v.Point2d `json:"move_to"`
|
||||
Radius int `json:"radius"`
|
||||
Speed float64 `json:"speed"`
|
||||
Damage int `json:"damage"`
|
||||
}
|
||||
|
||||
func (p *projectile) nudge() {
|
||||
newPos := move(p.Position, p.MoveTo, float64(p.Speed), delta)
|
||||
|
||||
hit_player := false
|
||||
for player := range g.players {
|
||||
if player.Robot.Id == p.Id {
|
||||
continue
|
||||
}
|
||||
dist := distance(player.Robot.Position, p.Position)
|
||||
if dist < 5.0 {
|
||||
hit_player = true
|
||||
}
|
||||
}
|
||||
|
||||
if distance(p.Position, p.MoveTo) < 5 || hit_player {
|
||||
delete(g.projectiles, p)
|
||||
|
||||
// Spawn a splosion
|
||||
splo := &splosion{
|
||||
Id: p.Id,
|
||||
Position: p.Position,
|
||||
Radius: p.Radius,
|
||||
MaxDamage: 10,
|
||||
MinDamage: 5,
|
||||
Lifespan: 8,
|
||||
}
|
||||
g.splosions[splo] = true
|
||||
|
||||
for player := range g.players {
|
||||
dist := distance(player.Robot.Position, p.Position)
|
||||
if dist < float64(p.Radius) {
|
||||
|
||||
// TODO map damage Max to Min based on distance from explosion
|
||||
if player.Robot.Health > 0 {
|
||||
player.Robot.Health -= p.Damage
|
||||
// log.Printf("Robot %+v is injured", player.Robot)
|
||||
if player.Robot.Health <= 0 {
|
||||
// log.Printf("Robot %+v is dead", player.Robot)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
p.Position.X = newPos.X
|
||||
p.Position.Y = newPos.Y
|
||||
}
|
||||
|
||||
type splosion struct {
|
||||
Id string `json:"id"`
|
||||
Position v.Point2d `json:"position"`
|
||||
Radius int `json:"radius"`
|
||||
MaxDamage int `json:"damage"`
|
||||
MinDamage int `json:"damage"`
|
||||
Lifespan int `json:"lifespan"`
|
||||
}
|
||||
|
||||
func (s *splosion) tick() {
|
||||
s.Lifespan--
|
||||
if s.Lifespan <= 0 {
|
||||
delete(g.splosions, s)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user