tins2021/monsters.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
}