Implementation of creature update using endofunctor monoid

This commit is contained in:
jgk
2021-08-18 00:59:35 +02:00
parent 5971fae5ec
commit cfb27d4a76
4 changed files with 18 additions and 7 deletions
+1 -1
View File
@@ -63,7 +63,7 @@ polyToTriFold _ = []
initialiseLamp :: Float -> CRUpdate
initialiseLamp h w (f,g) cr = ( (addLS . f , g), Just $ cr & crUpdate .~ updateLamp h i)
where
i = IM.newKey $ _lightSources $ f w -- to give different lights different keys
i = _crID cr
addLS = over lightSources (IM.insert i (lightAt (V3 x y h) i))
(V2 x y) = _crPos cr
+3 -1
View File
@@ -30,9 +30,11 @@ import Control.Monad.State
import System.Random
--import qualified Data.Set as S
--import qualified Data.Map as M
import Data.Monoid
type CRUpdate = World -> (World -> World,StdGen) -> Creature -> ((World -> World,StdGen), Maybe Creature)
meleeCooldown :: CRUpdate -> CRUpdate
meleeCooldown u w (f,g) cr = u w (f,g) $ cr & crMeleeCooldown . _Just %~ (max 0 . (\x -> x - 1))
-- | The movement is updated before the ai in order to correctly set the oldpos.
-2
View File
@@ -7,8 +7,6 @@ import Dodge.LevelGen.Data
import Picture
import Geometry.Data
--import qualified Data.IntMap.Strict as IM
lightAt :: Point3 -> Int -> LightSource
lightAt (V3 x y z) i =
LS {_lsID = i
+14 -3
View File
@@ -26,9 +26,11 @@ import Data.List
import Data.Maybe
import Data.Function
import qualified Data.Set as S
import qualified Data.IntMap.Strict as IM
import qualified Data.IntMap.Lazy as IM
import qualified Data.Map as M
import Control.Lens
import Data.Monoid
import System.Random
update :: World -> World
update = update' . pushSideEffects
@@ -129,12 +131,21 @@ updateParticles w = set particles (catMaybes ps) w'
where
(w',ps) = mapAccumR (\a b -> _ptUpdate' b a b) w $ _particles w
updateCreatures :: World -> World
updateCreatures w = f $ set randGen newG $ set creatures (IM.mapMaybe id crs) w
updateCreatures' :: World -> World
updateCreatures' w = f $ set randGen newG $ set creatures (IM.mapMaybe id crs) w
where
((f,newG),crs) =
IM.mapAccum (\g' cr -> _crUpdate cr w g' cr) (id,_randGen w) $ _creatures w
updateToTM :: (World -> (World -> World,StdGen) -> Creature -> ((World -> World,StdGen), Maybe Creature)) -> World -> Creature -> (Endo World, Maybe Creature)
updateToTM u w cr = case u w (id,_randGen w) cr of
((f,_),mcr) -> (Endo f,mcr)
updateCreatures :: World -> World
updateCreatures w = appEndo f $ creatures .~ IM.mapMaybe id m $ w
where
(f,m) = traverse (\cr -> updateToTM (_crUpdate cr) w cr) (_creatures w)
{- |
Apply door mechanisms. -}
updateWalls :: World -> World