This commit is contained in:
2025-10-24 11:16:30 +01:00
parent 18ab89d3f2
commit 27569ed8f3
11 changed files with 50 additions and 49 deletions
+23 -17
View File
@@ -1,35 +1,41 @@
module Dodge.Update.WallDamage (updateWallDamages,updateEdgesWall) where
module Dodge.Update.WallDamage (updateWallDamages, updateEdgesWall) where
import Dodge.WorldEvent.ThingsHit
import Dodge.Path
import Dodge.Zoning.Base
import Geometry.Data
import Control.Lens
import Data.Maybe
import Dodge.Data.World
import Dodge.Wall.Damage
import qualified IntMapHelp as IM
import Data.Foldable
import Data.Maybe
import qualified Data.Set as S
import Dodge.Data.World
import Dodge.Path
import Dodge.Wall.Damage
import Dodge.WorldEvent.ThingsHit
import Dodge.Zoning.Base
import qualified IntMapHelp as IM
updateWallDamages :: World -> World
updateWallDamages w =
let (is,w')
= IM.foldlWithKey' f (mempty,w) (w ^. cWorld . lWorld . wallDamages)
in updateEdgesWall (zonesExtract (w ^. incEdgeZoning & each . each %~ S.fromList) is) w'
updateWallDamages w =
let (is, w') =
IM.foldlWithKey' f (mempty, w) (w ^. cWorld . lWorld . wallDamages)
in updateEdgesWall is
w'
& cWorld . lWorld . wallDamages .~ IM.empty
where
f isw k dams = fromMaybe isw $ do
wl <- isw ^? _2 . cWorld . lWorld . walls . ix k
return $ foldl' (flip (`damageWall` wl)) isw dams
updateEdgesWall :: S.Set (Int,Int) -> World -> World
updateEdgesWall = flip $ foldl' updateEdgeWallObs
updateEdgesWall :: S.Set Int2 -> World -> World
updateEdgesWall is w = updateEdgesWall'
(zonesExtract (w ^. incEdgeZoning & each . each %~ S.fromList) is) w
updateEdgeWallObs :: World -> (Int,Int) -> World
updateEdgeWallObs w (i,j) = fromMaybe w $ do
updateEdgesWall' :: S.Set (Int, Int) -> World -> World
updateEdgesWall' = flip $ foldl' updateEdgeWallObs
updateEdgeWallObs :: World -> (Int, Int) -> World
updateEdgeWallObs w (i, j) = fromMaybe w $ do
s <- getNodePos i w
e <- getNodePos j w
let wlflags = foldMap (^. _2 . wlPathFlag) $ wlsHitUnsorted s e w
return $ w & cWorld . incGraph %~ updateEdge (f wlflags) (i,j)
return $ w & cWorld . incGraph %~ updateEdge (f wlflags) (i, j)
where
f x _ = S.map WallObstacle x