From b4ded1ad0037a40050cd2aeea1bdb195d7a54932 Mon Sep 17 00:00:00 2001 From: Rob Bailey Date: Mon, 25 Nov 2019 01:50:52 -0800 Subject: [PATCH] The Bomb (#47929) I spent a ridiculous amount of time on this. Arm order now works like: input disk input nuke code, press E input time, press E press ARM to activate press ARM again to deactivate (with disk) press C to clear code input while ready but not armed --- code/__DEFINES/machines.dm | 7 + .../nukeop/equipment/nuclearbomb.dm | 179 +++++++++++------- sound/machines/nuke/angry_beep.ogg | Bin 0 -> 7106 bytes sound/machines/nuke/confirm_beep.ogg | Bin 0 -> 12987 bytes sound/machines/nuke/general_beep.ogg | Bin 0 -> 4714 bytes .../packages/tgui/interfaces/NuclearBomb.js | 147 ++++++++++++++ .../packages/tgui/public/tgui.bundle.css | 2 +- tgui-next/packages/tgui/public/tgui.bundle.js | 4 +- tgui-next/packages/tgui/routes.js | 6 + .../tgui/styles/components/NuclearBomb.scss | 57 ++++++ tgui-next/packages/tgui/styles/main.scss | 1 + .../packages/tgui/styles/themes/retro.scss | 50 +++++ tgui-next/packages/tgui/webpack.config.js | 1 + 13 files changed, 386 insertions(+), 68 deletions(-) create mode 100644 sound/machines/nuke/angry_beep.ogg create mode 100644 sound/machines/nuke/confirm_beep.ogg create mode 100644 sound/machines/nuke/general_beep.ogg create mode 100644 tgui-next/packages/tgui/interfaces/NuclearBomb.js create mode 100644 tgui-next/packages/tgui/styles/components/NuclearBomb.scss create mode 100644 tgui-next/packages/tgui/styles/themes/retro.scss diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 7f27b195fc2..7781efc5eee 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -94,6 +94,13 @@ #define NUKESTATE_CORE_EXPOSED 1 #define NUKESTATE_CORE_REMOVED 0 +#define NUKEUI_AWAIT_DISK 0 +#define NUKEUI_AWAIT_CODE 1 +#define NUKEUI_AWAIT_TIMER 2 +#define NUKEUI_AWAIT_ARM 3 +#define NUKEUI_TIMING 4 +#define NUKEUI_EXPLODED 5 + #define NUKE_OFF_LOCKED 0 #define NUKE_OFF_UNLOCKED 1 #define NUKE_ON_TIMING 2 diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 26a5a2f3717..ed40a87bf3c 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -8,15 +8,16 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF ui_style = "nanotrasen" - ui_x = 500 - ui_y = 600 + ui_x = 350 + ui_y = 442 var/timer_set = 90 - var/default_timer_set = 90 var/minimum_timer_set = 90 var/maximum_timer_set = 3600 var/numeric_input = "" + var/ui_mode = NUKEUI_AWAIT_DISK + var/timing = FALSE var/exploding = FALSE var/exploded = FALSE @@ -100,6 +101,8 @@ if(!user.transferItemToLoc(I, src)) return auth = I + update_ui_mode() + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) add_fingerprint(user) return @@ -235,6 +238,29 @@ var/volume = (get_time_left() <= 20 ? 30 : 5) playsound(loc, 'sound/items/timer.ogg', volume, FALSE) +/obj/machinery/nuclearbomb/proc/update_ui_mode() + if(exploded) + ui_mode = NUKEUI_EXPLODED + return + + if(!auth) + ui_mode = NUKEUI_AWAIT_DISK + return + + if(timing) + ui_mode = NUKEUI_TIMING + return + + if(!safety) + ui_mode = NUKEUI_AWAIT_ARM + return + + if(!yes_code) + ui_mode = NUKEUI_AWAIT_CODE + return + + ui_mode = NUKEUI_AWAIT_TIMER + /obj/machinery/nuclearbomb/ui_interact(mob/user, ui_key="main", datum/tgui/ui=null, force_open=0, datum/tgui/master_ui=null, datum/ui_state/state=GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) @@ -245,104 +271,127 @@ /obj/machinery/nuclearbomb/ui_data(mob/user) var/list/data = list() data["disk_present"] = auth - data["code_approved"] = yes_code - var/first_status - if(auth) - if(yes_code) - first_status = timing ? "Func/Set" : "Functional" - else - first_status = "Auth S2." + + var/hidden_code = (ui_mode == NUKEUI_AWAIT_CODE && numeric_input != "ERROR") + + var/current_code = "" + if(hidden_code) + while(length(current_code) < length(numeric_input)) + current_code = "[current_code]*" else - if(timing) - first_status = "Set" - else - first_status = "Auth S1." - var/second_status = exploded ? "Warhead triggered, thanks for flying Nanotrasen" : (safety ? "Safe" : "Engaged") + current_code = numeric_input + while(length(current_code) < 5) + current_code = "[current_code]-" + + var/first_status + var/second_status + switch(ui_mode) + if(NUKEUI_AWAIT_DISK) + first_status = "DEVICE LOCKED" + if(timing) + second_status = "TIME: [get_time_left()]" + else + second_status = "AWAIT DISK" + if(NUKEUI_AWAIT_CODE) + first_status = "INPUT CODE" + second_status = "CODE: [current_code]" + if(NUKEUI_AWAIT_TIMER) + first_status = "INPUT TIME" + second_status = "TIME: [current_code]" + if(NUKEUI_AWAIT_ARM) + first_status = "DEVICE READY" + second_status = "TIME: [get_time_left()]" + if(NUKEUI_TIMING) + first_status = "DEVICE ARMED" + second_status = "TIME: [get_time_left()]" + if(NUKEUI_EXPLODED) + first_status = "DEVICE DEPLOYED" + second_status = "THANK YOU" + data["status1"] = first_status data["status2"] = second_status data["anchored"] = anchored - data["safety"] = safety - data["timing"] = timing - data["time_left"] = get_time_left() - - data["timer_set"] = timer_set - data["timer_is_not_default"] = timer_set != default_timer_set - data["timer_is_not_min"] = timer_set != minimum_timer_set - data["timer_is_not_max"] = timer_set != maximum_timer_set - - var/message = "AUTH" - if(auth) - message = "[numeric_input]" - if(yes_code) - message = "*****" - data["message"] = message return data /obj/machinery/nuclearbomb/ui_act(action, params) if(..()) return + playsound(src, "terminal_type", 20, FALSE) switch(action) if("eject_disk") if(auth && auth.loc == src) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) auth.forceMove(get_turf(src)) auth = null . = TRUE - if("insert_disk") - if(!auth) + else var/obj/item/I = usr.is_holding_item_of_type(/obj/item/disk/nuclear) if(I && disk_check(I) && usr.transferItemToLoc(I, src)) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) auth = I . = TRUE + update_ui_mode() if("keypad") if(auth) var/digit = params["digit"] switch(digit) - if("R") + if("C") + if(auth && ui_mode == NUKEUI_AWAIT_ARM) + set_safety() + yes_code = FALSE + playsound(src, 'sound/machines/nuke/confirm_beep.ogg', 50, FALSE) + update_ui_mode() + else + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) numeric_input = "" - yes_code = FALSE . = TRUE if("E") - if(numeric_input == r_code) - numeric_input = "" - yes_code = TRUE - . = TRUE - else - numeric_input = "ERROR" + switch(ui_mode) + if(NUKEUI_AWAIT_CODE) + if(numeric_input == r_code) + numeric_input = "" + yes_code = TRUE + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) + . = TRUE + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + numeric_input = "ERROR" + if(NUKEUI_AWAIT_TIMER) + var/number_value = text2num(numeric_input) + if(number_value) + timer_set = CLAMP(number_value, minimum_timer_set, maximum_timer_set) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) + set_safety() + . = TRUE + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + update_ui_mode() if("0","1","2","3","4","5","6","7","8","9") if(numeric_input != "ERROR") numeric_input += digit if(length(numeric_input) > 5) numeric_input = "ERROR" + else + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) . = TRUE - if("timer") - if(auth && yes_code) - var/change = params["change"] - if(change == "reset") - timer_set = default_timer_set - else if(change == "decrease") - timer_set = max(minimum_timer_set, timer_set - 10) - else if(change == "increase") - timer_set = min(maximum_timer_set, timer_set + 10) - else if(change == "input") - var/user_input = input(usr, "Set time to detonation.", name) as null|num - if(!user_input) - return - var/N = text2num(user_input) - if(!N) - return - timer_set = CLAMP(N,minimum_timer_set,maximum_timer_set) - . = TRUE - if("safety") - if(auth && yes_code && !exploded) - set_safety() + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) + if("arm") + if(auth && yes_code && !safety && !exploded) + playsound(src, 'sound/machines/nuke/confirm_beep.ogg', 50, FALSE) + set_active() + update_ui_mode() + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) if("anchor") if(auth && yes_code) + playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) set_anchor() - if("toggle_timer") - if(auth && yes_code && !safety && !exploded) - set_active() - + else + playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) /obj/machinery/nuclearbomb/proc/set_anchor() if(isinspace() && !anchored) diff --git a/sound/machines/nuke/angry_beep.ogg b/sound/machines/nuke/angry_beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..547779de1beba7d514045f7d47dc659fd3fcaf34 GIT binary patch literal 7106 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 literal 0 HcmV?d00001 diff --git a/sound/machines/nuke/general_beep.ogg b/sound/machines/nuke/general_beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c149eb300a0c10bf4909d7e9a81023eb44288257 GIT binary patch literal 4714 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 GEdK)*P@(Ps literal 0 HcmV?d00001 diff --git a/tgui-next/packages/tgui/interfaces/NuclearBomb.js b/tgui-next/packages/tgui/interfaces/NuclearBomb.js new file mode 100644 index 00000000000..873a7715b14 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/NuclearBomb.js @@ -0,0 +1,147 @@ +import { act } from '../byond'; +import { Box, Button, Grid, Flex, Icon } from '../components'; +import { classes } from 'common/react'; + +// This ui is so many manual overrides and !important tags +// and hand made width sets that changing pretty much anything +// is going to require a lot of tweaking it get it looking correct again +// I'm sorry, but it looks bangin +const NukeKeypad = props => { + const { state } = props; + const { config, data } = state; + const { ref } = config; + const keypadKeys = [ + ["1", "4", "7", "C"], + ["2", "5", "8", "0"], + ["3", "6", "9", "E"], + ]; + return ( + + + {keypadKeys.map(keyColumn => ( + + {keyColumn.map(key => ( +