Don't walk gormlaks into walls

Because of the way lines are drawn, a specific configuration of
positioning for gormlaks would have them decide they desperately wanted
to walk *inside* a wall, which they would then both fail to do but also
always collide with whenever they tried to go anywhere else.
This commit is contained in:
Griffin Smith 2019-10-15 22:54:31 -04:00
parent 8a4220df83
commit 4882350f5d
3 changed files with 31 additions and 12 deletions

View file

@ -27,7 +27,9 @@ import qualified Xanthous.Entities.RawTypes as Raw
import Xanthous.Entities (Entity(..), Brain(..), brainVia)
import Xanthous.Game.State (entities, GameState, entityIs)
import Xanthous.Game.Lenses
( Collision(..), collisionAt, character, characterPosition )
( Collision(..), entityCollision, collisionAt
, character, characterPosition
)
import Xanthous.Data.EntityMap.Graphics (linesOfSight, canSee)
import Xanthous.Random
import Xanthous.Monad (say)
@ -72,9 +74,13 @@ stepGormlak ticks pe@(Positioned pos creature) = do
then attackCharacter $> pos'
else pure $ pos' `stepTowards` charPos
else do
lines <- uses entities $ linesOfSight pos' (Creature.visionRadius creature')
lines <- map (takeWhile (isNothing . entityCollision . map snd . snd)
-- the first item on these lines is always the creature itself
. fromMaybe mempty . tailMay)
. linesOfSight pos' (Creature.visionRadius creature')
<$> use entities
line <- choose $ weightedBy length lines
pure $ fromMaybe pos' $ fmap fst . headMay =<< tailMay =<< line
pure $ fromMaybe pos' $ fmap fst . headMay =<< line
vision = Creature.visionRadius creature
attackCharacter = do