diff --git a/code/citadel/_cit_helpers.dm b/code/citadel/_cit_helpers.dm
index 6e4ea762f1..db0626fa9c 100644
--- a/code/citadel/_cit_helpers.dm
+++ b/code/citadel/_cit_helpers.dm
@@ -117,7 +117,7 @@ GLOBAL_VAR_INIT(dlooc_allowed, 1)
prefs.chat_toggles ^= CHAT_LOOC
prefs.save_preferences()
src << "You will [(prefs.chat_toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel."
- feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglelooc()
set category = "Server"
@@ -126,7 +126,7 @@ GLOBAL_VAR_INIT(dlooc_allowed, 1)
toggle_looc()
log_admin("[key_name(usr)] toggled LOOC.")
message_admins("[key_name_admin(usr)] toggled LOOC.")
- feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/toggle_looc(toggle = null)
if(toggle != null) //if we're specifically en/disabling ooc
@@ -146,7 +146,7 @@ GLOBAL_VAR_INIT(dlooc_allowed, 1)
log_admin("[key_name(usr)] toggled Dead LOOC.")
message_admins("[key_name_admin(usr)] toggled Dead LOOC.")
- feedback_add_details("admin_verb","TDLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.add_details("admin_verb","TDLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/mob/living/carbon/proc/has_penis()
diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm
index 2be7139a27..3565620c88 100644
--- a/code/controllers/admin.dm
+++ b/code/controllers/admin.dm
@@ -45,9 +45,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick)
switch(controller)
if("Master")
Recreate_MC()
- feedback_add_details("admin_verb","Restart Master Controller")
+ SSblackbox.add_details("admin_verb","Restart Master Controller")
if("Failsafe")
new /datum/controller/failsafe()
- feedback_add_details("admin_verb","Restart Failsafe Controller")
+ SSblackbox.add_details("admin_verb","Restart Failsafe Controller")
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
diff --git a/code/orphaned_procs/statistics.dm b/code/controllers/subsystem/blackbox.dm
similarity index 59%
rename from code/orphaned_procs/statistics.dm
rename to code/controllers/subsystem/blackbox.dm
index d6cdcda6c1..1b14b352df 100644
--- a/code/orphaned_procs/statistics.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -1,9 +1,7 @@
-GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
-
-//the feedback datum; stores all feedback
-/datum/feedback
- var/list/messages = list()
- var/list/messages_admin = list()
+SUBSYSTEM_DEF(blackbox)
+ name = "Blackbox"
+ wait = 6000
+ flags = SS_NO_TICK_CHECK
var/list/msg_common = list()
var/list/msg_science = list()
@@ -15,21 +13,47 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
var/list/msg_syndicate = list()
var/list/msg_service = list()
var/list/msg_cargo = list()
+ var/list/msg_other = list()
- var/list/datum/feedback_variable/feedback = new()
+ var/list/feedback = list() //list of datum/feedback_variable
-/datum/feedback/proc/find_feedback_datum(variable)
- for (var/datum/feedback_variable/FV in feedback)
- if (FV.get_variable() == variable)
- return FV
- var/datum/feedback_variable/FV = new(variable)
- feedback += FV
- return FV
+//poll population
+/datum/controller/subsystem/blackbox/fire()
+ if(!SSdbcore.Connect())
+ return
+ var/playercount = 0
+ for(var/mob/M in GLOB.player_list)
+ if(M.client)
+ playercount += 1
+ var/admincount = GLOB.admins.len
+ var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')")
+ query_record_playercount.Execute()
-/datum/feedback/proc/get_round_feedback()
- return feedback
+/datum/controller/subsystem/blackbox/Recover()
+ msg_common = SSblackbox.msg_common
+ msg_science = SSblackbox.msg_science
+ msg_command = SSblackbox.msg_command
+ msg_medical = SSblackbox.msg_medical
+ msg_engineering = SSblackbox.msg_engineering
+ msg_security = SSblackbox.msg_security
+ msg_deathsquad = SSblackbox.msg_deathsquad
+ msg_syndicate = SSblackbox.msg_syndicate
+ msg_service = SSblackbox.msg_service
+ msg_cargo = SSblackbox.msg_cargo
+ msg_other = SSblackbox.msg_other
-/datum/feedback/proc/round_end_data_gathering()
+ feedback = SSblackbox.feedback
+
+//no touchie
+/datum/controller/subsystem/blackbox/can_vv_get(var_name)
+ if(var_name == "feedback")
+ return FALSE
+ return ..()
+
+/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value)
+ return FALSE
+
+/datum/controller/subsystem/blackbox/Shutdown()
var/pda_msg_amt = 0
var/rc_msg_amt = 0
@@ -39,30 +63,27 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
if (MS.rc_msgs.len > rc_msg_amt)
rc_msg_amt = MS.rc_msgs.len
- feedback_set_details("radio_usage","")
+ set_details("radio_usage","")
- feedback_add_details("radio_usage","COM-[msg_common.len]")
- feedback_add_details("radio_usage","SCI-[msg_science.len]")
- feedback_add_details("radio_usage","HEA-[msg_command.len]")
- feedback_add_details("radio_usage","MED-[msg_medical.len]")
- feedback_add_details("radio_usage","ENG-[msg_engineering.len]")
- feedback_add_details("radio_usage","SEC-[msg_security.len]")
- feedback_add_details("radio_usage","DTH-[msg_deathsquad.len]")
- feedback_add_details("radio_usage","SYN-[msg_syndicate.len]")
- feedback_add_details("radio_usage","SRV-[msg_service.len]")
- feedback_add_details("radio_usage","CAR-[msg_cargo.len]")
- feedback_add_details("radio_usage","OTH-[messages.len]")
- feedback_add_details("radio_usage","PDA-[pda_msg_amt]")
- feedback_add_details("radio_usage","RC-[rc_msg_amt]")
+ add_details("radio_usage","COM-[msg_common.len]")
+ add_details("radio_usage","SCI-[msg_science.len]")
+ add_details("radio_usage","HEA-[msg_command.len]")
+ add_details("radio_usage","MED-[msg_medical.len]")
+ add_details("radio_usage","ENG-[msg_engineering.len]")
+ add_details("radio_usage","SEC-[msg_security.len]")
+ add_details("radio_usage","DTH-[msg_deathsquad.len]")
+ add_details("radio_usage","SYN-[msg_syndicate.len]")
+ add_details("radio_usage","SRV-[msg_service.len]")
+ add_details("radio_usage","CAR-[msg_cargo.len]")
+ add_details("radio_usage","OTH-[msg_other.len]")
+ add_details("radio_usage","PDA-[pda_msg_amt]")
+ add_details("radio_usage","RC-[rc_msg_amt]")
- feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set.
+ set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set.
-//This proc is only to be called at round end.
-/datum/feedback/proc/save_all_data_to_sql()
- if (!feedback) return
+ if (!SSdbcore.Connect())
+ return
- round_end_data_gathering() //round_end time logging and some other data processing
- if (!SSdbcore.Connect()) return
var/round_id
var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]")
@@ -89,69 +110,99 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
var/datum/DBQuery/query_feedback_save = SSdbcore.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist)
query_feedback_save.Execute()
+/datum/controller/subsystem/blackbox/proc/LogBroadcast(blackbox_msg, freq)
+ switch(freq)
+ if(1459)
+ msg_common += blackbox_msg
+ if(1351)
+ msg_science += blackbox_msg
+ if(1353)
+ msg_command += blackbox_msg
+ if(1355)
+ msg_medical += blackbox_msg
+ if(1357)
+ msg_engineering += blackbox_msg
+ if(1359)
+ msg_security += blackbox_msg
+ if(1441)
+ msg_deathsquad += blackbox_msg
+ if(1213)
+ msg_syndicate += blackbox_msg
+ if(1349)
+ msg_service += blackbox_msg
+ if(1347)
+ msg_cargo += blackbox_msg
+ else
+ msg_other += blackbox_msg
-/proc/feedback_set(variable,value)
- if(!GLOB.blackbox)
- return
+/datum/controller/subsystem/blackbox/proc/find_feedback_datum(variable)
+ for(var/datum/feedback_variable/FV in feedback)
+ if(FV.get_variable() == variable)
+ return FV
- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
-
- if(!FV)
- return
+ var/datum/feedback_variable/FV = new(variable)
+ feedback += FV
+ return FV
+/datum/controller/subsystem/blackbox/proc/set_val(variable, value)
+ var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.set_value(value)
-/proc/feedback_inc(variable,value)
- if(!GLOB.blackbox)
- return
-
- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
-
- if(!FV)
- return
-
+/datum/controller/subsystem/blackbox/proc/inc(variable, value)
+ var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.inc(value)
-/proc/feedback_dec(variable,value)
- if(!GLOB.blackbox)
- return
-
- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
-
- if(!FV)
- return
-
+/datum/controller/subsystem/blackbox/proc/dec(variable,value)
+ var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.dec(value)
-/proc/feedback_set_details(variable,details)
- if(!GLOB.blackbox)
- return
-
- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
-
- if(!FV)
- return
-
+/datum/controller/subsystem/blackbox/proc/set_details(variable,details)
+ var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.set_details(details)
-/proc/feedback_add_details(variable,details)
- if(!GLOB.blackbox)
- return
-
- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
-
- if(!FV)
- return
-
+/datum/controller/subsystem/blackbox/proc/add_details(variable,details)
+ var/datum/feedback_variable/FV = find_feedback_datum(variable)
FV.add_details(details)
+/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L)
+ if(!SSdbcore.Connect())
+ return
+ if(!L || !L.key || !L.mind)
+ return
+ var/turf/T = get_turf(L)
+ var/area/placeofdeath = get_area(T.loc)
+ var/sqlname = sanitizeSQL(L.real_name)
+ var/sqlkey = sanitizeSQL(L.ckey)
+ var/sqljob = sanitizeSQL(L.mind.assigned_role)
+ var/sqlspecial = sanitizeSQL(L.mind.special_role)
+ var/sqlpod = sanitizeSQL(placeofdeath.name)
+ var/laname
+ var/lakey
+ if(L.lastattacker && ismob(L.lastattacker))
+ var/mob/LA = L.lastattacker
+ laname = sanitizeSQL(LA.real_name)
+ lakey = sanitizeSQL(LA.key)
+ var/sqlgender = sanitizeSQL(L.gender)
+ var/sqlbrute = sanitizeSQL(L.getBruteLoss())
+ var/sqlfire = sanitizeSQL(L.getFireLoss())
+ var/sqlbrain = sanitizeSQL(L.getBrainLoss())
+ var/sqloxy = sanitizeSQL(L.getOxyLoss())
+ var/sqltox = sanitizeSQL(L.getStaminaLoss())
+ var/sqlclone = sanitizeSQL(L.getStaminaLoss())
+ var/sqlstamina = sanitizeSQL(L.getStaminaLoss())
+ var/coord = sanitizeSQL("[L.x], [L.y], [L.z]")
+ var/map = sanitizeSQL(SSmapping.config.map_name)
+ var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')")
+ query_report_death.Execute()
+
+
//feedback variable datum, for storing all kinds of data
/datum/feedback_variable
var/variable
var/value
var/details
-/datum/feedback_variable/New(var/param_variable,var/param_value = 0)
+/datum/feedback_variable/New(param_variable, param_value = 0)
variable = param_variable
value = param_value
@@ -204,50 +255,3 @@ GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
/datum/feedback_variable/proc/get_parsed()
return list(variable,value,details)
-
-//sql reporting procs
-/proc/sql_poll_population()
- if(!config.sql_enabled)
- return
- if(!SSdbcore.Connect())
- return
- var/playercount = 0
- for(var/mob/M in GLOB.player_list)
- if(M.client)
- playercount += 1
- var/admincount = GLOB.admins.len
- var/datum/DBQuery/query_record_playercount = SSdbcore.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')")
- query_record_playercount.Execute()
-
-/proc/sql_report_death(mob/living/L)
- if(!config.sql_enabled)
- return
- if(!SSdbcore.Connect())
- return
- if(!L || !L.key || !L.mind)
- return
- var/turf/T = get_turf(L)
- var/area/placeofdeath = get_area(T.loc)
- var/sqlname = sanitizeSQL(L.real_name)
- var/sqlkey = sanitizeSQL(L.ckey)
- var/sqljob = sanitizeSQL(L.mind.assigned_role)
- var/sqlspecial = sanitizeSQL(L.mind.special_role)
- var/sqlpod = sanitizeSQL(placeofdeath.name)
- var/laname
- var/lakey
- if(L.lastattacker && ismob(L.lastattacker))
- var/mob/LA = L.lastattacker
- laname = sanitizeSQL(LA.real_name)
- lakey = sanitizeSQL(LA.key)
- var/sqlgender = sanitizeSQL(L.gender)
- var/sqlbrute = sanitizeSQL(L.getBruteLoss())
- var/sqlfire = sanitizeSQL(L.getFireLoss())
- var/sqlbrain = sanitizeSQL(L.getBrainLoss())
- var/sqloxy = sanitizeSQL(L.getOxyLoss())
- var/sqltox = sanitizeSQL(L.getStaminaLoss())
- var/sqlclone = sanitizeSQL(L.getStaminaLoss())
- var/sqlstamina = sanitizeSQL(L.getStaminaLoss())
- var/coord = sanitizeSQL("[L.x], [L.y], [L.z]")
- var/map = sanitizeSQL(SSmapping.config.map_name)
- var/datum/DBQuery/query_report_death = SSdbcore.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')")
- query_report_death.Execute()
diff --git a/code/controllers/subsystem/blackbox.dm.rej b/code/controllers/subsystem/blackbox.dm.rej
new file mode 100644
index 0000000000..79c407851f
--- /dev/null
+++ b/code/controllers/subsystem/blackbox.dm.rej
@@ -0,0 +1,512 @@
+diff a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm (rejected hunks)
+@@ -1,253 +1,257 @@
+-GLOBAL_DATUM_INIT(blackbox, /datum/feedback, new)
+-
+-//the feedback datum; stores all feedback
+-/datum/feedback
+- var/list/messages = list()
+- var/list/messages_admin = list()
+-
+- var/list/msg_common = list()
+- var/list/msg_science = list()
+- var/list/msg_command = list()
+- var/list/msg_medical = list()
+- var/list/msg_engineering = list()
+- var/list/msg_security = list()
+- var/list/msg_deathsquad = list()
+- var/list/msg_syndicate = list()
+- var/list/msg_service = list()
+- var/list/msg_cargo = list()
+-
+- var/list/datum/feedback_variable/feedback = new()
+-
+-/datum/feedback/proc/find_feedback_datum(variable)
+- for (var/datum/feedback_variable/FV in feedback)
+- if (FV.get_variable() == variable)
+- return FV
+- var/datum/feedback_variable/FV = new(variable)
+- feedback += FV
+- return FV
+-
+-/datum/feedback/proc/get_round_feedback()
+- return feedback
+-
+-/datum/feedback/proc/round_end_data_gathering()
+- var/pda_msg_amt = 0
+- var/rc_msg_amt = 0
+-
+- for (var/obj/machinery/message_server/MS in GLOB.message_servers)
+- if (MS.pda_msgs.len > pda_msg_amt)
+- pda_msg_amt = MS.pda_msgs.len
+- if (MS.rc_msgs.len > rc_msg_amt)
+- rc_msg_amt = MS.rc_msgs.len
+-
+- feedback_set_details("radio_usage","")
+-
+- feedback_add_details("radio_usage","COM-[msg_common.len]")
+- feedback_add_details("radio_usage","SCI-[msg_science.len]")
+- feedback_add_details("radio_usage","HEA-[msg_command.len]")
+- feedback_add_details("radio_usage","MED-[msg_medical.len]")
+- feedback_add_details("radio_usage","ENG-[msg_engineering.len]")
+- feedback_add_details("radio_usage","SEC-[msg_security.len]")
+- feedback_add_details("radio_usage","DTH-[msg_deathsquad.len]")
+- feedback_add_details("radio_usage","SYN-[msg_syndicate.len]")
+- feedback_add_details("radio_usage","SRV-[msg_service.len]")
+- feedback_add_details("radio_usage","CAR-[msg_cargo.len]")
+- feedback_add_details("radio_usage","OTH-[messages.len]")
+- feedback_add_details("radio_usage","PDA-[pda_msg_amt]")
+- feedback_add_details("radio_usage","RC-[rc_msg_amt]")
+-
+- feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set.
+-
+-//This proc is only to be called at round end.
+-/datum/feedback/proc/save_all_data_to_sql()
+- if (!feedback) return
+-
+- round_end_data_gathering() //round_end time logging and some other data processing
+- if (!GLOB.dbcon.Connect()) return
+- var/round_id
+-
+- var/DBQuery/query_feedback_max_id = GLOB.dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]")
+- if(!query_feedback_max_id.Execute())
+- return
+- while (query_feedback_max_id.NextRow())
+- round_id = query_feedback_max_id.item[1]
+-
+- if (!isnum(round_id))
+- round_id = text2num(round_id)
+- round_id++
+-
+- var/sqlrowlist = ""
+-
+- for (var/datum/feedback_variable/FV in feedback)
+- if (sqlrowlist != "")
+- sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
+-
+- sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")"
+-
+- if (sqlrowlist == "")
+- return
+-
+- var/DBQuery/query_feedback_save = GLOB.dbcon.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist)
+- query_feedback_save.Execute()
+-
+-
+-/proc/feedback_set(variable,value)
+- if(!GLOB.blackbox)
+- return
+-
+- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
+-
+- if(!FV)
+- return
+-
+- FV.set_value(value)
+-
+-/proc/feedback_inc(variable,value)
+- if(!GLOB.blackbox)
+- return
+-
+- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
+-
+- if(!FV)
+- return
+-
+- FV.inc(value)
+-
+-/proc/feedback_dec(variable,value)
+- if(!GLOB.blackbox)
+- return
+-
+- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
+-
+- if(!FV)
+- return
+-
+- FV.dec(value)
+-
+-/proc/feedback_set_details(variable,details)
+- if(!GLOB.blackbox)
+- return
+-
+- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
+-
+- if(!FV)
+- return
+-
+- FV.set_details(details)
+-
+-/proc/feedback_add_details(variable,details)
+- if(!GLOB.blackbox)
+- return
+-
+- var/datum/feedback_variable/FV = GLOB.blackbox.find_feedback_datum(variable)
+-
+- if(!FV)
+- return
+-
+- FV.add_details(details)
+-
+-//feedback variable datum, for storing all kinds of data
+-/datum/feedback_variable
+- var/variable
+- var/value
+- var/details
+-
+-/datum/feedback_variable/New(var/param_variable,var/param_value = 0)
+- variable = param_variable
+- value = param_value
+-
+-/datum/feedback_variable/proc/inc(num = 1)
+- if (isnum(value))
+- value += num
+- else
+- value = text2num(value)
+- if (isnum(value))
+- value += num
+- else
+- value = num
+-
+-/datum/feedback_variable/proc/dec(num = 1)
+- if (isnum(value))
+- value -= num
+- else
+- value = text2num(value)
+- if (isnum(value))
+- value -= num
+- else
+- value = -num
+-
+-/datum/feedback_variable/proc/set_value(num)
+- if (isnum(num))
+- value = num
+-
+-/datum/feedback_variable/proc/get_value()
+- if (!isnum(value))
+- return 0
+- return value
+-
+-/datum/feedback_variable/proc/get_variable()
+- return variable
+-
+-/datum/feedback_variable/proc/set_details(text)
+- if (istext(text))
+- details = text
+-
+-/datum/feedback_variable/proc/add_details(text)
+- if (istext(text))
+- text = replacetext(text, " ", "_")
+- if (!details)
+- details = text
+- else
+- details += " [text]"
+-
+-/datum/feedback_variable/proc/get_details()
+- return details
+-
+-/datum/feedback_variable/proc/get_parsed()
+- return list(variable,value,details)
+-
+-//sql reporting procs
+-/proc/sql_poll_population()
+- if(!config.sql_enabled)
+- return
+- if(!GLOB.dbcon.Connect())
+- return
+- var/playercount = 0
+- for(var/mob/M in GLOB.player_list)
+- if(M.client)
+- playercount += 1
+- var/admincount = GLOB.admins.len
+- var/DBQuery/query_record_playercount = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')")
+- query_record_playercount.Execute()
+-
+-/proc/sql_report_death(mob/living/L)
+- if(!config.sql_enabled)
+- return
+- if(!GLOB.dbcon.Connect())
+- return
+- if(!L || !L.key || !L.mind)
+- return
+- var/turf/T = get_turf(L)
+- var/area/placeofdeath = get_area(T.loc)
+- var/sqlname = sanitizeSQL(L.real_name)
+- var/sqlkey = sanitizeSQL(L.ckey)
+- var/sqljob = sanitizeSQL(L.mind.assigned_role)
+- var/sqlspecial = sanitizeSQL(L.mind.special_role)
+- var/sqlpod = sanitizeSQL(placeofdeath.name)
+- var/laname
+- var/lakey
+- if(L.lastattacker && ismob(L.lastattacker))
+- var/mob/LA = L.lastattacker
+- laname = sanitizeSQL(LA.real_name)
+- lakey = sanitizeSQL(LA.key)
+- var/sqlgender = sanitizeSQL(L.gender)
+- var/sqlbrute = sanitizeSQL(L.getBruteLoss())
+- var/sqlfire = sanitizeSQL(L.getFireLoss())
+- var/sqlbrain = sanitizeSQL(L.getBrainLoss())
+- var/sqloxy = sanitizeSQL(L.getOxyLoss())
+- var/sqltox = sanitizeSQL(L.getStaminaLoss())
+- var/sqlclone = sanitizeSQL(L.getStaminaLoss())
+- var/sqlstamina = sanitizeSQL(L.getStaminaLoss())
+- var/coord = sanitizeSQL("[L.x], [L.y], [L.z]")
+- var/map = sanitizeSQL(SSmapping.config.map_name)
+- var/DBQuery/query_report_death = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')")
+- query_report_death.Execute()
++SUBSYSTEM_DEF(blackbox)
++ name = "Blackbox"
++ wait = 6000
++ flags = SS_NO_TICK_CHECK
++
++ var/list/msg_common = list()
++ var/list/msg_science = list()
++ var/list/msg_command = list()
++ var/list/msg_medical = list()
++ var/list/msg_engineering = list()
++ var/list/msg_security = list()
++ var/list/msg_deathsquad = list()
++ var/list/msg_syndicate = list()
++ var/list/msg_service = list()
++ var/list/msg_cargo = list()
++ var/list/msg_other = list()
++
++ var/list/feedback = list() //list of datum/feedback_variable
++
++//poll population
++/datum/controller/subsystem/blackbox/fire()
++ if(!GLOB.dbcon.Connect())
++ return
++ var/playercount = 0
++ for(var/mob/M in GLOB.player_list)
++ if(M.client)
++ playercount += 1
++ var/admincount = GLOB.admins.len
++ var/DBQuery/query_record_playercount = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("legacy_population")] (playercount, admincount, time, server_ip, server_port) VALUES ([playercount], [admincount], '[SQLtime()]', INET_ATON('[world.internet_address]'), '[world.port]')")
++ query_record_playercount.Execute()
++
++/datum/controller/subsystem/blackbox/Recover()
++ msg_common = SSblackbox.msg_common
++ msg_science = SSblackbox.msg_science
++ msg_command = SSblackbox.msg_command
++ msg_medical = SSblackbox.msg_medical
++ msg_engineering = SSblackbox.msg_engineering
++ msg_security = SSblackbox.msg_security
++ msg_deathsquad = SSblackbox.msg_deathsquad
++ msg_syndicate = SSblackbox.msg_syndicate
++ msg_service = SSblackbox.msg_service
++ msg_cargo = SSblackbox.msg_cargo
++ msg_other = SSblackbox.msg_other
++
++ feedback = SSblackbox.feedback
++
++//no touchie
++/datum/controller/subsystem/blackbox/can_vv_get(var_name)
++ if(var_name == "feedback")
++ return FALSE
++ return ..()
++
++/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value)
++ return FALSE
++
++/datum/controller/subsystem/blackbox/Shutdown()
++ var/pda_msg_amt = 0
++ var/rc_msg_amt = 0
++
++ for (var/obj/machinery/message_server/MS in GLOB.message_servers)
++ if (MS.pda_msgs.len > pda_msg_amt)
++ pda_msg_amt = MS.pda_msgs.len
++ if (MS.rc_msgs.len > rc_msg_amt)
++ rc_msg_amt = MS.rc_msgs.len
++
++ set_details("radio_usage","")
++
++ add_details("radio_usage","COM-[msg_common.len]")
++ add_details("radio_usage","SCI-[msg_science.len]")
++ add_details("radio_usage","HEA-[msg_command.len]")
++ add_details("radio_usage","MED-[msg_medical.len]")
++ add_details("radio_usage","ENG-[msg_engineering.len]")
++ add_details("radio_usage","SEC-[msg_security.len]")
++ add_details("radio_usage","DTH-[msg_deathsquad.len]")
++ add_details("radio_usage","SYN-[msg_syndicate.len]")
++ add_details("radio_usage","SRV-[msg_service.len]")
++ add_details("radio_usage","CAR-[msg_cargo.len]")
++ add_details("radio_usage","OTH-[msg_other.len]")
++ add_details("radio_usage","PDA-[pda_msg_amt]")
++ add_details("radio_usage","RC-[rc_msg_amt]")
++
++ set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set.
++
++ if (!GLOB.dbcon.Connect())
++ return
++
++ var/round_id
++
++ var/DBQuery/query_feedback_max_id = GLOB.dbcon.NewQuery("SELECT MAX(round_id) AS round_id FROM [format_table_name("feedback")]")
++ if(!query_feedback_max_id.Execute())
++ return
++ while (query_feedback_max_id.NextRow())
++ round_id = query_feedback_max_id.item[1]
++
++ if (!isnum(round_id))
++ round_id = text2num(round_id)
++ round_id++
++
++ var/sqlrowlist = ""
++
++ for (var/datum/feedback_variable/FV in feedback)
++ if (sqlrowlist != "")
++ sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
++
++ sqlrowlist += "(null, Now(), [round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")"
++
++ if (sqlrowlist == "")
++ return
++
++ var/DBQuery/query_feedback_save = GLOB.dbcon.NewQuery("INSERT DELAYED IGNORE INTO [format_table_name("feedback")] VALUES " + sqlrowlist)
++ query_feedback_save.Execute()
++
++/datum/controller/subsystem/blackbox/proc/LogBroadcast(blackbox_msg, freq)
++ switch(freq)
++ if(1459)
++ msg_common += blackbox_msg
++ if(1351)
++ msg_science += blackbox_msg
++ if(1353)
++ msg_command += blackbox_msg
++ if(1355)
++ msg_medical += blackbox_msg
++ if(1357)
++ msg_engineering += blackbox_msg
++ if(1359)
++ msg_security += blackbox_msg
++ if(1441)
++ msg_deathsquad += blackbox_msg
++ if(1213)
++ msg_syndicate += blackbox_msg
++ if(1349)
++ msg_service += blackbox_msg
++ if(1347)
++ msg_cargo += blackbox_msg
++ else
++ msg_other += blackbox_msg
++
++/datum/controller/subsystem/blackbox/proc/find_feedback_datum(variable)
++ for(var/datum/feedback_variable/FV in feedback)
++ if(FV.get_variable() == variable)
++ return FV
++
++ var/datum/feedback_variable/FV = new(variable)
++ feedback += FV
++ return FV
++
++/datum/controller/subsystem/blackbox/proc/set_val(variable, value)
++ var/datum/feedback_variable/FV = find_feedback_datum(variable)
++ FV.set_value(value)
++
++/datum/controller/subsystem/blackbox/proc/inc(variable, value)
++ var/datum/feedback_variable/FV = find_feedback_datum(variable)
++ FV.inc(value)
++
++/datum/controller/subsystem/blackbox/proc/dec(variable,value)
++ var/datum/feedback_variable/FV = find_feedback_datum(variable)
++ FV.dec(value)
++
++/datum/controller/subsystem/blackbox/proc/set_details(variable,details)
++ var/datum/feedback_variable/FV = find_feedback_datum(variable)
++ FV.set_details(details)
++
++/datum/controller/subsystem/blackbox/proc/add_details(variable,details)
++ var/datum/feedback_variable/FV = find_feedback_datum(variable)
++ FV.add_details(details)
++
++/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L)
++ if(!GLOB.dbcon.Connect())
++ return
++ if(!L || !L.key || !L.mind)
++ return
++ var/turf/T = get_turf(L)
++ var/area/placeofdeath = get_area(T.loc)
++ var/sqlname = sanitizeSQL(L.real_name)
++ var/sqlkey = sanitizeSQL(L.ckey)
++ var/sqljob = sanitizeSQL(L.mind.assigned_role)
++ var/sqlspecial = sanitizeSQL(L.mind.special_role)
++ var/sqlpod = sanitizeSQL(placeofdeath.name)
++ var/laname
++ var/lakey
++ if(L.lastattacker && ismob(L.lastattacker))
++ var/mob/LA = L.lastattacker
++ laname = sanitizeSQL(LA.real_name)
++ lakey = sanitizeSQL(LA.key)
++ var/sqlgender = sanitizeSQL(L.gender)
++ var/sqlbrute = sanitizeSQL(L.getBruteLoss())
++ var/sqlfire = sanitizeSQL(L.getFireLoss())
++ var/sqlbrain = sanitizeSQL(L.getBrainLoss())
++ var/sqloxy = sanitizeSQL(L.getOxyLoss())
++ var/sqltox = sanitizeSQL(L.getStaminaLoss())
++ var/sqlclone = sanitizeSQL(L.getStaminaLoss())
++ var/sqlstamina = sanitizeSQL(L.getStaminaLoss())
++ var/coord = sanitizeSQL("[L.x], [L.y], [L.z]")
++ var/map = sanitizeSQL(SSmapping.config.map_name)
++ var/DBQuery/query_report_death = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, toxloss, cloneloss, staminaloss, coord, mapname, server_ip, server_port) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[SQLtime()]', '[laname]', '[lakey]', '[sqlgender]', [sqlbrute], [sqlfire], [sqlbrain], [sqloxy], [sqltox], [sqlclone], [sqlstamina], '[coord]', '[map]', INET_ATON('[world.internet_address]'), '[world.port]')")
++ query_report_death.Execute()
++
++
++//feedback variable datum, for storing all kinds of data
++/datum/feedback_variable
++ var/variable
++ var/value
++ var/details
++
++/datum/feedback_variable/New(param_variable, param_value = 0)
++ variable = param_variable
++ value = param_value
++
++/datum/feedback_variable/proc/inc(num = 1)
++ if (isnum(value))
++ value += num
++ else
++ value = text2num(value)
++ if (isnum(value))
++ value += num
++ else
++ value = num
++
++/datum/feedback_variable/proc/dec(num = 1)
++ if (isnum(value))
++ value -= num
++ else
++ value = text2num(value)
++ if (isnum(value))
++ value -= num
++ else
++ value = -num
++
++/datum/feedback_variable/proc/set_value(num)
++ if (isnum(num))
++ value = num
++
++/datum/feedback_variable/proc/get_value()
++ if (!isnum(value))
++ return 0
++ return value
++
++/datum/feedback_variable/proc/get_variable()
++ return variable
++
++/datum/feedback_variable/proc/set_details(text)
++ if (istext(text))
++ details = text
++
++/datum/feedback_variable/proc/add_details(text)
++ if (istext(text))
++ text = replacetext(text, " ", "_")
++ if (!details)
++ details = text
++ else
++ details += " [text]"
++
++/datum/feedback_variable/proc/get_details()
++ return details
++
++/datum/feedback_variable/proc/get_parsed()
++ return list(variable,value,details)
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 137bd2a2c1..a3255b73e4 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -483,7 +483,7 @@ SUBSYSTEM_DEF(job)
else level4++ //not selected
tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
- feedback_add_details("job_preferences",tmp_str)
+ SSblackbox.add_details("job_preferences",tmp_str)
/datum/controller/subsystem/job/proc/PopcapReached()
if(config.hard_popcap || config.extreme_popcap)
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index a27235c592..85c580f4d9 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -119,7 +119,7 @@ SUBSYSTEM_DEF(mapping)
INIT_ANNOUNCE("Loading [config.map_name]...")
TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION)
INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!")
- feedback_add_details("map_name", config.map_name)
+ SSblackbox.add_details("map_name", config.map_name)
if(config.minetype != "lavaland")
INIT_ANNOUNCE("WARNING: A map without lavaland set as it's minetype was loaded! This is being ignored! Update the maploader code!")
diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm
index 0829766174..a6b444c4e7 100644
--- a/code/controllers/subsystem/ping.dm
+++ b/code/controllers/subsystem/ping.dm
@@ -3,14 +3,20 @@
SUBSYSTEM_DEF(ping)
name = "Ping"
wait = 6
- flags = SS_NO_INIT|SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
+ flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
priority = 10
var/list/currentrun
+/datum/controller/subsystem/ping/Initialize()
+ if (config.hub)
+ world.visibility = 1
+ ..()
+
/datum/controller/subsystem/ping/fire(resumed = FALSE)
if (!resumed)
src.currentrun = GLOB.clients.Copy()
+ var/round_started = Master.round_started
var/list/currentrun = src.currentrun
while (length(currentrun))
var/client/C = currentrun[currentrun.len]
@@ -19,7 +25,15 @@ SUBSYSTEM_DEF(ping)
if (MC_TICK_CHECK)
return
continue
+
+ if(round_started && C.is_afk(INACTIVITY_KICK))
+ if(!istype(C.mob, /mob/dead))
+ log_access("AFK: [key_name(C)]")
+ to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected.")
+ qdel(C)
+
winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]")
+
if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
return
diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm
index 3ef088b328..d3a0862112 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -1,17 +1,28 @@
+#define PING_BUFFER_TIME 25
+
SUBSYSTEM_DEF(server_maint)
name = "Server Tasks"
- wait = 6000
- flags = SS_NO_TICK_CHECK
+ wait = 6
+ flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
+ priority = 10
+ var/list/currentrun
/datum/controller/subsystem/server_maint/Initialize(timeofday)
if (config.hub)
world.visibility = 1
..()
-/datum/controller/subsystem/server_maint/fire()
- //handle kicking inactive players
- if(config.kick_inactive)
- for(var/client/C in GLOB.clients)
+/datum/controller/subsystem/server_maint/fire(resumed = FALSE)
+ if(!resumed)
+ src.currentrun = GLOB.clients.Copy()
+
+ var/list/currentrun = src.currentrun
+ var/round_started = Master.round_started
+
+ for(var/I in currentrun)
+ var/client/C = I
+ //handle kicking inactive players
+ if(round_started && config.kick_inactive)
if(C.is_afk(config.afk_period))
var/cmob = C.mob
if(!(istype(cmob, /mob/dead/observer) || (istype(cmob, /mob/dead) && C.holder)))
@@ -19,5 +30,10 @@ SUBSYSTEM_DEF(server_maint)
to_chat(C, "You have been inactive for more than [config.afk_period / 600] minutes and have been disconnected.")
qdel(C)
- if(config.sql_enabled)
- sql_poll_population()
+ if (!(!C || world.time - C.connection_time < PING_BUFFER_TIME || C.inactivity >= (wait-1)))
+ winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]")
+
+ if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
+ return
+
+#undef PING_BUFFER_TIME
diff --git a/code/controllers/subsystem/server_maint.dm.rej b/code/controllers/subsystem/server_maint.dm.rej
new file mode 100644
index 0000000000..f759db5330
--- /dev/null
+++ b/code/controllers/subsystem/server_maint.dm.rej
@@ -0,0 +1,7 @@
+diff a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm (rejected hunks)
+@@ -18,5 +18,3 @@ SUBSYSTEM_DEF(server_maint)
+ to_chat(C, "You have been inactive for more than 10 minutes and have been disconnected.")
+ qdel(C)
+
+- if(config.sql_enabled)
+- sql_poll_population()
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 7de57e4bb9..fbbf97a6ca 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -27,7 +27,7 @@
. += "---"
.["Call Proc"] = "?_src_=vars;proc_call=\ref[src]"
.["Mark Object"] = "?_src_=vars;mark_object=\ref[src]"
- .["Delete"] = "?_src_=vars;delete=\ref[src]"
+ .["Delete"] = "?_src_=vars;delete=\ref[src]"
/datum/proc/on_reagent_change()
@@ -94,7 +94,6 @@
CLONE:[M.getCloneLoss()]
BRAIN:[M.getBrainLoss()]
STAMINA:[M.getStaminaLoss()]
- AROUSAL:[M.getArousalLoss()]
"}
else
@@ -447,7 +446,7 @@
var/list/L = value
var/list/items = list()
- if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150)))
+ if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150)))
for (var/i in 1 to L.len)
var/key = L[i]
var/val
@@ -527,16 +526,16 @@
if(T)
callproc_datum(T)
- else if(href_list["delete"])
- if(!check_rights(R_DEBUG, 0))
- return
-
- var/datum/D = locate(href_list["delete"])
- if(!D)
- to_chat(usr, "Unable to locate item!")
- admin_delete(D)
- href_list["datumrefresh"] = href_list["delete"]
-
+ else if(href_list["delete"])
+ if(!check_rights(R_DEBUG, 0))
+ return
+
+ var/datum/D = locate(href_list["delete"])
+ if(!D)
+ to_chat(usr, "Unable to locate item!")
+ admin_delete(D)
+ href_list["datumrefresh"] = href_list["delete"]
+
else if(href_list["regenerateicons"])
if(!check_rights(0))
return
@@ -1166,8 +1165,6 @@
L.adjustCloneLoss(amount)
if("stamina")
L.adjustStaminaLoss(amount)
- if("arousal")
- L.adjustArousalLoss(amount)
else
to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]")
return
@@ -1178,3 +1175,4 @@
message_admins(msg)
admin_ticket_log(L, msg)
href_list["datumrefresh"] = href_list["mobToDamage"]
+
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 8c9d7d7704..907e411ff3 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -25,7 +25,7 @@
for(var/line in testmerge)
if(line)
log_world("Test merge active of PR #[line]")
- feedback_add_details("testmerged_prs","[line]")
+ SSblackbox.add_details("testmerged_prs","[line]")
log_world("Based off master commit [parentcommit]")
else
log_world(parentcommit)
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index a5fc5e339a..47e2ce6a14 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -20,7 +20,7 @@
if(round_converted) //So badmin blobs later don't step on the dead natural blobs metaphorical toes
..()
if(blobwincount <= GLOB.blobs_legit.len)
- feedback_set_details("round_end_result","win - blob took over")
+ SSblackbox.set_details("round_end_result","win - blob took over")
to_chat(world, "The blob has taken over the station!")
to_chat(world, "The entire station was eaten by the Blob!")
log_game("Blob mode completed with a blob victory.")
@@ -28,7 +28,7 @@
SSticker.news_report = BLOB_WIN
else if(station_was_nuked)
- feedback_set_details("round_end_result","halfwin - nuke")
+ SSblackbox.set_details("round_end_result","halfwin - nuke")
to_chat(world, "Partial Win: The station has been destroyed!")
to_chat(world, "Directive 7-12 has been successfully carried out, preventing the Blob from spreading.")
log_game("Blob mode completed with a tie (station destroyed).")
@@ -36,7 +36,7 @@
SSticker.news_report = BLOB_NUKE
else if(!GLOB.blob_cores.len)
- feedback_set_details("round_end_result","loss - blob eliminated")
+ SSblackbox.set_details("round_end_result","loss - blob eliminated")
to_chat(world, "The staff has won!")
to_chat(world, "The alien organism has been eradicated from the station!")
log_game("Blob mode completed with a crew victory.")
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index fc39f2222e..9d281b5f2f 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -254,19 +254,19 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w
for(var/datum/objective/objective in changeling.objectives)
if(objective.check_completion())
text += "
Objective #[count]: [objective.explanation_text] Success!"
- feedback_add_details("changeling_objective","[objective.type]|SUCCESS")
+ SSblackbox.add_details("changeling_objective","[objective.type]|SUCCESS")
else
text += "
Objective #[count]: [objective.explanation_text] Fail."
- feedback_add_details("changeling_objective","[objective.type]|FAIL")
+ SSblackbox.add_details("changeling_objective","[objective.type]|FAIL")
changelingwin = 0
count++
if(changelingwin)
text += "
The changeling was successful!"
- feedback_add_details("changeling_success","SUCCESS")
+ SSblackbox.add_details("changeling_success","SUCCESS")
else
text += "
The changeling has failed."
- feedback_add_details("changeling_success","FAIL")
+ SSblackbox.add_details("changeling_success","FAIL")
text += "
"
to_chat(world, text)
diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm
index 1673e59f49..67eb216d58 100644
--- a/code/game/gamemodes/changeling/changeling_power.dm
+++ b/code/game/gamemodes/changeling/changeling_power.dm
@@ -21,7 +21,7 @@
/obj/effect/proc_holder/changeling/proc/on_purchase(mob/user, is_respec)
if(!is_respec)
- feedback_add_details("changeling_power_purchase",name)
+ SSblackbox.add_details("changeling_power_purchase",name)
/obj/effect/proc_holder/changeling/proc/on_refund(mob/user)
return
@@ -37,7 +37,7 @@
return
var/datum/changeling/c = user.mind.changeling
if(sting_action(user, target))
- feedback_add_details("changeling_powers",name)
+ SSblackbox.add_details("changeling_powers",name)
sting_feedback(user, target)
take_chemical_cost(c)
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index db1405537f..fdfec9e270 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -68,7 +68,7 @@
mind.changeling.purchasedpowers+=S
S.on_purchase(src, is_respec)
if(is_respec)
- feedback_add_details("changeling_power_purchase","Readapt")
+ SSblackbox.add_details("changeling_power_purchase","Readapt")
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
if(ishuman(C))
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 0f1fb93071..6a52ab9312 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -42,13 +42,13 @@
to_chat(target, "You feel a sharp stabbing pain!")
target.take_overall_damage(40)
- feedback_add_details("changeling_powers","Absorb DNA|[i]")
+ SSblackbox.add_details("changeling_powers","Absorb DNA|[i]")
if(!do_mob(user, target, 150))
to_chat(user, "Our absorption of [target] has been interrupted!")
changeling.isabsorbing = 0
return
- feedback_add_details("changeling_powers","Absorb DNA|4")
+ SSblackbox.add_details("changeling_powers","Absorb DNA|4")
user.visible_message("[user] sucks the fluids from [target]!", "We have absorbed [target].")
to_chat(target, "You are absorbed by the changeling!")
diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm
index 5a64d551b5..fc4b91b650 100644
--- a/code/game/gamemodes/changeling/powers/linglink.dm
+++ b/code/game/gamemodes/changeling/powers/linglink.dm
@@ -56,7 +56,7 @@
to_chat(target, "You can now communicate in the changeling hivemind, say \":g message\" to communicate!")
target.reagents.add_reagent("salbutamol", 40) // So they don't choke to death while you interrogate them
sleep(1800)
- feedback_add_details("changeling_powers","Hivemind Link|[i]")
+ SSblackbox.add_details("changeling_powers","Hivemind Link|[i]")
if(!do_mob(user, target, 20))
to_chat(user, "Our link with [target] has ended!")
changeling.islinking = 0
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 65e6b4ca6b..7fccb37d3c 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -198,7 +198,7 @@ Credit where due:
var/datum/game_mode/clockwork_cult/C = SSticker.mode
if(C.check_clockwork_victory())
text += "Ratvar's servants have succeeded in fulfilling His goals!"
- feedback_set_details("round_end_result", "win - servants completed their objective (summon ratvar)")
+ SSblackbox.set_details("round_end_result", "win - servants completed their objective (summon ratvar)")
else
var/half_victory = FALSE
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in GLOB.all_clockwork_objects
@@ -207,10 +207,10 @@ Credit where due:
if(half_victory)
text += "The crew escaped before Ratvar could rise, but the gateway \
was successfully constructed!"
- feedback_set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)")
+ SSblackbox.set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)")
else
text += "Ratvar's servants have failed!"
- feedback_set_details("round_end_result", "loss - servants failed their objective (summon ratvar)")
+ SSblackbox.set_details("round_end_result", "loss - servants failed their objective (summon ratvar)")
text += "
The servants' objective was:
[CLOCKCULT_OBJECTIVE]"
text += "
Ratvar's servants had [GLOB.clockwork_caches] Tinkerer's Caches."
text += "
Construction Value(CV) was: [GLOB.clockwork_construction_value]"
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
index 8e688f30aa..e8f1e8dbbc 100644
--- a/code/game/gamemodes/clock_cult/clock_scripture.dm
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -86,7 +86,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
else
successful = TRUE
if(slab && !slab.no_cost && !GLOB.ratvar_awakens) //if the slab exists and isn't debug and ratvar isn't up, log the scripture as being used
- feedback_add_details("clockcult_scripture_recited", name)
+ SSblackbox.add_details("clockcult_scripture_recited", name)
if(slab)
slab.busy = null
qdel(src)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 6d188ae8e9..7780ae5db9 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -218,12 +218,12 @@
/datum/game_mode/cult/declare_completion()
if(!check_cult_victory())
- feedback_set_details("round_end_result","win - cult win")
- feedback_set("round_end_result",acolytes_survived)
+ SSblackbox.set_details("round_end_result","win - cult win")
+ SSblackbox.set_val("round_end_result",acolytes_survived)
to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!")
else
- feedback_set_details("round_end_result","loss - staff stopped the cult")
- feedback_set("round_end_result",acolytes_survived)
+ SSblackbox.set_details("round_end_result","loss - staff stopped the cult")
+ SSblackbox.set_val("round_end_result",acolytes_survived)
to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!")
var/text = ""
@@ -236,31 +236,31 @@
if("survive")
if(!check_survive())
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!"
- feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
+ SSblackbox.add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
SSticker.news_report = CULT_ESCAPE
else
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail."
- feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
+ SSblackbox.add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
SSticker.news_report = CULT_FAILURE
if("sacrifice")
if(sacrifice_target)
if(sacrifice_target in GLOB.sacrificed)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!"
- feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
+ SSblackbox.add_details("cult_objective","cult_sacrifice|SUCCESS")
else if(sacrifice_target && sacrifice_target.current)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail."
- feedback_add_details("cult_objective","cult_sacrifice|FAIL")
+ SSblackbox.add_details("cult_objective","cult_sacrifice|FAIL")
else
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)."
- feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
+ SSblackbox.add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
if("eldergod")
if(!eldergod)
explanation = "Summon Nar-Sie. Success!"
- feedback_add_details("cult_objective","cult_narsie|SUCCESS")
+ SSblackbox.add_details("cult_objective","cult_narsie|SUCCESS")
SSticker.news_report = CULT_SUMMON
else
explanation = "Summon Nar-Sie. Fail."
- feedback_add_details("cult_objective","cult_narsie|FAIL")
+ SSblackbox.add_details("cult_objective","cult_narsie|FAIL")
SSticker.news_report = CULT_FAILURE
text += "
Objective #[obj_count]: [explanation]"
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 2ed6840c91..843d16592a 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -247,7 +247,7 @@ This file contains the arcane tome files.
var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword)
R.add_mob_blood(user)
to_chat(user, "The [lowertext(R.cultist_name)] rune [R.cultist_desc]")
- feedback_add_details("cult_runes_scribed", R.cultist_name)
+ SSblackbox.add_details("cult_runes_scribed", R.cultist_name)
/obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user)
var/area/A = get_area(T)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 2564d1b262..a496715af2 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -80,12 +80,12 @@
report = config.intercept
addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME)
- feedback_set_details("round_start","[time2text(world.realtime)]")
+ SSblackbox.set_details("round_start","[time2text(world.realtime)]")
if(SSticker && SSticker.mode)
- feedback_set_details("game_mode","[SSticker.mode]")
+ SSblackbox.set_details("game_mode","[SSticker.mode]")
if(GLOB.revdata.commit)
- feedback_set_details("revision","[GLOB.revdata.commit]")
- feedback_set_details("server_ip","[world.internet_address]:[world.port]")
+ SSblackbox.set_details("revision","[GLOB.revdata.commit]")
+ SSblackbox.set_details("server_ip","[world.internet_address]:[world.port]")
if(report)
addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h))
generate_station_goals()
@@ -246,17 +246,17 @@
ghosts++
if(clients > 0)
- feedback_set("round_end_clients",clients)
+ SSblackbox.set_val("round_end_clients",clients)
if(ghosts > 0)
- feedback_set("round_end_ghosts",ghosts)
+ SSblackbox.set_val("round_end_ghosts",ghosts)
if(surviving_humans > 0)
- feedback_set("survived_human",surviving_humans)
+ SSblackbox.set_val("survived_human",surviving_humans)
if(surviving_total > 0)
- feedback_set("survived_total",surviving_total)
+ SSblackbox.set_val("survived_total",surviving_total)
if(escaped_humans > 0)
- feedback_set("escaped_human",escaped_humans)
+ SSblackbox.set_val("escaped_human",escaped_humans)
if(escaped_total > 0)
- feedback_set("escaped_total",escaped_total)
+ SSblackbox.set_val("escaped_total",escaped_total)
send2irc("Server", "Round just ended.")
return 0
diff --git a/code/game/gamemodes/game_mode.dm.rej b/code/game/gamemodes/game_mode.dm.rej
new file mode 100644
index 0000000000..2ee380eecf
--- /dev/null
+++ b/code/game/gamemodes/game_mode.dm.rej
@@ -0,0 +1,18 @@
+diff a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm (rejected hunks)
+@@ -81,12 +81,12 @@
+ spawn (ROUNDSTART_LOGOUT_REPORT_TIME)
+ display_roundstart_logout_report()
+
+- feedback_set_details("round_start","[time2text(world.realtime)]")
++ SSblackbox.set_details("round_start","[time2text(world.realtime)]")
+ if(SSticker && SSticker.mode)
+- feedback_set_details("game_mode","[SSticker.mode]")
++ SSblackbox.set_details("game_mode","[SSticker.mode]")
+ if(GLOB.revdata.commit)
+- feedback_set_details("revision","[GLOB.revdata.commit]")
+- feedback_set_details("server_ip","[world.internet_address]:[world.port]")
++ SSblackbox.set_details("revision","[GLOB.revdata.commit]")
++ SSblackbox.set_details("server_ip","[world.internet_address]:[world.port]")
+ if(report)
+ spawn (rand(waittime_l, waittime_h))
+ send_intercept(0)
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 22ca4b2298..9c31edf55f 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -260,12 +260,12 @@ GLOBAL_LIST_INIT(gang_colors_pool, list("red","orange","yellow","green","blue","
return
if(!winner)
to_chat(world, "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
")
- feedback_set_details("round_end_result","loss - gangs failed takeover")
+ SSblackbox.set_details("round_end_result","loss - gangs failed takeover")
SSticker.news_report = GANG_LOSS
else
to_chat(world, "The [winner.name] Gang successfully performed a hostile takeover of the station!
")
- feedback_set_details("round_end_result","win - gang domination complete")
+ SSblackbox.set_details("round_end_result","win - gang domination complete")
SSticker.news_report = GANG_TAKEOVER
diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm
index e1a2ddf78f..400b38309b 100644
--- a/code/game/gamemodes/meteor/meteor.dm
+++ b/code/game/gamemodes/meteor/meteor.dm
@@ -50,8 +50,8 @@
else
to_chat(world, "Nobody survived the meteor storm!")
- feedback_set_details("round_end_result","end - evacuation")
- feedback_set("round_end_result",survivors)
+ SSblackbox.set_details("round_end_result","end - evacuation")
+ SSblackbox.set_val("round_end_result",survivors)
..()
return 1
diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm
index ecb15bc221..f9ea8dcc2c 100644
--- a/code/game/gamemodes/miniantags/monkey/monkey.dm
+++ b/code/game/gamemodes/miniantags/monkey/monkey.dm
@@ -107,10 +107,10 @@
/datum/game_mode/monkey/declare_completion()
if(check_monkey_victory())
- feedback_set_details("round_end_result","win - monkey win")
- feedback_set("round_end_result",escaped_monkeys)
+ SSblackbox.set_details("round_end_result","win - monkey win")
+ SSblackbox.set_val("round_end_result",escaped_monkeys)
to_chat(world, "The monkeys have overthrown their captors! Eeek eeeek!!")
else
- feedback_set_details("round_end_result","loss - staff stopped the monkeys")
- feedback_set("round_end_result",escaped_monkeys)
+ SSblackbox.set_details("round_end_result","loss - staff stopped the monkeys")
+ SSblackbox.set_val("round_end_result",escaped_monkeys)
to_chat(world, "The staff managed to contain the monkey infestation!")
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index d4d788e049..b12dcc3bcc 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -199,70 +199,70 @@
if(nuke_off_station == NUKE_SYNDICATE_BASE)
- feedback_set_details("round_end_result","loss - syndicate nuked - disk secured")
+ SSblackbox.set_details("round_end_result","loss - syndicate nuked - disk secured")
to_chat(world, "Humiliating Syndicate Defeat")
to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!")
SSticker.news_report = NUKE_SYNDICATE_BASE
else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape)
- feedback_set_details("round_end_result","win - syndicate nuke")
+ SSblackbox.set_details("round_end_result","win - syndicate nuke")
to_chat(world, "Syndicate Major Victory!")
to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!")
SSticker.news_report = STATION_NUKED
else if (!disk_rescued && station_was_nuked && syndies_didnt_escape)
- feedback_set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time")
+ SSblackbox.set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time")
to_chat(world, "Total Annihilation")
to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!")
SSticker.news_report = STATION_NUKED
else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape)
- feedback_set_details("round_end_result","halfwin - blew wrong station")
+ SSblackbox.set_details("round_end_result","halfwin - blew wrong station")
to_chat(world, "Crew Minor Victory")
to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!")
SSticker.news_report = NUKE_MISS
else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape)
- feedback_set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time")
+ SSblackbox.set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time")
to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!")
to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!")
SSticker.news_report = NUKE_MISS
else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead())
- feedback_set_details("round_end_result","loss - evacuation - disk secured - syndi team dead")
+ SSblackbox.set_details("round_end_result","loss - evacuation - disk secured - syndi team dead")
to_chat(world, "Crew Major Victory!")
to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives")
SSticker.news_report = OPERATIVES_KILLED
else if (disk_rescued)
- feedback_set_details("round_end_result","loss - evacuation - disk secured")
+ SSblackbox.set_details("round_end_result","loss - evacuation - disk secured")
to_chat(world, "Crew Major Victory")
to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!")
SSticker.news_report = OPERATIVES_KILLED
else if (!disk_rescued && are_operatives_dead())
- feedback_set_details("round_end_result","halfwin - evacuation - disk not secured")
+ SSblackbox.set_details("round_end_result","halfwin - evacuation - disk not secured")
to_chat(world, "Neutral Victory!")
to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!")
SSticker.news_report = OPERATIVE_SKIRMISH
else if (!disk_rescued && crew_evacuated)
- feedback_set_details("round_end_result","halfwin - detonation averted")
+ SSblackbox.set_details("round_end_result","halfwin - detonation averted")
to_chat(world, "Syndicate Minor Victory!")
to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!")
SSticker.news_report = OPERATIVE_SKIRMISH
else if (!disk_rescued && !crew_evacuated)
- feedback_set_details("round_end_result","halfwin - interrupted")
+ SSblackbox.set_details("round_end_result","halfwin - interrupted")
to_chat(world, "Neutral Victory")
to_chat(world, "Round was mysteriously interrupted!")
diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm
index 3e47aa517d..cad958ee64 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -57,7 +57,7 @@
U.hidden_uplink.telecrystals = CHALLENGE_TELECRYSTALS
U.hidden_uplink.set_gamemode(/datum/game_mode/nuclear)
config.shuttle_refuel_delay = max(config.shuttle_refuel_delay, CHALLENGE_SHUTTLE_DELAY)
- feedback_set("nuclear_challenge_mode",1)
+ SSblackbox.set_val("nuclear_challenge_mode",1)
qdel(src)
/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user)
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 634c68e89a..7a31d1f3cd 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -345,13 +345,13 @@
//////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/declare_completion()
if(finished == 1)
- feedback_set_details("round_end_result","win - heads killed")
+ SSblackbox.set_details("round_end_result","win - heads killed")
to_chat(world, "The heads of staff were killed or exiled! The revolutionaries win!")
SSticker.news_report = REVS_WIN
else if(finished == 2)
- feedback_set_details("round_end_result","loss - rev heads killed")
+ SSblackbox.set_details("round_end_result","loss - rev heads killed")
to_chat(world, "The heads of staff managed to stop the revolution!")
SSticker.news_report = REVS_LOSE
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 7c0327076e..90a953c446 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -261,10 +261,10 @@
for(var/datum/objective/objective in traitor.objectives)
if(objective.check_completion())
objectives += "
Objective #[count]: [objective.explanation_text] Success!"
- feedback_add_details("traitor_objective","[objective.type]|SUCCESS")
+ SSblackbox.add_details("traitor_objective","[objective.type]|SUCCESS")
else
objectives += "
Objective #[count]: [objective.explanation_text] Fail."
- feedback_add_details("traitor_objective","[objective.type]|FAIL")
+ SSblackbox.add_details("traitor_objective","[objective.type]|FAIL")
traitorwin = 0
count++
@@ -284,10 +284,10 @@
if(traitorwin)
text += "
The [special_role_text] was successful!"
- feedback_add_details("traitor_success","SUCCESS")
+ SSblackbox.add_details("traitor_success","SUCCESS")
else
text += "
The [special_role_text] has failed!"
- feedback_add_details("traitor_success","FAIL")
+ SSblackbox.add_details("traitor_success","FAIL")
text += "
"
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index 01eb8a52c4..1eb51a95b4 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -132,7 +132,7 @@
/datum/game_mode/wizard/raginmages/declare_completion()
if(finished)
- feedback_set_details("round_end_result","loss - wizard killed")
+ SSblackbox.set_details("round_end_result","loss - wizard killed")
to_chat(world, "The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!")
..(1)
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index fe2c0cde56..b25187195d 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -57,10 +57,10 @@
aspell.name = "Instant [aspell.name]"
if(aspell.spell_level >= aspell.level_max)
to_chat(user, "This spell cannot be strengthened any further.")
- feedback_add_details("wizard_spell_improved", "[name]|[aspell.level]")
+ SSblackbox.add_details("wizard_spell_improved", "[name]|[aspell.level]")
return 1
//No same spell found - just learn it
- feedback_add_details("wizard_spell_learned", name)
+ SSblackbox.add_details("wizard_spell_learned", name)
user.mind.AddSpell(S)
to_chat(user, "You have learned [S.name].")
return 1
@@ -266,7 +266,7 @@
/datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
new item_path(get_turf(user))
- feedback_add_details("wizard_spell_learned", name)
+ SSblackbox.add_details("wizard_spell_learned", name)
return 1
/datum/spellbook_entry/item/GetInfo()
@@ -465,7 +465,7 @@
return TRUE
/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/weapon/spellbook/book)
- feedback_add_details("wizard_spell_learned", name)
+ SSblackbox.add_details("wizard_spell_learned", name)
new /datum/round_event/wizard/ghost()
active = TRUE
to_chat(user, "You have cast summon ghosts!")
@@ -482,7 +482,7 @@
return (SSticker.mode.name != "ragin' mages" && !config.no_summon_guns)
/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
- feedback_add_details("wizard_spell_learned", name)
+ SSblackbox.add_details("wizard_spell_learned", name)
rightandwrong(0, user, 25)
active = 1
playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1)
@@ -499,7 +499,7 @@
return (SSticker.mode.name != "ragin' mages" && !config.no_summon_magic)
/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
- feedback_add_details("wizard_spell_learned", name)
+ SSblackbox.add_details("wizard_spell_learned", name)
rightandwrong(1, user, 25)
active = 1
playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1)
@@ -517,7 +517,7 @@
return (SSticker.mode.name != "ragin' mages" && !config.no_summon_events)
/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
- feedback_add_details("wizard_spell_learned", name)
+ SSblackbox.add_details("wizard_spell_learned", name)
summonevents()
times++
playsound(get_turf(user), 'sound/magic/CastSummon.ogg', 50, 1)
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 34d148f03c..35bccb692a 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -176,7 +176,7 @@
/datum/game_mode/wizard/declare_completion()
if(finished)
- feedback_set_details("round_end_result","loss - wizard killed")
+ SSblackbox.set_details("round_end_result","loss - wizard killed")
to_chat(world, "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!")
SSticker.news_report = WIZARD_KILLED
@@ -208,19 +208,19 @@
for(var/datum/objective/objective in wizard.objectives)
if(objective.check_completion())
text += "
Objective #[count]: [objective.explanation_text] Success!"
- feedback_add_details("wizard_objective","[objective.type]|SUCCESS")
+ SSblackbox.add_details("wizard_objective","[objective.type]|SUCCESS")
else
text += "
Objective #[count]: [objective.explanation_text] Fail."
- feedback_add_details("wizard_objective","[objective.type]|FAIL")
+ SSblackbox.add_details("wizard_objective","[objective.type]|FAIL")
wizardwin = 0
count++
if(wizard.current && wizard.current.stat!=2 && wizardwin)
text += "
The wizard was successful!"
- feedback_add_details("wizard_success","SUCCESS")
+ SSblackbox.add_details("wizard_success","SUCCESS")
else
text += "
The wizard has failed!"
- feedback_add_details("wizard_success","FAIL")
+ SSblackbox.add_details("wizard_success","FAIL")
if(wizard.spell_list.len>0)
text += "
[wizard.name] used the following spells: "
var/i = 1
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 514cf590af..643282ab4a 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -234,7 +234,7 @@
playsound(loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
- feedback_inc("arcade_win_emagged")
+ SSblackbox.inc("arcade_win_emagged")
new /obj/effect/spawner/newbomb/timer/syndicate(loc)
new /obj/item/clothing/head/collectable/petehat(loc)
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
@@ -242,7 +242,7 @@
Reset()
emagged = 0
else
- feedback_inc("arcade_win_normal")
+ SSblackbox.inc("arcade_win_normal")
prizevend()
else if (emagged && (turtle >= 4))
@@ -264,10 +264,10 @@
temp = "You have been drained! GAME OVER"
playsound(loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
- feedback_inc("arcade_loss_mana_emagged")
+ SSblackbox.inc("arcade_loss_mana_emagged")
usr.gib()
else
- feedback_inc("arcade_loss_mana_normal")
+ SSblackbox.inc("arcade_loss_mana_normal")
else if ((enemy_hp <= 10) && (enemy_mp > 4))
temp = "[enemy_name] heals for 4 health!"
@@ -286,10 +286,10 @@
temp = "You have been crushed! GAME OVER"
playsound(loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10)
if(emagged)
- feedback_inc("arcade_loss_hp_emagged")
+ SSblackbox.inc("arcade_loss_hp_emagged")
usr.gib()
else
- feedback_inc("arcade_loss_hp_normal")
+ SSblackbox.inc("arcade_loss_hp_normal")
blocked = FALSE
return
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 5af4f9c281..c9a448fc7b 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -115,9 +115,9 @@
message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
switch(GLOB.security_level)
if(SEC_LEVEL_GREEN)
- feedback_inc("alert_comms_green",1)
+ SSblackbox.inc("alert_comms_green",1)
if(SEC_LEVEL_BLUE)
- feedback_inc("alert_comms_blue",1)
+ SSblackbox.inc("alert_comms_blue",1)
tmp_alertlevel = 0
else
to_chat(usr, "You are not authorized to do this!")
@@ -176,7 +176,7 @@
SSshuttle.points -= S.credit_cost
minor_announce("[usr.name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
message_admins("[key_name_admin(usr)] purchased [S.name].")
- feedback_add_details("shuttle_purchase", S.name)
+ SSblackbox.add_details("shuttle_purchase", S.name)
else
to_chat(usr, "Something went wrong! The shuttle exchange system seems to be down.")
else
@@ -368,9 +368,9 @@
message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
switch(GLOB.security_level)
if(SEC_LEVEL_GREEN)
- feedback_inc("alert_comms_green",1)
+ SSblackbox.inc("alert_comms_green",1)
if(SEC_LEVEL_BLUE)
- feedback_inc("alert_comms_blue",1)
+ SSblackbox.inc("alert_comms_blue",1)
tmp_alertlevel = 0
src.aistate = STATE_DEFAULT
if("ai-changeseclevel")
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index a50a2973fc..7c3251a1be 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -535,7 +535,7 @@ GLOBAL_LIST_EMPTY(allCasters)
if(choice=="Confirm")
scan_user(usr)
GLOB.news_network.CreateFeedChannel(channel_name, scanned_user, c_locked)
- feedback_inc("newscaster_channels",1)
+ SSblackbox.inc("newscaster_channels",1)
screen=5
updateUsrDialog()
else if(href_list["set_channel_receiving"])
@@ -558,7 +558,7 @@ GLOBAL_LIST_EMPTY(allCasters)
screen=6
else
GLOB.news_network.SubmitArticle("[parsepencode(msg, usr, SIGNFONT)]", scanned_user, channel_name, photo, 0, allow_comments)
- feedback_inc("newscaster_stories",1)
+ SSblackbox.inc("newscaster_stories",1)
screen=4
msg = ""
updateUsrDialog()
@@ -850,7 +850,7 @@ GLOBAL_LIST_EMPTY(allCasters)
return
/obj/machinery/newscaster/proc/print_paper()
- feedback_inc("newscaster_newspapers_printed",1)
+ SSblackbox.inc("newscaster_newspapers_printed",1)
var/obj/item/weapon/newspaper/NEWSPAPER = new /obj/item/weapon/newspaper
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
NEWSPAPER.news_content += FC
diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm
index d6c6cdc151..6c1fd431e5 100644
--- a/code/game/machinery/telecomms/broadcasting.dm
+++ b/code/game/machinery/telecomms/broadcasting.dm
@@ -144,30 +144,7 @@
// --- This following recording is intended for research and feedback in the use of department radio channels ---
var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]"
- if(istype(GLOB.blackbox))
- switch(freq)
- if(1459)
- GLOB.blackbox.msg_common += blackbox_msg
- if(1351)
- GLOB.blackbox.msg_science += blackbox_msg
- if(1353)
- GLOB.blackbox.msg_command += blackbox_msg
- if(1355)
- GLOB.blackbox.msg_medical += blackbox_msg
- if(1357)
- GLOB.blackbox.msg_engineering += blackbox_msg
- if(1359)
- GLOB.blackbox.msg_security += blackbox_msg
- if(1441)
- GLOB.blackbox.msg_deathsquad += blackbox_msg
- if(1213)
- GLOB.blackbox.msg_syndicate += blackbox_msg
- if(1349)
- GLOB.blackbox.msg_service += blackbox_msg
- if(1347)
- GLOB.blackbox.msg_cargo += blackbox_msg
- else
- GLOB.blackbox.messages += blackbox_msg
+ SSblackbox.LogBroadcast(blackbox_msg, freq)
sleep(50)
if(!QDELETED(virt)) //It could happen to YOU
diff --git a/code/game/machinery/telecomms/broadcasting.dm.rej b/code/game/machinery/telecomms/broadcasting.dm.rej
new file mode 100644
index 0000000000..7033970bd3
--- /dev/null
+++ b/code/game/machinery/telecomms/broadcasting.dm.rej
@@ -0,0 +1,33 @@
+diff a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm (rejected hunks)
+@@ -142,30 +142,7 @@
+ // --- This following recording is intended for research and feedback in the use of department radio channels ---
+
+ var/blackbox_msg = "[AM] [AM.say_quote(message, spans)]"
+- if(istype(GLOB.blackbox))
+- switch(freq)
+- if(1459)
+- GLOB.blackbox.msg_common += blackbox_msg
+- if(1351)
+- GLOB.blackbox.msg_science += blackbox_msg
+- if(1353)
+- GLOB.blackbox.msg_command += blackbox_msg
+- if(1355)
+- GLOB.blackbox.msg_medical += blackbox_msg
+- if(1357)
+- GLOB.blackbox.msg_engineering += blackbox_msg
+- if(1359)
+- GLOB.blackbox.msg_security += blackbox_msg
+- if(1441)
+- GLOB.blackbox.msg_deathsquad += blackbox_msg
+- if(1213)
+- GLOB.blackbox.msg_syndicate += blackbox_msg
+- if(1349)
+- GLOB.blackbox.msg_service += blackbox_msg
+- if(1347)
+- GLOB.blackbox.msg_cargo += blackbox_msg
+- else
+- GLOB.blackbox.messages += blackbox_msg
++ SSblackbox.LogBroadcast(blackbox_msg, freq)
+
+ spawn(50)
+ qdel(virt)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 021b65743f..7d02e70671 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -297,7 +297,7 @@
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
cut_overlays()
if(panel_open)
- add_overlay("[initial(icon_state)]-panel")
+ add_overlay("[initial(icon_state)]-panel")
playsound(src.loc, W.usesound, 50, 1)
updateUsrDialog()
else
@@ -528,7 +528,7 @@
if(icon_vend) //Show the vending animation if needed
flick(icon_vend,src)
new R.product_path(get_turf(src))
- feedback_add_details("vending_machine_usage","[src.type]|[R.product_path]")
+ SSblackbox.add_details("vending_machine_usage","[src.type]|[R.product_path]")
vend_ready = 1
return
diff --git a/code/game/machinery/vending.dm.rej b/code/game/machinery/vending.dm.rej
new file mode 100644
index 0000000000..a487eb51a1
--- /dev/null
+++ b/code/game/machinery/vending.dm.rej
@@ -0,0 +1,10 @@
+diff a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm (rejected hunks)
+@@ -528,7 +528,7 @@
+ if(icon_vend) //Show the vending animation if needed
+ flick(icon_vend,src)
+ new R.product_path(get_turf(src))
+- feedback_add_details("vending_machine_usage","[R.product_path]|[src.type]")
++ SSblackbox.add_details("vending_machine_usage","[R.product_path]|[src.type]")
+ vend_ready = 1
+ return
+
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index b065de37ca..be6e85448b 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -277,7 +277,7 @@
/datum/construction/reversible/mecha/ripley/spawn_result()
..()
- feedback_inc("mecha_ripley_created",1)
+ SSblackbox.inc("mecha_ripley_created",1)
return
@@ -564,7 +564,7 @@
var/obj/mecha/combat/gygax/M = new result(get_turf(holder))
M.CheckParts(holder.contents)
qdel(holder)
- feedback_inc("mecha_gygax_created",1)
+ SSblackbox.inc("mecha_gygax_created",1)
return
/datum/construction/mecha/firefighter_chassis
@@ -786,7 +786,7 @@
/datum/construction/reversible/mecha/firefighter/spawn_result()
..()
- feedback_inc("mecha_firefighter_created",1)
+ SSblackbox.inc("mecha_firefighter_created",1)
return
@@ -864,7 +864,7 @@
/datum/construction/mecha/honker/spawn_result()
..()
- feedback_inc("mecha_honker_created",1)
+ SSblackbox.inc("mecha_honker_created",1)
return
/datum/construction/mecha/durand_chassis
@@ -1149,7 +1149,7 @@
var/obj/mecha/combat/gygax/M = new result(get_turf(holder))
M.CheckParts(holder.contents)
qdel(holder)
- feedback_inc("mecha_durand_created",1)
+ SSblackbox.inc("mecha_durand_created",1)
return
//PHAZON
@@ -1481,7 +1481,7 @@
var/obj/mecha/combat/gygax/M = new result(get_turf(holder))
M.CheckParts(holder.contents)
qdel(holder)
- feedback_inc("mecha_phazon_created",1)
+ SSblackbox.inc("mecha_phazon_created",1)
return
//ODYSSEUS
@@ -1692,5 +1692,5 @@
/datum/construction/reversible/mecha/odysseus/spawn_result()
..()
- feedback_inc("mecha_odysseus_created",1)
+ SSblackbox.inc("mecha_odysseus_created",1)
return
diff --git a/code/game/objects/items/charter.dm b/code/game/objects/items/charter.dm
index 41a793df30..0cf73fd9ff 100644
--- a/code/game/objects/items/charter.dm
+++ b/code/game/objects/items/charter.dm
@@ -86,7 +86,7 @@
name = "station charter for [station_name()]"
desc = "An official document entrusting the governance of \
[station_name()] and surrounding space to Captain [uname]."
- feedback_set_details("station_renames","[station_name()]")
+ SSblackbox.set_details("station_renames","[station_name()]")
if(!unlimited_uses)
used = TRUE
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 1028ca1429..1f923ddd5e 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -58,7 +58,7 @@
if(src.l_arm && src.r_arm)
if(src.l_leg && src.r_leg)
if(src.chest && src.head)
- feedback_inc("cyborg_frames_built",1)
+ SSblackbox.inc("cyborg_frames_built",1)
return 1
return 0
@@ -235,7 +235,7 @@
O.mmi = W //and give the real mmi to the borg.
O.updatename()
- feedback_inc("cyborg_birth",1)
+ SSblackbox.inc("cyborg_birth",1)
forceMove(O)
O.robot_suit = src
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 49cc975546..0ab74a019d 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -45,7 +45,7 @@
if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore()))
apply_cuffs(C,user)
to_chat(user, "You handcuff [C].")
- feedback_add_details("handcuffs","[type]")
+ SSblackbox.add_details("handcuffs","[type]")
add_logs(user, C, "handcuffed")
else
@@ -275,7 +275,7 @@
C.legcuffed = src
src.loc = C
C.update_inv_legcuffed()
- feedback_add_details("handcuffs","[type]")
+ SSblackbox.add_details("handcuffs","[type]")
else if(isanimal(L))
var/mob/living/simple_animal/SA = L
if(SA.mob_size > MOB_SIZE_TINY)
@@ -336,7 +336,7 @@
C.legcuffed = src
src.loc = C
C.update_inv_legcuffed()
- feedback_add_details("handcuffs","[type]")
+ SSblackbox.add_details("handcuffs","[type]")
to_chat(C, "\The [src] ensnares you!")
C.Weaken(weaken)
diff --git a/code/game/objects/items/weapons/handcuffs.dm.rej b/code/game/objects/items/weapons/handcuffs.dm.rej
new file mode 100644
index 0000000000..cfc1658267
--- /dev/null
+++ b/code/game/objects/items/weapons/handcuffs.dm.rej
@@ -0,0 +1,31 @@
+diff a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm (rejected hunks)
+@@ -46,9 +46,9 @@
+ apply_cuffs(C,user)
+ to_chat(user, "You handcuff [C].")
+ if(istype(src, /obj/item/weapon/restraints/handcuffs/cable))
+- feedback_add_details("handcuffs","C")
++ SSblackbox.add_details("handcuffs","C")
+ else
+- feedback_add_details("handcuffs","H")
++ SSblackbox.add_details("handcuffs","H")
+
+ add_logs(user, C, "handcuffed")
+ else
+@@ -278,7 +278,7 @@
+ C.legcuffed = src
+ src.loc = C
+ C.update_inv_legcuffed()
+- feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
++ SSblackbox.add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
+ else if(isanimal(L))
+ var/mob/living/simple_animal/SA = L
+ if(SA.mob_size > MOB_SIZE_TINY)
+@@ -341,7 +341,7 @@
+ C.legcuffed = src
+ src.loc = C
+ C.update_inv_legcuffed()
+- feedback_add_details("handcuffs","B")
++ SSblackbox.add_details("handcuffs","B")
+ to_chat(C, "\The [src] ensnares you!")
+ C.Weaken(weaken)
+
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 571aece4c3..aa720f1979 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -39,7 +39,7 @@
SSreligion.holy_weapon_type = holy_weapon.type
- feedback_set_details("chaplain_weapon","[choice]")
+ SSblackbox.set_details("chaplain_weapon","[choice]")
if(holy_weapon)
holy_weapon.reskinned = TRUE
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 83805d969a..7775b3692a 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
SSreligion.bible_icon_state = B.icon_state
SSreligion.bible_item_state = B.item_state
- feedback_set_details("religion_book","[biblename]")
+ SSblackbox.set_details("religion_book","[biblename]")
usr << browse(null, "window=editicon")
/obj/item/weapon/storage/book/bible/proc/bless(mob/living/carbon/human/H, mob/living/user)
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 3cf35daa03..7820031700 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -180,7 +180,7 @@
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(loc, laws, brain.brainmob)
if(brain.force_replace_ai_name)
A.fully_replace_character_name(A.name, brain.replacement_ai_name())
- feedback_inc("cyborg_ais_created",1)
+ SSblackbox.inc("cyborg_ais_created",1)
qdel(src)
else
state = AI_READY_CORE
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index a17fcf2ca8..f4a3403ee5 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -63,7 +63,7 @@
if(istype(src, /turf/open/floor/plating/asteroid))
to_chat(user, "You dig a hole.")
gets_dug()
- feedback_add_details("pick_used_mining","[W.type]")
+ SSblackbox.add_details("pick_used_mining","[W.type]")
if(istype(W,/obj/item/weapon/storage/bag/ore))
var/obj/item/weapon/storage/bag/ore/S = W
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 5805d75e56..398ff190f2 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -63,7 +63,7 @@
if(ismineralturf(src))
to_chat(user, "You finish cutting into the rock.")
gets_drilled(user)
- feedback_add_details("pick_used_mining","[P.type]")
+ SSblackbox.add_details("pick_used_mining","[P.type]")
else
return attack_hand(user)
@@ -72,7 +72,7 @@
var/i
for(i in 1 to mineralAmt)
new mineralType(src)
- feedback_add_details("ore_mined",mineralType)
+ SSblackbox.add_details("ore_mined",mineralType)
ChangeTurf(turf_type, defer_change)
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction
diff --git a/code/game/turfs/simulated/minerals.dm.rej b/code/game/turfs/simulated/minerals.dm.rej
new file mode 100644
index 0000000000..2ac5181cc8
--- /dev/null
+++ b/code/game/turfs/simulated/minerals.dm.rej
@@ -0,0 +1,19 @@
+diff a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm (rejected hunks)
+@@ -64,7 +64,7 @@
+ if(ismineralturf(src))
+ to_chat(user, "You finish cutting into the rock.")
+ gets_drilled(user)
+- feedback_add_details("pick_used_mining","[P.type]")
++ SSblackbox.add_details("pick_used_mining","[P.type]")
+ else
+ return attack_hand(user)
+ return
+@@ -74,7 +74,7 @@
+ var/i
+ for (i=0;iTP - "
body += "PM - "
body += "SM - "
- body += "FLW - "
- body += "LOGS\]
"
+ body += "FLW - "
+ body += "LOGS\]
"
body += "Mob type = [M.type]
"
@@ -166,7 +166,7 @@
body += "