From aaee6b039d54fb1d97aba54780f1f26b7d9c04cc Mon Sep 17 00:00:00 2001 From: mochi Date: Sun, 12 Jul 2020 11:46:42 +0200 Subject: [PATCH] First polish pass --- code/game/dna/dna_modifier.dm | 26 +- code/game/machinery/Sleeper.dm | 3 +- code/game/machinery/computer/Operating.dm | 1 - code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/medical.dm | 306 +++++++------ code/game/machinery/cryo.dm | 15 +- .../chemistry/machinery/chem_dispenser.dm | 77 ++-- .../chemistry/machinery/chem_heater.dm | 21 +- .../chemistry/machinery/chem_master.dm | 6 +- code/modules/tgui/modal.dm | 22 +- tgui/packages/tgui/interfaces/BodyScanner.js | 23 +- .../packages/tgui/interfaces/ChemDispenser.js | 282 ++++++------ tgui/packages/tgui/interfaces/ChemHeater.js | 154 ++++--- tgui/packages/tgui/interfaces/ChemMaster.js | 8 +- .../tgui/interfaces/CloningConsole.js | 10 +- tgui/packages/tgui/interfaces/Cryo.js | 87 ++-- tgui/packages/tgui/interfaces/DNAModifier.js | 4 +- tgui/packages/tgui/interfaces/MedData.js | 423 ------------------ .../tgui/interfaces/MedicalRecords.js | 420 +++++++++++++++++ tgui/packages/tgui/interfaces/Sleeper.js | 66 +-- .../tgui/interfaces/common/BeakerContents.js | 20 + .../tgui/interfaces/common/ComplexModal.js | 32 +- .../tgui/interfaces/common/LoginInfo.js | 34 ++ .../tgui/interfaces/common/LoginScreen.js | 54 +++ .../tgui/interfaces/common/QuestionModal.js | 37 -- .../tgui/interfaces/common/TemporaryNotice.js | 36 ++ tgui/packages/tgui/public/tgui.bundle.js | 4 +- 27 files changed, 1188 insertions(+), 985 deletions(-) delete mode 100644 tgui/packages/tgui/interfaces/MedData.js create mode 100644 tgui/packages/tgui/interfaces/MedicalRecords.js create mode 100644 tgui/packages/tgui/interfaces/common/LoginInfo.js create mode 100644 tgui/packages/tgui/interfaces/common/LoginScreen.js delete mode 100644 tgui/packages/tgui/interfaces/common/QuestionModal.js create mode 100644 tgui/packages/tgui/interfaces/common/TemporaryNotice.js diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 2e7f360830c..630bae796e1 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -7,6 +7,11 @@ #define NEGATE_MUTATION_THRESHOLD 30 // Occupants with over ## percent radiation threshold will not gain mutations +#define PAGE_UI "ui" +#define PAGE_SE "se" +#define PAGE_BUFFER "buffer" +#define PAGE_REJUVENATORS "rejuvenators" + //list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0), /datum/dna2/record var/datum/dna/dna = null @@ -335,7 +340,7 @@ var/injector_ready = FALSE //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete var/obj/machinery/dna_scannernew/connected = null var/obj/item/disk/data/disk = null - var/selected_menu_key = "ui" + var/selected_menu_key = PAGE_UI anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 10 @@ -410,7 +415,6 @@ if(!ui) ui = new(user, src, ui_key, "DNAModifier", name, 660, 700, master_ui, state) ui.open() - ui.set_autoupdate(TRUE) /obj/machinery/computer/scan_consolenew/tgui_data(mob/user) var/data[0] @@ -510,7 +514,7 @@ switch(action) if("selectMenuKey") var/key = params["key"] - if(!(key in list("ui", "se", "buffer", "rejuvenators"))) + if(!(key in list(PAGE_UI, PAGE_SE, PAGE_BUFFER, PAGE_REJUVENATORS))) return selected_menu_key = key if("toggleLock") @@ -780,14 +784,12 @@ * * copy_buffer - Whether the injector should copy the buffer contents */ /obj/machinery/computer/scan_consolenew/proc/create_injector(buffer_id, copy_buffer = FALSE) - set waitfor = FALSE if(buffer_id < 1 || buffer_id > length(buffers)) return // Cooldown injector_ready = FALSE - spawn(30 SECONDS) - injector_ready = TRUE + addtimer(CALLBACK(src, .proc/injector_cooldown_finish), 30 SECONDS) // Create it var/datum/dna2/record/buf = buffers[buffer_id] @@ -800,6 +802,12 @@ I.damage_coeff = connected.damage_coeff return I +/** + * Called when the injector creation cooldown finishes + */ +/obj/machinery/computer/scan_consolenew/proc/injector_cooldown_finish() + injector_ready = TRUE + /** * Called in tgui_act() to process modal actions * @@ -834,4 +842,10 @@ else return FALSE + +#undef PAGE_UI +#undef PAGE_SE +#undef PAGE_BUFFER +#undef PAGE_REJUVENATORS + /////////////////////////// DNA MACHINES diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 85c00ae6585..e9d1ca693e4 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -140,9 +140,8 @@ /obj/machinery/sleeper/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "Sleeper", "Sleeper", 550, 770) + ui = new(user, src, ui_key, "Sleeper", "Sleeper", 550, 775) ui.open() - ui.set_autoupdate(TRUE) /obj/machinery/sleeper/tgui_data(mob/user) var/data[0] diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index f87c48b326f..31d98826ac3 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -58,7 +58,6 @@ if(!ui) ui = new(user, src, ui_key, "OperatingComputer", "Patient Monitor", 650, 455, master_ui, state) ui.open() - ui.set_autoupdate(TRUE) /obj/machinery/computer/operating/tgui_data(mob/user) var/data[0] diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 089787c2e9f..db39c40501c 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -256,7 +256,7 @@ realname = sanitize(active_record.dna.real_name), unidentity = active_record.dna.uni_identity, strucenzymes = active_record.dna.struc_enzymes, - ); + ) tgui_modal_message(src, action, "", null, payload) else active_record = null diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 5e2f5006c4a..7ad38e59993 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -4,8 +4,8 @@ #define MED_DATA_V_DATA 5 // Virus database #define MED_DATA_MEDBOT 6 // Medbot monitor -#define FIELD(N, V, Q, QC, E) list(field = N, value = V, question = Q, question_choices = QC, edit = E) -#define MED_FIELD(N, V, Q, QC, E, LB) list(field = N, value = V, question = Q, question_choices = QC, edit = E, line_break = LB) +#define FIELD(N, V, E) list(field = N, value = V, edit = E) +#define MED_FIELD(N, V, E, LB) list(field = N, value = V, edit = E, line_break = LB) /obj/machinery/computer/med_data //TODO:SANITY name = "medical records console" @@ -22,10 +22,43 @@ var/datum/data/record/active2 = null var/list/temp = null var/printing = null - var/list/questionmodal = null + // The below are used to make modal generation more convenient + var/static/list/field_edit_questions + var/static/list/field_edit_choices light_color = LIGHT_COLOR_DARKBLUE +/obj/machinery/computer/med_data/Initialize() + ..() + field_edit_questions = list( + // General + "sex" = "Please select new sex:", + "age" = "Please input new age:", + "fingerprint" = "Please input new fingerprint hash:", + "p_stat" = "Please select new physical status:", + "m_stat" = "Please select new mental status:", + // Medical + "blood_type" = "Please select new blood type:", + "b_dna" = "Please input new DNA:", + "mi_dis" = "Please input new minor disabilities:", + "mi_dis_d" = "Please summarize minor disabilities:", + "ma_dis" = "Please input new major disabilities:", + "ma_dis_d" = "Please summarize major disabilities:", + "alg" = "Please input new allergies:", + "alg_d" = "Please summarize allergies:", + "cdi" = "Please input new current diseases:", + "cdi_d" = "Please summarize current diseases:", + "notes" = "Please input new important notes:", + ) + field_edit_choices = list( + // General + "sex" = list("Male", "Female"), + "p_stat" = list("*Deceased*", "*SSD*", "Active", "Physically Unfit", "Disabled"), + "m_stat" = list("*Insane*", "*Unstable*", "*Watch*", "Stable"), + // Medical + "blood_type" = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"), + ) + /obj/machinery/computer/med_data/Destroy() active1 = null active2 = null @@ -52,9 +85,9 @@ /obj/machinery/computer/med_data/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "MedData", name, 800, 380, master_ui, state) + ui = new(user, src, ui_key, "MedicalRecords", "Medical Records", 800, 380, master_ui, state) ui.open() - ui.set_autoupdate(TRUE) + ui.set_autoupdate(FALSE) /obj/machinery/computer/med_data/tgui_data(mob/user) var/data[0] @@ -64,7 +97,6 @@ data["screen"] = screen data["printing"] = printing if(authenticated) - data["questionmodal"] = questionmodal switch(screen) if(MED_DATA_R_LIST) if(!isnull(GLOB.data_core.general)) @@ -78,26 +110,17 @@ if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)) var/list/fields = list() general["fields"] = fields - fields[++fields.len] = FIELD("Name", active1.fields["name"], null, null, null) - fields[++fields.len] = FIELD("ID", active1.fields["id"], null, null, null) - fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "Please input new sex:", list("Male", "Female"), "sex") - fields[++fields.len] = FIELD("Age", active1.fields["age"], "Please input new age:", null, "age") - fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "Please input new fingerprint hash:", null, "fingerprint") - fields[++fields.len] = FIELD("Physical Status", active1.fields["p_stat"], "Please input new physical status:", list("*Deceased*", "*SSD*", "Active", "Physically Unfit", "Disabled"), "p_stat") - fields[++fields.len] = FIELD("Mental Status", active1.fields["m_stat"], "Please input new mental status:", list("*Insane*", "*Unstable*", "*Watch*", "Stable"), "m_stat") + fields[++fields.len] = FIELD("Name", active1.fields["name"], null) + fields[++fields.len] = FIELD("ID", active1.fields["id"], null) + fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex") + fields[++fields.len] = FIELD("Age", active1.fields["age"], "age") + fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint") + fields[++fields.len] = FIELD("Physical Status", active1.fields["p_stat"], "p_stat") + fields[++fields.len] = FIELD("Mental Status", active1.fields["m_stat"], "m_stat") var/list/photos = list() general["photos"] = photos - // Disabled for now - ByondGui need improving - // var/icon/photoSouth = icon(active1.fields["photo-south-icon"]) - // var/icon/photoWest = icon(active1.fields["photo-west-icon"]) - // photoSouth.Scale(128, 128) - // photoWest.Scale(128, 128) - // photoSouth = fcopy_rsc(photoSouth) - // photoWest = fcopy_rsc(photoWest) - // user << browse_rsc(photoSouth); - // user << browse_rsc(photoWest); - // photos[++photos.len] = list("photo" = "\ref[photoSouth]") - // photos[++photos.len] = list("photo" = "\ref[photoWest]") + photos[++photos.len] = active1.fields["photo-south"] + photos[++photos.len] = active1.fields["photo-west"] general["has_photos"] = (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0) general["empty"] = 0 else @@ -108,17 +131,17 @@ if(istype(active2, /datum/data/record) && GLOB.data_core.medical.Find(active2)) var/list/fields = list() medical["fields"] = fields - fields[++fields.len] = MED_FIELD("Blood Type", active2.fields["blood_type"], "Please input new blood type:", list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"), "blood_type", FALSE) - fields[++fields.len] = MED_FIELD("DNA", active2.fields["b_dna"], "Please input new blood type:", null, "b_dna", TRUE) - fields[++fields.len] = MED_FIELD("Minor Disabilities", active2.fields["mi_dis"], "Please input new minor disabilities:", null, "mi_dis", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["mi_dis_d"], "Please summarize minor disabilities:", null, "mi_dis_d", TRUE) - fields[++fields.len] = MED_FIELD("Major Disabilities", active2.fields["ma_dis"], "Please input new major disabilities:", null, "ma_dis", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["ma_dis_d"], "Please summarize major disabilities:", null, "ma_dis_d", TRUE) - fields[++fields.len] = MED_FIELD("Allergies", active2.fields["alg"], "Please input new allergies:", null, "alg", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["alg_d"], "Please summarize allergies:", null, "alg_d", TRUE) - fields[++fields.len] = MED_FIELD("Current Diseases", active2.fields["cdi"], "Please input new current diseases:", null, "cdi", FALSE) - fields[++fields.len] = MED_FIELD("Details", active2.fields["cdi_d"], "Please summarize current diseases:", null, "cdi_d", TRUE) - fields[++fields.len] = MED_FIELD("Important Notes", active2.fields["notes"], "Please input new important notes:", null, "notes", FALSE) + fields[++fields.len] = MED_FIELD("Blood Type", active2.fields["blood_type"], "blood_type", FALSE) + fields[++fields.len] = MED_FIELD("DNA", active2.fields["b_dna"], "b_dna", TRUE) + fields[++fields.len] = MED_FIELD("Minor Disabilities", active2.fields["mi_dis"], "mi_dis", FALSE) + fields[++fields.len] = MED_FIELD("Details", active2.fields["mi_dis_d"], "mi_dis_d", TRUE) + fields[++fields.len] = MED_FIELD("Major Disabilities", active2.fields["ma_dis"], "ma_dis", FALSE) + fields[++fields.len] = MED_FIELD("Details", active2.fields["ma_dis_d"], "ma_dis_d", TRUE) + fields[++fields.len] = MED_FIELD("Allergies", active2.fields["alg"], "alg", FALSE) + fields[++fields.len] = MED_FIELD("Details", active2.fields["alg_d"], "alg_d", TRUE) + fields[++fields.len] = MED_FIELD("Current Diseases", active2.fields["cdi"], "cdi", FALSE) + fields[++fields.len] = MED_FIELD("Details", active2.fields["cdi_d"], "cdi_d", TRUE) + fields[++fields.len] = MED_FIELD("Important Notes", active2.fields["notes"], "notes", TRUE) if(!active2.fields["comments"] || !islist(active2.fields["comments"])) active2.fields["comments"] = list() medical["comments"] = active2.fields["comments"] @@ -155,6 +178,8 @@ else medbot["use_beaker"] = 0 data["medbots"] += list(medbot) + + data["modal"] = tgui_modal_data(src) return data /obj/machinery/computer/med_data/tgui_act(action, params) @@ -166,10 +191,13 @@ if(!GLOB.data_core.medical.Find(active2)) active2 = null + . = TRUE + if(tgui_act_modal(action, params)) + return + switch(action) if("cleartemp") temp = null - . = TRUE if("scan") if(scan) scan.forceMove(loc) @@ -182,7 +210,6 @@ usr.drop_item() I.forceMove(src) scan = I - . = TRUE if("login") if(isAI(usr)) authenticated = usr.name @@ -195,17 +222,18 @@ if(check_access(scan)) authenticated = scan.registered_name rank = scan.assignment - if(authenticated) active1 = null active2 = null screen = MED_DATA_R_LIST - . = TRUE + else + . = FALSE if(.) return if(authenticated) + . = TRUE switch(action) if("logout") if(scan) @@ -217,40 +245,35 @@ screen = null active1 = null active2 = null - . = TRUE if("screen") - screen = clamp(text2num(params["screen"]) || MED_DATA_R_LIST, MED_DATA_R_LIST, MED_DATA_MEDBOT) + screen = clamp(text2num(params["screen"]) || 0, MED_DATA_R_LIST, MED_DATA_MEDBOT) active1 = null active2 = null - . = TRUE if("vir") - . = TRUE var/type = text2path(params["vir"] || "") if(!ispath(type, /datum/disease)) return var/datum/disease/D = new type(0) - set_temp(list( + var/list/payload = list( name = D.name, max_stages = D.max_stages, spread_text = D.spread_text, cure = D.cure_text || "None", desc = D.desc, severity = D.severity - ), "virus") + ); + tgui_modal_message(src, "virus", "", null, payload) qdel(D) if("del_all") - . = TRUE for(var/datum/data/record/R in GLOB.data_core.medical) qdel(R) set_temp("All medical records deleted.") if("del_r") - . = TRUE if(active2) set_temp("Medical record deleted.") qdel(active2) if("d_rec") - . = TRUE var/datum/data/record/general_record = locate(params["d_rec"] || "") if(!GLOB.data_core.general.Find(general_record)) set_temp("Record not found.", "danger") @@ -285,7 +308,6 @@ GLOB.data_core.medical += R active2 = R screen = MED_DATA_RECORD - . = TRUE set_temp("Medical record created.", "success") if("del_c") var/index = text2num(params["del_c"] || "") @@ -296,9 +318,7 @@ index = clamp(index, 1, length(comments)) if(comments[index]) comments.Cut(index, index + 1) - . = TRUE if("search") - . = TRUE active1 = null active2 = null var/t1 = lowertext(params["t1"] || "") @@ -322,99 +342,111 @@ printing = TRUE playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE) SStgui.update_uis(src) - sleep(5 SECONDS) - var/obj/item/paper/P = new /obj/item/paper(loc) - P.info = "
Medical Record

" - if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)) - P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]] -
\nSex: [active1.fields["sex"]] -
\nAge: [active1.fields["age"]] -
\nFingerprint: [active1.fields["fingerprint"]] -
\nPhysical Status: [active1.fields["p_stat"]] -
\nMental Status: [active1.fields["m_stat"]]
"} - else - P.info += "General Record Lost!
" - if(istype(active2, /datum/data/record) && GLOB.data_core.medical.Find(active2)) - P.info += {"
\n
Medical Data
-
\nBlood Type: [active2.fields["blood_type"]] -
\nDNA: [active2.fields["b_dna"]]
\n -
\nMinor Disabilities: [active2.fields["mi_dis"]] -
\nDetails: [active2.fields["mi_dis_d"]]
\n -
\nMajor Disabilities: [active2.fields["ma_dis"]] -
\nDetails: [active2.fields["ma_dis_d"]]
\n -
\nAllergies: [active2.fields["alg"]] -
\nDetails: [active2.fields["alg_d"]]
\n -
\nCurrent Diseases: [active2.fields["cdi"]] (per disease info placed in log/comment section) -
\nDetails: [active2.fields["cdi_d"]]
\n -
\nImportant Notes: -
\n\t[active2.fields["notes"]]
\n -
\n -
Comments/Log

"} - for(var/c in active2.fields["comments"]) - P.info += "[c]
" - else - P.info += "Medical Record Lost!
" - P.info += "" - P.name = "paper- 'Medical Record: [active1.fields["name"]]'" - printing = FALSE - . = TRUE + addtimer(CALLBACK(src, .proc/print_finish), 5 SECONDS) + else + return FALSE - // Modal handling - if(action == "questionmodal") - questionmodal = length(params["id"]) && list( - id = params["id"], - question = params["question"], - choices = params["choices"], - value = params["value"] - ) - return TRUE - else if((action == "questionmodal_answer") && questionmodal) - . = TRUE - var/id = questionmodal["id"] +/** + * Called in tgui_act() to process modal actions + * + * Arguments: + * * action - The action passed by tgui + * * params - The params passed by tgui + */ +/obj/machinery/computer/med_data/proc/tgui_act_modal(action, params) + . = TRUE + var/id = params["id"] // The modal's ID + var/list/arguments = istext(params["arguments"]) ? json_decode(params["arguments"]) : params["arguments"] + switch(tgui_modal_act(src, action, params)) + if(TGUI_MODAL_OPEN) + switch(id) + if("edit") + var/field = arguments["field"] + if(!length(field) || !field_edit_questions[field]) + return + var/question = field_edit_questions[field] + var/choices = field_edit_choices[field] + if(length(choices)) + tgui_modal_choice(src, id, question, arguments = arguments, value = arguments["value"], choices = choices) + else + tgui_modal_input(src, id, question, arguments = arguments, value = arguments["value"]) + if("add_c") + tgui_modal_input(src, id, "Please enter your message:") + else + return FALSE + if(TGUI_MODAL_ANSWER) var/answer = params["answer"] - var/general_data_exist = istype(active1, /datum/data/record) - var/medical_data_exist = istype(active2, /datum/data/record) + switch(id) + if("edit") + var/field = arguments["field"] + if(!length(field) || !field_edit_questions[field]) + return + var/list/choices = field_edit_choices[field] + if(length(choices) && !(answer in choices)) + return - if(general_data_exist) - switch(id) - if("sex") - active1.fields["sex"] = (answer in list("Male", "Female")) ? answer : active1.fields["sex"] - if("age") + if(field == "age") var/new_age = text2num(answer) - if(!new_age || new_age < AGE_MIN || new_age > AGE_MAX) + if(new_age < AGE_MIN || new_age > AGE_MAX) set_temp("Invalid age. It must be between [AGE_MIN] and [AGE_MAX].", "danger") - questionmodal = null return - active1.fields["age"] = new_age - if("p_stat") - active1.fields["p_stat"] = (answer in list("*Deceased*", "*SSD*", "Active", "Physically Unfit", "Disabled")) ? answer : active1.fields["p_stat"] - if("m_stat") - active1.fields["m_stat"] = (answer in list("*Insane*", "*Unstable*", "*Watch*", "Stable")) ? answer : active1.fields["m_stat"] - if("fingerprint") - active1.fields["fingerprint"] = answer - if(medical_data_exist) - switch(id) - if("blood_type") - active2.fields["blood_type"] = (answer in list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-")) ? answer : active2.fields["blood_type"] - if("add_c") - if(length(answer)) - active2.fields["comments"] += list(list( - header = "Made by [authenticated] ([rank]) on [GLOB.current_date_string] [station_time_timestamp()]", - text = answer - )) - else // Generic field, no need a specific if for 'em - if(active2.fields[id]) - active2.fields[id] = answer - questionmodal = null - return - else if(action == "questionmodal_close") - questionmodal = null - return TRUE + answer = new_age - // If we're doing an action other than start a question modal, delete the modal - if(questionmodal) - questionmodal = null - return TRUE + if(istype(active2) && (field in active2.fields)) + active2.fields[field] = answer + else if(istype(active1) && (field in active1.fields)) + active1.fields[field] = answer + if("add_c") + if(!length(answer) || !istype(active2) || !length(authenticated)) + return + active2.fields["comments"] += list(list( + header = "Made by [authenticated] ([rank]) on [GLOB.current_date_string] [station_time_timestamp()]", + text = answer + )) + else + return FALSE + else + return FALSE + +/** + * Called when the print timer finishes + */ +/obj/machinery/computer/med_data/proc/print_finish() + var/obj/item/paper/P = new /obj/item/paper(loc) + P.info = "
Medical Record

" + if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)) + P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]] +
\nSex: [active1.fields["sex"]] +
\nAge: [active1.fields["age"]] +
\nFingerprint: [active1.fields["fingerprint"]] +
\nPhysical Status: [active1.fields["p_stat"]] +
\nMental Status: [active1.fields["m_stat"]]
"} + else + P.info += "General Record Lost!
" + if(istype(active2, /datum/data/record) && GLOB.data_core.medical.Find(active2)) + P.info += {"
\n
Medical Data
+
\nBlood Type: [active2.fields["blood_type"]] +
\nDNA: [active2.fields["b_dna"]]
\n +
\nMinor Disabilities: [active2.fields["mi_dis"]] +
\nDetails: [active2.fields["mi_dis_d"]]
\n +
\nMajor Disabilities: [active2.fields["ma_dis"]] +
\nDetails: [active2.fields["ma_dis_d"]]
\n +
\nAllergies: [active2.fields["alg"]] +
\nDetails: [active2.fields["alg_d"]]
\n +
\nCurrent Diseases: [active2.fields["cdi"]] (per disease info placed in log/comment section) +
\nDetails: [active2.fields["cdi_d"]]
\n +
\nImportant Notes: +
\n\t[active2.fields["notes"]]
\n +
\n +
Comments/Log

"} + for(var/c in active2.fields["comments"]) + P.info += "[c]
" + else + P.info += "Medical Record Lost!
" + P.info += "" + P.name = "paper - 'Medical Record: [active1.fields["name"]]'" + printing = FALSE + SStgui.update_uis(src) /** * Sets a temporary message to display to the user diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index f27054d5790..ff46f079cc5 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -200,7 +200,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "Cryo", "Cryo Cell Control System", 520, 470) + ui = new(user, src, ui_key, "Cryo", "Cryo Cell", 520, 470) ui.open() /obj/machinery/atmospherics/unary/cryo_cell/tgui_data(mob/user) @@ -246,6 +246,7 @@ if(..() || usr == occupant) return + . = TRUE switch(action) if("switchOn") on = TRUE @@ -262,19 +263,19 @@ if("auto_eject_dead_off") auto_eject_prefs &= ~AUTO_EJECT_DEAD if("ejectBeaker") - if(beaker) - beaker.forceMove(get_step(loc, SOUTH)) - beaker = null + if(!beaker) + return + beaker.forceMove(get_step(loc, SOUTH)) + beaker = null if("ejectOccupant") if(!occupant || isslime(usr) || ispAI(usr)) return add_attack_logs(usr, occupant, "ejected from cryo cell at [COORD(src)]", ATKLOG_ALL) go_out() else - return + return FALSE add_fingerprint(usr) - return TRUE // update UIs attached to this object /obj/machinery/atmospherics/unary/cryo_cell/attackby(var/obj/item/G, var/mob/user, params) if(istype(G, /obj/item/reagent_containers/glass)) @@ -334,7 +335,7 @@ return if(occupant) - var/image/pickle = image(occupant.icon, occupant.icon_state) + var/mutable_appearance/pickle = mutable_appearance(occupant.icon, occupant.icon_state) pickle.overlays = occupant.overlays pickle.pixel_y = 22 diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 0d6444b8c8d..6f310856970 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -153,7 +153,6 @@ /obj/machinery/chem_dispenser/tgui_data(mob/user) var/data[0] - data["hasPower"] = !(stat & NOPOWER) data["amount"] = amount data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. data["maxEnergy"] = cell.maxcharge * powerefficiency @@ -187,51 +186,49 @@ if(..()) return + . = TRUE switch(actions) if("amount") - amount = clamp(round(text2num(params["amount"]), 1), 0, 100) // round to nearest 1 and clamp to 0 - 100 - . = TRUE + amount = clamp(round(text2num(params["amount"]), 1), 0, 50) // round to nearest 1 and clamp to 0 - 50 if("dispense") if(!is_operational() || QDELETED(cell)) return - if(beaker && dispensable_reagents.Find(params["reagent"])) - var/datum/reagents/R = beaker.reagents - var/free = R.maximum_volume - R.total_volume - var/actual = min(amount, (cell.charge * powerefficiency) * 10, free) - - if(!cell.use(actual / powerefficiency)) - atom_say("Not enough energy to complete operation!") - return - - R.add_reagent(params["reagent"], actual) - overlays.Cut() - if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. - icon_beaker.pixel_x = rand(-10, 5) - overlays += icon_beaker - . = TRUE + if(!beaker || !dispensable_reagents.Find(params["reagent"])) + return + var/datum/reagents/R = beaker.reagents + var/free = R.maximum_volume - R.total_volume + var/actual = min(amount, (cell.charge * powerefficiency) * 10, free) + if(!cell.use(actual / powerefficiency)) + atom_say("Not enough energy to complete operation!") + return + R.add_reagent(params["reagent"], actual) + overlays.Cut() + if(!icon_beaker) + icon_beaker = mutable_appearance('icons/obj/chemical.dmi', "disp_beaker") //randomize beaker overlay position. + icon_beaker.pixel_x = rand(-10, 5) + overlays += icon_beaker if("remove") - if(beaker && params["amount"]) - var/amount = text2num(params["amount"]) - if(isnum(amount) && (amount > 0)) - var/datum/reagents/R = beaker.reagents - var/id = params["reagent"] - R.remove_reagent(id, amount) - else if(isnum(amount) && (amount == -1)) //Isolate instead - var/datum/reagents/R = beaker.reagents - var/id = params["reagent"] - R.isolate_reagent(id) - . = TRUE + var/amount = text2num(params["amount"]) + if(!beaker || !amount) + return + var/datum/reagents/R = beaker.reagents + var/id = params["reagent"] + if(amount > 0) + R.remove_reagent(id, amount) + else if(amount == -1) //Isolate instead + R.isolate_reagent(id) if("ejectBeaker") - if(beaker) - beaker.forceMove(loc) - if(Adjacent(usr) && !issilicon(usr)) - usr.put_in_hands(beaker) - beaker = null - overlays.Cut() - . = TRUE - if(.) - add_fingerprint(usr) + if(!beaker) + return + beaker.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(beaker) + beaker = null + overlays.Cut() + else + return FALSE + + add_fingerprint(usr) /obj/machinery/chem_dispenser/attackby(obj/item/I, mob/user, params) if(exchange_parts(user, I)) @@ -257,7 +254,7 @@ to_chat(user, "You set [I] on the machine.") SStgui.update_uis(src) // update all UIs attached to src if(!icon_beaker) - icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position. + icon_beaker = mutable_appearance('icons/obj/chemical.dmi', "disp_beaker") //randomize beaker overlay position. icon_beaker.pixel_x = rand(-10, 5) overlays += icon_beaker return diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index e2498d2732b..2e49208f2c3 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -41,6 +41,7 @@ beaker = null icon_state = "mixer0b" on = FALSE + SStgui.update_uis(src) /obj/machinery/chem_heater/power_change() if(powered()) @@ -63,6 +64,7 @@ I.forceMove(src) to_chat(user, "You add the beaker to the machine!") icon_state = "mixer1b" + SStgui.update_uis(src) return if(exchange_parts(user, I)) @@ -100,36 +102,29 @@ if(..()) return + . = TRUE switch(action) if("toggle_on") on = !on - return TRUE if("adjust_temperature") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) - desired_temp = clamp(target, 0, 1000) + desired_temp = clamp(text2num(params["target"]), 0, 1000) if("eject_beaker") eject_beaker(usr) - return TRUE + else + return FALSE -/obj/machinery/chem_heater/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) +/obj/machinery/chem_heater/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) if(user.stat || user.restrained()) return ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "ChemHeater", name, 350, 270, master_ui, state) + ui = new(user, src, ui_key, "ChemHeater", "Chemical Heater", 350, 270, master_ui, state) ui.open() - ui.set_autoupdate(TRUE) /obj/machinery/chem_heater/tgui_data(mob/user) var/data[0] - data["hasPower"] = !(stat & NOPOWER) - data["targetTemp"] = desired_temp data["isActive"] = on data["isBeakerLoaded"] = beaker ? 1 : 0 diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index ba40098f2f6..d1ab0c3e7e7 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -181,7 +181,7 @@ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/paper/P = new /obj/item/paper(loc) - P.info = "
Chemical Analysis

" + P.info = "
Chemical Analysis

" P.info += "Time of analysis: [station_time_timestamp()]

" P.info += "Chemical name: [R.name]
" if(istype(R, /datum/reagent/blood)) @@ -395,8 +395,6 @@ tgui_modal_bento(src, id, "Please select the new style for bottles:", null, arguments, bottlesprite, bottle_styles_png) else return FALSE - if(TGUI_MODAL_DELEGATE) - // Do something after successful delegate call if(TGUI_MODAL_ANSWER) var/answer = params["answer"] switch(id) @@ -520,8 +518,6 @@ bottlesprite = new_sprite else return FALSE - if(TGUI_MODAL_CLOSE) - // else return FALSE diff --git a/code/modules/tgui/modal.dm b/code/modules/tgui/modal.dm index 3a3f1811f2c..f09f54f627c 100644 --- a/code/modules/tgui/modal.dm +++ b/code/modules/tgui/modal.dm @@ -17,7 +17,7 @@ GLOBAL_LIST(tgui_modals) * * action - The called action * * params - The params to the action */ -/proc/tgui_modal_act(datum/source = src, action = "", params) +/datum/proc/tgui_modal_act(datum/source = src, action = "", params) ASSERT(istype(source)) . = null @@ -41,7 +41,7 @@ GLOBAL_LIST(tgui_modals) * Arguments: * * source - The source datum */ -/proc/tgui_modal_data(datum/source = src) +/datum/proc/tgui_modal_data(datum/source = src) ASSERT(istype(source)) var/datum/tgui_modal/current = LAZYACCESS(GLOB.tgui_modals, source.UID()) @@ -56,7 +56,7 @@ GLOBAL_LIST(tgui_modals) * Arguments: * * source - The source datum */ -/proc/tgui_modal_clear(datum/source = src) +/datum/proc/tgui_modal_clear(datum/source = src) ASSERT(istype(source)) LAZYINITLIST(GLOB.tgui_modals) @@ -83,7 +83,7 @@ GLOBAL_LIST(tgui_modals) * * delegate - The proc to call when closed * * arguments - List of arguments passed to and from JS (mostly useful for chaining modals) */ -/proc/tgui_modal_message(datum/source = src, id, text = "Default modal message", delegate, arguments) +/datum/proc/tgui_modal_message(datum/source = src, id, text = "Default modal message", delegate, arguments) ASSERT(length(id)) var/datum/tgui_modal/modal = new(id, text, delegate, arguments) @@ -101,7 +101,7 @@ GLOBAL_LIST(tgui_modals) * * value - The default value of the input * * max_length - The maximum char length of the input */ -/proc/tgui_modal_input(datum/source = src, id, text = "Default modal message", delegate, arguments, value = "", max_length = TGUI_MODAL_INPUT_MAX_LENGTH) +/datum/proc/tgui_modal_input(datum/source = src, id, text = "Default modal message", delegate, arguments, value = "", max_length = TGUI_MODAL_INPUT_MAX_LENGTH) ASSERT(length(id)) ASSERT(max_length > 0) @@ -121,7 +121,7 @@ GLOBAL_LIST(tgui_modals) * * value - The default value of the dropdown * * choices - The list of available choices in the dropdown */ -/proc/tgui_modal_choice(datum/source = src, id, text = "Default modal message", delegate, arguments, value = "", choices) +/datum/proc/tgui_modal_choice(datum/source = src, id, text = "Default modal message", delegate, arguments, value = "", choices) ASSERT(length(id)) var/datum/tgui_modal/input/choice/modal = new(id, text, delegate, arguments, value, choices) @@ -140,7 +140,7 @@ GLOBAL_LIST(tgui_modals) * * value - The default value of the bento * * choices - The list of available choices in the bento */ -/proc/tgui_modal_bento(datum/source = src, id, text = "Default modal message", delegate, arguments, value, choices) +/datum/proc/tgui_modal_bento(datum/source = src, id, text = "Default modal message", delegate, arguments, value, choices) ASSERT(length(id)) var/datum/tgui_modal/input/bento/modal = new(id, text, delegate, arguments, value, choices) @@ -159,7 +159,7 @@ GLOBAL_LIST(tgui_modals) * * yes_text - The text to show in the "Yes" button * * no_text - The text to show in the "No" button */ -/proc/tgui_modal_boolean(datum/source = src, id, text = "Default modal message", delegate, delegate_no, arguments, yes_text = "Yes", no_text = "No") +/datum/proc/tgui_modal_boolean(datum/source = src, id, text = "Default modal message", delegate, delegate_no, arguments, yes_text = "Yes", no_text = "No") ASSERT(length(id)) var/datum/tgui_modal/boolean/modal = new(id, text, delegate, delegate_no, arguments, yes_text, no_text) @@ -174,7 +174,7 @@ GLOBAL_LIST(tgui_modals) * * replace_previous - Whether any modal currently assigned to source should be replaced * * instant_update - Whether the changes should reflect immediately */ -/proc/tgui_modal_new(datum/source = src, datum/tgui_modal/modal = null, replace_previous = TRUE, instant_update = TRUE) +/datum/proc/tgui_modal_new(datum/source = src, datum/tgui_modal/modal = null, replace_previous = TRUE, instant_update = TRUE) ASSERT(istype(source)) ASSERT(istype(modal)) @@ -198,7 +198,7 @@ GLOBAL_LIST(tgui_modals) * * id - The ID of the modal * * answer - The provided answer */ -/proc/tgui_modal_answer(datum/source = src, id, answer = "") +/datum/proc/tgui_modal_answer(datum/source = src, id, answer = "") ASSERT(istype(source)) var/datum/tgui_modal/current = LAZYACCESS(GLOB.tgui_modals, source.UID()) @@ -216,7 +216,7 @@ GLOBAL_LIST(tgui_modals) * * source - The source datum * * answer - The provided answer */ -/proc/tgui_modal_preprocess_answer(datum/source = src, answer = "") +/datum/proc/tgui_modal_preprocess_answer(datum/source = src, answer = "") ASSERT(istype(source)) var/datum/tgui_modal/current = LAZYACCESS(GLOB.tgui_modals, source.UID()) diff --git a/tgui/packages/tgui/interfaces/BodyScanner.js b/tgui/packages/tgui/interfaces/BodyScanner.js index f2ee1a93233..c0cb08bd0f6 100644 --- a/tgui/packages/tgui/interfaces/BodyScanner.js +++ b/tgui/packages/tgui/interfaces/BodyScanner.js @@ -1,9 +1,8 @@ -import { round, scale, toFixed } from 'common/math'; +import { round } from 'common/math'; import { Fragment } from 'inferno'; import { useBackend } from "../backend"; -import { Window } from "../layouts"; import { AnimatedNumber, Box, Button, Flex, Icon, LabeledList, ProgressBar, Section, Table, Tooltip } from "../components"; -import { LabeledListItem } from '../components/LabeledList'; +import { Window } from "../layouts"; const stats = [ ['good', 'Alive'], @@ -140,8 +139,8 @@ const BodyScannerMainOccupant = (props, context) => { { °C,  °F @@ -253,7 +252,7 @@ const BodyScannerMainDamageBar = props => { mt="0.5rem" mb={!!props.marginBottom && "0.5rem"} ranges={damageRange}> - {round(props.value)} + {round(props.value, 0)} ); }; @@ -299,7 +298,7 @@ const BodyScannerMainOrgansExternal = props => { {!!o.bruteLoss && ( - {round(o.bruteLoss)}  + {round(o.bruteLoss, 0)}  { {!!o.fireLoss && ( - {round(o.fireLoss)} + {round(o.fireLoss, 0)} { )} - {round(o.totalLoss)} + {round(o.totalLoss, 0)} @@ -393,7 +392,7 @@ const BodyScannerMainOrgansInternal = props => { value={o.damage / 100} mt={i > 0 && "0.5rem"} ranges={damageRange}> - {round(o.damage)} + {round(o.damage, 0)} { + return ( + + + + + + + + ); +}; + +const ChemDispenserSettings = (properties, context) => { const { act, data } = useBackend(context); const { - hasPower, amount, energy, maxEnergy, - isBeakerLoaded, - beakerCurrentVolume, - beakerMaxVolume, - beakerContents = [], + } = data; + return ( +
+ + + + {energy} / {maxEnergy} Units + + + + + {dispenseAmounts.map((a, i) => ( + +
+ ); +}; + +const ChemDispenserChemicals = (properties, context) => { + const { act, data } = useBackend(context); + const { chemicals = [], } = data; const flexFillers = []; @@ -26,128 +75,99 @@ export const ChemDispenser = (props, context) => { flexFillers.push(true); } return ( - - -
- - - - {energy} / {maxEnergy} Units - - - - - {dispenseAmounts.map((a, i) => ( - -
- -
- - {chemicals.map((c, i) => ( - -
- -
- {!!isBeakerLoaded && ( - - {beakerCurrentVolume} / {beakerMaxVolume} units - - )} -
-
-
+
+ + {chemicals.map((c, i) => ( + +
+ ); +}; + +const ChemDispenserBeaker = (properties, context) => { + const { act, data } = useBackend(context); + const { + isBeakerLoaded, + beakerCurrentVolume, + beakerMaxVolume, + beakerContents = [], + } = data; + return ( +
+ {!!isBeakerLoaded && ( + + {beakerCurrentVolume} / {beakerMaxVolume} units + + )} +
); }; diff --git a/tgui/packages/tgui/interfaces/ChemHeater.js b/tgui/packages/tgui/interfaces/ChemHeater.js index 0018325eeda..44fe57d95df 100644 --- a/tgui/packages/tgui/interfaces/ChemHeater.js +++ b/tgui/packages/tgui/interfaces/ChemHeater.js @@ -1,83 +1,93 @@ import { round, toFixed } from 'common/math'; -import { Fragment } from 'inferno'; import { useBackend } from "../backend"; -import { Window } from "../layouts"; -import { AnimatedNumber, Box, Button, LabeledList, NumberInput, Section } from "../components"; +import { AnimatedNumber, Box, Button, Knob, LabeledList, Section } from "../components"; import { BeakerContents } from '../interfaces/common/BeakerContents'; +import { Window } from "../layouts"; -export const ChemHeater = (props, context) => { - const { act, data } = useBackend(context); - const { - hasPower, - targetTemp, - isActive, - isBeakerLoaded, - currentTemp, - beakerCurrentVolume, - beakerMaxVolume, - beakerContents = [], - } = data; +export const ChemHeater = (_props, _context) => { return ( -
act("toggle_on")} - /> - )}> - - - act('adjust_temperature', { - target: value, - })} - /> - - - - {isBeakerLoaded && ( - toFixed(value) + " K"} /> - ) || '—'} - - - -
-
- - {beakerCurrentVolume} / {beakerMaxVolume} units - -
+ +
); }; + +const ChemHeaterSettings = (_properties, context) => { + const { act, data } = useBackend(context); + const { + targetTemp, + isActive, + currentTemp, + isBeakerLoaded, + } = data; + return ( +
act("toggle_on")} /> + )}> + + + act('adjust_temperature', { + target: value, + })} + /> + + + {isBeakerLoaded && ( + toFixed(value) + " K"} /> + ) || '—'} + + +
+ ); +}; + +const ChemHeaterBeaker = (_properties, context) => { + const { act, data } = useBackend(context); + const { + isBeakerLoaded, + beakerCurrentVolume, + beakerMaxVolume, + beakerContents, + } = data; + return ( +
+ + {beakerCurrentVolume} / {beakerMaxVolume} units + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ChemMaster.js b/tgui/packages/tgui/interfaces/ChemMaster.js index 8325969a7c7..b16f7247cd4 100644 --- a/tgui/packages/tgui/interfaces/ChemMaster.js +++ b/tgui/packages/tgui/interfaces/ChemMaster.js @@ -1,10 +1,9 @@ -import { round, toFixed } from 'common/math'; import { Fragment } from 'inferno'; import { useBackend } from "../backend"; +import { Box, Button, Flex, Icon, LabeledList, Section } from "../components"; import { Window } from "../layouts"; -import { Box, Button, Flex, Icon, Section, LabeledList } from "../components"; import { BeakerContents } from './common/BeakerContents'; -import { modalOpen, modalRegisterBodyOverride, ComplexModal } from './common/ComplexModal'; +import { ComplexModal, modalOpen, modalRegisterBodyOverride } from './common/ComplexModal'; const transferAmounts = [1, 5, 10]; const bottleStyles = [ @@ -72,7 +71,6 @@ export const ChemMaster = (props, context) => { buffer_reagents = [], mode, } = data; - modalRegisterBodyOverride('analyze', analyzeModalBodyOverride); return ( @@ -404,3 +402,5 @@ const ChemMasterCustomization = (props, context) => { ); }; + +modalRegisterBodyOverride('analyze', analyzeModalBodyOverride); diff --git a/tgui/packages/tgui/interfaces/CloningConsole.js b/tgui/packages/tgui/interfaces/CloningConsole.js index 9d53b32dc6f..4b23f36cfc5 100644 --- a/tgui/packages/tgui/interfaces/CloningConsole.js +++ b/tgui/packages/tgui/interfaces/CloningConsole.js @@ -1,10 +1,10 @@ +import { round } from 'common/math'; import { Fragment } from 'inferno'; import { useBackend } from "../backend"; -import { Window } from "../layouts"; -import { Box, Button, Flex, Icon, LabeledList, NoticeBox, Section, Tabs, ProgressBar } from "../components"; -import { ComplexModal, modalRegisterBodyOverride } from '../interfaces/common/ComplexModal'; +import { Box, Button, Flex, Icon, LabeledList, NoticeBox, ProgressBar, Section, Tabs } from "../components"; import { COLORS } from '../constants'; -import { round } from 'common/math'; +import { ComplexModal, modalRegisterBodyOverride } from '../interfaces/common/ComplexModal'; +import { Window } from "../layouts"; const viewRecordModalBodyOverride = (modal, context) => { const { act, data } = useBackend(context); @@ -264,7 +264,7 @@ const CloningConsoleMain = (props, context) => { }} mt="0.5rem"> - {round(pod.progress) + "%"} + {round(pod.progress, 0) + "%"} ); diff --git a/tgui/packages/tgui/interfaces/Cryo.js b/tgui/packages/tgui/interfaces/Cryo.js index 8895daff76a..43751093a22 100644 --- a/tgui/packages/tgui/interfaces/Cryo.js +++ b/tgui/packages/tgui/interfaces/Cryo.js @@ -1,12 +1,11 @@ -import { round, toFixed } from 'common/math'; import { Fragment } from 'inferno'; import { useBackend } from "../backend"; +import { AnimatedNumber, Box, Button, Flex, Icon, LabeledList, ProgressBar, Section } from "../components"; import { Window } from "../layouts"; -import { AnimatedNumber, Box, Button, LabeledList, ProgressBar, Section } from "../components"; const damageTypes = [ { - label: "Respiratory", + label: "Resp.", type: "oxyLoss", }, { @@ -64,45 +63,57 @@ const CryoContent = (props, context) => { Eject )}> - - - {occupant.name || 'No Occupant'} - - {!!hasOccupant && ( - - - {statNames[occupant.stat][1]} - - + {hasOccupant ? ( + + + {occupant.name || "Unknown"} + + + 0 ? 'good' : 'average'}> - {' K'} - - + value={Math.round(occupant.health)} /> + + + + {statNames[occupant.stat][1]} + + + + {' K'} + + + {(damageTypes.map(damageType => ( + 0 ? 'good' : 'average'}> + value={occupant[damageType.type]/100} + ranges={{ bad: [0.01, Infinity] }}> + value={Math.round(occupant[damageType.type])} /> - {(damageTypes.map(damageType => ( - - - - - - )))} - - )} - + )))} + + ) : ( + + +
+ No occupant detected. +
+
+ )}
{ +
- -
- ); - } else { - let body; - let questionModal = !!questionmodal && ( - - ); - let tempNotice, tempModal; - if (temp) { - const tempProp = { [temp.style]: true }; - if (temp.style === "virus") { - tempModal = ( - -
- - - {temp.text.max_stages} - - - {temp.text.spread_text} Transmission - - - {temp.text.cure} - - - {temp.text.desc} - - - {temp.text.severity} - - -
-
- ); - } else { - tempNotice = ( - - - {temp.text} - -