diff --git a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm index 26ebb06fbeb..aff6bdb4349 100644 --- a/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/_sm_delam.dm @@ -9,6 +9,10 @@ GLOBAL_LIST_INIT(sm_delam_list, list( /// Logic holder for supermatter delaminations, goes off the strategy design pattern. /// Selected by [/obj/machinery/power/supermatter_crystal/proc/set_delam] /datum/sm_delam + /// User friendly name for messages and logging + var/name + /// Has a priority announcement been sent since this delam strategy was initialized + var/announcement_triggered = FALSE /// Whether we are eligible for this delamination or not. TRUE if valid, FALSE if not. /// [/obj/machinery/power/supermatter_crystal/proc/set_delam] @@ -38,8 +42,8 @@ GLOBAL_LIST_INIT(sm_delam_list, list( return FALSE if (sm.damage >= sm.emergency_point && sm.damage_archived < sm.emergency_point) - sm.investigate_log("has entered the emergency point.", INVESTIGATE_ENGINE) - message_admins("[sm] has entered the emergency point [ADMIN_VERBOSEJMP(sm)].") + sm.investigate_log("has entered the emergency point: Pending [sm.delamination_strategy.name].", INVESTIGATE_ENGINE) + message_admins("[ADMIN_VERBOSEJMP(sm)] has entered the emergency point: Pending [sm.delamination_strategy.name].") if((REALTIMEOFDAY - sm.lastwarning) < SUPERMATTER_WARNING_DELAY) return FALSE @@ -75,15 +79,24 @@ GLOBAL_LIST_INIT(sm_delam_list, list( SEND_SIGNAL(sm, COMSIG_SUPERMATTER_DELAM_ALARM) return TRUE +/// Generates an admin message and creates an investigate log. +/datum/sm_delam/proc/log_delamination(obj/machinery/power/supermatter_crystal/sm) + message_admins("[ADMIN_VERBOSEJMP(sm)] triggered a [name].") + sm.investigate_log("triggered a [name].", INVESTIGATE_ENGINE) + /// Called when a supermatter switches its strategy from another one to us. /// [/obj/machinery/power/supermatter_crystal/proc/set_delam] /datum/sm_delam/proc/on_select(obj/machinery/power/supermatter_crystal/sm) - return + SHOULD_CALL_PARENT(TRUE) + sm.investigate_log("functional strategy is now [name].", INVESTIGATE_ENGINE) + if(SSticker.HasRoundStarted()) + message_admins("[ADMIN_VERBOSEJMP(sm)] functional strategy is now [name].") /// Called when a supermatter switches its strategy from us to something else. /// [/obj/machinery/power/supermatter_crystal/proc/set_delam] /datum/sm_delam/proc/on_deselect(obj/machinery/power/supermatter_crystal/sm) - return + SHOULD_CALL_PARENT(TRUE) + sm.investigate_log("previous strategy was [name].", INVESTIGATE_ENGINE) /// Added to an examine return value. /// [/obj/machinery/power/supermatter_crystal/examine] diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm index abcc6a3a50e..4002c68610a 100644 --- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm +++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam.dm @@ -1,4 +1,5 @@ /datum/sm_delam/cascade + name = "resonance cascade" /datum/sm_delam/cascade/can_select(obj/machinery/power/supermatter_crystal/sm) if(!sm.is_main_engine) @@ -16,6 +17,9 @@ if(!..()) return FALSE + if(!announcement_triggered) + announce_cascade(sm) + sm.radio.talk_into( sm, "DANGER: HYPERSTRUCTURE OSCILLATION FREQUENCY OUT OF BOUNDS.", @@ -33,27 +37,20 @@ return TRUE /datum/sm_delam/cascade/on_select(obj/machinery/power/supermatter_crystal/sm) - message_admins("[sm] is heading towards a cascade. [ADMIN_VERBOSEJMP(sm)]") - sm.investigate_log("is heading towards a cascade.", INVESTIGATE_ENGINE) - + . = ..() sm.warp = new(sm) sm.vis_contents += sm.warp animate(sm.warp, time = 1, transform = matrix().Scale(0.5,0.5)) animate(time = 9, transform = matrix()) - addtimer(CALLBACK(src, PROC_REF(announce_cascade), sm), 2 MINUTES) - /datum/sm_delam/cascade/on_deselect(obj/machinery/power/supermatter_crystal/sm) - message_admins("[sm] will no longer cascade. [ADMIN_VERBOSEJMP(sm)]") - sm.investigate_log("will no longer cascade.", INVESTIGATE_ENGINE) - + . = ..() + message_admins("[ADMIN_VERBOSEJMP(sm)] will no longer cascade.") sm.vis_contents -= sm.warp QDEL_NULL(sm.warp) /datum/sm_delam/cascade/delaminate(obj/machinery/power/supermatter_crystal/sm) - message_admins("Supermatter [sm] at [ADMIN_VERBOSEJMP(sm)] triggered a cascade delam.") - sm.investigate_log("triggered a cascade delam.", INVESTIGATE_ENGINE) - + log_delamination(sm) effect_explosion(sm) effect_emergency_state() effect_cascade_demoralize() @@ -87,9 +84,13 @@ return FALSE if(!can_select(sm)) return FALSE + if(!sm.should_alert_common()) + return FALSE + priority_announce("Attention: Long range anomaly scans indicate abnormal quantities of harmonic flux originating from \ a subject within [station_name()], a resonance collapse may occur.", "Nanotrasen Star Observation Association", 'sound/announcer/alarm/airraid.ogg') + announcement_triggered = TRUE return TRUE /// Signal calls cant sleep, we gotta do this. diff --git a/code/modules/power/supermatter/supermatter_delamination/common_delams.dm b/code/modules/power/supermatter/supermatter_delamination/common_delams.dm index dc4bea0bf4f..00025579258 100644 --- a/code/modules/power/supermatter/supermatter_delamination/common_delams.dm +++ b/code/modules/power/supermatter/supermatter_delamination/common_delams.dm @@ -2,6 +2,7 @@ /// When we have too much gas. /datum/sm_delam/singularity + name = "singularity delamination" /datum/sm_delam/singularity/can_select(obj/machinery/power/supermatter_crystal/sm) return (sm.absorbed_gasmix.total_moles() >= MOLE_PENALTY_THRESHOLD) @@ -17,9 +18,7 @@ return TRUE /datum/sm_delam/singularity/delaminate(obj/machinery/power/supermatter_crystal/sm) - message_admins("Supermatter [sm] at [ADMIN_VERBOSEJMP(sm)] triggered a singularity delam.") - sm.investigate_log("triggered a singularity delam.", INVESTIGATE_ENGINE) - + log_delamination(sm) effect_irradiate(sm) effect_demoralize(sm) if(sm.is_main_engine) @@ -63,6 +62,7 @@ /// When we have too much power. /datum/sm_delam/tesla + name = "tesla delamination" /datum/sm_delam/tesla/can_select(obj/machinery/power/supermatter_crystal/sm) return (sm.internal_energy > POWER_PENALTY_THRESHOLD) @@ -78,9 +78,7 @@ return TRUE /datum/sm_delam/tesla/delaminate(obj/machinery/power/supermatter_crystal/sm) - message_admins("Supermatter [sm] at [ADMIN_VERBOSEJMP(sm)] triggered a tesla delam.") - sm.investigate_log("triggered a tesla delam.", INVESTIGATE_ENGINE) - + log_delamination(sm) effect_irradiate(sm) effect_demoralize(sm) if(sm.is_main_engine) @@ -113,14 +111,13 @@ /// Default delam. /datum/sm_delam/explosive + name = "explosive delamination" /datum/sm_delam/explosive/can_select(obj/machinery/power/supermatter_crystal/sm) return TRUE /datum/sm_delam/explosive/delaminate(obj/machinery/power/supermatter_crystal/sm) - message_admins("Supermatter [sm] at [ADMIN_VERBOSEJMP(sm)] triggered a normal delam.") - sm.investigate_log("triggered a normal delam.", INVESTIGATE_ENGINE) - + log_delamination(sm) effect_irradiate(sm) effect_demoralize(sm) if(sm.is_main_engine)