Tweak gormlak movement slightly

- Don't let gormlaks run into things like walls or each other
- Add a small element of randomness to gormlaks' motion
- Increase gormlaks' vision by a large amount
This commit is contained in:
Griffin Smith 2019-09-28 15:02:30 -04:00
parent abea2dcfac
commit ec39dc0a5b
8 changed files with 115 additions and 36 deletions

View file

@ -6,25 +6,43 @@ import Xanthous.Prelude hiding (lines)
--------------------------------------------------------------------------------
import Data.Coerce
import Control.Monad.State
import Control.Monad.Random
--------------------------------------------------------------------------------
import Xanthous.Data (Positioned(..))
import Xanthous.Data (Positioned(..), positioned)
import Xanthous.Data.EntityMap
import qualified Xanthous.Entities.Creature as Creature
import Xanthous.Entities.Creature (Creature)
import Xanthous.Entities.Character (Character)
import qualified Xanthous.Entities.RawTypes as Raw
import Xanthous.Entities (Entity(..), Brain(..), brainVia)
import Xanthous.Game.State (entities, GameState)
import Xanthous.Game.State (entities, GameState, entityIs)
import Xanthous.Game.Lenses (Collision(..), collisionAt)
import Xanthous.Data.EntityMap.Graphics (linesOfSight)
import Xanthous.Random
--------------------------------------------------------------------------------
stepGormlak :: MonadState GameState m => Positioned Creature -> m (Positioned Creature)
stepGormlak (Positioned pos creature) = do
stepGormlak
:: (MonadState GameState m, MonadRandom m)
=> Positioned Creature
-> m (Positioned Creature)
stepGormlak pe@(Positioned pos creature) = do
lines <- uses entities $ linesOfSight pos (Creature.visionRadius creature)
line <- choose $ weightedBy length lines
-- traceShowM ("current position", pos)
-- traceShowM ("lines", (headMay <=< tailMay) <$> lines)
let newPos = fromMaybe pos
$ fmap fst
. headMay <=< tailMay <=< headMay
. sortOn (Down . length)
$ lines
pure $ Positioned newPos creature
. headMay
=<< tailMay
=<< line
collisionAt newPos >>= \case
Nothing -> pure $ Positioned newPos creature
Just Stop -> pure pe
Just Combat -> do
ents <- use $ entities . atPosition newPos
if | any (entityIs @Creature) ents -> pure pe
| any (entityIs @Character) ents -> undefined
| otherwise -> pure pe
newtype GormlakBrain = GormlakBrain Creature