diff --git a/citadel.dme b/citadel.dme
index 7f087fbca9b..a3c74aba1f2 100644
--- a/citadel.dme
+++ b/citadel.dme
@@ -33,7 +33,6 @@
#include "code\__DEFINES\_tick.dm"
#include "code\__DEFINES\access.dm"
#include "code\__DEFINES\actionspeed_modification.dm"
-#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\appearance.dm"
#include "code\__DEFINES\automata.dm"
#include "code\__DEFINES\belly_modes_vr.dm"
@@ -111,6 +110,7 @@
#include "code\__DEFINES\_flags\item_flags.dm"
#include "code\__DEFINES\_flags\obj_flags.dm"
#include "code\__DEFINES\_flags\turf_flags.dm"
+#include "code\__DEFINES\admin\admin.dm"
#include "code\__DEFINES\admin\keybindings.dm"
#include "code\__DEFINES\assets\medical.dm"
#include "code\__DEFINES\atmospherics\atmos.dm"
@@ -4233,7 +4233,7 @@
#include "maps\overmap\shuttles\skipjack.dm"
#include "maps\overmap\shuttles\specialops.dm"
#include "maps\rift\rift.dm"
-#include "maps\submaps\_healpers.dm"
+#include "maps\submaps\_helpers.dm"
#include "maps\submaps\_readme.dm"
#include "maps\submaps\engine_submaps\engine.dm"
#include "maps\~map_system\maps.dm"
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
deleted file mode 100644
index ece599aee29..00000000000
--- a/code/__DEFINES/admin.dm
+++ /dev/null
@@ -1,83 +0,0 @@
-// A set of constants used to determine which type of mute an admin wishes to apply.
-// Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO, etc. = (MUTE_IC << 1)
-// Therefore there needs to be a gap between the flags for the automute flags.
-#define MUTE_IC 0x1
-#define MUTE_OOC 0x2
-#define MUTE_PRAY 0x4
-#define MUTE_ADMINHELP 0x8
-#define MUTE_DEADCHAT 0x10
-#define MUTE_ALL 0xFFFF
-
-// Number of identical messages required to get the spam-prevention auto-mute thing to trigger warnings and automutes.
-#define SPAM_TRIGGER_WARNING 5
-#define SPAM_TRIGGER_AUTOMUTE 10
-
-// Some constants for DB_Ban
-#define BANTYPE_PERMA 1
-#define BANTYPE_TEMP 2
-#define BANTYPE_JOB_PERMA 3
-#define BANTYPE_JOB_TEMP 4
-/// Used to locate stuff to unban.
-#define BANTYPE_ANY_FULLBAN 5
-/// Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued.
-#define ROUNDSTART_LOGOUT_REPORT_TIME 6000
-// Admin permissions.
-#define R_BUILDMODE 0x1
-#define R_ADMIN 0x2
-#define R_BAN 0x4
-#define R_FUN 0x8
-#define R_SERVER 0x10
-#define R_DEBUG 0x20
-#define R_POSSESS 0x40
-#define R_PERMISSIONS 0x80
-#define R_STEALTH 0x100
-#define R_REJUVINATE 0x200
-#define R_VAREDIT 0x400
-#define R_SOUNDS 0x800
-#define R_SPAWN 0x1000
-#define R_MOD 0x2000
-#define R_EVENT 0x4000
-///higher than this will overflow
-#define R_HOST 0x8000
-/// This holds the maximum value for a permission. It is used in iteration, so keep it updated.
-#define R_MAXPERMISSION 0x8000
-#define SMITE_BREAKLEGS "Break Legs"
-#define SMITE_BLUESPACEARTILLERY "Bluespace Artillery"
-#define SMITE_SPONTANEOUSCOMBUSTION "Spontaneous Combustion"
-#define SMITE_LIGHTNINGBOLT "Lightning Bolt"
-#define SMITE_DISLOCATEALL "Dislocate All Limbs"
-#define SMITE_SHADEKIN_ATTACK "Shadekin (Attack)"
-#define SMITE_SHADEKIN_NOMF "Shadekin (Devour)"
-#define SMITE_DARKSPACE_ABDUCT "Darkspace Abduction"
-#define SMITE_AUTOSAVE "10 Second Autosave"
-#define SMITE_AUTOSAVE_WIDE "10 Second Autosave (AoE)"
-
-#define ADMIN_QUE(user) "(?)"
-#define ADMIN_FLW(user) "(FLW)"
-#define ADMIN_PP(user) "(PP)"
-#define ADMIN_VV(atom) "(VV)"
-#define ADMIN_SM(user) "(SM)"
-#define ADMIN_TP(user) "(TP)"
-#define ADMIN_BSA(user) "(BSA)"
-#define ADMIN_KICK(user) "(KICK)"
-#define ADMIN_CENTCOM_REPLY(user) "(RPLY)"
-#define ADMIN_SYNDICATE_REPLY(user) "(RPLY)"
-#define ADMIN_SC(user) "(SC)"
-#define ADMIN_ST(user) "(ST)"
-#define ADMIN_SMITE(user) "(SMITE)"
-#define ADMIN_LOOKUP(user) "[key_name_admin(user)][ADMIN_QUE(user)]"
-#define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]"
-#define ADMIN_FULLMONTY_NONAME(user) "[ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)]"
-#define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_FULLMONTY_NONAME(user)]"
-#define ADMIN_JMP(src) "(JMP)"
-#define COORD(src) "[src ? "([src.x],[src.y],[src.z])" : "nonexistent location"]"
-#define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]"
-#define AREACOORD(src) "[src ? "[get_area_name(src, TRUE)] ([src.x], [src.y], [src.z])" : "nonexistent location"]"
-
-#define AHELP_ACTIVE 1
-#define AHELP_CLOSED 2
-#define AHELP_RESOLVED 3
-
-// LOG BROWSE TYPES
-#define BROWSE_ROOT_ALL_LOGS 1
-#define BROWSE_ROOT_CURRENT_LOGS 2
diff --git a/code/__DEFINES/admin/admin.dm b/code/__DEFINES/admin/admin.dm
new file mode 100644
index 00000000000..e0ee2e70260
--- /dev/null
+++ b/code/__DEFINES/admin/admin.dm
@@ -0,0 +1,116 @@
+/**
+ * A set of constants used to determine which type of mute an admin wishes to apply.
+ * Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO, etc. = (MUTE_IC << 1)
+ * Therefore there needs to be a gap between the flags for the automute flags.
+ */
+#define MUTE_IC (1<<0)
+#define MUTE_OOC (1<<1)
+#define MUTE_PRAY (1<<2)
+#define MUTE_ADMINHELP (1<<3)
+#define MUTE_DEADCHAT (1<<4)
+#define MUTE_ALL (~0)
+
+//! Number of identical messages required to get the spam-prevention auto-mute thing to trigger warnings and automutes.
+#define SPAM_TRIGGER_WARNING 5
+#define SPAM_TRIGGER_AUTOMUTE 10
+
+//! Some constants for DB_Ban
+#define BANTYPE_PERMA 1
+#define BANTYPE_TEMP 2
+#define BANTYPE_JOB_PERMA 3
+#define BANTYPE_JOB_TEMP 4
+#define BANTYPE_ANY_FULLBAN 5 // Used to locate stuff to unban.
+
+/// Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued.
+#define ROUNDSTART_LOGOUT_REPORT_TIME 6000
+
+//! Admin permissions.
+#define R_BUILDMODE (1<<0)
+#define R_ADMIN (1<<1)
+#define R_BAN (1<<2)
+#define R_FUN (1<<3)
+#define R_SERVER (1<<4)
+#define R_DEBUG (1<<5)
+#define R_POSSESS (1<<6)
+#define R_PERMISSIONS (1<<7)
+#define R_STEALTH (1<<8)
+#define R_REJUVINATE (1<<9)
+#define R_VAREDIT (1<<10)
+#define R_SOUNDS (1<<11)
+#define R_SPAWN (1<<12)
+#define R_MOD (1<<13)
+#define R_EVENT (1<<14)
+
+#define R_HOST (1<<15)
+/// This holds the maximum value for a permission. It is used in iteration, so keep it updated.
+#define R_MAXPERMISSION R_HOST
+
+#define SMITE_AUTOSAVE "10 Second Autosave"
+#define SMITE_AUTOSAVE_WIDE "10 Second Autosave (AoE)"
+#define SMITE_BLUESPACEARTILLERY "Bluespace Artillery"
+#define SMITE_BREAKLEGS "Break Legs"
+#define SMITE_DARKSPACE_ABDUCT "Darkspace Abduction"
+#define SMITE_DISLOCATEALL "Dislocate All Limbs"
+#define SMITE_LIGHTNINGBOLT "Lightning Bolt"
+#define SMITE_SHADEKIN_ATTACK "Shadekin (Attack)"
+#define SMITE_SHADEKIN_NOMF "Shadekin (Devour)"
+#define SMITE_SPONTANEOUSCOMBUSTION "Spontaneous Combustion"
+
+#define ADMIN_LOOKUP(user) ("[key_name_admin(user)][ADMIN_QUE(user)]")
+#define ADMIN_LOOKUPFLW(user) ("[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]")
+#define COORD(src) ("[src ? src.Admin_Coordinates_Readable() : "nonexistent location"]")
+#define AREACOORD(src) ("[src ? src.Admin_Coordinates_Readable(TRUE) : "nonexistent location"]")
+#define ADMIN_COORDJMP(src) ("[src ? src.Admin_Coordinates_Readable(FALSE, TRUE) : "nonexistent location"]")
+#define ADMIN_VERBOSEJMP(src) ("[src ? src.Admin_Coordinates_Readable(TRUE, TRUE) : "nonexistent location"]")
+
+#define ADMIN_QUE(user) ("([SPAN_TOOLTIP("See a short summary about the player.","?")])")
+#define ADMIN_FLW(user) ("([SPAN_TOOLTIP("Orbit this player.","FLW")])")
+#define ADMIN_PP(user) ("([SPAN_TOOLTIP("Open this user's player panel.","PP")])")
+#define ADMIN_VV(atom) ("([SPAN_TOOLTIP("Open their atom's variable viewer.","VV")])")
+#define ADMIN_SM(user) ("([SPAN_TOOLTIP("Send this user a subtle message.","SM")])")
+#define ADMIN_TP(user) ("([SPAN_TOOLTIP("Open this user's traitor panel.","TP")])")
+#define ADMIN_KICK(user) ("([SPAN_TOOLTIP("Open a prompt to kick this user.","KICK")])")
+#define ADMIN_CENTCOM_REPLY(user) ("([SPAN_TOOLTIP("Open a prompt to reply to this fax.","RPLY")])")
+#define ADMIN_SYNDICATE_REPLY(user) ("([SPAN_TOOLTIP("Open a prompt to reply to this fax.","RPLY")])")
+#define ADMIN_SC(user) ("([SPAN_TOOLTIP("Give this user a cookie!","SC")])")
+#define ADMIN_ST(user) ("([SPAN_TOOLTIP("Give this user a dog treat!","ST")])")
+#define ADMIN_SMITE(user) ("([SPAN_TOOLTIP("Open a prompt to smite this heathen.","SMITE")])")
+#define ADMIN_JMP(src) ("([SPAN_TOOLTIP("Jump to this location.","JMP")])")
+#define ADMIN_FULLMONTY_NONAME(user) ("[ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)] [ADMIN_SMITE(user)]")
+#define ADMIN_FULLMONTY(user) ("[key_name_admin(user)] [ADMIN_FULLMONTY_NONAME(user)]")
+
+/atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref)
+ var/turf/T = Safe_COORD_Location()
+ return T ? "[area_name ? "[get_area_name(T, TRUE)] " : " "]([T.x],[T.y],[T.z])[admin_jump_ref ? " [ADMIN_JMP(T)]" : ""]" : "nonexistent location"
+
+/atom/proc/Safe_COORD_Location()
+ var/atom/A = drop_location()
+ if(!A)
+ return // Not a valid atom.
+ var/turf/T = get_step(A, 0) // Resolve where the thing is.
+ if(!T) // Incase it's inside a valid drop container, inside another container. ie if a mech picked up a closet and has it inside it's internal storage.
+ var/atom/last_try = A.loc?.drop_location() // One last try, otherwise fuck it.
+ if(last_try)
+ T = get_step(last_try, 0)
+ return T
+
+/turf/Safe_COORD_Location()
+ return src
+
+/**
+ *! AHELP Commands.
+ */
+#define ADMIN_AHELP_REJECT(user) ("([SPAN_TOOLTIP("Reject and close this ticket.","REJT")])")
+#define ADMIN_AHELP_IC(user) ("([SPAN_TOOLTIP("Close this ticket and mark it IC.","IC")])")
+#define ADMIN_AHELP_CLOSE(user) ("([SPAN_TOOLTIP("Close this ticket.","CLOSE")])")
+#define ADMIN_AHELP_RESOLVE(user) ("([SPAN_TOOLTIP("Close this ticket and mark it as Resolved.","RSLVE")])")
+#define ADMIN_AHELP_HANDLE(user) ("([SPAN_TOOLTIP("Alert other Administrators that you're handling this ticket.","HANDLE")])")
+#define ADMIN_AHELP_FULLMONTY(user) ("[ADMIN_AHELP_REJECT(user)] [ADMIN_AHELP_IC(user)] [ADMIN_AHELP_CLOSE(user)] [ADMIN_AHELP_RESOLVE(user)] [ADMIN_AHELP_HANDLE(user)]")
+
+#define AHELP_ACTIVE 1
+#define AHELP_CLOSED 2
+#define AHELP_RESOLVED 3
+
+// LOG BROWSE TYPES
+#define BROWSE_ROOT_ALL_LOGS 1
+#define BROWSE_ROOT_CURRENT_LOGS 2
diff --git a/code/__DEFINES/chat.dm b/code/__DEFINES/chat.dm
index 8b8ee438ff4..d6129edd0dd 100644
--- a/code/__DEFINES/chat.dm
+++ b/code/__DEFINES/chat.dm
@@ -9,6 +9,7 @@
#define MESSAGE_TYPE_RADIO "radio"
#define MESSAGE_TYPE_INFO "info"
#define MESSAGE_TYPE_WARNING "warning"
+#define MESSAGE_TYPE_HELPFUL "helpful"
#define MESSAGE_TYPE_DEADCHAT "deadchat"
#define MESSAGE_TYPE_OOC "ooc"
#define MESSAGE_TYPE_ADMINPM "adminpm"
diff --git a/code/__DEFINES/spans.dm b/code/__DEFINES/spans.dm
index 639354064e4..355615a80a3 100644
--- a/code/__DEFINES/spans.dm
+++ b/code/__DEFINES/spans.dm
@@ -1,130 +1,143 @@
-// Sorted alphabetically
-#define SPAN_ABDUCTOR(str) ("" + str + "")
-#define SPAN_ADMIN(str) ("" + str + "")
-#define SPAN_ADMINHELP(str) ("" + str + "")
-#define SPAN_ADMINNOTICE(str) ("" + str + "")
-#define SPAN_ADMINOBSERVEROOC(str) ("" + str + "")
-#define SPAN_ADMINOOC(str) ("" + str + "")
-#define SPAN_ADMINSAY(str) ("" + str + "")
-#define SPAN_AIPRIVRADIO(str) ("" + str + "")
-#define SPAN_ALERT(str) ("" + str + "")
-#define SPAN_ALERTALIEN(str) ("" + str + "")
-#define SPAN_ALERTSYNDIE(str) ("" + str + "")
-#define SPAN_ALERTWARNING(str) ("" + str + "")
-#define SPAN_ALIEN(str) ("" + str + "")
-#define SPAN_ANNOUNCE(str) ("" + str + "")
-#define SPAN_BIG(str) ("" + str + "")
-#define SPAN_BIGICON(str) ("" + str + "")
-#define SPAN_BINARYSAY(str) ("" + str + "")
-#define SPAN_BLUE(str) ("" + str + "")
-#define SPAN_BLUETEAMRADIO(str) ("" + str + "")
-#define SPAN_BOLD(str) ("" + str + "")
-#define SPAN_BOLDANNOUNCE(str) ("" + str + "")
-#define SPAN_BOLDDANGER(str) ("" + str + "")
-#define SPAN_BOLDNICEGREEN(str) ("" + str + "")
-#define SPAN_BOLDNOTICE(str) ("" + str + "")
-#define SPAN_BOLDWARNING(str) ("" + str + "")
-#define SPAN_CAUTION(str) ("" + str + "")
-#define SPAN_CENTCOMRADIO(str) ("" + str + "")
-#define SPAN_CHANGELING(str) ("" + str + "")
-#define SPAN_CLOWN(str) ("" + str + "")
-#define SPAN_COLOSSUS(str) ("" + str + "")
-#define SPAN_COMMAND_HEADSET(str) ("" + str + "")
-#define SPAN_COMRADIO(str) ("" + str + "")
-#define SPAN_CRITICAL(str) ("" + str + "")
-#define SPAN_CULT(str) ("" + str + "")
-#define SPAN_CULTBOLD(str) ("" + str + "")
-#define SPAN_CULTBOLDTALIC(str) ("" + str + "")
-#define SPAN_CULTITALIC(str) ("" + str + "")
-#define SPAN_CULTLARGE(str) ("" + str + "")
-#define SPAN_DANGER(str) ("" + str + "")
-#define SPAN_DEADSAY(str) ("" + str + "")
-#define SPAN_DEBUG(str) ("" + str + "")
-#define SPAN_DEBUGERROR(str) ("" + str + "")
-#define SPAN_DEBUGINFO(str) ("" + str + "")
-#define SPAN_DEBUGTRACE(str) ("" + str + "")
-#define SPAN_DEBUGWARNING(str) ("" + str + "")
-#define SPAN_DECONVERSION_MESSAGE(str) ("" + str + "")
-#define SPAN_DRONE(str) ("" + str + "")
-#define SPAN_ENGRADIO(str) ("" + str + "")
-#define SPAN_EXTREMELYBIG(str) ("" + str + "")
-#define SPAN_GANGRADIO(str) ("" + str + "")
-#define SPAN_GHOSTALERT(str) ("" + str + "")
-#define SPAN_GREEN(str) ("" + str + "")
-#define SPAN_GREENANNOUNCE(str) ("" + str + "")
-#define SPAN_GREENTEAMRADIO(str) ("" + str + "")
-#define SPAN_GREENTEXT(str) ("" + str + "")
-#define SPAN_GREY(str) ("" + str + "")
-#define SPAN_HEAR(str) ("" + str + "")
-#define SPAN_HIDDEN(str) ("" + str + "")
-#define SPAN_HIEROPHANT_WARNING(str) ("" + str + "")
-#define SPAN_HIEROPHANT(str) ("" + str + "")
-#define SPAN_HIGHLIGHT(str) ("" + str + "")
-#define SPAN_HIS_GRACE(str) ("" + str + "")
-#define SPAN_HOLOPARASITE(str) ("" + str + "")
-#define SPAN_HYPNOPHRASE(str) ("" + str + "")
-#define SPAN_ICON(str) ("" + str + "")
-#define SPAN_INFO(str) ("" + str + "")
-#define SPAN_INFOPLAIN(str) ("" + str + "")
-#define SPAN_INTERFACE(str) ("" + str + "")
-#define SPAN_LOOC(str) ("" + str + "")
-#define SPAN_MEDAL(str) ("" + str + "")
-#define SPAN_MEDRADIO(str) ("" + str + "")
-#define SPAN_MEMO(str) ("" + str + "")
-#define SPAN_MEMOEDIT(str) ("" + str + "")
-#define SPAN_MIND_CONTROL(str) ("" + str + "")
-#define SPAN_MINORANNOUNCE(str) ("" + str + "")
-#define SPAN_MONKEY(str) ("" + str + "")
-#define SPAN_MONKEYHIVE(str) ("" + str + "")
-#define SPAN_MONKEYLEAD(str) ("" + str + "")
-#define SPAN_NAME(str) ("" + str + "")
-#define SPAN_NARSIE(str) ("" + str + "")
-#define SPAN_NARSIESMALL(str) ("" + str + "")
-#define SPAN_NICEGREEN(str) ("" + str + "")
-#define SPAN_NOTICE(str) ("" + str + "")
-#define SPAN_NOTICEALIEN(str) ("" + str + "")
-#define SPAN_OOC(str) ("" + str + "")
-#define SPAN_PAPYRUS(str) ("" + str + "")
-#define SPAN_PHOBIA(str) ("" + str + "")
-#define SPAN_PREFIX(str) ("" + str + "")
-#define SPAN_PURPLE(str) ("" + str + "")
-#define SPAN_RADIO(str) ("" + str + "")
-#define SPAN_REALLYBIG(str) ("" + str + "")
-#define SPAN_RED(str) ("" + str + "")
-#define SPAN_REDTEAMRADIO(str) ("" + str + "")
-#define SPAN_REDTEXT(str) ("" + str + "")
-#define SPAN_RESONATE(str) ("" + str + "")
-#define SPAN_REVENBIGNOTICE(str) ("" + str + "")
-#define SPAN_REVENBOLDNOTICE(str) ("" + str + "")
-#define SPAN_REVENDANGER(str) ("" + str + "")
-#define SPAN_REVENMINOR(str) ("" + str + "")
-#define SPAN_REVENNOTICE(str) ("" + str + "")
-#define SPAN_REVENWARNING(str) ("" + str + "")
-#define SPAN_ROBOT(str) ("" + str + "")
-#define SPAN_ROSE(str) ("" + str + "")
-#define SPAN_SANS(str) ("" + str + "")
-#define SPAN_SCIRADIO(str) ("" + str + "")
-#define SPAN_SECRADIO(str) ("" + str + "")
-#define SPAN_SERVRADIO(str) ("" + str + "")
-#define SPAN_SINGING(str) ("" + str + "")
-#define SPAN_SLIME(str) ("" + str + "")
-#define SPAN_SMALL(str) ("" + str + "")
-#define SPAN_SMALLNOTICE(str) ("" + str + "")
-#define SPAN_SMALLNOTICEITAL(str) ("" + str + "")
-#define SPAN_SOGHUN(str) ("" + str + "")
-#define SPAN_SPIDER(str) ("" + str + "")
-#define SPAN_SUICIDE(str) ("" + str + "")
-#define SPAN_SUPPRADIO(str) ("" + str + "")
-#define SPAN_SYNDRADIO(str) ("" + str + "")
-#define SPAN_TAPE_RECORDER(str) ("" + str + "")
-#define SPAN_TINYNOTICE(str) ("" + str + "")
-#define SPAN_TINYNOTICEITAL(str) ("" + str + "")
-#define SPAN_UNCONSCIOUS(str) ("" + str + "")
-#define SPAN_USERDANGER(str) ("" + str + "")
-#define SPAN_WARNING(str) ("" + str + "")
-#define SPAN_YELL(str) ("" + str + "")
-#define SPAN_YELLOWTEAMRADIO(str) ("" + str + "")
+/**
+ * Standard Spans
+ * Sorted alphabetically
+ */
+#define SPAN_ABDUCTOR(str) ("[str]")
+#define SPAN_ADMIN(str) ("[str]")
+#define SPAN_ADMINHELP(str) ("[str]")
+#define SPAN_ADMINNOTICE(str) ("[str]")
+#define SPAN_ADMINOBSERVEROOC(str) ("[str]")
+#define SPAN_ADMINOOC(str) ("[str]")
+#define SPAN_ADMINSAY(str) ("[str]")
+#define SPAN_AIPRIVRADIO(str) ("[str]")
+#define SPAN_ALERT(str) ("[str]")
+#define SPAN_ALERTALIEN(str) ("[str]")
+#define SPAN_ALERTSYNDIE(str) ("[str]")
+#define SPAN_ALERTWARNING(str) ("[str]")
+#define SPAN_ALIEN(str) ("[str]")
+#define SPAN_ANNOUNCE(str) ("[str]")
+#define SPAN_BIG(str) ("[str]")
+#define SPAN_BIGICON(str) ("[str]")
+#define SPAN_BINARYSAY(str) ("[str]")
+#define SPAN_BLUE(str) ("[str]")
+#define SPAN_BLUETEAMRADIO(str) ("[str]")
+#define SPAN_BOLD(str) ("[str]")
+#define SPAN_BOLDANNOUNCE(str) ("[str]")
+#define SPAN_BOLDDANGER(str) ("[str]")
+#define SPAN_BOLDNICEGREEN(str) ("[str]")
+#define SPAN_BOLDNOTICE(str) ("[str]")
+#define SPAN_BOLDWARNING(str) ("[str]")
+#define SPAN_CAUTION(str) ("[str]")
+#define SPAN_CENTCOMRADIO(str) ("[str]")
+#define SPAN_CHANGELING(str) ("[str]")
+#define SPAN_CLOWN(str) ("[str]")
+#define SPAN_COLOSSUS(str) ("[str]")
+#define SPAN_COMMAND_HEADSET(str) ("[str]")
+#define SPAN_COMRADIO(str) ("[str]")
+#define SPAN_CRITICAL(str) ("[str]")
+#define SPAN_CULT(str) ("[str]")
+#define SPAN_CULTBOLD(str) ("[str]")
+#define SPAN_CULTBOLDTALIC(str) ("[str]")
+#define SPAN_CULTITALIC(str) ("[str]")
+#define SPAN_CULTLARGE(str) ("[str]")
+#define SPAN_DANGER(str) ("[str]")
+#define SPAN_DEADSAY(str) ("[str]")
+#define SPAN_DEBUG(str) ("[str]")
+#define SPAN_DEBUGERROR(str) ("[str]")
+#define SPAN_DEBUGINFO(str) ("[str]")
+#define SPAN_DEBUGTRACE(str) ("[str]")
+#define SPAN_DEBUGWARNING(str) ("[str]")
+#define SPAN_DECONVERSION_MESSAGE(str) ("[str]")
+#define SPAN_DRONE(str) ("[str]")
+#define SPAN_ENGRADIO(str) ("[str]")
+#define SPAN_EXTREMELYBIG(str) ("[str]")
+#define SPAN_GANGRADIO(str) ("[str]")
+#define SPAN_GHOSTALERT(str) ("[str]")
+#define SPAN_GREEN(str) ("[str]")
+#define SPAN_GREENANNOUNCE(str) ("[str]")
+#define SPAN_GREENTEAMRADIO(str) ("[str]")
+#define SPAN_GREENTEXT(str) ("[str]")
+#define SPAN_GREY(str) ("[str]")
+#define SPAN_HEAR(str) ("[str]")
+#define SPAN_HELPFUL(X) "[X]"
+#define SPAN_HIDDEN(str) ("[str]")
+#define SPAN_HIEROPHANT_WARNING(str) ("[str]")
+#define SPAN_HIEROPHANT(str) ("[str]")
+#define SPAN_HIGHLIGHT(str) ("[str]")
+#define SPAN_HIS_GRACE(str) ("[str]")
+#define SPAN_HOLOPARASITE(str) ("[str]")
+#define SPAN_HYPNOPHRASE(str) ("[str]")
+#define SPAN_ICON(str) ("[str]")
+#define SPAN_INFO(str) ("[str]")
+#define SPAN_INFOPLAIN(str) ("[str]")
+#define SPAN_INTERFACE(str) ("[str]")
+#define SPAN_LINKIFY(str) ("[str]")
+#define SPAN_LOOC(str) ("[str]")
+#define SPAN_MEDAL(str) ("[str]")
+#define SPAN_MEDRADIO(str) ("[str]")
+#define SPAN_MEMO(str) ("[str]")
+#define SPAN_MEMOEDIT(str) ("[str]")
+#define SPAN_MIND_CONTROL(str) ("[str]")
+#define SPAN_MINORANNOUNCE(str) ("[str]")
+#define SPAN_MONKEY(str) ("[str]")
+#define SPAN_MONKEYHIVE(str) ("[str]")
+#define SPAN_MONKEYLEAD(str) ("[str]")
+#define SPAN_NAME(str) ("[str]")
+#define SPAN_NARSIE(str) ("[str]")
+#define SPAN_NARSIESMALL(str) ("[str]")
+#define SPAN_NICEGREEN(str) ("[str]")
+#define SPAN_NOTICE(str) ("[str]")
+#define SPAN_NOTICEALIEN(str) ("[str]")
+#define SPAN_OOC(str) ("[str]")
+#define SPAN_PAPYRUS(str) ("[str]")
+#define SPAN_PHOBIA(str) ("[str]")
+#define SPAN_PREFIX(str) ("[str]")
+#define SPAN_PURPLE(str) ("[str]")
+#define SPAN_RADIO(str) ("[str]")
+#define SPAN_REALLYBIG(str) ("[str]")
+#define SPAN_RED(str) ("[str]")
+#define SPAN_REDTEAMRADIO(str) ("[str]")
+#define SPAN_REDTEXT(str) ("[str]")
+#define SPAN_RESONATE(str) ("[str]")
+#define SPAN_REVENBIGNOTICE(str) ("[str]")
+#define SPAN_REVENBOLDNOTICE(str) ("[str]")
+#define SPAN_REVENDANGER(str) ("[str]")
+#define SPAN_REVENMINOR(str) ("[str]")
+#define SPAN_REVENNOTICE(str) ("[str]")
+#define SPAN_REVENWARNING(str) ("[str]")
+#define SPAN_ROBOT(str) ("[str]")
+#define SPAN_ROSE(str) ("[str]")
+#define SPAN_SANS(str) ("[str]")
+#define SPAN_SCIRADIO(str) ("[str]")
+#define SPAN_SECRADIO(str) ("[str]")
+#define SPAN_SERVRADIO(str) ("[str]")
+#define SPAN_SINGING(str) ("[str]")
+#define SPAN_SLIME(str) ("[str]")
+#define SPAN_SMALL(str) ("[str]")
+#define SPAN_SMALLNOTICE(str) ("[str]")
+#define SPAN_SMALLNOTICEITAL(str) ("[str]")
+#define SPAN_SOGHUN(str) ("[str]")
+#define SPAN_SPIDER(str) ("[str]")
+#define SPAN_SUICIDE(str) ("[str]")
+#define SPAN_SUPPRADIO(str) ("[str]")
+#define SPAN_SYNDRADIO(str) ("[str]")
+#define SPAN_TAPE_RECORDER(str) ("[str]")
+#define SPAN_TINYNOTICE(str) ("[str]")
+#define SPAN_TINYNOTICEITAL(str) ("[str]")
+#define SPAN_UNCONSCIOUS(str) ("[str]")
+#define SPAN_USERDANGER(str) ("[str]")
+#define SPAN_WARNING(str) ("[str]")
+#define SPAN_YELL(str) ("[str]")
+#define SPAN_YELLOWTEAMRADIO(str) ("[str]")
-// Spans that use embedded tgui components:
-// Sorted alphabetically
-#define SPAN_TOOLTIP(tip, main_text) ("" + main_text + "")
+/**
+ * Spans that use embedded tgui components:
+ * Sorted alphabetically
+ */
+#define SPAN_TOOLTIP(tip, str) ("[str]")
+
+/**
+ * Special Macros
+ * These aren't really spans but we'll call them such just to make shit easier
+ */
+#define SPAN_BLOCKQUOTE(str, span_type) ("
[str]
")
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index d403300c456..5d33b64d041 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -399,7 +399,11 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global"))
for(var/client/C in GLOB.admins)
if(C.is_preference_enabled(/datum/client_preference/debug/show_debug_logs))
- to_chat(C, "DEBUG: [text]")
+ to_chat(C,
+ type = MESSAGE_TYPE_DEBUG,
+ html = "DEBUG: [text]",
+ confidential = TRUE,
+ )
/proc/log_ghostsay(text, mob/speaker)
if (config_legacy.log_say)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index af65a3d1da4..9dcf5a2d49d 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -1,8 +1,5 @@
//? BEHOLD THE LIST OF GLOBAL LISTS ?//
-/// List of all clients whom are admins
-var/list/admins = list()
-
//Since it didn't really belong in any other category, I'm putting this here
//This is for procs to replace all the goddamn 'in world's that are chilling around the code
diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm
index 9df35b0534d..9b870c8c4cf 100644
--- a/code/__HELPERS/turfs.dm
+++ b/code/__HELPERS/turfs.dm
@@ -76,7 +76,7 @@
var/turf/target = locate(dst_origin.x + x_pos, dst_origin.y + y_pos, dst_origin.z + z_pos)
if(!target)
- log_debug("Null turf in translation @ ([dst_origin.x + x_pos], [dst_origin.y + y_pos], [dst_origin.z + z_pos])")
+ log_debug(SPAN_DEBUGERROR("Null turf in translation @ ([dst_origin.x + x_pos], [dst_origin.y + y_pos], [dst_origin.z + z_pos] [ADMIN_JMP(dst_origin)])"))
// If target is null, preserve that information in the turf map.
turf_map[source] = target
@@ -103,7 +103,7 @@
// You can stay, though.
if (istype(Origin, /turf/space))
- log_debug("Tried to translate a space turf: src=[log_info_line(Origin)] dst=[log_info_line(Destination)]")
+ log_debug(SPAN_DEBUGERROR("Tried to translate a space turf: src=[log_info_line(Origin)][ADMIN_JMP(Origin)] dst=[log_info_line(Destination)][ADMIN_JMP(Destination)]"))
return FALSE // TODO - Is this really okay to do nothing?
var/turf/X // New Destination Turf
diff --git a/code/_macros.dm b/code/_macros.dm
index 507e032b99c..e9574fa6831 100644
--- a/code/_macros.dm
+++ b/code/_macros.dm
@@ -24,4 +24,3 @@
#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") }
#define JOINTEXT(X) jointext(X, null)
-//thank you Kevin for not running checks again, now I have to update one file with a comment - Papalus
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 291b1b0ce55..2609242e860 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -47,14 +47,17 @@ SUBSYSTEM_DEF(air)
S.update_air_properties()
CHECK_TICK
- var/to_send = ""
+ // var/to_send = ""
+ var/to_send = ""
to_send += SPAN_DEBUG("Geometry initialized in [round(0.1*(REALTIMEOFDAY-timeofday),0.1)] seconds.
")
to_send += SPAN_DEBUGINFO("Total Simulated Turfs: [simulated_turf_count]")
to_send += SPAN_DEBUGINFO("\nTotal Zones: [zones.len]")
to_send += SPAN_DEBUGINFO("\nTotal Edges: [edges.len]")
to_send += SPAN_DEBUGINFO("\nTotal Active Edges: [active_edges.len ? SPAN_DANGER("[active_edges.len]") : "None"]")
to_send += SPAN_DEBUGINFO("\nTotal Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")
- to_send += SPAN_DEBUGINFO("
")
+ // to_send += SPAN_DEBUGINFO("
")
+
+ to_send = SPAN_BLOCKQUOTE(JOINTEXT(to_send), "info")
admin_notice(to_send, R_DEBUG)
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 2ab0446ba4a..be10dfb040c 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -67,7 +67,7 @@ SUBSYSTEM_DEF(events)
active_events -= E
if(!E.event_meta || !E.severity) // datum/event is used here and there for random reasons, maintaining "backwards compatibility"
- log_debug("Event of '[E.type]' with missing meta-data has completed.")
+ log_debug(SPAN_DEBUG("Event of '[E.type]' with missing meta-data has completed."))
return
finished_events += E
@@ -78,7 +78,7 @@ SUBSYSTEM_DEF(events)
if(EM.add_to_queue)
EC.available_events += EM
- log_debug("Event '[EM.name]' has completed at [worldtime2stationtime(world.time)].")
+ log_debug(SPAN_DEBUG("Event '[EM.name]' has completed at [worldtime2stationtime(world.time)]."))
/datum/controller/subsystem/events/proc/delay_events(var/severity, var/delay)
var/datum/event_container/EC = event_containers[severity]
diff --git a/code/controllers/subsystem/game_master.dm b/code/controllers/subsystem/game_master.dm
index 4e7d0375e1a..49f9cfd756d 100644
--- a/code/controllers/subsystem/game_master.dm
+++ b/code/controllers/subsystem/game_master.dm
@@ -45,13 +45,13 @@ SUBSYSTEM_DEF(gamemaster)
adjust_staleness(global_afk) // Staleness increases faster if more people are less active.
if(world.time < next_action && prob(staleness * 2) )
- log_debug("Game Master going to start something.")
+ log_debug(SPAN_DEBUG("Game Master going to start something."))
start_action()
// This is run before committing to an action/event.
/datum/controller/subsystem/gamemaster/proc/pre_action_checks()
if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING)
- log_debug("Game Master unable to start event: SSticker is nonexistant, or the game is not ongoing.")
+ log_debug(SPAN_DEBUG("Game Master unable to start event: SSticker is nonexistant, or the game is not ongoing."))
return FALSE
if(suspended)
return FALSE
@@ -63,17 +63,17 @@ SUBSYSTEM_DEF(gamemaster)
var/hours = round(mills / 36000)
if(hours < 1 && mins <= 20) // Don't do anything for the first twenty minutes of the round.
- log_debug("Game Master unable to start event: It is too early.")
+ log_debug(SPAN_DEBUG("Game Master unable to start event: It is too early."))
return FALSE
if(hours >= 2 && mins >= 40) // Don't do anything in the last twenty minutes of the round, as well.
- log_debug("Game Master unable to start event: It is too late.")
+ log_debug(SPAN_DEBUG("Game Master unable to start event: It is too late."))
return FALSE
return TRUE
/datum/controller/subsystem/gamemaster/proc/start_action()
if(!pre_action_checks()) // Make sure we're not doing last minute events, or early events.
return
- log_debug("Game Master now starting action decision.")
+ log_debug(SPAN_DEBUG("Game Master now starting action decision."))
var/list/most_active_departments = metric.assess_all_departments(3, list(last_department_used))
var/list/best_actions = decide_best_action(most_active_departments)
@@ -86,7 +86,7 @@ SUBSYSTEM_DEF(gamemaster)
var/datum/gm_action/choice = pickweight(weighted_actions)
if(choice)
- log_debug("[choice.name] was chosen by the Game Master, and is now being ran.")
+ log_debug(SPAN_DEBUG("[choice.name] was chosen by the Game Master, and is now being ran."))
INVOKE_ASYNC(src, .proc/run_action, choice)
/datum/controller/subsystem/gamemaster/proc/run_action(var/datum/gm_action/action)
@@ -104,7 +104,7 @@ SUBSYSTEM_DEF(gamemaster)
/datum/controller/subsystem/gamemaster/proc/decide_best_action(var/list/most_active_departments)
if(!most_active_departments.len) // Server's empty?
- log_debug("Game Master failed to find any active departments.")
+ log_debug(SPAN_DEBUG("Game Master failed to find any active departments."))
return list()
var/list/best_actions = list() // List of actions which involve the most active departments.
@@ -115,7 +115,7 @@ SUBSYSTEM_DEF(gamemaster)
// Try to incorporate an action with the top two departments first.
if((most_active_departments[1] in action.departments) && (most_active_departments[2] in action.departments))
best_actions.Add(action)
- log_debug("[action.name] is being considered because both most active departments are involved.")
+ log_debug(SPAN_DEBUG("[action.name] is being considered because both most active departments are involved."))
if(best_actions.len) // We found something for those two, let's do it.
return best_actions
@@ -126,7 +126,7 @@ SUBSYSTEM_DEF(gamemaster)
continue
if(most_active_departments[1] in action.departments)
best_actions.Add(action)
- log_debug("[action.name] is being considered because the most active department is involved.")
+ log_debug(SPAN_DEBUG("[action.name] is being considered because the most active department is involved."))
if(best_actions.len) // Found something for the one guy.
return best_actions
@@ -137,7 +137,7 @@ SUBSYSTEM_DEF(gamemaster)
continue
if(DEPARTMENT_EVERYONE in action.departments)
best_actions.Add(action)
- log_debug("[action.name] is being considered because it involves everyone.")
+ log_debug(SPAN_DEBUG("[action.name] is being considered because it involves everyone."))
if(best_actions.len) // Finally, perhaps?
return best_actions
@@ -147,9 +147,9 @@ SUBSYSTEM_DEF(gamemaster)
if(!action.enabled)
continue
best_actions.Add(action)
- log_debug("[action.name] is being considered because everything else failed.")
+ log_debug(SPAN_DEBUG("[action.name] is being considered because everything else failed."))
if(best_actions.len) // Finally, perhaps?
return best_actions
else
- log_debug("Game Master failed to find a suitable event, something very wrong is going on.")
+ log_debug(SPAN_DEBUG("Game Master failed to find a suitable event, something very wrong is going on."))
diff --git a/code/controllers/subsystem/job/_job.dm b/code/controllers/subsystem/job/_job.dm
index ad14c0e54a4..3f62678d064 100644
--- a/code/controllers/subsystem/job/_job.dm
+++ b/code/controllers/subsystem/job/_job.dm
@@ -193,4 +193,4 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/job_debug_message(message)
if(debug_messages)
- log_debug("JOB DEBUG: [message]")
+ log_debug(SPAN_DEBUG("JOB DEBUG: [message]"))
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index 100be71216a..d209e372e08 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -54,7 +54,7 @@ SUBSYSTEM_DEF(shuttle)
var/datum/shuttle/S = working_shuttles[working_shuttles.len]
working_shuttles.len--
if(!istype(S) || QDELETED(S))
- log_debug("Bad entry in SSshuttle.process_shuttles - [log_info_line(S)] ")
+ log_debug(SPAN_DEBUG("Bad entry in SSshuttle.process_shuttles - [log_info_line(S)] "))
process_shuttles -= S
continue
// NOTE - In old system, /datum/shuttle/ferry was processed only if (F.process_state || F.always_process)
@@ -153,7 +153,7 @@ SUBSYSTEM_DEF(shuttle)
if(initial(shuttle.category) != shuttle_type) // Skip if its an "abstract class" datum
shuttle = new shuttle()
shuttle_areas |= shuttle.shuttle_area
- log_debug("Initialized shuttle [shuttle] ([shuttle.type])")
+ log_debug(SPAN_DEBUG("Initialized shuttle [shuttle] ([shuttle.type])"))
return shuttle
// Historical note: No need to call shuttle.init_docking_controllers(), controllers register themselves
// and shuttles fetch refs in New(). Shuttles also dock() themselves in new if they want.
@@ -167,7 +167,7 @@ SUBSYSTEM_DEF(shuttle)
S.motherdock = S.current_location.landmark_tag
mothership.shuttle_area |= S.shuttle_area
else
- log_debug("Shuttle [S] was unable to find mothership [mothership]!")
+ log_debug(SPAN_DEBUG("Shuttle [S] was unable to find mothership [mothership]!"))
// Let shuttles scan their owned areas for objects they want to configure (Called after mothership hookup)
/datum/controller/subsystem/shuttle/proc/hook_up_shuttle_objects(shuttles_list)
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index dd5f3811d30..5d64647a647 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -45,7 +45,7 @@ SUBSYSTEM_DEF(vote)
break
if(!players_are_in_round)
- log_debug("The crew transfer shuttle was automatically called at vote time due to no players being present.")
+ log_debug(SPAN_DEBUG("The crew transfer shuttle was automatically called at vote time due to no players being present."))
init_shift_change(null, 1)
return
diff --git a/code/datums/observation/~cleanup.dm b/code/datums/observation/~cleanup.dm
index 3ffe4de89cb..ca33901988d 100644
--- a/code/datums/observation/~cleanup.dm
+++ b/code/datums/observation/~cleanup.dm
@@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(event_listen_count)
for(var/entry in GLOB.all_observable_events.events)
var/decl/observ/event = entry
if(event.unregister_global(listener))
- log_debug("[event] - [listener] was deleted while still registered to global events.")
+ log_debug(SPAN_DEBUG("[event] - [listener] was deleted while still registered to global events."))
if(!(--listen_count))
return
@@ -55,7 +55,7 @@ GLOBAL_LIST_EMPTY(event_listen_count)
if(proc_owners)
for(var/proc_owner in proc_owners)
if(event.unregister(event_source, proc_owner))
- log_debug("[event] - [event_source] was deleted while still being listened to by [proc_owner].")
+ log_debug(SPAN_DEBUG("[event] - [event_source] was deleted while still being listened to by [proc_owner]."))
if(!(--source_listener_count))
return
@@ -65,6 +65,6 @@ GLOBAL_LIST_EMPTY(event_listen_count)
var/decl/observ/event = entry
for(var/event_source in event.event_sources)
if(event.unregister(event_source, listener))
- log_debug("[event] - [listener] was deleted while still listening to [event_source].")
+ log_debug(SPAN_DEBUG("[event] - [listener] was deleted while still listening to [event_source]."))
if(!(--listener_count))
return
diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm
index 4f353751afd..b42c9a82e72 100644
--- a/code/game/antagonist/antagonist.dm
+++ b/code/game/antagonist/antagonist.dm
@@ -110,22 +110,22 @@
for(var/datum/mind/player in candidates)
if(ghosts_only && !istype(player.current, /mob/observer/dead))
candidates -= player
- log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role! They have been removed from the draft.")
+ log_debug(SPAN_DEBUG("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role! They have been removed from the draft."))
else if(config_legacy.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age)
candidates -= player
- log_debug("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!")
+ log_debug(SPAN_DEBUG("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!"))
else if(player.special_role)
candidates -= player
- log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])! They have been removed from the draft.")
+ log_debug(SPAN_DEBUG("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])! They have been removed from the draft."))
else if (player in pending_antagonists)
candidates -= player
- log_debug("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role! They have been removed from the draft.")
+ log_debug(SPAN_DEBUG("[key_name(player)] is not eligible to become a [role_text]: They have already been selected for this role! They have been removed from the draft."))
else if(!can_become_antag(player))
candidates -= player
- log_debug("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role! They have been removed from the draft.")
+ log_debug(SPAN_DEBUG("[key_name(player)] is not eligible to become a [role_text]: They are blacklisted for this role! They have been removed from the draft."))
else if(player_is_antag(player))
candidates -= player
- log_debug("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist! They have been removed from the draft.")
+ log_debug(SPAN_DEBUG("[key_name(player)] is not eligible to become a [role_text]: They are already an antagonist! They have been removed from the draft."))
return candidates
@@ -179,17 +179,17 @@
/datum/antagonist/proc/draft_antagonist(var/datum/mind/player)
//Check if the player can join in this antag role, or if the player has already been given an antag role.
if(!can_become_antag(player) || (player.assigned_role in roundstart_restricted))
- log_debug("[player.key] was selected for [role_text] by lottery, but is not allowed to be that role.")
+ log_debug(SPAN_DEBUG("[player.key] was selected for [role_text] by lottery, but is not allowed to be that role."))
return 0
if(player.special_role)
- log_debug("[player.key] was selected for [role_text] by lottery, but they already have a special role.")
+ log_debug(SPAN_DEBUG("[player.key] was selected for [role_text] by lottery, but they already have a special role."))
return 0
if(!(flags & ANTAG_OVERRIDE_JOB) && (!player.current || istype(player.current, /mob/new_player)))
- log_debug("[player.key] was selected for [role_text] by lottery, but they have not joined the game.")
+ log_debug(SPAN_DEBUG("[player.key] was selected for [role_text] by lottery, but they have not joined the game."))
return 0
pending_antagonists |= player
- log_debug("[player.key] has been selected for [role_text] by lottery.")
+ log_debug(SPAN_DEBUG("[player.key] has been selected for [role_text] by lottery."))
//Ensure that antags with ANTAG_OVERRIDE_JOB do not occupy job slots.
if(flags & ANTAG_OVERRIDE_JOB)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 1da5db3ab33..43c2f10141a 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -390,7 +390,7 @@ var/global/list/additional_antag_types = list()
if(istype(player, /mob/observer/dead) && !ghosts_only)
continue
if(!role || (player.client.prefs.be_special & role))
- log_debug("[player.key] had [antag_id] enabled, so we are drafting them.")
+ log_debug(SPAN_DEBUG("[player.key] had [antag_id] enabled, so we are drafting them."))
candidates |= player.mind
else
// Assemble a list of active players without jobbans.
@@ -401,7 +401,7 @@ var/global/list/additional_antag_types = list()
// Get a list of all the people who want to be the antagonist for this round
for(var/mob/new_player/player in players)
if(!role || (player.client.prefs.be_special & role))
- log_debug("[player.key] had [antag_id] enabled, so we are drafting them.")
+ log_debug(SPAN_DEBUG("[player.key] had [antag_id] enabled, so we are drafting them."))
candidates += player.mind
players -= player
@@ -411,7 +411,7 @@ var/global/list/additional_antag_types = list()
if(candidates.len < required_enemies)
for(var/mob/new_player/player in players)
if(player.ckey in round_voters)
- log_debug("[player.key] voted for this round, so we are drafting them.")
+ log_debug(SPAN_DEBUG("[player.key] voted for this round, so we are drafting them."))
candidates += player.mind
players -= player
break
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index bd6f9a32074..f1951021ca8 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -19,7 +19,7 @@
///////////////////////////////
/proc/spawn_meteors(var/number = 10, var/list/meteortypes, var/startSide, var/zlevel)
- log_debug("Spawning [number] meteors on the [dir2text(startSide)] of [zlevel]")
+ log_debug(SPAN_DEBUG("Spawning [number] meteors on the [dir2text(startSide)] of [zlevel]"))
for(var/i = 0; i < number; i++)
spawn_meteor(meteortypes, startSide, zlevel)
diff --git a/code/game/machinery/atm_ret_field.dm b/code/game/machinery/atm_ret_field.dm
index 433d771043c..27f890b3bdf 100644
--- a/code/game/machinery/atm_ret_field.dm
+++ b/code/game/machinery/atm_ret_field.dm
@@ -157,7 +157,7 @@
//Delete ourselves if we find extra mapped in arfgs
for(var/obj/machinery/atmospheric_field_generator/F in loc)
if(F != src)
- log_debug("Duplicate ARFGS at [x],[y],[z]")
+ log_debug(SPAN_DEBUG("Duplicate ARFGS at [x],[y],[z]"))
return INITIALIZE_HINT_QDEL
var/area/A = get_area(src)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 66b53d5da7f..a986f8e0a10 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -190,7 +190,7 @@
var/input = sanitize(input("Please choose a message to transmit to [GLOB.using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || !(usr in view(1,src)))
return
- CentCom_announce(input, usr)
+ message_centcom(input, usr)
to_chat(usr, "Message transmitted.")
log_game("[key_name(usr)] has made an IA [GLOB.using_map.boss_short] announcement: [input]")
centcomm_message_cooldown = 1
@@ -207,7 +207,7 @@
var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || !(usr in view(1,src)))
return
- Syndicate_announce(input, usr)
+ message_syndicate(input, usr)
to_chat(usr, "Message transmitted.")
log_game("[key_name(usr)] has made an illegal announcement: [input]")
centcomm_message_cooldown = 1
@@ -559,3 +559,11 @@
status_signal.data["picture_state"] = data1
frequency.post_signal(src, status_signal)
+
+//TODO: Convert to proper cooldowns. A bool for cooldowns is insanely dumb.
+/// Override the cooldown for special actions
+/// Used in places such as CentCom messaging back so that the crew can answer right away
+/obj/machinery/computer/communications/proc/override_cooldown()
+ // COOLDOWN_RESET(src, important_action_cooldown)
+ centcomm_message_cooldown = 0
+ message_cooldown = 0
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 80713ba0309..629dab4c24a 100755
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -190,7 +190,7 @@
accesses.Add(A)
else
to_chat(usr, "Invalid selection, please consult technical support if there are any issues.")
- log_debug("[key_name_admin(usr)] tried selecting an invalid guest pass terminal option.")
+ log_debug(SPAN_DEBUG("[key_name_admin(usr)] tried selecting an invalid guest pass terminal option."))
if (href_list["action"])
switch(href_list["action"])
if ("id")
diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm
index 05eee5c5e2d..66ee04edc9e 100644
--- a/code/game/machinery/embedded_controller/docking_program.dm
+++ b/code/game/machinery/embedded_controller/docking_program.dm
@@ -117,7 +117,7 @@
if(docking_codes)
var/code = signal.data["code"]
if(code != docking_codes)
- log_debug("Controller [id_tag] got request_dock but code:[code] != docking_codes:[docking_codes]")
+ log_debug(SPAN_DEBUG("Controller [id_tag] got request_dock but code:[code] != docking_codes:[docking_codes]"))
return
control_mode = MODE_SERVER
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index e4b3a05e7dd..905a3a72997 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -677,7 +677,7 @@
//Generic telecomm connectivity test proc
/proc/can_telecomm(var/atom/A, var/atom/B, var/ad_hoc = FALSE)
if(!A || !B)
- log_debug("can_telecomm(): Undefined endpoints!")
+ log_debug(SPAN_DEBUG("can_telecomm(): Undefined endpoints!"))
return FALSE
//Can't in this case, obviously!
diff --git a/code/game/objects/effects/map_effects/beam_point.dm b/code/game/objects/effects/map_effects/beam_point.dm
index 18fc7642276..aa69b3a7fe7 100644
--- a/code/game/objects/effects/map_effects/beam_point.dm
+++ b/code/game/objects/effects/map_effects/beam_point.dm
@@ -91,7 +91,7 @@ GLOBAL_LIST_EMPTY(all_beam_points)
/obj/effect/map_effect/beam_point/proc/build_beam(var/atom/beam_target)
if(!beam_target)
- log_debug("[src] ([src.type] \[[x],[y],[z]\]) failed to build its beam due to not having a target.")
+ log_debug(SPAN_DEBUG("[src] ([src.type] \[[x],[y],[z]\])[ADMIN_JMP(src)] failed to build its beam due to not having a target."))
return FALSE
var/datum/beam/new_beam = Beam(beam_target, beam_icon_state, beam_icon, beam_time, beam_max_distance, beam_type, beam_sleep_time)
@@ -103,11 +103,11 @@ GLOBAL_LIST_EMPTY(all_beam_points)
/obj/effect/map_effect/beam_point/proc/destroy_beam(var/datum/beam/B)
if(!B)
- log_debug("[src] ([src.type] \[[x],[y],[z]\]) was asked to destroy a beam that does not exist.")
+ log_debug(SPAN_DEBUG("[src] ([src.type] \[[x],[y],[z]\])[ADMIN_JMP(src)] was asked to destroy a beam that does not exist."))
return FALSE
if(!(B in my_beams))
- log_debug("[src] ([src.type] \[[x],[y],[z]\]) was asked to destroy a beam it did not own.")
+ log_debug(SPAN_DEBUG("[src] ([src.type] \[[x],[y],[z]\])[ADMIN_JMP(src)] was asked to destroy a beam it did not own."))
return FALSE
my_beams -= B
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 84eff921795..efa4a592af2 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -457,7 +457,7 @@ GLOBAL_LIST_EMPTY(PDAs)
)
else
icon = 'icons/obj/pda_old.dmi'
- log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.")
+ log_debug(SPAN_DEBUG("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen."))
/obj/item/pda/proc/can_use()
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 11cfc6a52fa..38d258a9211 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -454,7 +454,7 @@ var/list/global/tank_gauge_cache = list()
else if(pressure > TANK_RUPTURE_PRESSURE)
#ifdef FIREDBG
- log_debug("[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]")
+ log_debug(SPAN_DEBUGWARNING("[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]"))
#endif
air_contents.react()
@@ -514,7 +514,7 @@ var/list/global/tank_gauge_cache = list()
playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
leaking = 1
#ifdef FIREDBG
- log_debug("[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]")
+ log_debug(SPAN_DEBUG("[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]"))
#endif
else
integrity-= 1
diff --git a/code/game/verbs/ignore.dm b/code/game/verbs/ignore.dm
index b1187db9bd9..be565f390ec 100644
--- a/code/game/verbs/ignore.dm
+++ b/code/game/verbs/ignore.dm
@@ -42,7 +42,7 @@
/client/proc/is_key_ignored(var/key_to_check)
key_to_check = ckey(key_to_check)
if(key_to_check in prefs.ignored_players)
- if(GLOB.directory[key_to_check] in admins) // This is here so this is only evaluated if someone is actually being blocked.
+ if(GLOB.directory[key_to_check] in GLOB.admins) // This is here so this is only evaluated if someone is actually being blocked.
return 0
return 1
return 0
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c94e5e36456..302a0e52ca2 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1309,9 +1309,9 @@
output_ai_laws()
else if(href_list["adminmoreinfo"])
- var/mob/M = locate(href_list["adminmoreinfo"])
+ var/mob/M = locate(href_list["adminmoreinfo"]) in GLOB.mob_list
if(!ismob(M))
- to_chat(usr, "This can only be used on instances of type /mob")
+ to_chat(usr, "This can only be used on instances of type /mob.", confidential = TRUE)
return
var/location_description = ""
@@ -1338,9 +1338,13 @@
var/mob/living/L = M
var/status
switch (M.stat)
- if (0) status = "Alive"
- if (1) status = "Unconscious"
- if (2) status = "Dead"
+ if(CONSCIOUS)
+ status = "Alive"
+ if(UNCONSCIOUS)
+ status = "Unconscious"
+ if(DEAD)
+ status = "Dead"
+
health_description = "Status = [status]"
health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]"
else
@@ -1348,15 +1352,17 @@
//Gener
switch(M.gender)
- if(MALE,FEMALE) gender_description = "[M.gender]"
- else gender_description = "[M.gender]"
+ if(MALE, FEMALE, PLURAL)
+ gender_description = "[M.gender]"
+ else
+ gender_description = "[M.gender]"
- to_chat(src.owner, "Info about [M.name]: ")
- to_chat(src.owner, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]")
- to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];")
- to_chat(src.owner, "Location = [location_description];")
- to_chat(src.owner, "[special_role_description]")
- to_chat(src.owner, "(PM) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA)")
+ to_chat(src.owner, "Info about [M.name]: ", confidential = TRUE)
+ to_chat(src.owner, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]", confidential = TRUE)
+ to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];", confidential = TRUE)
+ to_chat(src.owner, "Location = [location_description];", confidential = TRUE)
+ to_chat(src.owner, "[special_role_description]", confidential = TRUE)
+ to_chat(src.owner, ADMIN_FULLMONTY_NONAME(M), confidential = TRUE)
else if(href_list["adminspawncookie"])
if(!check_rights(R_ADMIN|R_FUN)) return
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 84088b83f9d..2893b1dda31 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -179,7 +179,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
initiator_ckey = initiator.ckey
initiator_key_name = key_name(initiator, FALSE, TRUE)
if(initiator.current_ticket) //This is a bug
- log_debug("Multiple ahelp current_tickets")
+ log_debug(SPAN_DEBUG("Multiple ahelp current_tickets"))
initiator.current_ticket.AddInteraction("Ticket erroneously left open by code")
initiator.current_ticket.Close()
initiator.current_ticket = src
@@ -218,7 +218,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
//private
/datum/admin_help/proc/FullMonty(ref_src)
if(!ref_src)
- ref_src = "\ref[src]"
+ ref_src = "[REF(src)]"
. = ADMIN_FULLMONTY_NONAME(initiator.mob)
if(state == AHELP_ACTIVE)
. += ClosureLinks(ref_src)
@@ -226,12 +226,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
//private
/datum/admin_help/proc/ClosureLinks(ref_src)
if(!ref_src)
- ref_src = "\ref[src]"
- . = " (REJT)"
- . += " (IC)"
- . += " (CLOSE)"
- . += " (RSLVE)"
- . += " (HANDLE)"
+ ref_src = "[REF(src)]"
+ . = ADMIN_AHELP_FULLMONTY(ref_src)
//private
/datum/admin_help/proc/LinkedReplyName(ref_src)
@@ -249,9 +245,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
//won't bug irc
/datum/admin_help/proc/MessageNoRecipient(msg)
var/ref_src = "\ref[src]"
- var/chat_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [msg]"
+ var/chat_msg = SPAN_ADMINNOTICE("Ticket [TicketHref(SPAN_TOOLTIP("Open the ticket in a new window.","#[id]"), ref_src)]: [SPAN_TOOLTIP("Open a prompt to reply to this ticket.","[LinkedReplyName(ref_src)]")] [FullMonty(ref_src)]: [msg]")
- AddInteraction("[LinkedReplyName(ref_src)]: [msg]")
+ AddInteraction(SPAN_DANGER("[SPAN_TOOLTIP("Open a prompt to reply to this ticket.","[LinkedReplyName(ref_src)]")]: [msg]"))
//send this msg to all admins
for(var/client/X in GLOB.admins)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 05151dec112..b8ae5662bca 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -609,7 +609,7 @@
if("Players")
to_chat(usr, jointext(GLOB.player_list,","))
if("Admins")
- to_chat(usr, jointext(admins,","))
+ to_chat(usr, jointext(GLOB.admins,","))
if("Mobs")
to_chat(usr, jointext(GLOB.mob_list,","))
if("Living Mobs")
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index c7b3a35730b..3107e37a777 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -1,40 +1,89 @@
+/// Used by players to ask badmins to do things for them, but ICly.
/mob/verb/pray(msg as text)
set category = "IC"
set name = "Pray"
msg = sanitize(msg)
- if(!msg) return
+ if(!msg)
+ return
+ msg = copytext_char(sanitize(msg), 1, MAX_MESSAGE_LEN)
+ if(!msg)
+ return
+ // log_prayer("[src.key]/([src.name]): [msg]")
if(usr.client)
- if(msg)
- client.handle_spam_prevention(MUTE_PRAY)
- if(usr.client.prefs.muted & MUTE_PRAY)
- to_chat(usr, " You cannot pray (muted).")
- return
+ if(usr.client.prefs.muted & MUTE_PRAY)
+ to_chat(usr, SPAN_DANGER("You cannot pray (muted)."), confidential = TRUE)
+ return
+ if(src.client.handle_spam_prevention(msg, MUTE_PRAY))
+ return
- var/image/cross = image('icons/obj/storage.dmi',"bible")
- msg = "[icon2html(thing = cross, target = world)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (ST) (SMITE): [msg]"
+ var/mutable_appearance/cross = mutable_appearance('icons/obj/storage.dmi', "bible")
+ var/font_color = "purple"
+ var/prayer_type = "PRAYER"
+ var/deity
+ //TODO: Unshit this when we have some better job and trait systems. @Zandario
+ // if(usr.job == JOB_CHAPLAIN)
+ if(usr.mind.assigned_role == CHAPLAIN)
+ cross.icon_state = "bible"
+ font_color = "blue"
+ prayer_type = "CHAPLAIN PRAYER"
+ if(GLOB.deity)
+ deity = GLOB.deity
+ // else if(IS_CULTIST(usr))
+ // cross.icon_state = "tome"
+ // font_color = "red"
+ // prayer_type = "CULTIST PRAYER"
+ // deity = "Nar'Sie"
+ else if(isliving(usr))
+ // var/mob/living/L = usr
+ // if(HAS_TRAIT(L, TRAIT_SPIRITUAL))
+ if(usr.mind.isholy == TRUE)
+ cross.icon_state = "holylight"
+ font_color = "blue"
+ prayer_type = "SPIRITUAL PRAYER"
+
+ var/msg_tmp = msg
+ // GLOB.requests.pray(usr.client, msg, usr.mind.assigned_role == CHAPLAIN)
+ msg = SPAN_ADMINNOTICE("[icon2html(cross, GLOB.admins)][SPAN_BOLD("[prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)] [ADMIN_ST(src)]:")] [SPAN_LINKIFY(msg)]")
for(var/client/C in GLOB.admins)
if((R_ADMIN|R_MOD) & C.holder.rights)
if(C.is_preference_enabled(/datum/client_preference/admin/show_chat_prayers))
to_chat(C, msg)
SEND_SOUND(C, sound('sound/effects/ding.ogg'))
- to_chat(usr, "Your prayers have been received by the gods.")
- feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- //log_admin("HELP: [key_name(src)]: [msg]")
+ to_chat(usr, SPAN_INFO("You pray to the gods: \"[msg_tmp]\""), confidential = TRUE)
-/proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage)
- msg = "[uppertext(GLOB.using_map.boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, null)]) (CA) (BSA) (RPLY): [msg]"
+ feedback_add_details("admin_verb", "PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+//TODO: Reimplement IA CentcCom message, seems to have been lost to time.
+/// Used by communications consoles to message CentCom.
+/proc/message_centcom(text, mob/sender, iamessage)
+ var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN)
+ // GLOB.requests.message_centcom(sender.client, msg)
+ msg = SPAN_ADMINNOTICE("[uppertext(GLOB.using_map.boss_short)]M[iamessage ? " IA" : ""]:[ADMIN_FULLMONTY(sender)] [ADMIN_CENTCOM_REPLY(sender)]: [msg]")
+ // to_chat(GLOB.admins, msg, confidential = TRUE)
for(var/client/C in GLOB.admins)
- if((R_ADMIN|R_MOD) & C.holder.rights)
+ if((R_ADMIN | R_MOD) & C.holder.rights)
to_chat(C, msg)
SEND_SOUND(C, sound('sound/machines/signal.ogg'))
-/proc/Syndicate_announce(var/msg, var/mob/Sender)
- msg = "ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, null)]) (CA) (BSA) (RPLY): [msg]"
+ for(var/obj/machinery/computer/communications/console in GLOB.machines)
+ console.override_cooldown()
+
+
+/// Used by communications consoles to message the Syndicate
+/proc/message_syndicate(text, mob/sender)
+ var/msg = copytext_char(sanitize(text), 1, MAX_MESSAGE_LEN)
+ // GLOB.requests.message_syndicate(sender.client, msg)
+ msg = SPAN_ADMINNOTICE("ILLEGAL:[ADMIN_FULLMONTY(sender)] [ADMIN_SYNDICATE_REPLY(sender)]: [msg]")
+ // to_chat(GLOB.admins, msg, confidential = TRUE)
for(var/client/C in GLOB.admins)
- if((R_ADMIN|R_MOD) & C.holder.rights)
+ if((R_ADMIN | R_MOD) & C.holder.rights)
to_chat(C, msg)
SEND_SOUND(C, sound('sound/machines/signal.ogg'))
+
+ for(var/obj/machinery/computer/communications/console in GLOB.machines)
+ console.override_cooldown()
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 986937ea87e..29540dd6438 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -40,7 +40,7 @@
/obj/item/assembly/prox_sensor/Proximity(datum/proxfield/field, atom/movable/AM)
if(!istype(AM))
- log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).")
+ log_debug(SPAN_DEBUGINFO("DEBUG: HasProximity called with [AM] on [src] ([usr])."))
return
if (istype(AM, /obj/effect/beam))
return
diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm
index 2c8b1ecc0e1..a3d47caf12c 100644
--- a/code/modules/atmospherics/gasmixtures/reactions.dm
+++ b/code/modules/atmospherics/gasmixtures/reactions.dm
@@ -7,8 +7,8 @@
if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null)))
#ifdef FIREDBG
- log_debug("***************** FIREDBG *****************")
- log_debug("Burning [zone? zone.name : "zoneless gas_mixture"]!")
+ log_debug(SPAN_DEBUGINFO("***************** FIREDBG *****************"))
+ log_debug(SPAN_DEBUGINFO("Burning [zone? zone.name : "zoneless gas_mixture"]!"))
#endif
var/gas_fuel = 0
@@ -61,13 +61,13 @@
var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT)
#ifdef FIREDBG
- log_debug("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]")
- log_debug("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]")
- log_debug("firelevel -> [firelevel] (gas: [gas_firelevel], liquid: [liquid_firelevel])")
- log_debug("liquid_reaction_progress = [liquid_reaction_progress]")
- log_debug("gas_reaction_progress = [gas_reaction_progress]")
- log_debug("total_reaction_progress = [total_reaction_progress]")
- log_debug("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ")
+ log_debug(SPAN_DEBUGINFO("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]"))
+ log_debug(SPAN_DEBUGINFO("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]"))
+ log_debug(SPAN_DEBUGINFO("firelevel -> [firelevel] (gas: [gas_firelevel], liquid: [liquid_firelevel])"))
+ log_debug(SPAN_DEBUGINFO("liquid_reaction_progress = [liquid_reaction_progress]"))
+ log_debug(SPAN_DEBUGINFO("gas_reaction_progress = [gas_reaction_progress]"))
+ log_debug(SPAN_DEBUGINFO("total_reaction_progress = [total_reaction_progress]"))
+ log_debug(SPAN_DEBUGINFO("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; "))
#endif
//if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out
@@ -95,8 +95,8 @@
update_values()
#ifdef FIREDBG
- log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]")
- log_debug("new temperature = [temperature]; new pressure = [return_pressure()]")
+ log_debug(SPAN_DEBUGINFO("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]"))
+ log_debug(SPAN_DEBUGINFO("new temperature = [temperature]; new pressure = [return_pressure()]"))
#endif
return firelevel
diff --git a/code/modules/cargo/supplypacks/_supplypacks.dm b/code/modules/cargo/supplypacks/_supplypacks.dm
index d7b5d3e01cb..6cdee933a28 100644
--- a/code/modules/cargo/supplypacks/_supplypacks.dm
+++ b/code/modules/cargo/supplypacks/_supplypacks.dm
@@ -92,7 +92,7 @@ var/list/all_supply_groups = list("Atmospherics",
var/list/L = access
O.req_access = L.Copy()
else
- log_debug("Supply pack with invalid access restriction [access] encountered!")
+ log_debug(SPAN_DEBUGERROR("Supply pack with invalid access restriction [access] encountered!"))
/**
* spawn an object of a certain type
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index f9e7330cf00..5e83b651306 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -186,16 +186,14 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
var/connecting_admin = FALSE //because de-admined admins connecting should be treated like admins.
//Admin Authorisation
holder = admin_datums[ckey]
- var/debug_tools_allowed = FALSE //CITADEL EDIT
+ var/debug_tools_allowed = FALSE
if(holder)
GLOB.admins |= src
holder.owner = src
connecting_admin = TRUE
- //CITADEL EDIT
//if(check_rights_for(src, R_DEBUG))
if(R_DEBUG & holder?.rights) //same wiht this, check_rights when?
debug_tools_allowed = TRUE
- //END CITADEL EDIT
/*
else if(GLOB.deadmins[ckey])
verbs += /client/proc/readmin
diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm
index 2fa1d521450..2b26a723ec9 100644
--- a/code/modules/customitems/item_spawning.dm
+++ b/code/modules/customitems/item_spawning.dm
@@ -185,14 +185,14 @@
// Check for requisite ckey and character name.
if((lowertext(citem.assoc_key) != lowertext(M.ckey)) || (lowertext(citem.character_name) != lowertext(M.real_name)))
- log_debug("Custom Item: [key_name(M)] Ckey or Char name does not match.")
+ log_debug(SPAN_DEBUG("Custom Item: [key_name(M)] Ckey or Char name does not match."))
continue
// Check for required access.
var/obj/item/card/id/current_id = M.wear_id
if(citem.req_access && citem.req_access > 0)
if(!(istype(current_id) && (citem.req_access in current_id.access)))
- log_debug("Custom Item: [key_name(M)] Does not have required access.")
+ log_debug(SPAN_DEBUG("Custom Item: [key_name(M)] Does not have required access."))
continue
// Check for required job title.
@@ -204,7 +204,7 @@
has_title = 1
break
if(!has_title)
- log_debug("Custom Item: [key_name(M)] Does not have required job.")
+ log_debug(SPAN_DEBUG("Custom Item: [key_name(M)] Does not have required job."))
continue
// ID cards and PDAs are applied directly to the existing object rather than spawned fresh.
diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm
index 1e839807ef5..5e47e31df08 100644
--- a/code/modules/emoji/emoji_parse.dm
+++ b/code/modules/emoji/emoji_parse.dm
@@ -18,11 +18,11 @@
var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat)
var/tag = sheet.icon_tag("emoji-[emoji]")
if(tag)
- parsed += "[tag]" //evil way of enforcing 16x16
+ parsed += SPAN_TOOLTIP(":[emoji]:", "[tag]") //evil way of enforcing 16x16
pos = search + length(text[pos])
else if(ispath(isthisapath, /atom)) //path
var/atom/thisisanatom = isthisapath
- parsed += "[icon2html(initial(thisisanatom.icon), world, initial(thisisanatom.icon_state))]"
+ parsed += SPAN_TOOLTIP(":[isthisapath]:", "[icon2html(initial(thisisanatom.icon), world, initial(thisisanatom.icon_state))]")
pos = search + length(text[pos])
else
parsed += copytext(text, pos, search)
diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm
index f67b8943070..e7722af726d 100644
--- a/code/modules/error_handler/error_viewer.dm
+++ b/code/modules/error_handler/error_viewer.dm
@@ -116,7 +116,7 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache)
// from the same source hasn't been shown too recently
if (error_source.next_message_at <= world.time)
var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly
- //log_debug("Runtime in [e.file], line [e.line]: [html_encode(e.name)] [error_entry.make_link(viewtext)]")
+ //log_debug(SPAN_DEBUGERROR("Runtime in [e.file], line [e.line]: [html_encode(e.name)] [error_entry.make_link(viewtext)]"))
/*
var/err_msg_delay
if(config?.loaded)
diff --git a/code/modules/events/atmos_leak.dm b/code/modules/events/atmos_leak.dm
index 14e6c347923..59bf63b2c1d 100644
--- a/code/modules/events/atmos_leak.dm
+++ b/code/modules/events/atmos_leak.dm
@@ -34,7 +34,7 @@
for(var/i in 1 to 10)
var/area/A = pick(grand_list_of_areas)
if(is_area_occupied(A))
- log_debug("atmos_leak event: Rejected [A] because it is occupied.")
+ log_debug(SPAN_DEBUGWARNING("atmos_leak event: Rejected [A] because it is occupied."))
continue
// A good area, great! Lets try and pick a turf
var/list/turfs = list()
@@ -42,14 +42,14 @@
if(turf_clear(F))
turfs += F
if(turfs.len == 0)
- log_debug("atmos_leak event: Rejected [A] because it has no clear turfs.")
+ log_debug(SPAN_DEBUGWARNING("atmos_leak event: Rejected [A] because it has no clear turfs."))
continue
target_area = A
target_turf = pick(turfs)
// If we can't find a good target, give up
if(!target_area)
- log_debug("atmos_leak event: Giving up after too many failures to pick target area")
+ log_debug(SPAN_DEBUGWARNING("atmos_leak event: Giving up after too many failures to pick target area"))
kill()
return
diff --git a/code/modules/events/canister_leak.dm b/code/modules/events/canister_leak.dm
index d485d59e60a..f55277881d5 100644
--- a/code/modules/events/canister_leak.dm
+++ b/code/modules/events/canister_leak.dm
@@ -13,18 +13,18 @@
for(var/i in 1 to 10)
var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters)
if(severity <= EVENT_LEVEL_MUNDANE && area_is_occupied(get_area(C)))
- log_debug("canister_leak event: Rejecting canister [C] ([C.x],[C.y],[C.z]) because area is occupied")
+ log_debug(SPAN_DEBUGWARNING("canister_leak event: Rejecting canister [C] ([C.x],[C.y],[C.z]) because area is occupied"))
continue
// Okay lets break it
break_canister(C)
return
// If we got to here we failed to find it
- log_debug("canister_leak event: Giving up after too many failures to pick target canister")
+ log_debug(SPAN_DEBUGWARNING("canister_leak event: Giving up after too many failures to pick target canister"))
kill()
return
/datum/event/canister_leak/proc/break_canister(var/obj/machinery/portable_atmospherics/canister/C)
- log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.")
+ log_debug(SPAN_DEBUGWARNING("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed."))
C.health = 0
C.healthcheck()
diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm
index fe2d1281eb7..684f068f84a 100644
--- a/code/modules/events/electrical_storm.dm
+++ b/code/modules/events/electrical_storm.dm
@@ -46,7 +46,7 @@
if(shield_gen.deal_shield_damage(30 * severity, SHIELD_DAMTYPE_EM) <= SHIELD_BREACHED_MINOR)
return
if(!valid_apcs.len)
- log_debug("No valid APCs found for electrical storm event ship=[victim]!")
+ log_debug(SPAN_DEBUGERROR("No valid APCs found for electrical storm event ship=[victim]!"))
return
var/list/picked_apcs = list()
for(var/i=0, i< severity * 2, i++) // Up to 2/4/6 APCs per tick depending on severity
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 835ee6dbdea..c5c39a999d5 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -48,7 +48,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new next_event.event_type(next_event) // Events are added and removed from the processing queue in their New/kill procs
- log_debug("Starting event '[next_event.name]' of severity [severity_to_string[severity]].")
+ log_debug(SPAN_DEBUGINFO("Starting event '[next_event.name]' of severity [severity_to_string[severity]]."))
next_event = null // When set to null, a random event will be selected next time
else
// If not, wait for one minute, instead of one tick, before checking again.
@@ -113,7 +113,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
var/event_delay = rand(config_legacy.event_delay_lower[severity], config_legacy.event_delay_upper[severity]) * playercount_modifier
next_event_time = world.time + event_delay
- log_debug("Next event of severity [severity_to_string[severity]] in [(next_event_time - world.time)/600] minutes.")
+ log_debug(SPAN_DEBUGINFO("Next event of severity [severity_to_string[severity]] in [(next_event_time - world.time)/600] minutes."))
/datum/event_container/proc/SelectEvent()
var/datum/event_meta/EM = input("Select an event to queue up.", "Event Selection", null) as null|anything in available_events
diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm
index 0098b71fcc2..22ba75328ae 100644
--- a/code/modules/events/event_dynamic.dm
+++ b/code/modules/events/event_dynamic.dm
@@ -102,7 +102,7 @@ var/list/event_last_fired = list()
for(var/V in possibleEvents)
debug_message += "[V]:[possibleEvents[V]]"
debug_message += "|||Picked:[picked_event]"
- log_debug(debug_message)
+ log_debug(SPAN_DEBUG(debug_message))
if(!picked_event)
return
diff --git a/code/modules/events/supply_demand.dm b/code/modules/events/supply_demand.dm
index c3d8aba2778..b0454cfff01 100644
--- a/code/modules/events/supply_demand.dm
+++ b/code/modules/events/supply_demand.dm
@@ -173,7 +173,7 @@
src.type_path = type_path
src.name = initial(type_path.name)
if(!name)
- log_debug("supply_demand event: Order for thing [type_path] has no name.")
+ log_debug(SPAN_DEBUGWARNING("supply_demand event: Order for thing [type_path] has no name."))
/datum/supply_demand_order/thing/match_item(var/atom/I)
if(istype(I, type_path))
@@ -214,7 +214,7 @@
qty_need = CEILING((qty_need - amount_to_take), 1)
return 1
else
- log_debug("supply_demand event: not taking reagent '[reagent_id]': [amount_to_take]")
+ log_debug(SPAN_DEBUGWARNING("supply_demand event: not taking reagent '[reagent_id]': [amount_to_take]"))
return
//
@@ -240,14 +240,14 @@
if(!canmix || canmix.total_moles <= 0)
return
if(canmix.return_pressure() < mixture.return_pressure())
- log_debug("supply_demand event: canister fails to match [canmix.return_pressure()] kPa < [mixture.return_pressure()] kPa")
+ log_debug(SPAN_DEBUGWARNING("supply_demand event: canister fails to match [canmix.return_pressure()] kPa < [mixture.return_pressure()] kPa"))
return
// Make sure ratios are equal
for(var/gas in mixture.gas)
var/targetPercent = round((mixture.gas[gas] / mixture.total_moles) * 100)
var/canPercent = round((canmix.gas[gas] / canmix.total_moles) * 100)
if(abs(targetPercent-canPercent) > 1)
- log_debug("supply_demand event: canister fails to match because '[gas]': [canPercent] != [targetPercent]")
+ log_debug(SPAN_DEBUGWARNING("supply_demand event: canister fails to match because '[gas]': [canPercent] != [targetPercent]"))
return // Fail!
// Huh, it actually matches!
qty_need -= 1
diff --git a/code/modules/gamemaster/actions/atmos_leak.dm b/code/modules/gamemaster/actions/atmos_leak.dm
index b9c09091b70..63f7546fc04 100644
--- a/code/modules/gamemaster/actions/atmos_leak.dm
+++ b/code/modules/gamemaster/actions/atmos_leak.dm
@@ -35,7 +35,7 @@
for(var/i in 1 to 10)
var/area/A = pick(grand_list_of_areas)
if(is_area_occupied(A))
- log_debug("atmos_leak event: Rejected [A] because it is occupied.")
+ log_debug(SPAN_DEBUGWARNING("atmos_leak event: Rejected [A] because it is occupied."))
continue
// A good area, great! Lets try and pick a turf
var/list/turfs = list()
@@ -43,14 +43,14 @@
if(turf_clear(F))
turfs += F
if(turfs.len == 0)
- log_debug("atmos_leak event: Rejected [A] because it has no clear turfs.")
+ log_debug(SPAN_DEBUGWARNING("atmos_leak event: Rejected [A] because it has no clear turfs."))
continue
target_area = A
target_turf = pick(turfs)
// If we can't find a good target, give up
if(!target_area)
- log_debug("atmos_leak event: Giving up after too many failures to pick target area")
+ log_debug(SPAN_DEBUGWARNING("atmos_leak event: Giving up after too many failures to pick target area"))
return
/datum/gm_action/atmos_leak/announce()
diff --git a/code/modules/gamemaster/actions/blob.dm b/code/modules/gamemaster/actions/blob.dm
index dd9939a11de..7a42937733c 100644
--- a/code/modules/gamemaster/actions/blob.dm
+++ b/code/modules/gamemaster/actions/blob.dm
@@ -28,20 +28,20 @@
for(var/i in 1 to 10)
var/area/A = pick(grand_list_of_areas)
if(is_area_occupied(A))
- log_debug("Blob infestation event: Rejected [A] because it is occupied.")
+ log_debug(SPAN_DEBUGWARNING("Blob infestation event: Rejected [A] because it is occupied."))
continue
var/list/turfs = list()
for(var/turf/simulated/floor/F in A)
if(turf_clear(F))
turfs += F
if(turfs.len == 0)
- log_debug("Blob infestation event: Rejected [A] because it has no clear turfs.")
+ log_debug(SPAN_DEBUGWARNING("Blob infestation event: Rejected [A] because it has no clear turfs."))
continue
target_area = A
target_turf = pick(turfs)
if(!target_area)
- log_debug("Blob infestation event: Giving up after too many failures to pick target area")
+ log_debug(SPAN_DEBUGWARNING("Blob infestation event: Giving up after too many failures to pick target area"))
/datum/gm_action/blob/start()
..()
diff --git a/code/modules/gamemaster/actions/canister_leak.dm b/code/modules/gamemaster/actions/canister_leak.dm
index 5e8e0a08195..31e172ece8b 100644
--- a/code/modules/gamemaster/actions/canister_leak.dm
+++ b/code/modules/gamemaster/actions/canister_leak.dm
@@ -18,7 +18,7 @@
if(!C.destroyed && (C.z in GLOB.using_map.station_levels) && C.air_contents.total_moles >= MOLES_CELLSTANDARD)
all_canisters += C
var/obj/machinery/portable_atmospherics/canister/C = pick(all_canisters)
- log_debug("canister_leak event: Canister [C] ([C.x],[C.y],[C.z]) destroyed.")
+ log_debug(SPAN_DEBUGWARNING("canister_leak event: Canister [ADMIN_JMP(C)]) destroyed."))
C.health = 0
C.healthcheck()
return
diff --git a/code/modules/gamemaster/actions/stowaway.dm b/code/modules/gamemaster/actions/stowaway.dm
index 7526f207f1e..f9e8be5714c 100644
--- a/code/modules/gamemaster/actions/stowaway.dm
+++ b/code/modules/gamemaster/actions/stowaway.dm
@@ -34,7 +34,7 @@
for(var/i in 1 to 10)
var/area/A = pick(grand_list_of_areas)
if(is_area_occupied(A))
- log_debug("[name] event: Rejected [A] because it is occupied.")
+ log_debug(SPAN_DEBUGWARNING("[name] event: Rejected [A] because it is occupied."))
continue
// A good area, great! Lets try and pick a turf
var/list/turfs = list()
@@ -42,13 +42,13 @@
if(turf_clear(F))
turfs += F
if(turfs.len == 0)
- log_debug("[name] event: Rejected [A] because it has no clear turfs.")
+ log_debug(SPAN_DEBUGWARNING("[name] event: Rejected [A] because it has no clear turfs."))
continue
target_area = A
target_turf = pick(turfs)
if(!target_area)
- log_debug("[name] event: Giving up after too many failures to pick target area")
+ log_debug(SPAN_DEBUGWARNING("[name] event: Giving up after too many failures to pick target area"))
return
/datum/gm_action/stowaway/start()
diff --git a/code/modules/gamemaster/actions/swarmboarder.dm b/code/modules/gamemaster/actions/swarmboarder.dm
index e387b741909..3e0b4081d6b 100644
--- a/code/modules/gamemaster/actions/swarmboarder.dm
+++ b/code/modules/gamemaster/actions/swarmboarder.dm
@@ -34,7 +34,7 @@
for(var/i in 1 to 10)
var/area/A = pick(grand_list_of_areas)
if(is_area_occupied(A))
- log_debug("[name] event: Rejected [A] because it is occupied.")
+ log_debug(SPAN_DEBUG("[name] event: Rejected [A] because it is occupied."))
continue
// A good area, great! Lets try and pick a turf
var/list/turfs = list()
@@ -42,13 +42,13 @@
if(turf_clear(F))
turfs += F
if(turfs.len == 0)
- log_debug("[name] event: Rejected [A] because it has no clear turfs.")
+ log_debug(SPAN_DEBUG("[name] event: Rejected [A] because it has no clear turfs."))
continue
target_area = A
target_turf = pick(turfs)
if(!target_area)
- log_debug("[name] event: Giving up after too many failures to pick target area")
+ log_debug(SPAN_DEBUG("[name] event: Giving up after too many failures to pick target area"))
return
/datum/gm_action/swarm_boarder/start()
diff --git a/code/modules/holomap/station_holomap.dm b/code/modules/holomap/station_holomap.dm
index ec01195fbba..f91273cc611 100644
--- a/code/modules/holomap/station_holomap.dm
+++ b/code/modules/holomap/station_holomap.dm
@@ -86,7 +86,7 @@
// couldn't really walk into us anyway. But in reality we are on the turf in front of the wall, so bumping
// against where we seem is actually trying to *exit* our real loc
/obj/machinery/station_map/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
- // log_debug("[src] (dir=[dir]) CheckExit([mover], [target]) get_dir() = [get_dir(target, loc)]")
+ // log_debug(SPAN_DEBUG("[src] (dir=[dir]) CheckExit([mover], [target]) get_dir() = [get_dir(target, loc)]"))
if(get_dir(target, loc) == dir) // Opposite of "normal" since we are visually in the next turf over
return FALSE
else
diff --git a/code/modules/hydroponics/seed_gene_mut.dm b/code/modules/hydroponics/seed_gene_mut.dm
index 09147c72b90..673f3df1889 100644
--- a/code/modules/hydroponics/seed_gene_mut.dm
+++ b/code/modules/hydroponics/seed_gene_mut.dm
@@ -1,6 +1,6 @@
/datum/seed/proc/diverge_mutate_gene(var/decl/plantgene/G, var/turf/T)
if(!istype(G))
- log_debug("Attempted to mutate [src] with a non-plantgene var.")
+ log_debug(SPAN_DEBUG("Attempted to mutate [src] with a non-plantgene var."))
return src
var/datum/seed/S = diverge() //Let's not modify all of the seeds.
diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm
index 69171c0bc62..8d9867a206c 100644
--- a/code/modules/keybindings/setup.dm
+++ b/code/modules/keybindings/setup.dm
@@ -26,7 +26,7 @@
if(!SSinput.initialized)
to_chat(src, "Input hasn't been initialized yet. Wait a while.")
return
- log_debug("[src] reset their keybindings.")
+ log_debug(SPAN_DEBUG("[src] reset their keybindings."))
to_chat(src, "Force-reasserting all macros.")
set_macros(prefs)
diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm
index 772c380e880..8c9e770095b 100644
--- a/code/modules/language/language.dm
+++ b/code/modules/language/language.dm
@@ -231,7 +231,7 @@
/mob/proc/can_speak(datum/language/speaking)
//Prevents someone from speaking a null language.
if(!speaking)
- log_debug("[src] attempted to speak a null language.")
+ log_debug(SPAN_DEBUG("[src] attempted to speak a null language."))
return 0
if(speaking == SScharacters.resolve_language_name("Noise"))
diff --git a/code/modules/maps/tether/levels/alienship.dm b/code/modules/maps/tether/levels/alienship.dm
index a117803b427..7199c85bc5e 100644
--- a/code/modules/maps/tether/levels/alienship.dm
+++ b/code/modules/maps/tether/levels/alienship.dm
@@ -133,7 +133,7 @@
if(isliving(mob) && get_area(mob) == src)
abduct(mob)
catch
- log_debug("Problem doing [mob] for Alienship arrival teleport!")
+ log_debug(SPAN_DEBUG("Problem doing [mob] for Alienship arrival teleport!"))
did_entry = TRUE
diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm
index ab9731ea993..18a6b1041da 100644
--- a/code/modules/maps/tg/map_template.dm
+++ b/code/modules/maps/tg/map_template.dm
@@ -149,14 +149,14 @@
/datum/map_template/proc/annihilate_bounds(turf/origin, centered = FALSE, orientation = SOUTH)
var/deleted_atoms = 0
- log_debug("Annihilating objects in submap loading locatation.")
+ log_debug(SPAN_DEBUG("Annihilating objects in submap loading locatation."))
var/list/turfs_to_clean = get_affected_turfs(origin, centered, orientation)
if(turfs_to_clean.len)
for(var/turf/T in turfs_to_clean)
for(var/atom/movable/AM in T)
++deleted_atoms
qdel(AM)
- log_debug("Annihilated [deleted_atoms] objects.")
+ log_debug(SPAN_DEBUG("Annihilated [deleted_atoms] objects."))
// For your ever biggening badminnery kevinz000
@@ -176,7 +176,7 @@
var/turf/T = locate(1, 1, zl)
if(!T)
CRASH("Z level [zl] does not exist - Not generating submaps")
- log_debug("Seeding submaps for levels [english_list(z_levels)] with budget [budget], whitelist [whitelist] and template type [desired_map_template_type]")
+ log_debug(SPAN_DEBUG("Seeding submaps for levels [english_list(z_levels)] with budget [budget], whitelist [whitelist] and template type [desired_map_template_type]"))
var/overall_sanity = 100 // If the proc fails to place a submap more than this, the whole thing aborts.
var/list/potential_submaps = list() // Submaps we may or may not place.
@@ -200,7 +200,7 @@
var/list/loaded_submap_names = list()
var/list/template_groups_used = list() // Used to avoid spawning three seperate versions of the same PoI.
- log_debug("[potential_submaps.len] potential with [priority_submaps.len] priority maps. Beginning placement.")
+ log_debug(SPAN_DEBUG("[potential_submaps.len] potential with [priority_submaps.len] priority maps. Beginning placement."))
// Now lets start choosing some.
while(budget > 0 && overall_sanity > 0)
@@ -214,7 +214,7 @@
chosen_template = pick(potential_submaps)
else // We're out of submaps.
- log_debug("Submap loader had no submaps to pick from with [budget] left to spend.")
+ log_debug(SPAN_DEBUG("Submap loader had no submaps to pick from with [budget] left to spend."))
break
CHECK_TICK
@@ -256,7 +256,7 @@
if(!valid)
continue
- log_debug("Submap \"[chosen_template.name]\" placed at ([T.x], [T.y], [T.z])")
+ log_debug(SPAN_DEBUG("Submap \"[chosen_template.name]\" placed at ([T.x], [T.y], [T.z])[ADMIN_JMP(T)]"))
// Do loading here.
chosen_template.load(T, centered = TRUE, orientation=orientation) // This is run before the main map's initialization routine, so that can initilize our submaps for us instead.
@@ -294,7 +294,7 @@
pretty_submap_list += "[submap_name]"
if(!overall_sanity)
- log_debug("Submap loader gave up with [budget] left to spend.")
+ log_debug(SPAN_DEBUG("Submap loader gave up with [budget] left to spend."))
else
- log_debug("Submaps loaded.")
- log_debug("Loaded: [english_list(pretty_submap_list)]")
+ log_debug(SPAN_DEBUG("Submaps loaded."))
+ log_debug(SPAN_DEBUG("Loaded: [english_list(pretty_submap_list)]"))
diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm
index b110451c760..189e6a85a7b 100644
--- a/code/modules/media/mediamanager.dm
+++ b/code/modules/media/mediamanager.dm
@@ -25,7 +25,7 @@
// Stop media when the round ends. I guess so it doesn't play forever or something (for some reason?)
/hook/roundend/proc/stop_all_media()
- log_debug("Stopping all playing media...")
+ log_debug(SPAN_DEBUG("Stopping all playing media..."))
// Stop all music.
for(var/mob/M in GLOB.mob_list)
if(M && M.client)
diff --git a/code/modules/metric/activity.dm b/code/modules/metric/activity.dm
index 6773c77fd46..22834ac19bd 100644
--- a/code/modules/metric/activity.dm
+++ b/code/modules/metric/activity.dm
@@ -40,13 +40,13 @@
var/list/activity = list()
for(var/department in departments)
activity[department] = assess_department(department)
-// log_debug("Assessing department [department]. They have activity of [activity[department]].")
+// log_debug(SPAN_DEBUG("Assessing department [department]. They have activity of [activity[department]]."))
var/list/most_active_departments = list() // List of winners.
var/highest_activity = null // Department who is leading in activity, if one exists.
var/highest_number = 0 // Activity score needed to beat to be the most active department.
for(var/i = 1, i <= cutoff_number, i++)
-// log_debug("Doing [i]\th round of counting.")
+// log_debug(SPAN_DEBUG("Doing [i]\th round of counting."))
for(var/department in activity)
if(department in department_blacklist) // Blacklisted?
continue
@@ -57,7 +57,7 @@
if(highest_activity) // Someone's a winner.
most_active_departments.Add(highest_activity) // Add to the list of most active.
activity.Remove(highest_activity) // Remove them from the other list so they don't win more than once.
-// log_debug("[highest_activity] has won the [i]\th round of activity counting.")
+// log_debug(SPAN_DEBUG("[highest_activity] has won the [i]\th round of activity counting."))
highest_activity = null // Now reset for the next round.
highest_number = 0
//todo: finish
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 2c546338edf..f6bb14d8e60 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -22,7 +22,7 @@
if (machine)
machine.console = src
else
- log_debug("Ore processing machine console at [src.x], [src.y], [src.z] could not find its machine!")
+ log_debug(SPAN_DEBUG("Ore processing machine console at [src.x], [src.y], [src.z] [ADMIN_JMP(src)] could not find its machine!"))
qdel(src)
/obj/machinery/mineral/processing_unit_console/Destroy()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index e6374b3feec..fc530599258 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -875,18 +875,18 @@
nutrition -= 2
var/recovery_amt = max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
//to_chat(world, "Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
-// log_debug("Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
+// log_debug(SPAN_DEBUG("Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]"))
bodytemperature += recovery_amt
else if(species.cold_level_1 <= bodytemperature && bodytemperature <= species.heat_level_1)
var/recovery_amt = body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR
//to_chat(world, "Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
-// log_debug("Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
+// log_debug(SPAN_DEBUG("Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]"))
bodytemperature += recovery_amt
else if(bodytemperature > species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
adjust_hydration(-(10 * DEFAULT_THIRST_FACTOR)) //Sweating
var/recovery_amt = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
//to_chat(world, "Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
-// log_debug("Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
+// log_debug(SPAN_DEBUG("Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]"))
bodytemperature += recovery_amt
//This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, UPPER_TORSO, LOWER_TORSO, etc. See setup.dm for the full list)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index c13a4654555..a13f2e753cf 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -464,7 +464,7 @@ var/list/ai_verbs_default = list(
var/input = sanitize(input(usr, "Please choose a message to transmit to [GLOB.using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input)
return
- CentCom_announce(input, usr)
+ message_centcom(input, usr)
to_chat(usr, "Message transmitted.")
log_game("[key_name(usr)] has made an IA [GLOB.using_map.boss_short] announcement: [input]")
emergency_message_cooldown = 1
diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm
index 840df72e62c..9822b6f13c3 100644
--- a/code/modules/modular_computers/file_system/programs/command/comm.dm
+++ b/code/modules/modular_computers/file_system/programs/command/comm.dm
@@ -150,7 +150,7 @@
var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text)
if(!input || !can_still_topic())
return 1
- Syndicate_announce(input, usr)
+ message_syndicate(input, usr)
to_chat(usr, "Message transmitted.")
log_say("[key_name(usr)] has made an illegal announcement: [input]")
centcomm_message_cooldown = 1
@@ -168,7 +168,7 @@
var/input = sanitize(input("Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text)
if(!input || !can_still_topic())
return 1
- CentCom_announce(input, usr)
+ message_centcom(input, usr)
to_chat(usr, "Message transmitted.")
log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]")
centcomm_message_cooldown = 1
diff --git a/code/modules/multiz/turf_obj_hooks.dm b/code/modules/multiz/turf_obj_hooks.dm
index 072d1cf8d95..38f1f7b29e0 100644
--- a/code/modules/multiz/turf_obj_hooks.dm
+++ b/code/modules/multiz/turf_obj_hooks.dm
@@ -5,7 +5,7 @@
if(SSopenspace.initialized && !AM.invisibility && isobj(AM))
var/turf/T = GetAbove(src)
if(isopenturf(T))
- // log_debug("[T] ([T.x],[T.y],[T.z]) queued for update for [src].Entered([AM])")
+ // log_debug(SPAN_DEBUGINFO("[T][ADMIN_JMP(T)] ([T.x],[T.y],[T.z]) queued for update for [src].Entered([AM])"))
SSopenspace.add_turf(T, 1)
/turf/Exited(atom/movable/AM)
@@ -13,19 +13,19 @@
if(SSopenspace.initialized && !AM.invisibility && isobj(AM))
var/turf/T = GetAbove(src)
if(isopenturf(T))
- // log_debug("[T] ([T.x],[T.y],[T.z]) queued for update for [src].Exited([AM])")
+ // log_debug(SPAN_DEBUGINFO("[T][ADMIN_JMP(T)] ([T.x],[T.y],[T.z]) queued for update for [src].Exited([AM])"))
SSopenspace.add_turf(T, 1)
-///Updates the icon of the obj
+/// Updates the icon of the obj.
/obj/update_icon()
. = ..()
if(SSopenspace.initialized && !invisibility && isturf(loc))
var/turf/T = GetAbove(src)
if(isopenturf(T))
- // log_debug("[T] ([T.x],[T.y],[T.z]) queued for update for [src].update_icon()")
+ // log_debug(SPAN_DEBUGINFO("[T][ADMIN_JMP(T)] ([T.x],[T.y],[T.z]) queued for update for [src].update_icon()"))
SSopenspace.add_turf(T, 1)
-///Just as New() we probably should hook Destroy() If we can think of something more efficient, lets hear it.
+/// Just as New() we probably should hook Destroy() If we can think of something more efficient, lets hear it.
/obj/Destroy()
if(SSopenspace.initialized && !invisibility && isturf(loc))
var/turf/T = GetAbove(src)
diff --git a/code/modules/overmap/champagne.dm b/code/modules/overmap/champagne.dm
index 4d620ed188d..df7244796b4 100644
--- a/code/modules/overmap/champagne.dm
+++ b/code/modules/overmap/champagne.dm
@@ -89,7 +89,7 @@
var/obj/effect/overmap/visitable/ship/landable/champagne/newship = new(start_loc, shuttle_name, shuttle_name)
// It automatically registers itself with SSshuttle
- log_debug("Created new ship [newship] for shuttle [shuttle] at landmark [starting_landmark]")
+ log_debug(SPAN_DEBUGINFO("Created new ship [newship] for shuttle [shuttle] at landmark [starting_landmark]"))
return shuttle
//
diff --git a/code/modules/overmap/events/event_handler.dm b/code/modules/overmap/events/event_handler.dm
index 0eb2e1b837c..02495d9e048 100644
--- a/code/modules/overmap/events/event_handler.dm
+++ b/code/modules/overmap/events/event_handler.dm
@@ -24,7 +24,7 @@ GLOBAL_DATUM_INIT(overmap_event_handler, /decl/overmap_event_handler, new)
break
var/overmap_event_type = pick(subtypesof(/datum/overmap_event))
var/datum/overmap_event/datum_spawn = new overmap_event_type
- log_debug("Generating cloud of [datum_spawn.count] [datum_spawn] overmap event hazards")
+ log_debug(SPAN_DEBUGINFO("Generating cloud of [datum_spawn.count] [datum_spawn] overmap event hazards"))
var/list/event_turfs = acquire_event_turfs(datum_spawn.count, datum_spawn.radius, candidate_turfs, datum_spawn.continuous)
candidate_turfs -= event_turfs
diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm
index 7203a418e99..0a870378b97 100644
--- a/code/modules/planet/weather.dm
+++ b/code/modules/planet/weather.dm
@@ -65,7 +65,7 @@
// Updating the sun should be done sparingly.
if(old_light_modifier && current_weather.light_modifier != old_light_modifier)
our_planet.update_sun()
- log_debug("[our_planet.name]'s weather is now [new_weather], with a temperature of [temperature]°K ([temperature - T0C]°C | [temperature * 1.8 - 459.67]°F).")
+ log_debug(SPAN_DEBUGINFO("[our_planet.name]'s weather is now [new_weather], with a temperature of [temperature]°K ([temperature - T0C]°C | [temperature * 1.8 - 459.67]°F)."))
/datum/weather_holder/process(delta_time)
@@ -128,7 +128,7 @@
/// Get a suitable weather pattern to shift to from this one.
var/new_weather = get_next_weather(W)
forecast += new_weather
- log_debug("[our_planet.name]'s weather forecast is now '[english_list(forecast, and_text = " then ", final_comma_text = ", ")]'.")
+ log_debug(SPAN_DEBUGINFO("[our_planet.name]'s weather forecast is now '[english_list(forecast, and_text = " then ", final_comma_text = ", ")]'."))
/**
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index d11240040a1..79c9bcf1c3c 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -1231,7 +1231,7 @@ GLOBAL_LIST_EMPTY(apcs)
main_status = 2
if(debug)
- log_debug("Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light] - Longterm: [longtermpower]")
+ log_debug(SPAN_DEBUGINFO("Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light] - Longterm: [longtermpower]"))
if(cell && !shorted && !grid_check)
// draw power from cell as before to power the area
diff --git a/code/modules/preferences/preference_setup/global/02_settings.dm b/code/modules/preferences/preference_setup/global/02_settings.dm
index b39b7e24545..d4ab179e8c4 100644
--- a/code/modules/preferences/preference_setup/global/02_settings.dm
+++ b/code/modules/preferences/preference_setup/global/02_settings.dm
@@ -127,7 +127,7 @@
if(!client)
return FALSE
if(!client.prefs)
- log_debug("Client prefs found to be null for mob [src] and client [ckey], this should be investigated.")
+ log_debug(SPAN_DEBUGWARNING("Client prefs found to be null for mob [src] and client [ckey], this should be investigated."))
return FALSE
return client.set_preference(preference, set_preference)
diff --git a/code/modules/preferences/preference_setup/global/03_pai.dm b/code/modules/preferences/preference_setup/global/03_pai.dm
index 6e3acd9f496..33ca79e41f6 100644
--- a/code/modules/preferences/preference_setup/global/03_pai.dm
+++ b/code/modules/preferences/preference_setup/global/03_pai.dm
@@ -25,7 +25,7 @@
/datum/category_item/player_setup_item/player_global/pai/content(datum/preferences/prefs, mob/user, data)
. += "pAI:
"
if(!candidate)
- log_debug("[user] pAI prefs have a null candidate var.")
+ log_debug(SPAN_DEBUGWARNING("[user] pAI prefs have a null candidate var."))
return .
. += "Name: [candidate.name ? candidate.name : "None Set"]
"
. += "Description: [candidate.description ? TextPreview(candidate.description, 40) : "None Set"]
"
diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm
index ea1fa7e62bc..9c8999d3976 100644
--- a/code/modules/resleeving/designer.dm
+++ b/code/modules/resleeving/designer.dm
@@ -58,7 +58,7 @@
nano_ui_interact(user)
/obj/machinery/computer/transhuman/designer/nano_ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- // log_debug("designer.nano_ui_interact([user], force_open = [force_open])")
+ // log_debug(SPAN_DEBUG("designer.nano_ui_interact([user], force_open = [force_open])"))
user.set_machine(src)
var/data[0]
@@ -253,7 +253,7 @@
/obj/machinery/computer/transhuman/designer/proc/update_preview_mob(var/mob/living/carbon/human/H)
ASSERT(!QDELETED(H))
ASSERT(!QDELETED(active_br))
- //log_debug("designer.update_preview_mob([H]) active_br = \ref[active_br]")
+ //log_debug(SPAN_DEBUG("designer.update_preview_mob([H]) active_br = \ref[active_br]"))
//Get the DNA and generate a new mob
var/datum/dna2/record/R = active_br.mydna
H.set_species(R.dna.species) // This needs to happen before anything else becuase it sets some variables.
diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm
index 03a9b6bfc90..c9fe0b69565 100644
--- a/code/modules/shieldgen/shield_generator.dm
+++ b/code/modules/shieldgen/shield_generator.dm
@@ -221,7 +221,7 @@
for(var/obj/effect/shield/S in startends)
var/adjacent = startends[S]
- log_debug("Processing startend [S] at [S?.x],[S?.y] adjacent=[adjacent]")
+ log_debug(SPAN_DEBUGINFO("Processing startend [S] at [S?.x],[S?.y] adjacent=[adjacent]"))
var/turf/T = get_step(S, adjacent)
var/obj/effect/shield/SO = locate() in T
S.setDir(SO.dir)
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index dc37939e6f7..b2575d846e0 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -66,7 +66,7 @@
else
current_location = SSshuttle.get_landmark(current_location)
if(!istype(current_location))
- log_debug("UM whoops, no initial? [src]")
+ log_debug(SPAN_DEBUGERROR("UM whoops, no initial? [src]"))
CRASH("Shuttle '[name]' could not find its starting location landmark [current_location].")
if(src.name in SSshuttle.shuttles)
diff --git a/code/modules/shuttles/web_datums.dm b/code/modules/shuttles/web_datums.dm
index 656eaadba13..b8c94c7a7b0 100644
--- a/code/modules/shuttles/web_datums.dm
+++ b/code/modules/shuttles/web_datums.dm
@@ -72,7 +72,7 @@
/datum/shuttle_destination/New(var/new_master)
my_landmark = SSshuttle.get_landmark(my_landmark)
if(!my_landmark)
- log_debug("Web shuttle destination '[name]' could not find its landmark '[my_landmark]'.")
+ log_debug(SPAN_DEBUGERROR("Web shuttle destination '[name]' could not find its landmark '[my_landmark]'."))
master = new_master
/datum/shuttle_destination/Destroy()
diff --git a/code/modules/species/promethean/promethean_blob.dm b/code/modules/species/promethean/promethean_blob.dm
index f5559c05798..70c4b35c40f 100644
--- a/code/modules/species/promethean/promethean_blob.dm
+++ b/code/modules/species/promethean/promethean_blob.dm
@@ -76,7 +76,7 @@
update_icon()
if(!humanform) // If we somehow have a blob with no human, lets just clean up.
- log_debug("Cleaning up blob with no prommie!")
+ log_debug(SPAN_DEBUGINFO("Cleaning up blob with no prommie!"))
qdel(src)
return
@@ -500,4 +500,3 @@
else if(humanform.say_understands(other, speaking)) //So they're speaking something other than promethean or sign, let's just ask our original mob if it understands
return TRUE
else return FALSE
-
diff --git a/code/modules/species/protean/protean_powers.dm b/code/modules/species/protean/protean_powers.dm
index 0b14de8182e..a4da7d29086 100644
--- a/code/modules/species/protean/protean_powers.dm
+++ b/code/modules/species/protean/protean_powers.dm
@@ -169,7 +169,7 @@
regenerate_icons() //Probably worth it, yeah.
var/obj/item/organ/internal/nano/refactory/new_refactory = locate() in internal_organs
if(!new_refactory)
- log_debug("[src] protean-regen'd but lacked a refactory when done.")
+ log_debug(SPAN_DEBUGWARNING("[src] protean-regen'd but lacked a refactory when done."))
else
new_refactory.materials = holder
to_chat(src, "Your refactoring is complete.") //Guarantees the message shows no matter how bad the timing.
diff --git a/code/modules/species/shadekin/shadekin_abilities.dm b/code/modules/species/shadekin/shadekin_abilities.dm
index e6c83bc38bd..e71aacdf403 100644
--- a/code/modules/species/shadekin/shadekin_abilities.dm
+++ b/code/modules/species/shadekin/shadekin_abilities.dm
@@ -62,7 +62,7 @@
if(watcher>0)
ability_cost = ability_cost + ( 15 * watcher )
if(!(ability_flags & AB_PHASE_SHIFTED))
- log_debug("[src] attempted to shift with [watcher] visible Carbons with a cost of [ability_cost] in a darkness level of [darkness]")
+ log_debug(SPAN_DEBUGWARNING("[src] attempted to shift with [watcher] visible Carbons with a cost of [ability_cost] in a darkness level of [darkness]"))
if(!(ability_flags & AB_PHASE_SHIFTED))
shadekin_adjust_energy(-ability_cost)
diff --git a/code/modules/tgui/modules/communications.dm b/code/modules/tgui/modules/communications.dm
index 76c86990e1c..054c01709c4 100644
--- a/code/modules/tgui/modules/communications.dm
+++ b/code/modules/tgui/modules/communications.dm
@@ -346,7 +346,7 @@
if(length(input) < COMM_CCMSGLEN_MINIMUM)
to_chat(usr, SPAN_WARNING("Message '[input]' is too short. [COMM_CCMSGLEN_MINIMUM] character minimum."))
return
- CentCom_announce(input, usr)
+ message_centcom(input, usr)
to_chat(usr, SPAN_NOTICE("Message transmitted."))
log_game("[key_name(usr)] has made an IA [using_map.boss_short] announcement: [input]")
centcomm_message_cooldown = world.time + 300 // 30 seconds
diff --git a/code/modules/turbolift/turbolift_floor.dm b/code/modules/turbolift/turbolift_floor.dm
index 32c5ed77936..7156bf830d0 100644
--- a/code/modules/turbolift/turbolift_floor.dm
+++ b/code/modules/turbolift/turbolift_floor.dm
@@ -13,7 +13,7 @@
/datum/turbolift_floor/proc/set_area_ref(var/ref)
var/area/turbolift/A = locate(ref)
if(!istype(A))
- log_debug("Turbolift floor area was of the wrong type: ref=[ref]")
+ log_debug(SPAN_DEBUGERROR("Turbolift floor area was of the wrong type: ref=[ref]"))
return
area_ref = ref
diff --git a/code/modules/turbolift/turbolift_map.dm b/code/modules/turbolift/turbolift_map.dm
index 95c80a6bc9a..b74515bd113 100644
--- a/code/modules/turbolift/turbolift_map.dm
+++ b/code/modules/turbolift/turbolift_map.dm
@@ -131,7 +131,7 @@
var/turf/checking = locate(tx,ty,cz)
if(!istype(checking))
- log_debug("[name] cannot find a component turf at [tx],[ty] on floor [cz]. Aborting.")
+ log_debug(SPAN_DEBUGERROR("[name] cannot find a component turf at [tx],[ty] on floor [cz]. Aborting."))
qdel(src)
return
@@ -202,7 +202,7 @@
// Update area.
if(az > areas_to_use.len)
- log_debug("Insufficient defined areas in turbolift datum, aborting.")
+ log_debug(SPAN_DEBUGWARNING("Insufficient defined areas in turbolift datum, aborting."))
qdel(src)
return
diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm
index 0f6f7b0d2b5..9529769cd8e 100644
--- a/code/modules/virus2/helpers.dm
+++ b/code/modules/virus2/helpers.dm
@@ -70,10 +70,10 @@
//Attemptes to infect mob M with virus. Set forced to 1 to ignore protective clothnig
/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
if(!istype(disease))
-// log_debug("Bad virus")
+// log_debug(SPAN_DEBUGWARNING("Bad virus"))
return
if(!istype(M))
-// log_debug("Bad mob")
+// log_debug(SPAN_DEBUGWARNING("Bad mob"))
return
if ("[disease.uniqueID]" in M.virus2)
return
@@ -86,7 +86,7 @@
var/datum/disease2/disease/D = disease.getcopy()
D.minormutate()
D.resistance += rand(1,9)
-// log_debug("Adding virus")
+// log_debug(SPAN_DEBUGINFO("Adding virus"))
M.virus2["[D.uniqueID]"] = D
M.update_hud_med_status()
else
@@ -101,12 +101,12 @@
else
return //not compatible with this species
-// log_debug("Infecting [M]")
+// log_debug(SPAN_DEBUGINFO("Infecting [M]"))
if(forced || (infection_check(M, disease.spreadtype) && prob(disease.infectionchance)))
var/datum/disease2/disease/D = disease.getcopy()
D.minormutate()
-// log_debug("Adding virus")
+// log_debug(SPAN_DEBUGINFO("Adding virus"))
M.virus2["[D.uniqueID]"] = D
M.update_hud_med_status()
@@ -137,10 +137,10 @@
if (src == victim)
return "idiocy"
-// log_debug("Spreading [vector] diseases from [src] to [victim]")
+// log_debug(SPAN_DEBUGINFO("Spreading [vector] diseases from [src] to [victim]"))
if (virus2.len > 0)
for (var/ID in virus2)
-// log_debug("Attempting virus [ID]")
+// log_debug(SPAN_DEBUGINFO("Attempting virus [ID]"))
var/datum/disease2/disease/V = virus2[ID]
if(V.spreadtype != vector) continue
@@ -149,19 +149,19 @@
if (vector == "Airborne")
if(airborne_can_reach(get_turf(src), get_turf(victim)))
-// log_debug("In range, infecting")
+// log_debug(SPAN_DEBUGINFO("In range, infecting"))
infect_virus2(victim,V)
// else
-// log_debug("Could not reach target")
+// log_debug(SPAN_DEBUGWARNING("Could not reach target"))
if (vector == "Contact")
if (Adjacent(victim))
-// log_debug("In range, infecting")
+// log_debug(SPAN_DEBUGINFO("In range, infecting"))
infect_virus2(victim,V)
//contact goes both ways
if (victim.virus2.len > 0 && vector == "Contact" && Adjacent(victim))
-// log_debug("Spreading [vector] diseases from [victim] to [src]")
+// log_debug(SPAN_DEBUGINFO("Spreading [vector] diseases from [victim] to [src]"))
var/nudity = 1
if (ishuman(victim))
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index ecd83c1eb9c..c60ead1b529 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -357,12 +357,12 @@
var/list/raw_list = text2list(html_encode(raw_text),delim)
if(raw_list.len > 10)
raw_list.Cut(11)
- log_debug("[owner] tried to set [lowertext(name)] with 11+ messages")
+ log_debug(SPAN_DEBUGWARNING("[owner] tried to set [lowertext(name)] with 11+ messages"))
for(var/i = 1, i <= raw_list.len, i++)
if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
raw_list.Cut(i,i)
- log_debug("[owner] tried to set [lowertext(name)] with >121 or <10 char message")
+ log_debug(SPAN_DEBUGWARNING("[owner] tried to set [lowertext(name)] with >121 or <10 char message"))
else
raw_list[i] = readd_quotes(raw_list[i])
//Also fix % sign for var replacement
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 84853b372dd..4e14a3a3823 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -118,7 +118,7 @@
qdel(G)
return TRUE
else
- log_debug("[attacker] attempted to feed [G.affecting] to [user] ([user.type]) but it failed.")
+ log_debug(SPAN_DEBUG("[attacker] attempted to feed [G.affecting] to [user] ([user.type]) but it failed."))
///// If user clicked on their grabbed target
else if((src == G.affecting) && (attacker.a_intent == INTENT_GRAB) && (attacker.zone_sel.selecting == BP_TORSO) && (is_vore_predator(G.affecting)))
@@ -129,7 +129,7 @@
qdel(G)
return TRUE
else
- log_debug("[attacker] attempted to feed [user] to [G.affecting] ([G.affecting.type]) but it failed.")
+ log_debug(SPAN_DEBUG("[attacker] attempted to feed [user] to [G.affecting] ([G.affecting.type]) but it failed."))
///// If user clicked on anyone else but their grabbed target
else if((src != G.affecting) && (src != G.assailant) && (is_vore_predator(src)))
@@ -147,7 +147,7 @@
qdel(G)
return TRUE
else
- log_debug("[attacker] attempted to feed [G.affecting] to [src] ([src.type]) but it failed.")
+ log_debug(SPAN_DEBUG("[attacker] attempted to feed [G.affecting] to [src] ([src.type]) but it failed."))
//Handle case: /obj/item/holder
else if(istype(I,/obj/item/holder))
@@ -163,7 +163,7 @@
H.held_mob = null
return TRUE //return TRUE to exit upper procs
else
- log_debug("[attacker] attempted to feed [H.contents] to [src] ([src.type]) but it failed.")
+ log_debug(SPAN_DEBUG("[attacker] attempted to feed [H.contents] to [src] ([src.type]) but it failed."))
//Handle case: /obj/item/radio/beacon
else if(istype(I,/obj/item/radio/beacon))
@@ -475,7 +475,7 @@
/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay)
//Sanity
if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
- log_debug("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
+ log_debug(SPAN_DEBUG("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong."))
return
// The belly selected at the time of noms
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index ba45fddf4a9..a07539cec34 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -169,7 +169,7 @@
//List to JSON
var/json_TO_FILE = json_encode(settings_list)
if(!json_TO_FILE)
- log_debug("Saving: [path] failed jsonencode")
+ log_debug(SPAN_DEBUG("Saving: [path] failed jsonencode"))
return FALSE
//Write it out
@@ -178,7 +178,7 @@
fdel(path) //Byond only supports APPENDING to files, not replacing.
text2file(json_TO_FILE, path)
if(!fexists(path))
- log_debug("Saving: [path] failed file write")
+ log_debug(SPAN_DEBUG("Saving: [path] failed file write"))
return FALSE
return TRUE
diff --git a/code/modules/vore/persist/persist_vr.dm b/code/modules/vore/persist/persist_vr.dm
index bf6f91e4dbb..53722eec3f7 100644
--- a/code/modules/vore/persist/persist_vr.dm
+++ b/code/modules/vore/persist/persist_vr.dm
@@ -58,7 +58,7 @@
// For now as a safety measure we will only save if the name matches.
if(prefs.real_name != persister.real_name)
- log_debug("Persist (P4P): Skipping [persister] because ORIG:[persister.real_name] != CURR:[prefs.real_name].")
+ log_debug(SPAN_DEBUG("Persist (P4P): Skipping [persister] because ORIG:[persister.real_name] != CURR:[prefs.real_name]."))
return
return prefs
@@ -186,10 +186,10 @@
var/datum/sprite_accessory/marking/mark_datum = ML["datum"]
var/mark_color = ML["color"]
if(!istype(mark_datum) || !mark_color)
- log_debug("[character]'s organ [O] ([O.type]) has marking [list2params(ML)] with invalid/missing color/datum!")
+ log_debug(SPAN_DEBUG("[character]'s organ [O] ([O.type]) has marking [list2params(ML)] with invalid/missing color/datum!"))
continue;
if(!(mark_datum.name in body_marking_styles_list))
- log_debug("[character]'s organ [O] ([O.type]) has marking [mark_datum] which is not in body_marking_styles_list!")
+ log_debug(SPAN_DEBUG("[character]'s organ [O] ([O.type]) has marking [mark_datum] which is not in body_marking_styles_list!"))
continue;
// Note: Since datums can cover multiple organs, we may encounter it multiple times, but this is okay
// because you're only allowed to have each marking type once! If this assumption changes, obviously update this. ~Leshana
diff --git a/code/modules/xenobio2/controller.dm b/code/modules/xenobio2/controller.dm
index 120809a1b38..bd016f2928f 100644
--- a/code/modules/xenobio2/controller.dm
+++ b/code/modules/xenobio2/controller.dm
@@ -22,7 +22,7 @@ var/global/datum/controller/xenobio/xenobio_controller // Set in New().
/datum/controller/xenobio/New()
if(xenobio_controller && xenobio_controller != src)
- log_debug("Rebuilding xenobio controller.")
+ log_debug(SPAN_DEBUG("Rebuilding xenobio controller."))
qdel(xenobio_controller)
xenobio_controller = src
setup()
diff --git a/code/modules/xenobio2/mob/xeno procs.dm b/code/modules/xenobio2/mob/xeno procs.dm
index 747904f730f..631a756cfdb 100644
--- a/code/modules/xenobio2/mob/xeno procs.dm
+++ b/code/modules/xenobio2/mob/xeno procs.dm
@@ -123,7 +123,7 @@ Divergence proc, used in mutation to make unique datums.
var/complete_message = ",[language.key] [message]"
if(!(complete_message in speak))
speech_buffer.Add(complete_message)
- log_debug("Added '[complete_message]'.")
+ log_debug(SPAN_DEBUGINFO("Added '[complete_message]'."))
else
*/
if(!(message in speak))
@@ -136,8 +136,8 @@ Divergence proc, used in mutation to make unique datums.
var/chosen = pick(speech_buffer)
speak.Add(chosen)
/* Uncoment for logging of speech list.
- log_debug("Added [chosen] to speak list.")
- log_debug("Speechlist cut.") */
+ log_debug(SPAN_DEBUGINFO("Added [chosen] to speak list."))
+ log_debug(SPAN_DEBUGINFO("Speechlist cut.")) */
speech_buffer.Cut()
//
/mob/living/simple_mob/xeno/proc/BuildReagentLists()
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 63a8a7bfdb1..45651ee0592 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -105,6 +105,8 @@ h1.alert, h2.alert {color: #000000;}
.disarm {color: #990000;}
.passive {color: #660000;}
+.helpful {color: #368f31;}
+
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
.minorannounce { font-weight: bold; font-size: 3;}
diff --git a/maps/citadel_minitest/citadel_minitest_shuttles.dm b/maps/citadel_minitest/citadel_minitest_shuttles.dm
index 79f7126ed72..1a0646d0883 100644
--- a/maps/citadel_minitest/citadel_minitest_shuttles.dm
+++ b/maps/citadel_minitest/citadel_minitest_shuttles.dm
@@ -59,7 +59,7 @@
shuttle_landmark_flags = SLANDMARK_FLAG_AUTOSET
// /obj/machinery/computer/shuttle_control/power_change()
-// log_debug("[src].power_change() - area=[get_area(src)] powered=[powered(power_channel)]")
+// log_debug(SPAN_DEBUG("[src].power_change() - area=[get_area(src)] powered=[powered(power_channel)]"))
// . = ..()
diff --git a/maps/submaps/_healpers.dm b/maps/submaps/_helpers.dm
similarity index 96%
rename from maps/submaps/_healpers.dm
rename to maps/submaps/_helpers.dm
index baf6ce160c4..1ddd140230d 100644
--- a/maps/submaps/_healpers.dm
+++ b/maps/submaps/_helpers.dm
@@ -73,7 +73,7 @@
var/dir_to_use = stepoff_dir ? stepoff_dir : dir
var/turf/T = get_step(src, dir_to_use)
if(!T)
- log_debug("Fake stairs at [x],[y],[z] couldn't move someone to their destination.")
+ log_debug(SPAN_DEBUGERROR("Fake stairs at [x],[y],[z] [ADMIN_JMP(src)] couldn't move someone to their destination."))
return
AM.forceMove(T)
spawn AM.setDir(dir_to_use)
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index 823ceeb176a..1b4debd169b 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -12,7 +12,7 @@ var/list/all_maps = list()
else
M = new type
if(!M.path)
- log_debug("Map '[M]' does not have a defined path, not adding to map list!")
+ log_debug(SPAN_DEBUGERROR("Map '[M]' does not have a defined path, not adding to map list!"))
else
all_maps[M.path] = M
return 1
diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.js
index 696cef60d37..b8854627b53 100644
--- a/tgui/packages/tgui-panel/chat/constants.js
+++ b/tgui/packages/tgui-panel/chat/constants.js
@@ -26,6 +26,7 @@ export const MESSAGE_TYPE_LOCALCHAT = 'localchat';
export const MESSAGE_TYPE_RADIO = 'radio';
export const MESSAGE_TYPE_INFO = 'info';
export const MESSAGE_TYPE_WARNING = 'warning';
+export const MESSAGE_TYPE_HELPFUL = 'helpful';
export const MESSAGE_TYPE_DEADCHAT = 'deadchat';
export const MESSAGE_TYPE_OOC = 'ooc';
export const MESSAGE_TYPE_ADMINPM = 'adminpm';
@@ -108,6 +109,12 @@ export const MESSAGE_TYPES = [
description: 'Urist McTraitor has stabbed you with a knife!',
selector: '.danger',
},
+ {
+ type: MESSAGE_TYPE_HELPFUL,
+ name: 'Helpful',
+ description: 'PFC Unga Dunga starts feeding you a pill.',
+ selector: '.helpful',
+ },
{
type: MESSAGE_TYPE_UNKNOWN,
name: 'Unsorted',
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
index 4f8ee86f984..59eb99744aa 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
@@ -624,6 +624,10 @@ blockquote.nicegreen {
border-color: #059223;
}
+.helpful {
+ color: #368f31;
+}
+
/* hornichems */
.userlove {
color: #ff42a6;
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
index 61da80b7756..21d0adfd06b 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
@@ -665,6 +665,10 @@ blockquote.nicegreen {
border-color: #14a833;
}
+.helpful {
+ color: #368f31;
+}
+
.userlove {
color: #FF1493;
font-style: italic;
diff --git a/tgui/packages/tgui/components/Tooltip.tsx b/tgui/packages/tgui/components/Tooltip.tsx
index d3ae1cccbdf..62885c3b6ed 100644
--- a/tgui/packages/tgui/components/Tooltip.tsx
+++ b/tgui/packages/tgui/components/Tooltip.tsx
@@ -1,11 +1,10 @@
-
import { createPopper, Placement, VirtualElement } from '@popperjs/core';
import { Component, findDOMfromVNode, InfernoNode, render } from 'inferno';
type TooltipProps = {
children?: InfernoNode;
content: InfernoNode;
- position?: Placement,
+ position?: Placement;
};
type TooltipState = {
@@ -13,10 +12,12 @@ type TooltipState = {
};
const DEFAULT_OPTIONS = {
- modifiers: [{
- name: "eventListeners",
- enabled: false,
- }],
+ modifiers: [
+ {
+ name: 'eventListeners',
+ enabled: false,
+ },
+ ],
};
const NULL_RECT = {
@@ -37,6 +38,7 @@ export class Tooltip extends Component {
static singletonPopper: ReturnType | undefined;
static currentHoveredElement: Element | undefined;
static virtualElement: VirtualElement = {
+ // prettier-ignore
getBoundingClientRect: () => (
Tooltip.currentHoveredElement?.getBoundingClientRect()
?? NULL_RECT
@@ -62,23 +64,23 @@ export class Tooltip extends Component {
return;
}
- domNode.addEventListener("mouseenter", () => {
+ domNode.addEventListener('mouseenter', () => {
let renderedTooltip = Tooltip.renderedTooltip;
if (renderedTooltip === undefined) {
- renderedTooltip = document.createElement("div");
- renderedTooltip.className = "Tooltip";
+ renderedTooltip = document.createElement('div');
+ renderedTooltip.className = 'Tooltip';
document.body.appendChild(renderedTooltip);
Tooltip.renderedTooltip = renderedTooltip;
}
Tooltip.currentHoveredElement = domNode;
- renderedTooltip.style.opacity = "1";
+ renderedTooltip.style.opacity = '1';
this.renderPopperContent();
});
- domNode.addEventListener("mouseleave", () => {
+ domNode.addEventListener('mouseleave', () => {
this.fadeOut();
});
}
@@ -89,7 +91,7 @@ export class Tooltip extends Component {
}
Tooltip.currentHoveredElement = undefined;
- Tooltip.renderedTooltip!.style.opacity = "0";
+ Tooltip.renderedTooltip!.style.opacity = '0';
}
renderPopperContent() {
@@ -109,7 +111,7 @@ export class Tooltip extends Component {
renderedTooltip!,
{
...DEFAULT_OPTIONS,
- placement: this.props.position || "auto",
+ placement: this.props.position || 'auto',
}
);
@@ -117,13 +119,13 @@ export class Tooltip extends Component {
} else {
singletonPopper.setOptions({
...DEFAULT_OPTIONS,
- placement: this.props.position || "auto",
+ placement: this.props.position || 'auto',
});
singletonPopper.update();
}
},
- this.context,
+ this.context
);
}