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:
parent
abea2dcfac
commit
ec39dc0a5b
8 changed files with 115 additions and 36 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue