diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 51ab6ec94f5..fdccd87e0f5 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -26,7 +26,7 @@
var/max_heat = 5e7 // Maximum contained heat before exploding. Not actual temperature.
var/internal_heat = 0 // Contained heat, goes down every tick.
var/mode = DISCONNECTED // DISCONNECTED, CLAMPED_OFF, OPERATING
- var/admins_warned = FALSE // Stop spam, only warn the admins once that we are about to boom.
+ var/warning_given = FALSE //! Stop warning spam, only warn the admins/deadchat once that we are about to boom.
var/obj/structure/cable/attached
@@ -124,6 +124,7 @@
span_hear("You hear a click."))
message_admins("Power sink activated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(src)]")
user.log_message("activated a powersink", LOG_GAME)
+ notify_ghosts("[user] has activated a power sink!", source = src, header = "Shocking News!")
set_mode(OPERATING)
if(OPERATING)
@@ -144,8 +145,8 @@
if(delta_temperature)
environment.temperature += delta_temperature
air_update_turf(FALSE, FALSE)
- if(admins_warned && internal_heat < max_heat * 0.75)
- admins_warned = FALSE
+ if(warning_given && internal_heat < max_heat * 0.75)
+ warning_given = FALSE
message_admins("Power sink at ([x],[y],[z] - JMP) has cooled down and will not explode.")
if(mode != OPERATING && internal_heat < MINIMUM_HEAT)
internal_heat = 0
@@ -184,9 +185,10 @@
drain_power()
if(internal_heat > max_heat * ALERT / 100)
- if (!admins_warned)
- admins_warned = TRUE
+ if (!warning_given)
+ warning_given = TRUE
message_admins("Power sink at ([x],[y],[z] - JMP) has reached [ALERT]% of max heat. Explosion imminent.")
+ notify_ghosts("[src] is about to reach critical heat capacity!", source = src, header = "Power Sunk")
playsound(src, 'sound/effects/screech.ogg', 100, TRUE, TRUE)
if(internal_heat >= max_heat)
diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm
index 861d082a356..a9555e6a1bb 100644
--- a/code/game/objects/items/his_grace.dm
+++ b/code/game/objects/items/his_grace.dm
@@ -149,6 +149,7 @@
gender = MALE
adjust_bloodthirst(1)
force_bonus = HIS_GRACE_FORCE_BONUS * LAZYLEN(contents)
+ notify_ghosts("[user] has awoken His Grace!", source = src, action = NOTIFY_ORBIT, header = "All Hail His Grace!")
playsound(user, 'sound/effects/pope_entry.ogg', 100)
update_appearance()
move_gracefully()
diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm
index 86058a823be..04738931e3a 100644
--- a/code/game/objects/items/hot_potato.dm
+++ b/code/game/objects/items/hot_potato.dm
@@ -149,6 +149,7 @@
else
log_bomber(null, null, src, "was primed for detonation (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range])")
active = TRUE
+ notify_ghosts("[user] has primed a Hot Potato!", source = src, action = NOTIFY_ORBIT, header = "Hot Hot Hot!")
/obj/item/hot_potato/proc/deactivate()
update_appearance()
diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm
index 5d9675e1ac9..8ce88784d78 100644
--- a/code/modules/antagonists/heretic/heretic_knowledge.dm
+++ b/code/modules/antagonists/heretic/heretic_knowledge.dm
@@ -703,6 +703,7 @@
SSblackbox.record_feedback("tally", "heretic_ascended", 1, route)
log_heretic_knowledge("[key_name(user)] completed their final ritual at [worldtime2text()].")
+ notify_ghosts("[user] has completed an ascension ritual!", source = user, action = NOTIFY_ORBIT, header = "A Heretic is Ascending!")
return TRUE
/datum/heretic_knowledge/ultimate/cleanup_atoms(list/selected_atoms)
diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm
index d4558420b1d..b20cb06bd2c 100644
--- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm
+++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm
@@ -205,6 +205,7 @@
playsound(target, 'sound/effects/pop.ogg', 100, TRAIT_MUTE)
eyeballies.Remove(target)
eyeballies.forceMove(get_turf(target))
+ notify_ghosts("[target] has just had their eyes snatched!", source = target, action = NOTIFY_ORBIT, header = "Ouch!")
target.emote("scream")
if(prob(20))
target.emote("cry")
diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm
index 682525d835a..330779c7a6e 100644
--- a/code/modules/events/aurora_caelus.dm
+++ b/code/modules/events/aurora_caelus.dm
@@ -45,6 +45,7 @@
ruined_roast.atmos_spawn_air("plasma=100;TEMP=1000")
message_admins("Aurora Caelus event caused an oven to ignite at [ADMIN_VERBOSEJMP(ruined_roast)].")
log_game("Aurora Caelus event caused an oven to ignite at [loc_name(ruined_roast)].")
+ announce_to_ghosts(roast_ruiner)
for(var/mob/living/carbon/human/seymour as anything in GLOB.human_list)
if(seymour.mind && istype(seymour.mind.assigned_role, /datum/job/cook))
seymour.say("My roast is ruined!!!", forced = "ruined roast")
diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm
index 036785def2f..4a927c052ed 100644
--- a/code/modules/events/wizard/imposter.dm
+++ b/code/modules/events/wizard/imposter.dm
@@ -38,3 +38,4 @@
I.mind.special_role = "imposter"
I.log_message("is an imposter!", LOG_ATTACK, color="red") //?
SEND_SOUND(I, sound('sound/effects/magic.ogg'))
+ announce_to_ghosts(I)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index dd8a3ab5b77..055b44d4f53 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -480,6 +480,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
final_countdown = TRUE
+ notify_ghosts("[src] has begun the delamination process!", source = src, header = "Meltdown Incoming")
+
var/datum/sm_delam/last_delamination_strategy = delamination_strategy
var/list/count_down_messages = delamination_strategy.count_down_messages()
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
index fd9bddc00f8..b9948c60056 100644
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
@@ -44,6 +44,7 @@
affected_mob.adjustBruteLoss(-thou_shall_heal * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype)
if(good_kind_of_healing && !reaping && SPT_PROB(0.00005, seconds_per_tick)) //janken with the grim reaper!
+ notify_ghosts("[affected_mob] has entered a game of rock-paper-scissors with death!", source = affected_mob, action = NOTIFY_ORBIT, header = "Who Will Win?")
reaping = TRUE
var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to
if(affected_mob.apply_status_effect(/datum/status_effect/necropolis_curse, CURSE_BLINDING))
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 865997a685b..338ad195f9c 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -243,6 +243,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE)
point.Beam(target, icon_state = "bsa_beam", time = 5 SECONDS, maxdistance = world.maxx) //ZZZAP
new /obj/effect/temp_visual/bsa_splash(point, dir)
+ notify_ghosts("The Bluespace Artillery has been fired!", source = bullseye, header = "KABOOM!")
if(!blocker)
message_admins("[ADMIN_LOOKUPFLW(user)] has launched an artillery strike targeting [ADMIN_VERBOSEJMP(bullseye)].")
user.log_message("has launched an artillery strike targeting [AREACOORD(bullseye)].", LOG_GAME)
diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm
index 10b190060bf..8a0f04be1f2 100644
--- a/code/modules/surgery/organs/appendix.dm
+++ b/code/modules/surgery/organs/appendix.dm
@@ -47,6 +47,7 @@
if(owner)
ADD_TRAIT(owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type)
owner.med_hud_set_status()
+ notify_ghosts("[owner] has developed spontaneous appendicitis!", source = owner, action = NOTIFY_ORBIT, header = "Whoa, Sick!")
/obj/item/organ/internal/appendix/proc/inflamation(seconds_per_tick)
var/mob/living/carbon/organ_owner = owner
diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm
index 1fb7fab4964..2469fe22104 100644
--- a/code/modules/uplink/uplink_items/badass.dm
+++ b/code/modules/uplink/uplink_items/badass.dm
@@ -16,6 +16,14 @@
cant_discount = TRUE
illegal_tech = FALSE
+/datum/uplink_item/badass/balloon/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
+ . = ..()
+
+ if(!.)
+ return
+
+ notify_ghosts("[user] has purchased a BADASS Syndicate Balloon!", source = src, action = NOTIFY_ORBIT, header = "What are they THINKING?")
+
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, \