Handle machine damage/destruction during wall damage

This commit is contained in:
2026-02-11 17:59:08 +00:00
parent 38eef8fd54
commit af8f803404
3 changed files with 66 additions and 46 deletions
+6 -4
View File
@@ -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
+18 -2
View File
@@ -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
+42 -40
View File
@@ -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