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