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