Refactor damages in circles

This commit is contained in:
2025-06-20 21:52:42 +01:00
parent edcd947c90
commit b2d64ce698
6 changed files with 56 additions and 56 deletions
+13
View File
@@ -1,12 +1,15 @@
{-# LANGUAGE LambdaCase #-}
module Dodge.Damage (
damageInCircle,
damageCrWl,
damageDirection,
damageCrWlID,
maxDamageType,
) where
import Dodge.WorldEvent.ThingsHit
import Geometry.Data
import Dodge.Data.Damage.Type
import Geometry.Vector
import ListHelp
@@ -53,3 +56,13 @@ collectDamageTypes = foldl' (flip f) M.empty
maxDamageType :: [Damage] -> Maybe (DamageType, Int)
maxDamageType = safeMinimumOn (negate . snd) . M.assocs . collectDamageTypes
damageInCircle :: (Point2 -> [Damage]) -> Point2 -> Float -> World -> World
damageInCircle f p r w = w
& cWorld . lWorld . wallDamages %~ dowldams
& cWorld . lWorld . creatures %~ docrdams
where
dowldams wds = foldl' g wds (wlsHitRadial p r w)
docrdams crs = foldl' h crs (crsHitRadial p r w)
g wds (x,wl) = wds & at (_wlID wl) . non mempty <>~ f x
h crs (x,cr) = crs & ix (_crID cr) . crDamage <>~ f x
+4 -20
View File
@@ -7,14 +7,12 @@ module Dodge.EnergyBall (
makeMovingEB,
) where
import qualified Data.IntMap.Strict as IM
import Data.List (foldl')
import Dodge.Damage
import Data.Maybe
import Dodge.Base.Collide
import Dodge.Data.World
import Dodge.SoundLogic
import Dodge.Spark
import Dodge.WorldEvent.ThingsHit
import Geometry
import LensHelp
import Picture
@@ -38,7 +36,7 @@ updateEnergyBall :: World -> EnergyBall -> (World, Maybe EnergyBall)
updateEnergyBall w eb
| _ebTimer eb <= 0 = (w, Nothing)
| otherwise =
( ebEffect eb . ebFlicker eb $ damageCircle (_ebPos eb) (_ebEff eb) w
( ebEffect eb . ebFlicker eb $ ebDamage (_ebPos eb) (_ebEff eb) w
, Just $ eb & ebTimer -~ 1 & ebPos .~ bp & ebVel .~ drag * bv
)
where
@@ -101,18 +99,10 @@ ebColor eb = case eb ^. ebEff of
ExplosiveBall -> white
FlashBall -> white
damageCircle :: Point2 -> EnergyBallType -> World -> World
damageCircle sp dt w =
w
& cWorld . lWorld . wallDamages %~ addwalldamages
& cWorld . lWorld . creatures %~ addcreaturedamages
ebDamage :: Point2 -> EnergyBallType -> World -> World
ebDamage sp dt w = damageInCircle (return . (const $ ebtToDamage sp dt)) sp r w
where
addwalldamages wlds = foldl' (damageWlCircle dam) wlds wlstodam
addcreaturedamages crs = foldl' (damageCrCircle dam) crs crstodam
wlstodam = wlsHitRadial sp r w
crstodam = crsHitRadial sp r w
r = fromMaybe 5 $ dt ^? fbSize
dam = ebtToDamage sp dt
ebtToDamage :: Point2 -> EnergyBallType -> Damage
ebtToDamage p = \case
@@ -121,9 +111,3 @@ ebtToDamage p = \case
ElectricalBall{} -> Electrical 10
ExplosiveBall -> Explosive 10 p
FlashBall -> Flashing 10 p
damageWlCircle :: Damage -> IM.IntMap [Damage] -> (Point2, Wall) -> IM.IntMap [Damage]
damageWlCircle dam wls (_, wl) = wls & at (_wlID wl) . non mempty .:~ dam
damageCrCircle :: Damage -> IM.IntMap Creature -> (Point2, Creature) -> IM.IntMap Creature
damageCrCircle dam crs (_, cr) = crs & ix (_crID cr) . crDamage .:~ dam
+4 -1
View File
@@ -3,6 +3,7 @@ module Dodge.Prop.Moving (
fallSmallBounce,
) where
import Dodge.Damage
import Dodge.Creature.Radius
import Dodge.Base
import Dodge.Data.World
@@ -18,8 +19,10 @@ fallSmallBounceDamage pr w =
p = _prPos pr
v = _prVel pr
dodamage
| _prPosZ pr < 25 = cWorld . lWorld . creatures %~ fmap dodamage'
| _prPosZ pr < 25 = damageInCircle (return . const thedam) p 5
-- cWorld . lWorld . creatures . each %~ dodamage'
| otherwise = id
thedam = Crushing (floor . (* 10) . max 0 . subtract 5 . abs $ _prVelZ pr)
dodamage' cr
| dist (_crPos cr) p < crRad (cr ^. crType) + 5 =
cr & crDamage
+3 -5
View File
@@ -1,17 +1,15 @@
module Dodge.Update.Cloud where
module Dodge.Update.Cloud (cloudPoisonDamage) where
import Dodge.Creature.Radius
import Data.Foldable
import Dodge.Creature.Radius
import Dodge.Data.World
import Dodge.Zoning.Creature
import Geometry.Vector3D
import LensHelp
cloudPoisonDamage :: Cloud -> World -> World
cloudPoisonDamage c w = w & dodamagesto (filter f $ crsNearPoint clpos w)
cloudPoisonDamage c w = foldl' (flip doDam) w (filter f $ crsNearPoint clpos w)
where
dodamagesto :: [Creature] -> World -> World
dodamagesto scrs mcrs = foldl' (flip doDam) mcrs scrs
doDam cr =
cWorld . lWorld . creatures . ix (_crID cr) . crDamage .:~ Poison 1
f cr = dist3 (addZ 20 $ _crPos cr) (_clPos c) < crRad (cr ^. crType) + _clRad c + 10
+5 -2
View File
@@ -1,9 +1,9 @@
module Dodge.Zoning.Creature where
import Dodge.Creature.Radius
import Control.Lens
import qualified Data.IntSet as IS
import Data.Maybe
import Dodge.Creature.Radius
import Dodge.Data.World
import Dodge.Zoning.Base
import Dodge.Zoning.Common
@@ -16,7 +16,10 @@ crIXsNearPoint :: Point2 -> World -> IS.IntSet
crIXsNearPoint = nearPoint crZoneSize _crZoning
crsNearPoint :: Point2 -> World -> [Creature]
crsNearPoint p w = mapMaybe (\cid -> w ^? cWorld . lWorld . creatures . ix cid) . IS.toList $ crIXsNearPoint p w
crsNearPoint p w =
mapMaybe (\cid -> w ^? cWorld . lWorld . creatures . ix cid)
. IS.toList
$ crIXsNearPoint p w
crsNearSeg :: Point2 -> Point2 -> World -> [Creature]
crsNearSeg sp ep w =
+27 -28
View File
@@ -12,7 +12,6 @@
.++~ src/LensHelp.hs 33;" o
.+.+~ src/LensHelp.hs 23;" o
.:~ src/LensHelp.hs 14;" o
:!: src/FoldlHelp.hs 10;" C
<$> src/Dodge/Data/ActionPlan.hs 203;" o
<$> src/Dodge/Data/CWorld.hs 45;" o
<$> src/Dodge/Data/Camera.hs 39;" o
@@ -145,7 +144,7 @@ BarrelCrit src/Dodge/Data/Creature/Misc.hs 73;" C
BarrelHiss src/Dodge/Data/SoundOrigin.hs 32;" C
BarrelType src/Dodge/Data/Creature/Misc.hs 87;" t
Barreloid src/Dodge/Data/Creature/Misc.hs 83;" C
Barreloid src/Dodge/Barreloid.hs 1;" m
Barreloid src/Dodge/Barreloid.hs 3;" m
Base src/Dodge/Base.hs 8;" m
Base src/Dodge/Zoning/Base.hs 2;" m
Base src/Picture/Base.hs 4;" m
@@ -1424,7 +1423,6 @@ PSRoomRand src/Dodge/Data/GenWorld.hs 69;" C
PSType src/Dodge/Data/GenWorld.hs 30;" t
PUMP src/Dodge/Data/Item/Combine.hs 62;" C
Padding src/Padding.hs 2;" m
Pair src/FoldlHelp.hs 10;" t
PaletteColor src/Color/Data.hs 14;" t
Parameters src/Shader/Parameters.hs 1;" m
Parameters src/Shape/Parameters.hs 1;" m
@@ -3659,7 +3657,7 @@ clusterFunc src/Dodge/Combine/Graph.hs 119;" f
cogRaised src/Dodge/Creature/Perception.hs 102;" f
colCrWall src/Dodge/WallCreatureCollisions.hs 28;" f
colCrsWalls src/Dodge/WallCreatureCollisions.hs 18;" f
collectDamageTypes src/Dodge/Damage.hs 49;" f
collectDamageTypes src/Dodge/Damage.hs 51;" f
collectInvItems src/Dodge/Update/Input/InGame.hs 298;" f
collideCircWalls src/Dodge/Base/Collide.hs 159;" f
collidePoint src/Dodge/Base/Collide.hs 50;" f
@@ -3728,7 +3726,7 @@ crDisplayVigilance src/Dodge/Creature/Picture/Awareness.hs 52;" f
crHasTarget src/Dodge/Creature/Test.hs 63;" f
crHasTargetLOS src/Dodge/Creature/Test.hs 66;" f
crHit src/Dodge/WorldEvent/ThingsHit.hs 68;" f
crIXsNearCirc src/Dodge/Zoning/Creature.hs 32;" f
crIXsNearCirc src/Dodge/Zoning/Creature.hs 35;" f
crIXsNearPoint src/Dodge/Zoning/Creature.hs 14;" f
crInAimStance src/Dodge/Creature/Test.hs 92;" f
crIntelligence src/Dodge/Creature/Statistics.hs 34;" f
@@ -3756,7 +3754,7 @@ crUpdateInvidLocations src/Dodge/Inventory/Location.hs 61;" f
crUpdateItemLocations src/Dodge/Inventory/Location.hs 42;" f
crVocalizationSound src/Dodge/Creature/Vocalization.hs 13;" f
crWarningSounds src/Dodge/Creature/Vocalization.hs 23;" f
crZoneSize src/Dodge/Zoning/Creature.hs 41;" f
crZoneSize src/Dodge/Zoning/Creature.hs 44;" f
craftInfo src/Dodge/Item/Info.hs 168;" f
craftItemSPic src/Dodge/Item/Draw/SPic.hs 57;" f
crankSlowS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 451;" f
@@ -3781,17 +3779,17 @@ creatureTurnTo src/Dodge/Creature/Impulse/Movement.hs 52;" f
creatureTurnToward src/Dodge/Creature/Impulse/Movement.hs 73;" f
creatureTurnTowardDir src/Dodge/Creature/Impulse/Movement.hs 62;" f
critInDeadEnd src/Dodge/Room/Room.hs 232;" f
crixsNearSeg src/Dodge/Zoning/Creature.hs 27;" f
crixsNearSeg src/Dodge/Zoning/Creature.hs 30;" f
crossPic src/Dodge/Render/Label.hs 27;" f
crossProd src/Geometry/Vector3D.hs 41;" f
crossV src/Geometry/Vector.hs 178;" f
crsHit src/Dodge/WorldEvent/ThingsHit.hs 42;" f
crsHitRadial src/Dodge/WorldEvent/ThingsHit.hs 103;" f
crsItmsUnused src/Dodge/Room/Containing.hs 45;" f
crsNearCirc src/Dodge/Zoning/Creature.hs 35;" f
crsNearCirc src/Dodge/Zoning/Creature.hs 38;" f
crsNearPoint src/Dodge/Zoning/Creature.hs 18;" f
crsNearRect src/Dodge/Zoning/Creature.hs 38;" f
crsNearSeg src/Dodge/Zoning/Creature.hs 21;" f
crsNearRect src/Dodge/Zoning/Creature.hs 41;" f
crsNearSeg src/Dodge/Zoning/Creature.hs 24;" f
crystalDebris src/Dodge/Block/Debris.hs 176;" f
crystalLine src/Dodge/Placement/Instance/Wall.hs 55;" f
crystalWallDamage src/Dodge/Wall/DamageEffect.hs 74;" f
@@ -3821,17 +3819,17 @@ cylinderPoly src/Shape.hs 87;" f
cylinderRoundIndices src/Shader/Poke.hs 389;" f
dShadCol src/Dodge/Render/List.hs 215;" f
damThingHitWith src/Dodge/WorldEvent/Damage.hs 10;" f
damToExpBarrel src/Dodge/Barreloid.hs 44;" f
damToExpBarrel src/Dodge/Barreloid.hs 49;" f
damageBlocksBy src/Dodge/Wall/Damage.hs 36;" f
damageCircle src/Dodge/DamageCircle.hs 12;" f
damageCircle src/Dodge/EnergyBall.hs 104;" f
damageCodeCommand src/Dodge/Terminal.hs 232;" f
damageCrCircle src/Dodge/DamageCircle.hs 33;" f
damageCrCircle src/Dodge/EnergyBall.hs 128;" f
damageCrWl src/Dodge/Damage.hs 26;" f
damageCrWlID src/Dodge/Damage.hs 20;" f
damageDirection src/Dodge/Damage.hs 31;" f
damageCrWl src/Dodge/Damage.hs 28;" f
damageCrWlID src/Dodge/Damage.hs 22;" f
damageDirection src/Dodge/Damage.hs 33;" f
damageHP src/Dodge/Creature/Damage.hs 63;" f
damageInCircle src/Dodge/Damage.hs 59;" f
damageMaterial src/Dodge/Material/Damage.hs 7;" f
damageSensor src/Dodge/Placement/Instance/Sensor.hs 15;" f
damageStone src/Dodge/Material/Damage.hs 20;" f
@@ -3842,7 +3840,7 @@ damageWallEffect src/Dodge/Wall/DamageEffect.hs 12;" f
damageWlCircle src/Dodge/DamageCircle.hs 26;" f
damageWlCircle src/Dodge/EnergyBall.hs 125;" f
dampField src/Dodge/Magnet.hs 8;" f
damsToExpBarrel src/Dodge/Barreloid.hs 41;" f
damsToExpBarrel src/Dodge/Barreloid.hs 46;" f
dark src/Color.hs 108;" f
darkenBackground src/Dodge/Render/MenuScreen.hs 52;" f
dbArg src/Dodge/Base.hs 165;" f
@@ -3995,7 +3993,7 @@ divideDoorPane src/Dodge/Placement/Instance/Door.hs 59;" f
divideLine src/Geometry.hs 247;" f
divideLineExact src/Geometry.hs 275;" f
divideLineOddNumPoints src/Geometry.hs 260;" f
dmType src/Dodge/Damage.hs 34;" f
dmType src/Dodge/Damage.hs 36;" f
doAfterPlacement src/Dodge/Layout.hs 86;" f
doAfterPlacements src/Dodge/Layout.hs 83;" f
doAimTwist src/Dodge/Creature/YourControl.hs 140;" f
@@ -4240,6 +4238,7 @@ dtToRootIntMap' src/Dodge/DoubleTree.hs 92;" f
dtToUpDownAdj src/Dodge/DoubleTree.hs 96;" f
dummyMenuOption src/Dodge/Menu/Option.hs 74;" f
ebColor src/Dodge/EnergyBall.hs 96;" f
ebDamage src/Dodge/EnergyBall.hs 104;" f
ebEffect src/Dodge/EnergyBall.hs 51;" f
ebFlicker src/Dodge/EnergyBall.hs 89;" f
ebtToDamage src/Dodge/EnergyBall.hs 117;" f
@@ -4305,8 +4304,8 @@ extractRoomPos src/Dodge/RoomPos.hs 6;" f
faceEdges src/Polyhedra.hs 65;" f
facesToVF src/Polyhedra/Geodesic.hs 69;" f
fadeTLS src/Dodge/LightSource/Update.hs 14;" f
fallSmallBounce src/Dodge/Prop/Moving.hs 30;" f
fallSmallBounce' src/Dodge/Prop/Moving.hs 35;" f
fallSmallBounce src/Dodge/Prop/Moving.hs 31;" f
fallSmallBounce' src/Dodge/Prop/Moving.hs 36;" f
fallSmallBounceDamage src/Dodge/Prop/Moving.hs 12;" f
farWallDistDirection src/Dodge/Update/Camera.hs 233;" f
fdiv src/ShortShow.hs 26;" f
@@ -4943,7 +4942,7 @@ makeTypeCraft src/Dodge/Item/Craftable.hs 18;" f
makeTypeCraftNum src/Dodge/Item/Craftable.hs 12;" f
mapper src/Dodge/Item/Scope.hs 70;" f
maxAmmo src/Dodge/Item/MaxAmmo.hs 6;" f
maxDamageType src/Dodge/Damage.hs 54;" f
maxDamageType src/Dodge/Damage.hs 56;" f
maxInvSlots src/Dodge/Inventory/CheckSlots.hs 27;" f
maxShowX src/Dodge/Combine/Graph.hs 50;" f
maxViewDistance src/Dodge/Viewpoints.hs 26;" f
@@ -5009,7 +5008,7 @@ midPadL src/Padding.hs 33;" f
midPoint src/Geometry.hs 83;" f
midWall src/Dodge/Placement/Instance/Wall.hs 27;" f
minAndMax src/FoldableHelp.hs 109;" f
minCrIXOn src/Dodge/Zoning/Creature.hs 47;" f
minCrIXOn src/Dodge/Zoning/Creature.hs 50;" f
minOn src/FoldableHelp.hs 35;" f
mini1S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 349;" f
miniGunCrit src/Dodge/Creature.hs 64;" f
@@ -5018,7 +5017,7 @@ miniGunXPict src/Dodge/Item/Draw/SPic.hs 365;" f
miniGunXPictItem src/Dodge/Item/Draw/SPic.hs 359;" f
miniS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 553;" f
miniTree2 src/Dodge/Room/Room.hs 106;" f
minimumOn src/FoldlHelp.hs 12;" f
minimumOn src/FoldlHelp.hs 14;" f
mirrorV3xz src/Dodge/Creature/HandPos.hs 26;" f
mirrorXAxis src/Geometry/Polygon.hs 49;" f
mirrorxz src/Picture/Base.hs 335;" f
@@ -5336,7 +5335,7 @@ ppEvents src/Dodge/Update.hs 684;" f
ppLevelReset src/Dodge/PressPlate.hs 13;" f
preCritStart src/Dodge/Room/Start.hs 82;" f
preloadRender src/Preload/Render.hs 30;" f
premapMaybe src/FoldlHelp.hs 24;" f
premapMaybe src/FoldlHelp.hs 26;" f
prependTwo src/Geometry.hs 176;" f
prettyDT src/Dodge/DoubleTree.hs 179;" f
prettyLDT src/Dodge/DoubleTree.hs 183;" f
@@ -6183,8 +6182,8 @@ updateArc src/Dodge/Tesla.hs 44;" f
updateArc src/Dodge/Tesla/Arc.hs 100;" f
updateAttachedItems src/Dodge/Creature/State.hs 251;" f
updateBackspaceRegex src/Dodge/Update/Input/InGame.hs 453;" f
updateBarrel src/Dodge/Barreloid.hs 36;" f
updateBarreloid src/Dodge/Barreloid.hs 13;" f
updateBarrel src/Dodge/Barreloid.hs 41;" f
updateBarreloid src/Dodge/Barreloid.hs 15;" f
updateBaseWheelEvent src/Dodge/Update/Scroll.hs 29;" f
updateBounds src/Dodge/Update/Camera.hs 250;" f
updateBulVel src/Dodge/Bullet.hs 55;" f
@@ -6207,7 +6206,7 @@ updateDistortions src/Dodge/Update.hs 532;" f
updateEnergyBall src/Dodge/EnergyBall.hs 37;" f
updateEnergyBalls src/Dodge/Update.hs 597;" f
updateEnterRegex src/Dodge/Update/Input/InGame.hs 480;" f
updateExpBarrel src/Dodge/Barreloid.hs 18;" f
updateExpBarrel src/Dodge/Barreloid.hs 20;" f
updateFBOTO src/Framebuffer/Update.hs 97;" f
updateFBOTO3 src/Framebuffer/Update.hs 131;" f
updateFlame src/Dodge/Flame.hs 19;" f
@@ -6458,13 +6457,13 @@ zipCount src/Dodge/Tree/Shift.hs 129;" f
zipCountDown src/Dodge/Room/Procedural.hs 118;" f
zoneCloud src/Dodge/Zoning/Cloud.hs 27;" f
zoneClouds src/Dodge/Update.hs 440;" f
zoneCreature src/Dodge/Zoning/Creature.hs 54;" f
zoneCreature src/Dodge/Zoning/Creature.hs 57;" f
zoneCreatures src/Dodge/Update.hs 482;" f
zoneExtract src/Dodge/Zoning/Base.hs 52;" f
zoneMonoid src/Dodge/Zoning/Base.hs 83;" f
zoneOfCirc src/Dodge/Zoning/Base.hs 24;" f
zoneOfCl src/Dodge/Zoning/Cloud.hs 24;" f
zoneOfCr src/Dodge/Zoning/Creature.hs 44;" f
zoneOfCr src/Dodge/Zoning/Creature.hs 47;" f
zoneOfPe src/Dodge/Zoning/Pathing.hs 49;" f
zoneOfPn src/Dodge/Zoning/Pathing.hs 27;" f
zoneOfPoint src/Dodge/Zoning/Base.hs 44;" f