70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
package tins2021
|
|
|
|
import (
|
|
"opslag.de/schobers/geom"
|
|
)
|
|
|
|
var AllMonsterTypes = []MonsterType{MonsterTypeStraight, MonsterTypeRandom, MonsterTypeChaser}
|
|
|
|
type ChasingMonster struct{}
|
|
|
|
func (m ChasingMonster) Type() MonsterType { return MonsterTypeChaser }
|
|
func (m *ChasingMonster) FindTarget(level *Level, src geom.Point) (geom.Point, bool) {
|
|
path := level.Tiles.ShortestPath(src, level.Player, func(_ geom.Point, t *Tile) bool { return !t.Occupied() })
|
|
if len(path) < 2 {
|
|
return geom.Point{}, false
|
|
}
|
|
if level.CanMonsterMoveTo(path[1]) {
|
|
return path[1], true
|
|
}
|
|
return geom.Point{}, false
|
|
}
|
|
|
|
type Monster interface {
|
|
Type() MonsterType
|
|
FindTarget(*Level, geom.Point) (geom.Point, bool)
|
|
}
|
|
|
|
type Monsters map[geom.Point]Monster
|
|
|
|
type MonsterType int
|
|
|
|
const (
|
|
MonsterTypeStraight MonsterType = iota
|
|
MonsterTypeRandom
|
|
MonsterTypeChaser
|
|
)
|
|
|
|
type RandomWalkingMonster struct{}
|
|
|
|
func (m RandomWalkingMonster) Type() MonsterType { return MonsterTypeRandom }
|
|
func (m *RandomWalkingMonster) FindTarget(level *Level, src geom.Point) (geom.Point, bool) {
|
|
for i := 0; i < 5; i++ {
|
|
dir := RandomDirection()
|
|
dst, ok := level.CanMonsterMove(src, dir)
|
|
if ok {
|
|
return dst, true
|
|
}
|
|
}
|
|
return geom.Point{}, false
|
|
}
|
|
|
|
type StraightWalkingMonster struct {
|
|
Direction Direction
|
|
}
|
|
|
|
func (m StraightWalkingMonster) Type() MonsterType { return MonsterTypeStraight }
|
|
func (m *StraightWalkingMonster) FindTarget(level *Level, src geom.Point) (geom.Point, bool) {
|
|
dst, ok := level.CanMonsterMove(src, m.Direction)
|
|
if ok {
|
|
return dst, true
|
|
}
|
|
reverse := m.Direction.Reverse()
|
|
dst, ok = level.CanMonsterMove(src, reverse)
|
|
if ok {
|
|
m.Direction = reverse
|
|
return dst, true
|
|
}
|
|
return geom.Point{}, false
|
|
}
|