diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index ffbc8f0bc6c..25813538661 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -4,6 +4,10 @@ #define NUKE_SEALANT_OPEN 3 #define NUKE_UNWRENCHED 4 #define NUKE_MOBILE 5 +#define NUKE_CORE_EVERYTHING_FINE 6 +#define NUKE_CORE_PANEL_EXPOSED 7 +#define NUKE_CORE_PANEL_UNWELDED 8 +#define NUKE_CORE_FULLY_EXPOSED 9 GLOBAL_VAR(bomb_set) @@ -26,11 +30,16 @@ GLOBAL_VAR(bomb_set) var/safety = TRUE var/obj/item/disk/nuclear/auth = null var/removal_stage = NUKE_INTACT + var/obj/item/nuke_core/plutonium/core = null var/lastentered var/is_syndicate = FALSE use_power = NO_POWER_USE var/previous_level = "" var/datum/wires/nuclearbomb/wires = null + ///The same state removal stage is, until someone opens the panel of the nuke. This way. we can have someone open the front of the nuke, while keep track of where in the world we are on the anchoring bolts. + var/anchor_stage = NUKE_INTACT + ///This is so we can check if the internal components are sealed up propperly, when the outer hatch is closed. + var/core_stage = NUKE_CORE_EVERYTHING_FINE /obj/machinery/nuclearbomb/syndicate is_syndicate = TRUE @@ -39,16 +48,19 @@ GLOBAL_VAR(bomb_set) extended = FALSE anchored = FALSE -/obj/machinery/nuclearbomb/New() - ..() +/obj/machinery/nuclearbomb/Initialize() + . = ..() r_code = rand(10000, 99999.0) // Creates a random code upon object spawn. wires = new/datum/wires/nuclearbomb(src) previous_level = get_security_level() GLOB.poi_list |= src + core = new /obj/item/nuke_core/plutonium(src) + STOP_PROCESSING(SSobj, core) //Let us not irradiate the vault by default. /obj/machinery/nuclearbomb/Destroy() SStgui.close_uis(wires) QDEL_NULL(wires) + QDEL_NULL(core) GLOB.poi_list.Remove(src) return ..() @@ -73,16 +85,41 @@ GLOBAL_VAR(bomb_set) else to_chat(user, "You need to deploy [src] first.") return + if(istype(O, /obj/item/stack/sheet/mineral/titanium) && removal_stage == NUKE_CORE_FULLY_EXPOSED) + if(do_after(user, 20, target = src)) + var/obj/item/stack/S = O + if(!loc || !S || S.get_amount() < 5) + return + S.use(5) + user.visible_message("[user] repairs [src]'s inner core plate.", "You repair [src]'s inner core plate. The radiation is contained.") + removal_stage = NUKE_CORE_PANEL_UNWELDED + if(core) + STOP_PROCESSING(SSobj, core) + return + if(istype(O, /obj/item/stack/sheet/metal) && removal_stage == NUKE_CORE_PANEL_EXPOSED) + var/obj/item/stack/S = O + if(do_after(user, 20, target = src)) + if(!loc || !S || S.get_amount() < 5) + return + S.use(5) + user.visible_message("[user] repairs [src]'s outer core plate.", "You repair [src]'s outer core plate.") + removal_stage = NUKE_CORE_EVERYTHING_FINE + return + if(istype(O, /obj/item/nuke_core/plutonium) && removal_stage == NUKE_CORE_FULLY_EXPOSED) + if(do_after(user, 20, target = src)) + if(!user.unEquip(O)) + to_chat(user, "The [O] is stuck to your hand!") + return + user.visible_message("[user] puts [O] back in [src].", "You put [O] back in [src].") + O.forceMove(src) + core = O + else if(istype(O, /obj/item/disk/plantgene)) to_chat(user, "You try to plant the disk, but despite rooting around, it won't fit! After you branch out to read the instructions, you find out where the problem stems from. You've been bamboo-zled, this isn't a nuclear disk at all!") return return ..() /obj/machinery/nuclearbomb/crowbar_act(mob/user, obj/item/I) - if(!anchored) - return - if(removal_stage != NUKE_UNWRENCHED && removal_stage != NUKE_COVER_OFF) - return . = TRUE if(!I.tool_use_check(user, 0)) return @@ -92,7 +129,23 @@ GLOBAL_VAR(bomb_set) return user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.") removal_stage = NUKE_COVER_OPEN - else + if(removal_stage == NUKE_CORE_EVERYTHING_FINE) + user.visible_message("[user] starts removing [src]'s outer core plate...", "You start removing [src]'s outer plate...") + if(!I.use_tool(src, user, 40, volume = I.tool_volume) || removal_stage != NUKE_CORE_EVERYTHING_FINE) + return + user.visible_message("[user] finishes removing [src]'s outer core plate.", "You finish removing [src]'s outer core plate.") + new /obj/item/stack/sheet/metal(loc, 5) + removal_stage = NUKE_CORE_PANEL_EXPOSED + if(removal_stage == NUKE_CORE_PANEL_UNWELDED) + user.visible_message("[user] starts removing [src]'s inner core plate...", "You start removing [src]'s inner plate...") + if(!I.use_tool(src, user, 80, volume = I.tool_volume) || removal_stage != NUKE_CORE_PANEL_UNWELDED) + return + user.visible_message("[user] finishes removing [src]'s inner core plate.", "You remove [src]'s inner core plate. You can see the core's green glow!") + removal_stage = NUKE_CORE_FULLY_EXPOSED + new /obj/item/stack/sheet/mineral/titanium(loc, 5) + if(core) + START_PROCESSING(SSobj, core) + if(removal_stage == NUKE_UNWRENCHED) user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") if(!I.use_tool(src, user, 80, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED) return @@ -126,15 +179,19 @@ GLOBAL_VAR(bomb_set) . = TRUE if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return - if(auth) + if(auth || (istype(I, /obj/item/screwdriver/nuke))) if(!panel_open) panel_open = TRUE overlays += image(icon, "npanel_open") to_chat(user, "You unscrew the control panel of [src].") + anchor_stage = removal_stage + removal_stage = core_stage else panel_open = FALSE overlays -= image(icon, "npanel_open") to_chat(user, "You screw the control panel of [src] back on.") + core_stage = removal_stage + removal_stage = anchor_stage else if(!panel_open) to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") @@ -142,6 +199,8 @@ GLOBAL_VAR(bomb_set) panel_open = FALSE overlays -= image(icon, "npanel_open") to_chat(user, "You screw the control panel of [src] back on.") + core_stage = removal_stage + removal_stage = anchor_stage flick("nuclearbombc", src) /obj/machinery/nuclearbomb/wirecutter_act(mob/user, obj/item/I) @@ -154,8 +213,6 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/welder_act(mob/user, obj/item/I) . = TRUE - if(removal_stage != NUKE_INTACT && removal_stage != NUKE_COVER_OPEN) - return if(!I.tool_use_check(user, 0)) return if(removal_stage == NUKE_INTACT) @@ -167,7 +224,19 @@ GLOBAL_VAR(bomb_set) visible_message("[user] cuts through the bolt covers on [src].",\ "You cut through the bolt cover.") removal_stage = NUKE_COVER_OFF - else if(removal_stage == NUKE_COVER_OPEN) + if(removal_stage == NUKE_CORE_PANEL_UNWELDED) + user.visible_message("[user] starts welding [src]'s inner core plate...", "You start welding [src]'s inner core plate...") + if(!I.use_tool(src, user, 40, 5, volume = I.tool_volume) || removal_stage != NUKE_CORE_PANEL_UNWELDED) + return + user.visible_message("[user] finishes welding [src]'s inner core plate...", "You finish welding [src]'s inner core plate...") + removal_stage = NUKE_CORE_PANEL_EXPOSED + else if(removal_stage == NUKE_CORE_PANEL_EXPOSED) + user.visible_message("[user] starts unwelding [src]'s inner core plate...", "You start unwelding [src]'s inner core plate...") + if(!I.use_tool(src, user, 40, 5, volume = I.tool_volume) || removal_stage != NUKE_CORE_PANEL_EXPOSED) + return + user.visible_message("[user] finishes unwelding [src]'s inner core plate...", "You finish unwelding [src]'s inner core plate...") + removal_stage = NUKE_CORE_PANEL_UNWELDED + if(removal_stage == NUKE_COVER_OPEN) visible_message("[user] starts cutting apart the anchoring system sealant on [src].",\ "You start cutting apart the anchoring system's sealant with [I]...",\ "You hear welding.") @@ -182,7 +251,18 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) if(panel_open) - wires.Interact(user) + if(removal_stage == NUKE_CORE_FULLY_EXPOSED && core) + if(timing) //removing the core is less risk then cutting wires, and doesnt take long, so we should not let crew do it while the nuke is armed. You can however get to it, without the special screwdriver, if you put the NAD in. + to_chat(user, "The [core] won't budge, metal clamps keep it in!") + return + user.visible_message("[user] starts to pull [core] out of the [src]!", "You start to pull [core] out of the [src]!") + if(do_after(user, 50, target = src)) + user.visible_message("[user] pulls [core] out of the [src]!", "You pull [core] out of the [src]! Might want to put it somewhere safe.") + core.forceMove(loc) + core = null + + else + wires.Interact(user) else ui_interact(user) @@ -308,6 +388,9 @@ GLOBAL_VAR(bomb_set) if(safety) to_chat(usr, "The safety is still on.") return + if(!core) + to_chat(usr, "The [src]'s screen blinks red! There is no plutonium core in the [src]!") + return timing = !(timing) if(timing) if(!lighthack) @@ -471,3 +554,7 @@ GLOBAL_VAR(bomb_set) #undef NUKE_SEALANT_OPEN #undef NUKE_UNWRENCHED #undef NUKE_MOBILE +#undef NUKE_CORE_EVERYTHING_FINE +#undef NUKE_CORE_PANEL_EXPOSED +#undef NUKE_CORE_PANEL_UNWELDED +#undef NUKE_CORE_FULLY_EXPOSED diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 15f9f31daa1..53268b240d7 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 32d0fa83a83..e9f0c7a4214 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ