diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm
index 5047b31641..752131369b 100644
--- a/code/modules/admin/DB_ban/functions.dm
+++ b/code/modules/admin/DB_ban/functions.dm
@@ -1,4 +1,5 @@
#define MAX_ADMIN_BANS_PER_ADMIN 1
+#define MAX_ADMIN_BANS_PER_HEADMIN 3
//Either pass the mob you wish to ban in the 'banned_mob' attribute, or the banckey, banip and bancid variables. If both are passed, the mob takes priority! If a mob is not passed, banckey is the minimum that needs to be passed! banip and bancid are optional.
/datum/admins/proc/DB_ban_record(bantype, mob/banned_mob, duration = -1, reason, job = "", banckey = null, banip = null, bancid = null)
@@ -118,8 +119,11 @@
return
if(query_check_adminban_amt.NextRow())
var/adm_bans = text2num(query_check_adminban_amt.item[1])
- if(adm_bans >= MAX_ADMIN_BANS_PER_ADMIN)
- to_chat(usr, "You already logged [MAX_ADMIN_BANS_PER_ADMIN] admin ban(s) or more. Do not abuse this function!")
+ var/max_bans = MAX_ADMIN_BANS_PER_ADMIN
+ if (check_rights(R_PERMISSIONS, FALSE))
+ max_bans = MAX_ADMIN_BANS_PER_HEADMIN
+ if(adm_bans >= max_bans)
+ to_chat(usr, "You already logged [max_bans] admin ban(s) or more. Do not abuse this function!")
return
if(!computerid)
computerid = "0"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index ba1cb9c524..79d9838ea2 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -508,8 +508,7 @@
toggle_ooc()
log_admin("[key_name(usr)] toggled OOC.")
message_admins("[key_name_admin(usr)] toggled OOC.")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed]"))
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle OOC", "[GLOB.ooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleoocdead()
set category = "Server"
@@ -519,7 +518,7 @@
log_admin("[key_name(usr)] toggled OOC.")
message_admins("[key_name_admin(usr)] toggled Dead OOC.")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Dead OOC", "[GLOB.dooc_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/startnow()
set category = "Server"
@@ -553,7 +552,7 @@
log_admin("[key_name(usr)] toggled new player game entering.")
message_admins("[key_name_admin(usr)] toggled new player game entering.")
world.update_status()
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Entering", "[GLOB.enter_allowed]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Entering", "[GLOB.enter_allowed ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleAI()
set category = "Server"
@@ -567,7 +566,7 @@
to_chat(world, "The AI job is chooseable now.")
log_admin("[key_name(usr)] toggled AI allowed.")
world.update_status()
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle AI", "[!alai]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle AI", "[!alai ? "Disabled" : "Enabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleaban()
set category = "Server"
@@ -582,7 +581,7 @@
message_admins("[key_name_admin(usr)] toggled respawn to [!new_nores ? "On" : "Off"].")
log_admin("[key_name(usr)] toggled respawn to [!new_nores ? "On" : "Off"].")
world.update_status()
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[!new_nores]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[!new_nores ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/delay()
set category = "Server"
@@ -665,7 +664,7 @@
to_chat(world, "The tinted_weldhelh has been disabled!")
log_admin("[key_name(usr)] toggled tinted_weldhelh.")
message_admins("[key_name_admin(usr)] toggled tinted_weldhelh.")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Tinted Welding Helmets", "[GLOB.tinted_weldhelh]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Tinted Welding Helmets", "[GLOB.tinted_weldhelh ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleguests()
set category = "Server"
@@ -679,7 +678,7 @@
to_chat(world, "Guests may now enter the game.")
log_admin("[key_name(usr)] toggled guests game entering [!new_guest_ban ? "" : "dis"]allowed.")
message_admins("[key_name_admin(usr)] toggled guests game entering [!new_guest_ban ? "" : "dis"]allowed.")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Guests", "[!new_guest_ban]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Guests", "[!new_guest_ban ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/output_ai_laws()
var/ai_number = 0
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 16bd79f74a..b577a84a1d 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -1,3 +1,4 @@
+
/datum/admins/proc/create_mob(mob/user)
var/static/create_mob_html
if (!create_mob_html)
@@ -23,4 +24,4 @@
H.dna.blood_type = random_blood_type()
H.update_body()
H.update_hair()
- H.update_body_parts()
+ H.update_body_parts()
\ No newline at end of file
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index e9d4462c0a..82b60ca933 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -173,4 +173,4 @@ you will have to do something like if(client.rights & R_ADMIN) yourself.
return "admin_token=[RawHrefToken(forceGlobal)]"
/proc/HrefTokenFormField(forceGlobal = FALSE)
- return ""
+ return ""
\ No newline at end of file
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 1805cf327d..e38f857cd4 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -612,6 +612,20 @@
dat += ""
+ var/list/pirates = get_antagonists(/datum/antagonist/pirate)
+ if(pirates.len > 0)
+ dat += "
Pirates
"
+ for(var/datum/mind/N in pirates)
+ var/mob/M = N.current
+ if(!M)
+ dat += "
"
+
if(istype(SSticker.mode, /datum/game_mode/monkey))
var/datum/game_mode/monkey/mode = SSticker.mode
dat += "
Monkey
"
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index 14d94acf86..13e07e0368 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -43,6 +43,8 @@
if(check_rights(R_FUN,0))
dat += {"
+ Fun Secrets
+ Trigger a Virus Outbreak Turn all humans into monkeys Chinese Cartoons
@@ -194,7 +196,7 @@
if("moveminingshuttle")
if(!check_rights(R_ADMIN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Mining Shuttle")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Send Mining Shuttle"))
if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
message_admins("[key_name_admin(usr)] moved mining shuttle")
log_admin("[key_name(usr)] moved the mining shuttle")
@@ -202,7 +204,7 @@
if("movelaborshuttle")
if(!check_rights(R_ADMIN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Labor Shuttle")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Send Labor Shuttle"))
if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
message_admins("[key_name_admin(usr)] moved labor shuttle")
log_admin("[key_name(usr)] moved the labor shuttle")
@@ -210,7 +212,7 @@
if("moveferry")
if(!check_rights(R_ADMIN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send CentCom Ferry")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Send CentCom Ferry"))
if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
message_admins("[key_name_admin(usr)] moved the CentCom ferry")
log_admin("[key_name(usr)] moved the CentCom ferry")
@@ -222,7 +224,7 @@
if(A)
var/new_perma = !A.perma_docked
A.perma_docked = new_perma
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Permadock Arrivals Shuttle", "[new_perma]"))
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Permadock Arrivals Shuttle", "[new_perma ? "Enabled" : "Disabled"]"))
message_admins("[key_name_admin(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle")
log_admin("[key_name(usr)] [new_perma ? "stopped" : "started"] the arrivals shuttle")
else
@@ -272,7 +274,7 @@
if("monkey")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Monkeyize All Humans")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Monkeyize All Humans"))
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
spawn(0)
H.monkeyize()
@@ -283,7 +285,7 @@
return
var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list
if(result)
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Species Change([result])")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Species Change", "[result]"))
log_admin("[key_name(usr)] turned all humans into [result]", 1)
message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
var/newtype = GLOB.species_list[result]
@@ -294,12 +296,12 @@
if(!check_rights(R_FUN))
return
usr.client.triple_ai()
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Triple AI")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Triple AI"))
if("power")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All APCs")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Power All APCs"))
log_admin("[key_name(usr)] made all areas powered", 1)
message_admins("[key_name_admin(usr)] made all areas powered")
power_restore()
@@ -307,7 +309,7 @@
if("unpower")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Depower All APCs")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Depower All APCs"))
log_admin("[key_name(usr)] made all areas unpowered", 1)
message_admins("[key_name_admin(usr)] made all areas unpowered")
power_failure()
@@ -315,7 +317,7 @@
if("quickpower")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All SMESs")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Power All SMESs"))
log_admin("[key_name(usr)] made all SMESs powered", 1)
message_admins("[key_name_admin(usr)] made all SMESs powered")
power_restore_quick()
@@ -329,7 +331,7 @@
var/objective = copytext(sanitize(input("Enter an objective")),1,MAX_MESSAGE_LEN)
if(!objective)
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Traitor All ([objective])")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Traitor All", "[objective]"))
for(var/mob/living/H in GLOB.player_list)
if(!(ishuman(H)||istype(H, /mob/living/silicon/)))
continue
@@ -350,7 +352,7 @@
if("changebombcap")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Bomb Cap")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Bomb Cap"))
var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be above 4)", "New Bomb Cap", GLOB.MAX_EX_LIGHT_RANGE) as num|null
if (!CONFIG_SET(number/bombcap, newBombCap))
@@ -362,7 +364,7 @@
if("blackout")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Break All Lights")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Break All Lights"))
message_admins("[key_name_admin(usr)] broke all lights")
for(var/obj/machinery/light/L in GLOB.machines)
L.break_light_tube()
@@ -378,7 +380,7 @@
if(animetype == "Cancel" || droptype == "Cancel")
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Chinese Cartoons")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Chinese Cartoons"))
message_admins("[key_name_admin(usr)] made everything kawaii.")
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
SEND_SOUND(H, sound('sound/ai/animes.ogg'))
@@ -408,7 +410,7 @@
if("whiteout")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Fix All Lights")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Fix All Lights"))
message_admins("[key_name_admin(usr)] fixed all lights")
for(var/obj/machinery/light/L in GLOB.machines)
L.fix()
@@ -419,7 +421,7 @@
if("virus")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Virus Outbreak")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Virus Outbreak"))
switch(alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose"))
if("Make Your Own")
AdminCreateVirus(usr.client)
@@ -434,7 +436,7 @@
if("retardify")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage"))
for(var/mob/living/carbon/human/H in GLOB.player_list)
to_chat(H, "You suddenly feel stupid.")
H.adjustBrainLoss(60, 80)
@@ -443,24 +445,17 @@
if("eagles")//SCRAW
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Egalitarian Station")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Egalitarian Station"))
for(var/obj/machinery/door/airlock/W in GLOB.machines)
if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/ai/commandreport.ogg')
- if("ak47s")
- if(!check_rights(R_FUN))
- return
- message_admins("[key_name_admin(usr)] activated AK-47s for Everyone!")
- usr.client.ak47s()
- sound_to_playing_players('sound/misc/ak47s.ogg')
-
if("guns")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Summon Guns")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Guns"))
var/survivor_probability = 0
switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
if("Some Antags")
@@ -473,7 +468,7 @@
if("magic")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Summon Magic")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Magic"))
var/survivor_probability = 0
switch(alert("Do you want this to create survivors antagonists?",,"No Antags","Some Antags","All Antags!"))
if("Some Antags")
@@ -489,22 +484,22 @@
if(!SSevents.wizardmode)
if(alert("Do you want to toggle summon events on?",,"Yes","No") == "Yes")
summonevents()
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Activate Summon Events")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Activate"))
else
switch(alert("What would you like to do?",,"Intensify Summon Events","Turn Off Summon Events","Nothing"))
if("Intensify Summon Events")
summonevents()
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Intensify Summon Events")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Intensify"))
if("Turn Off Summon Events")
SSevents.toggleWizardmode()
SSevents.resetFrequency()
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Disable Summon Events")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Summon Events", "Disable"))
if("dorf")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Dwarf Beards")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Dwarf Beards"))
for(var/mob/living/carbon/human/B in GLOB.carbon_list)
B.facial_hair_style = "Dward Beard"
B.update_hair()
@@ -513,14 +508,14 @@
if("onlyone")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "There Can Be Only One")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("There Can Be Only One"))
usr.client.only_one()
sound_to_playing_players('sound/misc/highlander.ogg')
if("delayed_onlyone")
if(!check_rights(R_FUN))
return
- SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "There Can Be Only One")
+ SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("There Can Be Only One"))
usr.client.only_one_delayed()
sound_to_playing_players('sound/misc/highlander_delayed.ogg')
diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm
index 20721077df..112dff352b 100644
--- a/code/modules/admin/verbs/BrokenInhands.dm
+++ b/code/modules/admin/verbs/BrokenInhands.dm
@@ -31,3 +31,5 @@
fdel(F)
WRITE_FILE(F, text)
to_chat(world, "Completely successfully and written to [F]")
+
+
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
index 8a7c030458..56faa1f6c4 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
@@ -114,8 +114,8 @@
/proc/_range(Dist, Center = usr)
return range(Dist, Center)
-/proc/_regex(pattern, flags_1)
- return regex(pattern, flags_1)
+/proc/_regex(pattern, flags)
+ return regex(pattern, flags)
/proc/_REGEX_QUOTE(text)
return REGEX_QUOTE(text)
diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm
index 7093ee23ea..5aa3258f07 100644
--- a/code/modules/admin/verbs/cinematic.dm
+++ b/code/modules/admin/verbs/cinematic.dm
@@ -8,4 +8,4 @@
var/datum/cinematic/choice = input(src,"Cinematic","Choose",null) as anything in subtypesof(/datum/cinematic)
if(choice)
- Cinematic(initial(choice.id),world,null)
+ Cinematic(initial(choice.id),world,null)
\ No newline at end of file
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 0fe79e10de..43454f3bd4 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -107,6 +107,8 @@ GLOBAL_VAR(LastAdminCalledTarget)
GLOBAL_PROTECT(LastAdminCalledTarget)
GLOBAL_VAR(LastAdminCalledProc)
GLOBAL_PROTECT(LastAdminCalledProc)
+GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention)
+GLOBAL_PROTECT(AdminProcCallSpamPrevention)
/proc/WrapAdminProcCall(target, procname, list/arguments)
var/current_caller = GLOB.AdminProcCaller
@@ -114,9 +116,14 @@ GLOBAL_PROTECT(LastAdminCalledProc)
if(!ckey)
CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]")
if(current_caller && current_caller != ckey)
- to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.")
- UNTIL(!GLOB.AdminProcCaller)
- to_chat(usr, "Running your proc")
+ if(!GLOB.AdminProcCallSpamPrevention[ckey])
+ to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.")
+ GLOB.AdminProcCallSpamPrevention[ckey] = TRUE
+ UNTIL(!GLOB.AdminProcCaller)
+ to_chat(usr, "Running your proc")
+ GLOB.AdminProcCallSpamPrevention -= ckey
+ else
+ UNTIL(!GLOB.AdminProcCaller)
GLOB.LastAdminCalledProc = procname
if(target != GLOBAL_PROC)
GLOB.LastAdminCalledTargetRef = "[REF(target)]"
@@ -802,7 +809,7 @@ GLOBAL_PROTECT(LastAdminCalledProc)
set category = "Debug"
set name = "Display overlay Log"
set desc = "Display SSoverlays log of everything that's passed through it."
-
+
render_stats(SSoverlays.stats, src)
/client/proc/cmd_display_init_log()
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index bcf58b1a4c..6f2bcb6c46 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -53,17 +53,6 @@
set category = "Debug"
set name = "Radio report"
- var/filters = list(
- "1" = "GLOB.RADIO_TO_AIRALARM",
- "2" = "GLOB.RADIO_FROM_AIRALARM",
- "3" = "GLOB.RADIO_CHAT",
- "4" = "GLOB.RADIO_ATMOSIA",
- "5" = "GLOB.RADIO_NAVBEACONS",
- "6" = "GLOB.RADIO_AIRLOCK",
- "7" = "RADIO_SECBOT",
- "8" = "RADIO_MULEBOT",
- "_default" = "NO_FILTER"
- )
var/output = "Radio Report"
for (var/fq in SSradio.frequencies)
output += "Freq: [fq] "
@@ -74,9 +63,9 @@
for (var/filter in fqs.devices)
var/list/f = fqs.devices[filter]
if (!f)
- output += " [filters[filter]]: ERROR "
+ output += " [filter]: ERROR "
continue
- output += " [filters[filter]]: [f.len] "
+ output += " [filter]: [f.len] "
for (var/device in f)
if (istype(device, /atom))
var/atom/A = device
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 5d0c2fe833..ce50378f4d 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -39,13 +39,13 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
/client/proc/cmd_admin_rejuvenate,
/datum/admins/proc/show_traitor_panel,
/client/proc/disable_communication,
- /client/proc/print_pointers,
/client/proc/cmd_show_at_list,
/client/proc/cmd_show_at_markers,
/client/proc/manipulate_organs,
/client/proc/start_line_profiling,
/client/proc/stop_line_profiling,
- /client/proc/show_line_profiling
+ /client/proc/show_line_profiling,
+ /client/proc/create_mapping_job_icons
))
/obj/effect/debugging/mapfix_marker
@@ -265,3 +265,31 @@ GLOBAL_VAR_INIT(say_disabled, FALSE)
message_admins("[src.ckey] used 'Disable all communication verbs', killing all communication methods.")
else
message_admins("[src.ckey] used 'Disable all communication verbs', restoring all communication methods.")
+
+//This generates the icon states for job starting location landmarks.
+/client/proc/create_mapping_job_icons()
+ set name = "Generate job landmarks icons"
+ set category = "Mapping"
+ var/icon/final = icon()
+ var/mob/living/carbon/human/dummy/D = new(locate(1,1,1)) //spawn on 1,1,1 so we don't have runtimes when items are deleted
+ D.setDir(SOUTH)
+ for(var/job in subtypesof(/datum/job))
+ var/datum/job/JB = new job
+ switch(JB.title)
+ if("AI")
+ final.Insert(icon('icons/mob/ai.dmi', "ai", SOUTH, 1), "AI")
+ if("Cyborg")
+ final.Insert(icon('icons/mob/robots.dmi', "robot", SOUTH, 1), "Cyborg")
+ else
+ for(var/obj/item/I in D)
+ qdel(I)
+ randomize_human(D)
+ JB.equip(D, TRUE, FALSE)
+ COMPILE_OVERLAYS(D)
+ var/icon/I = icon(getFlatIcon(D), frame = 1)
+ final.Insert(I, JB.title)
+ qdel(D)
+ //Also add the x
+ for(var/x_number in 1 to 4)
+ final.Insert(icon('icons/mob/screen_gen.dmi', "x[x_number == 1 ? "" : x_number]"), "x[x_number == 1 ? "" : x_number]")
+ fcopy(final, "icons/mob/landmarks.dmi")
\ No newline at end of file
diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm
index 6043d23d62..db1150fb72 100644
--- a/code/modules/admin/verbs/massmodvar.dm
+++ b/code/modules/admin/verbs/massmodvar.dm
@@ -64,14 +64,14 @@
if(default == VV_NUM)
var/dir_text = ""
- if(dir < 0 && dir < 16)
- if(dir & 1)
+ if(var_value > 0 && var_value < 16)
+ if(var_value & 1)
dir_text += "NORTH"
- if(dir & 2)
+ if(var_value & 2)
dir_text += "SOUTH"
- if(dir & 4)
+ if(var_value & 4)
dir_text += "EAST"
- if(dir & 8)
+ if(var_value & 8)
dir_text += "WEST"
if(dir_text)
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index f6e8d93e62..e4c86315b5 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -448,11 +448,11 @@ GLOBAL_PROTECT(VVpixelmovement)
if(tdir > 0 && tdir < 16)
if(tdir & 1)
dir_text += "NORTH"
- if(dir & 2)
+ if(tdir & 2)
dir_text += "SOUTH"
- if(dir & 4)
+ if(tdir & 4)
dir_text += "EAST"
- if(dir & 8)
+ if(tdir & 8)
dir_text += "WEST"
if(dir_text)
@@ -567,14 +567,14 @@ GLOBAL_PROTECT(VVpixelmovement)
if(default == VV_NUM)
var/dir_text = ""
- if(dir < 0 && dir < 16)
- if(dir & 1)
+ if(var_value > 0 && var_value < 16)
+ if(var_value & 1)
dir_text += "NORTH"
- if(dir & 2)
+ if(var_value & 2)
dir_text += "SOUTH"
- if(dir & 4)
+ if(var_value & 4)
dir_text += "EAST"
- if(dir & 8)
+ if(var_value & 8)
dir_text += "WEST"
if(dir_text)
diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm
index f7d1d60aab..fc0cab66c9 100644
--- a/code/modules/admin/verbs/panicbunker.dm
+++ b/code/modules/admin/verbs/panicbunker.dm
@@ -12,5 +12,4 @@
message_admins("[key_name_admin(usr)] has toggled the Panic Bunker, it is now [new_pb ? "enabled" : "disabled"].")
if (new_pb && !SSdbcore.Connect())
message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Panic Bunker", "[new_pb]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Panic Bunker", "[new_pb ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 29d95c639f..33fb3867d1 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -80,18 +80,37 @@
to_chat(src, "For youtube-dl shortcuts like ytsearch: please use the appropriate full url from the website.")
return
var/shell_scrubbed_input = shell_url_scrub(web_sound_input)
- var/list/output = world.shelleo("[ytdl] --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --get-url \"[shell_scrubbed_input]\"")
+ var/list/output = world.shelleo("[ytdl] --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_scrubbed_input]\"")
var/errorlevel = output[SHELLEO_ERRORLEVEL]
var/stdout = output[SHELLEO_STDOUT]
var/stderr = output[SHELLEO_STDERR]
if(!errorlevel)
- var/static/regex/content_url_regex = regex("https?://\\S+")
- if(content_url_regex.Find(stdout))
- web_sound_url = content_url_regex.match
+ var/list/data
+ try
+ data = json_decode(stdout)
+ catch(var/exception/e)
+ to_chat(src, "Youtube-dl JSON parsing FAILED:")
+ to_chat(src, "[e]: [stdout]")
+ return
+
+ if (data["url"])
+ web_sound_url = data["url"]
+ var/title = "[data["title"]]"
+ var/webpage_url = title
+ if (data["webpage_url"])
+ webpage_url = "[title]"
+
+ var/res = alert(usr, "Show the title of and link to this song to the players?\n[title]",, "No", "Yes", "Cancel")
+ switch(res)
+ if("Yes")
+ to_chat(world, "An admin played: [webpage_url]")
+ if("Cancel")
+ return
if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
pitch = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
to_chat(src, "You feel the Honkmother messing with your song...")
+
SSblackbox.record_feedback("nested tally", "played_url", 1, list("[ckey]", "[web_sound_input]"))
log_admin("[key_name(src)] played web sound: [web_sound_input]")
message_admins("[key_name(src)] played web sound: [web_sound_input]")
diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm
index fc81ca3a02..a9b5093e99 100644
--- a/code/modules/admin/verbs/possess.dm
+++ b/code/modules/admin/verbs/possess.dm
@@ -21,25 +21,26 @@
usr.loc = O
usr.real_name = O.name
usr.name = O.name
- usr.client.eye = O
+ usr.reset_perspective(O)
usr.control_object = O
SSblackbox.record_feedback("tally", "admin_verb", 1, "Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/proc/release(obj/O in world)
+/proc/release()
set name = "Release Obj"
set category = "Object"
//usr.loc = get_turf(usr)
if(usr.control_object && usr.name_archive) //if you have a name archived and if you are actually relassing an object
usr.real_name = usr.name_archive
+ usr.name_archive = ""
usr.name = usr.real_name
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
H.name = H.get_visible_name()
-// usr.regenerate_icons() //So the name is updated properly
- usr.loc = O.loc
- usr.client.eye = usr
+
+ usr.loc = get_turf(usr.control_object)
+ usr.reset_perspective()
usr.control_object = null
SSblackbox.record_feedback("tally", "admin_verb", 1, "Release Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index b37ff9ceb4..e5f08b82bc 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -125,7 +125,7 @@
var/msg = "[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]"
message_admins(msg)
admin_ticket_log(M, msg)
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[M.status_flags & GODMODE]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Godmode", "[M.status_flags & GODMODE ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/cmd_admin_mute(whom, mute_type, automute = 0)
@@ -747,7 +747,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
to_chat(usr, "Random events disabled")
message_admins("Admin [key_name_admin(usr)] has disabled random events.")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Random Events", "[new_are]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Random Events", "[new_are ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_change_sec_level()
@@ -980,7 +980,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].")
message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].")
log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Antag HUD", "[adding_hud]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Antag HUD", "[adding_hud ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/has_antag_hud()
var/datum/atom_hud/A = GLOB.huds[ANTAG_HUD_TRAITOR]
@@ -1199,7 +1199,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if (GLOB.hub_visibility && !world.reachable)
message_admins("WARNING: The server will not show up on the hub because byond is detecting that a filewall is blocking incoming connections.")
- SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/smite(mob/living/carbon/human/target as mob)
set name = "Smite"
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 315e28df02..7e0aa59816 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -114,3 +114,4 @@
/obj/item/device/assembly/interact(mob/user)
return //HTML MENU FOR WIRES GOES HERE
+
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 6ac1ef093d..439ea314bb 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -68,11 +68,10 @@
a_right.on_found(finder)
/obj/item/device/assembly_holder/Move()
- ..()
+ . = ..()
if(a_left && a_right)
a_left.holder_movement()
a_right.holder_movement()
- return
/obj/item/device/assembly_holder/attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess
if(a_left && a_right)
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index 0b9d42e42e..565465ec6d 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -83,10 +83,9 @@
/obj/item/device/assembly/infra/Move()
var/t = dir
- ..()
+ . = ..()
setDir(t)
qdel(first)
- return
/obj/item/device/assembly/infra/holder_movement()
if(!holder)
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index d9fdab39be..1b0102abdd 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -9,8 +9,8 @@
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
attachable = 1
- var/code = 30
- var/frequency = 1457
+ var/code = DEFAULT_SIGNALER_CODE
+ var/frequency = FREQ_SIGNALER
var/delay = 0
var/datum/radio_frequency/radio_connection
@@ -73,7 +73,7 @@ Code:
if (href_list["freq"])
var/new_frequency = (frequency + text2num(href_list["freq"]))
- if(new_frequency < 1200 || new_frequency > 1600)
+ if(new_frequency < MIN_FREE_FREQ || new_frequency > MAX_FREE_FREQ)
new_frequency = sanitize_frequency(new_frequency)
set_frequency(new_frequency)
@@ -105,10 +105,7 @@ Code:
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.source = src
- signal.encryption = code
- signal.data["message"] = "ACTIVATE"
+ var/datum/signal/signal = new(list("code" = code))
radio_connection.post_signal(src, signal)
var/time = time2text(world.realtime,"hh:mm:ss")
@@ -122,7 +119,7 @@ Code:
/obj/item/device/assembly/signaler/receive_signal(datum/signal/signal)
if(!signal)
return 0
- if(signal.encryption != code)
+ if(signal.data["code"] != code)
return 0
if(!(src.wires & WIRE_RADIO_RECEIVE))
return 0
@@ -132,13 +129,9 @@ Code:
/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency)
- if(!SSradio)
- sleep(20)
- if(!SSradio)
- return
SSradio.remove_object(src, frequency)
frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_CHAT)
+ radio_connection = SSradio.add_object(src, frequency, RADIO_SIGNALER)
return
// Embedded signaller used in grenade construction.
@@ -175,7 +168,7 @@ Code:
/obj/item/device/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
if(!signal)
return 0
- if(signal.encryption != code)
+ if(signal.data["code"] != code)
return 0
for(var/obj/effect/anomaly/A in get_turf(src))
A.anomalyNeutralize()
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 617f384592..913176b662 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -1,91 +1,91 @@
-/obj/item/device/assembly/voice
- name = "voice analyzer"
- desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
- icon_state = "voice"
- materials = list(MAT_METAL=500, MAT_GLASS=50)
+/obj/item/device/assembly/voice
+ name = "voice analyzer"
+ desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
+ icon_state = "voice"
+ materials = list(MAT_METAL=500, MAT_GLASS=50)
flags_1 = HEAR_1
- attachable = 1
- verb_say = "beeps"
- verb_ask = "beeps"
- verb_exclaim = "beeps"
- var/listening = 0
- var/recorded = "" //the activation message
- var/mode = 1
- var/static/list/modes = list("inclusive",
- "exclusive",
- "recognizer",
- "voice sensor")
-
-/obj/item/device/assembly/voice/examine(mob/user)
- ..()
- to_chat(user, "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.")
-
-/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
- if(speaker == src)
- return
-
- if(listening && !radio_freq)
- record_speech(speaker, raw_message, message_language)
- else
- if(check_activation(speaker, raw_message))
- addtimer(CALLBACK(src, .proc/pulse, 0), 10)
-
-/obj/item/device/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language)
- switch(mode)
- if(1)
- recorded = raw_message
- listening = 0
- say("Activation message is '[recorded]'.", message_language)
- if(2)
- recorded = raw_message
- listening = 0
- say("Activation message is '[recorded]'.", message_language)
- if(3)
- recorded = speaker.GetVoice()
- listening = 0
- say("Your voice pattern is saved.", message_language)
- if(4)
- if(length(raw_message))
- addtimer(CALLBACK(src, .proc/pulse, 0), 10)
-
-/obj/item/device/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message)
- . = 0
- switch(mode)
- if(1)
- if(findtext(raw_message, recorded))
- . = 1
- if(2)
- if(raw_message == recorded)
- . = 1
- if(3)
- if(speaker.GetVoice() == recorded)
- . = 1
- if(4)
- if(length(raw_message))
- . = 1
-
-/obj/item/device/assembly/voice/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/device/multitool))
- mode %= modes.len
- mode++
- to_chat(user, "You set [src] into a [modes[mode]] mode.")
- listening = 0
- recorded = ""
- else
- return ..()
-
-/obj/item/device/assembly/voice/activate()
- if(secured)
- if(!holder)
- listening = !listening
- say("[listening ? "Now" : "No longer"] recording input.")
-
-/obj/item/device/assembly/voice/attack_self(mob/user)
- if(!user)
- return 0
- activate()
- return 1
-
-/obj/item/device/assembly/voice/toggle_secure()
- . = ..()
- listening = 0
+ attachable = 1
+ verb_say = "beeps"
+ verb_ask = "beeps"
+ verb_exclaim = "beeps"
+ var/listening = 0
+ var/recorded = "" //the activation message
+ var/mode = 1
+ var/static/list/modes = list("inclusive",
+ "exclusive",
+ "recognizer",
+ "voice sensor")
+
+/obj/item/device/assembly/voice/examine(mob/user)
+ ..()
+ to_chat(user, "Use a multitool to swap between \"inclusive\", \"exclusive\", \"recognizer\", and \"voice sensor\" mode.")
+
+/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+ if(speaker == src)
+ return
+
+ if(listening && !radio_freq)
+ record_speech(speaker, raw_message, message_language)
+ else
+ if(check_activation(speaker, raw_message))
+ addtimer(CALLBACK(src, .proc/pulse, 0), 10)
+
+/obj/item/device/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message, datum/language/message_language)
+ switch(mode)
+ if(1)
+ recorded = raw_message
+ listening = 0
+ say("Activation message is '[recorded]'.", message_language)
+ if(2)
+ recorded = raw_message
+ listening = 0
+ say("Activation message is '[recorded]'.", message_language)
+ if(3)
+ recorded = speaker.GetVoice()
+ listening = 0
+ say("Your voice pattern is saved.", message_language)
+ if(4)
+ if(length(raw_message))
+ addtimer(CALLBACK(src, .proc/pulse, 0), 10)
+
+/obj/item/device/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message)
+ . = 0
+ switch(mode)
+ if(1)
+ if(findtext(raw_message, recorded))
+ . = 1
+ if(2)
+ if(raw_message == recorded)
+ . = 1
+ if(3)
+ if(speaker.GetVoice() == recorded)
+ . = 1
+ if(4)
+ if(length(raw_message))
+ . = 1
+
+/obj/item/device/assembly/voice/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/device/multitool))
+ mode %= modes.len
+ mode++
+ to_chat(user, "You set [src] into a [modes[mode]] mode.")
+ listening = 0
+ recorded = ""
+ else
+ return ..()
+
+/obj/item/device/assembly/voice/activate()
+ if(secured)
+ if(!holder)
+ listening = !listening
+ say("[listening ? "Now" : "No longer"] recording input.")
+
+/obj/item/device/assembly/voice/attack_self(mob/user)
+ if(!user)
+ return 0
+ activate()
+ return 1
+
+/obj/item/device/assembly/voice/toggle_secure()
+ . = ..()
+ listening = 0
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 84b163748f..96b7df597c 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -80,8 +80,8 @@
var/shorted = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
- var/frequency = 1439
- var/alarm_frequency = 1437
+ var/frequency = FREQ_ATMOS_CONTROL
+ var/alarm_frequency = FREQ_ATMOS_ALARMS
var/datum/radio_frequency/radio_connection
var/list/TLV = list( // Breathable air.
@@ -427,21 +427,16 @@
/obj/machinery/airalarm/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_TO_AIRALARM)
+ radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM)
/obj/machinery/airalarm/proc/send_signal(target, list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise
if(!radio_connection)
return 0
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = command
+ var/datum/signal/signal = new(command)
signal.data["tag"] = target
signal.data["sigtype"] = "command"
-
- radio_connection.post_signal(src, signal, GLOB.RADIO_FROM_AIRALARM)
+ radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM)
return 1
@@ -631,12 +626,10 @@
var/area/A = get_area(src)
- var/datum/signal/alert_signal = new
- alert_signal.source = src
- alert_signal.transmission_method = 1
- alert_signal.data["zone"] = A.name
- alert_signal.data["type"] = "Atmospheric"
-
+ var/datum/signal/alert_signal = new(list(
+ "zone" = A.name,
+ "type" = "Atmospheric"
+ ))
if(alert_level==2)
alert_signal.data["alert"] = "severe"
else if (alert_level==1)
@@ -644,7 +637,7 @@
else if (alert_level==0)
alert_signal.data["alert"] = "clear"
- frequency.post_signal(src, alert_signal,null,-1)
+ frequency.post_signal(src, alert_signal, range = -1)
/obj/machinery/airalarm/proc/apply_danger_level()
var/area/A = get_area(src)
@@ -741,7 +734,7 @@
return
return ..()
-
+
/obj/machinery/airalarm/AltClick(mob/user)
..()
if(!issilicon(user) && (!user.canUseTopic(src, be_close=TRUE) || !isturf(loc)))
@@ -749,7 +742,7 @@
return
else
togglelock(user)
-
+
/obj/machinery/airalarm/proc/togglelock(mob/living/user)
if(stat & (NOPOWER|BROKEN))
to_chat(user, "It does nothing!")
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
index 63af8e8aa2..7f37e049dd 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm
@@ -15,6 +15,7 @@
anchored = TRUE
density = TRUE
+
var/global/const/CIRC_LEFT = 1
var/global/const/CIRC_RIGHT = 2
@@ -39,6 +40,8 @@
var/transfer_moles = pressure_delta*air1.volume/(air2.temperature * R_IDEAL_GAS_EQUATION)
last_pressure_delta = pressure_delta
+
+ //Actually transfer the gas
var/datum/gas_mixture/removed = air2.remove(transfer_moles)
update_parents()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
index ec11ce588c..9c806312a2 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm
@@ -131,17 +131,13 @@ Acts like a normal vent, but has an input AND output.
SSradio.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
- radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA)
+ radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/binary/dp_vent_pump/proc/broadcast_status()
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = list(
+ var/datum/signal/signal = new(list(
"tag" = id,
"device" = "ADVP",
"power" = on,
@@ -151,8 +147,8 @@ Acts like a normal vent, but has an input AND output.
"output" = output_pressure_max,
"external" = external_pressure_bound,
"sigtype" = "status"
- )
- radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
+ ))
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/binary/dp_vent_pump/atmosinit()
..()
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
index 00cdd6fca7..2fcc546cec 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm
@@ -72,25 +72,20 @@ Passive gate is similar to the regular pump except:
SSradio.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
- radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA)
+ radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/binary/passive_gate/proc/broadcast_status()
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = list(
+ var/datum/signal/signal = new(list(
"tag" = id,
"device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
- )
-
- radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
+ ))
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
index 47dc2a2dae..6ceaa8f461 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm
@@ -75,25 +75,20 @@ Thus, the two variables affect pump operation are set in New():
SSradio.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
- radio_connection = SSradio.add_object(src, frequency, filter = GLOB.RADIO_ATMOSIA)
+ radio_connection = SSradio.add_object(src, frequency, filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/binary/pump/proc/broadcast_status()
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = list(
+ var/datum/signal/signal = new(list(
"tag" = id,
"device" = "AGP",
"power" = on,
"target_output" = target_pressure,
"sigtype" = "status"
- )
-
- radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
+ ))
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
index e21d5b2d8a..6a33e72324 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm
@@ -77,17 +77,13 @@ Thus, the two variables affect pump operation are set in New():
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = list(
+ var/datum/signal/signal = new(list(
"tag" = id,
"device" = "APV",
"power" = on,
"transfer_rate" = transfer_rate,
"sigtype" = "status"
- )
+ ))
radio_connection.post_signal(src, signal)
/obj/machinery/atmospherics/components/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index 20e93a220e..5281c3bad7 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -29,7 +29,7 @@
SSradio.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
- radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
+ radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
/obj/machinery/atmospherics/components/trinary/filter/New()
..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 87d6387b99..7f3699ff86 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -42,7 +42,7 @@
radio = new(src)
radio.keyslot = new radio_key
- radio.subspace_transmission = 1
+ radio.subspace_transmission = TRUE
radio.canhear_range = 0
radio.recalculateChannels()
@@ -182,7 +182,7 @@
mob_occupant.Unconscious((mob_occupant.bodytemperature * unconscious_factor) * 2000)
if(beaker)
if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic.
- beaker.reagents.trans_to(occupant, 1, 10 * efficiency) // Transfer reagents, multiplied because cryo magic.
+ beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents.
beaker.reagents.reaction(occupant, VAPOR)
air1.gases[/datum/gas/oxygen][MOLES] -= 2 / efficiency //Let's use gas for this
if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker).
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
index 9759de92f5..6eec4558ee 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -93,19 +93,14 @@
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = list(
+ var/datum/signal/signal = new(list(
"tag" = id,
"device" = "AO",
"power" = on,
"volume_rate" = volume_rate,
//"timestamp" = world.time,
"sigtype" = "status"
- )
-
+ ))
radio_connection.post_signal(src, signal)
/obj/machinery/atmospherics/components/unary/outlet_injector/atmosinit()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index f9a87ace42..3acc12114f 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -26,7 +26,7 @@
// INT_BOUND: Do not pass internal_pressure_bound
// NO_BOUND: Do not pass either
- var/frequency = 1439
+ var/frequency = FREQ_ATMOS_CONTROL
var/datum/radio_frequency/radio_connection
var/radio_filter_out
var/radio_filter_in
@@ -178,11 +178,7 @@
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.transmission_method = 1 // radio signal
- signal.source = src
-
- signal.data = list(
+ var/datum/signal/signal = new(list(
"tag" = id_tag,
"frequency" = frequency,
"device" = "VP",
@@ -193,7 +189,7 @@
"internal" = internal_pressure_bound,
"external" = external_pressure_bound,
"sigtype" = "status"
- )
+ ))
var/area/A = get_area(src)
if(!A.air_vent_names[id_tag])
@@ -206,8 +202,8 @@
/obj/machinery/atmospherics/components/unary/vent_pump/atmosinit()
//some vents work his own spesial way
- radio_filter_in = frequency==1439?(GLOB.RADIO_FROM_AIRALARM):null
- radio_filter_out = frequency==1439?(GLOB.RADIO_TO_AIRALARM):null
+ radio_filter_in = frequency==FREQ_ATMOS_CONTROL?(RADIO_FROM_AIRALARM):null
+ radio_filter_out = frequency==FREQ_ATMOS_CONTROL?(RADIO_TO_AIRALARM):null
if(frequency)
set_frequency(frequency)
broadcast_status()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index b882d21c98..bbf614ac84 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -23,7 +23,7 @@
var/widenet = 0 //is this scrubber acting on the 3x3 area around it.
var/list/turf/adjacent_turfs = list()
- var/frequency = 1439
+ var/frequency = FREQ_ATMOS_CONTROL
var/datum/radio_frequency/radio_connection
var/radio_filter_out
var/radio_filter_in
@@ -81,7 +81,7 @@
icon_state = "scrub_off"
return
- if(scrubbing & SCRUBBING)
+ if(scrubbing & SCRUBBING)
if(widenet)
icon_state = "scrub_wide"
else
@@ -98,16 +98,12 @@
if(!radio_connection)
return FALSE
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
var/list/f_types = list()
for(var/path in GLOB.meta_gas_info)
var/list/gas = GLOB.meta_gas_info[path]
f_types += list(list("gas_id" = gas[META_GAS_ID], "gas_name" = gas[META_GAS_NAME], "enabled" = (path in filter_types)))
- signal.data = list(
+ var/datum/signal/signal = new(list(
"tag" = id_tag,
"frequency" = frequency,
"device" = "VS",
@@ -117,7 +113,7 @@
"widenet" = widenet,
"filter_types" = f_types,
"sigtype" = "status"
- )
+ ))
var/area/A = get_area(src)
if(!A.air_scrub_names[id_tag])
@@ -130,8 +126,8 @@
return TRUE
/obj/machinery/atmospherics/components/unary/vent_scrubber/atmosinit()
- radio_filter_in = frequency==initial(frequency)?(GLOB.RADIO_FROM_AIRALARM):null
- radio_filter_out = frequency==initial(frequency)?(GLOB.RADIO_TO_AIRALARM):null
+ radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null
+ radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null
if(frequency)
set_frequency(frequency)
broadcast_status()
@@ -205,7 +201,7 @@
return TRUE
-//There is no easy way for an object to be notified of changes to atmos can pass flags_1
+//There is no easy way for an object to be notified of changes to atmos can pass flags
// So we check every machinery process (2 seconds)
/obj/machinery/atmospherics/components/unary/vent_scrubber/process()
if(widenet)
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index a26b379735..ccddc8f8ac 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -77,15 +77,12 @@
if(!radio_connection)
return
- var/datum/signal/signal = new
- signal.source = src
- signal.transmission_method = 1
- signal.data = list(
+ var/datum/signal/signal = new(list(
"id_tag" = id_tag,
"device" = "AM",
"pressure" = round(env_pressure),
"sigtype" = "status"
- )
+ ))
radio_connection.post_signal(src, signal)
/obj/machinery/meter/proc/status()
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 657bbb6499..adcd9fd5b2 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -510,7 +510,7 @@
/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H)
..()
var/obj/item/device/radio/R = H.ears
- R.set_frequency(GLOB.REDTEAM_FREQ)
+ R.set_frequency(FREQ_CTF_RED)
R.freqlock = TRUE
R.independent = TRUE
H.dna.species.stunmod = 0
@@ -518,7 +518,7 @@
/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H)
..()
var/obj/item/device/radio/R = H.ears
- R.set_frequency(GLOB.BLUETEAM_FREQ)
+ R.set_frequency(FREQ_CTF_BLUE)
R.freqlock = TRUE
R.independent = TRUE
H.dna.species.stunmod = 0
@@ -533,7 +533,6 @@
var/team = WHITE_TEAM
time_between_triggers = 1
anchored = TRUE
- flags_2 = SLOWS_WHILE_IN_HAND_2
alpha = 255
/obj/structure/trap/examine(mob/user)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 1f5df77be7..a10b958db0 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -21,6 +21,7 @@
var/brute_damage = 0
var/oxy_damage = 0
var/burn_damage = 0
+ var/datum/disease/disease = null //Do they start with a pre-spawned disease?
var/mob_color //Change the mob's color
var/assignedrole
var/show_flavour = TRUE
@@ -70,6 +71,8 @@
M.gender = mob_gender
if(faction)
M.faction = list(faction)
+ if(disease)
+ M.ForceContractDisease(new disease)
if(death)
M.death(1) //Kills the new mob
@@ -259,6 +262,19 @@
///////////Civilians//////////////////////
+/obj/effect/mob_spawn/human/corpse/assistant
+ name = "Assistant"
+ outfit = /datum/outfit/job/assistant
+
+/obj/effect/mob_spawn/human/corpse/assistant/beesease_infection
+ disease = /datum/disease/beesease
+
+/obj/effect/mob_spawn/human/corpse/assistant/brainrot_infection
+ disease = /datum/disease/brainrot
+
+/obj/effect/mob_spawn/human/corpse/assistant/spanishflu_infection
+ disease = /datum/disease/fluspanish
+
/obj/effect/mob_spawn/human/cook
name = "Cook"
outfit = /datum/outfit/job/cook
@@ -276,7 +292,7 @@
name = "sleeper"
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
- flavour_text = "You are a space doctor!"
+ flavour_text = "You are a space doctor!"
assignedrole = "Space Doctor"
/obj/effect/mob_spawn/human/doctor/alive/equip(mob/living/carbon/human/H)
@@ -331,7 +347,7 @@
name = "bartender sleeper"
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
- flavour_text = "You are a space bartender!"
+ flavour_text = "You are a space bartender!"
assignedrole = "Space Bartender"
/datum/outfit/spacebartender
@@ -355,7 +371,7 @@
name = "beach bum sleeper"
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
- flavour_text = "You are a beach bum!"
+ flavour_text = "You are a beach bum!"
assignedrole = "Beach Bum"
/datum/outfit/beachbum
@@ -433,7 +449,7 @@
name = "sleeper"
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
- flavour_text = "You are a Nanotrasen Commander!"
+ flavour_text = "You are a Nanotrasen Commander!"
/obj/effect/mob_spawn/human/nanotrasensoldier/alive
death = FALSE
@@ -443,7 +459,7 @@
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
faction = "nanotrasenprivate"
- flavour_text = "You are a Nanotrasen Private Security Officer!"
+ flavour_text = "You are a Nanotrasen Private Security Officer!"
/////////////////Spooky Undead//////////////////////
@@ -459,7 +475,7 @@
roundstart = FALSE
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
- flavour_text = "By unknown powers, your skeletal remains have been reanimated! Walk this mortal plain and terrorize all living adventurers who dare cross your path."
+ flavour_text = "By unknown powers, your skeletal remains have been reanimated! Walk this mortal plain and terrorize all living adventurers who dare cross your path."
assignedrole = "Skeleton"
/obj/effect/mob_spawn/human/zombie
@@ -473,7 +489,7 @@
roundstart = FALSE
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
- flavour_text = "By unknown powers, your rotting remains have been resurrected! Walk this mortal plain and terrorize all living adventurers who dare cross your path."
+ flavour_text = "By unknown powers, your rotting remains have been resurrected! Walk this mortal plain and terrorize all living adventurers who dare cross your path."
/obj/effect/mob_spawn/human/abductor
diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm
index 2c683e91c9..74a9a30d7c 100644
--- a/code/modules/awaymissions/exile.dm
+++ b/code/modules/awaymissions/exile.dm
@@ -1,13 +1,13 @@
-
-/obj/structure/closet/secure_closet/exile
- name = "exile implants"
+
+/obj/structure/closet/secure_closet/exile
+ name = "exile implants"
req_access = list(ACCESS_HOS)
-
-/obj/structure/closet/secure_closet/exile/New()
- ..()
- new /obj/item/implanter/exile(src)
- new /obj/item/implantcase/exile(src)
- new /obj/item/implantcase/exile(src)
- new /obj/item/implantcase/exile(src)
- new /obj/item/implantcase/exile(src)
+
+/obj/structure/closet/secure_closet/exile/New()
+ ..()
+ new /obj/item/implanter/exile(src)
+ new /obj/item/implantcase/exile(src)
+ new /obj/item/implantcase/exile(src)
+ new /obj/item/implantcase/exile(src)
+ new /obj/item/implantcase/exile(src)
new /obj/item/implantcase/exile(src)
\ No newline at end of file
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index bf256fecbd..7fefde76b0 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -139,7 +139,7 @@
/obj/structure/academy_wizard_spawner/proc/summon_wizard()
var/turf/T = src.loc
var/mob/living/carbon/human/wizbody = new(T)
- wizbody.fully_replace_character_name("Academy Teacher")
+ wizbody.fully_replace_character_name(wizbody.real_name, "Academy Teacher")
wizbody.mind_initialize()
var/datum/mind/wizmind = wizbody.mind
wizmind.special_role = "Academy Defender"
diff --git a/code/modules/awaymissions/mission_code/caves.dm b/code/modules/awaymissions/mission_code/caves.dm
index 05885fbe19..fd2f8f18af 100644
--- a/code/modules/awaymissions/mission_code/caves.dm
+++ b/code/modules/awaymissions/mission_code/caves.dm
@@ -42,7 +42,7 @@
/obj/item/paper/fluff/awaymissions/caves/work_notice
name = "work notice"
- info = "
Survival Info For Miners
The caves are an unforgiving place, the only thing you'll have to traverse is the supplies in your locker and your own wit. Travel in packs when mining and try to shut down the monster dens before they overwhelm you. The job is dangerous but the haul is good, so remember this infomation and hopefully we'll all go home alive.
"
+ info = "
Survival Info For Miners
The caves are an unforgiving place, the only thing you'll have to traverse is the supplies in your locker and your own wit. Travel in packs when mining and try to shut down the monster dens before they overwhelm you. The job is dangerous but the haul is good, so remember this information and hopefully we'll all go home alive.
"
/obj/item/paper/fluff/awaymissions/caves/shipment_notice
name = "shipment notice"
diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm
index 11c3f14012..082d2d3c9e 100644
--- a/code/modules/awaymissions/mission_code/centcomAway.dm
+++ b/code/modules/awaymissions/mission_code/centcomAway.dm
@@ -60,4 +60,4 @@
teams never did figure out what happened that last time... and I can't wrap my head \
around it myself. Why would a shuttle full of evacuees all snap and beat each other \
to death the moment they reached safety? \
- - D. Cereza"
+ - D. Cereza"
\ No newline at end of file
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index 4aa6e88249..65ed8f95b7 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -136,41 +136,18 @@ GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
/*
* Modified Nar-Sie
*/
-/obj/singularity/narsie/sc_Narsie
+/obj/singularity/narsie/mini
desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible."
move_self = 0 //Contianed narsie does not move!
grav_pull = 0 //Contained narsie does not pull stuff in!
- var/uneatable = list(/turf/open/space, /obj/effect/overlay, /mob/living/simple_animal/hostile/construct)
//Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment
-/obj/singularity/narsie/sc_Narsie/admin_investigate_setup()
+/obj/singularity/narsie/mini/admin_investigate_setup()
return
-/obj/singularity/narsie/sc_Narsie/process()
+/obj/singularity/narsie/mini/process()
eat()
if(prob(25))
mezzer()
-/obj/singularity/narsie/sc_Narsie/consume(atom/A)
- if(is_type_in_list(A, uneatable))
- return 0
- if(isliving(A))
- var/mob/living/L = A
- L.gib()
- else if(istype(A, /obj/))
- var/obj/O = A
- O.ex_act(EXPLODE_DEVASTATE)
- if(O)
- qdel(O)
- else if(isturf(A))
- var/turf/T = A
- if(T.intact)
- for(var/obj/O in T.contents)
- if(O.level != 1)
- continue
- if(O.invisibility == INVISIBILITY_MAXIMUM)
- src.consume(O)
- T.ChangeTurf(/turf/open/space)
- return
-
-/obj/singularity/narsie/sc_Narsie/ex_act()
+/obj/singularity/narsie/mini/ex_act()
return
\ No newline at end of file
diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm
index a1d12ae90a..94ebb91972 100644
--- a/code/modules/awaymissions/pamphlet.dm
+++ b/code/modules/awaymissions/pamphlet.dm
@@ -1,39 +1,39 @@
-/obj/item/paper/pamphlet
- name = "pamphlet"
- icon_state = "pamphlet"
+/obj/item/paper/pamphlet
+ name = "pamphlet"
+ icon_state = "pamphlet"
/obj/item/paper/pamphlet/gateway
- info = "Welcome to the Nanotrasen Gateway project... \
- Congratulations! If you're reading this, you and your superiors have decided that you're \
- ready to commit to a life spent colonising the rolling hills of far away worlds. You \
- must be ready for a lifetime of adventure, a little bit of hard work, and an award \
- winning dental plan- but that's not all the Nanotrasen Gateway project has to offer. \
- Because we care about you, we feel it is only fair to make sure you know the risks \
- before you commit to joining the Nanotrasen Gateway project. All away destinations have \
- been fully scanned by a Nanotrasen expeditionary team, and are certified to be 100% safe. \
- We've even left a case of space beer along with the basic materials you'll need to expand \
- Nanotrasen's operational area and start your new life.
\
- Gateway Operation Basics \
- All Nanotrasen approved Gateways operate on the same basic principals. They operate off \
- area equipment power as you would expect, and without this supply, it cannot safely function, \
- causinng it to reject all attempts at operation.
\
- Once it is correctly setup, and once it has enough power to operate, the Gateway will begin \
- searching for an output location. The amount of time this takes is variable, but the Gateway \
- interface will give you an estimate accurate to the minute. Power loss will not interrupt the \
- searching process. Influenza will not interrupt the searching process. Temporal anomalies \
- may cause the estimate to be inaccurate, but will not interrupt the searching process.
\
- Life On The Other Side \
- Once you have traversed the Gateway, you may experience some disorientation. Do not panic. \
- This is a normal side effect of travelling vast distances in a short period of time. You should \
- survey the immediate area, and attempt to locate your complimentary case of space beer. Our \
- expeditionary teams have ensured the complete safety of all away locations, but in a small \
- number of cases, the Gateway they have established may not be immediately obvious. \
- Do not panic if you cannot locate the return Gateway. Begin colonisation of the destination. \
-
A New World \
- As a participant in the Nanotrasen Gateway Project, you will be on the frontiers of space. \
- Though complete safety is assured, participants are advised to prepare for inhospitable \
- environs."
-
-//we don't want the silly text overlay!
-/obj/item/paper/pamphlet/update_icon()
- return
+ info = "Welcome to the Nanotrasen Gateway project... \
+ Congratulations! If you're reading this, you and your superiors have decided that you're \
+ ready to commit to a life spent colonising the rolling hills of far away worlds. You \
+ must be ready for a lifetime of adventure, a little bit of hard work, and an award \
+ winning dental plan- but that's not all the Nanotrasen Gateway project has to offer. \
+ Because we care about you, we feel it is only fair to make sure you know the risks \
+ before you commit to joining the Nanotrasen Gateway project. All away destinations have \
+ been fully scanned by a Nanotrasen expeditionary team, and are certified to be 100% safe. \
+ We've even left a case of space beer along with the basic materials you'll need to expand \
+ Nanotrasen's operational area and start your new life.
\
+ Gateway Operation Basics \
+ All Nanotrasen approved Gateways operate on the same basic principals. They operate off \
+ area equipment power as you would expect, and without this supply, it cannot safely function, \
+ causinng it to reject all attempts at operation.
\
+ Once it is correctly setup, and once it has enough power to operate, the Gateway will begin \
+ searching for an output location. The amount of time this takes is variable, but the Gateway \
+ interface will give you an estimate accurate to the minute. Power loss will not interrupt the \
+ searching process. Influenza will not interrupt the searching process. Temporal anomalies \
+ may cause the estimate to be inaccurate, but will not interrupt the searching process.
\
+ Life On The Other Side \
+ Once you have traversed the Gateway, you may experience some disorientation. Do not panic. \
+ This is a normal side effect of travelling vast distances in a short period of time. You should \
+ survey the immediate area, and attempt to locate your complimentary case of space beer. Our \
+ expeditionary teams have ensured the complete safety of all away locations, but in a small \
+ number of cases, the Gateway they have established may not be immediately obvious. \
+ Do not panic if you cannot locate the return Gateway. Begin colonisation of the destination. \
+
A New World \
+ As a participant in the Nanotrasen Gateway Project, you will be on the frontiers of space. \
+ Though complete safety is assured, participants are advised to prepare for inhospitable \
+ environs."
+
+//we don't want the silly text overlay!
+/obj/item/paper/pamphlet/update_icon()
+ return
diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm
index b1f505a27e..4b25d768f4 100644
--- a/code/modules/awaymissions/super_secret_room.dm
+++ b/code/modules/awaymissions/super_secret_room.dm
@@ -124,4 +124,4 @@
..()
/obj/effect/landmark/error
- name = "error"
\ No newline at end of file
+ name = "error"
diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm
index 3fcb0648a1..296c876688 100644
--- a/code/modules/cargo/console.dm
+++ b/code/modules/cargo/console.dm
@@ -201,14 +201,10 @@
/obj/machinery/computer/cargo/proc/post_signal(command)
- var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
+ var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
if(!frequency)
return
- var/datum/signal/status_signal = new
- status_signal.source = src
- status_signal.transmission_method = 1
- status_signal.data["command"] = command
-
+ var/datum/signal/status_signal = new(list("command" = command))
frequency.post_signal(src, status_signal)
diff --git a/code/modules/cargo/exports/research.dm b/code/modules/cargo/exports/research.dm
index b1ac30e7f9..d2d11cecd1 100644
--- a/code/modules/cargo/exports/research.dm
+++ b/code/modules/cargo/exports/research.dm
@@ -12,8 +12,8 @@
if(sold_nodes[V]) //Already sold before, don't want it.
continue
var/datum/techweb_node/TWN = D.stored_research.researched_nodes[V]
- cost += TWN
- return ..() * cost
+ cost += TWN.export_price
+ return cost
/datum/export/tech/sell_object(obj/O)
..()
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 3704494050..8825ce0933 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -324,6 +324,9 @@ GLOBAL_LIST_EMPTY(asset_datums)
"chevron.png" = 'html/chevron.png',
"chevron-expand.png" = 'html/chevron-expand.png',
"scales.png" = 'html/scales.png',
+ "coding.png" = 'html/coding.png',
+ "ban.png" = 'html/ban.png',
+ "chrome-wrench.png" = 'html/chrome-wrench.png',
"changelog.css" = 'html/changelog.css'
)
@@ -372,3 +375,39 @@ GLOBAL_LIST_EMPTY(asset_datums)
var/meter = icon('icons/obj/atmospherics/pipes/simple.dmi', "meterX", SOUTH, frame, movement_states)
if(meter)
register_asset(sanitize_filename("[prefix].south.meterX.png"), fcopy_rsc(meter))
+
+// Representative icons for each research design
+/datum/asset/simple/research_designs/register()
+ for (var/path in subtypesof(/datum/design))
+ var/datum/design/D = path
+
+ // construct the icon and slap it into the resource cache
+ var/atom/item = initial(D.build_path)
+ if (!ispath(item, /atom))
+ // biogenerator outputs to beakers by default
+ if (initial(D.build_type) & BIOGENERATOR)
+ item = /obj/item/reagent_containers/glass/beaker/large
+ else
+ continue // shouldn't happen, but just in case
+
+ // circuit boards become their resulting machines or computers
+ if (ispath(item, /obj/item/circuitboard))
+ var/obj/item/circuitboard/C = item
+ var/machine = initial(C.build_path)
+ if (machine)
+ item = machine
+ var/icon_file = initial(item.icon)
+ var/icon/I = icon(icon_file, initial(item.icon_state), SOUTH)
+
+ // computers (and snowflakes) get their screen and keyboard sprites
+ if (ispath(item, /obj/machinery/computer) || ispath(item, /obj/machinery/power/solar_control))
+ var/obj/machinery/computer/C = item
+ var/screen = initial(C.icon_screen)
+ var/keyboard = initial(C.icon_keyboard)
+ if (screen)
+ I.Blend(icon(icon_file, screen, SOUTH), ICON_OVERLAY)
+ if (keyboard)
+ I.Blend(icon(icon_file, keyboard, SOUTH), ICON_OVERLAY)
+
+ assets["design_[initial(D.id)].png"] = I
+ return ..()
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 10d3866672..9ae87488ce 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -70,4 +70,4 @@
var/list/credits //lazy list of all credit object bound to this client
- var/datum/player_details/player_details //these persist between logins/logouts during the same round.
+ var/datum/player_details/player_details //these persist between logins/logouts during the same round.
\ No newline at end of file
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 0f7d501988..fd4581507b 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -196,13 +196,9 @@ GLOBAL_LIST(external_rsc_urls)
if(!prefs)
prefs = new /datum/preferences(src)
GLOB.preferences_datums[ckey] = prefs
- else
- prefs.parent = src
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
- if(world.byond_version >= 511 && byond_version >= 511 && prefs.clientfps)
- vars["fps"] = prefs.clientfps
- sethotkeys(1) //set hoykeys from preferences (from_pref = 1)
+ fps = prefs.clientfps
log_access("Login: [key_name(src)] from [address ? address : "localhost"]-[computer_id] || BYOND v[byond_version]")
var/alert_mob_dupe_login = FALSE
@@ -237,6 +233,9 @@ GLOBAL_LIST(external_rsc_urls)
. = ..() //calls mob.Login()
+ if(SSinput.initialized)
+ set_macros()
+
chatOutput.start() // Starts the chat
if(alert_mob_dupe_login)
@@ -364,7 +363,8 @@ GLOBAL_LIST(external_rsc_urls)
if (menuitem)
menuitem.Load_checked(src)
- hook_vr("client_new",list(src))
+ hook_vr("client_new",list(src)) // CIT CHANGE - hook for client/New() changes
+
Master.UpdateTickRate()
//////////////
@@ -372,6 +372,8 @@ GLOBAL_LIST(external_rsc_urls)
//////////////
/client/Del()
+ if(credits)
+ QDEL_LIST(credits)
log_access("Logout: [key_name(src)]")
if(holder)
adminGreet(1)
@@ -380,16 +382,17 @@ GLOBAL_LIST(external_rsc_urls)
if (!GLOB.admins.len && SSticker.IsRoundInProgress()) //Only report this stuff if we are currently playing.
var/cheesy_message = pick(
"I have no admins online!",\
- "I'm all alone... :(",\
- "I'm feeling lonely. :(",\
- "I'm so lonely. :(",\
+ "I'm all alone :(",\
+ "I'm feeling lonely :(",\
+ "I'm so lonely :(",\
"Why does nobody love me? :(",\
- "I want a man. :(",\
+ "I want a man :(",\
"Where has everyone gone?",\
- "I need a hug. :(",\
- "Someone come hold me. :(",\
+ "I need a hug :(",\
+ "Someone come hold me :(",\
"I need someone on me :(",\
"What happened? Where has everyone gone?",\
+ "Forever alone :(",\
"My nipples are so stiff, but Zelda ain't here. :(",\
"Leon senpai, play more Spessmans. :(",\
"If only Serdy were here...",\
@@ -402,8 +405,9 @@ GLOBAL_LIST(external_rsc_urls)
"Oh good, no-one around to watch me lick Goofball's nipples. :D",\
"I've replaced Beepsky with a fidget spinner, glory be autism abuse.",\
"i shure hop dere are no PRED arund!!!!",\
- "NO PRED CAN eVER CATCH MI"\
- )
+ "NO PRED CAN eVER CATCH MI",\
+ "help, the clown is honking his horn in front of dorms and its interrupting everyones erp"\
+ )
send2irc("Server", "[cheesy_message] (No admins online)")
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 0469f31aba..92639ab70f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1,3 +1,5 @@
+
+
GLOBAL_LIST_EMPTY(preferences_datums)
@@ -48,9 +50,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/uses_glasses_colour = 0
- var/screenshake = 100
- var/damagescreenshake = 2
-
//character preferences
var/real_name //our character's name
var/be_random_name = 0 //whether we'll have a random name every round
@@ -68,76 +67,74 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/list/features = list("mcolor" = "FFF",
- "mcolor2" = "FFF",
- "mcolor3" = "FFF",
- "tail_lizard" = "Smooth",
- "tail_human" = "None",
- "snout" = "Round",
- "horns" = "None",
- "ears" = "None",
- "wings" = "None",
- "frills" = "None",
- "spines" = "None",
- "body_markings" = "None",
- "mam_body_markings" = "None",
- "mam_ears" = "None",
- "mam_tail" = "None",
- "mam_tail_animated" = "None",
- "xenodorsal" = "None",
- "xenohead" = "None",
- "xenotail" = "None",
- "legs" = "Normal Legs",
- "taur" = "None",
- "exhibitionist" = FALSE,
- "genitals_use_skintone" = FALSE,
- "has_cock" = FALSE,
- "cock_shape" = "Human",
- "cock_length" = 6,
- "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
- "cock_color" = "fff",
- "has_sheath" = FALSE,
- "sheath_color" = "fff",
- "has_balls" = FALSE,
- "balls_internal" = FALSE,
- "balls_color" = "fff",
- "balls_amount" = 2,
- "balls_sack_size" = BALLS_SACK_SIZE_DEF,
- "balls_size" = BALLS_SIZE_DEF,
- "balls_cum_rate" = CUM_RATE,
- "balls_cum_mult" = CUM_RATE_MULT,
- "balls_efficiency" = CUM_EFFICIENCY,
- "balls_fluid" = "semen",
- "has_ovi" = FALSE,
- "ovi_shape" = "knotted",
- "ovi_length" = 6,
- "ovi_color" = "fff",
- "has_eggsack" = FALSE,
- "eggsack_internal" = TRUE,
- "eggsack_color" = "fff",
- "eggsack_size" = BALLS_SACK_SIZE_DEF,
- "eggsack_egg_color" = "fff",
- "eggsack_egg_size" = EGG_GIRTH_DEF,
- "has_breasts" = FALSE,
- "breasts_color" = "fff",
- "breasts_size" = "C",
- "breasts_shape" = "Pair",
- "breasts_fluid" = "milk",
- "has_vag" = FALSE,
- "vag_shape" = "Human",
- "vag_color" = "fff",
- "vag_clits" = 1,
- "vag_clit_diam" = 0.25,
- "vag_clit_len" = 0.25,
- "has_womb" = FALSE,
- "womb_cum_rate" = CUM_RATE,
- "womb_cum_mult" = CUM_RATE_MULT,
- "womb_efficiency" = CUM_EFFICIENCY,
- "womb_fluid" = "femcum",
- "flavor_text" = ""
- )//MAKE SURE TO UPDATE THE LIST IN MOBS.DM IF YOU'RE GOING TO ADD TO THIS LIST, OTHERWISE THINGS MIGHT GET FUCKEY
+ var/list/features = list("mcolor" = "FFF",
+ "tail_lizard" = "Smooth",
+ "tail_human" = "None",
+ "snout" = "Round",
+ "horns" = "None",
+ "ears" = "None",
+ "wings" = "None",
+ "frills" = "None",
+ "spines" = "None",
+ "body_markings" = "None",
+ "legs" = "Normal Legs",
+ "mcolor2" = "FFF",//CIT FEATURES START HERE
+ "mcolor3" = "FFF",
+ "mam_body_markings" = "None",
+ "mam_ears" = "None",
+ "mam_tail" = "None",
+ "mam_tail_animated" = "None",
+ "xenodorsal" = "None",
+ "xenohead" = "None",
+ "xenotail" = "None",
+ "taur" = "None",
+ "exhibitionist" = FALSE,
+ "genitals_use_skintone" = FALSE,
+ "has_cock" = FALSE,
+ "cock_shape" = "Human",
+ "cock_length" = 6,
+ "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
+ "cock_color" = "fff",
+ "has_sheath" = FALSE,
+ "sheath_color" = "fff",
+ "has_balls" = FALSE,
+ "balls_internal" = FALSE,
+ "balls_color" = "fff",
+ "balls_amount" = 2,
+ "balls_sack_size" = BALLS_SACK_SIZE_DEF,
+ "balls_size" = BALLS_SIZE_DEF,
+ "balls_cum_rate" = CUM_RATE,
+ "balls_cum_mult" = CUM_RATE_MULT,
+ "balls_efficiency" = CUM_EFFICIENCY,
+ "balls_fluid" = "semen",
+ "has_ovi" = FALSE,
+ "ovi_shape" = "knotted",
+ "ovi_length" = 6,
+ "ovi_color" = "fff",
+ "has_eggsack" = FALSE,
+ "eggsack_internal" = TRUE,
+ "eggsack_color = "fff",
+ "eggsack_size" = BALLS_SACK_SIZE_DEF,
+ "eggsack_egg_color" = "fff",
+ "eggsack_egg_size" = EGG_GIRTH_DEF,
+ "has_breasts" = FALSE,
+ "breasts_color" = "fff",
+ "breasts_size" = "C",
+ "breasts_shape" = "Pair",
+ "breasts_fluid" = "milk",
+ "has_vag" = FALSE,
+ "vag_shape" = "Human",
+ "vag_color" = "fff",
+ "vag_clits" = 1,
+ "vag_clit_diam" = 0.25,
+ "has_womb" = FALSE,
+ "womb_cum_rate" = CUM_RATE,
+ "womb_cum_mult" = CUM_RATE_MULT,
+ "womb_efficiency" = CUM_EFFICIENCY,
+ "womb_fluid" = "femcum",
+ "flavor_text" = "")
- var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
+ var/list/custom_names = list("human", "clown", "mime", "ai", "cyborg", "religion", "deity")
var/prefered_security_department = SEC_DEPT_RANDOM
//Mob preview
@@ -180,11 +177,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/action_buttons_screen_locs = list()
- //citadel code
- var/arousable = TRUE //Allows players to disable arousal from the character creation menu
+ var/screenshake = 100
+ var/damagescreenshake = 2
+ var/arousable = TRUE
/datum/preferences/New(client/C)
parent = C
+ custom_names["human"] = random_unique_name()
custom_names["ai"] = pick(GLOB.ai_names)
custom_names["cyborg"] = pick(GLOB.ai_names)
custom_names["clown"] = pick(GLOB.clown_names)
@@ -230,7 +229,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
switch(current_tab)
- if (0) // Character Settings
+ if (0) // Character Settings#
if(path)
var/savefile/S = new /savefile(path)
if(S)
@@ -260,7 +259,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Age:[age] "
dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"] "
dat += "Exhibitionist:[features["exhibitionist"] == TRUE ? "Yes" : "No"] "
+
dat += "Special Names: "
+ dat += "Backup Human Name: [custom_names["human"]] "
dat += "Clown: [custom_names["clown"]] "
dat += "Mime:[custom_names["mime"]] "
dat += "AI: [custom_names["ai"]] "
@@ -276,17 +277,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
"
if(SSjob.occupations.len <= 0)
- HTML += "The job ticker is not yet finished creating jobs, please try again later"
+ HTML += "The job SSticker is not yet finished creating jobs, please try again later"
HTML += "