From af8f803404a600f442052f0ebc94eb69d9d8c04b Mon Sep 17 00:00:00 2001 From: justin Date: Wed, 11 Feb 2026 17:59:08 +0000 Subject: [PATCH] Handle machine damage/destruction during wall damage --- src/Dodge/Machine/Update.hs | 10 +++-- src/Dodge/Wall/Damage.hs | 20 ++++++++- tags | 82 +++++++++++++++++++------------------ 3 files changed, 66 insertions(+), 46 deletions(-) diff --git a/src/Dodge/Machine/Update.hs b/src/Dodge/Machine/Update.hs index cc1a03274..32c6afcd6 100644 --- a/src/Dodge/Machine/Update.hs +++ b/src/Dodge/Machine/Update.hs @@ -24,11 +24,13 @@ import Sound.Data updateMachine :: Machine -> World -> World updateMachine mc - | _mcHP mc < 1 = destroyMachine mc - | otherwise = - mcApplyDamage (_mcDamage mc) mc - . mcPlaySound mc + = mcPlaySound mc . mcTypeUpdate mc (_mcType mc) +-- | _mcHP mc < 1 = destroyMachine mc +-- | otherwise = +-- mcApplyDamage (_mcDamage mc) mc +-- . mcPlaySound mc +-- . mcTypeUpdate mc (_mcType mc) mcTypeUpdate :: Machine -> MachineType -> World -> World mcTypeUpdate mc = \case diff --git a/src/Dodge/Wall/Damage.hs b/src/Dodge/Wall/Damage.hs index f5bc4ca7f..8ed2a6490 100644 --- a/src/Dodge/Wall/Damage.hs +++ b/src/Dodge/Wall/Damage.hs @@ -25,14 +25,17 @@ import Dodge.Zoning.Pathing import Geometry.Data import LensHelp import Linear +import qualified Data.IntSet as IS +import Dodge.Machine.Destroy damageWall :: Int -> Damage -> World -> (S.Set Int2, World) damageWall wlid dt w = fromMaybe (mempty,w) $ do wl <- w ^? cWorld . lWorld . walls . ix wlid let (dmam, w') = damMatSideEffect dt (_wlMaterial wl) (Right wl) w return $ case wl ^. wlStructure of - MachinePart mcid -> (,) mempty - $ w' & cWorld . lWorld . machines . ix mcid . mcDamage .:~ dt + MachinePart mcid -> -- (,) mempty +-- $ w' & cWorld . lWorld . machines . ix mcid . mcDamage .:~ dt + w' & damageMachine dmam mcid BlockPart blid -> w' & damageBlock (wl ^. wlMaterial) dmam blid DoorPart drid _ -> @@ -40,6 +43,19 @@ damageWall wlid dt w = fromMaybe (mempty,w) $ do & maybeDestroyDoor drid _ -> (mempty, w') +damageMachine :: Int -> Int -> World -> (S.Set Int2, World) +damageMachine x mcid w = case w ^? cWorld . lWorld . machines . ix mcid of + Just mc | _mcHP mc < x -> destroyMachine' mc w + _ -> (mempty, w & cWorld . lWorld . machines . ix mcid . mcHP -~ x) + +destroyMachine' :: Machine -> World -> (S.Set Int2, World) +destroyMachine' mc w = (js, destroyMachine mc w) + where + wlids = IS.toList $ mc ^. mcWallIDs + f wlid = w ^?! cWorld . lWorld . walls . ix wlid . wlLine + js = foldMap (S.fromList . uncurry (zoneOfSeg peZoneSize) . f) wlids + + -- block destruction is convoluted... damageBlock :: Material -> Int -> Int -> World -> (S.Set Int2, World) damageBlock = \case diff --git a/tags b/tags index 8e36e2cdf..e94a4e382 100644 --- a/tags +++ b/tags @@ -2680,7 +2680,7 @@ baseItemTriggerType src/Dodge/BaseTriggerType.hs 21;" f baseRifleShape src/Dodge/Item/Draw/SPic.hs 324;" f baseRodShape src/Dodge/Item/Draw/SPic.hs 405;" f baseSMGShape src/Dodge/Item/Draw/SPic.hs 393;" f -baseShoulder src/Dodge/Creature/Picture.hs 117;" f +baseShoulder src/Dodge/Creature/Picture.hs 114;" f baseStickShape src/Dodge/Item/Draw/SPic.hs 301;" f baseStickShapeX src/Dodge/Item/Draw/SPic.hs 293;" f baseStickSpread src/Dodge/HeldUse.hs 322;" f @@ -2800,11 +2800,11 @@ 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 177;" f +chasmRotate src/Dodge/Creature/Update.hs 173;" f chasmSimpleMaze src/Dodge/Room/Tutorial.hs 294;" f chasmSpitTerminal src/Dodge/Room/Tutorial.hs 265;" f -chasmTestCorpse src/Dodge/Creature/Update.hs 158;" f -chasmTestLiving src/Dodge/Creature/Update.hs 139;" f +chasmTestCorpse src/Dodge/Creature/Update.hs 155;" f +chasmTestLiving src/Dodge/Creature/Update.hs 137;" f chasmWallToSurface src/Dodge/Base/Collide.hs 118;" f checkCombineSelectionExists src/Dodge/DisplayInventory.hs 100;" f checkConnection src/Dodge/Inventory/Swap.hs 66;" f @@ -2928,7 +2928,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 99;" f +corpseOrGib src/Dodge/Creature/Update.hs 98;" f corridor src/Dodge/Room/Corridor.hs 17;" f corridorBoss src/Dodge/LockAndKey.hs 133;" f corridorN src/Dodge/Room/Corridor.hs 57;" f @@ -2940,7 +2940,7 @@ crCamouflage src/Dodge/Creature/Picture.hs 33;" f crCanSeeCr src/Dodge/Creature/Test.hs 52;" f crCrSpring src/Dodge/Update.hs 919;" f crCurrentEquipment src/Dodge/Creature/Statistics.hs 62;" f -crDeathSounds src/Dodge/Creature/Vocalization.hs 44;" f +crDeathSounds src/Dodge/Creature/Vocalization.hs 45;" f crDexterity src/Dodge/Creature/Statistics.hs 19;" f crDisplayAwareness src/Dodge/Creature/Picture/Awareness.hs 39;" f crDisplayVigilance src/Dodge/Creature/Picture/Awareness.hs 53;" f @@ -2976,8 +2976,8 @@ crStrength src/Dodge/Creature/Statistics.hs 29;" f crUpdate src/Dodge/Creature/Update.hs 71;" 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 -crWarningSounds src/Dodge/Creature/Vocalization.hs 25;" f +crVocalizationSound src/Dodge/Creature/Vocalization.hs 16;" f +crWarningSounds src/Dodge/Creature/Vocalization.hs 26;" f crWlPbHit src/Dodge/WorldEvent/ThingsHit.hs 59;" f crZoneSize src/Dodge/Zoning/Creature.hs 43;" f craftInfo src/Dodge/Item/Info.hs 169;" f @@ -3042,7 +3042,7 @@ dShadCol src/Dodge/Render/List.hs 208;" f damMatSideEffect src/Dodge/Material/Damage.hs 20;" f damThingHitWith src/Dodge/Damage.hs 72;" f damToExpBarrel src/Dodge/Barreloid.hs 53;" f -damageBlock src/Dodge/Wall/Damage.hs 44;" f +damageBlock src/Dodge/Wall/Damage.hs 59;" f damageCodeCommand src/Dodge/Terminal.hs 67;" f damageCrWl src/Dodge/Damage.hs 29;" f damageCrWlID src/Dodge/Damage.hs 23;" f @@ -3051,15 +3051,16 @@ damageDirection src/Dodge/Damage.hs 35;" f damageDirt src/Dodge/Material/Damage.hs 130;" f damageFlesh src/Dodge/Material/Damage.hs 97;" f damageGlass src/Dodge/Material/Damage.hs 156;" f -damageGlassBlock src/Dodge/Wall/Damage.hs 49;" f +damageGlassBlock src/Dodge/Wall/Damage.hs 64;" f damageHP src/Dodge/Creature/Damage.hs 37;" f damageInCircle src/Dodge/Damage.hs 61;" f +damageMachine src/Dodge/Wall/Damage.hs 45;" f damageMetal src/Dodge/Material/Damage.hs 65;" f damageSensor src/Dodge/Placement/Instance/Sensor.hs 13;" f damageStone src/Dodge/Material/Damage.hs 33;" f damageThingHit src/Dodge/Bullet.hs 180;" f damageTypeThreshold src/Dodge/Machine/Update.hs 132;" f -damageWall src/Dodge/Wall/Damage.hs 29;" f +damageWall src/Dodge/Wall/Damage.hs 30;" f damsToExpBarrel src/Dodge/Barreloid.hs 50;" f dark src/Color.hs 135;" f darkenBackground src/Dodge/Render/MenuScreen.hs 46;" f @@ -3070,9 +3071,9 @@ deZoneIX src/Dodge/Zoning/Base.hs 91;" f deZoneWall src/Dodge/Zoning/Wall.hs 70;" f deadEndRoom src/Dodge/Room/Room.hs 259;" f deadFeet src/Dodge/Creature/Picture.hs 68;" f -deadRot src/Dodge/Creature/Picture.hs 84;" f +deadRot src/Dodge/Creature/Picture.hs 86;" f deadScalp src/Dodge/Creature/Picture.hs 81;" f -deadUpperBody src/Dodge/Creature/Picture.hs 114;" f +deadUpperBody src/Dodge/Creature/Picture.hs 111;" f debrisS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 725;" f debrisSPic src/Dodge/Prop/Draw.hs 16;" f debrisSize src/Dodge/Block/Debris.hs 83;" f @@ -3108,8 +3109,8 @@ defHeldItem src/Dodge/Default/Item.hs 9;" f defLSPic src/Dodge/LightSource/Draw.hs 10;" f defSPic src/Dodge/Item/Draw/SPic.hs 310;" f defaultAimMvType src/Dodge/Creature/MoveType.hs 16;" f -defaultAimingCrit src/Dodge/Default/Creature.hs 107;" f -defaultAudition src/Dodge/Default/Creature.hs 92;" f +defaultAimingCrit src/Dodge/Default/Creature.hs 108;" f +defaultAudition src/Dodge/Default/Creature.hs 93;" f defaultAutoWall src/Dodge/Default/Wall.hs 32;" f defaultBlock src/Dodge/Default/Block.hs 5;" f defaultBounds src/Dodge/Data/Bounds.hs 18;" f @@ -3122,9 +3123,9 @@ defaultChaseMvType src/Dodge/Creature/MoveType.hs 25;" f defaultClusterStatus src/Dodge/Default/Room.hs 37;" f defaultConfig src/Dodge/Data/Config.hs 151;" f defaultCreature src/Dodge/Default/Creature.hs 12;" f -defaultCreatureMemory src/Dodge/Default/Creature.hs 65;" f +defaultCreatureMemory src/Dodge/Default/Creature.hs 66;" f defaultCrystalWall src/Dodge/Default/Wall.hs 35;" f -defaultDeathSounds src/Dodge/Creature/Vocalization.hs 54;" f +defaultDeathSounds src/Dodge/Creature/Vocalization.hs 55;" f defaultDirtBlock src/Dodge/Default/Block.hs 17;" f defaultDirtWall src/Dodge/Default/Wall.hs 47;" f defaultDoor src/Dodge/Default/Door.hs 5;" f @@ -3133,19 +3134,19 @@ defaultDrawButton src/Dodge/Button/Draw.hs 29;" f defaultFlIt src/Dodge/Default.hs 27;" f defaultForeground src/Dodge/Default/ForegroundShape.hs 5;" f defaultHUD src/Dodge/Default/World.hs 170;" f -defaultInanimate src/Dodge/Default/Creature.hs 62;" f +defaultInanimate src/Dodge/Default/Creature.hs 63;" f defaultInput src/Dodge/Default/World.hs 12;" f -defaultIntention src/Dodge/Default/Creature.hs 98;" f -defaultInvSize src/Dodge/Default/Creature.hs 72;" f +defaultIntention src/Dodge/Default/Creature.hs 99;" f +defaultInvSize src/Dodge/Default/Creature.hs 73;" f defaultLDP src/Dodge/ListDisplayParams.hs 19;" f defaultLWorld src/Dodge/Default/World.hs 105;" f defaultMachine src/Dodge/Default.hs 30;" f defaultMachineWall src/Dodge/Default/Wall.hs 38;" f -defaultPerceptionState src/Dodge/Default/Creature.hs 75;" f +defaultPerceptionState src/Dodge/Default/Creature.hs 76;" f defaultProximitySensor src/Dodge/Default.hs 52;" f defaultRoom src/Dodge/Default/Room.hs 9;" f defaultTerminal src/Dodge/Default/Terminal.hs 8;" f -defaultVision src/Dodge/Default/Creature.hs 85;" f +defaultVision src/Dodge/Default/Creature.hs 86;" f defaultWall src/Dodge/Default/Wall.hs 15;" f defaultWindow src/Dodge/Default/Wall.hs 54;" f defaultWorld src/Dodge/Default/World.hs 32;" f @@ -3157,15 +3158,16 @@ deleteWallIDs src/Dodge/Wall/Delete.hs 27;" f denormalEdges src/Polyhedra.hs 128;" f destroyAllInvItems src/Dodge/Inventory.hs 53;" f destroyBlock src/Dodge/Block.hs 17;" f -destroyDoor src/Dodge/Wall/Damage.hs 69;" f +destroyDoor src/Dodge/Wall/Damage.hs 84;" f destroyInvItem src/Dodge/Inventory.hs 40;" f destroyItem src/Dodge/Inventory.hs 62;" f destroyLSFlashAt src/Dodge/LightSource.hs 44;" f destroyMachine src/Dodge/Machine/Destroy.hs 13;" f +destroyMachine' src/Dodge/Wall/Damage.hs 50;" f destroyMatS src/Dodge/Material/Sound.hs 7;" f destroyMcType src/Dodge/Machine/Destroy.hs 22;" f -destroyMount src/Dodge/Wall/Damage.hs 90;" f -destroyMounts src/Dodge/Wall/Damage.hs 87;" f +destroyMount src/Dodge/Wall/Damage.hs 105;" f +destroyMounts src/Dodge/Wall/Damage.hs 102;" f destroyProjectile src/Dodge/Projectile/Update.hs 112;" f detV src/Geometry/Vector.hs 94;" f detector src/Dodge/Item/Held/Utility.hs 27;" f @@ -3317,7 +3319,7 @@ drawDragSelected src/Dodge/Render/HUD.hs 144;" f drawDragSelecting src/Dodge/Render/HUD.hs 162;" f drawEmptySet src/Dodge/Render/Picture.hs 151;" f drawEnergyBall src/Dodge/EnergyBall/Draw.hs 7;" f -drawEquipment src/Dodge/Creature/Picture.hs 128;" f +drawEquipment src/Dodge/Creature/Picture.hs 125;" f drawExamineInventory src/Dodge/Render/HUD.hs 199;" f drawExplosiveBall src/Dodge/EnergyBall/Draw.hs 15;" f drawFarWallDetect src/Dodge/Debug/Picture.hs 271;" f @@ -3404,7 +3406,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 136;" f +dropAll src/Dodge/Creature/Update.hs 134;" f dropInventoryPath src/Dodge/HeldUse.hs 1346;" f dropItem src/Dodge/Creature/Action.hs 155;" f dropper src/Dodge/Item/Scope.hs 82;" f @@ -4129,8 +4131,8 @@ maxInvSlots src/Dodge/Inventory/CheckSlots.hs 30;" f maxViewDistance src/Dodge/Viewpoints.hs 26;" f maybeBlockedPassage src/Dodge/Room/RezBox.hs 80;" f maybeClearLoadingScreen src/Dodge/StartNewGame.hs 58;" f -maybeDestroyBlock src/Dodge/Wall/Damage.hs 59;" f -maybeDestroyDoor src/Dodge/Wall/Damage.hs 64;" f +maybeDestroyBlock src/Dodge/Wall/Damage.hs 74;" f +maybeDestroyDoor src/Dodge/Wall/Damage.hs 79;" f maybeExitCombine src/Dodge/Update/Input/InGame.hs 568;" f maybeOpenConsole src/Dodge/Update.hs 134;" f maybeReadFile src/Dodge/LoadSeed.hs 10;" f @@ -4425,7 +4427,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 132;" f +poisonSPic src/Dodge/Creature/Update.hs 130;" f poisonSprayer src/Dodge/Item/Held/SprayGuns.hs 17;" f poke34 src/Shader/Poke.hs 509;" f pokeArrayOff src/Shader/Poke.hs 521;" f @@ -4664,7 +4666,7 @@ renderListAt src/Dodge/Render/List.hs 177;" f renderShadows src/Render.hs 116;" f replaceNullWith src/Dodge/Creature/ReaderUpdate.hs 168;" f replacePutID src/Dodge/Placement/Instance/Wall.hs 81;" f -resetCrVocCoolDown src/Dodge/Creature/Vocalization.hs 66;" f +resetCrVocCoolDown src/Dodge/Creature/Vocalization.hs 67;" f resetPLUse src/Dodge/PlacementSpot.hs 94;" f resetStride src/Dodge/Creature/State/WalkCycle.hs 25;" f resetTerminal src/Dodge/WorldEffect.hs 160;" f @@ -4790,10 +4792,10 @@ scale3 src/Picture/Base.hs 137;" f scaleMat src/MatrixHelper.hs 71;" f scaleMatrix src/MatrixHelper.hs 68;" f scaleSH src/Shape.hs 266;" f -scalp src/Dodge/Creature/Picture.hs 93;" f +scalp src/Dodge/Creature/Picture.hs 95;" f scancodeToHotkey src/Dodge/Creature/YourControl.hs 102;" f scodeToChar src/Dodge/ScodeToChar.hs 6;" f -scorchSPic src/Dodge/Creature/Update.hs 129;" f +scorchSPic src/Dodge/Creature/Update.hs 127;" 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 @@ -4940,7 +4942,7 @@ shortPoint2 src/Dodge/ShortShow.hs 4;" f shortShow src/ShortShow.hs 7;" f shotgunS src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 527;" f shoulderHeight src/Dodge/Item/HeldOffset.hs 63;" f -shoulderSH src/Dodge/Creature/Picture.hs 125;" f +shoulderSH src/Dodge/Creature/Picture.hs 122;" f showAttachItem src/Dodge/Item/Display.hs 92;" f showEquipItem src/Dodge/Item/Display.hs 107;" f showInt src/Dodge/Item/Info.hs 75;" f @@ -5097,7 +5099,7 @@ stone4S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 543;" f stone5S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 657;" f stopAllSounds src/Sound.hs 127;" f stopBulletAt src/Dodge/Bullet.hs 200;" f -stopPushing src/Dodge/Wall/Damage.hs 95;" f +stopPushing src/Dodge/Wall/Damage.hs 110;" f stopSoundFrom src/Dodge/SoundLogic.hs 220;" f storageShape src/Dodge/Machine/Draw.hs 31;" f strFromEquipment src/Dodge/Creature/Statistics.hs 53;" f @@ -5248,7 +5250,7 @@ topTestPart src/Dodge/TestString.hs 50;" f torchShape src/Dodge/Item/Draw/SPic.hs 277;" f torqueAmount src/Dodge/HeldUse.hs 584;" f torqueCr src/Dodge/WorldEffect.hs 87;" f -torso src/Dodge/Creature/Picture.hs 103;" f +torso src/Dodge/Creature/Picture.hs 100;" f tractCr src/Dodge/TractorBeam/Update.hs 28;" f tractFlIt src/Dodge/TractorBeam/Update.hs 23;" f tractorBeamAt src/Dodge/HeldUse.hs 831;" f @@ -5435,7 +5437,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 184;" f +updatePulse src/Dodge/Creature/Update.hs 180;" f updatePulseBall src/Dodge/Update.hs 484;" f updatePulseLaser src/Dodge/Update.hs 648;" f updatePulseLasers src/Dodge/Update.hs 479;" f @@ -5477,7 +5479,7 @@ updateWheelEvent src/Dodge/Update/Scroll.hs 21;" f updateWheelEvents src/Dodge/Update.hs 449;" f updateWorldEventFlag src/Dodge/Update.hs 128;" f updateWorldEventFlags src/Dodge/Update.hs 116;" f -upperBody src/Dodge/Creature/Picture.hs 121;" f +upperBody src/Dodge/Creature/Picture.hs 118;" f upperBox src/Shape.hs 153;" f upperBoxHalf src/Shape.hs 219;" f upperBoxMT src/Shape.hs 144;" f @@ -5540,7 +5542,7 @@ viewTarget src/Dodge/Creature/ReaderUpdate.hs 155;" f violet src/Color.hs 48;" f visibleWalls src/Dodge/Base/Collide.hs 216;" f visionCheck src/Dodge/Creature/Perception.hs 152;" f -vocalizationTest src/Dodge/Creature/Vocalization.hs 61;" f +vocalizationTest src/Dodge/Creature/Vocalization.hs 62;" f volleyGun src/Dodge/Item/Held/Cane.hs 15;" f volleyGunShape src/Dodge/Item/Draw/SPic.hs 355;" f walkNozzle src/Dodge/HeldUse.hs 807;" f @@ -5635,7 +5637,7 @@ you src/Dodge/Base/You.hs 13;" f youDropItem src/Dodge/Creature/Action.hs 177;" f yourAugmentedItem src/Dodge/Render/HUD.hs 240;" f yourControl src/Dodge/Creature/YourControl.hs 28;" f -yourDefaultStrideLength src/Dodge/Default/Creature.hs 110;" f +yourDefaultStrideLength src/Dodge/Default/Creature.hs 111;" f yourInfo src/Dodge/Creature/Info.hs 10;" f yourInv src/Dodge/Base/You.hs 28;" f yourRootItem src/Dodge/Base/You.hs 22;" f