Move toward diagnosing state update leak
This commit is contained in:
+33
-36
@@ -32,24 +32,19 @@ import System.Random
|
||||
--import qualified Data.Map as M
|
||||
import Data.Monoid
|
||||
|
||||
type CRUpdate = World -> (World -> World,StdGen) -> Creature -> ((World -> World,StdGen), Maybe Creature)
|
||||
dummyUpdate :: CRUpdate
|
||||
dummyUpdate cr _ = (Endo id, Just cr)
|
||||
|
||||
|
||||
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.
|
||||
-- the whole of this update cycle could do with a rethink, it is becoming
|
||||
-- convoluted
|
||||
stateUpdate :: CRUpdate -> CRUpdate
|
||||
stateUpdate u w (f,g) cr = case u w (f,g) (updateMovement g cr) of
|
||||
((f',g') , maybeCr) ->
|
||||
( (invSideEff cr . movementSideEff cr . deathEff . f'
|
||||
, g')
|
||||
, fmap (stepReloading . stepItemUseCooldown . doDamage . crAutoReload) $ crOrCorpse =<< maybeCr
|
||||
)
|
||||
stateUpdate u cr w = case u (updateMovement cr) w of
|
||||
(f, maybeCr) ->
|
||||
( Endo $ invSideEff cr . movementSideEff cr . deathEff . appEndo f
|
||||
, fmap (stepReloading . stepItemUseCooldown . doDamage . crAutoReload) $ crOrCorpse =<< maybeCr
|
||||
)
|
||||
where
|
||||
crOrCorpse cr'''
|
||||
| cr''' ^. crHP > 0 = Just cr'''
|
||||
crOrCorpse cr'
|
||||
| cr' ^. crHP > 0 = Just cr'
|
||||
| otherwise = Nothing
|
||||
deathEff
|
||||
| cr ^.crHP > 0 = id
|
||||
@@ -80,6 +75,9 @@ velocity to carry across frames.
|
||||
crFriction :: Creature -> Point2 -> Point2
|
||||
crFriction _ _ = V2 0 0
|
||||
|
||||
meleeCooldown :: CRUpdate -> CRUpdate
|
||||
meleeCooldown u cr = u $ cr & crMeleeCooldown . _Just %~ (max 0 . (\x -> x - 1))
|
||||
|
||||
doDamage :: Creature -> Creature
|
||||
doDamage cr = set (crState . crDamage) []
|
||||
$ over (crState . crPastDamage) (forceFoldable . take 10 . (dams :) ) damagedCr
|
||||
@@ -135,16 +133,15 @@ weaponReloadSounds cr w = case _crInv cr IM.!? _crInvSel cr of
|
||||
where
|
||||
cid = _crID cr
|
||||
|
||||
updateMovement :: StdGen -> Creature -> Creature
|
||||
updateMovement g cr
|
||||
updateMovement :: Creature -> Creature
|
||||
updateMovement cr
|
||||
| isFrictionless cr = over crPos (+.+ momentum) $ setOldPos cr
|
||||
| otherwise = updateWalkCycle $ setOldPos cr
|
||||
where
|
||||
momentum' = 0.98 *.* (_crPos cr -.- _crOldPos cr)
|
||||
momentum'' | magV momentum' > 1 = 1 *.* normalizeV momentum'
|
||||
| otherwise = momentum'
|
||||
momentum = momentum'' +.+ 0.01 *.* unitVectorAtAngle randAng
|
||||
(randAng,_) = randomR (0,2*pi) g
|
||||
momentum = momentum''
|
||||
|
||||
isFrictionless :: Creature -> Bool
|
||||
isFrictionless cr = case cr ^? crStance . carriage of
|
||||
@@ -169,29 +166,30 @@ decreaseToZero :: Int -> Int
|
||||
decreaseToZero x = max 0 (x - 1)
|
||||
|
||||
onDeath :: (Creature -> World -> World) -> CRUpdate -> CRUpdate
|
||||
onDeath h u w (f,g) cr
|
||||
| _crHP cr > 0 = u w (f,g) cr
|
||||
| otherwise = ( ( h cr . f, g ) , Nothing )
|
||||
onDeath h u cr w
|
||||
| _crHP cr > 0 = u cr w
|
||||
| otherwise = ( Endo $ h cr , Nothing )
|
||||
|
||||
updateBarrel
|
||||
:: World
|
||||
-> (World -> World,StdGen)
|
||||
-> Creature
|
||||
-> ((World -> World , StdGen), Maybe Creature)
|
||||
updateBarrel _ (f,g) cr
|
||||
| _crHP cr > 0 = ((f, g), newCr)
|
||||
| otherwise = ((f, g), Nothing)
|
||||
:: Creature
|
||||
-> World
|
||||
-> (Endo World, Maybe Creature)
|
||||
updateBarrel cr _
|
||||
| _crHP cr > 0 = (Endo id, newCr)
|
||||
| otherwise = (Endo id, Nothing)
|
||||
where
|
||||
newCr = Just $ doDamage cr
|
||||
|
||||
-- it is easy to leave off the "f" here
|
||||
-- should find some better way of doing all this that is less prone to error
|
||||
updateExpBarrel ::
|
||||
World -> (World -> World,StdGen) -> Creature -> ((World -> World , StdGen), Maybe Creature)
|
||||
updateExpBarrel _ (f,g) cr
|
||||
| _crHP cr > 0 = ((f . foldr (.) id pierceSparks . hiss, g'), newCr)
|
||||
| otherwise = ((f . makeExplosionAt (_crPos cr) . stopSounds , g'), Nothing)
|
||||
-- should generate the sparks externally using new random generators
|
||||
updateExpBarrel
|
||||
:: Creature
|
||||
-> World
|
||||
-> (Endo World, Maybe Creature)
|
||||
updateExpBarrel cr w
|
||||
| _crHP cr > 0 = (Endo $ foldr (.) id pierceSparks . hiss, newCr)
|
||||
| otherwise = (Endo $ makeExplosionAt (_crPos cr) . stopSounds , Nothing)
|
||||
where
|
||||
g = _randGen w
|
||||
damages = _crDamage $ _crState cr
|
||||
pierceSparks :: [World -> World]
|
||||
pierceSparks
|
||||
@@ -200,7 +198,6 @@ updateExpBarrel _ (f,g) cr
|
||||
as = randomRs (-0.7,0.7) g
|
||||
colids = randomRs (0,11) g
|
||||
times = randomRs (2,5) g
|
||||
(g',_) = split g
|
||||
poss = _piercedPoints $ _crSpState $ _crState cr
|
||||
--newCr = Just $ doDamage $ applyFuseDamage cr -- $ foldr perforate cr damages
|
||||
newCr = Just $ applyFuseDamage $ set (crState . crDamage) [] $ damToExpBarrel damages cr
|
||||
|
||||
Reference in New Issue
Block a user