diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm
index 99f6a148a4..06aa66fd33 100644
--- a/code/controllers/admin.dm
+++ b/code/controllers/admin.dm
@@ -43,9 +43,9 @@
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 100%
rename from code/orphaned_procs/statistics.dm
rename to code/controllers/subsystem/blackbox.dm
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 1499bc5029..d73d417f5f 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -116,7 +116,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..9c730e92b1 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -1,23 +1,38 @@
+#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)
- if(C.is_afk(config.afk_period))
- var/cmob = C.mob
- if(!(istype(cmob, /mob/dead/observer) || (istype(cmob, /mob/dead) && C.holder)))
+/datum/controller/subsystem/server_maint/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]
+ currentrun.len--
+
+ if(config.kick_inactive)
+ 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 [config.afk_period / 600] minutes and have been disconnected.")
+ 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()
+ 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/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index f1b5d3a973..526f64cee7 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 670e08e7a2..deb5ad7e1a 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -194,7 +194,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
@@ -203,10 +203,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 65dcb863eb..f3832a830b 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..44d1121f45 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -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 c26945801b..c748484c1b 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -260,10 +260,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++
@@ -283,10 +283,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 e9e1a95e73..8541fd154c 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.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.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/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.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.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;i