You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.2 KiB
89 lines
2.2 KiB
package server |
|
|
|
import ( |
|
"encoding/json" |
|
"math" |
|
"math/rand" |
|
|
|
v "hackerbots.us/vector" |
|
) |
|
|
|
// Obstacle is the implementation of the generic building type in the game. |
|
type Obstacle struct { |
|
Bounds v.AABB2d `json:"bounds"` |
|
Hp int `json:"-"` |
|
} |
|
|
|
func (o *Obstacle) MarshalJSON() ([]byte, error) { |
|
payload := [4]float64{ |
|
o.Bounds.A.X, |
|
o.Bounds.A.Y, |
|
|
|
o.Bounds.B.X, |
|
o.Bounds.B.Y, |
|
} |
|
return json.Marshal(payload) |
|
} |
|
|
|
func (o *Obstacle) UnmarshalJSON(incoming []byte) error { |
|
payload := [4]float64{} |
|
err := json.Unmarshal(incoming, &payload) |
|
if err != nil { |
|
return err |
|
} |
|
o.Bounds = v.AABB2d{ |
|
A: v.Point2d{X: payload[0], Y: payload[1]}, |
|
B: v.Point2d{X: payload[2], Y: payload[3]}, |
|
} |
|
return nil |
|
} |
|
|
|
func (o Obstacle) distance_from_point(p v.Point2d) float64 { |
|
dist := math.MaxFloat32 |
|
|
|
dist = math.Min(dist, float64(p.Sub(o.Bounds.A).Mag())) |
|
dist = math.Min(dist, float64(p.Sub(o.Bounds.B).Mag())) |
|
dist = math.Min(dist, float64(p.Sub(v.Point2d{X: o.Bounds.A.X, Y: o.Bounds.B.Y}).Mag())) |
|
dist = math.Min(dist, float64(p.Sub(v.Point2d{X: o.Bounds.B.X, Y: o.Bounds.A.Y}).Mag())) |
|
|
|
return dist |
|
} |
|
|
|
func obstacleFromValues(x, y, w, h float64, hp int) (o Obstacle) { |
|
return Obstacle{ |
|
Bounds: v.AABB2d{ |
|
A: v.Point2d{X: x, Y: y}, |
|
B: v.Point2d{X: x + w, Y: y + h}, |
|
}, |
|
Hp: hp, |
|
} |
|
} |
|
|
|
// GenerateObstacles returns a slice of (count) obstacles within a region |
|
// bounded by width, height. |
|
func GenerateObstacles(count int, width, height float64) []Obstacle { |
|
out := []Obstacle{} |
|
|
|
// Create obstacles that cover the edges of the world, so we don't need to |
|
// special case collision at the edges |
|
// left wall |
|
out = append(out, obstacleFromValues(0, 5, 5, height-10, 0)) |
|
// // right wall |
|
out = append(out, obstacleFromValues(width-5, 5, 5, height-10, 0)) |
|
// // top wall |
|
out = append(out, obstacleFromValues(0, height-5, width, 5, 0)) |
|
// bottom wall |
|
out = append(out, obstacleFromValues(0, 0, width, 5, 0)) |
|
|
|
// Now create N random objects somewhere in the world |
|
for i := 0; i < count; i++ { |
|
x := rand.Float64() * (width - (width / 10)) |
|
y := rand.Float64() * (height - (height / 10)) |
|
w := rand.Float64()*(width/10) + 20 |
|
h := rand.Float64()*(height/10) + 20 |
|
out = append( |
|
out, |
|
obstacleFromValues(x, y, w, h, 10000)) |
|
} |
|
return out |
|
}
|
|
|