diff --git a/code/controllers/subsystems/tgui.dm b/code/controllers/subsystems/tgui.dm index 91533a7783..e94830a5f0 100644 --- a/code/controllers/subsystems/tgui.dm +++ b/code/controllers/subsystems/tgui.dm @@ -255,13 +255,13 @@ SUBSYSTEM_DEF(tgui) * * return int The number of UIs closed. **/ -/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object) +/datum/controller/subsystem/tgui/proc/close_user_uis(mob/user, datum/src_object, logout = FALSE) var/count = 0 if(length(user?.tgui_open_uis) == 0) return count for(var/datum/tgui/ui in user.tgui_open_uis) if(isnull(src_object) || ui.src_object == src_object) - ui.close() + ui.close(logout = logout) count++ return count @@ -315,7 +315,7 @@ SUBSYSTEM_DEF(tgui) * return int The number of UIs closed. **/ /datum/controller/subsystem/tgui/proc/on_logout(mob/user) - return close_user_uis(user) + return close_user_uis(user, logout = TRUE) /** * private diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index c2bfdc7b8e..f775bed4c3 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -170,7 +170,7 @@ data["virus"] = list() for(var/ID in virusDB) var/datum/data/record/v = virusDB[ID] - data["virus"] += list(list("name" = v.fields["name"], "D" = v)) + data["virus"] += list(list("name" = v.fields["name"], "D" = "\ref[v]")) if(MED_DATA_MEDBOT) data["medbots"] = list() for(var/mob/living/bot/medbot/M in mob_list) @@ -266,16 +266,9 @@ active2 = null if("vir") var/datum/data/record/v = locate(params["vir"]) - var/list/payload = list( - id = v.fields["id"], - name = v.fields["name"], - max_stages = "Unknown", - spread_text = v.fields["spread type"], - cure = v.fields["antigen"], - desc = v.fields["description"], - severity = "Unknown" - ); - tgui_modal_message(src, "virus", "", null, payload) + if(!istype(v)) + return FALSE + tgui_modal_message(src, "virus", "", null, v.fields["tgui_description"]) if("del_all") for(var/datum/data/record/R in data_core.medical) qdel(R) diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 7d4c85cecb..191078f675 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -108,7 +108,7 @@ * * Close the UI, and all its children. */ -/datum/tgui/proc/close(can_be_suspended = TRUE) +/datum/tgui/proc/close(can_be_suspended = TRUE, logout = FALSE) if(closing) return closing = TRUE @@ -122,7 +122,7 @@ // and we want to keep them around, to allow user to read // the error message properly. window.release_lock() - window.close(can_be_suspended) + window.close(can_be_suspended, logout) src_object.tgui_close(user) SStgui.on_close(src) state = null diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm index a5a6c88e99..c78eda86d3 100644 --- a/code/modules/tgui/tgui_window.dm +++ b/code/modules/tgui/tgui_window.dm @@ -133,14 +133,19 @@ * * optional can_be_suspended bool */ -/datum/tgui_window/proc/close(can_be_suspended = TRUE) +/datum/tgui_window/proc/close(can_be_suspended = TRUE, logout = FALSE) if(!client) return if(can_be_suspended && can_be_suspended()) log_tgui(client, "[id]/close: suspending") status = TGUI_WINDOW_READY send_message("suspend") - winset(client, null, "mapwindow.map.focus=true") + // You would think that BYOND would null out client or make it stop passing istypes or, y'know, ANYTHING during + // logout, but nope! It appears to be perfectly valid to call winset by every means we can measure in Logout, + // and yet it causes a bad client runtime. To avoid that happening, we just have to know if we're in Logout or + // not. + if(!logout && client) + winset(client, null, "mapwindow.map.focus=true") return log_tgui(client, "[id]/close") release_lock() @@ -150,7 +155,8 @@ // to read the error message. if(!fatally_errored) client << browse(null, "window=[id]") - winset(client, null, "mapwindow.map.focus=true") + if(!logout && client) + winset(client, null, "mapwindow.map.focus=true") /** * public * diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index d62502084a..e163478b77 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -245,6 +245,25 @@ var/global/list/virusDB = list() return r +/datum/disease2/disease/proc/get_tgui_info() + . = list( + "name" = name(), + "spreadtype" = spreadtype, + "antigen" = antigens2string(antigen), + "rate" = stageprob * 10, + "resistance" = resistance, + "species" = jointext(affected_species, ", "), + "symptoms" = list(), + ) + + for(var/datum/disease2/effectholder/E in effects) + .["symptoms"].Add(list(list( + "stage" = E.stage, + "name" = E.effect.name, + "strength" = "[E.multiplier >= 3 ? "Severe" : E.multiplier > 1 ? "Above Average" : "Average"]", + "aggressiveness" = E.chance * 15, + ))) + /datum/disease2/disease/proc/addToDB() if ("[uniqueID]" in virusDB) return 0 @@ -252,6 +271,7 @@ var/global/list/virusDB = list() v.fields["id"] = uniqueID v.fields["name"] = name() v.fields["description"] = get_info() + v.fields["tgui_description"] = get_tgui_info() v.fields["antigen"] = antigens2string(antigen) v.fields["spread type"] = spreadtype virusDB["[uniqueID]"] = v diff --git a/tgui/packages/tgui/interfaces/MedicalRecords.js b/tgui/packages/tgui/interfaces/MedicalRecords.js index 0ece98c75e..c5da8480b5 100644 --- a/tgui/packages/tgui/interfaces/MedicalRecords.js +++ b/tgui/packages/tgui/interfaces/MedicalRecords.js @@ -6,6 +6,7 @@ import { Window } from "../layouts"; import { LoginInfo } from './common/LoginInfo'; import { LoginScreen } from './common/LoginScreen'; import { TemporaryNotice } from './common/TemporaryNotice'; +import { decodeHtmlEntities } from 'common/string'; const severities = { "Minor": "good", @@ -23,30 +24,45 @@ const doEdit = (context, field) => { }; const virusModalBodyOverride = (modal, context) => { + const { act } = useBackend(context); const virus = modal.args; return (
+ title={virus.name || "Virus"} + buttons={ +