2013-10-20 20:54:19 -07:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
v "bitbucket.org/hackerbots/vector"
|
2013-11-06 20:47:40 -08:00
|
|
|
"log"
|
2013-10-20 20:54:19 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
type Projectile struct {
|
|
|
|
Id string `json:"id"`
|
|
|
|
Position v.Point2d `json:"position"`
|
|
|
|
MoveTo v.Point2d `json:"-"`
|
2013-11-06 20:32:56 -08:00
|
|
|
Radius int `json:"-"`
|
2013-10-20 20:54:19 -07:00
|
|
|
Speed float32 `json:"-"`
|
|
|
|
Damage int `json:"-"`
|
2013-11-08 21:25:42 -08:00
|
|
|
Owner *Robot `json:"-"`
|
2013-10-20 20:54:19 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Projectile) Tick(g *game) {
|
|
|
|
vec := p.MoveTo.Sub(p.Position)
|
|
|
|
v_norm := vec.Normalize()
|
|
|
|
v_scaled := v_norm.Scale(p.Speed * delta)
|
|
|
|
newPos := p.Position.Add(v_scaled)
|
|
|
|
|
|
|
|
hit_player := false
|
|
|
|
for player := range g.players {
|
2013-11-08 21:25:42 -08:00
|
|
|
for _, r := range player.Robots {
|
2013-11-08 22:26:56 -08:00
|
|
|
if r == p.Owner {
|
2013-11-08 21:25:42 -08:00
|
|
|
continue
|
|
|
|
}
|
2013-11-06 20:47:40 -08:00
|
|
|
|
2013-11-08 21:25:42 -08:00
|
|
|
player_rect := v.RectFromPoint(r.Position, 3)
|
|
|
|
collision, _, _ := v.RectIntersection(player_rect, p.Position, v_scaled)
|
|
|
|
if collision {
|
|
|
|
hit_player = true
|
2013-11-06 20:47:40 -08:00
|
|
|
|
2013-11-08 21:25:42 -08:00
|
|
|
if r.Health > 0 {
|
|
|
|
// Direct hit causes more damage
|
|
|
|
log.Printf("Direct Hit %v, Dmg:%v", r.Id, p.Damage)
|
2013-11-06 20:47:40 -08:00
|
|
|
|
2013-11-08 21:25:42 -08:00
|
|
|
r.Health -= p.Damage
|
|
|
|
r.Hit = true
|
|
|
|
}
|
2013-11-06 20:47:40 -08:00
|
|
|
}
|
2013-10-20 20:54:19 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Are we going to intersect the destination zone in this tick?
|
2013-10-21 07:49:56 -07:00
|
|
|
r_dest := v.RectFromPoint(p.MoveTo, 3.0)
|
2013-10-20 20:54:19 -07:00
|
|
|
|
|
|
|
travel := newPos.Sub(p.Position)
|
2013-10-28 07:54:49 -07:00
|
|
|
arrived, _, pos := v.RectIntersection(r_dest, p.Position, travel)
|
2013-10-25 22:30:15 -07:00
|
|
|
|
|
|
|
if !arrived {
|
|
|
|
for _, obj := range g.obstacles {
|
2013-10-28 07:54:49 -07:00
|
|
|
collision, _, pos := v.RectIntersection(obj.Bounds, p.Position, travel)
|
2013-10-25 22:30:15 -07:00
|
|
|
if collision {
|
|
|
|
arrived = true
|
2013-10-28 07:54:49 -07:00
|
|
|
p.Position = pos
|
2013-10-25 22:30:15 -07:00
|
|
|
}
|
|
|
|
}
|
2013-10-28 07:54:49 -07:00
|
|
|
} else {
|
|
|
|
p.Position = pos
|
2013-10-25 22:30:15 -07:00
|
|
|
}
|
|
|
|
|
2013-10-20 20:54:19 -07:00
|
|
|
if arrived || hit_player {
|
|
|
|
delete(g.projectiles, p)
|
|
|
|
|
|
|
|
// Spawn a splosion
|
|
|
|
splo := &Splosion{
|
2013-11-06 20:47:40 -08:00
|
|
|
Id: p.Id,
|
|
|
|
Position: p.Position,
|
|
|
|
Radius: p.Radius,
|
|
|
|
Lifespan: 8,
|
2013-10-20 20:54:19 -07:00
|
|
|
}
|
|
|
|
g.splosions[splo] = true
|
|
|
|
|
|
|
|
for player := range g.players {
|
2013-11-08 21:25:42 -08:00
|
|
|
for _, r := range player.Robots {
|
|
|
|
dist := v.Distance(r.Position, p.Position)
|
|
|
|
if dist < float32(p.Radius) {
|
|
|
|
if r.Health > 0 {
|
|
|
|
r.Health -= p.Damage
|
|
|
|
r.Hit = true
|
|
|
|
}
|
2013-10-20 20:54:19 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
p.Position.X = newPos.X
|
|
|
|
p.Position.Y = newPos.Y
|
|
|
|
}
|
|
|
|
}
|