Tweak creature update

This commit is contained in:
2025-08-06 13:10:37 +01:00
parent af5bdf59b9
commit 9fb7440776
11 changed files with 196 additions and 191 deletions
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -40,7 +40,7 @@ updateExpBarrel ps cr w
updateBarrel :: Creature -> World -> World updateBarrel :: Creature -> World -> World
updateBarrel cr updateBarrel cr
| _crHP cr > 0 = doDamage cr | _crHP cr > 0 = doDamage (cr ^. crID)
| otherwise = cWorld . lWorld . creatures . at (_crID cr) .~ Nothing | otherwise = cWorld . lWorld . creatures . at (_crID cr) .~ Nothing
damsToExpBarrel :: [Damage] -> Creature -> Creature damsToExpBarrel :: [Damage] -> Creature -> Creature
+11 -93
View File
@@ -1,6 +1,7 @@
module Dodge.Creature.State ( module Dodge.Creature.State (
crUpdate, -- crUpdate,
doDamage, doDamage,
invItemEffs,
) where ) where
import Control.Applicative import Control.Applicative
@@ -10,15 +11,10 @@ import Data.Maybe
import Data.Monoid import Data.Monoid
import Dodge.Base import Dodge.Base
import Dodge.BaseTriggerType import Dodge.BaseTriggerType
import Dodge.Corpse.Make
import Dodge.Creature.Action
import Dodge.Creature.Damage import Dodge.Creature.Damage
import Dodge.Creature.Impulse.Movement import Dodge.Creature.Impulse.Movement
import Dodge.Creature.State.WalkCycle
import Dodge.Creature.Test import Dodge.Creature.Test
import Dodge.Damage
import Dodge.Data.ComposedItem import Dodge.Data.ComposedItem
import Dodge.Data.Damage.Type
import Dodge.Data.DoubleTree import Dodge.Data.DoubleTree
--import Dodge.Data.DoubleTree --import Dodge.Data.DoubleTree
import Dodge.Data.World import Dodge.Data.World
@@ -31,100 +27,21 @@ import Dodge.Item.Grammar
import Dodge.Item.HeldOffset import Dodge.Item.HeldOffset
import Dodge.Item.Location import Dodge.Item.Location
import Dodge.Item.MaxAmmo import Dodge.Item.MaxAmmo
import Dodge.Prop.Gib
import Dodge.SoundLogic import Dodge.SoundLogic
import Dodge.Targeting.Draw import Dodge.Targeting.Draw
import Dodge.Zoning.Creature import Dodge.Zoning.Creature
import FoldableHelp import FoldableHelp
import Geometry import Geometry
import qualified IntMapHelp as IM
import LensHelp import LensHelp
import Picture import Picture
import qualified Quaternion as Q import qualified Quaternion as Q
import RandomHelp import RandomHelp
import qualified SDL import qualified SDL
import Shape
import ShapePicture
-- this can almost certainly be made more efficient doDamage :: Int -> World -> World
foldCr :: [Creature -> World -> World] -> Creature -> World -> World doDamage cid w = fromMaybe w $ do
foldCr xs cr w = foldl' f w xs cr <- w ^? cWorld . lWorld . creatures . ix cid
where return $ applyPastDamages cr $ applyCreatureDamage (cr ^. crDamage) cr w
f w' g = case w' ^? cWorld . lWorld . creatures . ix (_crID cr) of
Just cr' -> g cr' w'
Nothing -> w'
{- | this seems to work, but I am not sure about the ordering:
previously, the movement was updated before the ai in order to correctly set the oldpos.
This should be made more sensible: should the movement side effects apply to
the creature before or after it has moved?
at what point invSideEffects is applied wrt to when the creature moves
may affect whether the shield moves correctly
-}
crUpdate :: (Creature -> World -> World) -> Creature -> World -> World
crUpdate f =
foldCr
[ doDamage -- these two
, checkDeath -- must be in this order 24/7/22
, updateWalkCycle
, f
, invItemEffs
]
-- I have changed the ordering of item/equipment effects, which may have
-- unforseen consequences, be aware
checkDeath :: Creature -> World -> World
checkDeath cr w
| _crHP cr > 0 =
w
& cWorld . lWorld . creatures . ix (_crID cr) . crDamage .~ []
| _crHP cr <= -200 =
w
& dropAll cr -- the order of
& removecr -- these is important
& stopSoundFrom (CrWeaponSound (_crID cr) 0)
& addCrGibs cr
| _crHP cr > -200 && _crDeathTimer cr < 5 =
w
& cWorld . lWorld . creatures . ix (_crID cr) . crDamage .~ []
& cWorld . lWorld . creatures . ix (_crID cr) . crDeathTimer +~ 1
| otherwise =
w
& dropAll cr -- the order of
& removecr -- these is important
& stopSoundFrom (CrWeaponSound (_crID cr) 0)
& corpseOrGib cr
where
removecr
| _crID cr == 0 = id
-- cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ 0
-- hack to get around player creature being killed but left with more than 0 hp
| otherwise = cWorld . lWorld . creatures . at (_crID cr) .~ Nothing
-- could look at the amount of damage here (given by maxDamage) too
corpseOrGib :: Creature -> World -> World
corpseOrGib cr = case cr ^? crDamage . to maxDamageType . _Just . _1 of
Just CookingDamage -> addcorpse (thecorpse & cpSPic %~ scorchSPic)
Just PoisonDamage -> addcorpse (thecorpse & cpSPic %~ poisonSPic)
Just PhysicalDamage | _crPain cr > 200 -> addCrGibs cr
_ -> addcorpse thecorpse
where
addcorpse ctype = plNew (cWorld . lWorld . corpses) cpID ctype
thecorpse = makeCorpse cr
scorchSPic :: SPic -> SPic
scorchSPic = _1 %~ overColSH (mixColors 0.9 0.1 black . normalizeColor)
poisonSPic :: SPic -> SPic
poisonSPic = _1 %~ overColSH (mixColors 0.5 0.5 green . normalizeColor)
-- reverse keys, otherwise two or more inv items will cause errors
dropAll :: Creature -> World -> World
dropAll cr w = foldl' (flip (dropItem cr)) w . reverse . IM.keys $ _crInv cr
doDamage :: Creature -> World -> World
doDamage cr = applyPastDamages cr . applyCreatureDamage (cr ^. crDamage) cr
-- TODO generalise shake to arbitrary damage amounts -- TODO generalise shake to arbitrary damage amounts
applyPastDamages :: Creature -> World -> World applyPastDamages :: Creature -> World -> World
@@ -141,12 +58,13 @@ applyPastDamages cr w
& randGen .~ g & randGen .~ g
-- a loop going over all root inventory items -- a loop going over all root inventory items
invItemEffs :: Creature -> World -> World invItemEffs :: Int -> World -> World
invItemEffs cr = invItemEffs cid w = fromMaybe w $ do
appEndo $ cr <- w ^? cWorld . lWorld . creatures . ix cid
return . appEndo (
foldMap foldMap
(reduceLocDT (Endo . invItemLocUpdate cr) . LocDT TopDT) (reduceLocDT (Endo . invItemLocUpdate cr) . LocDT TopDT)
(invDT' (_crInv cr)) (invDT' (_crInv cr))) $ w
invItemLocUpdate :: Creature -> LocationDT OItem -> World -> World invItemLocUpdate :: Creature -> LocationDT OItem -> World -> World
invItemLocUpdate cr loc w = doAnyEquipmentEffect loc cr $ case itm ^. itType of invItemLocUpdate cr loc w = doAnyEquipmentEffect loc cr $ case itm ^. itType of
+17 -19
View File
@@ -1,37 +1,35 @@
{-# LANGUAGE LambdaCase #-} {-# LANGUAGE LambdaCase #-}
module Dodge.Creature.State.WalkCycle ( module Dodge.Creature.State.WalkCycle (updateWalkCycle) where
updateWalkCycle,
) where
import Control.Lens import Control.Lens
import Dodge.Data.World import Dodge.Data.World
import Dodge.SoundLogic import Dodge.SoundLogic
import Sound.Data import Sound.Data
updateWalkCycle :: Creature -> World -> World updateWalkCycle :: Int -> World -> World
updateWalkCycle cr = updateWalkCycle cid w
case cr ^. crStance . carriage of | Just cr <- w ^? cWorld . lWorld . creatures . ix 0
Walking x ff , Walking x ff <- cr ^. crStance . carriage
| x > cr ^. crStance . strideLength -> , x > cr ^. crStance . strideLength =
soundMultiFrom w
[FootstepSound i | i <- [0 .. 10]] & soundMultiFrom
(cr ^. crPos) [FootstepSound i | i <- [0 .. 10]]
(chooseFootSound ff) (cr ^. crPos)
Nothing (chooseFootSound ff)
. over (cWorld . lWorld . creatures . ix (cr ^. crID) . crStance . carriage) resetStride Nothing
_ -> id & over (cWorld . lWorld . creatures . ix cid . crStance . carriage) resetStride
| otherwise = w
resetStride :: Carriage -> Carriage resetStride :: Carriage -> Carriage
resetStride (Walking _ ff) = Walking 0 (normalGait ff) resetStride = \case
resetStride x = x Walking _ ff -> Walking 0 (normalGait ff)
x -> x
normalGait :: FootForward -> FootForward normalGait :: FootForward -> FootForward
normalGait = \case normalGait = \case
LeftForward -> RightForward LeftForward -> RightForward
WasLeftForward -> RightForward
RightForward -> LeftForward RightForward -> LeftForward
WasRightForward -> LeftForward
chooseFootSound :: FootForward -> SoundID chooseFootSound :: FootForward -> SoundID
chooseFootSound LeftForward = foot1S chooseFootSound LeftForward = foot1S
+118 -25
View File
@@ -1,47 +1,140 @@
module Dodge.Creature.Update ( module Dodge.Creature.Update (updateCreature) where
updateCreature,
) where
import Dodge.Inventory import Color
import LensHelp import qualified Data.IntMap.Strict as IM
import Geometry import qualified Data.List as List
import Dodge.SoundLogic
import Dodge.Creature.Radius
import Dodge.Creature.YourControl
import Dodge.Creature.State
import Dodge.Barreloid import Dodge.Barreloid
import Dodge.Base.NewID
import Dodge.Corpse.Make
import Dodge.Creature.Action
import Dodge.Creature.Radius
import Dodge.Creature.State
import Dodge.Creature.State.WalkCycle
import Dodge.Creature.YourControl
import Dodge.Damage
import Dodge.Data.Damage.Type
import Dodge.Data.World import Dodge.Data.World
import Dodge.Humanoid import Dodge.Humanoid
import Dodge.Inventory
import Dodge.Lampoid import Dodge.Lampoid
import qualified Data.List as List import Dodge.Prop.Gib
import Dodge.SoundLogic
import FoldableHelp
import Geometry
import LensHelp
import Shape
import ShapePicture.Data
-- Should separate out creature movement from other parts here -- Should separate out creature movement from other parts here
-- allow for knockbacks etc to be determined as well as intended movements
updateCreature :: Creature -> World -> World updateCreature :: Creature -> World -> World
updateCreature cr updateCreature cr
| _crZ cr < negate 100 = destroyAllInvItems cr | _crZ cr < negate 100 = destroyAllInvItems cr
| _crZ cr < 0 = (tocr . crZVel -~ 0.5) | _crZ cr < 0 =
(tocr . crZVel -~ 0.5)
. (tocr . crZ +~ _crZVel cr) . (tocr . crZ +~ _crZVel cr)
| otherwise = updateCreature' cr | otherwise = updateCreature' cr
where where
tocr = cWorld . lWorld . creatures . ix (_crID cr) tocr = cWorld . lWorld . creatures . ix (_crID cr)
updateCreature' :: Creature -> World -> World updateCreature' :: Creature -> World -> World
updateCreature' cr = chasmTest cr . case _crType cr of updateCreature' cr =
Avatar{} -> (cWorld . lWorld . creatures . ix 0 . crType . avatarPulse %~ updatePulse) chasmTest cr . case _crType cr of
. crUpdate yourControl cr Avatar{} ->
LampCrit{} -> updateLampoid cr (cWorld . lWorld . creatures . ix 0 . crType . avatarPulse %~ updatePulse)
BarrelCrit bt -> updateBarreloid bt cr . crUpdate' yourControl cr
AvatarDead -> id LampCrit{} -> updateLampoid cr
_ -> crUpdate updateHumanoid cr BarrelCrit bt -> updateBarreloid bt cr
AvatarDead -> id
_ -> crUpdate' updateHumanoid cr
{- | this seems to work, but I am not sure about the ordering:
previously, the movement was updated before the ai in order to correctly set the oldpos.
This should be made more sensible: should the movement side effects apply to
the creature before or after it has moved?
at what point invSideEffects is applied wrt to when the creature moves
may affect whether the shield moves correctly
-}
crUpdate' :: (Creature -> World -> World) -> Creature -> World -> World
crUpdate' f cr =
checkDeath cid
. doDamage cid
. invItemEffs cid
. g
. updateWalkCycle cid
where
cid = (cr ^. crID)
g w' = maybe id f (w' ^? cWorld . lWorld . creatures . ix cid) w'
checkDeath :: Int -> World -> World
checkDeath cid w = maybe id checkDeath' (w ^? cWorld . lWorld . creatures . ix cid) w
checkDeath' :: Creature -> World -> World
checkDeath' cr w
| _crHP cr > 0 =
w
& cWorld . lWorld . creatures . ix (_crID cr) . crDamage .~ []
| _crHP cr <= -200 =
w
& dropAll cr -- the order of
& destroyCreature cr -- these is important
& stopSoundFrom (CrWeaponSound (_crID cr) 0)
& addCrGibs cr
| _crHP cr > -200 && _crDeathTimer cr < 5 =
w
& cWorld . lWorld . creatures . ix (_crID cr) . crDamage .~ []
& cWorld . lWorld . creatures . ix (_crID cr) . crDeathTimer +~ 1
| otherwise =
w
& dropAll cr -- the order of
& removecr -- these is important
& stopSoundFrom (CrWeaponSound (_crID cr) 0)
& corpseOrGib cr
where
removecr
| _crID cr == 0 = id
-- cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ 0
-- hack to get around player creature being killed but left with more than 0 hp
| otherwise = cWorld . lWorld . creatures . at (_crID cr) .~ Nothing
destroyCreature :: Creature -> World -> World
destroyCreature cr
| _crID cr == 0 = id
-- cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ 0
-- hack to get around player creature being killed but left with more than 0 hp
| otherwise = cWorld . lWorld . creatures . at (_crID cr) .~ Nothing
-- could look at the amount of damage here (given by maxDamage) too
corpseOrGib :: Creature -> World -> World
corpseOrGib cr = case cr ^? crDamage . to maxDamageType . _Just . _1 of
Just CookingDamage -> addcorpse (thecorpse & cpSPic %~ scorchSPic)
Just PoisonDamage -> addcorpse (thecorpse & cpSPic %~ poisonSPic)
Just PhysicalDamage | _crPain cr > 200 -> addCrGibs cr
_ -> addcorpse thecorpse
where
addcorpse ctype = plNew (cWorld . lWorld . corpses) cpID ctype
thecorpse = makeCorpse cr
scorchSPic :: SPic -> SPic
scorchSPic = _1 %~ overColSH (mixColors 0.9 0.1 black . normalizeColor)
poisonSPic :: SPic -> SPic
poisonSPic = _1 %~ overColSH (mixColors 0.5 0.5 green . normalizeColor)
-- reverse keys, otherwise two or more inv items will cause errors
dropAll :: Creature -> World -> World
dropAll cr w = foldl' (flip (dropItem cr)) w . reverse . IM.keys $ _crInv cr
chasmTest :: Creature -> World -> World chasmTest :: Creature -> World -> World
chasmTest cr w chasmTest cr w
| _crZVel cr < 0 = w & cWorld . lWorld . creatures . ix (_crID cr) . crZVel -~ 0.5 | _crZVel cr < 0 =
& cWorld . lWorld . creatures . ix (_crID cr) . crZ +~ _crZVel cr w & cWorld . lWorld . creatures . ix (_crID cr) . crZVel -~ 0.5
| Just (x,y) <- List.find g (foldMap loopPairs $ w ^. cWorld . chasms) = w & cWorld . lWorld . creatures . ix (_crID cr) . crZ +~ _crZVel cr
& soundContinue (CrChasm (_crID cr)) (_crPos cr) debrisS (Just 100) | Just (x, y) <- List.find g (foldMap loopPairs $ w ^. cWorld . chasms) =
& cWorld . lWorld . creatures . ix (_crID cr) . crPos -~ normalizeV (vNormal (x-y)) w
& soundContinue (CrChasm (_crID cr)) (_crPos cr) debrisS (Just 100)
& cWorld . lWorld . creatures . ix (_crID cr) . crPos -~ normalizeV (vNormal (x - y))
| any f (w ^. cWorld . chasms) = w & cWorld . lWorld . creatures . ix (_crID cr) . crZVel -~ 0.5 | any f (w ^. cWorld . chasms) = w & cWorld . lWorld . creatures . ix (_crID cr) . crZVel -~ 0.5
| otherwise = w | otherwise = w
where where
@@ -49,6 +142,6 @@ chasmTest cr w
f = circInPolygon (_crPos cr) (crRad $ cr ^. crType) f = circInPolygon (_crPos cr) (crRad $ cr ^. crType)
updatePulse :: Pulse -> Pulse updatePulse :: Pulse -> Pulse
updatePulse PulseStatus {_pulseRate = pr, _pulseProgress = pp} updatePulse PulseStatus{_pulseRate = pr, _pulseProgress = pp}
| pp >= pr = PulseStatus pr 0 | pp >= pr = PulseStatus pr 0
| otherwise = PulseStatus pr (pp + 1) | otherwise = PulseStatus pr (pp + 1)
+1 -5
View File
@@ -28,11 +28,7 @@ data Carriage
| Boosting Point2 | Boosting Point2
deriving (Eq, Ord, Show, Read) --Generic, Flat) deriving (Eq, Ord, Show, Read) --Generic, Flat)
data FootForward data FootForward = LeftForward | RightForward
= LeftForward
| RightForward
| WasLeftForward
| WasRightForward
deriving (Eq, Ord, Show, Read) --Generic, Flat) deriving (Eq, Ord, Show, Read) --Generic, Flat)
data Posture data Posture
+1 -1
View File
@@ -38,7 +38,7 @@ defaultCreature =
-- , _crHotkeys = M.empty -- , _crHotkeys = M.empty
, _crStance = , _crStance =
Stance Stance
{ _carriage = Walking 0 WasLeftForward { _carriage = Walking 0 LeftForward
, _posture = AtEase , _posture = AtEase
, _strideLength = yourDefaultStrideLength , _strideLength = yourDefaultStrideLength
} }
+12 -12
View File
@@ -187,18 +187,18 @@ humanoidAIList ::
humanoidAIList humanoidAIList
= impulsiveAIBefore . chainCreatureUpdates = impulsiveAIBefore . chainCreatureUpdates
-- bit of a hack to get new random generators after each creature's update ---- bit of a hack to get new random generators after each creature's update
defaultImpulsive :: --defaultImpulsive ::
[World -> Creature -> Creature] -> -- [World -> Creature -> Creature] ->
Creature -> -- Creature ->
World -> -- World ->
World -- World
defaultImpulsive --defaultImpulsive
= fmap (fmap updateRandGen) . crUpdate . impulsiveAIBefore . chainCreatureUpdates -- = fmap (fmap updateRandGen) . crUpdate . impulsiveAIBefore . chainCreatureUpdates
where -- where
updateRandGen w = -- updateRandGen w =
let (_, g) = randomR (0, 1 :: Int) (_randGen w) -- let (_, g) = randomR (0, 1 :: Int) (_randGen w)
in w & randGen .~ g -- in w & randGen .~ g
chooseMovementPistol :: Creature -> World -> Action chooseMovementPistol :: Creature -> World -> Action
chooseMovementPistol cr w = chooseMovementPistol cr w =
+1 -1
View File
@@ -27,7 +27,7 @@ updateLampoid cr w = case cr ^?! crType . lampLSID of
| otherwise -> | otherwise ->
w w
& cWorld . lWorld . lightSources . ix i . lsParam . lsPos .~ addZ h cpos & cWorld . lWorld . lightSources . ix i . lsParam . lsPos .~ addZ h cpos
& doDamage cr & doDamage (cr ^. crID)
where where
cpos = _crPos cr cpos = _crPos cr
cid = _crID cr cid = _crID cr
+32 -32
View File
@@ -1154,7 +1154,7 @@ Revenge src/Dodge/Data/Scenario.hs 6;" C
RewindLeftClick src/Dodge/Data/World.hs 73;" C RewindLeftClick src/Dodge/Data/World.hs 73;" C
RezBaySS src/Dodge/Data/Scenario.hs 105;" C RezBaySS src/Dodge/Data/Scenario.hs 105;" C
RightButtonOptions src/Dodge/Data/RightButtonOptions.hs 13;" t RightButtonOptions src/Dodge/Data/RightButtonOptions.hs 13;" t
RightForward src/Dodge/Data/Creature/Stance.hs 33;" C RightForward src/Dodge/Data/Creature/Stance.hs 34;" C
RightwardDT src/Dodge/Data/DoubleTree.hs 93;" C RightwardDT src/Dodge/Data/DoubleTree.hs 93;" C
RightwardLDT src/Dodge/Data/DoubleTree.hs 52;" C RightwardLDT src/Dodge/Data/DoubleTree.hs 52;" C
Rocket src/Dodge/Data/Projectile.hs 34;" C Rocket src/Dodge/Data/Projectile.hs 34;" C
@@ -1502,7 +1502,7 @@ WarmTime src/Dodge/Data/Item/Params.hs 21;" C
WarmUpCoolDown src/Dodge/Data/TriggerType.hs 14;" C WarmUpCoolDown src/Dodge/Data/TriggerType.hs 14;" C
WarmUpNoDelay src/Dodge/Data/TriggerType.hs 19;" C WarmUpNoDelay src/Dodge/Data/TriggerType.hs 19;" C
WarningCry src/Dodge/Data/ActionPlan.hs 185;" C WarningCry src/Dodge/Data/ActionPlan.hs 185;" C
WasLeftForward src/Dodge/Data/Creature/Stance.hs 34;" C WasLeftForward src/Dodge/Data/Creature/Stance.hs 33;" C
WasRightForward src/Dodge/Data/Creature/Stance.hs 35;" C WasRightForward src/Dodge/Data/Creature/Stance.hs 35;" C
WatchAndWait src/Dodge/Data/ActionPlan.hs 183;" C WatchAndWait src/Dodge/Data/ActionPlan.hs 183;" C
WdBl src/Dodge/Data/WorldEffect.hs 50;" t WdBl src/Dodge/Data/WorldEffect.hs 50;" t
@@ -2681,7 +2681,7 @@ applyGravityPU src/Dodge/Projectile/Update.hs 43;" f
applyIndividualDamage src/Dodge/Creature/Damage.hs 16;" f applyIndividualDamage src/Dodge/Creature/Damage.hs 16;" f
applyInvLock src/Dodge/HeldUse.hs 444;" f applyInvLock src/Dodge/HeldUse.hs 444;" f
applyMagnetsToBul src/Dodge/Bullet.hs 30;" f applyMagnetsToBul src/Dodge/Bullet.hs 30;" f
applyPastDamages src/Dodge/Creature/State.hs 130;" f applyPastDamages src/Dodge/Creature/State.hs 47;" f
applyPiercingDamage src/Dodge/Creature/Damage.hs 22;" f applyPiercingDamage src/Dodge/Creature/Damage.hs 22;" f
applyPosition src/Sound.hs 111;" f applyPosition src/Sound.hs 111;" f
applyRecoil src/Dodge/HeldUse.hs 475;" f applyRecoil src/Dodge/HeldUse.hs 475;" f
@@ -2884,11 +2884,11 @@ chaseCritAwarenessUpdate src/Dodge/Creature/Perception.hs 70;" f
chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 114;" f chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 114;" f
chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 31;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 31;" f
chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 37;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 37;" f
chasmTest src/Dodge/Creature/Update.hs 37;" f chasmTest src/Dodge/Creature/Update.hs 141;" f
chasmWallToSurface src/Dodge/Base/Collide.hs 110;" f chasmWallToSurface src/Dodge/Base/Collide.hs 110;" f
checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f
checkConnection src/Dodge/Inventory/Swap.hs 64;" f checkConnection src/Dodge/Inventory/Swap.hs 64;" f
checkDeath src/Dodge/Creature/State.hs 77;" f checkDeath src/Dodge/Creature/Update.hs 85;" f
checkEndGame src/Dodge/Update.hs 800;" f checkEndGame src/Dodge/Update.hs 800;" f
checkErrorGL src/Shader/Compile.hs 255;" f checkErrorGL src/Shader/Compile.hs 255;" f
checkFBO src/Framebuffer/Check.hs 6;" f checkFBO src/Framebuffer/Check.hs 6;" f
@@ -3014,15 +3014,15 @@ contToIDCont src/Dodge/LevelGen/PlacementHelper.hs 57;" f
convexHull src/Geometry/Polygon.hs 110;" f convexHull src/Geometry/Polygon.hs 110;" f
convexHullSafe src/Geometry/Polygon.hs 117;" f convexHullSafe src/Geometry/Polygon.hs 117;" f
convexPolysOverlap src/Geometry/ConvexPoly.hs 50;" f convexPolysOverlap src/Geometry/ConvexPoly.hs 50;" f
coolMachinePistol src/Dodge/Creature/State.hs 182;" f coolMachinePistol src/Dodge/Creature/State.hs 100;" f
coolMinigun src/Dodge/Creature/State.hs 175;" f coolMinigun src/Dodge/Creature/State.hs 93;" f
copier src/Dodge/Item/Scope.hs 88;" f copier src/Dodge/Item/Scope.hs 88;" f
copierItemUpdate src/Dodge/Creature/State.hs 211;" f copierItemUpdate src/Dodge/Creature/State.hs 129;" f
copyItemToFloor src/Dodge/FloorItem.hs 18;" f copyItemToFloor src/Dodge/FloorItem.hs 18;" f
copyItemToFloorID src/Dodge/FloorItem.hs 22;" f copyItemToFloorID src/Dodge/FloorItem.hs 22;" f
corDoor src/Dodge/Room/Room.hs 376;" f corDoor src/Dodge/Room/Room.hs 376;" f
cornerList src/Preload/Render.hs 198;" f cornerList src/Preload/Render.hs 198;" f
corpseOrGib src/Dodge/Creature/State.hs 106;" f corpseOrGib src/Dodge/Creature/Update.hs 121;" f
corridor src/Dodge/Room/Corridor.hs 17;" f corridor src/Dodge/Room/Corridor.hs 17;" f
corridorBoss src/Dodge/LockAndKey.hs 133;" f corridorBoss src/Dodge/LockAndKey.hs 133;" f
corridorN src/Dodge/Room/Corridor.hs 52;" f corridorN src/Dodge/Room/Corridor.hs 52;" f
@@ -3063,7 +3063,7 @@ crShape src/Dodge/Creature/Shape.hs 8;" f
crSpring src/Dodge/Update.hs 893;" f crSpring src/Dodge/Update.hs 893;" f
crStratConMatches src/Dodge/Creature/Test.hs 77;" f crStratConMatches src/Dodge/Creature/Test.hs 77;" f
crStrength src/Dodge/Creature/Statistics.hs 24;" f crStrength src/Dodge/Creature/Statistics.hs 24;" f
crUpdate src/Dodge/Creature/State.hs 64;" f crUpdate' src/Dodge/Creature/Update.hs 59;" f
crUpdateInvidLocations src/Dodge/Inventory/Location.hs 61;" f crUpdateInvidLocations src/Dodge/Inventory/Location.hs 61;" f
crUpdateItemLocations src/Dodge/Inventory/Location.hs 42;" f crUpdateItemLocations src/Dodge/Inventory/Location.hs 42;" f
crVocalizationSound src/Dodge/Creature/Vocalization.hs 13;" f crVocalizationSound src/Dodge/Creature/Vocalization.hs 13;" f
@@ -3217,7 +3217,6 @@ defaultFlIt src/Dodge/Default.hs 27;" f
defaultForeground src/Dodge/Default/ForegroundShape.hs 5;" f defaultForeground src/Dodge/Default/ForegroundShape.hs 5;" f
defaultHUD src/Dodge/Default/World.hs 161;" f defaultHUD src/Dodge/Default/World.hs 161;" f
defaultHeldItem src/Dodge/Default/Item.hs 9;" f defaultHeldItem src/Dodge/Default/Item.hs 9;" f
defaultImpulsive src/Dodge/Humanoid.hs 191;" f
defaultInanimate src/Dodge/Default/Creature.hs 62;" f defaultInanimate src/Dodge/Default/Creature.hs 62;" f
defaultInput src/Dodge/Default/World.hs 14;" f defaultInput src/Dodge/Default/World.hs 14;" f
defaultIntention src/Dodge/Default/Creature.hs 98;" f defaultIntention src/Dodge/Default/Creature.hs 98;" f
@@ -3248,6 +3247,7 @@ deleteWallIDs src/Dodge/Wall/Delete.hs 28;" f
denormalEdges src/Polyhedra.hs 136;" f denormalEdges src/Polyhedra.hs 136;" f
destroyAllInvItems src/Dodge/Inventory.hs 60;" f destroyAllInvItems src/Dodge/Inventory.hs 60;" f
destroyBlock src/Dodge/Block.hs 52;" f destroyBlock src/Dodge/Block.hs 52;" f
destroyCreature src/Dodge/Creature/Update.hs 113;" f
destroyDoor src/Dodge/Block.hs 80;" f destroyDoor src/Dodge/Block.hs 80;" f
destroyInvItem src/Dodge/Inventory.hs 45;" f destroyInvItem src/Dodge/Inventory.hs 45;" f
destroyItem src/Dodge/Inventory.hs 64;" f destroyItem src/Dodge/Inventory.hs 64;" f
@@ -3294,7 +3294,7 @@ dmType src/Dodge/Damage.hs 38;" f
doAfterPlacement src/Dodge/Layout.hs 86;" f doAfterPlacement src/Dodge/Layout.hs 86;" f
doAfterPlacements src/Dodge/Layout.hs 83;" f doAfterPlacements src/Dodge/Layout.hs 83;" f
doAimTwist src/Dodge/Creature/YourControl.hs 140;" f doAimTwist src/Dodge/Creature/YourControl.hs 140;" f
doAnyEquipmentEffect src/Dodge/Creature/State.hs 221;" f doAnyEquipmentEffect src/Dodge/Creature/State.hs 139;" f
doBackspace src/Dodge/Update/Input/Text.hs 31;" f doBackspace src/Dodge/Update/Input/Text.hs 31;" f
doBarrelSpin src/Dodge/Projectile/Update.hs 215;" f doBarrelSpin src/Dodge/Projectile/Update.hs 215;" f
doBlBl src/Dodge/BlBl.hs 5;" f doBlBl src/Dodge/BlBl.hs 5;" f
@@ -3310,7 +3310,7 @@ doCrImp src/Dodge/CreatureEffect.hs 28;" f
doCrWdAc src/Dodge/CreatureEffect.hs 77;" f doCrWdAc src/Dodge/CreatureEffect.hs 77;" f
doCrWdImp src/Dodge/CreatureEffect.hs 16;" f doCrWdImp src/Dodge/CreatureEffect.hs 16;" f
doCrWdWd src/Dodge/CreatureEffect.hs 20;" f doCrWdWd src/Dodge/CreatureEffect.hs 20;" f
doDamage src/Dodge/Creature/State.hs 126;" f doDamage src/Dodge/Creature/State.hs 41;" f
doDeathToggle src/Dodge/WorldEffect.hs 91;" f doDeathToggle src/Dodge/WorldEffect.hs 91;" f
doDeathTriggers src/Dodge/WorldEffect.hs 86;" f doDeathTriggers src/Dodge/WorldEffect.hs 86;" f
doDebugTest src/Dodge/Update/Input/DebugTest.hs 22;" f doDebugTest src/Dodge/Update/Input/DebugTest.hs 22;" f
@@ -3387,7 +3387,7 @@ doublePair src/Geometry.hs 165;" f
doublePairSet src/Geometry.hs 169;" f doublePairSet src/Geometry.hs 169;" f
doubleTreeToIndentList src/Dodge/DoubleTree.hs 129;" f doubleTreeToIndentList src/Dodge/DoubleTree.hs 129;" f
doubleV2 src/Geometry.hs 172;" f doubleV2 src/Geometry.hs 172;" f
drawARHUD src/Dodge/Creature/State.hs 273;" f drawARHUD src/Dodge/Creature/State.hs 191;" f
drawAimSweep src/Dodge/Render/Picture.hs 271;" f drawAimSweep src/Dodge/Render/Picture.hs 271;" f
drawAllShadows src/Dodge/Shadows.hs 5;" f drawAllShadows src/Dodge/Shadows.hs 5;" f
drawBaseMachine src/Dodge/Machine/Draw.hs 57;" f drawBaseMachine src/Dodge/Machine/Draw.hs 57;" f
@@ -3514,7 +3514,7 @@ drawWeapon src/Dodge/Creature/Volition.hs 14;" f
drawWlIDs src/Dodge/Debug/Picture.hs 372;" f drawWlIDs src/Dodge/Debug/Picture.hs 372;" f
drawZoneCol src/Dodge/Debug/Picture.hs 147;" f drawZoneCol src/Dodge/Debug/Picture.hs 147;" f
drawZoneNearPointCursor src/Dodge/Debug/Picture.hs 284;" f drawZoneNearPointCursor src/Dodge/Debug/Picture.hs 284;" f
dropAll src/Dodge/Creature/State.hs 123;" f dropAll src/Dodge/Creature/Update.hs 138;" f
dropExcept src/Dodge/Creature/Action.hs 166;" f dropExcept src/Dodge/Creature/Action.hs 166;" f
dropInventoryPath src/Dodge/HeldUse.hs 1429;" f dropInventoryPath src/Dodge/HeldUse.hs 1429;" f
dropItem src/Dodge/Creature/Action.hs 172;" f dropItem src/Dodge/Creature/Action.hs 172;" f
@@ -3660,7 +3660,7 @@ floorItemSPic src/Dodge/Render/ShapePicture.hs 120;" f
floorWire src/Dodge/Wire.hs 13;" f floorWire src/Dodge/Wire.hs 13;" f
foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 558;" f foamSprayFadeOutS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 558;" f
foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 554;" f foamSprayLoopS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 554;" f
foldCr src/Dodge/Creature/State.hs 50;" f foldCr src/Dodge/Creature/Update.hs 75;" f
foldPairs src/ListHelp.hs 37;" f foldPairs src/ListHelp.hs 37;" f
foldrWhileArb src/ListHelp.hs 110;" f foldrWhileArb src/ListHelp.hs 110;" f
followImpulse src/Dodge/Creature/Impulse.hs 38;" f followImpulse src/Dodge/Creature/Impulse.hs 38;" f
@@ -3942,8 +3942,8 @@ invDimColor src/Dodge/DisplayInventory.hs 192;" f
invHead src/Dodge/Render/HUD.hs 404;" f invHead src/Dodge/Render/HUD.hs 404;" f
invIMDT src/Dodge/Item/Grammar.hs 248;" f invIMDT src/Dodge/Item/Grammar.hs 248;" f
invIndents src/Dodge/Item/Grammar.hs 255;" f invIndents src/Dodge/Item/Grammar.hs 255;" f
invItemEffs src/Dodge/Creature/State.hs 144;" f invItemEffs src/Dodge/Creature/State.hs 61;" f
invItemLocUpdate src/Dodge/Creature/State.hs 151;" f invItemLocUpdate src/Dodge/Creature/State.hs 69;" f
invRootMap src/Dodge/Item/Grammar.hs 227;" f invRootMap src/Dodge/Item/Grammar.hs 227;" f
invSelectionItem src/Dodge/Inventory/SelectionList.hs 32;" f invSelectionItem src/Dodge/Inventory/SelectionList.hs 32;" f
invSetSelection src/Dodge/Inventory.hs 190;" f invSetSelection src/Dodge/Inventory.hs 190;" f
@@ -4565,7 +4565,7 @@ pointerToItemLocation src/Dodge/Item/Location.hs 14;" f
pointerYourRootItem src/Dodge/Item/Location.hs 31;" f pointerYourRootItem src/Dodge/Item/Location.hs 31;" f
pointerYourSelectedItem src/Dodge/Item/Location.hs 25;" f pointerYourSelectedItem src/Dodge/Item/Location.hs 25;" f
pointsToPoly src/Geometry/ConvexPoly.hs 39;" f pointsToPoly src/Geometry/ConvexPoly.hs 39;" f
poisonSPic src/Dodge/Creature/State.hs 119;" f poisonSPic src/Dodge/Creature/Update.hs 134;" f
poisonSprayer src/Dodge/Item/Held/SprayGuns.hs 17;" f poisonSprayer src/Dodge/Item/Held/SprayGuns.hs 17;" f
poke34 src/Shader/Poke.hs 506;" f poke34 src/Shader/Poke.hs 506;" f
pokeArrayOff src/Shader/Poke.hs 517;" f pokeArrayOff src/Shader/Poke.hs 517;" f
@@ -4803,7 +4803,7 @@ replaceNullWith src/Dodge/Creature/ReaderUpdate.hs 162;" f
replacePutID src/Dodge/Placement/Instance/Wall.hs 102;" f replacePutID src/Dodge/Placement/Instance/Wall.hs 102;" f
resetCrVocCoolDown src/Dodge/Creature/Vocalization.hs 47;" f resetCrVocCoolDown src/Dodge/Creature/Vocalization.hs 47;" f
resetPLUse src/Dodge/PlacementSpot.hs 96;" f resetPLUse src/Dodge/PlacementSpot.hs 96;" f
resetStride src/Dodge/Creature/State/WalkCycle.hs 25;" f resetStride src/Dodge/Creature/State/WalkCycle.hs 24;" f
resizeFBOTO src/Framebuffer/Update.hs 203;" f resizeFBOTO src/Framebuffer/Update.hs 203;" f
resizeFBOTO3 src/Framebuffer/Update.hs 175;" f resizeFBOTO3 src/Framebuffer/Update.hs 175;" f
resizeRBO src/Framebuffer/Update.hs 87;" f resizeRBO src/Framebuffer/Update.hs 87;" f
@@ -4924,7 +4924,7 @@ scaleSH src/Shape.hs 269;" f
scalp src/Dodge/Creature/Picture.hs 90;" f scalp src/Dodge/Creature/Picture.hs 90;" f
scancodeToHotkey src/Dodge/Creature/YourControl.hs 95;" f scancodeToHotkey src/Dodge/Creature/YourControl.hs 95;" f
scodeToChar src/Dodge/ScodeToChar.hs 6;" f scodeToChar src/Dodge/ScodeToChar.hs 6;" f
scorchSPic src/Dodge/Creature/State.hs 116;" f scorchSPic src/Dodge/Creature/Update.hs 131;" f
screenBox src/Dodge/Base/Window.hs 53;" f screenBox src/Dodge/Base/Window.hs 53;" f
screenPolygon src/Dodge/Base/Window.hs 17;" f screenPolygon src/Dodge/Base/Window.hs 17;" f
screenPolygonBord src/Dodge/Base/Window.hs 27;" f screenPolygonBord src/Dodge/Base/Window.hs 27;" f
@@ -4996,7 +4996,7 @@ setOldPos src/Dodge/Update.hs 523;" f
setOutLinks src/Dodge/RoomLink.hs 48;" f setOutLinks src/Dodge/RoomLink.hs 48;" f
setOutLinksByType src/Dodge/RoomLink.hs 57;" f setOutLinksByType src/Dodge/RoomLink.hs 57;" f
setOutLinksPD src/Dodge/RoomLink.hs 77;" f setOutLinksPD src/Dodge/RoomLink.hs 77;" f
setRBCreatureTargeting src/Dodge/Creature/State.hs 372;" f setRBCreatureTargeting src/Dodge/Creature/State.hs 290;" f
setSelWhileDragging src/Dodge/Update/Input/InGame.hs 334;" f setSelWhileDragging src/Dodge/Update/Input/InGame.hs 334;" f
setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 87;" f setSelectionListRestriction src/Dodge/Update/Input/ScreenLayer.hs 87;" f
setShaderSource src/Shader/Compile.hs 290;" f setShaderSource src/Shader/Compile.hs 290;" f
@@ -5066,8 +5066,8 @@ shiftRoomBy src/Dodge/Room/Link.hs 37;" f
shiftRoomShiftBy src/Dodge/Room/Link.hs 81;" f shiftRoomShiftBy src/Dodge/Room/Link.hs 81;" f
shiftRoomShiftToLink src/Dodge/Room/Link.hs 70;" f shiftRoomShiftToLink src/Dodge/Room/Link.hs 70;" f
shiftedGrid src/Grid.hs 25;" f shiftedGrid src/Grid.hs 25;" f
shineTargetLaser src/Dodge/Creature/State.hs 281;" f shineTargetLaser src/Dodge/Creature/State.hs 199;" f
shineTorch src/Dodge/Creature/State.hs 320;" f shineTorch src/Dodge/Creature/State.hs 238;" f
shootBullet src/Dodge/HeldUse.hs 1020;" f shootBullet src/Dodge/HeldUse.hs 1020;" f
shootBullets src/Dodge/HeldUse.hs 1010;" f shootBullets src/Dodge/HeldUse.hs 1010;" f
shootFirstMiss src/Dodge/Creature/Volition.hs 33;" f shootFirstMiss src/Dodge/Creature/Volition.hs 33;" f
@@ -5427,7 +5427,7 @@ trunkDepth src/TreeHelp.hs 161;" f
tryAttachItems src/Dodge/Item/Grammar.hs 33;" f tryAttachItems src/Dodge/Item/Grammar.hs 33;" f
tryClickUse src/Dodge/Creature/YourControl.hs 221;" f tryClickUse src/Dodge/Creature/YourControl.hs 221;" f
tryCombine src/Dodge/Update/Input/InGame.hs 526;" f tryCombine src/Dodge/Update/Input/InGame.hs 526;" f
tryDrawToCapacitor src/Dodge/Creature/State.hs 231;" f tryDrawToCapacitor src/Dodge/Creature/State.hs 149;" f
tryDropSelected src/Dodge/Update/Input/InGame.hs 125;" f tryDropSelected src/Dodge/Update/Input/InGame.hs 125;" f
tryGetChannel src/Sound.hs 97;" f tryGetChannel src/Sound.hs 97;" f
tryGetRootAttachedFromInvID src/Dodge/Inventory/Location.hs 20;" f tryGetRootAttachedFromInvID src/Dodge/Inventory/Location.hs 20;" f
@@ -5440,9 +5440,9 @@ tryPutItemInInv src/Dodge/Inventory/Add.hs 42;" f
tryPutItemInInvAt src/Dodge/Inventory/Add.hs 32;" f tryPutItemInInvAt src/Dodge/Inventory/Add.hs 32;" f
trySeedFromClipboard src/Dodge/Menu.hs 91;" f trySeedFromClipboard src/Dodge/Menu.hs 91;" f
trySpin src/Dodge/Projectile/Update.hs 171;" f trySpin src/Dodge/Projectile/Update.hs 171;" f
trySynthBullet src/Dodge/Creature/State.hs 247;" f trySynthBullet src/Dodge/Creature/State.hs 165;" f
tryThrust src/Dodge/Projectile/Update.hs 177;" f tryThrust src/Dodge/Projectile/Update.hs 177;" f
tryUseParent src/Dodge/Creature/State.hs 225;" f tryUseParent src/Dodge/Creature/State.hs 143;" f
turnTo src/Dodge/Movement/Turn.hs 8;" f turnTo src/Dodge/Movement/Turn.hs 8;" f
turret src/Dodge/Placement/Instance/Turret.hs 35;" f turret src/Dodge/Placement/Instance/Turret.hs 35;" f
turretItemOffset src/Dodge/Item/HeldOffset.hs 21;" f turretItemOffset src/Dodge/Item/HeldOffset.hs 21;" f
@@ -5493,8 +5493,8 @@ updateCloud src/Dodge/Update.hs 826;" f
updateClouds src/Dodge/Update.hs 698;" f updateClouds src/Dodge/Update.hs 698;" f
updateCombinePositioning src/Dodge/DisplayInventory.hs 37;" f updateCombinePositioning src/Dodge/DisplayInventory.hs 37;" f
updateCombineSections src/Dodge/DisplayInventory.hs 44;" f updateCombineSections src/Dodge/DisplayInventory.hs 44;" f
updateCreature src/Dodge/Creature/Update.hs 19;" f updateCreature src/Dodge/Creature/Update.hs 31;" f
updateCreature' src/Dodge/Creature/Update.hs 28;" f updateCreature' src/Dodge/Creature/Update.hs 41;" f
updateCreatureGroups src/Dodge/Update.hs 566;" f updateCreatureGroups src/Dodge/Update.hs 566;" f
updateCreatureSoundPositions src/Dodge/Update.hs 542;" f updateCreatureSoundPositions src/Dodge/Update.hs 542;" f
updateDebris src/Dodge/Update.hs 601;" f updateDebris src/Dodge/Update.hs 601;" f
@@ -5526,7 +5526,7 @@ updateInGameCamera src/Dodge/Update/Camera.hs 79;" f
updateInitialPressInGame src/Dodge/Update/Input/InGame.hs 400;" f updateInitialPressInGame src/Dodge/Update/Input/InGame.hs 400;" f
updateInt2Map src/Dodge/Zoning/Base.hs 92;" f updateInt2Map src/Dodge/Zoning/Base.hs 92;" f
updateInventoryPositioning src/Dodge/DisplayInventory.hs 86;" f updateInventoryPositioning src/Dodge/DisplayInventory.hs 86;" f
updateItemTargeting src/Dodge/Creature/State.hs 341;" f updateItemTargeting src/Dodge/Creature/State.hs 259;" f
updateKeyInGame src/Dodge/Update/Input/InGame.hs 394;" f updateKeyInGame src/Dodge/Update/Input/InGame.hs 394;" f
updateKeysInTerminal src/Dodge/Update/Input/InGame.hs 382;" f updateKeysInTerminal src/Dodge/Update/Input/InGame.hs 382;" f
updateLampoid src/Dodge/Lampoid.hs 12;" f updateLampoid src/Dodge/Lampoid.hs 12;" f
@@ -5549,7 +5549,7 @@ updatePastWorlds src/Dodge/Update.hs 441;" f
updatePreload src/Preload/Update.hs 20;" f updatePreload src/Preload/Update.hs 20;" f
updateProjectile src/Dodge/Projectile/Update.hs 28;" f updateProjectile src/Dodge/Projectile/Update.hs 28;" f
updateProp src/Dodge/Prop/Update.hs 11;" f updateProp src/Dodge/Prop/Update.hs 11;" f
updatePulse src/Dodge/Creature/Update.hs 50;" f updatePulse src/Dodge/Creature/Update.hs 156;" f
updatePulseBall src/Dodge/Update.hs 467;" f updatePulseBall src/Dodge/Update.hs 467;" f
updatePulseLaser src/Dodge/Update.hs 641;" f updatePulseLaser src/Dodge/Update.hs 641;" f
updatePulseLasers src/Dodge/Update.hs 462;" f updatePulseLasers src/Dodge/Update.hs 462;" f
@@ -5584,7 +5584,7 @@ updateUniverseLast src/Dodge/Update.hs 141;" f
updateUniverseMid src/Dodge/Update.hs 161;" f updateUniverseMid src/Dodge/Update.hs 161;" f
updateUseInputInGame src/Dodge/Update/Input/InGame.hs 42;" f updateUseInputInGame src/Dodge/Update/Input/InGame.hs 42;" f
updateUseInputOnScreen src/Dodge/Update/Input/ScreenLayer.hs 23;" f updateUseInputOnScreen src/Dodge/Update/Input/ScreenLayer.hs 23;" f
updateWalkCycle src/Dodge/Creature/State/WalkCycle.hs 12;" f updateWalkCycle src/Dodge/Creature/State/WalkCycle.hs 10;" f
updateWallDamages src/Dodge/Update/WallDamage.hs 10;" f updateWallDamages src/Dodge/Update/WallDamage.hs 10;" f
updateWheelEvent src/Dodge/Update/Scroll.hs 20;" f updateWheelEvent src/Dodge/Update/Scroll.hs 20;" f
updateWheelEvents src/Dodge/Update.hs 431;" f updateWheelEvents src/Dodge/Update.hs 431;" f