From ed86d310d5d07381e55c904a9f5416d0dc3cc7a0 Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 10 Feb 2026 23:19:44 +0000 Subject: [PATCH] Corpses fall down cliff edges --- src/Dodge/Creature/Update.hs | 110 +++++++++++++++++++++++------------ tags | 62 ++++++++++---------- 2 files changed, 104 insertions(+), 68 deletions(-) diff --git a/src/Dodge/Creature/Update.hs b/src/Dodge/Creature/Update.hs index 1bad21d73..a6a79c2f6 100644 --- a/src/Dodge/Creature/Update.hs +++ b/src/Dodge/Creature/Update.hs @@ -1,22 +1,17 @@ module Dodge.Creature.Update (updateCreature) where -import Dodge.Update.Camera.Rotate -import SDL (MouseButton (..)) -import Dodge.Creature.Vocalization -import RandomHelp -import Data.Maybe -import Linear -import NewInt import Color import qualified Data.IntMap.Strict as IM import qualified Data.List as List +import Data.Maybe import Dodge.Barreloid ---import Dodge.Base.NewID +-- 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.Vocalization import Dodge.Creature.YourControl import Dodge.Damage import Dodge.Data.Damage.Type @@ -26,9 +21,14 @@ import Dodge.Inventory import Dodge.Lampoid import Dodge.Prop.Gib import Dodge.SoundLogic +import Dodge.Update.Camera.Rotate import FoldableHelp import Geometry import LensHelp +import Linear +import NewInt +import RandomHelp +import SDL (MouseButton (..)) import Shape import ShapePicture.Data @@ -36,25 +36,28 @@ import ShapePicture.Data -- allow for knockbacks etc to be determined as well as intended movements updateCreature :: Creature -> World -> World updateCreature cr - | null (cr ^? crHP . _HP) = id | cr ^. crPos . _z < negate 100 = (tocr . crHP .~ CrIsPitted) . destroyAllInvItems cr + | CrIsCorpse _ <- cr ^. crHP = chasmTestCorpse cr + | null (cr ^? crHP . _HP) = id | cr ^. crPos . _z < 0 = (tocr . crZVel -~ 0.5) . (tocr . crPos . _z +~ _crZVel cr) - | otherwise = updateCreature' cr + | otherwise = updateLivingCreature cr where tocr = cWorld . lWorld . creatures . ix (_crID cr) -updateCreature' :: Creature -> World -> World -updateCreature' cr = - chasmTest cr . case _crType cr of +updateLivingCreature :: Creature -> World -> World +updateLivingCreature cr = + chasmTestLiving cr . case _crType cr of Avatar{} -> (cWorld . lWorld . creatures . ix 0 . crType . avatarPulse %~ updatePulse) - . crUpdate cid . yourControl cr + . crUpdate cid + . yourControl cr LampCrit{} -> updateLampoid cr BarrelCrit bt -> updateBarreloid bt cr AvatarDead -> id - ChaseCrit {} -> \w -> crUpdate cid . performActions cid - $ over (cWorld . lWorld . creatures . ix cid) (chaseCritInternal w) w - _ -> crUpdate cid + ChaseCrit{} -> \w -> + crUpdate cid . performActions cid $ + over (cWorld . lWorld . creatures . ix cid) (chaseCritInternal w) w + _ -> crUpdate cid where cid = cr ^. crID @@ -78,36 +81,47 @@ checkDeath cid w = maybe id checkDeath' (w ^? cWorld . lWorld . creatures . ix c checkDeath' :: Creature -> World -> World checkDeath' cr w = case cr ^. crHP of HP x | x > 0 -> w & tocr . crDamage .~ [] - HP x | x > -200 && _crDeathTimer cr < 5 -> w - & tocr . crDamage .~ [] - & tocr . crDeathTimer +~ 1 - HP _ -> w + HP x + | x > -200 && _crDeathTimer cr < 5 -> + w + & tocr . crDamage .~ [] + & tocr . crDeathTimer +~ 1 + HP _ -> + w & dropAll cr -- the order of these is possibly important & stopSoundFrom (CrWeaponSound (_crID cr) 0) & corpseOrGib cr - _ -> w + _ -> w where tocr = cWorld . lWorld . creatures . ix (_crID cr) -- 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 -> sethp (CrIsCorpse $ scorchSPic thecorpse) - . dodeathsound CookDeath - Just PoisonDamage -> sethp (CrIsCorpse $ poisonSPic thecorpse) + Just CookingDamage -> + sethp (CrIsCorpse $ scorchSPic thecorpse) + . dodeathsound CookDeath + Just PoisonDamage -> + sethp (CrIsCorpse $ poisonSPic thecorpse) . dodeathsound PoisonDeath - Just PhysicalDamage | _crPain cr > 200 - -> addCrGibs cr . sethp CrIsGibs - . dodeathsound GibsDeath - _ -> sethp (CrIsCorpse thecorpse) + Just PhysicalDamage + | _crPain cr > 200 -> + addCrGibs cr + . sethp CrIsGibs + . dodeathsound GibsDeath + _ -> + sethp (CrIsCorpse thecorpse) . dodeathsound PlainDeath where dodeathsound dt = f dt . stopSoundFrom (CrMouth cid) f dt w = fromMaybe w $ do let (msid, g) = runState (maybeTakeOne (crDeathSounds cr dt)) (_randGen w) sid <- msid - return $ w & soundStart (CrMouth cid) (cr ^. crPos . _xy) sid Nothing - & randGen .~ g + return $ + w + & soundStart (CrMouth cid) (cr ^. crPos . _xy) sid Nothing + & randGen + .~ g cid = cr ^. crID sethp x = cWorld . lWorld . creatures . ix (_crID cr) . crHP .~ x thecorpse = makeCorpse cr @@ -122,12 +136,15 @@ poisonSPic = _1 %~ overColSH (mixColors 0.5 0.5 green . normalizeColor) dropAll :: Creature -> World -> World dropAll cr w = foldl' (flip (dropItem cr)) w . reverse . IM.keys . _unNIntMap $ _crInv cr -chasmTest :: Creature -> World -> World -chasmTest cr w - | _crZVel cr < 0 = w & tocr . crZVel -~ 0.5 +chasmTestLiving :: Creature -> World -> World +chasmTestLiving cr w + | _crZVel cr < 0 = + w + & tocr . crZVel -~ 0.5 & tocr . crPos . _z +~ _crZVel cr --- | Just (x, y) <- List.find g (foldMap loopPairs $ w ^. cWorld . chasms') = w - | Just (x, y) <- List.find g (w ^. cWorld . cliffs) = w + -- | Just (x, y) <- List.find g (foldMap loopPairs $ w ^. cWorld . chasms') = w + | Just (x, y) <- List.find g (w ^. cWorld . cliffs) = + w & soundContinue (CrChasm (_crID cr)) (cr ^. crPos . _xy) debrisS (Just 100) & tocr . crPos . _xy -~ normalizeV (vNormal (x - y)) & chasmRotate cr (x - y) @@ -138,8 +155,27 @@ chasmTest cr w g = uncurry $ circOnSeg (cr ^. crPos . _xy) (crRad $ cr ^. crType) f = circInPolygon (cr ^. crPos . _xy) (crRad $ cr ^. crType) +chasmTestCorpse :: Creature -> World -> World +chasmTestCorpse cr w + | _crZVel cr < 0 = + w + & tocr . crZVel -~ 0.5 + & tocr . crPos . _z +~ _crZVel cr + -- | Just (x, y) <- List.find g (foldMap loopPairs $ w ^. cWorld . chasms') = w + | Just (x, y) <- List.find g (w ^. cWorld . cliffs) = + w + & soundContinue (CrChasm (_crID cr)) (cr ^. crPos . _xy) debrisS (Just 100) + & tocr . crPos . _xy +~ normalizeV (vNormal (x - y)) + & chasmRotate cr (x - y) + | any f (w ^. cWorld . chasms) = w & tocr . crZVel -~ 0.5 + | otherwise = w + where + tocr = cWorld . lWorld . creatures . ix (_crID cr) + g = uncurry $ circOnSeg (cr ^. crPos . _xy) (crRad $ cr ^. crType) + f = circInPolygon (cr ^. crPos . _xy) (crRad $ cr ^. crType) + chasmRotate :: Creature -> Point2 -> World -> World -chasmRotate cr v w +chasmRotate cr v w | t = rotateTo8 (argV v) w | otherwise = w where diff --git a/tags b/tags index efd2dcea8..94dedcd9d 100644 --- a/tags +++ b/tags @@ -2800,15 +2800,15 @@ chaseCritInternal src/Dodge/Humanoid.hs 8;" f chaseCritMv src/Dodge/Creature/ReaderUpdate.hs 121;" f chaseCritPerceptionUpdate src/Dodge/Creature/Perception.hs 32;" f chaseCritVocalization src/Dodge/Creature/ChaseCrit.hs 36;" f -chasmRotate src/Dodge/Creature/Update.hs 140;" f +chasmRotate src/Dodge/Creature/Update.hs 161;" f chasmSimpleMaze src/Dodge/Room/Tutorial.hs 294;" f chasmSpitTerminal src/Dodge/Room/Tutorial.hs 265;" f -chasmTest src/Dodge/Creature/Update.hs 124;" f +chasmTest src/Dodge/Creature/Update.hs 142;" f chasmWallToSurface src/Dodge/Base/Collide.hs 118;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f checkConnection src/Dodge/Inventory/Swap.hs 66;" f -checkDeath src/Dodge/Creature/Update.hs 74;" f -checkDeath' src/Dodge/Creature/Update.hs 77;" f +checkDeath src/Dodge/Creature/Update.hs 77;" f +checkDeath' src/Dodge/Creature/Update.hs 80;" f checkEndGame src/Dodge/Update.hs 807;" f checkErrorGL src/Shader/Compile.hs 86;" f checkFBO src/Framebuffer/Check.hs 6;" f @@ -2854,7 +2854,7 @@ cleatSide src/Dodge/Cleat.hs 27;" f click1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 783;" f clicker src/Dodge/Item/Scope.hs 88;" f clipV src/Geometry/Vector.hs 48;" f -clipZoom src/Dodge/Update/Camera.hs 239;" f +clipZoom src/Dodge/Update/Camera.hs 240;" f clockCycle src/Dodge/Clock.hs 7;" f closeButtonToSelectionItem src/Dodge/Inventory/SelectionList.hs 221;" f closeItemToSelectionItem src/Dodge/Inventory/SelectionList.hs 205;" f @@ -2927,7 +2927,7 @@ copierItemUpdate src/Dodge/Creature/State.hs 131;" f copyItemToFloor src/Dodge/FloorItem.hs 14;" f corDoor src/Dodge/Room/Room.hs 398;" f cornerList src/Preload/Render.hs 236;" f -corpseOrGib src/Dodge/Creature/Update.hs 92;" f +corpseOrGib src/Dodge/Creature/Update.hs 102;" f corridor src/Dodge/Room/Corridor.hs 17;" f corridorBoss src/Dodge/LockAndKey.hs 133;" f corridorN src/Dodge/Room/Corridor.hs 57;" f @@ -2972,7 +2972,7 @@ crShape src/Dodge/Creature/Shape.hs 8;" f crSpring src/Dodge/Update.hs 914;" f crStratConMatches src/Dodge/Creature/Test.hs 80;" f crStrength src/Dodge/Creature/Statistics.hs 29;" f -crUpdate src/Dodge/Creature/Update.hs 67;" f +crUpdate src/Dodge/Creature/Update.hs 70;" f crUpdateInvidLocations src/Dodge/Inventory/Location.hs 66;" f crUpdateItemLocations src/Dodge/Inventory/Location.hs 48;" f crVocalizationSound src/Dodge/Creature/Vocalization.hs 15;" f @@ -3260,7 +3260,7 @@ doTextInputOverUniverse src/Dodge/Update/Input/Text.hs 12;" f doThrust src/Dodge/Projectile/Update.hs 132;" f doTimeScroll src/Dodge/Update.hs 212;" f doTmWdWd src/Dodge/WorldEffect.hs 104;" f -doWallRotate src/Dodge/Update/Camera.hs 228;" f +doWallRotate src/Dodge/Update/Camera.hs 229;" f doWdBl src/Dodge/WorldBool.hs 10;" f doWdCrBl src/Dodge/CreatureEffect.hs 18;" f doWdP2f src/Dodge/WdP2f.hs 10;" f @@ -3403,7 +3403,7 @@ drawZone src/Dodge/Debug/Picture.hs 152;" f drawZoneCirc src/Dodge/Debug/Picture.hs 293;" f drawZoneCol src/Dodge/Debug/Picture.hs 149;" f drawZoneNearPointCursor src/Dodge/Debug/Picture.hs 286;" f -dropAll src/Dodge/Creature/Update.hs 121;" f +dropAll src/Dodge/Creature/Update.hs 139;" f dropInventoryPath src/Dodge/HeldUse.hs 1346;" f dropItem src/Dodge/Creature/Action.hs 155;" f dropper src/Dodge/Item/Scope.hs 82;" f @@ -3491,13 +3491,13 @@ extraWeaponLinksBelow src/Dodge/Item/Grammar.hs 99;" f extractRoomPos src/Dodge/RoomPos.hs 6;" f faceEdges src/Polyhedra.hs 62;" f facesToVF src/Polyhedra/Geodesic.hs 70;" f -farWallDistDirection src/Dodge/Update/Camera.hs 250;" f +farWallDistDirection src/Dodge/Update/Camera.hs 251;" f fdiv src/ShortShow.hs 41;" f feet src/Dodge/Creature/Picture.hs 51;" f filter3 src/FoldableHelp.hs 76;" f filterSectionsPair src/Dodge/DisplayInventory.hs 160;" f findBlips src/Dodge/RadarSweep.hs 63;" f -findBoundDists src/Dodge/Update/Camera.hs 257;" f +findBoundDists src/Dodge/Update/Camera.hs 258;" f findClosePoint src/Dodge/LevelGen/StaticWalls.hs 155;" f findClosePoint src/Dodge/LevelGen/StaticWalls/Deprecated.hs 74;" f findIndex src/IntMapHelp.hs 86;" f @@ -3593,7 +3593,7 @@ geometryQuickCheckTests test/Spec.hs 55;" f geometryTests test/Spec.hs 17;" f geometryUnitTests test/Spec.hs 22;" f geqConstr src/SameConstr.hs 21;" f -getAimZoom src/Dodge/Update/Camera.hs 150;" f +getAimZoom src/Dodge/Update/Camera.hs 151;" f getAmmoLinks src/Dodge/Item/Grammar.hs 104;" f getAttachedSFLink src/Dodge/HeldUse.hs 786;" f getAutoSpringLinks src/Dodge/Item/Grammar.hs 85;" f @@ -3711,7 +3711,7 @@ healthAnalyserByDoor src/Dodge/Room/LasTurret.hs 90;" f healthTest src/Dodge/Room/LasTurret.hs 111;" f heightWallPS src/Dodge/Placement/Instance/Wall.hs 24;" f heldAimStance src/Dodge/Item/AimStance.hs 24;" f -heldAimZoom src/Dodge/Update/Camera.hs 156;" f +heldAimZoom src/Dodge/Update/Camera.hs 157;" f heldEffect src/Dodge/HeldUse.hs 62;" f heldEffectMuzzles src/Dodge/HeldUse.hs 133;" f heldHandlePos src/Dodge/Item/HeldOffset.hs 84;" f @@ -4234,7 +4234,7 @@ moveToSideNthOutLink src/Dodge/Room/Warning.hs 102;" f moveWall src/Dodge/Wall/Move.hs 23;" f moveWallID src/Dodge/Wall/Move.hs 18;" f moveWallIDUnsafe src/Dodge/Wall/Move.hs 13;" f -moveZoomCamera src/Dodge/Update/Camera.hs 92;" f +moveZoomCamera src/Dodge/Update/Camera.hs 93;" f mtTopLabels src/Dodge/Tree/Compose.hs 51;" f mtUnderLabels src/Dodge/Tree/Compose.hs 54;" f muchWlDustAt src/Dodge/Wall/Dust.hs 10;" f @@ -4424,7 +4424,7 @@ pointerToItemID src/Dodge/Item/Location.hs 42;" f pointerYourRootItem src/Dodge/Item/Location.hs 33;" f pointerYourSelectedItem src/Dodge/Item/Location.hs 26;" f pointsToPoly src/Geometry/ConvexPoly.hs 35;" f -poisonSPic src/Dodge/Creature/Update.hs 117;" f +poisonSPic src/Dodge/Creature/Update.hs 135;" f poisonSprayer src/Dodge/Item/Held/SprayGuns.hs 17;" f poke34 src/Shader/Poke.hs 509;" f pokeArrayOff src/Shader/Poke.hs 521;" f @@ -4739,15 +4739,15 @@ rotate3 src/Geometry/Vector3D.hs 48;" f rotate3x src/Geometry/Vector3D.hs 60;" f rotate3y src/Geometry/Vector3D.hs 66;" f rotate3z src/Geometry/Vector3D.hs 54;" f -rotateCamera src/Dodge/Update/Camera.hs 204;" f +rotateCamera src/Dodge/Update/Camera.hs 205;" f rotateList src/Padding.hs 49;" f rotateSH src/Shape.hs 254;" f rotateSHq src/Shape.hs 163;" f rotateSHx src/Shape.hs 262;" f rotateSP src/ShapePicture.hs 57;" f rotateTo src/Polyhedra/Geodesic.hs 65;" f -rotateTo8 src/Dodge/Update/Camera/Rotate.hs 5;" f -rotateToOverlappingWall src/Dodge/Update/Camera.hs 216;" f +rotateTo8 src/Dodge/Update/Camera/Rotate.hs 6;" f +rotateToOverlappingWall src/Dodge/Update/Camera.hs 217;" f rotateToZ src/Quaternion.hs 35;" f rotateV src/Geometry/Vector.hs 106;" f rotateVAround src/Geometry/Vector.hs 113;" f @@ -4792,7 +4792,7 @@ scaleSH src/Shape.hs 266;" f scalp src/Dodge/Creature/Picture.hs 93;" f scancodeToHotkey src/Dodge/Creature/YourControl.hs 102;" f scodeToChar src/Dodge/ScodeToChar.hs 6;" f -scorchSPic src/Dodge/Creature/Update.hs 114;" f +scorchSPic src/Dodge/Creature/Update.hs 132;" f screenBox src/Dodge/Base/Window.hs 54;" f screenPolygon src/Dodge/Base/Window.hs 18;" f screenPolygonBord src/Dodge/Base/Window.hs 28;" f @@ -4871,7 +4871,7 @@ setTargetMv src/Dodge/Creature/ReaderUpdate.hs 83;" f setTile src/Dodge/Layout.hs 70;" f setTiles src/Dodge/Layout.hs 67;" f setTreeInts src/Dodge/Room/Tutorial.hs 93;" f -setViewDistance src/Dodge/Update/Camera.hs 245;" f +setViewDistance src/Dodge/Update/Camera.hs 246;" f setViewPos src/Dodge/Creature/ReaderUpdate.hs 69;" f setViewport src/Dodge/Render.hs 448;" f setVol src/Dodge/Config.hs 47;" f @@ -5260,8 +5260,8 @@ transMat src/MatrixHelper.hs 87;" f transToHandle src/Dodge/Item/HeldOffset.hs 27;" f translate src/Picture/Base.hs 108;" f translate3 src/Picture/Base.hs 112;" f -translateFloatingCamera src/Dodge/Update/Camera.hs 48;" f -translateFloatingCameraKeys src/Dodge/Update/Camera.hs 66;" f +translateFloatingCamera src/Dodge/Update/Camera.hs 49;" f +translateFloatingCameraKeys src/Dodge/Update/Camera.hs 67;" f translateH src/Picture/Base.hs 104;" f translatePointToLeftHand src/Dodge/Creature/HandPos.hs 76;" f translatePointToRightHand src/Dodge/Creature/HandPos.hs 37;" f @@ -5360,18 +5360,18 @@ updateBackspaceRegex src/Dodge/Update/Input/InGame.hs 484;" f updateBarrel src/Dodge/Barreloid.hs 44;" f updateBarreloid src/Dodge/Barreloid.hs 16;" f updateBaseWheelEvent src/Dodge/Update/Scroll.hs 30;" f -updateBounds src/Dodge/Update/Camera.hs 267;" f +updateBounds src/Dodge/Update/Camera.hs 268;" f updateBulVel src/Dodge/Bullet.hs 57;" f updateBullet src/Dodge/Bullet.hs 22;" f updateBullets src/Dodge/Update.hs 601;" f -updateCamera src/Dodge/Update/Camera.hs 31;" f +updateCamera src/Dodge/Update/Camera.hs 32;" f updateCloseObjects src/Dodge/Inventory.hs 115;" f updateCloud src/Dodge/Update.hs 836;" f updateClouds src/Dodge/Update.hs 705;" f updateCombinePositioning src/Dodge/DisplayInventory.hs 40;" f updateCombineSections src/Dodge/DisplayInventory.hs 47;" f -updateCreature src/Dodge/Creature/Update.hs 36;" f -updateCreature' src/Dodge/Creature/Update.hs 45;" f +updateCreature src/Dodge/Creature/Update.hs 37;" f +updateCreature' src/Dodge/Creature/Update.hs 46;" f updateCreatureGroups src/Dodge/Update.hs 573;" f updateCreatureSoundPositions src/Dodge/Update.hs 552;" f updateCreatureStride src/Dodge/Update.hs 347;" f @@ -5397,7 +5397,7 @@ updateEnterRegex src/Dodge/Update/Input/InGame.hs 511;" f updateExpBarrel src/Dodge/Barreloid.hs 21;" f updateFlame src/Dodge/Flame.hs 19;" f updateFlames src/Dodge/Update.hs 693;" f -updateFloatingCamera src/Dodge/Update/Camera.hs 36;" f +updateFloatingCamera src/Dodge/Update/Camera.hs 37;" f updateFunctionKey src/Dodge/Update/Input/InGame.hs 368;" f updateFunctionKeys src/Dodge/Update/Input/InGame.hs 364;" f updateGas src/Dodge/Update.hs 858;" f @@ -5405,7 +5405,7 @@ updateGasses src/Dodge/Update.hs 708;" f updateGusts src/Dodge/Update.hs 820;" f updateIMl src/Dodge/Update.hs 567;" f updateIMl' src/Dodge/Update.hs 570;" f -updateInGameCamera src/Dodge/Update/Camera.hs 84;" f +updateInGameCamera src/Dodge/Update/Camera.hs 85;" f updateInitialPressInGame src/Dodge/Update/Input/InGame.hs 434;" f updateInt2Map src/Dodge/Zoning/Base.hs 94;" f updateInventoryPositioning src/Dodge/DisplayInventory.hs 86;" f @@ -5434,7 +5434,7 @@ updateObjMapMaybe src/Dodge/Update.hs 578;" f updatePastWorlds src/Dodge/Update.hs 459;" f updatePreload src/Preload/Update.hs 21;" f updateProjectile src/Dodge/Projectile/Update.hs 26;" f -updatePulse src/Dodge/Creature/Update.hs 147;" f +updatePulse src/Dodge/Creature/Update.hs 168;" f updatePulseBall src/Dodge/Update.hs 484;" f updatePulseLaser src/Dodge/Update.hs 648;" f updatePulseLasers src/Dodge/Update.hs 479;" f @@ -5534,7 +5534,7 @@ verticalWire src/Dodge/Wire.hs 23;" f vgunMuzzles src/Dodge/HeldUse.hs 344;" f viewBoundaries src/Dodge/Debug/Picture.hs 332;" f viewClipBounds src/Dodge/Debug/Picture.hs 341;" f -viewDistanceFromItems src/Dodge/Update/Camera.hs 201;" f +viewDistanceFromItems src/Dodge/Update/Camera.hs 202;" f viewTarget src/Dodge/Creature/ReaderUpdate.hs 155;" f violet src/Color.hs 48;" f visibleWalls src/Dodge/Base/Collide.hs 216;" f @@ -5674,7 +5674,7 @@ zonePn src/Dodge/Zoning/Pathing.hs 32;" f zoneWall src/Dodge/Zoning/Wall.hs 65;" f zonesAroundPoint src/Dodge/Zoning/Base.hs 98;" f zonesExtract src/Dodge/Zoning/Base.hs 62;" f -zoomFloatingCamera src/Dodge/Update/Camera.hs 76;" f +zoomFloatingCamera src/Dodge/Update/Camera.hs 77;" f zoomInLongGun src/Dodge/Update/Scroll.hs 101;" f zoomOutLongGun src/Dodge/Update/Scroll.hs 109;" f zoomScope src/Dodge/Item/Scope.hs 32;" f