c38d03165f
More checks required
41 lines
1.2 KiB
Haskell
41 lines
1.2 KiB
Haskell
module Dodge.Machine.Destroy where
|
|
|
|
import Geometry.Vector3D
|
|
import Dodge.FloorItem
|
|
import Data.Maybe
|
|
import Dodge.Data.World
|
|
import Dodge.Wall.Delete
|
|
import Dodge.WorldEffect
|
|
import Dodge.WorldEvent.Explosion
|
|
import qualified IntMapHelp as IM
|
|
import LensHelp
|
|
|
|
destroyMachine :: Machine -> World -> World
|
|
destroyMachine mc =
|
|
(cWorld . lWorld . machines %~ IM.delete (_mcID mc))
|
|
. deleteWallIDs (_mcWallIDs mc)
|
|
. makeExplosionAt (_mcPos mc `v2z` 20) 0
|
|
. mcKillTerm mc
|
|
. mcKillBut mc
|
|
. destroyMcType (mc ^. mcType) mc
|
|
|
|
destroyMcType :: MachineType -> Machine -> World -> World
|
|
destroyMcType mt mc w = case mt of
|
|
McTurret tu -> fromMaybe w $ do
|
|
itm <- w ^? cWorld . lWorld . items . ix (tu ^. tuWeapon)
|
|
return $ copyItemToFloor (_mcPos mc) itm w
|
|
_ -> w
|
|
|
|
mcKillTerm :: Machine -> World -> World
|
|
mcKillTerm mc w = fromMaybe w $ do
|
|
tmid <- mc ^? mcMounts . ix OTTerminal
|
|
tm <- w ^? cWorld . lWorld . terminals . ix tmid
|
|
return $
|
|
w
|
|
& doTmWdWd (_tmDeathEffect tm) tm
|
|
|
|
mcKillBut :: Machine -> World -> World
|
|
mcKillBut mc w = fromMaybe w $ do
|
|
btid <- mc ^? mcMounts . ix OTButton
|
|
return $ w & cWorld . lWorld . buttons . at btid .~ Nothing
|