38 lines
1.1 KiB
Haskell
38 lines
1.1 KiB
Haskell
module Dodge.Machine.Destroy where
|
|
|
|
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 . machines %~ IM.delete (_mcID mc))
|
|
. deleteWallIDs (_mcWallIDs mc)
|
|
. makeExplosionAt (_mcPos mc)
|
|
. mcKillTerm mc
|
|
. mcKillBut mc
|
|
. destroyMcType (mc ^. mcType) mc
|
|
|
|
destroyMcType :: MachineType -> Machine -> World -> World
|
|
destroyMcType mt mc = case mt of
|
|
McTurret tu -> copyItemToFloor (_mcPos mc) (_tuWeapon tu)
|
|
_ -> id
|
|
|
|
mcKillTerm :: Machine -> World -> World
|
|
mcKillTerm mc w = fromMaybe w $ do
|
|
tmid <- mc ^? mcMounts . ix ObTerminal
|
|
tm <- w ^? cWorld . terminals . ix tmid
|
|
return $
|
|
w
|
|
& doTmWdWd (_tmDeathEffect tm) tm
|
|
|
|
mcKillBut :: Machine -> World -> World
|
|
mcKillBut mc w = fromMaybe w $ do
|
|
btid <- mc ^? mcMounts . ix ObButton
|
|
return $ w & cWorld . buttons . at btid .~ Nothing
|