diff --git a/src/Dodge/Damage.hs b/src/Dodge/Damage.hs index 18b1cc32c..f1138a840 100644 --- a/src/Dodge/Damage.hs +++ b/src/Dodge/Damage.hs @@ -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 diff --git a/src/Dodge/EnergyBall.hs b/src/Dodge/EnergyBall.hs index 2d08cbf81..44296cfa4 100644 --- a/src/Dodge/EnergyBall.hs +++ b/src/Dodge/EnergyBall.hs @@ -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 diff --git a/src/Dodge/Prop/Moving.hs b/src/Dodge/Prop/Moving.hs index 7babff61c..71f30a21e 100644 --- a/src/Dodge/Prop/Moving.hs +++ b/src/Dodge/Prop/Moving.hs @@ -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 diff --git a/src/Dodge/Update/Cloud.hs b/src/Dodge/Update/Cloud.hs index 83909055f..9ffbfe5e7 100644 --- a/src/Dodge/Update/Cloud.hs +++ b/src/Dodge/Update/Cloud.hs @@ -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 diff --git a/src/Dodge/Zoning/Creature.hs b/src/Dodge/Zoning/Creature.hs index fa6d41b1f..884fb2167 100644 --- a/src/Dodge/Zoning/Creature.hs +++ b/src/Dodge/Zoning/Creature.hs @@ -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 = diff --git a/tags b/tags index c04faf5b0..1beffb3e8 100644 --- a/tags +++ b/tags @@ -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