From 9e6534b8f42f56c99ed302ede3d30ee3938e434a Mon Sep 17 00:00:00 2001 From: justin Date: Wed, 22 Oct 2025 23:09:09 +0100 Subject: [PATCH] Simplify doors somewhat, unsure what to do about edge obstacles --- src/Dodge/Block/Debris.hs | 5 ++-- src/Dodge/Data/Door.hs | 4 ---- src/Dodge/Default/Door.hs | 4 +--- src/Dodge/DrWdWd.hs | 19 +++++++--------- src/Dodge/Placement/PlaceSpot/TriggerDoor.hs | 7 ++---- src/Dodge/Wall/Zone.hs | 1 - tags | 24 ++++++++++---------- 7 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/Dodge/Block/Debris.hs b/src/Dodge/Block/Debris.hs index 5e36014ab..e89effae2 100644 --- a/src/Dodge/Block/Debris.hs +++ b/src/Dodge/Block/Debris.hs @@ -7,6 +7,7 @@ module Dodge.Block.Debris ( makeDebrisDirected, ) where +import qualified Data.IntMap.Strict as IM import Dodge.ShiftPoint import Color import Data.Foldable @@ -28,8 +29,8 @@ makeDoorDebris dr w = w & makeDebris mt col p p2a = lerpP2A (dr ^. drZeroPos) (dr ^. drOnePos) (dr ^. drLerp) p = centroid . fmap fst $ (dr ^. drFootPrint) & each . each %~ shiftPointBy p2a (mt, col) = fromMaybe (Stone, greyN 0.5) $ do - wlids <- w ^? cWorld . lWorld . doors . ix (_drID dr) . drWallIDs - (wlid, _) <- IS.minView wlids + wlids <- w ^? cWorld . lWorld . doors . ix (_drID dr) . drFootPrint + ((wlid,_),_) <- IM.minViewWithKey wlids wl <- w ^? cWorld . lWorld . walls . ix wlid return (_wlMaterial wl, _wlColor wl) diff --git a/src/Dodge/Data/Door.hs b/src/Dodge/Data/Door.hs index 228a6e4f5..08ebba6be 100644 --- a/src/Dodge/Data/Door.hs +++ b/src/Dodge/Data/Door.hs @@ -11,7 +11,6 @@ module Dodge.Data.Door ( import Control.Lens import Data.Aeson import Data.Aeson.TH -import qualified Data.IntSet as IS import Dodge.Data.MountedObject import Dodge.Data.PathGraph import Dodge.Data.WorldEffect @@ -29,7 +28,6 @@ data PushSource data Door = Door { _drID :: Int - , _drWallIDs :: IS.IntSet , _drTrigger :: WdBl , _drMech :: DrWdWd , _drZeroPos :: (Point2,Float) @@ -41,8 +39,6 @@ data Door = Door , _drPushedBy :: PushSource , _drPushes :: Maybe Int , _drMounts :: [MountedObject] --- , _drObstructs :: [(Int,Int)] - , _drObstacleType :: EdgeObstacle } makeLenses ''Door diff --git a/src/Dodge/Default/Door.hs b/src/Dodge/Default/Door.hs index bc4fa3bf9..1304a0c9a 100644 --- a/src/Dodge/Default/Door.hs +++ b/src/Dodge/Default/Door.hs @@ -30,7 +30,7 @@ defaultDoor :: Door defaultDoor = Door { _drID = 0 - , _drWallIDs = mempty +-- , _drWallIDs = mempty -- , _drStatus = DoorClosed , _drTrigger = WdBlConst False , _drMech = DrWdId @@ -46,6 +46,4 @@ defaultDoor = , _drPushedBy = PushesItself , _drPushes = Nothing , _drMounts = mempty --- , _drObstructs = mempty - , _drObstacleType = DoorObstacle } diff --git a/src/Dodge/DrWdWd.hs b/src/Dodge/DrWdWd.hs index c5a8b1d0e..fbd1ed897 100644 --- a/src/Dodge/DrWdWd.hs +++ b/src/Dodge/DrWdWd.hs @@ -26,7 +26,7 @@ updateDoor dr w doorLerp :: Door -> World -> (S.Set Int2,World) doorLerp dr w = fromMaybe (mempty,w) $ do x <- newlerp - let ps = (dr ^. drFootPrint) & each . each %~ shiftPointBy (p2a x) + let ps = wlposs x is = foldMap (S.fromList . uncurry (zoneOfSeg peZoneSize)) ps -- it seems possible that this will miss some paths: we add zones for the -- old footprint. Seems unlikely, but a possible cause of pathfinding bugs @@ -36,8 +36,7 @@ doorLerp dr w = fromMaybe (mempty,w) $ do & cWorld . lWorld . doors . ix drid . drLerp .~ x) where f = ifoldl' (flip . moveWallID) w . wlposs - p2a = lerpP2A (dr ^. drZeroPos) (dr ^. drOnePos) - wlposs x = (dr ^. drFootPrint) & each . each %~ shiftPointBy (p2a x) + wlposs x = (dr ^. drFootPrint) & each . each %~ shiftPointBy (doDoorLerp dr x) clerp = dr ^. drLerp newlerp | toOpen && clerp < 1 = Just . min 1 $ clerp + speed @@ -48,9 +47,12 @@ doorLerp dr w = fromMaybe (mempty,w) $ do drid = _drID dr playSound x | _drPushedBy dr == PushesItself = - soundContinue (WallSound drid) (fst $ p2a x) slideDoorS (Just 1) + soundContinue (WallSound drid) (fst $ doDoorLerp dr x) slideDoorS (Just 1) | otherwise = id +doDoorLerp :: Door -> Float -> Point2A +doDoorLerp dr = lerpP2A (dr ^. drZeroPos) (dr ^. drOnePos) + destroyDoor :: Door -> World -> (S.Set Int2, World) destroyDoor dr w = (is,w @@ -62,14 +64,9 @@ destroyDoor dr w = & stopPushing (_drPushes dr) & destroyMounts (_drMounts dr)) where - p2a = lerpP2A (dr ^. drZeroPos) (dr ^. drOnePos) (dr ^. drLerp) - ps = (dr ^. drFootPrint) & each . each %~ shiftPointBy p2a is = foldMap (S.fromList . uncurry (zoneOfSeg peZoneSize)) ps - wlids = _drWallIDs dr - --awl = _walls (_cWorld w) IM.! IS.findMin wlids --- awl = w ^?! cWorld . lWorld . walls . ix (IS.findMin wlids) --- pos = fst . _wlLine $ awl --- ps = replicateM 25 (randInCirc 20) & evalState $ _randGen w + ps = (dr ^. drFootPrint) & each . each %~ shiftPointBy (doDoorLerp dr (dr ^. drLerp)) + wlids = IM.keysSet $ _drFootPrint dr destroyMounts :: [MountedObject] -> World -> World destroyMounts mos w = foldl' (flip destroyMount) w mos diff --git a/src/Dodge/Placement/PlaceSpot/TriggerDoor.hs b/src/Dodge/Placement/PlaceSpot/TriggerDoor.hs index 75cf15744..35888e03e 100644 --- a/src/Dodge/Placement/PlaceSpot/TriggerDoor.hs +++ b/src/Dodge/Placement/PlaceSpot/TriggerDoor.hs @@ -7,7 +7,6 @@ module Dodge.Placement.PlaceSpot.TriggerDoor ( import Dodge.ShiftPoint import Linear import Dodge.Data.GenWorld -import qualified Data.IntSet as IS import Data.List import Dodge.Default.Door import Dodge.LevelGen.DoorPane @@ -36,14 +35,13 @@ plDoor col eo cond l p1 p2 gw = (drid, over gwWorld addWalls $ gw & gwWorld . cW IM.insert drid $ defaultDoor { _drID = drid - , _drWallIDs = IS.fromList wlids +-- , _drWallIDs = IS.fromList wlids , _drTrigger = cond , _drMech = DoorLerp , _drZeroPos = p1 , _drOnePos = p2 , _drLerp = 0 , _drFootPrint = IM.fromList . zip wlids $ wlps' - , _drObstacleType = eo , _drSpeed = 0.01 } -- nsteps = length pss - 1 @@ -96,13 +94,12 @@ plSlideDoor dr wl eo shiftOffset a b gw = IM.insert drid $ dr { _drID = drid - , _drWallIDs = IS.fromList wlids +-- , _drWallIDs = IS.fromList wlids , _drMech = DoorLerp , _drZeroPos = (a, 0) , _drOnePos = (shiftLeft a, 0) , _drLerp = 0 , _drFootPrint = IM.fromList $ zip wlids $ rectanglePairs 9 0 (b-a) - , _drObstacleType = eo , _drSpeed = 1 / distance a (shiftLeft a) } addDoorWalls w' = foldl' (addDoorWall eo drid wl) w' $ zip wlids pairs diff --git a/src/Dodge/Wall/Zone.hs b/src/Dodge/Wall/Zone.hs index d4b2868bb..35da7d972 100644 --- a/src/Dodge/Wall/Zone.hs +++ b/src/Dodge/Wall/Zone.hs @@ -22,4 +22,3 @@ insertWallInZones = over wlZoning . zoneWall deleteWallFromZones :: Wall -> World -> World deleteWallFromZones = over wlZoning . deZoneWall - diff --git a/tags b/tags index 1126d484b..1773b32bc 100644 --- a/tags +++ b/tags @@ -3125,8 +3125,8 @@ deleteWallID src/Dodge/Wall/Delete.hs 13;" f deleteWallIDs src/Dodge/Wall/Delete.hs 28;" f denormalEdges src/Polyhedra.hs 136;" f destroyAllInvItems src/Dodge/Inventory.hs 53;" f -destroyBlock src/Dodge/Block.hs 51;" f -destroyDoor src/Dodge/Block.hs 85;" f +destroyBlock src/Dodge/Block.hs 48;" f +destroyDoor src/Dodge/DrWdWd.hs 56;" f destroyInvItem src/Dodge/Inventory.hs 40;" f destroyItem src/Dodge/Inventory.hs 62;" f destroyLS src/Dodge/LightSource.hs 32;" f @@ -3134,8 +3134,8 @@ destroyLSFlashAt src/Dodge/LightSource.hs 42;" f destroyMachine src/Dodge/Machine/Destroy.hs 13;" f destroyMatS src/Dodge/Material/Sound.hs 7;" f destroyMcType src/Dodge/Machine/Destroy.hs 22;" f -destroyMount src/Dodge/Block.hs 105;" f -destroyMounts src/Dodge/Block.hs 102;" f +destroyMount src/Dodge/DrWdWd.hs 74;" f +destroyMounts src/Dodge/DrWdWd.hs 71;" f destroyProjectile src/Dodge/Projectile/Update.hs 108;" f detV src/Geometry/Vector.hs 94;" f detector src/Dodge/Item/Held/Utility.hs 27;" f @@ -3236,7 +3236,7 @@ doWorldEvents src/Dodge/Update.hs 447;" f doWorldPos src/Dodge/WorldPos.hs 10;" f door src/Dodge/Room/Door.hs 14;" f doorBetween src/Dodge/Placement/Instance/Door.hs 39;" f -doorLerp src/Dodge/DrWdWd.hs 20;" f +doorLerp src/Dodge/DrWdWd.hs 26;" f dotV src/Geometry/Vector.hs 76;" f dotV3 src/Geometry/Vector3D.hs 119;" f doubleCorridorBarrels src/Dodge/Room/Room.hs 276;" f @@ -3956,6 +3956,7 @@ leftRightCombine src/Dodge/Item/Grammar.hs 197;" f leftWristPQ src/Dodge/Creature/HandPos.hs 81;" f legsSPic src/Dodge/Item/Draw/SPic.hs 468;" f lerpP2A src/Dodge/ShiftPoint.hs 14;" f +lerpdr src/Dodge/DrWdWd.hs 53;" f liShape src/Dodge/Placement/Instance/LightSource.hs 111;" f light src/Color.hs 104;" f lightSensByDoor src/Dodge/Room/LasTurret.hs 51;" f @@ -4110,10 +4111,9 @@ maxInvSlots src/Dodge/Inventory/CheckSlots.hs 30;" f maxShowX src/Dodge/Combine/Graph.hs 48;" f maxViewDistance src/Dodge/Viewpoints.hs 26;" f maybeBlockedPassage src/Dodge/Room/RezBox.hs 80;" f -maybeClearPath src/Dodge/Block.hs 71;" f -maybeClearPaths src/Dodge/Block.hs 68;" f +maybeClearPath src/Dodge/Block.hs 68;" f +maybeClearPaths src/Dodge/Block.hs 65;" f maybeDestroyBlock src/Dodge/Wall/Damage.hs 32;" f -maybeDestroyDoor src/Dodge/Wall/Damage.hs 37;" f maybeExitCombine src/Dodge/Update/Input/InGame.hs 562;" f maybeOpenConsole src/Dodge/Update.hs 129;" f maybeReadFile src/Dodge/LoadSeed.hs 10;" f @@ -5029,7 +5029,7 @@ speedLegs src/Dodge/Item/Equipment.hs 90;" f splashMenu src/Dodge/Menu.hs 33;" f splashMenuOptions src/Dodge/Menu.hs 38;" f splashScreen src/Dodge/Initialisation.hs 10;" f -splinterBlock src/Dodge/Block.hs 25;" f +splinterBlock src/Dodge/Block.hs 22;" f splitBezierquad src/Geometry/Bezier.hs 15;" f splitExtra src/Justify.hs 21;" f splitLookupTrie src/SimpleTrie.hs 39;" f @@ -5085,7 +5085,7 @@ stone4S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 484;" f stone5S src/Dodge/SoundLogic/ExternallyGeneratedSounds.hs 626;" f stopAllSounds src/Sound.hs 125;" f stopBulletAt src/Dodge/Bullet.hs 199;" f -stopPushing src/Dodge/Block.hs 110;" f +stopPushing src/Dodge/DrWdWd.hs 79;" f stopSoundFrom src/Dodge/SoundLogic.hs 220;" f strFromEquipment src/Dodge/Creature/Statistics.hs 53;" f strFromHeldItem src/Dodge/Creature/Statistics.hs 67;" f @@ -5330,7 +5330,7 @@ unpause src/Dodge/Menu.hs 212;" f unsafeBlinkAction src/Dodge/Creature/Action/Blink.hs 57;" f unsafeBlinker src/Dodge/Item/Held/Utility.hs 33;" f unsafeSwapKeys src/IntMapHelp.hs 75;" f -unshadowBlock src/Dodge/Block.hs 38;" f +unshadowBlock src/Dodge/Block.hs 35;" f untilJust src/MonadHelp.hs 7;" f untilJustCount src/MonadHelp.hs 14;" f unusedOffPathAwayFromLink src/Dodge/PlacementSpot.hs 131;" f @@ -5365,7 +5365,7 @@ updateDelayedEvents src/Dodge/Update.hs 909;" f updateDisplaySections src/Dodge/DisplayInventory.hs 116;" f updateDistortion src/Dodge/Distortion.hs 5;" f updateDistortions src/Dodge/Update.hs 577;" f -updateDoor src/Dodge/DrWdWd.hs 15;" f +updateDoor src/Dodge/DrWdWd.hs 20;" f updateDoorEdge src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 74;" f updateDoorEdges src/Dodge/Placement/PlaceSpot/TriggerDoor.hs 71;" f updateDoors src/Dodge/Update.hs 328;" f