Implement the start of creature AI

Add a Brain class, which determines for an entity the set of moves it
makes every step of the game, and begin to implement that for gormlaks.
The idea here is that every step of the game, a gormlak will move
towards the furthest-away wall it can see.
This commit is contained in:
Griffin Smith 2019-09-28 13:20:57 -04:00
parent 915264acae
commit 1a0f618a82
21 changed files with 493 additions and 281 deletions

View file

@ -0,0 +1,39 @@
{-# OPTIONS_GHC -fno-warn-orphans #-}
--------------------------------------------------------------------------------
module Xanthous.AI.Gormlak () where
--------------------------------------------------------------------------------
import Xanthous.Prelude hiding (lines)
--------------------------------------------------------------------------------
import Data.Coerce
import Control.Monad.State
--------------------------------------------------------------------------------
import Xanthous.Data (Positioned(..))
import qualified Xanthous.Entities.Creature as Creature
import Xanthous.Entities.Creature (Creature)
import qualified Xanthous.Entities.RawTypes as Raw
import Xanthous.Entities (Entity(..), Brain(..), brainVia)
import Xanthous.Game.State (entities, GameState)
import Xanthous.Data.EntityMap.Graphics (linesOfSight)
--------------------------------------------------------------------------------
stepGormlak :: MonadState GameState m => Positioned Creature -> m (Positioned Creature)
stepGormlak (Positioned pos creature) = do
lines <- uses entities $ linesOfSight pos (Creature.visionRadius creature)
let newPos = fromMaybe pos
$ fmap fst
. headMay <=< tailMay <=< headMay
. sortOn (Down . length)
$ lines
pure $ Positioned newPos creature
newtype GormlakBrain = GormlakBrain Creature
instance Brain GormlakBrain where
step = fmap coerce . stepGormlak . coerce
--------------------------------------------------------------------------------
instance Brain Creature where step = brainVia GormlakBrain
instance Entity Creature where
blocksVision _ = False
description = view $ Creature.creatureType . Raw.description