"
dat += ""
@@ -45,17 +45,17 @@
while(!istype(disk_loc, /turf))
if(istype(disk_loc, /mob))
var/mob/M = disk_loc
- dat += "carried by [M.real_name] "
+ dat += "carried by [M.real_name] "
if(istype(disk_loc, /obj))
var/obj/O = disk_loc
dat += "in \a [O.name] "
disk_loc = disk_loc.loc
dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])"
dat += ""
- dat += get_additional_check_antag_output(caller)
+ dat += get_additional_check_antag_output(requester)
dat += ""
return dat
//Overridden elsewhere.
-/datum/antagonist/proc/get_additional_check_antag_output(var/datum/admins/caller)
+/datum/antagonist/proc/get_additional_check_antag_output(var/datum/admins/requester)
return ""
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 9f00c1613af..e428aae3a7e 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -478,7 +478,9 @@
/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0)
if( istype(src, /turf/simulated) )
var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src)
- this.virus2 = virus_copylist(M.virus2)
+
+ for(var/datum/disease/D in M.GetViruses())
+ this.viruses |= D.Copy()
// Make toxins vomit look different
if(toxvomit)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 597813550b2..6883220bac6 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -6,7 +6,7 @@ var/global/list/engwords = list("travel", "blood", "join", "hell", "destroy", "t
var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri")
/client/proc/check_words() // -- Urist
- set category = "Special Verbs"
+ set category = "Admin.Secrets"
set name = "Check Rune Words"
set desc = "Check the rune-word meaning"
if(!cultwords["travel"])
diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm
index 7efae68f8d1..68b9a0cdf82 100644
--- a/code/game/gamemodes/events/holidays/Holidays.dm
+++ b/code/game/gamemodes/events/holidays/Holidays.dm
@@ -239,7 +239,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
//Allows GA and GM to set the Holiday variable
/client/proc/Set_Holiday()
set name = "Set Holiday"
- set category = "Fun"
+ set category = "Fun.Event Kit"
set desc = "Force-set the Holiday variable to make the game think it's a certain day."
if(!check_rights(R_SERVER)) return
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 63da8cc3343..51e3a508acf 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -546,7 +546,7 @@ var/global/list/additional_antag_types = list()
/mob/verb/check_round_info()
set name = "Check Round Info"
- set category = "OOC"
+ set category = "OOC.Game"
if(!ticker || !ticker.mode)
to_chat(usr, span_warning("Something is terribly wrong; there is no gametype."))
diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm
index ed872fd85b8..17b70731dbd 100644
--- a/code/game/jobs/job/engineering_vr.dm
+++ b/code/game/jobs/job/engineering_vr.dm
@@ -30,7 +30,7 @@
/datum/job/engineer
pto_type = PTO_ENGINEERING
alt_titles = list(JOB_ALT_MAINTENANCE_TECHNICIAN = /datum/alt_title/maint_tech, JOB_ALT_ENGINE_TECHNICIAN = /datum/alt_title/engine_tech,
- JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor)
+ JOB_ALT_ELECTRICIAN = /datum/alt_title/electrician, JOB_ALT_CONSTRUCTION_ENGINEER = /datum/alt_title/construction_engi, JOB_ALT_ENGINEERING_CONTRACTOR = /datum/alt_title/engineering_contractor, JOB_ALT_COMPUTER_TECHNICIAN = /datum/alt_title/computer_tech)
/datum/alt_title/construction_engi
title = JOB_ALT_CONSTRUCTION_ENGINEER
@@ -44,8 +44,9 @@
/datum/job/engineer/get_request_reasons()
return list("Engine setup", "Construction project", "Repairs necessary", "Assembling expedition team")
-
-
+/datum/alt_title/computer_tech
+ title = JOB_ALT_COMPUTER_TECHNICIAN
+ title_blurb = "A " + JOB_ALT_COMPUTER_TECHNICIAN + " fulfills similar duties to other engineers, but specializes in working with software and computers. They also often deal with integrated circuits."
/datum/job/atmos
spawn_positions = 3
diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm
index bb5285e16ef..c0505e4109e 100644
--- a/code/game/jobs/job/science_vr.dm
+++ b/code/game/jobs/job/science_vr.dm
@@ -86,7 +86,15 @@
/datum/job/roboticist
total_positions = 3
pto_type = PTO_SCIENCE
- alt_titles = list(JOB_ALT_ASSEMBLY_TECHNICIAN = /datum/alt_title/assembly_tech, JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech, JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech)
+ alt_titles = list(
+ JOB_ALT_ASSEMBLY_TECHNICIAN = /datum/alt_title/assembly_tech,
+ JOB_ALT_BIOMECHANICAL_ENGINEER = /datum/alt_title/biomech,
+ JOB_ALT_MECHATRONIC_ENGINEER = /datum/alt_title/mech_tech,
+ JOB_ALT_SOFTWARE_ENGINEER = /datum/alt_title/software_engi)
+
+/datum/alt_title/software_engi
+ title = JOB_ALT_SOFTWARE_ENGINEER
+ title_blurb = "A " + JOB_ALT_SOFTWARE_ENGINEER + " specializes in working with software and firmware. They also often deal with integrated circuits."
/datum/alt_title/assembly_tech
title = JOB_ALT_ASSEMBLY_TECHNICIAN
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 05b7b67273b..2d4ca00ab48 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -189,7 +189,7 @@
occupantData["health"] = H.health
occupantData["maxHealth"] = H.getMaxHealth()
- occupantData["hasVirus"] = H.virus2.len
+ occupantData["hasVirus"] = H.viruses.len
occupantData["bruteLoss"] = H.getBruteLoss()
occupantData["oxyLoss"] = H.getOxyLoss()
@@ -379,8 +379,12 @@
dat += (occupant.health > (occupant.getMaxHealth() / 2) ? span_blue(health_text) : span_red(health_text))
dat += " "
- if(occupant.virus2.len)
- dat += span_red("Viral pathogen detected in blood stream.") + " "
+ if(occupant.viruses.len)
+ for(var/datum/disease/D in occupant.GetViruses())
+ if(D.visibility_flags & HIDDEN_SCANNER)
+ continue
+ else
+ dat += span_red("Viral pathogen detected in blood stream.") + " "
var/damage_string = null
damage_string = "\t-Brute Damage %: [occupant.getBruteLoss()]"
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 501acc84813..54fdfbdba46 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -26,7 +26,7 @@
/mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list())
- set category = "AI Commands"
+ set category = "AI.Camera Control"
set name = "Show Camera List"
if(check_unable())
@@ -41,7 +41,7 @@
return
/mob/living/silicon/ai/proc/ai_store_location(loc as text)
- set category = "AI Commands"
+ set category = "AI.Camera Control"
set name = "Store Camera Location"
set desc = "Stores your current camera location by the given name"
@@ -70,7 +70,7 @@
return sortList(stored_locations)
/mob/living/silicon/ai/proc/ai_goto_location(loc in sorted_stored_locations())
- set category = "AI Commands"
+ set category = "AI.Camera Control"
set name = "Goto Camera Location"
set desc = "Returns to the selected camera location"
@@ -82,7 +82,7 @@
src.eyeobj.setLoc(L)
/mob/living/silicon/ai/proc/ai_remove_location(loc in sorted_stored_locations())
- set category = "AI Commands"
+ set category = "AI.Camera Control"
set name = "Delete Camera Location"
set desc = "Deletes the selected camera location"
@@ -129,7 +129,7 @@
return targets
/mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs())
- set category = "AI Commands"
+ set category = "AI.Camera Control"
set name = "Follow With Camera"
set desc = "Select who you would like to track."
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index af3a5af05c5..2808be538a9 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -262,7 +262,7 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva
/client/proc/empty_ai_core_toggle_latejoin()
set name = "Toggle AI Core Latejoin"
- set category = "Admin"
+ set category = "Admin.Silicon"
var/list/cores = list()
for(var/obj/structure/AIcore/deactivated/D in all_deactivated_AI_cores)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 1fb04554760..00339ac2737 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -172,8 +172,10 @@
medical["empty"] = 1
if(MED_DATA_V_DATA)
data["virus"] = list()
- for(var/ID in virusDB)
- var/datum/data/record/v = virusDB[ID]
+ for(var/datum/disease/D in active_diseases)
+ if(!D.discovered)
+ continue
+ var/datum/data/record/v = active_diseases[D]
data["virus"] += list(list("name" = v.fields["name"], "D" = "\ref[v]"))
if(MED_DATA_MEDBOT)
data["medbots"] = list()
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 23e19a54a01..0c29400e73e 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -221,3 +221,23 @@
spawn(0)
if(SG?.anchored)
SG.toggle()
+
+/obj/machinery/button/remote/airlock/release
+ icon = 'icons/obj/door_release.dmi'
+ name = "emergency door release"
+ desc = "Forces the opening of doors in an emergency, regardless of whether they're powered."
+
+ use_power = USE_POWER_OFF
+ idle_power_usage = 0
+ active_power_usage = 0
+
+/obj/machinery/button/remote/airlock/release/trigger()
+ for(var/obj/machinery/door/airlock/D in machines)
+ if(D.id_tag == id)
+ if(D.locked)
+ D.unlock(1)
+ if(D.density)
+ D.open(1)
+
+/obj/machinery/button/remote/airlock/release/powered()
+ return 1 //Is always able to be used
diff --git a/code/game/machinery/pandemic.dm b/code/game/machinery/pandemic.dm
new file mode 100644
index 00000000000..ae8687d6657
--- /dev/null
+++ b/code/game/machinery/pandemic.dm
@@ -0,0 +1,377 @@
+/obj/machinery/computer/pandemic
+ name = "PanD.E.M.I.C 2200"
+ desc = "Used to work with viruses."
+ density = TRUE
+ anchored = TRUE
+ icon = 'icons/obj/pandemic.dmi'
+ icon_state = "pandemic0"
+ var/temp_html = ""
+ var/printing = null
+ var/wait = null
+ var/selected_strain_index = 1
+ var/obj/item/reagent_containers/beaker = null
+
+/obj/machinery/computer/pandemic/Initialize(mapload)
+ . = ..()
+ update_icon()
+
+/obj/machinery/computer/pandemic/set_broken()
+ stat |= BROKEN
+ update_icon()
+
+/obj/machinery/computer/pandemic/proc/GetViruses()
+ if(beaker && beaker.reagents)
+ if(length(beaker.reagents.reagent_list))
+ var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list
+ if(BL)
+ if(BL.data && BL.data["viruses"])
+ var/list/viruses = BL.data["viruses"]
+ return viruses
+
+/obj/machinery/computer/pandemic/proc/GetVirusByIndex(index)
+ var/list/viruses = GetViruses()
+ if(viruses && index > 0 && index <= length(viruses))
+ return viruses[index]
+
+/obj/machinery/computer/pandemic/proc/GetResistances()
+ if(beaker && beaker.reagents)
+ if(length(beaker.reagents.reagent_list))
+ var/datum/reagent/blood/BL = locate() in beaker.reagents.reagent_list
+ if(BL)
+ if(BL.data && BL.data["resistances"])
+ var/list/resistances = BL.data["resistances"]
+ return resistances
+
+/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index)
+ var/list/resistances = GetResistances()
+ if(resistances && index > 0 && index <= length(resistances))
+ return resistances[index]
+
+/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index)
+ var/datum/disease/D = GetVirusByIndex(index)
+ if(D)
+ return D.GetDiseaseID()
+
+/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime)
+ wait = 1
+ update_icon()
+ spawn(waittime)
+ wait = null
+ update_icon()
+ playsound(loc, 'sound/machines/ping.ogg', 30, 1)
+
+/obj/machinery/computer/pandemic/update_icon()
+ if(stat & BROKEN)
+ icon_state = (beaker ? "pandemic1_b" : "pandemic0_b")
+ return
+ icon_state = "pandemic[(beaker)?"1":"0"][!(stat & NOPOWER) ? "" : "_nopower"]"
+
+/obj/machinery/computer/pandemic/proc/create_culture(name, bottle_type = "culture", cooldown = 50)
+ var/obj/item/reagent_containers/glass/bottle/B = new/obj/item/reagent_containers/glass/bottle(loc)
+ B.icon_state = "bottle10"
+ B.pixel_x = rand(-3, 3)
+ B.pixel_y = rand(-3, 3)
+ replicator_cooldown(cooldown)
+ B.name = "[name] [bottle_type] bottle"
+ return B
+
+/obj/machinery/computer/pandemic/tgui_act(action, params, datum/tgui/ui, datum/tgui_state/state)
+ if(..())
+ return
+ if(inoperable())
+ return
+
+ . = TRUE
+
+ switch(action)
+ if("clone_strain")
+ if(wait)
+ atom_say("The replicator is not ready yet.")
+ return
+
+ var/strain_index = text2num(params["strain_index"])
+ if(isnull(strain_index))
+ atom_say("Unable to respond to command.")
+ return
+ var/datum/disease/virus = GetVirusByIndex(strain_index)
+ var/datum/disease/D = null
+ if(!virus)
+ atom_say("Unable to find requested strain.")
+ return
+ var/type = virus.GetDiseaseID()
+ if(!ispath(type))
+ var/datum/disease/advance/A = GLOB.archive_diseases[type]
+ if(A)
+ D = new A.type(0, A)
+ else if(type)
+ if(type in GLOB.diseases) // Make sure this is a disease
+ D = new type(0, null)
+ if(!D)
+ atom_say("Unable to synthesize requested strain.")
+ return
+ var/default_name = ""
+ if(D.name == "Unknown" || D.name == "")
+ default_name = replacetext(beaker.name, new/regex(" culture bottle\\Z", "g"), "")
+ else
+ default_name = D.name
+ var/name = tgui_input_text(usr, "Name:", "Name the culture", default_name, MAX_NAME_LEN)
+ if(name == null || wait)
+ return
+ var/obj/item/reagent_containers/glass/bottle/B = create_culture(name)
+ B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium."
+ B.reagents.add_reagent("blood", 20, list("viruses" = list(D)))
+ if("clone_vaccine")
+ if(wait)
+ atom_say("The replicator is not ready yet.")
+ return
+
+ var/resistance_index = text2num(params["resistance_index"])
+ if(isnull(resistance_index))
+ atom_say("Unable to find requested antibody.")
+ return
+ var/vaccine_type = GetResistancesByIndex(resistance_index)
+ var/vaccine_name = "Unknown"
+ if(!ispath(vaccine_type))
+ if(GLOB.archive_diseases[vaccine_type])
+ var/datum/disease/D = GLOB.archive_diseases[vaccine_type]
+ if(D)
+ vaccine_name = D.name
+ else if(vaccine_type)
+ var/datum/disease/D = new vaccine_type(0, null)
+ if(D)
+ vaccine_name = D.name
+
+ if(!vaccine_type)
+ atom_say("Unable to synthesize requested antibody.")
+ return
+
+ var/obj/item/reagent_containers/glass/bottle/B = create_culture(vaccine_name, "vaccine", 200)
+ B.reagents.add_reagent("vaccine", 15, list(vaccine_type))
+ if("eject_beaker")
+ eject_beaker()
+ update_tgui_static_data(ui.user)
+ if("destroy_eject_beaker")
+ beaker.reagents.clear_reagents()
+ eject_beaker()
+ update_tgui_static_data(ui.user)
+ if("print_release_forms")
+ var/strain_index = text2num(params["strain_index"])
+ if(isnull(strain_index))
+ atom_say("Unable to respond to command.")
+ return
+ var/type = GetVirusTypeByIndex(strain_index)
+ if(!type)
+ atom_say("Unable to find requested strain.")
+ return
+ var/datum/disease/advance/A = GLOB.archive_diseases[type]
+ if(!A)
+ atom_say("Unable to find requested strain.")
+ return
+ print_form(A, usr)
+ if("name_strain")
+ var/strain_index = text2num(params["strain_index"])
+ if(isnull(strain_index))
+ atom_say("Unable to respond to command.")
+ return
+ var/type = GetVirusTypeByIndex(strain_index)
+ if(!type)
+ atom_say("Unable to find requested strain.")
+ return
+ var/datum/disease/advance/A = GLOB.archive_diseases[type]
+ if(!A)
+ atom_say("Unable to find requested strain.")
+ return
+ if(A.name != "Unknown")
+ atom_say("Request rejected. Strain already has a name.")
+ return
+ var/new_name = tgui_input_text(usr, "Name the Strain", "New Name", max_length = MAX_NAME_LEN)
+ if(!new_name)
+ return
+ A.AssignName(new_name)
+ for(var/datum/disease/advance/AD in active_diseases)
+ AD.Refresh()
+ update_tgui_static_data(ui.user)
+ if("switch_strain")
+ var/strain_index = text2num(params["strain_index"])
+ if(isnull(strain_index) || strain_index < 1)
+ atom_say("Unable to respond to command.")
+ return
+ var/list/viruses = GetViruses()
+ if(strain_index > length(viruses))
+ atom_say("Unable to find requested strain.")
+ return
+ selected_strain_index = strain_index;
+ else
+ return FALSE
+
+/obj/machinery/computer/pandemic/tgui_state(mob/user)
+ return GLOB.tgui_default_state
+
+/obj/machinery/computer/pandemic/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui = null)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "PanDEMIC", name)
+ ui.open()
+
+/obj/machinery/computer/pandemic/tgui_data(mob/user)
+ var/datum/reagent/blood/Blood = null
+ if(beaker)
+ var/datum/reagents/R = beaker.reagents
+ for(var/datum/reagent/blood/B in R.reagent_list)
+ if(B)
+ Blood = B
+ break
+
+ var/list/data = list(
+ "synthesisCooldown" = wait ? TRUE : FALSE,
+ "beakerLoaded" = beaker ? TRUE : FALSE,
+ "beakerContainsBlood" = Blood ? TRUE : FALSE,
+ "beakerContainsVirus" = length(Blood?.data["viruses"]) != 0,
+ "selectedStrainIndex" = selected_strain_index,
+ )
+
+ return data
+
+/obj/machinery/computer/pandemic/tgui_static_data(mob/user)
+ var/list/data = list()
+ . = data
+
+ var/datum/reagent/blood/Blood = null
+ if(beaker)
+ var/datum/reagents/R = beaker.reagents
+ for(var/datum/reagent/blood/B in R.reagent_list)
+ if(B)
+ Blood = B
+ break
+
+ var/list/strains = list()
+ for(var/datum/disease/D in GetViruses())
+ if(D.visibility_flags & HIDDEN_PANDEMIC)
+ continue
+
+ var/list/symptoms = list()
+ if(istype(D, /datum/disease/advance))
+ var/datum/disease/advance/A = D
+ D = GLOB.archive_diseases[A.GetDiseaseID()]
+ if(!D)
+ CRASH("We weren't able to get the advance disease from the archive.")
+ for(var/datum/symptom/S in A.symptoms)
+ symptoms += list(list(
+ "name" = S.name,
+ "stealth" = S.stealth,
+ "resistance" = S.resistance,
+ "stageSpeed" = S.stage_speed,
+ "transmissibility" = S.transmittable,
+ "complexity" = S.level,
+ ))
+
+ strains += list(list(
+ "commonName" = D.name,
+ "description" = D.desc,
+ "bloodDNA" = Blood.data["blood_DNA"],
+ "bloodType" = Blood.data["blood_type"],
+ "diseaseAgent" = D.agent,
+ "possibleTreatments" = D.cure_text,
+ "transmissionRoute" = D.spread_text,
+ "symptoms" = symptoms,
+ "isAdvanced" = istype(D, /datum/disease/advance),
+ ))
+ data["strains"] = strains
+
+ var/list/resistances = list()
+ for(var/resistance in GetResistances())
+ if(!ispath(resistance))
+ var/datum/disease/D = GLOB.archive_diseases[resistance]
+ if(D)
+ resistances += list(D.name)
+ else if(resistance)
+ var/datum/disease/D = new resistance(0, null)
+ if(D)
+ resistances += list(D.name)
+ data["resistances"] = resistances
+
+/obj/machinery/computer/pandemic/proc/eject_beaker()
+ set name = "Eject Beaker"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0)
+ return
+
+ beaker.forceMove(loc)
+ beaker = null
+ icon_state = "pandemic0"
+ selected_strain_index = 1
+
+/obj/machinery/computer/pandemic/proc/print_form(datum/disease/advance/D, mob/living/user)
+ D = GLOB.archive_diseases[D.GetDiseaseID()]
+ if(!(printing) && D)
+ var/reason = tgui_input_text(user,"Enter a reason for the release", "Write", multiline = TRUE)
+ if(!reason)
+ return
+ reason += ""
+ var/english_symptoms = list()
+ for(var/I in D.symptoms)
+ var/datum/symptom/S = I
+ english_symptoms += S.name
+ var/symtoms = english_list(english_symptoms)
+
+ var/signature
+ if(tgui_alert(user, "Would you like to add your signature?", "Signature", list("Yes","No")) == "Yes")
+ signature = "[user ? user.real_name : "Anonymous"]"
+ else
+ signature = ""
+
+ printing = 1
+ var/obj/item/paper/P = new /obj/item/paper(loc)
+ visible_message(span_notice("[src] rattles and prints out a sheet of paper."))
+ // playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
+
+ P.info = "
Releasing Virus
"
+ P.info += ""
+ P.info += "Name of the Virus: [D.name] "
+ P.info += "Symptoms: [symtoms] "
+ P.info += "Spreads by: [D.spread_text] "
+ P.info += "Cured by: [D.cure_text] "
+ P.info += " "
+ P.info += "Reason for releasing: [reason]"
+ P.info += ""
+ P.info += "The Virologist is responsible for any biohazards caused by the virus released. "
+ P.info += "Virologist's sign: [signature] "
+ P.info += "If approved, stamp below with the Chief Medical Officer's stamp, and/or the Captain's stamp if required:"
+ P.updateinfolinks()
+ P.name = "Releasing Virus - [D.name]"
+ printing = null
+
+/obj/machinery/computer/pandemic/attack_ai(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/computer/pandemic/attack_hand(mob/user)
+ if(..())
+ return
+ tgui_interact(user)
+
+/obj/machinery/computer/pandemic/attack_ghost(mob/user)
+ tgui_interact(user)
+
+/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params)
+ if(default_unfasten_wrench(user, I, 4 SECONDS))
+ return
+ if(I.has_tool_quality(TOOL_SCREWDRIVER))
+ eject_beaker()
+ return
+ if(istype(I, /obj/item/reagent_containers/glass) && I.is_open_container())
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(beaker)
+ to_chat(user, span_warning("A beaker is already loaded into the machine!"))
+ return
+
+ user.drop_item()
+ beaker = I
+ beaker.loc = src
+ to_chat(user, span_notice("You add the beaker to the machine."))
+ update_tgui_static_data(user)
+ icon_state = "pandemic1"
+ else
+ return ..()
diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm
index cc277d70d24..8693642de76 100644
--- a/code/game/machinery/partslathe_vr.dm
+++ b/code/game/machinery/partslathe_vr.dm
@@ -174,8 +174,9 @@
return
/obj/machinery/partslathe/proc/removeFromQueue(var/index)
- queue.Cut(index, index + 1)
- return
+ if(queue.len >= index)
+ queue.Cut(index, index + 1)
+ return
/obj/machinery/partslathe/proc/canBuild(var/datum/category_item/partslathe/D)
for(var/M in D.resources)
diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm
index d41689661d8..665f585f96e 100644
--- a/code/game/magic/archived_book.dm
+++ b/code/game/magic/archived_book.dm
@@ -34,7 +34,7 @@ var/global/datum/book_manager/book_mgr = new()
/client/proc/delbook()
set name = "Delete Book"
set desc = "Permamently deletes a book from the database."
- set category = "Admin"
+ set category = "Admin.Moderation"
if(!src.holder)
to_chat(src, "Only administrators may use this command.")
return
diff --git a/code/game/mecha/micro/mecha_construction_paths_vr.dm b/code/game/mecha/micro/mecha_construction_paths_vr.dm
index 60ed08cac13..9f6b58ff5da 100644
--- a/code/game/mecha/micro/mecha_construction_paths_vr.dm
+++ b/code/game/mecha/micro/mecha_construction_paths_vr.dm
@@ -252,7 +252,7 @@
if(3)
if(diff==FORWARD)
user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
- qdel(used_atom)//CHOMPedit upstream port. Fixes polecat not useing it's armor plates up.
+ qdel(used_atom)// upstream port. Fixes polecat not useing it's armor plates up.
holder.icon_state = "polecat18"
else
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 18660273f7d..84b47051aa1 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -19,7 +19,7 @@ var/global/list/image/splatter_cache=list()
blood_DNA = list()
var/basecolor="#A10808" // Color when wet.
var/synthblood = 0
- var/list/datum/disease2/disease/virus2 = list()
+ var/list/datum/disease/viruses = list()
var/amount = 5
generic_filth = TRUE
persistent = FALSE
@@ -242,7 +242,7 @@ var/global/list/image/splatter_cache=list()
icon_state = "mucus"
random_icon_states = list("mucus")
- var/list/datum/disease2/disease/virus2 = list()
+ var/list/datum/disease/viruses = list()
var/dry = 0 // Keeps the lag down
/obj/effect/decal/cleanable/mucus/Initialize()
@@ -252,11 +252,10 @@ var/global/list/image/splatter_cache=list()
//This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry
/obj/effect/decal/cleanable/mucus/mapped/Initialize()
. = ..()
- virus2 |= new /datum/disease2/disease
- virus2[1].makerandom()
+ viruses |= new /datum/disease/advance
/obj/effect/decal/cleanable/mucus/mapped/Destroy()
- virus2.Cut()
+ viruses.Cut()
return ..()
#undef DRYING_TIME
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index c15734b89d4..e8a6083fed9 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -113,7 +113,7 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
- var/list/datum/disease2/disease/virus2 = list()
+ var/list/datum/disease/viruses = list()
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm
index 511df962db2..08d2ec96c33 100644
--- a/code/game/objects/effects/spawners/bombspawner.dm
+++ b/code/game/objects/effects/spawners/bombspawner.dm
@@ -1,5 +1,5 @@
/client/proc/spawn_tanktransferbomb()
- set category = "Debug"
+ set category = "Debug.Game"
set desc = "Spawn a tank transfer valve bomb"
set name = "Instant TTV"
@@ -139,5 +139,3 @@
new type(src.loc)
qdel(src)
-
-
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 56209fc53c1..cb0b7e7b7a4 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -279,11 +279,10 @@ var/global/list/obj/item/communicator/all_communicators = list()
// Parameters: None
// Description: Removes the ghost's address and nulls the exonet datum, to allow qdel()ing.
/mob/observer/dead/Destroy()
- . = ..()
if(exonet)
exonet.remove_address()
qdel_null(exonet)
- return ..()
+ . = ..()
// Proc: register_device()
// Parameters: 1 (user - the person to use their name for)
diff --git a/code/game/objects/items/devices/communicator/integrated.dm b/code/game/objects/items/devices/communicator/integrated.dm
index 41990e30f2e..78066c5d17e 100644
--- a/code/game/objects/items/devices/communicator/integrated.dm
+++ b/code/game/objects/items/devices/communicator/integrated.dm
@@ -20,7 +20,7 @@
// Parameters: None
// Description: Lets synths use their communicators without hands.
/obj/item/communicator/integrated/verb/activate()
- set category = "Abilities.AI_IM"
+ set category = "Abilities.AI"
set name = "Use Communicator"
set desc = "Utilizes your built-in communicator."
set src in usr
diff --git a/code/game/objects/items/devices/communicator/messaging.dm b/code/game/objects/items/devices/communicator/messaging.dm
index a9c07241600..9339b3f84bc 100644
--- a/code/game/objects/items/devices/communicator/messaging.dm
+++ b/code/game/objects/items/devices/communicator/messaging.dm
@@ -114,7 +114,7 @@
// Parameters: None
// Description: Allows a ghost to send a text message to a communicator.
/mob/observer/dead/verb/text_communicator()
- set category = "Ghost"
+ set category = "Ghost.Message"
set name = "Text Communicator"
set desc = "If there is a communicator available, send a text message to it."
@@ -174,7 +174,7 @@
// Parameters: None
// Description: Lets ghosts review messages they've sent or received.
/mob/observer/dead/verb/show_text_messages()
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Show Text Messages"
set desc = "Allows you to see exonet text messages you've sent and received."
diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm
index 41b665535ab..dc46930913d 100644
--- a/code/game/objects/items/devices/communicator/phone.dm
+++ b/code/game/objects/items/devices/communicator/phone.dm
@@ -272,7 +272,7 @@
// Parameters: None
// Description: Allows ghosts to call communicators, if they meet all the requirements.
/mob/observer/dead/verb/join_as_voice()
- set category = "Ghost"
+ set category = "Ghost.Message"
set name = "Call Communicator"
set desc = "If there is a communicator available, send a request to speak through it. This will reset your respawn timer, if someone picks up."
diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm
index ce097cdfd69..3545ff34867 100644
--- a/code/game/objects/items/devices/hacktool.dm
+++ b/code/game/objects/items/devices/hacktool.dm
@@ -1,8 +1,8 @@
/obj/item/multitool/hacktool
var/is_hacking = 0
var/max_known_targets
- var/hackspeed = 1
- var/max_level = 4 //what's the max door security_level we can handle?
+ var/hackspeed = 1 //time taken to hack: lower is faster
+ var/max_level = 4 //what's the max door security_level we can handle? default is 1, med/eng/atmos are 1.5, sec/sci are 2, command is 3, vault is 5
var/full_override = FALSE //can we override door bolts too? defaults to false for event/safety reasons
var/in_hack_mode = 0
@@ -155,3 +155,16 @@
if(!hacktool || !hacktool.in_hack_mode || !(src_object in hacktool.known_targets))
return STATUS_CLOSE
return ..()
+
+/obj/item/multitool/hacktool/modified
+ name = "modified multitool"
+ desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. This ones seems a bit larger and heavier than the usual model, for some reason. Maybe it's an older version?"
+ description_info = "You can use this on airlocks or APCs to try to hack them without cutting wires."
+ icon_state = "multitool_modified"
+
+/obj/item/multitool/hacktool/obvious
+ name = "non-standard multitool"
+ desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. This one doesn't look like the usual model at all!"
+ description_info = "You can use this on airlocks or APCs to try to hack them without cutting wires."
+ icon_state = "multitool_suspicious"
+ in_hack_mode = 1 //start in hackmode
diff --git a/code/game/objects/items/devices/scanners/guide.dm b/code/game/objects/items/devices/scanners/guide.dm
index de728cd8544..403a81f9747 100644
--- a/code/game/objects/items/devices/scanners/guide.dm
+++ b/code/game/objects/items/devices/scanners/guide.dm
@@ -97,8 +97,12 @@
dat += span_bold("Genetic damage") + " - Utilize cryogenic pod with appropriate chemicals (i.e. Cryoxadone) and below 70 K, or give Rezadone. "
if(bone)
dat += span_bold("Bone fracture") + " - Splint damaged area. Treat with bone repair surgery or Osteodaxon after treating brute damage. "
- if(M.virus2.len)
- dat += span_bold("Viral infection") + " - Proceed with virology pathogen curing procedures or apply antiviral chemicals (i.e. Corophizine). "
+ if(M.viruses.len)
+ for(var/datum/disease/D in M.GetViruses())
+ if(D.visibility_flags & HIDDEN_SCANNER)
+ continue
+ else
+ dat += span_bold("Viral Infection") + " - Inform a Virologist or the Chief Medical Officer and administer antiviral chemicals such as Spaceacilin. Limit exposure to other personnel. "
if(robotparts)
dat += span_bold("Robotic body parts") + " - Should not be repaired by medical personnel, refer to robotics if damaged."
diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm
index ec9a6b257ce..c9927024305 100644
--- a/code/game/objects/items/devices/scanners/health.dm
+++ b/code/game/objects/items/devices/scanners/health.dm
@@ -248,14 +248,14 @@
else
dat += span_warning("Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.")
dat += " "
- if(C.virus2.len)
- for (var/ID in C.virus2)
- if (ID in virusDB)
- var/datum/data/record/V = virusDB[ID]
- dat += span_warning("Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]")
+ if(C.resistances.len)
+ for (var/datum/disease/virus in C.GetViruses())
+ if(virus.visibility_flags & HIDDEN_SCANNER || virus.visibility_flags & HIDDEN_PANDEMIC)
+ continue
+ if(virus.discovered)
+ dat += span_warning("Warning: [virus.name] detected in subject's blood.")
dat += " "
- else
- dat += span_warning("Warning: Unknown pathogen detected in subject's blood.")
+ dat += span_warning("Severity: [virus.severity]")
dat += " "
if (M.getCloneLoss())
dat += span_warning("Subject appears to have been imperfectly cloned.")
diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm
index f989f6110b5..372cde80c66 100644
--- a/code/game/objects/items/devices/whistle.dm
+++ b/code/game/objects/items/devices/whistle.dm
@@ -1,6 +1,7 @@
/obj/item/hailer
name = "hailer"
desc = "Used by obese officers to save their breath for running."
+ icon = 'icons/obj/device.dmi'
icon_state = "voice0"
item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang)
w_class = ITEMSIZE_TINY
diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
index c340f4958a7..09535b45f54 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
@@ -154,14 +154,6 @@
build_path = /obj/machinery/computer/operating
origin_tech = list(TECH_DATA = 2, TECH_BIO = 2)
-/obj/item/circuitboard/curefab
- name = T_BOARD("cure fabricator")
- build_path = /obj/machinery/computer/curer
-
-/obj/item/circuitboard/splicer
- name = T_BOARD("disease splicer")
- build_path = /obj/machinery/computer/diseasesplicer
-
/obj/item/circuitboard/mining_shuttle
name = T_BOARD("mining shuttle console")
build_path = /obj/machinery/computer/shuttle_control/mining
@@ -226,4 +218,4 @@
/obj/item/circuitboard/stockexchange
name = T_BOARD("stock exchange console")
build_path = /obj/machinery/computer/stockexchange
- origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 1)
\ No newline at end of file
+ origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 1)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/fluidpump.dm b/code/game/objects/items/weapons/circuitboards/machinery/fluidpump.dm
index 3e702a7e6fc..497c55eb14c 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/fluidpump.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/fluidpump.dm
@@ -10,5 +10,6 @@
origin_tech = list(TECH_DATA = 1)
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
+ /obj/item/cell = 1,
/obj/item/stock_parts/motor = 2,
/obj/item/stock_parts/manipulator = 1)
diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm
index 33c4c82e9e9..847ddd6efa2 100644
--- a/code/game/objects/items/weapons/material/ashtray.dm
+++ b/code/game/objects/items/weapons/material/ashtray.dm
@@ -3,7 +3,7 @@ var/global/list/ashtray_cache = list()
/obj/item/material/ashtray
name = "ashtray"
icon = 'icons/obj/objects.dmi'
- icon_state = "blank"
+ icon_state = "ashtray"
randpixel = 5
force_divisor = 0.1
thrown_force_divisor = 0.1
@@ -16,6 +16,7 @@ var/global/list/ashtray_cache = list()
if(!material)
qdel(src)
return
+ icon_state = "blank"
max_butts = round(material.hardness/5) //This is arbitrary but whatever.
randpixel_xy()
update_icon()
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index e27d9ade0cc..0e51b19eec8 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -453,7 +453,7 @@
max_storage_space = ITEMSIZE_COST_SMALL * 12
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
- can_hold = list(/obj/item/reagent_containers/glass/beaker/vial/,/obj/item/virusdish/)
+ can_hold = list(/obj/item/reagent_containers/glass/beaker/vial/)
// -----------------------------
// Food Bag
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 4412b8af019..36f22f6f452 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -244,7 +244,6 @@
/obj/item/flashlight,
/obj/item/cell/device,
/obj/item/extinguisher/mini,
- /obj/item/antibody_scanner, // VOREstation edit start
/obj/item/sleevemate,
/obj/item/mass_spectrometer,
/obj/item/surgical,
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 3704524cf12..d1df4043337 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -300,7 +300,7 @@
/obj/item/storage/box/syndie_kit/viral
starts_with = list(
- /obj/item/virusdish/random = 3
+ // /obj/item/virusdish/random = 3
)
/obj/item/storage/secure/briefcase/rifle
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index 7f7f57c1f00..69167f859cf 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -222,7 +222,7 @@
// Install
if(W.has_tool_quality(TOOL_SCREWDRIVER))
- user.visible_message(span_info(anchored ? span_bold("\The [user]") + " begins unscrewing \the [src]." : span_bold("\The [user]") + "begins fasten \the [src]." ))
+ user.visible_message(span_info((anchored ? (span_bold("\The [user]") + " begins unscrewing \the [src].") : (span_bold("\The [user]") + "begins fasten \the [src]."))))
playsound(src, W.usesound, 75, 1)
if(do_after(user, 10, src))
to_chat(user, (anchored ? span_notice("You have unfastened \the [src] from the floor.") : span_notice("You have fastened \the [src] to the floor.")))
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index d80fa0861b7..39bed0f177a 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -9,7 +9,7 @@ var/silent_ert = 0
/client/proc/response_team()
set name = "Dispatch Emergency Response Team"
- set category = "Special Verbs"
+ set category = "Fun.Event Kit"
set desc = "Send an emergency response team to the station"
if(!holder)
@@ -43,7 +43,7 @@ var/silent_ert = 0
/client/verb/JoinResponseTeam()
set name = "Join Response Team"
- set category = "IC"
+ set category = "IC.Event"
if(!MayRespawn(1))
to_chat(usr, span_warning("You cannot join the response team at this time."))
diff --git a/code/game/trader_visit.dm b/code/game/trader_visit.dm
index ceb90b4675c..8f52110f534 100644
--- a/code/game/trader_visit.dm
+++ b/code/game/trader_visit.dm
@@ -5,7 +5,7 @@ var/can_call_traders = 1
/client/proc/trader_ship()
set name = "Dispatch Beruang Trader Ship"
- set category = "Special Verbs"
+ set category = "Fun.Event Kit"
set desc = "Invite players to join the Beruang."
if(!holder)
@@ -36,7 +36,7 @@ var/can_call_traders = 1
/client/verb/JoinTraders()
set name = "Join Trader Visit"
- set category = "IC"
+ set category = "IC.Event"
if(!MayRespawn(1))
to_chat(usr, span_warning("You cannot join the traders."))
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 841ab7286ba..6b46ba2acbe 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -174,7 +174,7 @@
B.blood_DNA = list()
if(!B.blood_DNA[M.dna.unique_enzymes])
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
- B.virus2 = virus_copylist(M.virus2)
+ B.viruses = M.viruses.Copy()
return 1 //we bloodied the floor
blood_splatter(src,M.get_blood(M.vessel),1)
return 1 //we bloodied the floor
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 8b7f6cf01fa..76aa32b9b05 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -250,7 +250,7 @@
/client/proc/DB_ban_panel()
- set category = "Admin"
+ set category = "Admin.Moderation"
set name = "Banning Panel"
set desc = "Edit admin permissions"
diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm
index 939755222b5..932dedf5daf 100644
--- a/code/modules/admin/ToRban.dm
+++ b/code/modules/admin/ToRban.dm
@@ -45,7 +45,7 @@
/client/proc/ToRban(task in list("update","toggle","show","remove","remove all","find"))
set name = "ToRban"
- set category = "Server"
+ set category = "Server.Config"
if(!holder) return
switch(task)
if("update")
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 359e64b0db6..f7e33d15d3a 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -32,7 +32,7 @@ var/global/floorIsLava = 0
///////////////////////////////////////////////////////////////////////////////////////////////Panels
/datum/admins/proc/show_player_panel(var/mob/M in mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Show Player Panel"
set desc="Edit player (respawn, ban, heal, etc)"
@@ -224,7 +224,7 @@ var/global/floorIsLava = 0
/datum/player_info/var/timestamp // Because this is bloody annoying
/datum/admins/proc/PlayerNotes()
- set category = "Admin"
+ set category = "Admin.Logs"
set name = "Player Notes"
if (!istype(src,/datum/admins))
src = usr.client.holder
@@ -264,7 +264,7 @@ var/global/floorIsLava = 0
/datum/admins/proc/show_player_info(var/key as text)
- set category = "Admin"
+ set category = "Admin.Investigate"
set name = "Show Player Info"
if (!istype(src,/datum/admins))
src = usr.client.holder
@@ -278,7 +278,7 @@ var/global/floorIsLava = 0
/datum/admins/proc/access_news_network() //MARKER
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Access Newscaster Network"
set desc = "Allows you to view, add and edit news feeds."
@@ -594,7 +594,7 @@ var/global/floorIsLava = 0
/datum/admins/proc/restart()
- set category = "Server"
+ set category = "Server.Game"
set name = "Restart"
set desc="Restarts the world"
if (!usr.client.holder)
@@ -617,7 +617,7 @@ var/global/floorIsLava = 0
/datum/admins/proc/announce()
- set category = "Special Verbs"
+ set category = "Admin.Chat"
set name = "Announce"
set desc="Announce your desires to the world"
if(!check_rights(0)) return
@@ -635,7 +635,7 @@ var/global/floorIsLava = 0
var/datum/announcement/priority/admin_pri_announcer = new
var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/intercom()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Intercom Msg"
set desc = "Send an intercom message, like an arrivals announcement."
if(!check_rights(0)) return
@@ -663,7 +663,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/intercom_convo()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Intercom Convo"
set desc = "Send an intercom conversation, like several uses of the Intercom Msg verb."
set waitfor = FALSE //Why bother? We have some sleeps. You can leave tho!
@@ -750,7 +750,7 @@ var/datum/announcement/minor/admin_min_announcer = new
sleep(this_wait SECONDS)
/datum/admins/proc/toggleooc()
- set category = "Server"
+ set category = "Server.Chat"
set desc="Globally Toggles OOC"
set name="Toggle Player OOC"
@@ -766,7 +766,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglelooc()
- set category = "Server"
+ set category = "Server.Chat"
set desc="Globally Toggles LOOC"
set name="Toggle Player LOOC"
@@ -783,7 +783,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/toggledsay()
- set category = "Server"
+ set category = "Server.Chat"
set desc="Globally Toggles DSAY"
set name="Toggle DSAY"
@@ -800,7 +800,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TDSAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc
/datum/admins/proc/toggleoocdead()
- set category = "Server"
+ set category = "Server.Chat"
set desc="Toggle Dead OOC."
set name="Toggle Dead OOC"
@@ -813,7 +813,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TDOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglehubvisibility()
- set category = "Server"
+ set category = "Server.Config"
set desc="Globally Toggles Hub Visibility"
set name="Toggle Hub Visibility"
@@ -826,7 +826,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","THUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc
/datum/admins/proc/toggletraitorscaling()
- set category = "Server"
+ set category = "Server.Game"
set desc="Toggle traitor scaling"
set name="Toggle Traitor Scaling"
CONFIG_SET(flag/traitor_scaling, !CONFIG_GET(flag/traitor_scaling))
@@ -835,7 +835,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TTS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/startnow()
- set category = "Server"
+ set category = "Server.Game"
set desc="Start the round ASAP"
set name="Start Now"
@@ -858,7 +858,7 @@ var/datum/announcement/minor/admin_min_announcer = new
log_and_message_admins("cancelled immediate game start.")
/datum/admins/proc/toggleenter()
- set category = "Server"
+ set category = "Server.Game"
set desc="People can't enter"
set name="Toggle Entering"
CONFIG_SET(flag/enter_allowed, !CONFIG_GET(flag/enter_allowed))
@@ -872,7 +872,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleAI()
- set category = "Server"
+ set category = "Server.Game"
set desc="People can't be AI"
set name="Toggle AI"
CONFIG_SET(flag/allow_ai, !CONFIG_GET(flag/allow_ai))
@@ -885,7 +885,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleaban()
- set category = "Server"
+ set category = "Server.Game"
set desc="Respawn basically"
set name="Toggle Respawn"
CONFIG_SET(flag/abandon_allowed, !CONFIG_GET(flag/abandon_allowed))
@@ -899,7 +899,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglepersistence()
- set category = "Server"
+ set category = "Server.Config"
set desc="Whether persistent data will be saved from now on."
set name="Toggle Persistent Data"
CONFIG_SET(flag/persistence_disabled, !CONFIG_GET(flag/persistence_disabled))
@@ -913,7 +913,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/togglemaploadpersistence()
- set category = "Server"
+ set category = "Server.Config"
set desc="Whether mapload persistent data will be saved from now on."
set name="Toggle Mapload Persistent Data"
CONFIG_SET(flag/persistence_ignore_mapload, !CONFIG_GET(flag/persistence_ignore_mapload))
@@ -927,7 +927,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TMPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggle_aliens()
- set category = "Server"
+ set category = "Server.Game"
set desc="Toggle alien mobs"
set name="Toggle Aliens"
CONFIG_SET(flag/aliens_allowed, !CONFIG_GET(flag/aliens_allowed))
@@ -936,7 +936,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggle_space_ninja()
- set category = "Server"
+ set category = "Server.Game"
set desc="Toggle space ninjas spawning."
set name="Toggle Space Ninjas"
CONFIG_SET(flag/ninjas_allowed, !CONFIG_GET(flag/ninjas_allowed))
@@ -945,7 +945,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TSN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/delay()
- set category = "Server"
+ set category = "Server.Game"
set desc="Delay the game start/end"
set name="Delay"
@@ -965,7 +965,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","DELAY") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/adjump()
- set category = "Server"
+ set category = "Server.Game"
set desc="Toggle admin jumping"
set name="Toggle Jump"
CONFIG_SET(flag/allow_admin_jump, !CONFIG_GET(flag/allow_admin_jump))
@@ -973,7 +973,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/adspawn()
- set category = "Server"
+ set category = "Server.Game"
set desc="Toggle admin spawning"
set name="Toggle Spawn"
CONFIG_SET(flag/allow_admin_spawning, !CONFIG_GET(flag/allow_admin_spawning))
@@ -981,7 +981,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/adrev()
- set category = "Server"
+ set category = "Server.Game"
set desc="Toggle admin revives"
set name="Toggle Revive"
CONFIG_SET(flag/allow_admin_rev, !CONFIG_GET(flag/allow_admin_rev))
@@ -989,7 +989,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TAR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/immreboot()
- set category = "Server"
+ set category = "Server.Game"
set desc="Reboots the server post haste"
set name="Immediate Reboot"
if(!usr.client.holder) return
@@ -1007,7 +1007,7 @@ var/datum/announcement/minor/admin_min_announcer = new
world.Reboot()
/datum/admins/proc/unprison(var/mob/M in mob_list)
- set category = "Admin"
+ set category = "Admin.Moderation"
set name = "Unprison"
if (M.z == 2)
if (CONFIG_GET(flag/allow_admin_jump))
@@ -1048,7 +1048,7 @@ var/datum/announcement/minor/admin_min_announcer = new
return 0
/datum/admins/proc/spawn_fruit(seedtype in SSplants.seeds)
- set category = "Debug"
+ set category = "Debug.Game"
set desc = "Spawn the product of a seed."
set name = "Spawn Fruit"
@@ -1063,7 +1063,7 @@ var/datum/announcement/minor/admin_min_announcer = new
log_admin("[key_name(usr)] spawned [seedtype] fruit at ([usr.x],[usr.y],[usr.z])")
/datum/admins/proc/spawn_custom_item()
- set category = "Debug"
+ set category = "Debug.Game"
set desc = "Spawn a custom item."
set name = "Spawn Custom Item"
@@ -1081,8 +1081,7 @@ var/datum/announcement/minor/admin_min_announcer = new
item_to_spawn.spawn_item(get_turf(usr))
/datum/admins/proc/check_custom_items()
-
- set category = "Debug"
+ set category = "Debug.Investigate"
set desc = "Check the custom item list."
set name = "Check Custom Items"
@@ -1103,7 +1102,7 @@ var/datum/announcement/minor/admin_min_announcer = new
to_chat(usr, "- name: [item.name] icon: [item.item_icon] path: [item.item_path] desc: [item.item_desc]")
/datum/admins/proc/spawn_plant(seedtype in SSplants.seeds)
- set category = "Debug"
+ set category = "Debug.Game"
set desc = "Spawn a spreading plant effect."
set name = "Spawn Plant"
@@ -1116,7 +1115,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/spawn_atom(var/object as text)
set name = "Spawn"
- set category = "Debug"
+ set category = "Debug.Game"
set desc = "(atom path) Spawn an atom"
if(!check_rights(R_SPAWN)) return
@@ -1150,7 +1149,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/show_traitor_panel(var/mob/M in mob_list)
- set category = "Admin"
+ set category = "Admin.Events"
set desc = "Edit mobs's memory and role"
set name = "Show Traitor Panel"
@@ -1165,7 +1164,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","STP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/show_game_mode()
- set category = "Admin"
+ set category = "Admin.Game"
set desc = "Show the current round configuration."
set name = "Show Game Mode"
@@ -1239,7 +1238,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/toggletintedweldhelmets()
- set category = "Debug"
+ set category = "Server.Config"
set desc="Reduces view range when wearing welding helmets"
set name="Toggle tinted welding helmets."
CONFIG_SET(flag/welder_vision, !CONFIG_GET(flag/welder_vision))
@@ -1252,7 +1251,7 @@ var/datum/announcement/minor/admin_min_announcer = new
feedback_add_details("admin_verb","TTWH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleguests()
- set category = "Server"
+ set category = "Server.Config"
set desc="Guests can't enter"
set name="Toggle guests"
CONFIG_SET(flag/guests_allowed, !CONFIG_GET(flag/guests_allowed))
@@ -1286,7 +1285,7 @@ var/datum/announcement/minor/admin_min_announcer = new
to_chat(usr, span_bold("No AIs located")) //Just so you know the thing is actually working and not just ignoring you.
/datum/admins/proc/show_skills()
- set category = "Admin"
+ set category = "Admin.Investigate"
set name = "Show Skills"
if (!istype(src,/datum/admins))
@@ -1303,7 +1302,7 @@ var/datum/announcement/minor/admin_min_announcer = new
return
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Update Mob Sprite"
set desc = "Should fix any mob sprite update errors."
@@ -1402,7 +1401,7 @@ var/datum/announcement/minor/admin_min_announcer = new
return 1
/datum/admins/proc/force_antag_latespawn()
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Force Template Spawn"
set desc = "Force an antagonist template to spawn."
@@ -1426,7 +1425,7 @@ var/datum/announcement/minor/admin_min_announcer = new
antag.attempt_late_spawn()
/datum/admins/proc/force_mode_latespawn()
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Force Mode Spawn"
set desc = "Force autotraitor to proc."
@@ -1444,7 +1443,7 @@ var/datum/announcement/minor/admin_min_announcer = new
ticker.mode.try_latespawn()
/datum/admins/proc/paralyze_mob(mob/living/H as mob)
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Toggle Paralyze"
set desc = "Paralyzes a player. Or unparalyses them."
@@ -1462,7 +1461,7 @@ var/datum/announcement/minor/admin_min_announcer = new
log_and_message_admins(msg)
/datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob)
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Set Telecrystals"
set desc = "Allows admins to change telecrystals of a user."
set popup_menu = FALSE //VOREStation Edit - Declutter.
@@ -1478,7 +1477,7 @@ var/datum/announcement/minor/admin_min_announcer = new
to_chat(usr, "You do not have access to this command.")
/datum/admins/proc/add_tcrystals(mob/living/carbon/human/H as mob)
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Add Telecrystals"
set desc = "Allows admins to change telecrystals of a user by addition."
set popup_menu = FALSE //VOREStation Edit - Declutter.
@@ -1495,7 +1494,7 @@ var/datum/announcement/minor/admin_min_announcer = new
/datum/admins/proc/sendFax()
- set category = "Special Verbs"
+ set category = "Fun.Event Kit"
set name = "Send Fax"
set desc = "Sends a fax to this machine"
var/department = tgui_input_list(usr, "Choose a fax", "Fax", alldepartments)
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index c2317542fb5..eed6315ef02 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -28,7 +28,7 @@
//ADMINVERBS
/client/proc/investigate_show( subject in list("hrefs","notes","singulo","telesci") )
set name = "Investigate"
- set category = "Admin"
+ set category = "Admin.Investigate"
if(!holder) return
switch(subject)
if("singulo", "telesci") //general one-round-only stuff
diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm
index 23ce2bc7e86..b230031cf20 100644
--- a/code/modules/admin/admin_memo.dm
+++ b/code/modules/admin/admin_memo.dm
@@ -4,7 +4,7 @@
//switch verb so we don't spam up the verb lists with like, 3 verbs for this feature.
/client/proc/admin_memo(task in list("write","show","delete"))
set name = "Memo"
- set category = "Server"
+ set category = "Server.Admin"
#ifndef ENABLE_MEMOS
return
#endif
diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm
index d265f2cd1e3..002d702654e 100644
--- a/code/modules/admin/admin_report.dm
+++ b/code/modules/admin/admin_report.dm
@@ -91,7 +91,7 @@ world/New()
// display only the reports that haven't been handled
/client/proc/display_admin_reports()
- set category = "Admin"
+ set category = "Admin.Moderation"
set name = "Display Admin Reports"
if(!src.holder) return
@@ -119,7 +119,7 @@ world/New()
/client/proc/Report(mob/M as mob in world)
- set category = "Admin"
+ set category = "Admin.Moderation"
if(!src.holder)
return
diff --git a/code/modules/admin/admin_tools.dm b/code/modules/admin/admin_tools.dm
index 323d046a8d8..73d065bcc0c 100644
--- a/code/modules/admin/admin_tools.dm
+++ b/code/modules/admin/admin_tools.dm
@@ -1,5 +1,5 @@
/client/proc/cmd_admin_check_player_logs(mob/living/M as mob in mob_list)
- set category = "Admin"
+ set category = "Admin.Logs"
set name = "Check Player Attack Logs"
set desc = "Check a player's attack logs."
@@ -30,7 +30,7 @@
feedback_add_details("admin_verb","PL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_check_dialogue_logs(mob/living/M as mob in mob_list)
- set category = "Admin"
+ set category = "Admin.Logs"
set name = "Check Player Dialogue Logs"
set desc = "Check a player's dialogue logs."
diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index 28c9550ef81..4b29645516b 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -187,7 +187,6 @@ var/list/admin_verbs_spawn = list(
/client/proc/cmd_admin_droppod_spawn,
/client/proc/respawn_character,
/client/proc/spawn_character_mob, //VOREStation Add,
- /client/proc/virus2_editor,
/client/proc/spawn_chemdisp_cartridge,
/client/proc/map_template_load,
/client/proc/map_template_upload,
@@ -196,7 +195,9 @@ var/list/admin_verbs_spawn = list(
/client/proc/generic_structure, //VOREStation Add
/client/proc/generic_item, //VOREStation Add
/client/proc/create_gm_message,
- /client/proc/remove_gm_message
+ /client/proc/remove_gm_message,
+ /client/proc/AdminCreateVirus,
+ /client/proc/ReleaseVirus
)
var/list/admin_verbs_server = list(
@@ -563,8 +564,9 @@ var/list/admin_verbs_event_manager = list(
/client/proc/toggle_random_events,
/client/proc/modify_server_news,
/client/proc/toggle_spawning_with_recolour,
- /client/proc/start_vote
-
+ /client/proc/start_vote,
+ /client/proc/AdminCreateVirus,
+ /client/proc/ReleaseVirus
)
/client/proc/add_admin_verbs()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 5e2685917ee..7bd3b1e4c15 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -1,6 +1,6 @@
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
set name = "Adminverbs - Hide Most"
- set category = "Admin"
+ set category = "Admin.Misc"
remove_verb(src, list(/client/proc/hide_most_verbs, admin_verbs_hideable))
add_verb(src, /client/proc/show_verbs)
@@ -11,7 +11,7 @@
/client/proc/hide_verbs()
set name = "Adminverbs - Hide All"
- set category = "Admin"
+ set category = "Admin.Misc"
remove_admin_verbs()
add_verb(src, /client/proc/show_verbs)
@@ -22,7 +22,7 @@
/client/proc/show_verbs()
set name = "Adminverbs - Show"
- set category = "Admin"
+ set category = "Admin.Misc"
remove_verb(src, /client/proc/show_verbs)
add_admin_verbs()
@@ -98,7 +98,7 @@
/client/proc/player_panel()
set name = "Player Panel"
- set category = "Admin"
+ set category = "Admin.Game"
if(holder)
holder.player_panel_old()
feedback_add_details("admin_verb","PP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -106,7 +106,7 @@
/client/proc/player_panel_new()
set name = "Player Panel New"
- set category = "Admin"
+ set category = "Admin.Game"
if(holder)
holder.player_panel_new()
feedback_add_details("admin_verb","PPN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -114,7 +114,7 @@
/client/proc/check_antagonists()
set name = "Check Antagonists"
- set category = "Admin"
+ set category = "Admin.Investigate"
if(holder)
holder.check_antagonists()
log_admin("[key_name(usr)] checked antagonists.") //for tsar~
@@ -123,7 +123,7 @@
/client/proc/jobbans()
set name = "Display Job bans"
- set category = "Admin"
+ set category = "Admin.Investigate"
if(holder)
if(CONFIG_GET(flag/ban_legacy_system))
holder.Jobbans()
@@ -134,7 +134,7 @@
/client/proc/unban_panel()
set name = "Unban Panel"
- set category = "Admin"
+ set category = "Admin.Game"
if(holder)
if(CONFIG_GET(flag/ban_legacy_system))
holder.unbanpanel()
@@ -153,14 +153,14 @@
/client/proc/secrets()
set name = "Secrets"
- set category = "Admin"
+ set category = "Admin.Secrets"
if (holder)
holder.Secrets()
feedback_add_details("admin_verb","S") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/colorooc()
- set category = "Fun"
+ set category = "Admin.Misc"
set name = "OOC Text Color"
if(!holder) return
var/response = tgui_alert(src, "Please choose a distinct color that is easy to read and doesn't mix with all the other chat and radio frequency colors.", "Change own OOC color", list("Pick new color", "Reset to default", "Cancel"))
@@ -193,7 +193,7 @@
GLOB.stealthminID["[ckey]"] = "@[num2text(num)]"
/client/proc/stealth()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Stealth Mode"
if(holder)
if(holder.fakekey)
@@ -256,7 +256,7 @@
#undef AUTOBANTIME
/client/proc/drop_bomb() // Some admin dickery that can probably be done better -- TLE
- set category = "Special Verbs.Fun"
+ set category = "Fun.Do Not"
set name = "Drop Bomb"
set desc = "Cause an explosion of varying strength at your location."
@@ -283,39 +283,8 @@
message_admins(span_blue("[ckey] creating an admin explosion at [epicenter.loc]."))
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom
- set category = "Fun"
- set name = "Give Disease"
- set desc = "Gives a Disease to a mob."
-
- var/datum/disease2/disease/D = new /datum/disease2/disease()
-
- var/severity = 1
- var/greater = tgui_input_list(usr, "Is this a lesser, greater, or badmin disease?", "Give Disease", list("Lesser", "Greater", "Badmin"))
- switch(greater)
- if ("Lesser") severity = 1
- if ("Greater") severity = 2
- if ("Badmin") severity = 99
-
- D.makerandom(severity)
- D.infectionchance = tgui_input_number(usr, "How virulent is this disease? (1-100)", "Give Disease", D.infectionchance, 100, 1)
-
- if(istype(T,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = T
- if (H.species)
- D.affected_species = list(H.species.get_bodytype())
- if(H.species.primitive_form)
- D.affected_species |= H.species.primitive_form
- if(H.species.greater_form)
- D.affected_species |= H.species.greater_form
- infect_virus2(T,D,1)
-
- feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].")
- message_admins(span_blue("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance]."), 1)
-
/client/proc/admin_give_modifier(var/mob/living/L)
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Give Modifier"
set desc = "Makes a mob weaker or stronger by adding a specific modifier to them."
set popup_menu = FALSE //VOREStation Edit - Declutter.
@@ -339,7 +308,7 @@
log_and_message_admins("has given [key_name(L)] the modifer [new_modifier_type], with a duration of [duration ? "[duration / 600] minutes" : "forever"].")
/client/proc/make_sound(var/obj/O in world) // -- TLE
- set category = "Special Verbs.Events"
+ set category = "Fun.Sounds"
set name = "Make Sound"
set desc = "Display a message to everyone who can hear the target"
if(O)
@@ -354,13 +323,13 @@
/client/proc/togglebuildmodeself()
set name = "Toggle Build Mode Self"
- set category = "Special Verbs.Events"
+ set category = "Debug.Events"
if(src.mob)
togglebuildmode(src.mob)
feedback_add_details("admin_verb","TBMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/object_talk(var/msg as text) // -- TLE
- set category = "Special Verbs.Events"
+ set category = "Fun.Narrate"
set name = "oSay"
set desc = "Display a message to everyone who can hear the target"
if(mob.control_object)
@@ -371,7 +340,7 @@
feedback_add_details("admin_verb","OT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/kill_air() // -- TLE
- set category = "Debug"
+ set category = "Debug.Dangerous"
set name = "Kill Air"
set desc = "Toggle Air Processing"
SSair.can_fire = !SSair.can_fire
@@ -382,7 +351,7 @@
/client/proc/readmin_self()
set name = "Re-Admin self"
- set category = "Admin"
+ set category = "Admin.Misc"
if(deadmin_holder)
deadmin_holder.reassociate()
@@ -393,7 +362,7 @@
/client/proc/deadmin_self()
set name = "De-admin self"
- set category = "Admin"
+ set category = "Admin.Misc"
if(holder)
if(tgui_alert(usr, "Confirm self-deadmin for the round? You can't re-admin yourself without someone promoting you.","Deadmin",list("Yes","No")) == "Yes")
@@ -406,7 +375,7 @@
/client/proc/toggle_log_hrefs()
set name = "Toggle href logging"
- set category = "Server"
+ set category = "Server.Config"
if(!holder) return
if(config)
CONFIG_SET(flag/log_hrefs, !CONFIG_GET(flag/log_hrefs))
@@ -414,13 +383,13 @@
/client/proc/check_ai_laws()
set name = "Check AI Laws"
- set category = "Admin.Game"
+ set category = "Admin.Silicon"
if(holder)
src.holder.output_ai_laws()
/client/proc/rename_silicon()
set name = "Rename Silicon"
- set category = "Admin"
+ set category = "Admin.Silicon"
if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return
@@ -435,7 +404,7 @@
/client/proc/manage_silicon_laws()
set name = "Manage Silicon Laws"
- set category = "Admin"
+ set category = "Admin.Silicon"
if(!check_rights(R_ADMIN|R_EVENT)) return
@@ -462,7 +431,7 @@
/client/proc/shuttle_panel()
set name = "Shuttle Control Panel"
- set category = "Admin"
+ set category = "Admin.Events"
if(!check_rights(R_ADMIN | R_EVENT))
return
@@ -476,7 +445,7 @@
/client/proc/mod_panel()
set name = "Moderator Panel"
- set category = "Admin"
+ set category = "Admin.Moderation"
/* if(holder)
holder.mod_panel()*/
// feedback_add_details("admin_verb","MP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -484,14 +453,14 @@
/client/proc/playernotes()
set name = "Show Player Info"
- set category = "Admin"
+ set category = "Admin.Moderation"
if(holder)
holder.PlayerNotes()
return
/client/proc/free_slot()
set name = "Free Job Slot"
- set category = "Admin"
+ set category = "Admin.Game"
if(holder)
var/list/jobs = list()
for (var/datum/job/J in job_master.occupations)
@@ -508,7 +477,7 @@
/client/proc/toggleghostwriters()
set name = "Toggle ghost writers"
- set category = "Server"
+ set category = "Server.Game"
if(!holder) return
if(config)
CONFIG_SET(flag/cult_ghostwriter, !CONFIG_GET(flag/cult_ghostwriter))
@@ -516,14 +485,14 @@
/client/proc/toggledrones()
set name = "Toggle maintenance drones"
- set category = "Server"
+ set category = "Server.Game"
if(!holder) return
if(config)
CONFIG_SET(flag/allow_drone_spawn, !CONFIG_GET(flag/allow_drone_spawn))
message_admins("Admin [key_name_admin(usr)] has [CONFIG_GET(flag/allow_drone_spawn) ? "en" : "dis"]abled maintenance drones.", 1)
/client/proc/man_up(mob/T as mob in mob_list)
- set category = "Fun"
+ set category = "Fun.Do Not"
set name = "Man Up"
set desc = "Tells mob to man up and deal with it."
set popup_menu = FALSE //VOREStation Edit - Declutter.
@@ -537,7 +506,7 @@
message_admins(span_blue("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it."), 1)
/client/proc/global_man_up()
- set category = "Fun"
+ set category = "Fun.Do Not"
set name = "Man Up Global"
set desc = "Tells everyone to man up and deal with it."
@@ -551,7 +520,7 @@
message_admins(span_blue("[key_name_admin(usr)] told everyone to man up and deal with it."), 1)
/client/proc/give_spell(mob/T as mob in mob_list) // -- Urist
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Give Spell"
set desc = "Gives a spell to a mob."
var/spell/S = tgui_input_list(usr, "Choose the spell to give to that guy", "ABRAKADABRA", spells)
@@ -563,6 +532,6 @@
/client/proc/debugstatpanel()
set name = "Debug Stat Panel"
- set category = "Debug"
+ set category = "Debug.Misc"
src.stat_panel.send_message("create_debug")
diff --git a/code/modules/admin/admin_verbs_vr.dm b/code/modules/admin/admin_verbs_vr.dm
index d6552d1e560..a04c4bddbdf 100644
--- a/code/modules/admin/admin_verbs_vr.dm
+++ b/code/modules/admin/admin_verbs_vr.dm
@@ -1,5 +1,5 @@
/client/proc/adminorbit()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Orbit Things"
set desc = "Makes something orbit around something else."
set popup_menu = FALSE
@@ -57,7 +57,7 @@
/client/proc/removetickets()
set name = "Security Tickets"
- set category = "Admin"
+ set category = "Admin.Investigate"
set desc = "Allows one to remove tickets from the global list."
if(!check_rights(R_ADMIN))
@@ -77,7 +77,7 @@
/client/proc/delbook()
set name = "Delete Book"
set desc = "Permamently deletes a book from the database."
- set category = "Admin"
+ set category = "Admin.Game"
if(!src.holder)
to_chat(src, "Only administrators may use this command.")
return
@@ -124,7 +124,7 @@
/client/proc/toggle_spawning_with_recolour()
set name = "Toggle Simple/Robot recolour verb"
set desc = "Makes it so new robots/simple_mobs spawn with a verb to recolour themselves for this round. You must set them separately."
- set category = "Server"
+ set category = "Server.Game"
if(!check_rights(R_ADMIN|R_EVENT|R_FUN))
return
diff --git a/code/modules/admin/admin_vr.dm b/code/modules/admin/admin_vr.dm
index e40db3f525a..9076957fa65 100644
--- a/code/modules/admin/admin_vr.dm
+++ b/code/modules/admin/admin_vr.dm
@@ -1,5 +1,5 @@
/datum/admins/proc/set_uplink(mob/living/carbon/human/H as mob)
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Set Uplink"
set desc = "Allows admins to set up an uplink on a character. This will be required for a character to use telecrystals."
set popup_menu = FALSE
@@ -11,4 +11,4 @@
var/msg = "[key_name(usr)] has given [H.ckey] an uplink."
message_admins(msg)
else
- to_chat(usr, "You do not have access to this command.")
\ No newline at end of file
+ to_chat(usr, "You do not have access to this command.")
diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm
index 3400098afe7..f1bb2833fb9 100644
--- a/code/modules/admin/callproc/callproc.dm
+++ b/code/modules/admin/callproc/callproc.dm
@@ -1,5 +1,5 @@
/client/proc/callproc()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Advanced ProcCall"
set waitfor = 0
@@ -131,7 +131,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
#endif
/client/proc/callproc_datum(datum/A as null|area|mob|obj|turf)
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Atom ProcCall"
set waitfor = 0
diff --git a/code/modules/admin/ckey_vr.dm b/code/modules/admin/ckey_vr.dm
index 1ae417a1c18..f0801e8b78e 100644
--- a/code/modules/admin/ckey_vr.dm
+++ b/code/modules/admin/ckey_vr.dm
@@ -1,6 +1,6 @@
// Command to set the ckey of a mob without requiring VV permission
/client/proc/SetCKey(var/mob/M in mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Set CKey"
set desc = "Mob to teleport"
if(!src.holder)
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 9c8f05ceea6..2727ec15bee 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -118,7 +118,7 @@ NOTE: It checks usr by default. Supply the "user" argument if you wish to check
vv_update_display(D, "marked", VV_MSG_MARKED)
/client/proc/mark_datum_mapview(datum/D as mob|obj|turf|area in view(view))
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Mark Object"
mark_datum(D)
diff --git a/code/modules/admin/map_capture.dm b/code/modules/admin/map_capture.dm
index 431ec7f637f..e1573358297 100644
--- a/code/modules/admin/map_capture.dm
+++ b/code/modules/admin/map_capture.dm
@@ -1,5 +1,5 @@
/datum/admins/proc/capture_map(tx as null|num, ty as null|num, tz as null|num, range as null|num)
- set category = "Server"
+ set category = "Server.Game"
set name = "Capture Map Part"
set desc = "Usage: Capture-Map-Part target_x_cord target_y_cord target_z_cord range (captures part of a map originating from bottom left corner)"
diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm
index 9166f3be293..f2847943f35 100644
--- a/code/modules/admin/modify_robot.dm
+++ b/code/modules/admin/modify_robot.dm
@@ -89,6 +89,13 @@
.["target"]["components"] = get_components()
.["cell"] = list("name" = target.cell?.name, "charge" = target.cell?.charge, "maxcharge" = target.cell?.maxcharge)
.["cell_options"] = get_cells()
+ .["camera_options"] = get_component("camera")
+ .["radio_options"] = get_component("radio")
+ .["actuator_options"] = get_component("actuator")
+ .["diagnosis_options"] = get_component("diagnosis")
+ .["comms_options"] = get_component("comms")
+ .["armour_options"] = get_component("armour")
+ .["current_gear"] = get_gear()
// Access
.["id_icon"] = icon2html(target.idcard, user, sourceonly=TRUE)
var/list/active_access = list()
@@ -198,7 +205,7 @@
target.module.contents.Add(add_item)
spawn(0)
SEND_SIGNAL(add_item, COMSIG_OBSERVER_MOVED)
- target.hud_used.update_robot_modules_display()
+ target.hud_used?.update_robot_modules_display()
if(istype(add_item, /obj/item/stack/))
var/obj/item/stack/item_with_synth = add_item
for(var/synth in item_with_synth.synths)
@@ -243,7 +250,7 @@
if("rem_module")
var/obj/item/rem_item = locate(params["module"])
target.uneq_all()
- target.hud_used.update_robot_modules_display(TRUE)
+ target.hud_used?.update_robot_modules_display(TRUE)
target.module.emag.Remove(rem_item)
target.module.modules.Remove(rem_item)
target.module.contents.Remove(rem_item)
@@ -262,14 +269,14 @@
source.emag_items = 1
// Target
target.uneq_all()
- target.hud_used.update_robot_modules_display(TRUE)
+ target.hud_used?.update_robot_modules_display(TRUE)
qdel(target.module)
target.modtype = mod_type
module_type = robot_modules[mod_type]
target.transform_with_anim()
new module_type(target)
target.hands.icon_state = target.get_hud_module_icon()
- target.hud_used.update_robot_modules_display()
+ target.hud_used?.update_robot_modules_display()
return TRUE
if("ert_toggle")
target.crisis_override = !target.crisis_override
@@ -299,7 +306,7 @@
if(!U.action(target))
return FALSE
U.loc = target
- target.hud_used.update_robot_modules_display()
+ target.hud_used?.update_robot_modules_display()
return TRUE
if("install_modkit")
var/new_modkit = text2path(params["modkit"])
@@ -348,22 +355,34 @@
var/datum/robot_component/C = locate(params["component"])
if(C.wrapped)
qdel(C.wrapped)
+ var/new_component = text2path(params["new_part"])
if(istype(C, /datum/robot_component/actuator))
- C.wrapped = new /obj/item/robot_parts/robot_component/actuator(target)
+ if(!new_component)
+ new_component = /obj/item/robot_parts/robot_component/actuator
+ C.wrapped = new new_component(target)
else if(istype(C, /datum/robot_component/radio))
- C.wrapped = new /obj/item/robot_parts/robot_component/radio(target)
+ if(!new_component)
+ new_component = /obj/item/robot_parts/robot_component/radio
+ C.wrapped = new new_component(target)
else if(istype(C, /datum/robot_component/cell))
- var/new_cell = text2path(params["cell"])
- target.cell = new new_cell(target)
+ target.cell = new new_component(target)
C.wrapped = target.cell
else if(istype(C, /datum/robot_component/diagnosis_unit))
- C.wrapped = new /obj/item/robot_parts/robot_component/diagnosis_unit(target)
+ if(!new_component)
+ new_component = /obj/item/robot_parts/robot_component/diagnosis_unit
+ C.wrapped = new new_component(target)
else if(istype(C, /datum/robot_component/camera))
- C.wrapped = new /obj/item/robot_parts/robot_component/camera(target)
+ if(!new_component)
+ new_component = /obj/item/robot_parts/robot_component/camera
+ C.wrapped = new new_component(target)
else if(istype(C, /datum/robot_component/binary_communication))
- C.wrapped = new /obj/item/robot_parts/robot_component/binary_communication_device(target)
+ if(!new_component)
+ new_component = /obj/item/robot_parts/robot_component/binary_communication_device
+ C.wrapped = new new_component(target)
else if(istype(C, /datum/robot_component/armour))
- C.wrapped = new /obj/item/robot_parts/robot_component/armour(target)
+ if(!new_component)
+ new_component = /obj/item/robot_parts/robot_component/armour
+ C.wrapped = new new_component(target)
C.brute_damage = 0
C.electronics_damage = 0
C.install()
@@ -533,7 +552,7 @@
target.clear_inherent_laws()
target.laws = new global.using_map.default_law_type
target.laws.show_laws(target)
- target.hud_used.update_robot_modules_display()
+ target.hud_used?.update_robot_modules_display()
else
target.emagged = 1
target.lawupdate = 0
@@ -545,7 +564,7 @@
if(!target.bolt.malfunction)
target.bolt.malfunction = MALFUNCTION_PERMANENT
target.laws.show_laws(target)
- target.hud_used.update_robot_modules_display()
+ target.hud_used?.update_robot_modules_display()
return TRUE
/datum/eventkit/modify_robot/proc/get_target_items(var/mob/user)
@@ -672,14 +691,59 @@
continue
if(cell_options[initial(C.name)]) // empty cells are defined after normal cells!
continue
- cell_options += list(initial(C.name) = list("path" = "[C]", "charge" = initial(C.maxcharge), "max_charge" = initial(C.maxcharge), "charge_amount" = initial(C.charge_amount) , "self_charge" = initial(C.self_recharge))) // our cells do not have their charge predefined, they do it on init, so both maaxcharge for now
+ cell_options += list(initial(C.name) = list("path" = "[C]", "charge" = initial(C.maxcharge), "max_charge" = initial(C.maxcharge), "charge_amount" = initial(C.charge_amount) , "self_charge" = initial(C.self_recharge), "max_damage" = initial(C.robot_durability))) // our cells do not have their charge predefined, they do it on init, so both maaxcharge for now
return cell_options
+/datum/eventkit/modify_robot/proc/get_component(var/type)
+ var/path
+ switch(type)
+ if("camera")
+ path = /obj/item/robot_parts/robot_component/camera
+ if("radio")
+ path = /obj/item/robot_parts/robot_component/radio
+ if("actuator")
+ path = /obj/item/robot_parts/robot_component/actuator
+ if("diagnosis")
+ path = /obj/item/robot_parts/robot_component/diagnosis_unit
+ if("comms")
+ path = /obj/item/robot_parts/robot_component/binary_communication_device
+ if("armour")
+ path = /obj/item/robot_parts/robot_component/armour
+ if(!path)
+ return
+ var/list/components = list()
+ for(var/component in typesof(path))
+ var/obj/item/robot_parts/robot_component/C = component
+ components += list("[initial(C.name)]" = list("path" = "[component]", "idle_usage" = "[C.idle_usage]", "active_usage" = "[C.active_usage]", "max_damage" = "[C.max_damage]"))
+ return components
+
+/datum/eventkit/modify_robot/proc/get_gear()
+ var/list/equip = list()
+ for (var/V in target.components)
+ var/datum/robot_component/C = target.components[V]
+ var/component_name
+ if(istype(C.wrapped, /obj/item/robot_parts/robot_component))
+ component_name = C.wrapped?.name
+ switch(V)
+ if("actuator")
+ equip += list("[lowertext(C.name)]" = "[component_name]")
+ if("radio")
+ equip += list("[lowertext(C.name)]" = "[component_name]")
+ if("diagnosis unit")
+ equip += list("[lowertext(C.name)]" = "[component_name]")
+ if("camera")
+ equip += list("[lowertext(C.name)]" = "[component_name]")
+ if("comms")
+ equip += list("[lowertext(C.name)]" = "[component_name]")
+ if("armour")
+ equip += list("[lowertext(C.name)]" = "[component_name]")
+ return equip
+
/datum/eventkit/modify_robot/proc/get_components()
var/list/components = list()
for(var/entry in target.components)
var/datum/robot_component/C = target.components[entry]
- components += list(list("name" = C.name, "ref" = "\ref[C]", "brute_damage" = C.brute_damage, "electronics_damage" = C.electronics_damage, "max_damage" = C.max_damage, "installed" = C.installed, "exists" = (C.wrapped ? TRUE : FALSE)))
+ components += list(list("name" = C.name, "ref" = "\ref[C]", "brute_damage" = C.brute_damage, "electronics_damage" = C.electronics_damage, "max_damage" = C.max_damage, "idle_usage" = C.idle_usage, "active_usage" = C.active_usage, "installed" = C.installed, "exists" = (C.wrapped ? TRUE : FALSE)))
return components
/datum/eventkit/modify_robot/proc/package_laws(var/list/data, var/field, var/list/datum/ai_law/laws)
diff --git a/code/modules/admin/news.dm b/code/modules/admin/news.dm
index c0812b818e5..30defc11c29 100644
--- a/code/modules/admin/news.dm
+++ b/code/modules/admin/news.dm
@@ -13,7 +13,7 @@
/client/proc/modify_server_news()
set name = "Modify Public News"
- set category = "Server"
+ set category = "Server.Game"
if(!check_rights(0))
return
@@ -118,4 +118,4 @@
text = replacetext(text, "", "\[sglogo\]")
return text
-#undef NEWSFILE
\ No newline at end of file
+#undef NEWSFILE
diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm
index d94aec94bde..34adf5c3abe 100644
--- a/code/modules/admin/permissionverbs/permissionedit.dm
+++ b/code/modules/admin/permissionverbs/permissionedit.dm
@@ -1,5 +1,5 @@
/client/proc/edit_admin_permissions()
- set category = "Admin"
+ set category = "Admin.Secrets"
set name = "Permissions Panel"
set desc = "Edit admin permissions"
if(!check_rights(R_PERMISSIONS)) return
diff --git a/code/modules/admin/persistence.dm b/code/modules/admin/persistence.dm
index 8405f8d101f..79a93b8c0f1 100644
--- a/code/modules/admin/persistence.dm
+++ b/code/modules/admin/persistence.dm
@@ -1,6 +1,6 @@
/datum/admins/proc/view_persistent_data()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "View Persistent Data"
set desc = "Shows a list of persistent data for this round. Allows modification by admins."
- SSpersistence.show_info(usr)
\ No newline at end of file
+ SSpersistence.show_info(usr)
diff --git a/code/modules/admin/player_effects.dm b/code/modules/admin/player_effects.dm
index e5c7457edf8..921795beb73 100644
--- a/code/modules/admin/player_effects.dm
+++ b/code/modules/admin/player_effects.dm
@@ -339,6 +339,32 @@
M.forceMove(new_mob)
new_mob.tf_mob_holder = M
+ if("item_tf")
+ var/mob/living/M = target
+
+ if(!istype(M))
+ return
+
+ if(!M.ckey)
+ return
+
+ var/obj/item/spawning = user.client.get_path_from_partial_text()
+
+ to_chat(user,span_warning("spawning is: [spawning]"))
+
+ if(!ispath(spawning, /obj/item/))
+ to_chat(user,span_warning("Can only spawn items."))
+ return
+
+ var/obj/item/spawned_obj = new spawning(M.loc)
+ var/obj/item/original_name = spawned_obj.name
+ spawned_obj.inhabit_item(M, original_name, M)
+ var/mob/living/possessed_voice = spawned_obj.possessed_voice
+ spawned_obj.trash_eatable = M.devourable
+ spawned_obj.unacidable = !M.digestable
+ M.forceMove(possessed_voice)
+
+
////////MEDICAL//////////////
if("appendicitis")
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index 86ff00b5337..dc8d8ae15f9 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -188,7 +188,7 @@ Example: USING PROCCALL = BLOCKING, SELECT = FORCE_NULLS, PRIORITY = HIGH SELECT
CRASH("SDQL2 fatal error");};
/client/proc/SDQL2_query(query_text as message)
- set category = "Debug"
+ set category = "Debug.Misc"
if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe.
message_admins(span_danger("ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!"))
log_admin("Non-admin [key_name(usr)] attempted to execute a SDQL query!")
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 6c3da08252c..d543c9e64c5 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -639,7 +639,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
//admin proc
/client/proc/cmd_admin_ticket_panel()
set name = "Show Ticket List"
- set category = "Admin"
+ set category = "Admin.Misc"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT, TRUE))
return
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 7b902c675da..aead36bbc74 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -7,7 +7,7 @@
/client/proc/Jump(areaname as null|anything in return_sorted_areas())
set name = "Jump to Area"
set desc = "Area to jump to"
- set category = "Admin"
+ set category = "Admin.Game"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
@@ -33,7 +33,7 @@
/client/proc/jumptoturf(var/turf/T in world)
set name = "Jump to Turf"
- set category = "Admin"
+ set category = "Admin.Game"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
if(CONFIG_GET(flag/allow_admin_jump))
@@ -48,7 +48,7 @@
/// Verb wrapper around do_jumptomob()
/client/proc/jumptomob(mob as null|anything in mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Jump to Mob"
set popup_menu = FALSE //VOREStation Edit - Declutter.
@@ -80,7 +80,7 @@
to_chat(A, span_filter_adminlog("This mob is not located in the game world."))
/client/proc/jumptocoord(tx as num, ty as num, tz as num)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Jump to Coordinate"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
@@ -102,7 +102,7 @@
tgui_alert_async(usr, "Admin jumping disabled")
/client/proc/jumptokey()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Jump to Key"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
@@ -125,7 +125,7 @@
tgui_alert_async(usr, "Admin jumping disabled")
/client/proc/Getmob(mob/living/M as null|anything in mob_list) //VOREStation Edit
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Get Mob"
set desc = "Mob to teleport"
set popup_menu = TRUE //VOREStation Edit
@@ -148,7 +148,7 @@
tgui_alert_async(usr, "Admin jumping disabled")
/client/proc/Getkey()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Get Key"
set desc = "Key to teleport"
@@ -178,7 +178,7 @@
tgui_alert_async(usr, "Admin jumping disabled")
/client/proc/sendmob()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Send Mob"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
@@ -202,7 +202,7 @@
tgui_alert_async(usr, "Admin jumping disabled")
/client/proc/cmd_admin_move_atom(var/atom/movable/AM, tx as num, ty as num, tz as num)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Move Atom to Coordinate"
if(!check_rights(R_ADMIN|R_DEBUG|R_EVENT))
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 9c9dff4c7bb..911ad029e8a 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -1,5 +1,5 @@
/client/proc/cmd_admin_say(msg as text)
- set category = "Special Verbs"
+ set category = "Admin.Chat"
set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite
set hidden = 1
if(!check_rights(R_ADMIN)) //VOREStation Edit
@@ -18,7 +18,7 @@
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_mod_say(msg as text)
- set category = "Special Verbs"
+ set category = "Admin.Chat"
set name = "Msay"
set hidden = 1
@@ -41,7 +41,7 @@
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_event_say(msg as text)
- set category = "Special Verbs"
+ set category = "Admin.Chat"
set name = "Esay"
set hidden = 1
diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm
index 59f21a15aee..0d2b6e4fe8b 100644
--- a/code/modules/admin/verbs/antag-ooc.dm
+++ b/code/modules/admin/verbs/antag-ooc.dm
@@ -1,5 +1,5 @@
/client/proc/aooc(msg as text)
- set category = "OOC"
+ set category = "OOC.Chat"
set name = "AOOC"
set desc = "Antagonist OOC"
diff --git a/code/modules/admin/verbs/change_appearance.dm b/code/modules/admin/verbs/change_appearance.dm
index c27b658503c..ed0f3266f20 100644
--- a/code/modules/admin/verbs/change_appearance.dm
+++ b/code/modules/admin/verbs/change_appearance.dm
@@ -1,7 +1,7 @@
/client/proc/change_human_appearance_admin()
set name = "Change Mob Appearance - Admin"
set desc = "Allows you to change the mob appearance"
- set category = "Admin"
+ set category = "Admin.Events"
if(!check_rights(R_FUN)) return
@@ -15,7 +15,7 @@
/client/proc/change_human_appearance_self()
set name = "Change Mob Appearance - Self"
set desc = "Allows the mob to change its appearance"
- set category = "Admin"
+ set category = "Admin.Events"
if(!check_rights(R_FUN)) return
@@ -37,7 +37,7 @@
/client/proc/editappear()
set name = "Edit Appearance"
- set category = "Fun"
+ set category = "Fun.Event Kit"
if(!check_rights(R_FUN)) return
diff --git a/code/modules/admin/verbs/check_customitem_activity.dm b/code/modules/admin/verbs/check_customitem_activity.dm
index cb3bfa45dc2..796a48368dc 100644
--- a/code/modules/admin/verbs/check_customitem_activity.dm
+++ b/code/modules/admin/verbs/check_customitem_activity.dm
@@ -2,7 +2,7 @@ var/checked_for_inactives = 0
var/inactive_keys = "None "
/client/proc/check_customitem_activity()
- set category = "Admin"
+ set category = "Admin.Investigate"
set name = "Check activity of players with custom items"
var/dat = span_bold("Inactive players with custom items") + " "
diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm
index 4b370a925be..db6e44be73e 100644
--- a/code/modules/admin/verbs/cinematic.dm
+++ b/code/modules/admin/verbs/cinematic.dm
@@ -1,6 +1,6 @@
/client/proc/cinematic(var/cinematic as anything in list("explosion",null))
set name = "Cinematic"
- set category = "Fun"
+ set category = "Fun.Do Not"
set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
if(!check_rights(R_FUN))
diff --git a/code/modules/admin/verbs/custom_event.dm b/code/modules/admin/verbs/custom_event.dm
index ef0b32bb8b3..dc699dfa573 100644
--- a/code/modules/admin/verbs/custom_event.dm
+++ b/code/modules/admin/verbs/custom_event.dm
@@ -1,6 +1,6 @@
// verb for admins to set custom event
/client/proc/cmd_admin_change_custom_event()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Change Custom Event"
if(!holder)
@@ -33,7 +33,7 @@
// normal verb for players to view info
/client/verb/cmd_view_custom_event()
- set category = "OOC"
+ set category = "OOC.Game"
set name = "Custom Event Info"
if(!custom_event_msg || custom_event_msg == "")
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 20334999b36..24ad107d411 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -1,5 +1,5 @@
/client/proc/dsay(msg as text)
- set category = "Special Verbs"
+ set category = "Admin.Chat"
set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite
set hidden = 1
if(!src.holder)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 685e1fd1757..18ff612d9ad 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -1,5 +1,5 @@
/client/proc/Debug2()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Debug-Game"
if(!check_rights(R_DEBUG)) return
@@ -18,7 +18,7 @@
/client/proc/simple_DPS()
set name = "Simple DPS"
- set category = "Debug"
+ set category = "Debug.Investigate"
set desc = "Gives a really basic idea of how much hurt something in-hand does."
var/obj/item/I = null
@@ -73,7 +73,7 @@
return
/client/proc/Cell()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Cell"
if(!mob)
return
@@ -94,7 +94,7 @@
feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_robotize(var/mob/M in mob_list)
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Make Robot"
if(!ticker)
@@ -109,7 +109,7 @@
tgui_alert_async(usr, "Invalid mob")
/client/proc/cmd_admin_animalize(var/mob/M in mob_list)
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Make Simple Animal"
if(!ticker)
@@ -130,7 +130,7 @@
/client/proc/makepAI()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Make pAI"
set desc = "Spawn someone in as a pAI!"
if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG))
@@ -161,7 +161,7 @@
feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_alienize(var/mob/M in mob_list)
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Make Alien"
if(!ticker)
@@ -180,7 +180,7 @@
//TODO: merge the vievars version into this or something maybe mayhaps
/client/proc/cmd_debug_del_all()
- set category = "Debug"
+ set category = "Debug.Dangerous"
set name = "Del-All"
// to prevent REALLY stupid deletions
@@ -195,7 +195,7 @@
feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_debug_make_powernets()
- set category = "Debug"
+ set category = "Debug.Dangerous"
set name = "Make Powernets"
SSmachines.makepowernets()
log_admin("[key_name(src)] has remade the powernet. SSmachines.makepowernets() called.")
@@ -203,7 +203,7 @@
feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_debug_tog_aliens()
- set category = "Server"
+ set category = "Server.Game"
set name = "Toggle Aliens"
CONFIG_SET(flag/aliens_allowed, !CONFIG_GET(flag/aliens_allowed))
@@ -212,7 +212,7 @@
feedback_add_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_display_del_log()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Display del() Log"
set desc = "Display del's log of everything that's passed through it."
@@ -242,7 +242,7 @@
usr << browse(dellog.Join(), "window=dellog")
/client/proc/cmd_display_init_log()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Display Initialize() Log"
set desc = "Displays a list of things that didn't handle Initialize() properly"
@@ -251,7 +251,7 @@
/*
/client/proc/cmd_display_overlay_log()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Display overlay Log"
set desc = "Display SSoverlays log of everything that's passed through it."
@@ -273,7 +273,7 @@
. = lines.Join("\n")
/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list)
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Grant Full Access"
if (!ticker)
@@ -304,7 +304,7 @@
message_admins(span_blue("[key_name_admin(usr)] has granted [M.key] full access."), 1)
/client/proc/cmd_assume_direct_control(var/mob/M in mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Assume direct control"
set desc = "Direct intervention"
@@ -325,7 +325,7 @@
/client/proc/take_picture(var/atom/A in world)
set name = "Save PNG"
- set category = "Debug"
+ set category = "Debug.Misc"
set desc = "Opens a dialog to save a PNG of any object in the game."
if(!check_rights(R_DEBUG))
@@ -422,7 +422,7 @@
to_world("* [areatype]")
/datum/admins/proc/cmd_admin_dress(input in getmobs())
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Select equipment"
if(!check_rights(R_FUN))
@@ -454,7 +454,7 @@
/client/proc/startSinglo()
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Start Singularity"
set desc = "Sets up the singularity and all machines to get power flowing through the station"
@@ -498,7 +498,7 @@
Rad.toggle_power()
/client/proc/setup_supermatter_engine()
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Setup supermatter"
set desc = "Sets up the supermatter engine"
@@ -581,7 +581,7 @@
/client/proc/cmd_debug_mob_lists()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Debug Mob Lists"
set desc = "For when you just gotta know"
@@ -600,7 +600,7 @@
to_chat(usr, span_filter_debuglogs(jointext(GLOB.clients,",")))
/client/proc/cmd_debug_using_map()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Debug Map Datum"
set desc = "Debug the map metadata about the currently compiled in map."
@@ -625,7 +625,7 @@
tgui_alert_async(usr, "Invalid mob")
/datum/admins/proc/view_runtimes()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "View Runtimes"
set desc = "Open the Runtime Viewer"
@@ -635,7 +635,7 @@
error_cache.showTo(usr)
/datum/admins/proc/change_weather()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Change Weather"
set desc = "Changes the current weather."
@@ -653,7 +653,7 @@
log_admin(log)
/datum/admins/proc/toggle_firework_override()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Toggle Weather Firework Override"
set desc = "Toggles ability for weather fireworks to affect weather on planet of choice."
@@ -668,7 +668,7 @@
log_admin(log)
/datum/admins/proc/change_time()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Change Planet Time"
set desc = "Changes the time of a planet."
diff --git a/code/modules/admin/verbs/debug_vr.dm b/code/modules/admin/verbs/debug_vr.dm
index 051bbf64924..60e5c5d6366 100644
--- a/code/modules/admin/verbs/debug_vr.dm
+++ b/code/modules/admin/verbs/debug_vr.dm
@@ -1,5 +1,5 @@
/datum/admins/proc/quick_nif()
- set category = "Fun"
+ set category = "Fun.Add Nif"
set name = "Quick NIF"
set desc = "Spawns a NIF into someone in quick-implant mode."
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 1ce73a7f742..63b18ab07b8 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -1,5 +1,5 @@
/client/proc/air_report()
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "Show Air Report"
if(!master_controller || !air_master)
@@ -42,7 +42,7 @@
usr << browse(output,"window=airreport")
/client/proc/fix_next_move()
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Unfreeze Everyone"
var/largest_move_time = 0
var/largest_click_time = 0
@@ -73,7 +73,7 @@
return
/client/proc/radio_report()
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Radio report"
var/output = "Radio Report"
@@ -100,7 +100,7 @@
/client/proc/reload_admins()
set name = "Reload Admins"
- set category = "Debug"
+ set category = "Debug.Server"
if(!check_rights(R_SERVER)) return
@@ -110,7 +110,7 @@
/client/proc/reload_eventMs()
set name = "Reload Event Managers"
- set category = "Debug"
+ set category = "Debug.Server"
if(!check_rights(R_SERVER)) return
@@ -121,7 +121,7 @@
//todo:
/client/proc/jump_to_dead_group()
set name = "Jump to dead group"
- set category = "Debug"
+ set category = "Debug.Game"
/*
if(!holder)
to_chat(src, "Only administrators may use this command.")
@@ -143,7 +143,7 @@
/client/proc/kill_airgroup()
set name = "Kill Local Airgroup"
set desc = "Use this to allow manual manupliation of atmospherics."
- set category = "Debug"
+ set category = "Debug.Dangerous"
/*
if(!holder)
to_chat(src, "Only administrators may use this command.")
@@ -166,7 +166,7 @@
/client/proc/print_jobban_old()
set name = "Print Jobban Log"
set desc = "This spams all the active jobban entries for the current round to standard output."
- set category = "Debug"
+ set category = "Debug.Investigate"
to_chat(usr, span_bold("Jobbans active in this round."))
for(var/t in jobban_keylist)
@@ -175,7 +175,7 @@
/client/proc/print_jobban_old_filter()
set name = "Search Jobban Log"
set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output."
- set category = "Debug"
+ set category = "Debug.Investigate"
var/job_filter = tgui_input_text(usr, "Contains what?","Job Filter")
if(!job_filter)
diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm
index cc21521859d..09e171eafd4 100644
--- a/code/modules/admin/verbs/dice.dm
+++ b/code/modules/admin/verbs/dice.dm
@@ -1,5 +1,5 @@
/client/proc/roll_dices()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Roll Dice"
if(!check_rights(R_FUN))
return
@@ -21,4 +21,4 @@
if(tgui_alert(usr, "Do you want to inform the world about the result?","Show world?",list("Yes", "No")) == "Yes")
to_world("
Gods rolled [dice], result is [result]
")
- message_admins("[key_name_admin(src)] rolled dice [dice], result is [result]", 1)
\ No newline at end of file
+ message_admins("[key_name_admin(src)] rolled dice [dice], result is [result]", 1)
diff --git a/code/modules/admin/verbs/entity_narrate.dm b/code/modules/admin/verbs/entity_narrate.dm
index f88dbb192cd..d8322e93b83 100644
--- a/code/modules/admin/verbs/entity_narrate.dm
+++ b/code/modules/admin/verbs/entity_narrate.dm
@@ -27,7 +27,7 @@
/client/proc/add_mob_for_narration(E as obj|mob|turf in orange(world.view))
set name = "Narrate Entity (Add ref)"
set desc = "Saves a reference of target mob to be called when narrating."
- set category = "Fun"
+ set category = "Fun.Narrate"
if(!check_rights(R_FUN)) return
@@ -77,7 +77,7 @@
/client/proc/remove_mob_for_narration()
set name = "Narrate Entity (Remove ref)"
set desc = "Remove mobs you're no longer narrating from your list for easier work."
- set category = "Fun"
+ set category = "Fun.Narrate"
if(!check_rights(R_FUN)) return
@@ -107,7 +107,7 @@
/client/proc/narrate_mob()
set name = "Narrate Entity (Interface)"
set desc = "Send either a visible or audiable message through your chosen entities using an interface"
- set category = "Fun"
+ set category = "Fun.Narrate"
if(!check_rights(R_FUN)) return
@@ -138,7 +138,7 @@
/client/proc/narrate_mob_args(name as text, mode as text, message as text)
set name = "Narrate Entity"
set desc = "Narrate entities using positional arguments. Name should be as saved in ref list, mode should be Speak or Emote, follow with message"
- set category = "Fun"
+ set category = "Fun.Narrate"
diff --git a/code/modules/admin/verbs/event_triggers.dm b/code/modules/admin/verbs/event_triggers.dm
index bf7596656ea..fe843855aef 100644
--- a/code/modules/admin/verbs/event_triggers.dm
+++ b/code/modules/admin/verbs/event_triggers.dm
@@ -4,7 +4,7 @@ Eventkit verb to be used to spawn the obj/effect/landmarks defined under code\ga
/client/proc/manage_event_triggers()
set name = "Manage Event Triggers"
set desc = "Open dialogue to create or delete narration/notification triggers"
- set category = "EventKit"
+ set category = "Fun.Event Kit"
if(!check_rights(R_FUN)) return
diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm
index 76f177535ad..b997c863fe5 100644
--- a/code/modules/admin/verbs/fps.dm
+++ b/code/modules/admin/verbs/fps.dm
@@ -1,7 +1,7 @@
//Merged Doohl's and the existing ticklag as they both had good elements about them ~
//Replaces the old Ticklag verb, fps is easier to understand
/client/proc/set_server_fps()
- set category = "Debug"
+ set category = "Debug.Server"
set name = "Set Server FPS"
set desc = "Sets game speed in frames-per-second. Can potentially break the game"
diff --git a/code/modules/admin/verbs/get_player_status.dm b/code/modules/admin/verbs/get_player_status.dm
index b55f5483cf7..2e57317ec95 100644
--- a/code/modules/admin/verbs/get_player_status.dm
+++ b/code/modules/admin/verbs/get_player_status.dm
@@ -6,7 +6,7 @@
/client/proc/getPlayerStatus()
set name = "Report Player Status"
set desc = "Get information on all active players in-game."
- set category = "EventKit"
+ set category = "Fun.Event Kit"
if(!check_rights(R_FUN)) return
diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm
index 236fbef7a6b..d7ad8ed13c4 100644
--- a/code/modules/admin/verbs/getlogs.dm
+++ b/code/modules/admin/verbs/getlogs.dm
@@ -81,7 +81,7 @@
//Shows today's server log
/datum/admins/proc/view_txt_log()
- set category = "Admin"
+ set category = "Admin.Logs"
set name = "Show Server Log"
set desc = "Shows today's server log."
@@ -96,7 +96,7 @@
//Shows today's attack log
/datum/admins/proc/view_atk_log()
- set category = "Admin"
+ set category = "Admin.Logs"
set name = "Show Server Attack Log"
set desc = "Shows today's server attack log."
diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm
index 1dcf54b9bf8..1aa8f349f17 100644
--- a/code/modules/admin/verbs/grief_fixers.dm
+++ b/code/modules/admin/verbs/grief_fixers.dm
@@ -1,5 +1,5 @@
/client/proc/fixatmos()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Fix Atmospherics Grief"
if(!check_rights(R_ADMIN|R_DEBUG|R_EVENT)) return
diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm
index ce500bb9d74..57191c32358 100644
--- a/code/modules/admin/verbs/lightning_strike.dm
+++ b/code/modules/admin/verbs/lightning_strike.dm
@@ -1,7 +1,7 @@
/client/proc/admin_lightning_strike()
set name = "Lightning Strike"
set desc = "Causes lightning to strike on your tile. This can be made to hurt things on or nearby it severely."
- set category = "Fun"
+ set category = "Fun.Do Not"
if(!check_rights(R_FUN))
return
diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm
index d49c3ba7398..c9dc93d3ef4 100644
--- a/code/modules/admin/verbs/map_template_loadverb.dm
+++ b/code/modules/admin/verbs/map_template_loadverb.dm
@@ -1,5 +1,5 @@
/client/proc/map_template_load()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Map template - Place At Loc"
var/datum/map_template/template
@@ -32,7 +32,7 @@
usr.client.images -= preview
/client/proc/map_template_load_on_new_z()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Map template - New Z"
var/datum/map_template/template
@@ -55,7 +55,7 @@
/client/proc/map_template_upload()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Map Template - Upload"
var/map = input(usr, "Choose a Map Template to upload to template storage","Upload Map Template") as null|file
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index c51b131b8e2..22be10769d9 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -167,7 +167,7 @@ var/list/debug_verbs = list (
/client/proc/enable_debug_verbs()
- set category = "Debug"
+ set category = "Debug.Misc"
set name = "Debug verbs"
if(!check_rights(R_DEBUG)) return
@@ -177,7 +177,7 @@ var/list/debug_verbs = list (
feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/hide_debug_verbs()
- set category = "Debug"
+ set category = "Debug.Misc"
set name = "Hide Debug verbs"
if(!check_rights(R_DEBUG)) return
@@ -209,7 +209,7 @@ var/list/debug_verbs = list (
/client/proc/testZAScolors()
- set category = "ZAS"
+ set category = "Mapping.ZAS"
set name = "Check ZAS connections"
if(!check_rights(R_DEBUG)) return
@@ -258,7 +258,7 @@ var/list/debug_verbs = list (
testZAScolors_turfs += T
/client/proc/testZAScolors_remove()
- set category = "ZAS"
+ set category = "Mapping.ZAS"
set name = "Remove ZAS connection colors"
testZAScolors_turfs.Cut()
@@ -270,7 +270,7 @@ var/list/debug_verbs = list (
images.Remove(i)
/client/proc/rebootAirMaster()
- set category = "ZAS"
+ set category = "Mapping.ZAS"
set name = "Reboot ZAS"
if(tgui_alert(usr, "This will destroy and remake all zone geometry on the whole map.","Reboot ZAS",list("Reboot ZAS","Nevermind")) == "Reboot ZAS")
diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm
index b1531f88903..2524f1b50ba 100644
--- a/code/modules/admin/verbs/modify_robot.dm
+++ b/code/modules/admin/verbs/modify_robot.dm
@@ -2,7 +2,7 @@
/client/proc/modify_robot(var/mob/living/silicon/robot/target in silicon_mob_list)
set name = "Modify Robot Module"
set desc = "Allows to add or remove modules to/from robots."
- set category = "Admin"
+ set category = "Admin.Silicon"
if(!check_rights(R_ADMIN|R_FUN|R_VAREDIT|R_EVENT))
return
@@ -90,8 +90,8 @@
robot.module.contents.Remove(add_item)
target.module.modules.Add(add_item)
target.module.contents.Add(add_item)
- spawn(0) //ChompEDIT Must be after to allow the movement to finish
- SEND_SIGNAL(add_item, COMSIG_OBSERVER_MOVED)//ChompEDIT - report the movement since setting loc doesn't call Move or Moved
+ spawn(0) Must be after to allow the movement to finish
+ SEND_SIGNAL(add_item, COMSIG_OBSERVER_MOVED)
target.hud_used.update_robot_modules_display()
to_chat(usr, span_danger("You added \"[add_item]\" to [target]."))
if(istype(add_item, /obj/item/stack/))
diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm
index f4fdc3612e1..0e736696b12 100644
--- a/code/modules/admin/verbs/panicbunker.dm
+++ b/code/modules/admin/verbs/panicbunker.dm
@@ -1,5 +1,5 @@
/client/proc/panicbunker()
- set category = "Server"
+ set category = "Server.Config"
set name = "Toggle Panic Bunker"
if(!check_rights(R_ADMIN))
@@ -17,7 +17,7 @@
feedback_add_details("admin_verb","PANIC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/paranoia_logging()
- set category = "Server"
+ set category = "Server.Config"
set name = "New Player Warnings"
if(!check_rights(R_ADMIN))
@@ -31,7 +31,7 @@
feedback_add_details("admin_verb","PARLOG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/ip_reputation()
- set category = "Server"
+ set category = "Server.Config"
set name = "Toggle IP Rep Checks"
if(!check_rights(R_ADMIN))
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index c3b5673442e..4fb01a3b313 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -6,7 +6,7 @@
var/list/sounds_cache = list()
/client/proc/play_sound(S as sound)
- set category = "Fun"
+ set category = "Fun.Sounds"
set name = "Play Global Sound"
if(!check_rights(R_SOUNDS))
return
@@ -50,7 +50,7 @@ var/list/sounds_cache = list()
feedback_add_details("admin_verb", "Play Global Sound")
/client/proc/play_local_sound(S as sound)
- set category = "Fun"
+ set category = "Fun.Sounds"
set name = "Play Local Sound"
if(!check_rights(R_SOUNDS))
return
@@ -61,7 +61,7 @@ var/list/sounds_cache = list()
feedback_add_details("admin_verb", "Play Local Sound")
/client/proc/play_direct_mob_sound(S as sound, mob/M)
- set category = "Fun"
+ set category = "Fun.Sounds"
set name = "Play Direct Mob Sound"
if(!check_rights(R_SOUNDS))
return
@@ -76,7 +76,7 @@ var/list/sounds_cache = list()
feedback_add_details("admin_verb", "Play Direct Mob Sound")
/client/proc/play_z_sound(S as sound)
- set category = "Fun"
+ set category = "Fun.Sounds"
set name = "Play Z Sound"
if(!check_rights(R_SOUNDS)) return
var/target_z = mob.z
@@ -98,7 +98,7 @@ var/list/sounds_cache = list()
/client/proc/play_server_sound()
- set category = "Fun"
+ set category = "Fun.Sounds"
set name = "Play Server Sound"
if(!check_rights(R_SOUNDS))
return
@@ -215,7 +215,7 @@ var/list/sounds_cache = list()
feedback_add_details("admin_verb", "Play Internet Sound")
/client/proc/play_web_sound()
- set category = "Fun"
+ set category = "Fun.Sounds"
set name = "Play Internet Sound"
if(!check_rights(R_SOUNDS))
return
@@ -243,7 +243,7 @@ var/list/sounds_cache = list()
web_sound(usr, null)
/client/proc/stop_sounds()
- set category = "Debug"
+ set category = "Debug.Dangerous"
set name = "Stop All Playing Sounds"
if(!src.holder)
return
@@ -264,8 +264,8 @@ var/list/sounds_cache = list()
#undef SHELLEO_STDERR
/*
-/client/proc/cuban_pete()
- set category = "Fun"
+/client/proc/cuban_pete()"
+ set category = "Fun.Sounds"
set name = "Cuban Pete Time"
message_admins("[key_name_admin(usr)] has declared Cuban Pete Time!", 1)
@@ -280,8 +280,8 @@ var/list/sounds_cache = list()
CP.gib()
-/client/proc/bananaphone()
- set category = "Fun"
+/client/proc/bananaphone()"
+ set category = "Fun.Sounds"
set name = "Banana Phone"
message_admins("[key_name_admin(usr)] has activated Banana Phone!", 1)
@@ -291,8 +291,8 @@ var/list/sounds_cache = list()
M << 'bananaphone.ogg'
-/client/proc/space_asshole()
- set category = "Fun"
+/client/proc/space_asshole()"
+ set category = "Fun.Sounds"
set name = "Space Asshole"
message_admins("[key_name_admin(usr)] has played the Space Asshole Hymn.", 1)
@@ -302,8 +302,8 @@ var/list/sounds_cache = list()
M << 'sound/music/space_asshole.ogg'
-/client/proc/honk_theme()
- set category = "Fun"
+/client/proc/honk_theme()"
+ set category = "Fun.Sounds"
set name = "Honk"
message_admins("[key_name_admin(usr)] has creeped everyone out with Blackest Honks.", 1)
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 9b056896a08..a33d77a4054 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -1,5 +1,5 @@
/mob/verb/pray()
- set category = "IC"
+ set category = "IC.Game"
set name = "Pray"
if(say_disabled) //This is here to try to identify lag problems
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 31da1afe1b1..bc0547c4b5a 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -18,7 +18,7 @@
feedback_add_details("admin_verb","DEVR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_prison(mob/M as mob in mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Prison"
if(!holder)
return
@@ -46,7 +46,7 @@
//Allows staff to determine who the newer players are.
/client/proc/cmd_check_new_players()
- set category = "Admin"
+ set category = "Admin.Investigate"
set name = "Check new Players"
if(!holder)
return
@@ -80,7 +80,7 @@
to_chat(src, "No matches for that age range found.")
/client/proc/cmd_admin_subtle_message(mob/M as mob in mob_list)
- set category = "Special Verbs"
+ set category = "Admin"
set name = "Subtle Message"
if(!ismob(M)) return
@@ -107,7 +107,7 @@
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
- set category = "Special Verbs"
+ set category = "Fun.Narrate"
set name = "Global Narrate"
if (!holder)
@@ -128,7 +128,7 @@
feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE
- set category = "Special Verbs"
+ set category = "Fun.Narrate"
set name = "Direct Narrate"
if(!holder)
@@ -155,7 +155,7 @@
feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_godmode(mob/M as mob in mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Godmode"
if(!holder)
@@ -225,7 +225,7 @@
feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_add_random_ai_law()
- set category = "Fun"
+ set category = "Fun.Silicon"
set name = "Add Random AI Law"
if(!holder)
@@ -276,7 +276,7 @@ Ccomp's first proc.
/client/proc/allow_character_respawn()
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Allow player to respawn"
set desc = "Let a player bypass the wait to respawn or allow them to re-enter their corpse."
@@ -313,7 +313,7 @@ Ccomp's first proc.
/client/proc/toggle_antagHUD_use()
- set category = "Server"
+ set category = "Server.Game"
set name = "Toggle antagHUD usage"
set desc = "Toggles antagHUD usage for observers"
@@ -348,7 +348,7 @@ Ccomp's first proc.
/client/proc/toggle_antagHUD_restrictions()
- set category = "Server"
+ set category = "Server.Game"
set name = "Toggle antagHUD Restrictions"
set desc = "Restricts players that have used antagHUD from being able to join this round."
@@ -381,7 +381,7 @@ Works kind of like entering the game with a new character. Character receives a
Traitors and the like can also be revived with the previous role mostly intact.
/N */
/client/proc/respawn_character()
- set category = "Special Verbs"
+ set category = "Fun.Event Kit"
set name = "Spawn Character"
set desc = "(Re)Spawn a client's loaded character."
@@ -594,7 +594,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return new_character
/client/proc/cmd_admin_add_freeform_ai_law()
- set category = "Fun"
+ set category = "Fun.Silicon"
set name = "Add Custom AI law"
if(!holder)
@@ -623,7 +623,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","IONC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_rejuvenate(mob/living/M as mob in mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Rejuvenate"
if(!holder)
@@ -646,7 +646,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","REJU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_create_centcom_report()
- set category = "Special Verbs"
+ set category = "Fun.Event Kit"
set name = "Create Command Report"
if(!holder)
@@ -674,7 +674,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in _validate_atom(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Delete"
if (!holder)
@@ -683,7 +683,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
admin_delete(O)
/client/proc/cmd_admin_list_open_jobs()
- set category = "Admin"
+ set category = "Admin.Investigate"
set name = "List free slots"
if (!holder)
@@ -695,7 +695,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
- set category = "Special Verbs"
+ set category = "Fun.Do Not"
set name = "Explosion"
if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit
@@ -723,7 +723,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world)
- set category = "Special Verbs"
+ set category = "Fun.Do Not"
set name = "EM Pulse"
if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit
@@ -749,7 +749,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/cmd_admin_gib(mob/M as mob in mob_list)
- set category = "Special Verbs"
+ set category = "Fun.Do Not"
set name = "Gib"
if(!check_rights(R_ADMIN|R_FUN)) return //VOREStation Edit
@@ -771,7 +771,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/cmd_admin_gib_self()
set name = "Gibself"
- set category = "Fun"
+ set category = "Fun.Do Not"
if(!holder)
return
@@ -791,7 +791,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/*
/client/proc/cmd_manual_ban()
set name = "Manual Ban"
- set category = "Special Verbs"
+ set category = "Admin.Moderation"
if(!authenticated || !holder)
to_chat(src, "Only administrators may use this command.")
return
@@ -851,7 +851,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/cmd_admin_check_contents(mob/living/M as mob in mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Investigate"
set name = "Check Contents"
set popup_menu = FALSE //VOREStation Edit - Declutter.
@@ -865,7 +865,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/* This proc is DEFERRED. Does not do anything.
/client/proc/cmd_admin_remove_phoron()
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Stabilize Atmos."
if(!holder)
to_chat(src, "Only administrators may use this command.")
@@ -895,7 +895,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
*/
/client/proc/toggle_view_range()
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Change View Range"
set desc = "switches between 1x and custom views"
@@ -915,7 +915,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","CVRA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_call_shuttle()
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Call Shuttle"
if ((!( ticker ) || !emergency_shuttle.location()))
@@ -947,7 +947,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/admin_cancel_shuttle()
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Cancel Shuttle"
if(!check_rights(R_ADMIN)) return //VOREStation Edit
@@ -965,7 +965,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/admin_deny_shuttle()
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Toggle Deny Shuttle"
if (!ticker)
@@ -979,7 +979,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] has [emergency_shuttle.deny_shuttle ? "denied" : "allowed"] the shuttle to be called.")
/client/proc/cmd_admin_attack_log(mob/M as mob in mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Logs"
set name = "Attack Log"
to_chat(usr, span_red(span_bold("Attack Log for [mob]")))
@@ -989,7 +989,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/everyone_random()
- set category = "Fun"
+ set category = "Fun.Do Not"
set name = "Make Everyone Random"
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
@@ -1023,7 +1023,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/toggle_random_events()
- set category = "Server"
+ set category = "Server.Game"
set name = "Toggle random events on/off"
set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off"
@@ -1041,7 +1041,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/despawn_player(var/mob/M in living_mob_list)
set name = "Cryo Player"
- set category = "Admin"
+ set category = "Admin.Game"
set desc = "Removes a player from the round as if they'd cryo'd."
set popup_menu = FALSE
@@ -1104,7 +1104,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/cmd_admin_droppod_spawn(var/object as text)
set name = "Drop Pod Atom"
set desc = "Spawn a new atom/movable in a drop pod where you are."
- set category = "Fun"
+ set category = "Fun.Drop Pod"
if(!check_rights(R_SPAWN))
return
@@ -1146,7 +1146,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/cmd_admin_droppod_deploy()
set name = "Drop Pod Deploy"
set desc = "Drop an existing mob where you are in a drop pod."
- set category = "Fun"
+ set category = "Fun.Drop Pod"
if(!check_rights(R_SPAWN))
return
diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm
index 8b045ffaf92..8cd3c50604f 100644
--- a/code/modules/admin/verbs/randomverbs_vr.dm
+++ b/code/modules/admin/verbs/randomverbs_vr.dm
@@ -1,5 +1,5 @@
/client/proc/spawn_character_mob()
- set category = "Special Verbs"
+ set category = "Fun.Event Kit"
set name = "Spawn Character As Mob"
set desc = "Spawn a specified ckey as a chosen mob."
@@ -76,7 +76,7 @@
return new_mob
/client/proc/cmd_admin_z_narrate() // Allows administrators to fluff events a little easier -- TLE
- set category = "Special Verbs"
+ set category = "Fun.Narrate"
set name = "Z Narrate"
set desc = "Narrates to your Z level."
@@ -84,6 +84,10 @@
return
var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to everyone:"))
+
+ if (!msg)
+ return
+
if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'.
msg = sanitize(msg)
@@ -101,7 +105,7 @@
feedback_add_details("admin_verb","GLNA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_vantag_hud(var/mob/target as mob)
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Give/Remove Event HUD"
set desc = "Give a mob the event hud, which shows them other people's event preferences, or remove it from them"
diff --git a/code/modules/admin/verbs/resize.dm b/code/modules/admin/verbs/resize.dm
index 85b7943397f..eb4267aee44 100644
--- a/code/modules/admin/verbs/resize.dm
+++ b/code/modules/admin/verbs/resize.dm
@@ -1,7 +1,7 @@
/client/proc/resize(var/mob/living/L in mob_list)
set name = "Resize"
set desc = "Resizes any living mob without any restrictions on size."
- set category = "Fun"
+ set category = "Fun.Event Kit"
if(!check_rights(R_ADMIN|R_FUN|R_VAREDIT))
return
diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm
index 497f8f43ad6..82a9b7996d6 100644
--- a/code/modules/admin/verbs/smite.dm
+++ b/code/modules/admin/verbs/smite.dm
@@ -1,7 +1,7 @@
/client/proc/smite(var/mob/living/carbon/human/target in player_list)
set name = "Smite"
set desc = "Abuse a player with various 'special treatments' from a list."
- set category = "Fun"
+ set category = "Fun.Do Not"
if(!check_rights(R_FUN))
return
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index af7e42c872b..a3eea5b9b64 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -2,7 +2,7 @@
var/const/commandos_possible = 6 //if more Commandos are needed in the future
/client/proc/strike_team()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Spawn Strike Team"
set desc = "Spawns a strike team if you want to run an admin event."
diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm
index b932729d983..2e31e7418b0 100644
--- a/code/modules/admin/verbs/tripAI.dm
+++ b/code/modules/admin/verbs/tripAI.dm
@@ -1,5 +1,5 @@
/client/proc/triple_ai()
- set category = "Fun"
+ set category = "Fun.Event Kit"
set name = "Create AI Triumvirate"
if(ticker.current_state > GAME_STATE_PREGAME)
diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm
index fc2b9189894..e59daf02ef6 100644
--- a/code/modules/admin/view_variables/topic.dm
+++ b/code/modules/admin/view_variables/topic.dm
@@ -129,18 +129,6 @@
href_list["datumrefresh"] = href_list["give_wound_internal"]
-
- else if(href_list["give_disease2"])
- if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return
-
- var/mob/M = locate(href_list["give_disease2"])
- if(!istype(M))
- to_chat(usr, "This can only be used on instances of type /mob")
- return
-
- src.give_disease2(M)
- href_list["datumrefresh"] = href_list["give_spell"]
-
else if(href_list["godmode"])
if(!check_rights(R_REJUVINATE)) return
diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm
index c2af0624d1a..fd15cd54a18 100644
--- a/code/modules/admin/view_variables/view_variables.dm
+++ b/code/modules/admin/view_variables/view_variables.dm
@@ -1,5 +1,5 @@
/client/proc/debug_variables(datum/D in world)
- set category = "Debug"
+ set category = "Debug.Investigate"
set name = "View Variables"
//set src in world
var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round.
diff --git a/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm b/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm
index 4455b47072b..b2d4a896589 100644
--- a/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm
+++ b/code/modules/ai/ai_holder_subtypes/simple_mob_ai.dm
@@ -98,6 +98,23 @@
step_rand(holder)
holder.face_atom(AM)
+// Only attacks you if you're in front of it.
+/datum/ai_holder/simple_mob/ranged/guard_limit
+ guard_limit = TRUE
+ returns_home = TRUE
+
+/datum/ai_holder/simple_mob/ranged/guard_limit/pointblank
+ pointblank = TRUE
+
+/datum/ai_holder/simple_mob/ranged/guard_limit/aggressive
+ pointblank = TRUE
+ var/closest_distance = 1
+
+/datum/ai_holder/simple_mob/ranged/guard_limit/kiting
+ pointblank = TRUE // So we don't need to copypaste post_melee_attack().
+ var/run_if_this_close = 4 // If anything gets within this range, it'll try to move away.
+ var/moonwalk = TRUE // If true, mob turns to face the target while kiting, otherwise they turn in the direction they moved towards.
+
// Switches intents based on specific criteria.
// Used for special mobs who do different things based on intents (and aren't slimes).
// Intent switching is generally done in pre_[ranged/special]_attack(), so that the mob can use the right attack for the right time.
@@ -142,6 +159,14 @@
return TRUE // We're out in the open, uncloaked, and our target isn't stunned, so lets flee.
return FALSE
+// Can only target people in view range, will return home
+/datum/ai_holder/simple_mob/melee/guard_limit
+ guard_limit = TRUE
+ returns_home = TRUE
+
+/datum/ai_holder/simple_mob/melee/evasive/guard_limit
+ guard_limit = TRUE
+ returns_home = TRUE
// Simple mobs that aren't hostile, but will fight back.
/datum/ai_holder/simple_mob/retaliate
@@ -197,3 +222,7 @@
/datum/ai_holder/simple_mob/passive/speedy
base_wander_delay = 1
+
+// For setting up possible stealth missions
+/datum/ai_holder/simple_mob/humanoid/hostile/guard_limit
+ guard_limit = TRUE
diff --git a/code/modules/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm
index b918321f8b3..0525ee59515 100644
--- a/code/modules/ai/ai_holder_targeting.dm
+++ b/code/modules/ai/ai_holder_targeting.dm
@@ -10,6 +10,7 @@
var/micro_hunt = FALSE // Will target mobs at or under the micro_hunt_size size, requires vore_hostile to be true
var/micro_hunt_size = 0.25
var/belly_attack = TRUE //Mobs attack if they are in a belly!
+ var/guard_limit = FALSE //Mobs will not acquire targets unless they are in front of them.
var/atom/movable/target = null // The thing (mob or object) we're trying to kill.
var/atom/movable/preferred_target = null// If set, and if given the chance, we will always prefer to target this over other options.
@@ -49,7 +50,10 @@
. = list()
if(!has_targets_list)
possible_targets = list_targets()
- for(var/possible_target in possible_targets)
+ for(var/atom/possible_target as anything in possible_targets)
+ if(guard_limit)
+ if((holder.dir == 1 && holder.y >= possible_target.y) || (holder.dir == 2 && holder.y <= possible_target.y) || (holder.dir == 4 && holder.x >= possible_target.x) || (holder.dir == 8 && holder.x <= possible_target.x)) //Ignore targets that are behind you
+ continue
if(can_attack(possible_target)) // Can we attack it?
. += possible_target
diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm
index 5971a753c39..bdc062e0664 100644
--- a/code/modules/asset_cache/asset_list.dm
+++ b/code/modules/asset_cache/asset_list.dm
@@ -1,4 +1,4 @@
-#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "tmp/assets"
+#define ASSET_CROSS_ROUND_CACHE_DIRECTORY "cache/assets"
//These datums are used to populate the asset cache, the proc "register()" does this.
//Place any asset datums you create in asset_list_items.dm
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 155950ae431..5b9adc2330b 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -106,6 +106,11 @@
var/last_asset_job = 0
var/last_completed_asset_job = 0
+ ///Last ping of the client
+ var/lastping = 0
+ ///Average ping of the client
+ var/avgping = 0
+
///world.time they connected
var/connection_time
///world.realtime they connected
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index d4eff6fd9a1..86dffce176b 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -164,6 +164,10 @@
//CONNECT//
///////////
/client/New(TopicData)
+ // TODO: Remove version check with 516
+ if(byond_version >= 516) // Enable 516 compat browser storage mechanisms
+ winset(src, null, "browser-options=[DEFAULT_CLIENT_BROWSER_OPTIONS]")
+
TopicData = null //Prevent calls to client.Topic from connect
if(!(connection in list("seeker", "web"))) //Invalid connection type.
@@ -295,6 +299,12 @@
fully_created = TRUE
attempt_auto_fit_viewport()
+ // TODO: Remove version check with 516
+ if(byond_version >= 516)
+ // Now that we're fully initialized, use our prefs
+ if(prefs?.read_preference(/datum/preference/toggle/browser_dev_tools))
+ winset(src, null, "browser-options=[DEFAULT_CLIENT_BROWSER_OPTIONS],devtools")
+
//////////////
//DISCONNECT//
//////////////
@@ -502,13 +512,13 @@
/client/verb/character_setup()
set name = "Character Setup"
- set category = "Preferences"
+ set category = "Preferences.Character"
if(prefs)
prefs.ShowChoices(usr)
/client/verb/game_options()
set name = "Game Options"
- set category = "Preferences"
+ set category = "Preferences.Game"
if(prefs)
prefs.tgui_interact(usr)
@@ -610,7 +620,7 @@
/client/verb/toggle_fullscreen()
set name = "Toggle Fullscreen"
- set category = "OOC"
+ set category = "OOC.Client Settings"
fullscreen = !fullscreen
@@ -631,7 +641,7 @@
/client/verb/toggle_verb_panel()
set name = "Toggle Verbs"
- set category = "OOC"
+ set category = "OOC.Client Settings"
show_verb_panel = !show_verb_panel
@@ -640,7 +650,7 @@
/*
/client/verb/toggle_status_bar()
set name = "Toggle Status Bar"
- set category = "OOC"
+ set category = "OOC.Client Settings"
show_status_bar = !show_status_bar
@@ -652,7 +662,7 @@
/client/verb/show_active_playtime()
set name = "Active Playtime"
- set category = "IC"
+ set category = "OOC.Game"
if(!play_hours.len)
to_chat(src, span_warning("Persistent playtime disabled!"))
diff --git a/code/modules/client/movement.dm b/code/modules/client/movement.dm
index efcf51c02ee..c04cf26c30c 100644
--- a/code/modules/client/movement.dm
+++ b/code/modules/client/movement.dm
@@ -5,11 +5,10 @@
/client/verb/spinleft()
set name = "Spin View CCW"
- set category = "OOC"
+ set category = "OOC.Game"
dir = turn(dir, 90)
/client/verb/spinright()
set name = "Spin View CW"
- set category = "OOC"
+ set category = "OOC.Game"
dir = turn(dir, -90)
-
diff --git a/code/modules/client/preference_setup/volume_sliders/01_volume.dm b/code/modules/client/preference_setup/volume_sliders/01_volume.dm
index 46a38bbb92a..219a4750cb2 100644
--- a/code/modules/client/preference_setup/volume_sliders/01_volume.dm
+++ b/code/modules/client/preference_setup/volume_sliders/01_volume.dm
@@ -97,7 +97,7 @@
/client/verb/volume_panel()
set name = "Volume Panel"
- set category = "Preferences"
+ set category = "Preferences.Sounds"
set desc = "Allows you to adjust volume levels on the fly."
if(!volume_panel)
diff --git a/code/modules/client/preferences/types/misc.dm b/code/modules/client/preferences/types/misc.dm
index 54a85477e30..3efea588934 100644
--- a/code/modules/client/preferences/types/misc.dm
+++ b/code/modules/client/preferences/types/misc.dm
@@ -81,3 +81,15 @@
savefile_key = "AutoPunctuation"
default_value = FALSE
savefile_identifier = PREFERENCE_PLAYER
+
+/datum/preference/toggle/browser_dev_tools
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_key = "BrowserDevTools"
+ default_value = FALSE
+ savefile_identifier = PREFERENCE_PLAYER
+
+/datum/preference/toggle/browser_dev_tools/apply_to_client(client/client, value)
+ if(value)
+ winset(client, null, "browser-options=[DEFAULT_CLIENT_BROWSER_OPTIONS],devtools")
+ else
+ winset(client, null, "browser-options=[DEFAULT_CLIENT_BROWSER_OPTIONS]")
diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm
index 73a3c1045de..fbd61f46eab 100644
--- a/code/modules/client/preferences_toggle_procs.dm
+++ b/code/modules/client/preferences_toggle_procs.dm
@@ -1,7 +1,7 @@
//Toggles for preferences, normal clients
/client/verb/toggle_be_special(role in be_special_flags)
set name = "Toggle Special Role Candidacy"
- set category = "Preferences"
+ set category = "Preferences.Character"
set desc = "Toggles which special roles you would like to be a candidate for, during events."
var/role_flag = be_special_flags[role]
@@ -16,7 +16,7 @@
/client/verb/toggle_chat_timestamps()
set name = "Toggle Chat Timestamps"
- set category = "Preferences"
+ set category = "Preferences.Chat"
set desc = "Toggles whether or not messages in chat will display timestamps. Enabling this will not add timestamps to messages that have already been sent."
prefs.chat_timestamp = !prefs.chat_timestamp //There is no preference datum for tgui input lock, nor for any TGUI prefs.
@@ -27,7 +27,7 @@
// Not attached to a pref datum because those are strict binary toggles
/client/verb/toggle_examine_mode()
set name = "Toggle Examine Mode"
- set category = "Preferences"
+ set category = "Preferences.Game"
set desc = "Toggle the additional behaviour of examining things."
prefs.examine_text_mode++
@@ -44,7 +44,7 @@
/client/verb/toggle_multilingual_mode()
set name = "Toggle Multilingual Mode"
- set category = "Preferences"
+ set category = "Preferences.Character"
set desc = "Toggle the behaviour of multilingual speech parsing."
prefs.multilingual_mode++
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index 9ee5ed0b24a..8453d0f16a3 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -16,7 +16,7 @@
//Why weren't these in game toggles already?
/client/verb/toggle_capture_crystal()
set name = "Toggle Catchable"
- set category = "Preferences"
+ set category = "Preferences.Character"
set desc = "Toggles being catchable with capture crystals."
var/mob/living/L = mob
diff --git a/code/modules/client/ui_style.dm b/code/modules/client/ui_style.dm
index 653242dabcb..9cd68b86068 100644
--- a/code/modules/client/ui_style.dm
+++ b/code/modules/client/ui_style.dm
@@ -37,7 +37,7 @@ var/global/list/all_tooltip_styles = list(
/client/verb/change_ui()
set name = "Change UI"
- set category = "Preferences"
+ set category = "Preferences.Game"
set desc = "Configure your user interface"
if(!ishuman(usr))
diff --git a/code/modules/client/verbs/advanced_who.dm b/code/modules/client/verbs/advanced_who.dm
index a8acf146ce2..4c4af542a48 100644
--- a/code/modules/client/verbs/advanced_who.dm
+++ b/code/modules/client/verbs/advanced_who.dm
@@ -1,7 +1,7 @@
/client/verb/who_advanced()
set name = "Advanced Who"
- set category = "OOC"
+ set category = "OOC.Resources"
var/msg = span_bold("Current Players:") + "\n"
diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm
index 8155adab8df..c35b2954696 100644
--- a/code/modules/client/verbs/character_directory.dm
+++ b/code/modules/client/verbs/character_directory.dm
@@ -2,7 +2,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
/client/verb/show_character_directory()
set name = "Character Directory"
- set category = "OOC"
+ set category = "OOC.Game"
set desc = "Shows a listing of all active characters, along with their associated OOC notes, flavor text, and more."
// This is primarily to stop malicious users from trying to lag the server by spamming this verb
diff --git a/code/modules/client/verbs/ignore.dm b/code/modules/client/verbs/ignore.dm
index 1e5237d3b1f..9981348f2b1 100644
--- a/code/modules/client/verbs/ignore.dm
+++ b/code/modules/client/verbs/ignore.dm
@@ -1,6 +1,6 @@
/client/verb/ignore(key_to_ignore as text)
set name = "Ignore"
- set category = "OOC"
+ set category = "OOC.Chat Settings"
set desc = "Makes OOC and Deadchat messages from a specific player not appear to you."
if(!key_to_ignore)
@@ -20,7 +20,7 @@
/client/verb/unignore()
set name = "Unignore"
- set category = "OOC"
+ set category = "OOC.Chat Settings"
set desc = "Reverts your ignoring of a specific player."
if(!prefs)
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index 5e6d1b5f5da..63d7793ce86 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -1,7 +1,7 @@
/client/verb/ooc(msg as text)
set name = "OOC"
- set category = "OOC"
+ set category = "OOC.Chat"
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, span_warning("Speech is currently admin-disabled."))
@@ -84,7 +84,7 @@
/client/verb/looc(msg as text)
set name = "LOOC"
set desc = "Local OOC, seen only by those in view."
- set category = "OOC"
+ set category = "OOC.Chat"
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, span_danger("Speech is currently admin-disabled."))
@@ -198,7 +198,7 @@
/client/verb/fit_viewport()
set name = "Fit Viewport"
- set category = "OOC"
+ set category = "OOC.Client Settings"
set desc = "Fit the width of the map window to match the viewport"
// Fetch aspect ratio
diff --git a/code/modules/client/verbs/ping.dm b/code/modules/client/verbs/ping.dm
index 706edc02f64..32c8f8244e5 100644
--- a/code/modules/client/verbs/ping.dm
+++ b/code/modules/client/verbs/ping.dm
@@ -1,5 +1,16 @@
+
+/client/verb/update_ping(time as num)
+ set instant = TRUE
+ set name = ".update_ping"
+ var/ping = pingfromtime(time)
+ lastping = ping
+ if (!avgping)
+ avgping = ping
+ else
+ avgping = MC_AVERAGE_SLOW(avgping, ping)
+
/client/proc/pingfromtime(time)
- return ((world.time+world.tick_lag*world.tick_usage/100)-time)*100
+ return ((world.time+world.tick_lag*TICK_USAGE_REAL/100)-time)*100
/client/verb/display_ping(time as num)
set instant = TRUE
@@ -8,5 +19,5 @@
/client/verb/ping()
set name = "Ping"
- set category = "OOC"
- winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]")
+ set category = "OOC.Debug"
+ winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]")
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 050d663787c..21eb9a135d4 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -80,7 +80,7 @@
/*
/mob/living/silicon/pai/verb/suicide()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
set name = "pAI Suicide"
var/answer = tgui_alert(usr, "REALLY kill yourself? This action can't be undone.", "Suicide", list("Yes","No"))
diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm
index a2b789af6ac..942ecd5e52d 100644
--- a/code/modules/client/verbs/who.dm
+++ b/code/modules/client/verbs/who.dm
@@ -1,6 +1,6 @@
/client/verb/who()
set name = "Who"
- set category = "OOC"
+ set category = "OOC.Resources"
var/msg = span_bold("Current Players:") + "\n"
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 125b70ac82e..a69ddf2ab0e 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -465,7 +465,6 @@
var/light_overlay = "helmet_light"
var/image/helmet_light
- var/overhead = 0 //Used by spacesuit helmets
sprite_sheets = list(
SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi',
@@ -636,7 +635,7 @@
/obj/item/clothing/shoes/proc/draw_knife()
set name = "Draw Boot Knife"
set desc = "Pull out your boot knife."
- set category = "IC"
+ set category = "IC.Game"
set src in usr
if(usr.stat || usr.restrained() || usr.incapacitated())
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 7af35979289..4106d577af7 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -16,7 +16,6 @@
ear_protection = 1
drop_sound = 'sound/items/drop/helm.ogg'
pickup_sound = 'sound/items/pickup/helm.ogg'
- overhead = TRUE
/obj/item/clothing/head/helmet/solgov
name = "\improper Solar Confederate Government helmet"
diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm
index 9e25521dd90..5efb8fb6d51 100644
--- a/code/modules/clothing/masks/monitor.dm
+++ b/code/modules/clothing/masks/monitor.dm
@@ -47,7 +47,7 @@
/obj/item/clothing/mask/monitor/verb/set_monitor_state()
set name = "Set Monitor State"
set desc = "Choose an icon for your monitor."
- set category = "IC"
+ set category = "IC.Game"
set src in usr
var/mob/living/carbon/human/H = loc
diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm
index 0a434e3b65c..b70ddc6a571 100644
--- a/code/modules/clothing/spacesuits/spacesuits.dm
+++ b/code/modules/clothing/spacesuits/spacesuits.dm
@@ -31,44 +31,6 @@
light_overlay = "helmet_light"
light_range = 4
- overhead = TRUE // prevents stacking helmets indefinitely
- var/obj/item/clothing/head/stored_under_head = null // under head
- var/mob/living/carbon/human/wearer = null // Used to restore our under when we're dropped
-
-/obj/item/clothing/head/helmet/space/mob_can_equip(mob/user, slot, disable_warning = FALSE)
- var/mob/living/carbon/human/H = user
- if(H.head)
- stored_under_head = H.head
- if(!istype(stored_under_head))
- to_chat(user, "You are unable to wear \the [src] as \the [H.head] is in the way.")
- stored_under_head = null
- return 0
- if(stored_under_head.overhead)
- to_chat(user, "You are unable to wear \the [src] as \the [H.head] is in the way.")
- stored_under_head = null
- return 0
- H.drop_from_inventory(stored_under_head)
- stored_under_head.forceMove(src)
-
- if(!..())
- if(stored_under_head)
- if(H.equip_to_slot_if_possible(stored_under_head, slot_head))
- stored_under_head = null
- return 0
- if(stored_under_head)
- to_chat(user, "You slip \the [src] on over \the [stored_under_head].")
- wearer = H
- return 1
-
-/obj/item/clothing/head/helmet/space/dropped()
- ..()
- var/mob/living/carbon/human/H = wearer
- if(stored_under_head)
- if(!H.equip_to_slot_if_possible(stored_under_head, slot_head))
- stored_under_head.forceMove(get_turf(src))
- src.stored_under_head = null
- wearer = null
-
/obj/item/clothing/head/helmet/space/Initialize()
. = ..()
if(camera_networks)
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index ce32a5cddb3..a8c4c0f53d7 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -91,11 +91,11 @@
boots.canremove = FALSE
if(helmet)
- if(H.equip_to_slot_if_possible(helmet, slot_head))
+ if(H.head)
+ to_chat(M, "You are unable to deploy your suit's helmet as \the [H.head] is in the way.")
+ else if (H.equip_to_slot_if_possible(helmet, slot_head))
to_chat(M, "Your suit's helmet deploys with a hiss.")
helmet.canremove = FALSE
- else
- to_chat(M, "You are unable to deploy your suit's helmet[H.head ? " because [H.head] is in the way." : ""].")
if(tank)
if(H.s_store) //In case someone finds a way.
@@ -190,12 +190,13 @@
helmet.forceMove(src)
playsound(src.loc, 'sound/machines/click2.ogg', 75, 1)
else
+ if(H.head)
+ to_chat(H, span_danger("You cannot deploy your helmet while wearing \the [H.head]."))
+ return
if(H.equip_to_slot_if_possible(helmet, slot_head))
helmet.canremove = FALSE
to_chat(H, span_info("You deploy your suit helmet, sealing you off from the world."))
playsound(src.loc, 'sound/machines/click2.ogg', 75, 1)
- else
- to_chat(H, span_danger("You cannot deploy your helmet[H.head ? " while wearing \the [H.head]." : ""]"))
/obj/item/clothing/suit/space/void/AltClick(mob/living/user)
eject_tank()
diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm
index 28afb25655a..29aca9fe31a 100644
--- a/code/modules/detectivework/tools/uvlight.dm
+++ b/code/modules/detectivework/tools/uvlight.dm
@@ -1,6 +1,7 @@
/obj/item/uv_light
name = "\improper UV light"
desc = "A small handheld black light."
+ icon = 'icons/obj/device.dmi'
icon_state = "uv_off"
slot_flags = SLOT_BELT
w_class = ITEMSIZE_SMALL
diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm
index d6a58e71665..800c386d9d1 100644
--- a/code/modules/economy/vending_machines_vr.dm
+++ b/code/modules/economy/vending_machines_vr.dm
@@ -1,40 +1,40 @@
//Tweaked existing vendors
-/obj/machinery/vending/hydroseeds/New()
+/obj/machinery/vending/hydroseeds/Initialize()
+ . = ..()
products += list(/obj/item/seeds/shrinkshroom = 3,/obj/item/seeds/megashroom = 3)
- ..()
-/obj/machinery/vending/security/New()
+/obj/machinery/vending/security/Initialize()
+ . = ..()
products += list(/obj/item/gun/energy/taser = 8,/obj/item/gun/energy/stunrevolver = 4,
/obj/item/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6,
/obj/item/clothing/glasses/omnihud/sec = 6)
contraband += list(/obj/item/implanter/compliance = 1)
- ..()
-/obj/machinery/vending/tool/New()
+/obj/machinery/vending/tool/Initialize()
+ . = ..()
products += list(/obj/item/reagent_containers/spray/windowsealant = 5)
- ..()
-/obj/machinery/vending/engivend/New()
+/obj/machinery/vending/engivend/Initialize()
+ . = ..()
products += list(/obj/item/clothing/glasses/omnihud/eng = 6)
contraband += list(/obj/item/rms = 5)
- ..()
-/obj/machinery/vending/medical/New()
+/obj/machinery/vending/medical/Initialize()
+ . = ..()
products += list(/obj/item/storage/box/khcrystal = 4,/obj/item/backup_implanter = 3,
/obj/item/clothing/glasses/omnihud/med = 4, /obj/item/glasses_kit = 1, /obj/item/storage/quickdraw/syringe_case = 4)
- ..()
-/obj/machinery/vending/wallmed1/New()
+/obj/machinery/vending/wallmed1/Initialize()
+ . = ..()
products += list(/obj/item/bodybag/cryobag = 2)
- ..()
-/obj/machinery/vending/wallmed2/New()
+/obj/machinery/vending/wallmed2/Initialize()
+ . = ..()
products += list(/obj/item/bodybag/cryobag = 3)
- ..()
-/obj/machinery/vending/wallmed1/public/New()
+/obj/machinery/vending/wallmed1/public/Initialize()
+ . = ..()
products += list(/obj/item/bodybag/cryobag = 4)
- ..()
// Food Machines (for event/away maps)
diff --git a/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm b/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm
index accd006fe18..b54ec0a7804 100644
--- a/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm
+++ b/code/modules/eventkit/gm_interfaces/fake_pda_conversations.dm
@@ -5,7 +5,7 @@
/client/proc/fake_pdaconvos()
- set category = "EventKit"
+ set category = "Fun.Event Kit"
set name = "Manage PDA identities"
set desc = "Creates fake identities for use in setting up PDA props"
diff --git a/code/modules/eventkit/gm_interfaces/mob_spawner.dm b/code/modules/eventkit/gm_interfaces/mob_spawner.dm
index 8e6cc6e8c78..85adcecc3fd 100644
--- a/code/modules/eventkit/gm_interfaces/mob_spawner.dm
+++ b/code/modules/eventkit/gm_interfaces/mob_spawner.dm
@@ -193,7 +193,7 @@
qdel(src)
/client/proc/eventkit_open_mob_spawner()
- set category = "EventKit"
+ set category = "Fun.Event Kit"
set name = "Open Mob Spawner"
set desc = "Opens an advanced version of the mob spawner."
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
new file mode 100644
index 00000000000..25e1ea5c4f1
--- /dev/null
+++ b/code/modules/events/disease_outbreak.dm
@@ -0,0 +1,98 @@
+GLOBAL_LIST_EMPTY(current_pending_diseases)
+/datum/event/disease_outbreak
+ var/datum/disease/chosen_disease
+ var/list/disease_blacklist = list(
+ /datum/disease/advance,
+ /datum/disease/food_poisoning
+ )
+ var/static/list/transmissable_symptoms = list()
+ var/static/list/diseases_minor = list()
+ var/static/list/diseases_moderate_major = list()
+
+/datum/event/disease_outbreak/setup()
+ if(isemptylist(diseases_minor) && isemptylist(diseases_moderate_major))
+ populate_diseases()
+ if(isemptylist(transmissable_symptoms))
+ populate_symptoms()
+ var/datum/disease/virus
+ if(prob(50))
+ switch(severity)
+ if(EVENT_LEVEL_MODERATE)
+ virus = pick(diseases_minor)
+ if(EVENT_LEVEL_MAJOR)
+ virus = pick(diseases_moderate_major)
+ else
+ stack_trace("Disease Outbreak: Invalid Event Level [severity]. Expected: 1-2")
+ virus = /datum/disease/cold
+ chosen_disease = new virus()
+ else
+ if(severity == EVENT_LEVEL_MAJOR)
+ chosen_disease = create_virus(severity * pick(2,3)) //50% chance for a major disease instead of a moderate one
+ else
+ chosen_disease = create_virus(severity * 2)
+
+ chosen_disease.carrier = TRUE
+
+/datum/event/disease_outbreak/start()
+ GLOB.current_pending_diseases += chosen_disease
+
+ var/list/candidates = list()
+ for(var/mob/living/carbon/human/G in player_list)
+ if(G.mind && G.stat != DEAD && G.is_client_active(5) && !player_is_antag(G.mind))
+ var/area/A = get_area(G)
+ if(!A)
+ continue
+ if(!(A.z in using_map.station_levels))
+ continue
+ if(A.flags & RAD_SHIELDED)
+ continue
+ if(isbelly(G.loc))
+ continue
+ if(!G.CanContractDisease())
+ continue
+ candidates += G
+
+ var/chosen_infect = rand(3, 5)
+
+ while(chosen_infect)
+ var/mob/living/carbon/human/H = pick(candidates)
+ H.ContractDisease(chosen_disease)
+ candidates -= H
+
+
+//Creates a virus with a harmful effect, guaranteed to be spreadable by contact or airborne
+/datum/event/disease_outbreak/proc/create_virus(max_severity = 6)
+ var/datum/disease/advance/A = new /datum/disease/advance
+ A.symptoms = A.GenerateSymptomsBySeverity(max_severity - 1, max_severity, 2) //Choose "Payload" symptoms
+ A.AssignProperties(A.GenerateProperties())
+ var/list/symptoms_to_try = transmissable_symptoms.Copy()
+ while(length(symptoms_to_try))
+ if(A.spread_text != "Blood")
+ break
+ if(length(A.symptoms) < VIRUS_SYMPTOM_LIMIT) //Ensure the virus is spreadable by adding symptoms that boost transmission
+ var/datum/symptom/TS = pick_n_take(symptoms_to_try)
+ A.AddSymptom(new TS)
+ else
+ popleft(A.symptoms) //We have a full symptom list but are still not transmittable. Try removing one of the "payloads"
+
+ A.AssignProperties(A.GenerateProperties())
+ A.name = pick(alphabet_uppercase) + num2text(rand(1,9)) + pick(alphabet_uppercase) + num2text(rand(1,9)) + pick("v", "V", "-" + num2text(game_year), "")
+ A.Refresh()
+ return A
+
+/datum/event/disease_outbreak/proc/populate_diseases()
+ for(var/candidate in subtypesof(/datum/disease))
+ var/datum/disease/CD = new candidate
+ if(is_type_in_list(CD, disease_blacklist))
+ continue
+ switch(CD.severity)
+ if(NONTHREAT, MINOR)
+ diseases_minor += candidate
+ if(MEDIUM, HARMFUL, DANGEROUS, BIOHAZARD)
+ diseases_moderate_major += candidate
+
+/datum/event/disease_outbreak/proc/populate_symptoms()
+ for(var/candidate in subtypesof(/datum/symptom))
+ var/datum/symptom/CS = candidate
+ if(initial(CS.transmittable) > 1)
+ transmissable_symptoms += candidate
diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm
index cc0972f2082..6416a583a02 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/modules/events/event_manager.dm
@@ -224,7 +224,7 @@
/client/proc/forceEvent(var/type in SSevents.allEvents)
set name = "Trigger Event (Debug Only)"
- set category = "Debug"
+ set category = "Debug.Dangerous"
if(!holder)
return
@@ -235,6 +235,6 @@
/client/proc/event_manager_panel()
set name = "Event Manager Panel"
- set category = "Admin"
+ set category = "Admin.Events"
SSevents.Interact(usr)
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm
index 16f1b305aba..92cefa1ce10 100644
--- a/code/modules/examine/examine.dm
+++ b/code/modules/examine/examine.dm
@@ -63,7 +63,7 @@
//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine()
/mob/verb/examinate(atom/A as mob|obj|turf in _validate_atom(A))
set name = "Examine"
- set category = "IC"
+ set category = "IC.Game"
if((is_blind(src) || usr.stat) && !isobserver(src))
to_chat(src, span_notice("Something is there but you can't see it."))
@@ -93,7 +93,7 @@
/mob/verb/mob_examine()
set name = "Mob Examine"
set desc = "Allows one to examine mobs they can see, even from inside of bellies and objects."
- set category = "IC"
+ set category = "IC.Game"
set popup_menu = FALSE
if((is_blind(src) || src.stat) && !isobserver(src))
diff --git a/code/modules/flufftext/look_up.dm b/code/modules/flufftext/look_up.dm
index 1bfcf6898c9..01d0cd69c98 100644
--- a/code/modules/flufftext/look_up.dm
+++ b/code/modules/flufftext/look_up.dm
@@ -2,7 +2,7 @@
/mob/living/verb/look_up()
set name = "Look Up"
- set category = "IC"
+ set category = "IC.Game"
set desc = "Look above you, and hope there's no ceiling spiders."
to_chat(usr, "You look upwards...")
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 96c14683b05..08d40416daf 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -6892,6 +6892,7 @@
"zombiepowder",
"cryptobiolin",
"psilocybin")), 5)
+ reagents.add_reagent("salmonella", 5)
/obj/item/reagent_containers/food/snacks/old/pizza
name = "\improper Pizza!"
diff --git a/code/modules/food/kitchen/smartfridge/medical.dm b/code/modules/food/kitchen/smartfridge/medical.dm
index 0e7f17663f0..1f9091bd366 100644
--- a/code/modules/food/kitchen/smartfridge/medical.dm
+++ b/code/modules/food/kitchen/smartfridge/medical.dm
@@ -31,9 +31,7 @@
icon_contents = "viro"
/obj/machinery/smartfridge/virology/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/reagent_containers/glass/beaker/vial/))
- return 1
- if(istype(O,/obj/item/virusdish/))
+ if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers) || istype(O,/obj/item/reagent_containers/glass/))
return 1
return 0
@@ -44,9 +42,7 @@
req_access = list(access_virology)
/obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/reagent_containers/glass/beaker/vial/))
- return 1
- if(istype(O,/obj/item/virusdish/))
+ if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers) || istype(O,/obj/item/reagent_containers/glass/))
return 1
return 0
diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm
index 8e1ac105712..21733d96b62 100644
--- a/code/modules/food/recipe_dump.dm
+++ b/code/modules/food/recipe_dump.dm
@@ -1,6 +1,6 @@
/client/proc/recipe_dump()
set name = "Generate Recipe Dump"
- set category = "Server"
+ set category = "Server.Admin"
set desc = "Dumps food and drink recipe info and images for wiki or other use."
if(!holder)
diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm
index 9d5ea0cc5e9..90af4ee63f4 100644
--- a/code/modules/food/recipes_microwave.dm
+++ b/code/modules/food/recipes_microwave.dm
@@ -508,14 +508,6 @@ I said no!
)
result = /obj/item/reagent_containers/food/snacks/icecreamsandwich
-// Fuck Science!
-/datum/recipe/ruinedvirusdish
- items = list(
- /obj/item/virusdish
- )
- result = /obj/item/ruinedvirusdish
-
-
/datum/recipe/onionsoup
fruit = list("onion" = 1)
reagents = list("water" = 10)
diff --git a/code/modules/gamemaster/event2/events/medical/virus.dm b/code/modules/gamemaster/event2/events/medical/virus.dm
deleted file mode 100644
index ad221c0d043..00000000000
--- a/code/modules/gamemaster/event2/events/medical/virus.dm
+++ /dev/null
@@ -1,69 +0,0 @@
-/datum/event2/meta/virus
- name = "viral infection"
- event_class = "virus"
- departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_EVERYONE)
- chaos = 40
- chaotic_threshold = EVENT_CHAOS_THRESHOLD_HIGH_IMPACT
- event_type = /datum/event2/event/virus
-
-/datum/event2/meta/virus/superbug
- name = "viral superbug"
- chaos = 60
- event_type = /datum/event2/event/virus/superbug
-
-/datum/event2/meta/virus/outbreak
- name = "viral outbreak"
- chaos = 60
- event_type = /datum/event2/event/virus/outbreak
-
-/datum/event2/meta/virus/get_weight()
- var/list/virologists = metric.get_people_with_alt_title(/datum/job/doctor, /datum/alt_title/virologist)
- virologists += metric.get_people_with_job(/datum/job/cmo)
-
- return virologists.len * 25
-
-
-
-/datum/event2/event/virus
- announce_delay_lower_bound = 1 MINUTE
- announce_delay_upper_bound = 3 MINUTES
- var/number_of_viruses = 1
- var/virus_power = 2 // Ranges from 1 to 3, with 1 being the weakest.
- var/list/candidates = list()
-
-// A single powerful virus.
-/datum/event2/event/virus/superbug
- virus_power = 3
-
-// A lot of weaker viruses.
-/datum/event2/event/virus/outbreak
- virus_power = 1
- number_of_viruses = 3
-
-
-
-/datum/event2/event/virus/set_up()
- for(var/mob/living/carbon/human/H in player_list)
- if(H.client && !H.isSynthetic() && H.stat != DEAD && !player_is_antag(H.mind) && !isbelly(H.loc))
- candidates += H
- candidates = shuffle(candidates)
-
-/datum/event2/event/virus/announce()
- command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard \the [location_name()]. \
- All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
-
-/datum/event2/event/virus/start()
- if(!candidates.len)
- log_debug("Virus event could not find any valid targets to infect. Aborting.")
- abort()
- return
-
- for(var/i = 1 to number_of_viruses)
- var/mob/living/carbon/human/H = LAZYACCESS(candidates, 1)
- if(!H)
- return
- var/datum/disease2/disease/D = new()
- D.makerandom(virus_power)
- log_debug("Virus event is now infecting \the [H] with a new random virus.")
- infect_mob(H, D)
- candidates -= H
diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm
index f9a24ac630b..e23866e8e9f 100644
--- a/code/modules/media/mediamanager.dm
+++ b/code/modules/media/mediamanager.dm
@@ -54,7 +54,7 @@
/client/verb/change_volume()
set name = "Set Volume"
- set category = "OOC"
+ set category = "OOC.Client Settings"
set desc = "Set jukebox volume"
set_new_volume(usr)
diff --git a/code/modules/mentor/mentor.dm b/code/modules/mentor/mentor.dm
index 370d80a3443..c6524130aa0 100644
--- a/code/modules/mentor/mentor.dm
+++ b/code/modules/mentor/mentor.dm
@@ -43,7 +43,7 @@ var/list/mentor_verbs_default = list(
remove_verb(src, mentor_verbs_default)
/client/proc/make_mentor()
- set category = "Special Verbs"
+ set category = "Admin.Secrets"
set name = "Make Mentor"
if(!holder)
to_chat(src, span_admin_pm_warning("Error: Only administrators may use this command."))
@@ -66,7 +66,7 @@ var/list/mentor_verbs_default = list(
feedback_add_details("admin_verb","Make Mentor") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/unmake_mentor()
- set category = "Special Verbs"
+ set category = "Admin.Secrets"
set name = "Unmake Mentor"
if(!holder)
to_chat(src, span_admin_pm_warning("Error: Only administrators may use this command."))
@@ -85,7 +85,7 @@ var/list/mentor_verbs_default = list(
feedback_add_details("admin_verb","Unmake Mentor") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_mentor_say(msg as text)
- set category = "Admin"
+ set category = "Admin.Chat"
set name ="Mentorsay"
//check rights
@@ -126,7 +126,7 @@ var/list/mentor_verbs_default = list(
mentor_commands(href, href_list, usr)
/client/proc/cmd_dementor()
- set category = "Admin"
+ set category = "Admin.Misc"
set name = "De-mentor"
if(tgui_alert(usr, "Confirm self-dementor for the round? You can't re-mentor yourself without someone promoting you.","Dementor",list("Yes","No")) == "Yes")
@@ -167,12 +167,15 @@ var/list/mentor_verbs_default = list(
set name = "Request help"
set hidden = 1
- var/mhelp = tgui_alert(usr, "Select the help you need.","Request for Help",list("Adminhelp","Mentorhelp")) == "Mentorhelp"
+ var/mhelp = tgui_alert(usr, "Select the help you need.","Request for Help",list("Adminhelp","Mentorhelp"))
if(!mhelp)
return
- var/msg = tgui_input_text(usr, "Input your request for help.", "Request for Help", multiline = TRUE)
- if (mhelp)
+ var/msg = tgui_input_text(usr, "Input your request for help.", "Request for Help ([mhelp])", multiline = TRUE)
+ if(!msg)
+ return
+
+ if (mhelp == "Mentorhelp")
mentorhelp(msg)
return
diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm
index cbf457083ad..d801effd6eb 100644
--- a/code/modules/mentor/mentorhelp.dm
+++ b/code/modules/mentor/mentorhelp.dm
@@ -480,7 +480,7 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new)
//admin proc
/client/proc/cmd_mentor_ticket_panel()
set name = "Mentor Ticket List"
- set category = "Admin"
+ set category = "Admin.Misc"
var/browse_to
diff --git a/code/modules/mining/abandonedcrates_vr.dm b/code/modules/mining/abandonedcrates_vr.dm
index e57c911f408..a443839f9b5 100644
--- a/code/modules/mining/abandonedcrates_vr.dm
+++ b/code/modules/mining/abandonedcrates_vr.dm
@@ -30,6 +30,7 @@
list(/obj/item/melee/classic_baton, 6) = 3,
list(/obj/item/rig/industrial, 6) = 3,
list(/obj/item/multitool/hacktool, 5) = 3,
+ list(/obj/item/multitool/hacktool/modified, 4) = 4,
list(/obj/item/toy/katana, 1) = 2,
list(/obj/item/clothing/head/kitty, 1) = 2,
list(pick(subtypesof(/obj/item/soap)), 1) = 2,
@@ -41,7 +42,7 @@
list(/obj/item/toy/syndicateballoon, 3) = 2,
list(/obj/item/clothing/suit/ianshirt, 3) = 2,
list(/obj/item/clothing/head/bearpelt, 4) = 2,
- //list(/obj/item/archaeological_find, 3) = 2, //ChompREMOVE - causes runtimes
+ //list(/obj/item/archaeological_find, 3) = 2, // Removed, causes runtimes
list(pick(subtypesof(/obj/item/toy/mecha)), 4) = 2,
list(pick(subtypesof(/obj/item/toy/figure)), 4) = 2,
list(pick(subtypesof(/obj/item/toy/plushie)), 4) = 2,
diff --git a/code/modules/mob/autowhisper.dm b/code/modules/mob/autowhisper.dm
index 03584e93ea7..e667c639311 100644
--- a/code/modules/mob/autowhisper.dm
+++ b/code/modules/mob/autowhisper.dm
@@ -1,7 +1,7 @@
/mob/living/verb/toggle_autowhisper()
set name = "Autowhisper Toggle"
set desc = "Toggle whether you will automatically whisper/subtle"
- set category = "IC"
+ set category = "IC.Settings"
autowhisper = !autowhisper
if(autowhisper_display)
@@ -24,7 +24,7 @@
/mob/living/verb/autowhisper_mode()
set name = "Autowhisper Mode"
set desc = "Set the mode your emotes will default to while using Autowhisper"
- set category = "IC"
+ set category = "IC.Settings"
var/choice = tgui_input_list(src, "Select Custom Subtle Mode", "Custom Subtle Mode", list("Adjacent Turfs (Default)", "My Turf", "My Table", "Current Belly (Prey)", "Specific Belly (Pred)", "Specific Person", "Psay/Pme"))
diff --git a/code/modules/mob/dead/observer/free_vr.dm b/code/modules/mob/dead/observer/free_vr.dm
index e57bfd36782..811a535ab1e 100644
--- a/code/modules/mob/dead/observer/free_vr.dm
+++ b/code/modules/mob/dead/observer/free_vr.dm
@@ -8,7 +8,7 @@ var/global/list/prevent_respawns = list()
/mob/observer/dead/verb/cleanup()
set name = "Quit This Round"
- set category = "OOC"
+ set category = "OOC.Game"
set desc = "Free your job slot, remove yourself from the manifest, and prevent respawning as this character for this round."
var/confirm = tgui_alert(usr, "This will free up your job slot, remove you from the manifest, and allow you to respawn as this character. You can rejoin as another \
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index dea1e3ea13e..83a81d2c36d 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -215,7 +215,7 @@ Works together with spawning an observer, noted above.
This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues.
*/
/mob/living/verb/ghost()
- set category = "OOC"
+ set category = "OOC.Game"
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
@@ -258,7 +258,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
. += "[eta_status]"
/mob/observer/dead/verb/reenter_corpse()
- set category = "Ghost"
+ set category = "Ghost.Game"
set name = "Re-enter Corpse"
if(!client) return
if(!(mind && mind.current && can_reenter_corpse))
@@ -295,7 +295,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 1
/mob/observer/dead/verb/toggle_medHUD()
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Toggle MedicHUD"
set desc = "Toggles Medical HUD allowing you to see how everyone is doing"
@@ -305,7 +305,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, span_boldnotice("Medical HUD [medHUD ? "Enabled" : "Disabled"]"))
/mob/observer/dead/verb/toggle_secHUD()
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Toggle Security HUD"
set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc"
@@ -318,7 +318,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, span_boldnotice("Security HUD [secHUD ? "Enabled" : "Disabled"]"))
/mob/observer/dead/verb/toggle_antagHUD()
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Toggle AntagHUD"
set desc = "Toggles AntagHUD allowing you to see who is the antagonist"
@@ -370,7 +370,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/dead_tele(areaname as anything in jumpable_areas())
set name = "Teleport"
- set category = "Ghost"
+ set category = "Ghost.Game"
set desc = "Teleport to a location."
if(!istype(usr, /mob/observer/dead))
@@ -379,12 +379,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/area/A
- if(!areaname)
- var/list/areas = jumpable_areas()
- var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas)
- if(!input)
- return
- A = areas[input]
+ if(areaname)
+ A = return_sorted_areas()[areaname]
+ else
+ A = return_sorted_areas()[tgui_input_list(usr, "Select an area:", "Ghost Teleport", jumpable_areas())]
if(!A)
return
@@ -392,12 +390,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(usr, "Not when you're not dead!")
return
- usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname])))
+ usr.forceMove(pick(get_area_turfs(A)))
usr.on_mob_jump()
/mob/observer/dead/verb/follow(mobname as anything in jumpable_mobs())
set name = "Follow"
- set category = "Ghost"
+ set category = "Ghost.Game"
set desc = "Follow and haunt a mob."
if(!istype(usr, /mob/observer/dead))
@@ -571,7 +569,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists))
/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
- set category = "Ghost"
+ set category = "Ghost.Game"
set name = "Jump to Mob"
set desc = "Teleport to a mob"
set popup_menu = FALSE
@@ -610,7 +608,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/analyze_air()
set name = "Analyze Air"
- set category = "Ghost"
+ set category = "Ghost.Game"
if(!istype(usr, /mob/observer/dead)) return
@@ -637,7 +635,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/check_radiation()
set name = "Check Radiation"
- set category = "Ghost"
+ set category = "Ghost.Game"
var/turf/t = get_turf(src)
if(t)
@@ -647,7 +645,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/become_mouse()
set name = "Become mouse"
- set category = "Ghost"
+ set category = "Ghost.Join"
if(CONFIG_GET(flag/disable_player_mice))
to_chat(src, span_warning("Spawning as a mouse is currently disabled."))
@@ -701,7 +699,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/view_manfiest()
set name = "Show Crew Manifest"
- set category = "Ghost"
+ set category = "Ghost.Game"
var/datum/tgui_module/crew_manifest/self_deleting/S = new(src)
S.tgui_interact(src)
@@ -718,7 +716,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
//Used for drawing on walls with blood puddles as a spooky ghost.
/mob/observer/dead/verb/bloody_doodle()
- set category = "Ghost"
+ set category = "Ghost.Game"
set name = "Write in blood"
set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC."
@@ -829,7 +827,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
client.images += J
/mob/observer/dead/proc/toggle_visibility(var/forced = 0)
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Toggle Visibility"
set desc = "Allows you to turn (in)visible (almost) at will."
@@ -851,7 +849,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
toggle_icon("cult")
/mob/observer/dead/verb/toggle_anonsay()
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Toggle Anonymous Chat"
set desc = "Toggles showing your key in dead chat."
@@ -870,7 +868,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/toggle_ghostsee()
set name = "Toggle Ghost Vision"
set desc = "Toggles your ability to see things only ghosts can see, like other ghosts"
- set category = "Ghost"
+ set category = "Ghost.Settings"
ghostvision = !ghostvision
updateghostsight()
to_chat(src, span_filter_notice("You [ghostvision ? "now" : "no longer"] have ghost vision."))
@@ -878,7 +876,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/toggle_darkness()
set name = "Toggle Darkness"
set desc = "Toggles your ability to see lighting overlays, and the darkness they create."
- set category = "Ghost"
+ set category = "Ghost.Settings"
var/static/list/darkness_names = list("normal darkness levels", "30% darkness removed", "70% darkness removed", "no darkness")
var/static/list/darkness_levels = list(255, 178, 76, 0)
@@ -931,7 +929,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/proc/ghost_whisper()
set name = "Spectral Whisper"
- set category = "IC"
+ set category = "IC.Subtle"
if(is_manifest) //Only able to whisper if it's hit with a tome.
var/list/options = list()
@@ -952,7 +950,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, span_danger("You have not been pulled past the veil!"))
/mob/observer/dead/verb/choose_ghost_sprite()
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Choose Sprite"
var/choice
@@ -986,7 +984,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return FALSE
/mob/observer/dead/verb/paialert()
- set category = "Ghost"
+ set category = "Ghost.Message"
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
@@ -1042,5 +1040,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/verb/respawn()
set name = "Respawn"
- set category = "Ghost"
+ set category = "Ghost.Join"
src.abandon_mob()
diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm
index 078ea96cdd5..fad743e5c5d 100644
--- a/code/modules/mob/dead/observer/observer_vr.dm
+++ b/code/modules/mob/dead/observer/observer_vr.dm
@@ -1,5 +1,5 @@
/mob/observer/dead/verb/nifjoin()
- set category = "Ghost"
+ set category = "Ghost.Join"
set name = "Join Into Soulcatcher"
set desc = "Select a player with a working NIF + Soulcatcher NIFSoft to join into it."
@@ -58,7 +58,7 @@
SC.catch_mob(src) //This will result in us being deleted so...
/mob/observer/dead/verb/backup_ping()
- set category = "Ghost"
+ set category = "Ghost.Join"
set name = "Notify Transcore"
set desc = "If your past-due backup notification was missed or ignored, you can use this to send a new one."
@@ -86,7 +86,7 @@
to_chat(src,span_warning("No backup record could be found, sorry."))
/*
/mob/observer/dead/verb/backup_delay()
- set category = "Ghost"
+ set category = "Ghost.Settings"
set name = "Cancel Transcore Notification"
set desc = "You can use this to avoid automatic backup notification happening. Manual notification can still be used."
@@ -105,7 +105,7 @@
to_chat(src,span_warning("No backup record could be found, sorry."))
*/
/mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
- set category = "Ghost"
+ set category = "Ghost.Join"
set name = "Find Ghost Pod"
set desc = "Find an active ghost pod"
set popup_menu = FALSE
@@ -132,7 +132,7 @@
to_chat(src, span_filter_notice("This ghost pod is not located in the game world."))
/mob/observer/dead/verb/findautoresleever()
- set category = "Ghost"
+ set category = "Ghost.Join"
set name = "Find Auto Resleever"
set desc = "Find a Auto Resleever"
set popup_menu = FALSE
diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm
index fa3fb311f0e..679d02c37ca 100644
--- a/code/modules/mob/freelook/ai/eye.dm
+++ b/code/modules/mob/freelook/ai/eye.dm
@@ -10,7 +10,7 @@
/mob/observer/eye/aiEye/New()
..()
visualnet = cameranet
-
+
/mob/observer/eye/aiEye/Destroy()
if(owner)
var/mob/living/silicon/ai/ai = owner
@@ -105,7 +105,7 @@
src.eyeobj.setLoc(src)
/mob/living/silicon/ai/proc/toggle_acceleration()
- set category = "AI Settings"
+ set category = "AI.Settings"
set name = "Toggle Camera Acceleration"
if(!eyeobj)
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index f6d433a391a..41f1b65066a 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -285,7 +285,7 @@
/mob/verb/check_languages()
set name = "Check Known Languages"
- set category = "IC"
+ set category = "IC.Game"
set src = usr
var/datum/browser/popup = new(src, "checklanguage", "Known Languages", 420, 470)
diff --git a/code/modules/mob/language/snowflake.dm b/code/modules/mob/language/snowflake.dm
index 7c8160c5c1b..9524fb638cc 100644
--- a/code/modules/mob/language/snowflake.dm
+++ b/code/modules/mob/language/snowflake.dm
@@ -4,7 +4,7 @@
/mob/proc/adjust_hive_range()
set name = "Adjust Special Language Range"
set desc = "Changes the range you will transmit your hive language to!"
- set category = "IC"
+ set category = "IC.Settings"
var/option = tgui_alert(src, "What range?", "Adjust special language range", list("Global","This Z level","Local", "Subtle"))
diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm
index dd63c80415b..618c0a32256 100644
--- a/code/modules/mob/living/autohiss.dm
+++ b/code/modules/mob/living/autohiss.dm
@@ -20,7 +20,7 @@
/client/verb/toggle_autohiss()
set name = "Toggle Auto-Hiss"
set desc = "Toggle automatic hissing as Unathi and r-rolling as Taj"
- set category = "OOC"
+ set category = "OOC.Game Settings"
autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM
switch(autohiss_mode)
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
index 492a590793b..a2b33f7973b 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
@@ -1,7 +1,7 @@
//Verbs after this point.
/mob/living/carbon/alien/diona/proc/merge()
- set category = "Abilities"
+ set category = "Abilities.Diona"
set name = "Merge with gestalt"
set desc = "Merge with another diona."
@@ -41,7 +41,7 @@
/mob/living/carbon/alien/diona/proc/split()
- set category = "Abilities"
+ set category = "Abilities.Diona"
set name = "Split from gestalt"
set desc = "Split away from your gestalt as a lone nymph."
diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm
index e59688646e8..af26a44221a 100644
--- a/code/modules/mob/living/carbon/alien/progression.dm
+++ b/code/modules/mob/living/carbon/alien/progression.dm
@@ -2,7 +2,7 @@
set name = "Evolve"
set desc = "Evolve into your adult form."
- set category = "Abilities"
+ set category = "Abilities.General"
if(stat != CONSCIOUS)
return
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index f25f41cc7a2..6f98a878044 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -54,7 +54,7 @@
// Vorestation edit start
/mob/living/carbon/brain/verb/backup_ping()
- set category = "IC"
+ set category = "IC.Game"
set name = "Notify Transcore"
set desc = "Your body is gone. Notify robotics to be resleeved!"
var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index fbf72f59bb5..9b6f1210c81 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -11,8 +11,6 @@
/mob/living/carbon/Life()
..()
- handle_viruses()
-
// Increase germ_level regularly
if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level
germ_level++
@@ -398,7 +396,10 @@
return
..()
if(istype(A, /mob/living/carbon) && prob(10))
- spread_disease_to(A, "Contact")
+ var/mob/living/carbon/human/H = A
+ for(var/datum/disease/D in GetViruses())
+ if(D.spread_flags & CONTACT_GENERAL)
+ H.ContractDisease(D)
/mob/living/carbon/cannot_use_vents()
return
@@ -542,3 +543,12 @@
if(allergen_type in species.food_preference)
return species.food_preference_bonus
return 0
+
+/mob/living/carbon/handle_diseases()
+ for(var/thing in GetViruses())
+ var/datum/disease/D = thing
+ if(prob(D.infectivity))
+ D.spread()
+
+ if(stat != DEAD || D.allow_dead)
+ D.stage_act()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 8dc29e6d3b8..24a03592974 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -3,7 +3,6 @@
blocks_emissive = EMISSIVE_BLOCK_UNIQUE // BLEH, this could be improved for transparent species and stuff! And blocks glowing eyes?!
var/datum/species/species //Contains icon generation and language information, set during New().
var/list/stomach_contents = list()
- var/list/datum/disease2/disease/virus2 = list()
var/list/antibodies = list()
var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm
@@ -29,4 +28,4 @@
//these two help govern taste. The first is the last time a taste message was shown to the plaer.
//the second is the message in question.
var/last_taste_time = 0
- var/last_taste_text = ""
\ No newline at end of file
+ var/last_taste_text = ""
diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm
index f805968d40d..d6fdc94788b 100644
--- a/code/modules/mob/living/carbon/carbon_powers.dm
+++ b/code/modules/mob/living/carbon/carbon_powers.dm
@@ -1,7 +1,7 @@
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/proc/release_control()
- set category = "Abilities"
+ set category = "Abilities.Brainslug"
set name = "Release Control"
set desc = "Release control of your host's body."
@@ -21,7 +21,7 @@
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
- set category = "Abilities"
+ set category = "Abilities.Brainslug"
set name = "Torment host"
set desc = "Punish your host with agony."
@@ -39,7 +39,7 @@
to_chat(B.host_brain, span_danger("Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!"))
/mob/living/carbon/proc/spawn_larvae()
- set category = "Abilities"
+ set category = "Abilities.Brainslug"
set name = "Reproduce"
set desc = "Spawn several young."
diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm
index fa60a104984..93559fbd982 100644
--- a/code/modules/mob/living/carbon/give.dm
+++ b/code/modules/mob/living/carbon/give.dm
@@ -1,5 +1,5 @@
/mob/living/verb/give(var/mob/living/target in living_mobs(1))
- set category = "IC"
+ set category = "IC.Game"
set name = "Give"
do_give(target)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 0d9d9d975ed..21e87074bf3 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -331,7 +331,7 @@ var/list/_simple_mob_default_emotes = list(
/mob/living/carbon/human/verb/pose()
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
- set category = "IC"
+ set category = "IC.Settings"
var/datum/gender/T = gender_datums[get_visible_gender()]
@@ -340,7 +340,7 @@ var/list/_simple_mob_default_emotes = list(
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavour Text"
set desc = "Sets an extended description of your character's features."
- set category = "IC"
+ set category = "IC.Settings"
var/HTML = ""
HTML += "
"
diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm
index 7339a35cdd4..25669fb6f86 100644
--- a/code/modules/mob/living/carbon/human/emote_vr.dm
+++ b/code/modules/mob/living/carbon/human/emote_vr.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/verb/toggle_resizing_immunity()
set name = "Toggle Resizing Immunity"
set desc = "Toggles your ability to resist resizing attempts"
- set category = "IC"
+ set category = "IC.Settings"
resizable = !resizable
to_chat(src, span_notice("You are now [resizable ? "susceptible" : "immune"] to being resized."))
@@ -35,7 +35,7 @@
/mob/living/carbon/human/verb/toggle_gender_identity_vr()
set name = "Set Gender Identity"
set desc = "Sets the pronouns when examined and performing an emote."
- set category = "IC"
+ set category = "IC.Settings"
var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity:", "Set Gender Identity", list(FEMALE, MALE, NEUTER, PLURAL, HERM))
if(!new_gender_identity)
return 0
@@ -44,14 +44,14 @@
/mob/living/carbon/human/verb/switch_tail_layer()
set name = "Switch tail layer"
- set category = "IC"
+ set category = "IC.Game"
set desc = "Switch tail layer on top."
tail_alt = !tail_alt
update_tail_showing()
/mob/living/carbon/human/verb/hide_wings_vr()
set name = "Show/Hide wings"
- set category = "IC"
+ set category = "IC.Settings"
set desc = "Hide your wings, or show them if you already hid them."
wings_hidden = !wings_hidden
update_wing_showing()
@@ -64,7 +64,7 @@
/mob/living/carbon/human/verb/hide_tail_vr()
set name = "Show/Hide tail"
- set category = "IC"
+ set category = "IC.Settings"
set desc = "Hide your tail, or show it if you already hid it."
if(!tail_style) //Just some checks.
to_chat(src,span_notice("You have no tail to hide!"))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 75c4c2d9ce2..5756af7e0a6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -70,7 +70,7 @@
/mob/living/carbon/human/Destroy()
human_mob_list -= src
- /* //Chomp REMOVE - this is done on mob/living/Destroy
+ /* //REMOVE - this is done on mob/living/Destroy
for(var/organ in organs)
qdel(organ)
*/
@@ -947,7 +947,7 @@
/mob/living/carbon/human/proc/remotesay()
set name = "Project mind"
- set category = "Superpower"
+ set category = "Abilities.Superpower"
if(stat!=CONSCIOUS)
reset_view(0)
@@ -976,7 +976,7 @@
/mob/living/carbon/human/proc/remoteobserve()
set name = "Remote View"
- set category = "Superpower"
+ set category = "Abilities.Superpower"
if(stat!=CONSCIOUS)
remoteview_target = null
@@ -1062,10 +1062,6 @@
sync_organ_dna()
// end vorestation addition
- for (var/ID in virus2)
- var/datum/disease2/disease/V = virus2[ID]
- V.cure(src)
-
losebreath = 0
..()
@@ -1339,7 +1335,7 @@
return 0
/mob/living/carbon/human/proc/bloody_doodle()
- set category = "IC"
+ set category = "IC.Game"
set name = "Write in blood"
set desc = "Use blood on your hands to write a short message on the floor or a wall, murder mystery style."
@@ -1648,7 +1644,7 @@
/mob/living/carbon/human/verb/pull_punches()
set name = "Pull Punches"
set desc = "Try not to hurt them."
- set category = "IC"
+ set category = "IC.Game"
if(stat) return
pulling_punches = !pulling_punches
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 34054954e9d..542dafb6f68 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -44,6 +44,17 @@
if(!temp || !temp.is_usable())
to_chat(H, span_warning("You can't use your hand."))
return
+
+ for(var/thing in GetViruses())
+ var/datum/disease/D = thing
+ if(D.IsSpreadByTouch())
+ H.ContractDisease(D)
+
+ for(var/thing in H.GetViruses())
+ var/datum/disease/D = thing
+ if(D.IsSpreadByTouch())
+ ContractDisease(D)
+
if(H.lying)
return
M.break_cloak()
@@ -65,8 +76,9 @@
return FALSE
if(istype(M,/mob/living/carbon))
- var/mob/living/carbon/C = M
- C.spread_disease_to(src, "Contact")
+ for(var/datum/disease/D in M.GetViruses())
+ if(D.spread_flags & CONTACT_HANDS)
+ ContractDisease(D)
switch(M.a_intent)
if(I_HELP)
@@ -446,7 +458,7 @@
/mob/living/carbon/human/verb/check_attacks()
set name = "Check Attacks"
- set category = "IC"
+ set category = "IC.Game"
set src = usr
var/dat = span_bold(span_giant("Known Attacks")) + "
"
diff --git a/code/modules/mob/living/carbon/human/human_attackhand_vr.dm b/code/modules/mob/living/carbon/human/human_attackhand_vr.dm
index bbee7002ac7..7175f645ccd 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand_vr.dm
@@ -3,7 +3,7 @@
/mob/living/carbon/human/verb/check_attacks()
set name = "Check Attacks"
- set category = "IC"
+ set category = "IC.Game"
set src = usr
var/dat = span_bold("Known Attacks") + "
"
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 1d6746cfc07..9abd6ddf229 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -4,7 +4,7 @@
/mob/living/carbon/human/proc/tie_hair()
set name = "Tie Hair"
set desc = "Style your hair."
- set category = "IC"
+ set category = "IC.Game"
if(incapacitated())
to_chat(src, span_warning("You can't mess with your hair right now!"))
@@ -34,7 +34,7 @@
to_chat(src, span_notice("You're already using that style."))
/mob/living/carbon/human/proc/tackle()
- set category = "Abilities"
+ set category = "Abilities.General"
set name = "Tackle"
set desc = "Tackle someone down."
@@ -81,7 +81,7 @@
O.show_message(span_warning(span_red(span_bold("[src] [failed ? "tried to tackle" : "has tackled"] down [T]!"))), 1)
/mob/living/carbon/human/proc/commune()
- set category = "Abilities"
+ set category = "Abilities.General"
set name = "Commune with creature"
set desc = "Send a telepathic message to an unlucky recipient."
@@ -119,7 +119,7 @@
/mob/living/carbon/human/proc/regurgitate()
set name = "Regurgitate"
set desc = "Empties the contents of your stomach"
- set category = "Abilities"
+ set category = "Abilities.General"
if(stomach_contents.len)
for(var/mob/M in src)
@@ -132,7 +132,7 @@
/mob/living/carbon/human/proc/psychic_whisper(mob/M as mob in oview())
set name = "Psychic Whisper"
set desc = "Whisper silently to someone over a distance."
- set category = "Abilities"
+ set category = "Abilities.General"
var/msg = sanitize(tgui_input_text(usr, "Message:", "Psychic Whisper"))
if(msg)
@@ -144,7 +144,7 @@
/mob/living/carbon/human/proc/diona_split_nymph()
set name = "Split"
set desc = "Split your humanoid form into its constituent nymphs."
- set category = "Abilities"
+ set category = "Abilities.Diona"
diona_split_into_nymphs(5) // Separate proc to void argments being supplied when used as a verb
/mob/living/carbon/human/proc/diona_split_into_nymphs(var/number_of_resulting_nymphs)
@@ -204,7 +204,7 @@
/mob/living/carbon/human/proc/self_diagnostics()
set name = "Self-Diagnostics"
set desc = "Run an internal self-diagnostic to check for damage."
- set category = "IC"
+ set category = "Abilities.General"
if(stat == DEAD) return
@@ -247,7 +247,7 @@
/mob/living/carbon/human/proc/sonar_ping()
set name = "Listen In"
set desc = "Allows you to listen in to movement and noises around you."
- set category = "Abilities"
+ set category = "Abilities.General"
if(incapacitated())
to_chat(src, span_warning("You need to recover before you can use this ability."))
@@ -291,7 +291,7 @@
/mob/living/carbon/human/proc/regenerate()
set name = "Regenerate"
set desc = "Allows you to regrow limbs and heal organs after a period of rest."
- set category = "Abilities"
+ set category = "Abilities.General"
if(nutrition < 250)
to_chat(src, span_warning("You lack the biomass to begin regeneration!"))
@@ -355,7 +355,7 @@
/mob/living/carbon/human/proc/setmonitor_state()
set name = "Set monitor display"
set desc = "Set your monitor display"
- set category = "IC"
+ set category = "IC.Settings"
if(stat)
to_chat(src,span_warning("You must be awake and standing to perform this action!"))
return
diff --git a/code/modules/mob/living/carbon/human/human_powers_vr.dm b/code/modules/mob/living/carbon/human/human_powers_vr.dm
index a1a0c2b76a8..acc53a7d499 100644
--- a/code/modules/mob/living/carbon/human/human_powers_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_powers_vr.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/proc/reagent_purge()
set name = "Purge Reagents"
set desc = "Empty yourself of any reagents you may have consumed or come into contact with."
- set category = "IC"
+ set category = "IC.Game"
if(stat == DEAD) return
@@ -17,7 +17,7 @@
/mob/living/carbon/human/verb/toggle_eyes_layer()
set name = "Switch Eyes/Monitor Layer"
set desc = "Toggle rendering of eyes/monitor above markings."
- set category = "IC"
+ set category = "IC.Settings"
if(stat)
to_chat(src, span_warning("You must be awake and standing to perform this action!"))
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 7d64ac51cfe..3d071559965 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -504,9 +504,12 @@
/mob/living/carbon/human/handle_post_breath(datum/gas_mixture/breath)
..()
//spread some viruses while we are at it
- if(breath && virus2.len > 0 && prob(10))
- for(var/mob/living/carbon/M in view(1,src))
- src.spread_disease_to(M)
+ if(breath && !isnull(viruses) && prob(10))
+ for(var/datum/disease/D in GetViruses())
+ if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
+ continue
+ for(var/mob/living/carbon/M in view(1,src))
+ ContractDisease(D)
/mob/living/carbon/human/get_breath_from_internal(volume_needed=BREATH_VOLUME)
@@ -2031,8 +2034,8 @@
if (BITTEST(hud_updateflag, STATUS_HUD))
var/foundVirus = 0
- for (var/ID in virus2)
- if (ID in virusDB)
+ for (var/datum/disease/D in GetViruses())
+ if(D.discovered)
foundVirus = 1
break
@@ -2054,8 +2057,10 @@
holder2.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
- if(virus2.len)
- holder2.icon_state = "hudill"
+ if(viruses.len)
+ for(var/datum/disease/D in GetViruses())
+ if(D.discovered)
+ holder2.icon_state = "hudill"
else
holder2.icon_state = "hudhealthy"
if(block_hud)
diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
index cac17137eb1..69eee283882 100644
--- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
+++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
@@ -79,7 +79,7 @@ var/list/wrapped_species_by_ref = list()
/mob/living/carbon/human/proc/shapeshifter_select_hair()
set name = "Select Hair"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -123,7 +123,7 @@ var/list/wrapped_species_by_ref = list()
/mob/living/carbon/human/proc/shapeshifter_select_gender()
set name = "Select Gender"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -145,7 +145,7 @@ var/list/wrapped_species_by_ref = list()
/mob/living/carbon/human/proc/shapeshifter_select_shape()
set name = "Select Body Shape"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -172,7 +172,7 @@ var/list/wrapped_species_by_ref = list()
/mob/living/carbon/human/proc/shapeshifter_select_colour()
set name = "Select Body Colour"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -210,7 +210,7 @@ var/list/wrapped_species_by_ref = list()
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors()
set name = "Select Hair Colors"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -309,7 +309,7 @@ var/list/wrapped_species_by_ref = list()
/mob/living/carbon/human/proc/shapeshifter_select_eye_colour()
set name = "Select Eye Color"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
index 58b4a6d0458..5a0d5ce3a63 100644
--- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
@@ -4,7 +4,7 @@
/mob/living/carbon/human/proc/shapeshifter_select_ears()
set name = "Select Ears"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -89,7 +89,7 @@
/mob/living/carbon/human/proc/shapeshifter_select_tail()
set name = "Select Tail"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -143,7 +143,7 @@
/mob/living/carbon/human/proc/shapeshifter_select_wings()
set name = "Select Wings"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
@@ -199,7 +199,7 @@
/mob/living/carbon/human/proc/promethean_select_opaqueness()
set name = "Toggle Transparency"
- set category = "Abilities"
+ set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm
index 6889cb3bbbc..239f4a4e5a2 100644
--- a/code/modules/mob/living/carbon/human/species/station/alraune.dm
+++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm
@@ -382,7 +382,7 @@
/mob/living/carbon/human/proc/alraune_fruit_select() //So if someone doesn't want fruit/vegetables, they don't have to select one.
set name = "Select fruit"
set desc = "Select what fruit/vegetable you wish to grow."
- set category = "Abilities"
+ set category = "Abilities.Alraune"
var/obj/item/organ/internal/fruitgland/fruit_gland
for(var/F in contents)
if(istype(F, /obj/item/organ/internal/fruitgland))
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
index 113c3c73ed3..de24de4936f 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
@@ -40,7 +40,7 @@
/mob/living/carbon/human/proc/prommie_blobform()
set name = "Toggle Blobform"
set desc = "Switch between amorphous and humanoid forms."
- set category = "Abilities"
+ set category = "Abilities.Promethean"
set hidden = FALSE
var/atom/movable/to_locate = temporary_form || src
diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
index 9f19887a667..a4bdf523a45 100644
--- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
@@ -235,7 +235,7 @@
/mob/living/simple_mob/slime/promethean/proc/prommie_blobform()
set name = "Toggle Blobform"
set desc = "Switch between amorphous and humanoid forms."
- set category = "Abilities"
+ set category = "Abilities.Promethean"
set hidden = FALSE
var/atom/movable/to_locate = src
@@ -253,7 +253,7 @@
/mob/living/simple_mob/slime/promethean/proc/toggle_expand()
set name = "Toggle Width"
set desc = "Switch between smole and lorge."
- set category = "Abilities"
+ set category = "Abilities.Promethean"
set hidden = FALSE
if(stat || world.time < last_special)
@@ -273,7 +273,7 @@
/mob/living/simple_mob/slime/promethean/proc/toggle_shine()
set name = "Toggle Shine"
set desc = "Shine on you crazy diamond."
- set category = "Abilities"
+ set category = "Abilities.Promethean"
set hidden = FALSE
if(stat || world.time < last_special)
@@ -293,7 +293,7 @@
/mob/living/simple_mob/slime/promethean/proc/prommie_select_colour()
set name = "Select Body Colour"
- set category = "Abilities"
+ set category = "Abilities.Promethean"
if(stat || world.time < last_special)
return
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index 9bca0bcfc7a..0eba8870997 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -1,6 +1,6 @@
/mob/living/carbon/human/proc/reconstitute_form() //Scree's race ability.in exchange for: No cloning.
set name = "Reconstitute Form"
- set category = "Abilities"
+ set category = "Abilities.General"
// Sanity is mostly handled in chimera_regenerate()
if(stat == DEAD)
@@ -106,7 +106,7 @@
/mob/living/carbon/human/proc/hatch()
set name = "Hatch"
- set category = "Abilities"
+ set category = "Abilities.General"
if(revive_ready != REVIVING_DONE)
//Hwhat?
@@ -388,7 +388,7 @@
/mob/living/carbon/human/proc/bloodsuck()
set name = "Partially Drain prey of blood"
set desc = "Bites prey and drains them of a significant portion of blood, feeding you in the process. You may only do this once per minute."
- set category = "Abilities"
+ set category = "Abilities.General"
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
@@ -510,7 +510,7 @@
/mob/living/carbon/human/proc/succubus_drain()
set name = "Drain prey of nutrition"
set desc = "Slowly drain prey of all the nutrition in their body, feeding you in the process. You may only do this to one person at a time."
- set category = "Abilities"
+ set category = "Abilities.Succubus"
if(!ishuman(src))
return //If you're not a human you don't have permission to do this.
var/mob/living/carbon/human/C = src
@@ -573,7 +573,7 @@
/mob/living/carbon/human/proc/succubus_drain_lethal()
set name = "Lethally drain prey" //Provide a warning that THIS WILL KILL YOUR PREY.
set desc = "Slowly drain prey of all the nutrition in their body, feeding you in the process. Once prey run out of nutrition, you will begin to drain them lethally. You may only do this to one person at a time."
- set category = "Abilities"
+ set category = "Abilities.Succubus"
if(!ishuman(src))
return //If you're not a human you don't have permission to do this.
@@ -665,7 +665,7 @@
/mob/living/carbon/human/proc/slime_feed()
set name = "Feed prey with self"
set desc = "Slowly feed prey with your body, draining you in the process. You may only do this to one person at a time."
- set category = "Abilities"
+ set category = "Abilities.Vore"
if(!ishuman(src))
return //If you're not a human you don't have permission to do this.
var/mob/living/carbon/human/C = src
@@ -726,7 +726,7 @@
/mob/living/carbon/human/proc/succubus_drain_finalize()
set name = "Drain/Feed Finalization"
set desc = "Toggle to allow for draining to be prolonged. Turn this on to make it so prey will be knocked out/die while being drained, or you will feed yourself to the prey's selected stomach if you're feeding them. Can be toggled at any time."
- set category = "Abilities"
+ set category = "Abilities.Succubus"
var/mob/living/carbon/human/C = src
C.drain_finalized = !C.drain_finalized
@@ -818,7 +818,7 @@
/mob/living/proc/shred_limb()
set name = "Damage/Remove Prey's Organ"
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
- set category = "Abilities"
+ set category = "Abilities.Vore"
//can_shred() will return a mob we can shred, if we can shred any.
var/mob/living/carbon/human/T = can_shred()
@@ -894,13 +894,13 @@
/mob/living/proc/shred_limb_temp()
set name = "Damage/Remove Prey's Organ (beartrap)"
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
- set category = "Abilities"
+ set category = "Abilities.Vore"
shred_limb()
/mob/living/proc/flying_toggle()
set name = "Toggle Flight"
set desc = "While flying over open spaces, you will use up some nutrition. If you run out nutrition, you will fall."
- set category = "Abilities"
+ set category = "Abilities.General"
var/mob/living/carbon/human/C = src
if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person.
@@ -923,7 +923,7 @@
/mob/living/proc/flying_vore_toggle()
set name = "Toggle Flight Vore"
set desc = "Allows you to engage in voracious misadventures while flying."
- set category = "Abilities"
+ set category = "Abilities.Vore"
flight_vore = !flight_vore
if(flight_vore)
@@ -935,7 +935,7 @@
/mob/living/proc/start_wings_hovering()
set name = "Hover"
set desc = "Allows you to stop gliding and hover. This will take a fair amount of nutrition to perform."
- set category = "Abilities"
+ set category = "Abilities.General"
var/mob/living/carbon/human/C = src
if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person.
@@ -967,13 +967,13 @@
/mob/living/proc/toggle_pass_table()
set name = "Toggle Agility" //Dunno a better name for this. You have to be pretty agile to hop over stuff!!!
set desc = "Allows you to start/stop hopping over things such as hydroponics trays, tables, and railings."
- set category = "Abilities"
+ set category = "Abilities.General"
pass_flags ^= PASSTABLE //I dunno what this fancy ^= is but Aronai gave it to me.
to_chat(src, "You [pass_flags&PASSTABLE ? "will" : "will NOT"] move over tables/railings/trays!")
/mob/living/carbon/human/proc/check_silk_amount()
set name = "Check Silk Amount"
- set category = "Abilities"
+ set category = "Abilities.Weaver"
if(species.is_weaver)
to_chat(src, "Your silk reserves are at [species.silk_reserve]/[species.silk_max_reserve].")
@@ -982,7 +982,7 @@
/mob/living/carbon/human/proc/toggle_silk_production()
set name = "Toggle Silk Production"
- set category = "Abilities"
+ set category = "Abilities.Weaver"
if(species.is_weaver)
species.silk_production = !(species.silk_production)
@@ -992,7 +992,7 @@
/mob/living/carbon/human/proc/weave_structure()
set name = "Weave Structure"
- set category = "Abilities"
+ set category = "Abilities.Weaver"
if(!(species.is_weaver))
to_chat(src, span_warning("You are not a weaver! How are you doing this? Tell a developer!"))
@@ -1052,7 +1052,7 @@
/mob/living/carbon/human/proc/weave_item()
set name = "Weave Item"
- set category = "Abilities"
+ set category = "Abilities.Weaver"
if(!(species.is_weaver))
return
@@ -1106,7 +1106,7 @@
/mob/living/carbon/human/proc/set_silk_color()
set name = "Set Silk Color"
- set category = "Abilities"
+ set category = "Abilities.Weaver"
if(!(species.is_weaver))
to_chat(src, span_warning("You are not a weaver! How are you doing this? Tell a developer!"))
@@ -1118,7 +1118,7 @@
/mob/living/carbon/human/proc/toggle_eye_glow()
set name = "Toggle Eye Glowing"
- set category = "Abilities"
+ set category = "Abilities.General"
species.has_glowing_eyes = !species.has_glowing_eyes
update_eyes()
@@ -1128,7 +1128,7 @@
/mob/living/carbon/human/proc/enter_cocoon()
set name = "Spin Cocoon"
- set category = "Abilities"
+ set category = "Abilities.Weaver"
if(!isturf(loc))
to_chat(src, "You don't have enough space to spin a cocoon!")
return
@@ -1153,7 +1153,7 @@
/mob/living/carbon/human/proc/water_stealth()
set name = "Dive under water / Resurface"
set desc = "Dive under water, allowing for you to be stealthy and move faster."
- set category = "Abilities"
+ set category = "Abilities.General"
if(last_special > world.time)
return
@@ -1185,7 +1185,7 @@
/mob/living/carbon/human/proc/underwater_devour()
set name = "Devour From Water"
set desc = "Grab something in the water with you and devour them with your selected stomach."
- set category = "Abilities"
+ set category = "Abilities.Vore"
if(last_special > world.time)
return
@@ -1241,7 +1241,7 @@
/mob/living/carbon/human/proc/toggle_pain_module()
set name = "Toggle pain simulation."
set desc = "Turn on your pain simulation for that organic experience! Or turn it off for repairs, or if it's too much."
- set category = "Abilities"
+ set category = "Abilities.General"
if(synth_cosmetic_pain)
to_chat(src, span_notice(" You turn off your pain simulators."))
@@ -1256,7 +1256,7 @@
/mob/living/proc/long_vore() // Allows the user to tongue grab a creature in range. Made a /living proc so frogs can frog you.
set name = "Grab Prey With Appendage"
- set category = "Abilities"
+ set category = "Abilities.Vore"
set desc = "Grab a target with any of your appendages!"
if(stat || paralysis || weakened || stunned || world.time < last_special) //No tongue flicking while stunned.
@@ -1468,7 +1468,7 @@
/mob/living/proc/target_lunge() //The leaper leap, but usable as an ability
set name = "Lunge At Prey"
- set category = "Abilities"
+ set category = "Abilities.Vore"
set desc = "Dive atop your prey and gobble them up!"
var/leap_warmup = 1 SECOND //Easy to modify
@@ -1538,7 +1538,7 @@
/mob/living/proc/injection() // Allows the user to inject reagents into others somehow, like stinging, or biting.
set name = "Injection"
- set category = "Abilities"
+ set category = "Abilities.General"
set desc = "Inject another being with something!"
if(stat || paralysis || weakened || stunned || world.time < last_special) //Epic copypasta from tongue grabbing.
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm
index 6da754903d1..e5671811fc2 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm
@@ -27,7 +27,7 @@ TGUI frontend path: tgui\packages\tgui\interfaces\TraitTutorial.tsx
/mob/living/carbon/human/proc/trait_tutorial()
set name = "Explain Custom Traits"
set desc = "Click this verb to obtain a detailed tutorial on your selected traits. "
- set category = "Abilities"
+ set category = "Abilities.General"
var/datum/tgui_module/trait_tutorial_tgui/fancy_UI
if(!fancy_UI)
fancy_UI = new /datum/tgui_module/trait_tutorial_tgui/ //Preventing a bunch of instances being spawned all over the place. Hopefully
diff --git a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
index 9f72a2621c5..c8d044330bd 100644
--- a/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
+++ b/code/modules/mob/living/carbon/human/species/virtual_reality/avatar.dm
@@ -54,7 +54,7 @@
/mob/living/carbon/human/proc/shapeshifter_change_opacity()
set name = "Toggle Opacity"
- set category = "Abilities"
+ set category = "Abilities.Shapeshifter"
if(stat || world.time < last_special)
return
@@ -88,7 +88,7 @@
// exit_vr is called on the vr mob, and puts the mind back into the original mob
/mob/living/carbon/human/proc/exit_vr()
set name = "Exit Virtual Reality"
- set category = "Abilities"
+ set category = "Abilities.VR"
if(!vr_holder)
return
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
index 7c69a214c15..346259c449f 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
@@ -56,7 +56,7 @@
/mob/living/carbon/human/proc/transfer_plasma(mob/living/carbon/human/M as mob in oview())
set name = "Transfer Plasma"
set desc = "Transfer Plasma to another alien"
- set category = "Abilities"
+ set category = "Abilities.Alien"
if (get_dist(src,M) <= 1)
to_chat(src, span_alium("You need to be closer."))
@@ -81,7 +81,7 @@
set name = "Lay Egg (500)" //Cost is entire queen reserve, to compensate being able to reproduce on it's own
set desc = "Lay an egg that will eventually hatch into a new xenomorph larva. Life finds a way."
- set category = "Abilities"
+ set category = "Abilities.Alien"
if(!CONFIG_GET(flag/aliens_allowed))
to_chat(src, "You begin to lay an egg, but hesitate. You suspect it isn't allowed.")
@@ -102,7 +102,7 @@
/mob/living/carbon/human/proc/evolve()
set name = "Evolve (500)"
set desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time."
- set category = "Abilities"
+ set category = "Abilities.Alien"
if(alien_queen_exists())
to_chat(src, span_notice("We already have an active queen."))
@@ -117,7 +117,7 @@
/mob/living/carbon/human/proc/plant()
set name = "Plant Weeds (50)"
set desc = "Plants some alien weeds"
- set category = "Abilities"
+ set category = "Abilities.Alien"
if(check_alien_ability(50,1,O_RESIN))
visible_message(span_alium(span_bold("[src] has planted some alien weeds!")))
@@ -149,7 +149,7 @@
/mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N
set name = "Corrosive Acid (200)"
set desc = "Drench an object in acid, destroying it over time."
- set category = "Abilities"
+ set category = "Abilities.Alien"
if(!(O in oview(1)))
to_chat(src, span_alium("[O] is too far away."))
@@ -186,7 +186,7 @@
/mob/living/carbon/human/proc/neurotoxin()
set name = "Toggle Neurotoxic Spit (40)"
set desc = "Readies a neurotoxic spit, which paralyzes the target for a short time if they are not wearing protective gear."
- set category = "Abilities"
+ set category = "Abilities.Alien"
if(spitting)
to_chat(src, span_alium("You stop preparing to spit."))
@@ -207,7 +207,7 @@
/mob/living/carbon/human/proc/acidspit()
set name = "Toggle Acid Spit (50)"
set desc = "Readies an acidic spit, which burns the target if they are not wearing protective gear."
- set category = "Abilities"
+ set category = "Abilities.Alien"
if(spitting)
to_chat(src, span_alium("You stop preparing to spit."))
@@ -228,7 +228,7 @@
/mob/living/carbon/human/proc/resin() //Gurgs : Refactored resin ability, big thanks to Jon.
set name = "Secrete Resin (75)"
set desc = "Secrete tough malleable resin."
- set category = "Abilities"
+ set category = "Abilities.Alien"
var/list/options = list("resin door","resin wall","resin membrane","nest","resin blob")
for(var/option in options)
@@ -276,7 +276,7 @@
return
/mob/living/carbon/human/proc/leap()
- set category = "Abilities"
+ set category = "Abilities.Alien"
set name = "Leap"
set desc = "Leap at a target and grab them aggressively."
@@ -344,7 +344,7 @@
G.synch()
/mob/living/carbon/human/proc/gut()
- set category = "Abilities"
+ set category = "Abilities.Alien"
set name = "Slaughter"
set desc = "While grabbing someone aggressively, rip their guts out or tear them apart."
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index e90d7771edd..116c3121763 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1343,15 +1343,21 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(ear_secondary_style && !(head && (head.flags_inv & BLOCKHEADHAIR)))
var/icon/ears_s = new/icon("icon" = ear_secondary_style.icon, "icon_state" = ear_secondary_style.icon_state)
if(ear_secondary_style.do_colouration)
- ears_s.Blend(LAZYACCESS(ear_secondary_colors, 1), ear_secondary_style.color_blend_mode)
+ var/color = LAZYACCESS(ear_secondary_colors, 1)
+ if(color)
+ ears_s.Blend(color, ear_secondary_style.color_blend_mode)
if(ear_secondary_style.extra_overlay)
var/icon/overlay = new/icon("icon" = ear_secondary_style.icon, "icon_state" = ear_secondary_style.extra_overlay)
- overlay.Blend(LAZYACCESS(ear_secondary_colors, 2), ear_secondary_style.color_blend_mode)
+ var/color = LAZYACCESS(ear_secondary_colors, 2)
+ if(color)
+ overlay.Blend(color, ear_secondary_style.color_blend_mode)
ears_s.Blend(overlay, ICON_OVERLAY)
qdel(overlay)
if(ear_secondary_style.extra_overlay2) //MORE COLOURS IS BETTERER
var/icon/overlay = new/icon("icon" = ear_secondary_style.icon, "icon_state" = ear_secondary_style.extra_overlay2)
- overlay.Blend(LAZYACCESS(ear_secondary_colors, 3), ear_secondary_style.color_blend_mode)
+ var/color = LAZYACCESS(ear_secondary_colors, 3)
+ if(color)
+ overlay.Blend(color, ear_secondary_style.color_blend_mode)
ears_s.Blend(overlay, ICON_OVERLAY)
qdel(overlay)
if(!rendered)
@@ -1371,13 +1377,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//If you have a custom tail selected
if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)) && !tail_hidden)
- var/icon/tail_s = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) //CHOMPEdit
+ var/icon/tail_s = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state))
if(tail_style.can_loaf && !is_shifted)
pixel_y = (resting) ? -tail_style.loaf_offset*size_multiplier : default_pixel_y //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing
if(tail_style.do_colouration)
tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
if(tail_style.extra_overlay)
- var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay) //CHOMPEdit
+ var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay)
if(wagging && tail_style.ani_state)
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay_w) //RS EDIT
overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
@@ -1389,7 +1395,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
qdel(overlay)
if(tail_style.extra_overlay2)
- var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2) //CHOMPEdit
+ var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2)
if(wagging && tail_style.ani_state)
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) //RS EDIT
overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
diff --git a/code/modules/mob/living/carbon/lick_wounds.dm b/code/modules/mob/living/carbon/lick_wounds.dm
index 880e7358b94..68dcae6789f 100644
--- a/code/modules/mob/living/carbon/lick_wounds.dm
+++ b/code/modules/mob/living/carbon/lick_wounds.dm
@@ -1,6 +1,6 @@
/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M as mob in view(1)) // Allows the user to lick themselves. Given how rarely this trait is used, I don't see an issue with a slight buff.
set name = "Lick Wounds"
- set category = "Abilities"
+ set category = "Abilities.General"
set desc = "Disinfect and heal small wounds with your saliva."
if(stat || paralysis || weakened || stunned)
diff --git a/code/modules/mob/living/carbon/viruses.dm b/code/modules/mob/living/carbon/viruses.dm
deleted file mode 100644
index f57bc878a00..00000000000
--- a/code/modules/mob/living/carbon/viruses.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/mob/living/carbon/proc/handle_viruses()
-
- if(status_flags & GODMODE) return 0 //godmode
-
- if(bodytemperature > 406)
- for (var/ID in virus2)
- var/datum/disease2/disease/V = virus2[ID]
- V.cure(src)
-
- if(life_tick % 3) //don't spam checks over all objects in view every tick.
- for(var/obj/effect/decal/cleanable/O in view(1,src))
- if(istype(O,/obj/effect/decal/cleanable/blood))
- var/obj/effect/decal/cleanable/blood/B = O
- if(B.virus2.len)
- for (var/ID in B.virus2)
- var/datum/disease2/disease/V = B.virus2[ID]
- infect_virus2(src,V)
-
- else if(istype(O,/obj/effect/decal/cleanable/mucus))
- var/obj/effect/decal/cleanable/mucus/M = O
- if(M.virus2.len)
- for (var/ID in M.virus2)
- var/datum/disease2/disease/V = M.virus2[ID]
- infect_virus2(src,V)
-
- else if(istype(O,/obj/effect/decal/cleanable/vomit))
- var/obj/effect/decal/cleanable/vomit/Vom = O
- if(Vom.virus2.len)
- for (var/ID in Vom.virus2)
- var/datum/disease2/disease/V = Vom.virus2[ID]
- infect_virus2(src,V)
-
- if(virus2.len)
- for (var/ID in virus2)
- var/datum/disease2/disease/V = virus2[ID]
- if(isnull(V)) // Trying to figure out a runtime error that keeps repeating
- CRASH("virus2 nulled before calling activate()")
- else
- V.activate(src)
- // activate may have deleted the virus
- if(!V) continue
-
- // check if we're immune
- var/list/common_antibodies = V.antigen & src.antibodies
- if(common_antibodies.len)
- V.dead = 1
-
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm
index 847f1b221bf..66cdcb28adb 100644
--- a/code/modules/mob/living/default_language.dm
+++ b/code/modules/mob/living/default_language.dm
@@ -1,10 +1,28 @@
/mob/living
var/datum/language/default_language
-/mob/living/verb/set_default_language(language as null|anything in languages)
+/mob/living/verb/set_default_language()
set name = "Set Default Language"
- set category = "IC"
+ set category = "IC.Settings"
+ var/language = tgui_input_list(usr, "Select your default language", "Available languages", languages)
+
+ apply_default_language(language)
+
+// Silicons can't neccessarily speak everything in their languages list
+/mob/living/silicon/set_default_language()
+ var/language = tgui_input_list(usr, "Select your default language", "Available languages", speech_synthesizer_langs)
+ // Silicons have no species language usually. So let's default them to GALCOM
+ if(!language)
+ to_chat(src, span_notice("You will now speak your standard default language, common, if you do not specify a language when speaking."))
+ for(var/datum/language/lang in speech_synthesizer_langs)
+ if(lang.name == LANGUAGE_GALCOM)
+ default_language = lang
+ break
+ return
+ apply_default_language(language)
+
+/mob/living/proc/apply_default_language(var/language)
if (only_species_language && language != GLOB.all_languages[src.species_language])
to_chat(src, span_notice("You can only speak your species language, [src.species_language]."))
return 0
@@ -22,13 +40,9 @@
to_chat(src, span_notice("You will now speak whatever your standard default language is if you do not specify one when speaking."))
default_language = language
-// Silicons can't neccessarily speak everything in their languages list
-/mob/living/silicon/set_default_language(language as null|anything in speech_synthesizer_langs)
- ..()
-
/mob/living/verb/check_default_language()
set name = "Check Default Language"
- set category = "IC"
+ set category = "IC.Game"
if(default_language)
to_chat(src, span_notice("You are currently speaking [default_language] by default."))
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index a15b0e115ea..a599ff38e2e 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -51,6 +51,10 @@
//Chemicals in the body, this is moved over here so that blood can be added after death
handle_chemicals_in_body()
+ // Handle viruses - Dead or not!
+ if(LAZYLEN(viruses))
+ handle_diseases()
+
//Handle temperature/pressure differences between body and environment
if(environment)
handle_environment(environment)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 256f8d3c030..a81282f3646 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -104,7 +104,7 @@
/mob/living/verb/succumb()
set name = "Succumb to death"
- set category = "IC"
+ set category = "IC.Game"
set desc = "Press this button if you are in crit and wish to die. Use this sparingly (ending a scene, no medical, etc.)"
var/confirm1 = tgui_alert(usr, "Pressing this button will kill you instantenously! Are you sure you wish to proceed?", "Confirm wish to succumb", list("No","Yes"))
var/confirm2 = "No"
@@ -123,7 +123,7 @@
/mob/living/verb/toggle_afk()
set name = "Toggle AFK"
- set category = "IC"
+ set category = "IC.Game"
set desc = "Mark yourself as Away From Keyboard, or clear that status!"
if(away_from_keyboard)
remove_status_indicator("afk")
@@ -710,7 +710,7 @@
/mob/living/proc/Examine_OOC()
set name = "Examine Meta-Info (OOC)"
- set category = "OOC"
+ set category = "OOC.Game"
set src in view()
//VOREStation Edit Start - Making it so SSD people have prefs with fallback to original style.
if(CONFIG_GET(flag/allow_metadata))
@@ -729,7 +729,7 @@
/mob/living/verb/resist()
set name = "Resist"
- set category = "IC"
+ set category = "IC.Game"
if(!incapacitated(INCAPACITATION_KNOCKOUT) && (last_resist_time + RESIST_COOLDOWN < world.time))
last_resist_time = world.time
@@ -789,7 +789,7 @@
/mob/living/verb/lay_down()
set name = "Rest"
- set category = "IC"
+ set category = "IC.Game"
resting = !resting
to_chat(src, span_notice("You are now [resting ? "resting" : "getting up"]."))
@@ -1334,7 +1334,7 @@
/mob/living/verb/mob_sleep()
set name = "Sleep"
- set category = "IC"
+ set category = "IC.Game"
if(!toggled_sleeping && alert(src, "Are you sure you wish to go to sleep? You will snooze until you use the Sleep verb again.", "Sleepy Time", "No", "Yes") == "No")
return
toggled_sleeping = !toggled_sleeping
diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm
index 740cbed0742..3b6806b9f9b 100644
--- a/code/modules/mob/living/living_powers.dm
+++ b/code/modules/mob/living/living_powers.dm
@@ -8,7 +8,7 @@
/mob/living/proc/hide()
set name = "Hide"
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
- set category = "Abilities"
+ set category = "Abilities.General"
if(stat == DEAD || paralysis || weakened || stunned || restrained() || buckled || LAZYLEN(grabbed_by) || has_buckled_mobs()) //VORE EDIT: Check for has_buckled_mobs() (taur riding)
return
diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm
index 82850fea56e..fe8b80b5357 100644
--- a/code/modules/mob/living/living_vr.dm
+++ b/code/modules/mob/living/living_vr.dm
@@ -4,7 +4,7 @@
..()
/mob/living/verb/customsay()
- set category = "IC"
+ set category = "IC.Settings"
set name = "Customize Speech Verbs"
set desc = "Customize the text which appears when you type- e.g. 'says', 'asks', 'exclaims'."
@@ -25,7 +25,7 @@
/mob/living/verb/set_metainfo()
set name = "Set OOC Metainfo"
set desc = "Sets OOC notes about yourself or your RP preferences or status."
- set category = "OOC"
+ set category = "OOC.Game Settings"
if(usr != src)
return
@@ -100,7 +100,7 @@
/mob/living/verb/set_custom_link()
set name = "Set Custom Link"
set desc = "Set a custom link to show up with your examine text."
- set category = "IC"
+ set category = "IC.Settings"
if(usr != src)
return
@@ -117,7 +117,7 @@
/mob/living/verb/set_voice_freq()
set name = "Set Voice Frequency"
set desc = "Sets your voice frequency to be higher or lower pitched!"
- set category = "OOC"
+ set category = "OOC.Game Settings"
var/list/preset_voice_freqs = list("high" = MAX_VOICE_FREQ, "middle-high" = 56250, "middle" = 425000, "middle-low"= 28750, "low" = MIN_VOICE_FREQ, "custom" = 1, "random" = 0)
var/choice = tgui_input_list(src, "What would you like to set your voice frequency to?", "Voice Frequency", preset_voice_freqs)
@@ -138,7 +138,7 @@
/mob/living/verb/set_voice_type()
set name = "Set Voice Type"
set desc = "Sets your voice style!"
- set category = "OOC"
+ set category = "OOC.Game Settings"
var/list/possible_voice_types = list(
"beep-boop",
diff --git a/code/modules/mob/living/riding.dm b/code/modules/mob/living/riding.dm
index 5319895da70..1174ee30753 100644
--- a/code/modules/mob/living/riding.dm
+++ b/code/modules/mob/living/riding.dm
@@ -1,6 +1,6 @@
/mob/living/proc/toggle_rider_reins()
set name = "Give Reins"
- set category = "Abilities"
+ set category = "Abilities.General"
set desc = "Let people riding on you control your movement."
if(riding_datum)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 19c7f4bab62..74467c67a9e 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -347,7 +347,7 @@ var/list/ai_verbs_default = list(
update_use_power(USE_POWER_ACTIVE)
/mob/living/silicon/ai/proc/pick_icon()
- set category = "AI Settings"
+ set category = "AI.Settings"
set name = "Set AI Core Display"
if(stat || aiRestorePowerRoutine)
return
@@ -359,7 +359,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/var/message_cooldown = 0
/mob/living/silicon/ai/proc/ai_announcement()
- set category = "AI Commands"
+ set category = "AI.Station Commands"
set name = "Make Station Announcement"
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
return
@@ -380,7 +380,7 @@ var/list/ai_verbs_default = list(
message_cooldown = 0
/mob/living/silicon/ai/proc/ai_call_shuttle()
- set category = "AI Commands"
+ set category = "AI.Station Commands"
set name = "Call Emergency Shuttle"
if(check_unable(AI_CHECK_WIRELESS))
return
@@ -401,7 +401,7 @@ var/list/ai_verbs_default = list(
post_status(src, "shuttle", user = src)
/mob/living/silicon/ai/proc/ai_recall_shuttle()
- set category = "AI Commands"
+ set category = "AI.Station Commands"
set name = "Recall Emergency Shuttle"
if(check_unable(AI_CHECK_WIRELESS))
@@ -417,7 +417,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/var/emergency_message_cooldown = 0
/mob/living/silicon/ai/proc/ai_emergency_message()
- set category = "AI Commands"
+ set category = "AI.Station Commands"
set name = "Send Emergency Message"
if(check_unable(AI_CHECK_WIRELESS))
@@ -538,7 +538,7 @@ var/list/ai_verbs_default = list(
return 1
/mob/living/silicon/ai/cancel_camera()
- set category = "AI Commands"
+ set category = "AI.Camera Control"
set name = "Cancel Camera View"
view_core()
@@ -561,7 +561,7 @@ var/list/ai_verbs_default = list(
return cameralist
/mob/living/silicon/ai/proc/ai_network_change(var/network in get_camera_network_list())
- set category = "AI Commands"
+ set category = "AI.Camera Control"
set name = "Jump To Network"
unset_machine()
@@ -584,7 +584,7 @@ var/list/ai_verbs_default = list(
//End of code by Mord_Sith
/mob/living/silicon/ai/proc/ai_statuschange()
- set category = "AI Settings"
+ set category = "AI.Settings"
set name = "AI Status"
if(check_unable(AI_CHECK_WIRELESS))
@@ -597,7 +597,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/ai_hologram_change()
set name = "Change Hologram"
set desc = "Change the default hologram available to AI to something else."
- set category = "AI Settings"
+ set category = "AI.Settings"
if(check_unable())
return
@@ -725,7 +725,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/toggle_camera_light()
set name = "Toggle Camera Light"
set desc = "Toggles the light on the camera the AI is looking through."
- set category = "AI Commands"
+ set category = "AI.Camera Control"
if(check_unable())
return
@@ -799,7 +799,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/control_integrated_radio()
set name = "Radio Settings"
set desc = "Allows you to change settings of your radio."
- set category = "AI Settings"
+ set category = "AI.Settings"
if(check_unable(AI_CHECK_RADIO))
return
@@ -810,7 +810,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/sensor_mode()
set name = "Toggle Sensor Augmentation" //VOREStation Add
- set category = "AI Settings"
+ set category = "AI.Settings"
set desc = "Augment visual feed with internal sensor overlays"
sensor_type = !sensor_type //VOREStation Add
to_chat(usr, "You [sensor_type ? "enable" : "disable"] your sensors.") //VOREStation Add
@@ -818,7 +818,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/toggle_hologram_movement()
set name = "Toggle Hologram Movement"
- set category = "AI Settings"
+ set category = "AI.Settings"
set desc = "Toggles hologram movement based on moving with your virtual eye."
hologram_follow = !hologram_follow
@@ -910,7 +910,7 @@ var/list/ai_verbs_default = list(
// Pass lying down or getting up to our pet human, if we're in a rig.
/mob/living/silicon/ai/lay_down()
set name = "Rest"
- set category = "IC"
+ set category = "IC.Game"
resting = 0
var/obj/item/rig/rig = src.get_rig()
@@ -993,12 +993,12 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/toggle_multicam_verb()
set name = "Toggle Multicam"
- set category = "AI Commands"
+ set category = "AI.Camera Control"
toggle_multicam()
/mob/living/silicon/ai/proc/add_multicam_verb()
set name = "Add Multicam Viewport"
- set category = "AI Commands"
+ set category = "AI.Camera Control"
drop_new_multicam()
//Special subtype kept around for global announcements
diff --git a/code/modules/mob/living/silicon/ai/ai_remote_control.dm b/code/modules/mob/living/silicon/ai/ai_remote_control.dm
index cfe1d2873a1..c1871a0358f 100644
--- a/code/modules/mob/living/silicon/ai/ai_remote_control.dm
+++ b/code/modules/mob/living/silicon/ai/ai_remote_control.dm
@@ -67,7 +67,7 @@
target.post_deploy()
/mob/living/silicon/ai/proc/deploy_to_shell_act()
- set category = "AI Commands"
+ set category = "AI.Commands"
set name = "Deploy to Shell"
deploy_to_shell() // This is so the AI is not prompted with a list of all mobs when using the 'real' proc.
diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm
index 4afac25fbc6..37606a56610 100644
--- a/code/modules/mob/living/silicon/ai/latejoin.dm
+++ b/code/modules/mob/living/silicon/ai/latejoin.dm
@@ -12,7 +12,7 @@ var/global/list/empty_playable_ai_cores = list()
/mob/living/silicon/ai/verb/store_core()
set name = "Store Core"
- set category = "OOC"
+ set category = "OOC.Game"
set desc = "Enter intelligence storage. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm
index ad051cddff6..82874155ba6 100755
--- a/code/modules/mob/living/silicon/ai/laws.dm
+++ b/code/modules/mob/living/silicon/ai/laws.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/ai/proc/show_laws_verb()
- set category = "AI Commands"
+ set category = "AI.Commands"
set name = "Show Laws"
src.show_laws()
@@ -22,6 +22,6 @@
R.show_laws()
/mob/living/silicon/ai/proc/ai_checklaws()
- set category = "AI Commands"
+ set category = "AI.Commands"
set name = "State Laws"
subsystem_law_manager()
diff --git a/code/modules/mob/living/silicon/pai/admin.dm b/code/modules/mob/living/silicon/pai/admin.dm
index ebd161c4f22..6620035ffa8 100644
--- a/code/modules/mob/living/silicon/pai/admin.dm
+++ b/code/modules/mob/living/silicon/pai/admin.dm
@@ -1,7 +1,7 @@
// Originally a debug verb, made it a proper adminverb for ~fun~
/client/proc/makePAI(turf/t in view(), name as text, pai_key as null|text)
set name = "Make pAI"
- set category = "Admin"
+ set category = "Admin.Events"
if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG))
return
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 98d1a2ee6a8..8d22b5e96d1 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -227,7 +227,7 @@
return 1
/mob/living/silicon/pai/verb/reset_record_view()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Reset Records Software"
securityActive1 = null
@@ -240,7 +240,7 @@
to_chat(usr, span_notice("You reset your record-viewing software."))
/mob/living/silicon/pai/cancel_camera()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Cancel Camera View"
src.reset_view(null)
src.unset_machine()
@@ -251,7 +251,7 @@
// to it. Really this deserves its own file, but for the moment it can sit here. ~ Z
/mob/living/silicon/pai/verb/fold_out()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Unfold Chassis"
if(stat || sleeping || paralysis || weakened)
@@ -309,7 +309,7 @@
update_icon()
/mob/living/silicon/pai/verb/fold_up()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Collapse Chassis"
if(stat || sleeping || paralysis || weakened)
@@ -326,7 +326,7 @@
/* //VOREStation Removal Start
/mob/living/silicon/pai/proc/choose_chassis()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Choose Chassis"
var/choice
@@ -345,7 +345,7 @@
*/
/mob/living/silicon/pai/proc/choose_verbs()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Choose Speech Verbs"
var/choice = tgui_input_list(usr,"What theme would you like to use for your speech verbs?","Theme Choice", possible_say_verbs)
@@ -358,7 +358,7 @@
/mob/living/silicon/pai/lay_down()
set name = "Rest"
- set category = "IC"
+ set category = "IC.Game"
// Pass lying down or getting up to our pet human, if we're in a rig.
if(istype(src.loc,/obj/item/paicard))
@@ -522,7 +522,7 @@
/mob/living/silicon/pai/verb/allowmodification()
set name = "Change Access Modifcation Permission"
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set desc = "Allows people to modify your access or block people from modifying your access."
if(idaccessible == 0)
@@ -535,7 +535,7 @@
/mob/living/silicon/pai/verb/wipe_software()
set name = "Enter Storage"
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set desc = "Upload your personality to the cloud and wipe your software from the card. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
// Make sure people don't kill themselves accidentally
diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm
index 2e3c1ed1fee..eda552040e2 100644
--- a/code/modules/mob/living/silicon/pai/pai_vr.dm
+++ b/code/modules/mob/living/silicon/pai/pai_vr.dm
@@ -101,7 +101,7 @@
/mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1))
set name = "pAI Nom"
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set desc = "Allows you to eat someone while unfolded. Can't be used while in card form."
if (stat != CONSCIOUS)
@@ -173,7 +173,7 @@
//proc override to avoid pAI players being invisible while the chassis selection window is open
/mob/living/silicon/pai/proc/choose_chassis()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Choose Chassis"
var/choice
@@ -206,7 +206,7 @@
update_icon()
/mob/living/silicon/pai/verb/toggle_eyeglow()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Toggle Eye Glow"
if(chassis in allows_eye_color)
@@ -222,7 +222,7 @@
/mob/living/silicon/pai/verb/pick_eye_color()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Pick Eye Color"
if(chassis in allows_eye_color)
else
@@ -408,7 +408,7 @@
return 1
/mob/living/silicon/pai/verb/save_pai_to_slot()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Save Configuration"
savefile_save(src)
to_chat(src, span_filter_notice("[name] configuration saved to global pAI settings."))
@@ -444,7 +444,7 @@
/mob/living/silicon/pai/verb/toggle_gender_identity_vr()
set name = "Set Gender Identity"
set desc = "Sets the pronouns when examined and performing an emote."
- set category = "IC"
+ set category = "IC.Settings"
var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity:", "Set Gender Identity", list(FEMALE, MALE, NEUTER, PLURAL, HERM))
if(!new_gender_identity)
return 0
@@ -454,7 +454,7 @@
/mob/living/silicon/pai/verb/pai_hide()
set name = "Hide"
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
- set category = "Abilities"
+ set category = "Abilities.pAI"
hide()
if(status_flags & HIDING)
@@ -464,7 +464,7 @@
update_icon()
/mob/living/silicon/pai/verb/screen_message(message as text|null)
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Screen Message"
set desc = "Allows you to display a message on your screen. This will show up in the chat of anyone who is holding your card."
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 9e52af2bec2..700634ea630 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -39,7 +39,7 @@ var/global/list/default_pai_software = list()
software = default_pai_software.Copy()
/mob/living/silicon/pai/verb/paiInterface()
- set category = "pAI Commands"
+ set category = "Abilities.pAI Commands"
set name = "Software Interface"
tgui_interact(src)
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index f89061e88ed..d57d1092a6c 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -21,7 +21,20 @@
src.owner = R
/datum/robot_component/proc/install()
+ if(istype(wrapped, /obj/item/robot_parts/robot_component))
+ var/obj/item/robot_parts/robot_component/comp = wrapped
+ max_damage = comp.max_damage
+ idle_usage = comp.idle_usage
+ active_usage = comp.active_usage
+ return
+ if(istype(wrapped, /obj/item/cell))
+ var/obj/item/cell/cell = wrapped
+ max_damage = cell.robot_durability
+
/datum/robot_component/proc/uninstall()
+ max_damage = initial(max_damage)
+ idle_usage = initial(idle_usage)
+ active_usage = initial(active_usage)
/datum/robot_component/proc/destroy()
var/brokenstate = "broken" // Generic icon
@@ -231,24 +244,34 @@
var/brute = 0
var/burn = 0
var/icon_state_broken = "broken"
+ var/idle_usage = 0
+ var/active_usage = 0
+ var/max_damage = 0
/obj/item/robot_parts/robot_component/binary_communication_device
name = "binary communication device"
desc = "A module used for binary communications over encrypted frequencies, commonly used by synthetic robots."
icon_state = "binradio"
icon_state_broken = "binradio_broken"
+ idle_usage = 5
+ active_usage = 25
+ max_damage = 30
/obj/item/robot_parts/robot_component/actuator
name = "actuator"
desc = "A modular, hydraulic actuator used by exosuits and robots alike for movement and manipulation."
icon_state = "motor"
icon_state_broken = "motor_broken"
+ idle_usage = 0
+ active_usage = 200
+ max_damage = 50
/obj/item/robot_parts/robot_component/armour
name = "armour plating"
desc = "A pair of flexible, adaptable armor plates, used to protect the internals of robots."
icon_state = "armor"
icon_state_broken = "armor_broken"
+ max_damage = 90
/obj/item/robot_parts/robot_component/armour_platform
name = "platform armour plating"
@@ -256,21 +279,64 @@
icon_state = "armor"
icon_state_broken = "armor_broken"
color = COLOR_GRAY80
+ max_damage = 140
/obj/item/robot_parts/robot_component/camera
name = "camera"
desc = "A modified camera module used as a visual receptor for robots and exosuits, also serving as a relay for wireless video feed."
icon_state = "camera"
icon_state_broken = "camera_broken"
+ idle_usage = 10
+ max_damage = 40
/obj/item/robot_parts/robot_component/diagnosis_unit
name = "diagnosis unit"
desc = "An internal computer and sensors used by robots and exosuits to accurately diagnose any system discrepancies on their components."
icon_state = "analyser"
icon_state_broken = "analyser_broken"
+ active_usage = 1000
+ max_damage = 30
/obj/item/robot_parts/robot_component/radio
name = "radio"
desc = "A modular, multi-frequency radio used by robots and exosuits to enable communication systems. Comes with built-in subspace receivers."
icon_state = "radio"
- icon_state_broken = "radio_broken"
\ No newline at end of file
+ icon_state_broken = "radio_broken"
+ idle_usage = 15
+ active_usage = 75
+ max_damage = 40
+
+// Improved components
+/obj/item/robot_parts/robot_component/binary_communication_device/upgraded
+ name = "improved binary communication device"
+ idle_usage = 2.5
+ active_usage = 12.5
+ max_damage = 45
+
+/obj/item/robot_parts/robot_component/radio/upgraded
+ name = "improved radio"
+ idle_usage = 5
+ active_usage = 35
+ max_damage = 40
+
+/obj/item/robot_parts/robot_component/actuator/upgraded
+ name = "improved actuator"
+ idle_usage = 0
+ active_usage = 100
+ max_damage = 75
+
+/obj/item/robot_parts/robot_component/diagnosis_unit/upgraded
+ name = "improved self-diagnosis unit"
+ active_usage = 500
+ max_damage = 45
+
+/obj/item/robot_parts/robot_component/camera/upgraded
+ name = "improved camera"
+ idle_usage = 5
+ max_damage = 60
+
+/obj/item/robot_parts/robot_component/armour/armour_titan
+ name = "prototype armour plating"
+ desc = "A pair of flexible, adaptable armor plates, used to protect the internals of robots."
+ max_damage = 220
+ color = COLOR_OFF_WHITE
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index ba2c6ef4fa6..fd1132d05a8 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -172,7 +172,7 @@ var/list/mob_hat_cache = list()
/mob/living/silicon/robot/drone/verb/pick_shell()
set name = "Customize Appearance"
- set category = "Abilities.Silicon"
+ set category = "Abilities.Settings"
if(!can_pick_shell)
to_chat(src, span_warning("You already selected a shell or this drone type isn't customizable."))
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index 18da1013249..91f4c79b5e6 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -94,7 +94,7 @@
/mob/observer/dead/verb/join_as_drone()
- set category = "Ghost"
+ set category = "Ghost.Join"
set name = "Join As Drone"
set desc = "If there is a powered, enabled fabricator in the game world with a prepared chassis, join as a maintenance drone."
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 1610036f16f..a79310c02be 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -430,7 +430,7 @@
/mob/living/silicon/robot/verb/namepick()
set name = "Pick Name"
- set category = "Abilities.Silicon"
+ set category = "Abilities.Settings"
if(custom_name)
to_chat(usr, "You can't pick another custom name. [isshell(src) ? "" : "Go ask for a name change."]")
@@ -448,7 +448,7 @@
/mob/living/silicon/robot/verb/extra_customization()
set name = "Customize Appearance"
- set category = "Abilities.Silicon"
+ set category = "Abilities.Settings"
set desc = "Customize your appearance (assuming your chosen sprite allows)."
if(!sprite_datum || !sprite_datum.has_extra_customization)
@@ -502,7 +502,7 @@
// function to toggle VTEC once installed
/mob/living/silicon/robot/proc/toggle_vtec()
set name = "Toggle VTEC"
- set category = "Abilities"
+ set category = "Abilities.Silicon"
vtec_active = !vtec_active
hud_used.toggle_vtec_control()
to_chat(src, span_filter_notice("VTEC module [vtec_active ? "enabled" : "disabled"]."))
@@ -803,7 +803,7 @@
/mob/living/silicon/robot/proc/ColorMate()
set name = "Recolour Module"
- set category = "Abilities.Silicon"
+ set category = "Abilities.Settings"
set desc = "Allows to recolour once."
if(!has_recoloured)
@@ -1369,7 +1369,7 @@
/mob/living/silicon/robot/verb/rest_style()
set name = "Switch Rest Style"
set desc = "Select your resting pose."
- set category = "IC"
+ set category = "IC.Settings"
if(!sprite_datum || !sprite_datum.has_rest_sprites || sprite_datum.rest_sprite_options.len < 1)
to_chat(src, span_notice("Your current appearance doesn't have any resting styles!"))
@@ -1387,7 +1387,7 @@
/mob/living/silicon/robot/verb/robot_nom(var/mob/living/T in living_mobs(1))
set name = "Robot Nom"
- set category = "IC"
+ set category = "Abilities.Vore"
set desc = "Allows you to eat someone."
if (stat != CONSCIOUS)
@@ -1461,7 +1461,7 @@
/mob/living/silicon/robot/proc/robot_mount(var/mob/living/M in living_mobs(1))
set name = "Robot Mount/Dismount"
- set category = "Abilities"
+ set category = "Abilities.General"
set desc = "Let people ride on you."
if(LAZYLEN(buckled_mobs))
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index 907148e453e..1ad7f5c48f0 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -6,6 +6,12 @@
health = getMaxHealth() - (getBruteLoss() + getFireLoss())
return
+/mob/living/silicon/robot/getMaxHealth()
+ . = ..()
+ for(var/V in components)
+ var/datum/robot_component/C = components[V]
+ . += C.max_damage - initial(C.max_damage)
+
/mob/living/silicon/robot/getBruteLoss()
var/amount = 0
for(var/V in components)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 3f3d1016687..3f917a15ce3 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -257,14 +257,14 @@
/mob/living/silicon/verb/pose()
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
- set category = "IC"
+ set category = "IC.Settings"
pose = strip_html_simple(tgui_input_text(usr, "This is [src]. It is...", "Pose", null))
/mob/living/silicon/verb/set_flavor()
set name = "Set Flavour Text"
set desc = "Sets an extended description of your character's features."
- set category = "IC"
+ set category = "IC.Settings"
var/new_flavortext = strip_html_simple(tgui_input_text(usr, "Please enter your new flavour text.", "Flavour text", flavor_text, multiline = TRUE))
if(new_flavortext)
diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm
index e063e5b94a7..2eff632c3a4 100644
--- a/code/modules/mob/living/simple_mob/simple_mob.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob.dm
@@ -350,7 +350,7 @@
/mob/living/simple_mob/proc/ColorMate()
set name = "Recolour"
- set category = "Abilities"
+ set category = "Abilities.Settings"
set desc = "Allows to recolour once."
if(!has_recoloured)
@@ -363,7 +363,7 @@
/mob/living/simple_mob/proc/hunting_vision()
set name = "Track Prey Through Walls"
- set category = "Abilities"
+ set category = "Abilities.Mob"
set desc = "Uses you natural predatory instincts to seek out prey even through walls, or your natural survival instincts to spot predators from a distance."
if(hunting_cooldown + 5 MINUTES < world.time)
@@ -378,7 +378,7 @@
/mob/living/simple_mob/proc/hunting_vision_plus()
set name = "Thermal vision toggle"
- set category = "Abilities"
+ set category = "Abilities.Mob"
set desc = "Uses you natural predatory instincts to seek out prey even through walls, or your natural survival instincts to spot predators from a distance."
if(!isthermal)
diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
index b4f999bc830..6a4ba095f94 100644
--- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
@@ -367,7 +367,7 @@
/mob/living/simple_mob/proc/animal_mount(var/mob/living/M in living_mobs(1))
set name = "Animal Mount/Dismount"
- set category = "Abilities"
+ set category = "Abilities.Mob"
set desc = "Let people ride on you."
if(LAZYLEN(buckled_mobs))
@@ -402,7 +402,7 @@
/mob/living/simple_mob/proc/leap()
set name = "Pounce Target"
- set category = "Abilities"
+ set category = "Abilities.Mob"
set desc = "Select a target to pounce at."
if(last_special > world.time)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
index 67fe95dba1b..e951368c32e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
@@ -284,7 +284,7 @@
/mob/living/simple_mob/vore/alienanimals/catslug/proc/catslug_color()
set name = "Pick Color"
- set category = "Abilities"
+ set category = "Abilities.Settings"
set desc = "You can set your color!"
if(picked_color)
to_chat(src, span_notice("You have already picked a color! If you picked the wrong color, ask an admin to change your picked_color variable to 0."))
@@ -1112,7 +1112,7 @@
/mob/living/simple_mob/vore/alienanimals/catslug/suslug/proc/assussinate()
set name = "Kill Innocent"
- set category = "Abilities"
+ set category = "Abilities.Catslug"
set desc = "Kill an innocent suslug!"
if(!is_impostor)
to_chat(src, span_notice("You are not an impostor! You can't kill like that!"))
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
index 1fa6963c687..6bf397a3814 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
@@ -187,14 +187,14 @@
/mob/living/simple_mob/vore/overmap/stardog/verb/eject()
set name = "Eject"
set desc = "Stop controlling the dog and return to your own body."
- set category = "Abilities"
+ set category = "Abilities.Stardog"
control_node.eject()
/mob/living/simple_mob/vore/overmap/stardog/verb/eat_space_weather()
set name = "Eat Space Weather"
set desc = "Eat carp or rocks!"
- set category = "Abilities"
+ set category = "Abilities.Stardog"
var/obj/effect/overmap/event/E
var/nut = 0
@@ -297,7 +297,7 @@
/mob/living/simple_mob/vore/overmap/stardog/verb/transition() //Don't ask how it works. I don't know. I didn't think about it. I just thought it would be cool.
set name = "Transition"
set desc = "Attempt to go to the location you have arrived at, or return to space!"
- set category = "Abilities"
+ set category = "Abilities.Stardog"
if(nutrition <= 500)
to_chat(src, span_warning("You're too hungry..."))
return
@@ -451,7 +451,7 @@
/turf/simulated/floor/outdoors/fur/verb/pet()
set name = "Pet Fur"
set desc = "Pet the fur!"
- set category = "IC"
+ set category = "IC.Stardog"
set src in oview(1)
usr.visible_message(span_notice("\The [usr] pets \the [src]."), span_notice("You pet \the [src]."), runemessage = "pet pat...")
@@ -466,7 +466,7 @@
/turf/simulated/floor/outdoors/fur/verb/emote_beyond(message as message) //Now even the stars will know your sin.
set name = "Emote Beyond"
set desc = "Emote to those beyond the fur!"
- set category = "IC"
+ set category = "IC.Chat"
set src in oview(1)
if(!isliving(usr))
@@ -1139,7 +1139,7 @@
/obj/machinery/computer/ship/navigation/verb/emote_beyond(message as message) //I could have put this into any other file but right here will do
set name = "Emote Beyond"
set desc = "Emote to those beyond the ship!"
- set category = "IC"
+ set category = "IC.Chat"
set src in oview(7)
if(!isliving(usr))
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
index 50704e1fa9c..4f9e9188c28 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
@@ -962,7 +962,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
//
/mob/living/simple_mob/vore/alienanimals/teppi/proc/produce_offspring()
set name = "Produce Offspring"
- set category = "Abilities"
+ set category = "Abilities.Teppi"
set desc = "You can have babies if the conditions are right."
if(prevent_breeding)
to_chat(src, span_notice("You have elected to not participate in breeding mechanics, and so cannot complete that action."))
@@ -1004,7 +1004,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
/mob/living/simple_mob/vore/alienanimals/teppi/proc/toggle_producing_offspring()
set name = "Toggle Producing Offspring"
- set category = "Abilities"
+ set category = "Abilities.Teppi"
set desc = "You can toggle whether or not you can produce offspring."
if(!prevent_breeding)
to_chat(src, span_notice("You disable breeding."))
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm
index 51d338364cd..836e4b70410 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/animal.dm
@@ -31,7 +31,7 @@
/mob/living/simple_mob/animal/verb/set_flavour_text()
set name = "Set Flavour Text"
- set category = "IC"
+ set category = "IC.Settings"
set desc = "Set your flavour text."
set src = usr
var/new_flavour_text = sanitize((input("Please describe yourself.", "Flavour Text", flavor_text) as message|null), MAX_MESSAGE_LEN)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm
index 160ddbdeff5..85087a9b154 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm
@@ -1,5 +1,5 @@
/mob/living/simple_mob/animal/borer/verb/release_host()
- set category = "Abilities"
+ set category = "Abilities.Borer"
set name = "Release Host"
set desc = "Slither out of your host."
@@ -39,7 +39,7 @@
leave_host()
/mob/living/simple_mob/animal/borer/verb/infest()
- set category = "Abilities"
+ set category = "Abilities.Borer"
set name = "Infest"
set desc = "Infest a suitable humanoid host."
@@ -127,7 +127,7 @@
/*
/mob/living/simple_mob/animal/borer/verb/devour_brain()
- set category = "Abilities"
+ set category = "Abilities.Borer"
set name = "Devour Brain"
set desc = "Take permanent control of a dead host."
@@ -200,7 +200,7 @@
H.lastKnownIP = s2h_ip
/mob/living/simple_mob/animal/borer/verb/secrete_chemicals()
- set category = "Abilities"
+ set category = "Abilities.Borer"
set name = "Secrete Chemicals"
set desc = "Push some chemicals into your host's bloodstream."
@@ -228,7 +228,7 @@
chemicals -= 50
/mob/living/simple_mob/animal/borer/verb/dominate_victim()
- set category = "Abilities"
+ set category = "Abilities.Borer"
set name = "Paralyze Victim"
set desc = "Freeze the limbs of a potential host with supernatural fear."
@@ -268,7 +268,7 @@
used_dominate = world.time
/mob/living/simple_mob/animal/borer/verb/bond_brain()
- set category = "Abilities"
+ set category = "Abilities.Borer"
set name = "Assume Control"
set desc = "Fully connect to the brain of your host."
@@ -339,7 +339,7 @@
return
/mob/living/carbon/human/proc/jumpstart()
- set category = "Abilities"
+ set category = "Abilities.Borer"
set name = "Revive Host"
set desc = "Send a jolt of electricity through your host, reviving them."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm
index 439bf98b10b..e67402e0a36 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/phorogenic.dm
@@ -63,22 +63,16 @@
adjust_scale(1.25)
return ..()
+/mob/living/simple_mob/animal/giant_spider/phorogenic/proc/explode()
+ if(src && !exploded)
+ visible_message(span_danger("\The [src]'s body detonates!"))
+ exploded = TRUE
+ explosion(src.loc, explosion_dev_range, explosion_heavy_range, explosion_light_range, explosion_flash_range)
+
/mob/living/simple_mob/animal/giant_spider/phorogenic/death()
visible_message(span_critical("\The [src]'s body begins to rupture!"))
var/delay = rand(explosion_delay_lower, explosion_delay_upper)
- spawn(0)
- // Flash black and red as a warning.
- for(var/i = 1 to delay)
- if(i % 2 == 0)
- color = "#000000"
- else
- color = "#FF0000"
- sleep(1)
-
- spawn(delay)
- // The actual boom.
- if(src && !exploded)
- visible_message(span_danger("\The [src]'s body detonates!"))
- exploded = TRUE
- explosion(src.loc, explosion_dev_range, explosion_heavy_range, explosion_light_range, explosion_flash_range)
+ animate(src, color = "#000000", time = 0.1 SECONDS, loop = ceil(delay/2))
+ animate(color = "#FF0000", time = 0.1 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(explode)), delay, TIMER_DELETE_ME)
return ..()
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
index 33a46f63ac1..5dbc635a9c4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
@@ -97,7 +97,7 @@ var/list/_cat_default_emotes = list(
/mob/living/simple_mob/animal/passive/cat/verb/become_friends()
set name = "Become Friends"
- set category = "IC"
+ set category = "IC.Game"
set src in view(1)
var/mob/living/L = usr
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm
index 9a73a80ac11..d42cb23b098 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm
@@ -108,7 +108,7 @@
/mob/living/simple_mob/animal/passive/fox/renault/verb/become_friends()
set name = "Become Friends"
- set category = "IC"
+ set category = "IC.Game"
set src in view(1)
var/mob/living/L = usr
@@ -167,7 +167,7 @@
/mob/living/simple_mob/animal/passive/fox/fluff/verb/friend()
set name = "Become Friends"
- set category = "IC"
+ set category = "IC.Game"
set src in view(1)
if(friend && usr == friend)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm
index e0d523d3fac..127295f6156 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm
@@ -103,7 +103,7 @@ Field studies suggest analytical abilities on par with some species of cepholapo
/mob/living/simple_mob/animal/sif/grafadreka/verb/sit_down()
set name = "Sit Down"
- set category = "IC"
+ set category = "IC.Grafadreka"
if(sitting)
resting = FALSE
@@ -132,7 +132,7 @@ Field studies suggest analytical abilities on par with some species of cepholapo
icon_rest = "doggo_lying"
projectileverb = "spits"
friendly = list("headbutts", "grooms", "play-bites", "rubs against")
- bitesize = 10 // chomp
+ bitesize = 10
gender = NEUTER
has_langs = list("Drake")
@@ -564,7 +564,7 @@ var/global/list/wounds_being_tended_by_drakes = list()
/mob/living/simple_mob/animal/sif/grafadreka/verb/rally_pack()
set name = "Rally Pack"
set desc = "Tries to command your fellow pack members to follow you."
- set category = "Abilities"
+ set category = "Abilities.Grafadreka"
if(!has_modifier_of_type(/datum/modifier/ace))
to_chat(src, span_warning("You aren't the pack leader! Sit down!"))
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm
index d6acfd76d01..b5ead809147 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm
@@ -143,7 +143,7 @@
return ..()
/mob/living/simple_mob/animal/sif/kururak/verb/do_flash()
- set category = "Abilities"
+ set category = "Abilities.Kururak"
set name = "Tail Blind"
set desc = "Disorient a creature within range."
@@ -229,7 +229,7 @@
R.flash_eyes()
/mob/living/simple_mob/animal/sif/kururak/verb/do_strike()
- set category = "Abilities"
+ set category = "Abilities.Kururak"
set name = "Rending Strike"
set desc = "Strike viciously at an entity within range."
@@ -294,7 +294,7 @@
/mob/living/simple_mob/animal/sif/kururak/verb/rally_pack() // Mostly for telling other players to follow you. AI Kururaks will auto-follow, if set to.
set name = "Rally Pack"
set desc = "Tries to command your fellow pack members to follow you."
- set category = "Abilities"
+ set category = "Abilities.Kururak"
if(has_modifier_of_type(/datum/modifier/ace))
for(var/mob/living/simple_mob/animal/sif/kururak/K in hearers(7, src))
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm
index 5e455483938..83aba9a0018 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm
@@ -225,7 +225,7 @@
leave_host()
/mob/living/simple_mob/animal/sif/leech/verb/infest()
- set category = "Abilities"
+ set category = "Abilities.Leech"
set name = "Infest"
set desc = "Infest a suitable humanoid host."
@@ -312,7 +312,7 @@
return
/mob/living/simple_mob/animal/sif/leech/verb/uninfest()
- set category = "Abilities"
+ set category = "Abilities.Leech"
set name = "Uninfest"
set desc = "Leave your current host."
@@ -336,7 +336,7 @@
host = null
/mob/living/simple_mob/animal/sif/leech/verb/inject_victim()
- set category = "Abilities"
+ set category = "Abilities.Leech"
set name = "Incapacitate Potential Host"
set desc = "Inject an organic host with an incredibly painful mixture of chemicals."
@@ -384,7 +384,7 @@
H.add_modifier(/datum/modifier/poisoned/paralysis, 15 SECONDS)
/mob/living/simple_mob/animal/sif/leech/verb/medicate_host()
- set category = "Abilities"
+ set category = "Abilities.Leech"
set name = "Produce Chemicals (50)"
set desc = "Inject your host with possibly beneficial chemicals, to keep the blood flowing."
@@ -407,7 +407,7 @@
to_chat(src, span_alien("We injected \the [host] with five units of [chem]."))
/mob/living/simple_mob/animal/sif/leech/verb/feed_on_organ()
- set category = "Abilities"
+ set category = "Abilities.Leech"
set name = "Feed on Organ"
set desc = "Extend probosci to feed on a piece of your host's organs."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm
index 0798f487d7d..ad9f9623304 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm
@@ -72,7 +72,7 @@
/mob/living/simple_mob/animal/sif/sakimm/verb/remove_hat()
set name = "Remove Hat"
set desc = "Remove the animal's hat. You monster."
- set category = "Abilities"
+ set category = "Abilities.Sakimm"
set src in view(1)
drop_hat(usr)
@@ -95,7 +95,7 @@
/mob/living/simple_mob/animal/sif/sakimm/verb/give_hat()
set name = "Give Hat"
set desc = "Give the animal a hat. You hero."
- set category = "Abilities"
+ set category = "Abilities.Sakimm"
set src in view(1)
take_hat(usr)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm
index 79ccba68273..934dfebb48a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/savik.dm
@@ -78,7 +78,7 @@
/mob/living/simple_mob/animal/sif/savik/verb/berserk()
set name = "Berserk"
set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards."
- set category = "Abilities"
+ set category = "Abilities.Savik"
add_modifier(/datum/modifier/berserk, 30 SECONDS)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
index 37644c4116c..9615b97cd2e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm
@@ -77,7 +77,7 @@
/mob/living/simple_mob/animal/sif/shantak/leader/verb/rally_pack()
set name = "Rally Pack"
set desc = "Commands your fellow packmembers to follow you, the leader."
- set category = "Abilities"
+ set category = "Abilities.Shantak"
for(var/mob/living/simple_mob/animal/sif/shantak/S in hearers(7, src))
if(istype(S, /mob/living/simple_mob/animal/sif/shantak/leader)) // Leaders won't follow other leaders. Also avoids trying to follow ourselves.
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm
index 7270b2c4918..d2b1466df0e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/bear.dm
@@ -44,6 +44,6 @@
/mob/living/simple_mob/animal/space/bear/verb/berserk()
set name = "Berserk"
set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards."
- set category = "Abilities"
+ set category = "Abilities.Bear"
add_modifier(/datum/modifier/berserk, 30 SECONDS)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm
index 0d5ad98cae0..e6b642b6d80 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm
@@ -42,7 +42,7 @@
/mob/living/simple_mob/animal/space/goose/verb/berserk()
set name = "Berserk"
set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards."
- set category = "Abilities"
+ set category = "Abilities.Goose"
add_modifier(/datum/modifier/berserk, 30 SECONDS)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm
index 082f6342d04..e4ade300323 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/space_vr.dm
@@ -1,3 +1,3 @@
// Fix for Virgo 2's Surface
/mob/living/simple_mob/animal/space
- maxbodytemp = 700
\ No newline at end of file
+ maxbodytemp = 700
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm
index 47be9833390..9ea34022f96 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm
@@ -124,7 +124,7 @@
/mob/living/simple_mob/animal/space/space_worm/head/verb/toggle_devour()
set name = "Toggle Feeding"
set desc = "Extends your teeth for 30 seconds so that you can chew through mobs and structures alike."
- set category = "Abilities"
+ set category = "Abilities.Worm"
if(world.time < time_maw_opened + maw_cooldown)
if(open_maw)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm
index c6a8f0ac948..ded0cdb570d 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm
@@ -208,7 +208,7 @@
/mob/living/simple_mob/vore/squirrel/verb/squirrel_color()
set name = "Pick Color"
- set category = "Abilities"
+ set category = "Abilities.Settings"
set desc = "You can set your color!"
if(picked_color)
to_chat(src, span_notice("You have already picked a color! If you picked the wrong color, ask an admin to change your picked_color variable to 0."))
diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
index 115e0cb4101..eabe9b296ca 100644
--- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm
@@ -87,14 +87,23 @@
intelligence_level = AI_SMART // Also knows not to walk while confused if it risks death.
threaten_delay = 30 SECONDS // Mercs will give you 30 seconds to leave or get shot.
+/datum/ai_holder/simple_mob/merc/guard_limit
+ guard_limit = TRUE
+
/datum/ai_holder/simple_mob/merc/ranged
pointblank = TRUE // They get close? Just shoot 'em!
firing_lanes = TRUE // But not your buddies!
conserve_ammo = TRUE // And don't go wasting bullets!
+/datum/ai_holder/simple_mob/merc/ranged/guard_limit
+ guard_limit = TRUE
+
/datum/ai_holder/simple_mob/merc/ranged/sniper
vision_range = 14 // We're a person with a long-ranged gun.
+/datum/ai_holder/simple_mob/merc/ranged/sniper/guard_limit
+ guard_limit = TRUE
+
/datum/ai_holder/simple_mob/merc/ranged/sniper/max_range(atom/movable/AM)
return holder.ICheckRangedAttack(AM) ? 14 : 1
@@ -426,3 +435,42 @@
/obj/item/grenade/spawnergrenade/manhacks/mercenary = 50,
/obj/item/grenade/spawnergrenade/manhacks/mercenary = 30
)
+
+
+////////////////////////////////
+// Stealth Mission Mercs
+////////////////////////////////
+
+// Most likely to drop a broken weapon matching them, if it's a gun.
+/mob/living/simple_mob/humanoid/merc/melee/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/melee/sword/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/smg/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/laser/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/ionrifle/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/grenadier/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/rifle/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/rifle/mag/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/technician/poi/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/guard_limit
+
+/mob/living/simple_mob/humanoid/merc/ranged/sniper/guard_limit
+ ai_holder_type = /datum/ai_holder/simple_mob/merc/ranged/sniper/guard_limit
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
index 44a4ba3e326..86a6ad2c659 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/durand.dm
@@ -60,7 +60,7 @@
/mob/living/simple_mob/mechanical/mecha/combat/durand/verb/toggle_defense_mode()
set name = "Toggle Defense Mode"
set desc = "Toggles a special mode which makes you immobile and much more resilient."
- set category = "Abilities"
+ set category = "Abilities.Durand"
set_defense_mode(!defense_mode)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
index d3fc35c3c37..3036edd2f20 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
@@ -276,14 +276,14 @@ I think I covered everything.
/mob/living/simple_mob/vore/bigdragon/proc/toggle_glow()
set name = "Toggle Glow"
set desc = "Switch between glowing and not glowing."
- set category = "Abilities"
+ set category = "Abilities.Settings"
glow_toggle = !glow_toggle
/mob/living/simple_mob/vore/bigdragon/proc/sprite_toggle()
set name = "Toggle Small Sprite"
set desc = "Switches your sprite to a smaller variant so you can see what you're doing. Others will always see your standard sprite instead. "
- set category = "Abilities"
+ set category = "Abilities.Settings"
if(!small)
var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = src)
@@ -298,7 +298,7 @@ I think I covered everything.
/mob/living/simple_mob/vore/bigdragon/proc/flame_toggle()
set name = "Toggle breath attack"
set desc = "Toggles whether you will breath attack on harm intent (If you have one)."
- set category = "Abilities"
+ set category = "Abilities.Settings"
if(norange)
to_chat(src, span_userdanger("You don't have a breath attack!"))
@@ -310,7 +310,7 @@ I think I covered everything.
/mob/living/simple_mob/vore/bigdragon/proc/special_toggle()
set name = "Toggle special attacks"
set desc = "Toggles whether you will tail spin and charge (If you have them)."
- set category = "Abilities"
+ set category = "Abilities.Settings"
if(nospecial)
to_chat(src, span_userdanger("You don't have special attacks!"))
@@ -419,7 +419,7 @@ I think I covered everything.
/mob/living/simple_mob/vore/bigdragon/proc/set_style()
set name = "Set Dragon Style"
set desc = "Customise your icons."
- set category = "Abilities"
+ set category = "Abilities.Settings"
var/list/options = list("Underbelly","Body","Ears","Mane","Horns","Eyes")
for(var/option in options)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm
index 73b9cc71ef2..48101c4742a 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm
@@ -1,7 +1,7 @@
/mob/living/simple_mob/vore/demon/verb/blood_crawl()
set name = "Bloodcrawl"
set desc = "Shift out of reality using blood as your gateway"
- set category = "Abilities"
+ set category = "Abilities.Demon"
var/turf/T = get_turf(src)
if(!T.CanPass(src,T) || loc != T)
@@ -108,7 +108,7 @@
/mob/living/simple_mob/vore/demon/verb/phase_shift()
set name = "Phase Shift"
set desc = "Shift out of reality temporarily"
- set category = "Abilities"
+ set category = "Abilities.Demon"
var/turf/T = get_turf(src)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
index 79f2432c44a..28c9c8fb3ea 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
@@ -172,7 +172,7 @@
//Welcome to the adapted borer code.
/mob/proc/dominate_predator()
- set category = "Abilities"
+ set category = "Abilities.Vore"
set name = "Dominate Predator"
set desc = "Connect to and dominate the brain of your predator."
@@ -271,7 +271,7 @@
qdel(prey)
/mob/proc/release_predator()
- set category = "Abilities"
+ set category = "Abilities.Vore"
set name = "Restore Control"
set desc = "Release control of your predator's body."
@@ -289,7 +289,7 @@
remove_verb(src, /mob/proc/release_predator)
/mob/living/dominated_brain/proc/resist_control()
- set category = "Abilities"
+ set category = "Abilities.Vore"
set name = "Resist Control"
set desc = "Attempt to resist control."
if(pred_body.ckey == pred_ckey)
@@ -308,7 +308,7 @@
to_chat(src, span_warning("\The [pred_body] is already dominated, and cannot be controlled at this time."))
/mob/living/proc/dominate_prey()
- set category = "Abilities"
+ set category = "Abilities.Vore"
set name = "Dominate Prey"
set desc = "Connect to and dominate the brain of your prey."
@@ -378,7 +378,7 @@
to_chat(M, span_warning("Your mind is gathered into \the [src], becoming part of them..."))
/mob/living/dominated_brain/proc/cease_this_foolishness()
- set category = "Abilities"
+ set category = "Abilities.Vore"
set name = "Return to Body"
set desc = "If your body is inside of your predator still, attempts to re-insert yourself into it."
@@ -405,7 +405,7 @@
remove_verb(src, /mob/living/dominated_brain/proc/cease_this_foolishness)
/mob/living/proc/lend_prey_control()
- set category = "Abilities"
+ set category = "Abilities.Vore"
set name = "Give Prey Control"
set desc = "Allow prey control of your body."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
index 5b35207b545..81e756e5277 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
@@ -135,7 +135,7 @@
/mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow()
set name = "Toggle Glow"
set desc = "Switch between glowing and not glowing."
- set category = "Abilities"
+ set category = "Abilities.Leopardmander"
glow_toggle = !glow_toggle
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm b/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm
new file mode 100644
index 00000000000..dacbebb57da
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm
@@ -0,0 +1,63 @@
+/mob/living/simple_mob/vore/aggressive/macrophage
+ name = "Germ"
+ desc = "A giant virus!"
+ icon = 'icons/mob/macrophage.dmi'
+ icon_state = "macrophage-1"
+
+ faction = FACTION_MACROBACTERIA
+ maxHealth = 60
+ health = 60
+
+ var/datum/disease/base_disease = null
+ var/list/infections = list()
+
+ melee_damage_lower = 1
+ melee_damage_upper = 5
+ grab_resist = 100
+ see_in_dark = 8
+
+ response_help = "shoos"
+ response_disarm = "swats away"
+ response_harm = "squashes"
+ attacktext = list("squashed")
+ friendly = list("shoos", "rubs")
+
+ vore_bump_chance = "attempts to absorb"
+
+ vore_active = TRUE
+ vore_capacity = 1
+
+ can_be_drop_prey = FALSE
+ allow_mind_transfer = TRUE
+
+ ai_holder_type = /datum/ai_holder/simple_mob/melee
+
+/mob/living/simple_mob/vore/aggressive/macrophage/green
+ icon_state = "macrophage-2"
+
+/mob/living/simple_mob/vore/aggressive/macrophage/pink
+ icon_state = "macrophage-3"
+
+/mob/living/simple_mob/vore/aggressive/macrophage/blue
+ icon_state = "macrophage-4"
+
+/obj/belly/macrophage
+ name = "capsid"
+ fancy_vore = TRUE
+ contamination_color = "green"
+ vore_verb = "absorb"
+ escapable = TRUE
+ escapable = 5
+ desc = "In an attempt to get away from the giant virus, it's oversized envelope proteins dragged you right past it's matrix, encapsulating you deep inside it's capsid... The strange walls kneading and keeping you tight along within it's nucleoprotein."
+ belly_fullscreen = "VBO_gematically_angular"
+ belly_fullscreen_color = "#87d8d8"
+ digest_mode = DM_ABSORB
+ affects_vore_sprites = FALSE
+
+/mob/living/simple_mob/vore/aggressive/macrophage/init_vore()
+
+ if(LAZYLEN(vore_organs))
+ return TRUE
+
+ var/obj/belly/B = new /obj/belly/macrophage(src)
+ vore_selected = B
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm
index 2f9f0b578c5..cfd68d41c47 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/mobs_monsters/clowns/honkelemental.dm
@@ -24,7 +24,7 @@
emote_see = list("honks")
/mob/living/simple_mob/clowns/big/c_shift/honkelemental/verb/spawn_egg()
- set category = "Abilities"
+ set category = "Abilities.Clown"
set name = "Spawn Clown Egg"
set desc = "Spawns an egg that a player can touch, which will call on ghosts to spawn as clowns."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
index 6eb6187f49c..a726e5dcb48 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
@@ -247,7 +247,7 @@
/mob/living/simple_mob/vore/morph/proc/morph_color()
set name = "Pick Color"
- set category = "Abilities"
+ set category = "Abilities.Settings"
set desc = "You can set your color!"
var/newcolor = input(usr, "Choose a color.", "", color) as color|null
if(newcolor)
@@ -257,7 +257,7 @@
/mob/living/simple_mob/vore/morph/proc/take_over_prey()
set name = "Take Over Prey"
- set category = "Abilities"
+ set category = "Abilities.Morph"
set desc = "Take command of your prey's body."
if(morphed)
to_chat(src, span_warning("You must restore to your original form first!"))
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm
index 0c0adcc0a2f..27e6d0e92a4 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm
@@ -93,7 +93,7 @@
/mob/living/simple_mob/vore/sect_drone/proc/set_abdomen_color()
set name = "Set Glow Color"
set desc = "Customize your eyes and abdomen glow color."
- set category = "Abilities"
+ set category = "Abilities.Sect Drone"
var/new_color = input(src, "Please select color.", "Glow Color", custom_eye_color) as color|null
if(new_color)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm
index 15dfcf13687..76ab3b915f6 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm
@@ -94,7 +94,7 @@
/mob/living/simple_mob/vore/sect_queen/proc/set_abdomen_color()
set name = "Set Glow Color"
set desc = "Customize your eyes and abdomen glow color."
- set category = "Abilities"
+ set category = "Abilities.Sect Queen"
var/new_color = input(src, "Please select color.", "Glow Color", custom_eye_color) as color|null
if(new_color)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
index 62a4ac73b55..f30f34a184c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
@@ -52,7 +52,7 @@
/mob/living/simple_mob/proc/set_name()
set name = "Set Name"
set desc = "Sets your mobs name. You only get to do this once."
- set category = "Abilities"
+ set category = "Abilities.Settings"
if(limit_renames && nameset)
to_chat(src, span_userdanger("You've already set your name. Ask an admin to toggle \"nameset\" to 0 if you really must."))
return
@@ -66,7 +66,7 @@
/mob/living/simple_mob/proc/set_desc()
set name = "Set Description"
set desc = "Set your description."
- set category = "Abilities"
+ set category = "Abilities.Settings"
var/newdesc
newdesc = sanitizeSafe(tgui_input_text(src,"Set your description. Max 4096 chars.", "Description set","", prevent_enter = TRUE), MAX_MESSAGE_LEN)
if(newdesc)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 88247bdd073..9413f822560 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -288,7 +288,7 @@
/mob/verb/memory()
set name = "Notes"
- set category = "IC"
+ set category = "IC.Game"
if(mind)
mind.show_memory(src)
else
@@ -296,7 +296,7 @@
/mob/verb/add_memory(msg as message)
set name = "Add Note"
- set category = "IC"
+ set category = "IC.Game"
msg = sanitize(msg)
@@ -384,7 +384,7 @@
/mob/verb/abandon_mob()
set name = "Return to Menu"
- set category = "OOC"
+ set category = "OOC.Game"
if(stat != DEAD || !ticker)
to_chat(usr, span_boldnotice("You must be dead to use this!"))
@@ -465,7 +465,7 @@
/client/verb/changes()
set name = "Changelog"
- set category = "OOC"
+ set category = "OOC.Resources"
src << link("https://wiki.vore-station.net/Changelog")
/*
@@ -477,7 +477,7 @@
/mob/verb/observe()
set name = "Observe"
- set category = "OOC"
+ set category = "OOC.Game"
var/is_admin = 0
if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT))
@@ -519,7 +519,7 @@
/mob/verb/cancel_camera()
set name = "Cancel Camera View"
- set category = "OOC"
+ set category = "OOC.Game"
unset_machine()
reset_view(null)
@@ -543,7 +543,7 @@
/mob/verb/stop_pulling()
set name = "Stop Pulling"
- set category = "IC"
+ set category = "IC.Game"
if(pulling)
if(ishuman(pulling))
@@ -998,7 +998,7 @@
/mob/verb/face_direction()
set name = "Face Direction"
- set category = "IC"
+ set category = "IC.Game"
set src = usr
set_face_dir()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index d8db6a7394b..1b069023250 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -208,7 +208,6 @@
//so don't treat them as being SSD even though their client var is null.
var/mob/teleop = null
- var/turf/listed_turf = null //the current turf being examined in the stat panel
var/list/shouldnt_see = list(/mob/observer/eye) //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
var/list/active_genes=list()
@@ -240,3 +239,6 @@
var/list/list/misc_tabs = list()
var/list/datum/action/actions
+
+ var/list/viruses
+ var/list/resistances
diff --git a/code/modules/mob/mob_planes_vr.dm b/code/modules/mob/mob_planes_vr.dm
index 9f5b30f5793..9928180070b 100644
--- a/code/modules/mob/mob_planes_vr.dm
+++ b/code/modules/mob/mob_planes_vr.dm
@@ -21,8 +21,9 @@
my_mob = M
/obj/screen/plane_master/augmented/Destroy()
+ entopic_users -= my_mob
my_mob = null
- return ..()
+ . = ..()
/obj/screen/plane_master/augmented/set_visibility(var/want = FALSE)
. = ..()
diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm
index 9bf4c4a4978..98361e4bb69 100644
--- a/code/modules/mob/new_player/skill.dm
+++ b/code/modules/mob/new_player/skill.dm
@@ -207,7 +207,7 @@ var/global/list/SKILL_PRE = list(JOB_ENGINEER = SKILL_ENGINEER, JOB_ROBOTICIST =
return
/mob/living/carbon/human/verb/show_skills()
- set category = "IC"
+ set category = "IC.Game"
set name = "Show Own Skills"
show_skill_window(src, src)
diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm
index 8994b7ce1cc..6dc5cbb0116 100644
--- a/code/modules/mob/new_player/sprite_accessories_taur.dm
+++ b/code/modules/mob/new_player/sprite_accessories_taur.dm
@@ -90,7 +90,7 @@
/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1))
set name = "Taur Mount/Dismount"
- set category = "Abilities"
+ set category = "Abilities.General"
set desc = "Let people ride on you."
if(LAZYLEN(buckled_mobs))
diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
index 8ee54f33d98..f9525966645 100644
--- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
@@ -617,7 +617,7 @@
name = "Drake (Taur)"
icon_state = "drake_s"
extra_overlay = "drake_markings"
-/// suit_sprites = 'icons/mob/taursuits_drake_vr.dmi' ///Chomp edit
+/// suit_sprites = 'icons/mob/taursuits_drake_vr.dmi'
suit_sprites = 'icons/mob/taursuits_drake_ch.dmi'
icon_sprite_tag = "drake"
can_loaf = TRUE
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index a5b7a6f00d9..e7b71271632 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -3,7 +3,7 @@
/mob/verb/whisper(message as text)
set name = "Whisper"
- set category = "IC"
+ set category = "IC.Subtle"
set hidden = 1
//VOREStation Addition Start
if(forced_psay)
@@ -15,7 +15,7 @@
/mob/verb/say_verb(message as text)
set name = "Say"
- set category = "IC"
+ set category = "IC.Chat"
set hidden = 1
//VOREStation Addition Start
if(forced_psay)
@@ -28,7 +28,7 @@
/mob/verb/me_verb(message as message)
set name = "Me"
- set category = "IC"
+ set category = "IC.Chat"
set desc = "Emote to nearby people (and your pred/prey)"
set hidden = 1
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 0ce22e0ec01..2c2a928deb3 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -4,7 +4,7 @@
/mob/verb/me_verb_subtle(message as message) //This would normally go in say.dm
set name = "Subtle"
- set category = "IC"
+ set category = "IC.Subtle"
set desc = "Emote to nearby people (and your pred/prey)"
set hidden = 1
@@ -27,7 +27,7 @@
/mob/verb/me_verb_subtle_custom(message as message) // Literally same as above but with mode_selection set to true
set name = "Subtle (Custom)"
- set category = "IC"
+ set category = "IC.Subtle"
set desc = "Emote to nearby people, with ability to choose which specific portion of people you wish to target."
if(say_disabled) //This is here to try to identify lag problems
@@ -260,7 +260,7 @@
///// PSAY /////
/mob/verb/psay(message as text)
- set category = "IC"
+ set category = "IC.Subtle"
set name = "Psay"
set desc = "Talk to people affected by complete absorbed or dominate predator/prey."
@@ -358,7 +358,7 @@
///// PME /////
/mob/verb/pme(message as message)
- set category = "IC"
+ set category = "IC.Subtle"
set name = "Pme"
set desc = "Emote to people affected by complete absorbed or dominate predator/prey."
@@ -454,7 +454,7 @@
M.me_verb(message)
/mob/living/verb/player_narrate(message as message)
- set category = "IC"
+ set category = "IC.Chat"
set name = "Narrate (Player)"
set desc = "Narrate an action or event! An alternative to emoting, for when your emote shouldn't start with your name!"
@@ -500,7 +500,7 @@
/mob/verb/select_speech_bubble()
set name = "Select Speech Bubble"
- set category = "OOC"
+ set category = "OOC.Chat Settings"
var/new_speech_bubble = tgui_input_list(src, "Pick new voice (default for automatic selection)", "Character Preference", selectable_speech_bubbles)
if(new_speech_bubble)
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index 66fe8d90efe..41c026076f6 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -1,13 +1,13 @@
/mob/verb/up()
set name = "Move Upwards"
- set category = "IC"
+ set category = "IC.Game"
if(zMove(UP))
to_chat(src, span_notice("You move upwards."))
/mob/verb/down()
set name = "Move Down"
- set category = "IC"
+ set category = "IC.Game"
if(zMove(DOWN))
to_chat(src, span_notice("You move down."))
diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm
index 656d56600e4..ca467e0a146 100644
--- a/code/modules/multiz/movement_vr.dm
+++ b/code/modules/multiz/movement_vr.dm
@@ -211,7 +211,7 @@
/mob/living/verb/climb_down()
set name = "Climb down wall"
set desc = "attempt to climb down the wall you are standing on, in direction you're looking"
- set category = "IC"
+ set category = "IC.Game"
var/fall_chance = 0 //Increased if we can't actually climb
var/turf/our_turf = get_turf(src) //floor we're standing on
diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm
index 04dc280ffb5..d3e02a4e1df 100644
--- a/code/modules/nifsoft/nif.dm
+++ b/code/modules/nifsoft/nif.dm
@@ -688,7 +688,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
/mob/living/carbon/human/proc/set_nif_examine()
set name = "NIF Appearance"
set desc = "If your NIF alters your appearance in some way, describe it here."
- set category = "OOC"
+ set category = "OOC.Game Settings"
if(!nif)
remove_verb(src, /mob/living/carbon/human/proc/set_nif_examine)
diff --git a/code/modules/nifsoft/nif_tgui.dm b/code/modules/nifsoft/nif_tgui.dm
index 2c9227e5ad4..35fe90115b9 100644
--- a/code/modules/nifsoft/nif_tgui.dm
+++ b/code/modules/nifsoft/nif_tgui.dm
@@ -81,7 +81,7 @@
*/
/mob/living/carbon/human/proc/nif_menu()
set name = "NIF Menu"
- set category = "IC"
+ set category = "IC.Nif"
set desc = "Open the NIF user interface."
var/obj/item/nif/N = nif
diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm
index 7e5783cb25d..82d506678bd 100644
--- a/code/modules/nifsoft/software/13_soulcatcher.dm
+++ b/code/modules/nifsoft/software/13_soulcatcher.dm
@@ -396,7 +396,7 @@
/mob/living/carbon/brain/caught_soul/resist()
set name = "Resist"
- set category = "IC"
+ set category = "IC.Game"
to_chat(src,span_warning("There's no way out! You're stuck in VR."))
@@ -487,7 +487,7 @@
/mob/proc/nsay(message as text)
set name = "NSay"
set desc = "Speak into your NIF's Soulcatcher."
- set category = "IC"
+ set category = "IC.NiF"
src.nsay_act(message)
@@ -517,7 +517,7 @@
/mob/proc/nme(message as message)
set name = "NMe"
set desc = "Emote into your NIF's Soulcatcher."
- set category = "IC"
+ set category = "IC.NiF"
src.nme_act(message)
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 74894542c58..72b24602f9e 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -246,10 +246,19 @@ var/const/CE_STABLE_THRESHOLD = 0.5
//set reagent data
B.data["donor"] = src
- if (!B.data["virus2"])
- B.data["virus2"] = list()
- B.data["virus2"] |= virus_copylist(src.virus2)
- B.data["antibodies"] = src.antibodies
+ if(!B.data["viruses"])
+ B.data["viruses"] = list()
+
+ for(var/datum/disease/D in GetViruses())
+ if(D.spread_flags & SPECIAL || D.spread_flags & NON_CONTAGIOUS)
+ continue
+ B.data["viruses"] |= D.Copy()
+
+ if(!B.data["resistances"])
+ B.data["resistances"] = list()
+
+ if(B.data["resistances"])
+ B.data["resistances"] |= GetResistances()
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
B.data["blood_type"] = copytext(src.dna.b_type,1,0)
@@ -282,10 +291,14 @@ var/const/CE_STABLE_THRESHOLD = 0.5
/mob/living/carbon/proc/inject_blood(var/datum/reagent/blood/injected, var/amount)
if (!injected || !istype(injected))
return
- var/list/sniffles = virus_copylist(injected.data["virus2"])
+ var/list/sniffles = injected.data["viruses"]
for(var/ID in sniffles)
- var/datum/disease2/disease/sniffle = sniffles[ID]
- infect_virus2(src,sniffle,1)
+ var/datum/disease/D = ID
+ if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS)) // You can't put non-contagius diseases in blood, but just in case
+ continue
+ ContractDisease(D)
+ if (injected.data["resistances"] && prob(5))
+ antibodies |= injected.data["resistances"]
if (injected.data["antibodies"] && prob(5))
antibodies |= injected.data["antibodies"]
var/list/chems = list()
@@ -426,8 +439,8 @@ var/const/CE_STABLE_THRESHOLD = 0.5
B.blood_DNA[source.data["blood_DNA"]] = "O+"
// Update virus information.
- if(source.data["virus2"])
- B.virus2 = virus_copylist(source.data["virus2"])
+ if(source.data["viruses"])
+ B.viruses = source.data["viruses"]
B.fluorescent = 0
B.invisibility = 0
diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm
index c0fdfb2b65e..c7952314d72 100644
--- a/code/modules/organs/internal/eyes.dm
+++ b/code/modules/organs/internal/eyes.dm
@@ -33,7 +33,7 @@
/obj/item/organ/internal/eyes/proc/change_eye_color()
set name = "Change Eye Color"
set desc = "Changes your robotic eye color instantly."
- set category = "IC"
+ set category = "IC.Settings"
set src in usr
var/current_color = rgb(eye_colour[1],eye_colour[2],eye_colour[3])
diff --git a/code/modules/paperwork/silicon_photography.dm b/code/modules/paperwork/silicon_photography.dm
index ce7fee79ecd..5d343961306 100644
--- a/code/modules/paperwork/silicon_photography.dm
+++ b/code/modules/paperwork/silicon_photography.dm
@@ -95,7 +95,7 @@
injectmasteralbum(p)
/mob/living/silicon/ai/proc/take_image()
- set category = "AI Commands"
+ set category = "AI.Commands"
set name = "Take Image"
set desc = "Takes an image"
@@ -103,7 +103,7 @@
aiCamera.toggle_camera_mode()
/mob/living/silicon/ai/proc/view_images()
- set category = "AI Commands"
+ set category = "AI.Commands"
set name = "View Images"
set desc = "View images"
@@ -111,7 +111,7 @@
aiCamera.viewpictures()
/mob/living/silicon/ai/proc/delete_images()
- set category = "AI Commands"
+ set category = "AI.Commands"
set name = "Delete Image"
set desc = "Delete image"
diff --git a/code/modules/pda/ai.dm b/code/modules/pda/ai.dm
index b3f889f02fc..4511f530a3d 100644
--- a/code/modules/pda/ai.dm
+++ b/code/modules/pda/ai.dm
@@ -22,7 +22,7 @@
//AI verb and proc for sending PDA messages.
/obj/item/pda/ai/verb/cmd_pda_open_ui()
- set category = "Abilities.AI_IM"
+ set category = "Abilities.AI"
set name = "Use PDA"
set src in usr
diff --git a/code/modules/player_tips_vr/player_tips_controller_vr.dm b/code/modules/player_tips_vr/player_tips_controller_vr.dm
index 6b8ce44414b..e0e856765c2 100644
--- a/code/modules/player_tips_vr/player_tips_controller_vr.dm
+++ b/code/modules/player_tips_vr/player_tips_controller_vr.dm
@@ -41,7 +41,7 @@ Controlled by the player_tips subsystem under code/controllers/subsystems/player
/mob/living/verb/request_automated_advice()
set name = "Request Automated Advice"
set desc = "Sends you advice from a list of possibilities. You can choose to request a specific topic."
- set category = "OOC"
+ set category = "OOC.Game Settings"
var/choice = tgui_input_list(src, "What topic would you like to receive advice on?", "Select Topic", list("none","general","gameplay","roleplay","lore","cancel"))
if(choice == "cancel")
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 2a98049b0bb..5379ab7f423 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -18,7 +18,7 @@
var/emp_proof = FALSE
var/static/cell_uid = 1 // Unique ID of this power cell. Used to reduce bunch of uglier code in nanoUI.
var/c_uid
- var/charge = 0 // note %age conveted to actual charge in New
+ var/charge = 1000 // maximum charge on spawn
var/maxcharge = 1000
var/rigged = 0 // true if rigged to explode
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
@@ -27,6 +27,7 @@
var/last_use = 0 // A tracker for use in self-charging
var/connector_type = "standard" //What connector sprite to use when in a cell charger, null if no connectors
var/charge_delay = 0 // How long it takes for the cell to start recharging after last use
+ var/robot_durability = 50
matter = list(MAT_STEEL = 700, MAT_GLASS = 50)
drop_sound = 'sound/items/drop/component.ogg'
pickup_sound = 'sound/items/pickup/component.ogg'
@@ -35,10 +36,9 @@
var/standard_overlays = TRUE
var/last_overlay_state = null // Used to optimize update_icon() calls.
-/obj/item/cell/New()
- ..()
+/obj/item/cell/Initialize()
+ . = ..()
c_uid = cell_uid++
- charge = maxcharge
update_icon()
if(self_recharge)
START_PROCESSING(SSobj, src)
diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm
index fd93e450f14..4179cf6c2db 100644
--- a/code/modules/power/cells/device_cells.dm
+++ b/code/modules/power/cells/device_cells.dm
@@ -10,15 +10,14 @@
force = 0
throw_speed = 5
throw_range = 7
+ charge = 480
maxcharge = 480
charge_amount = 5
matter = list(MAT_STEEL = 350, MAT_GLASS = 50)
preserve_item = 1
-/obj/item/cell/device/empty/Initialize()
- . = ..()
+/obj/item/cell/device/empty
charge = 0
- update_icon()
/*
* Crap Device
@@ -29,16 +28,15 @@
description_fluff = "You can't top the rust top." //TOTALLY TRADEMARK INFRINGEMENT
origin_tech = list(TECH_POWER = 0)
icon_state = "device_crap"
+ charge = 240
maxcharge = 240
matter = list(MAT_STEEL = 350, MAT_GLASS = 30)
/obj/item/cell/device/crap/update_icon() //No visible charge indicator
return
-/obj/item/cell/device/crap/empty/Initialize()
- . = ..()
+/obj/item/cell/device/crap/empty
charge = 0
- update_icon()
/*
* Hyper Device
@@ -47,13 +45,12 @@
name = "hyper device power cell"
desc = "A small power cell designed to power handheld devices. Has a better charge than a standard device cell."
icon_state = "hype_device_cell"
+ charge = 600
maxcharge = 600
matter = list(MAT_STEEL = 400, MAT_GLASS = 60)
-/obj/item/cell/device/hyper/empty/Initialize()
- . = ..()
+/obj/item/cell/device/hyper/empty
charge = 0
- update_icon()
/*
* EMP Proof Device
@@ -65,10 +62,8 @@
matter = list(MAT_STEEL = 400, MAT_GLASS = 60)
emp_proof = TRUE
-/obj/item/cell/device/empproof/empty/Initialize()
- . = ..()
+/obj/item/cell/device/empproof/empty
charge = 0
- update_icon()
/*
* Weapon
@@ -77,13 +72,12 @@
name = "weapon power cell"
desc = "A small power cell designed to power handheld weaponry."
icon_state = "weapon_cell"
+ charge = 2400
maxcharge = 2400
charge_amount = 20
-/obj/item/cell/device/weapon/empty/Initialize()
- . = ..()
+/obj/item/cell/device/weapon/empty
charge = 0
- update_icon()
/*
* EMP Proof Weapon
@@ -95,10 +89,8 @@
matter = list(MAT_STEEL = 400, MAT_GLASS = 60)
emp_proof = TRUE
-/obj/item/cell/device/weapon/empproof/empty/Initialize()
- . = ..()
+/obj/item/cell/device/weapon/empproof/empty
charge = 0
- update_icon()
/*
* Self-charging Weapon
@@ -139,7 +131,7 @@
value = CATALOGUER_REWARD_EASY
/obj/item/cell/device/weapon/recharge/alien
- name = "void cell"
+ name = "void cell (device)"
desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?"
catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_void_cell)
icon = 'icons/obj/abductor.dmi'
@@ -147,6 +139,24 @@
charge_amount = 120 // 5%.
charge_delay = 50 // Every five seconds, bit faster than the default.
origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6)
+ var/swaps_to = /obj/item/cell/void
+ standard_overlays = FALSE
/obj/item/cell/device/weapon/recharge/alien/update_icon()
- return // No overlays please.
\ No newline at end of file
+ return // No overlays please.
+
+/obj/item/cell/device/weapon/recharge/alien/attack_self(var/mob/user)
+ user.remove_from_mob(src)
+ to_chat(user, span_notice("You swap [src] to 'machinery cell' mode."))
+ var/obj/item/cell/newcell = new swaps_to(null)
+ user.put_in_active_hand(newcell)
+ var/percentage = charge/maxcharge
+ newcell.charge = newcell.maxcharge * percentage
+ newcell.persist_storable = persist_storable
+ qdel(src)
+
+// Bloo friendlier hybrid tech
+/obj/item/cell/device/weapon/recharge/alien/hybrid
+ icon = 'icons/obj/power_vr.dmi'
+ icon_state = "cellb"
+ swaps_to = /obj/item/cell/void/hybrid
diff --git a/code/modules/power/cells/device_cells_vr.dm b/code/modules/power/cells/device_cells_vr.dm
deleted file mode 100644
index f810799f849..00000000000
--- a/code/modules/power/cells/device_cells_vr.dm
+++ /dev/null
@@ -1,52 +0,0 @@
-
-//The device cell
-/obj/item/cell/device/weapon/recharge/alien
- name = "void cell (device)"
- var/swaps_to = /obj/item/cell/void
- standard_overlays = FALSE
-
-/obj/item/cell/device/weapon/recharge/alien/attack_self(var/mob/user)
- user.remove_from_mob(src)
- to_chat(user, span_notice("You swap [src] to 'machinery cell' mode."))
- var/obj/item/cell/newcell = new swaps_to(null)
- user.put_in_active_hand(newcell)
- var/percentage = charge/maxcharge
- newcell.charge = newcell.maxcharge * percentage
- newcell.persist_storable = persist_storable
- qdel(src)
-
-//The machine cell
-/obj/item/cell/void
- name = "void cell (machinery)"
- desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?"
- origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6)
- icon = 'icons/obj/abductor.dmi'
- icon_state = "cell"
- maxcharge = 4800 //10x the device version
- charge_amount = 1200 //10x the device version
- self_recharge = TRUE
- charge_delay = 50
- matter = null
- standard_overlays = FALSE
- var/swaps_to = /obj/item/cell/device/weapon/recharge/alien
-
-/obj/item/cell/void/attack_self(var/mob/user)
- user.remove_from_mob(src)
- to_chat(user, span_notice("You swap [src] to 'device cell' mode."))
- var/obj/item/cell/newcell = new swaps_to(null)
- user.put_in_active_hand(newcell)
- var/percentage = charge/maxcharge
- newcell.charge = newcell.maxcharge * percentage
- newcell.persist_storable = persist_storable
- qdel(src)
-
-// Bloo friendlier hybrid tech
-/obj/item/cell/device/weapon/recharge/alien/hybrid
- icon = 'icons/obj/power_vr.dmi'
- icon_state = "cellb"
- swaps_to = /obj/item/cell/void/hybrid
-
-/obj/item/cell/void/hybrid
- icon = 'icons/obj/power_vr.dmi'
- icon_state = "cellb"
- swaps_to = /obj/item/cell/device/weapon/recharge/alien/hybrid
diff --git a/code/modules/power/cells/esoteric_cells.dm b/code/modules/power/cells/esoteric_cells.dm
index aeacc6b3e67..925a8f55437 100644
--- a/code/modules/power/cells/esoteric_cells.dm
+++ b/code/modules/power/cells/esoteric_cells.dm
@@ -4,6 +4,7 @@
desc = "A modified power cell sitting in a highly conductive chassis."
origin_tech = list(TECH_POWER = 2)
icon_state = "modded"
+ charge = 10000
maxcharge = 10000
matter = list(MAT_STEEL = 1000, MAT_GLASS = 80, MAT_SILVER = 100)
self_recharge = TRUE
diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm
index 774c5d88172..3722b6832f5 100644
--- a/code/modules/power/cells/power_cells.dm
+++ b/code/modules/power/cells/power_cells.dm
@@ -1,8 +1,7 @@
/*
* Empty
*/
-/obj/item/cell/empty/New()
- ..()
+/obj/item/cell/empty
charge = 0
/*
@@ -14,14 +13,15 @@
description_fluff = "You can't top the rust top." //TOTALLY TRADEMARK INFRINGEMENT
origin_tech = list(TECH_POWER = 0)
icon_state = "crap"
+ charge = 500
maxcharge = 500
matter = list(MAT_STEEL = 700, MAT_GLASS = 40)
+ robot_durability = 20
/obj/item/cell/crap/update_icon() //No visible charge indicator
return
-/obj/item/cell/crap/empty/New()
- ..()
+/obj/item/cell/crap/empty
charge = 0
/*
@@ -31,6 +31,7 @@
name = "heavy-duty power cell"
origin_tech = list(TECH_POWER = 1)
icon_state = "apc"
+ charge = 5000
maxcharge = 5000
matter = list(MAT_STEEL = 700, MAT_GLASS = 50)
@@ -39,6 +40,7 @@
*/
/obj/item/cell/robot_station
name = "standard robot power cell"
+ charge = 7500
maxcharge = 7500
/*
@@ -48,13 +50,13 @@
name = "high-capacity power cell"
origin_tech = list(TECH_POWER = 2)
icon_state = "high"
+ charge = 10000
maxcharge = 10000
matter = list(MAT_STEEL = 700, MAT_GLASS = 60)
+ robot_durability = 55
-/obj/item/cell/high/empty/New()
- ..()
+/obj/item/cell/high/empty
charge = 0
- update_icon()
/*
* Super
@@ -63,13 +65,13 @@
name = "super-capacity power cell"
origin_tech = list(TECH_POWER = 5)
icon_state = "super"
+ charge = 20000
maxcharge = 20000
matter = list(MAT_STEEL = 700, MAT_GLASS = 70)
+ robot_durability = 60
-/obj/item/cell/super/empty/New()
- ..()
+/obj/item/cell/super/empty
charge = 0
- update_icon()
/*
* Syndicate
@@ -78,7 +80,9 @@
name = "syndicate robot power cell"
description_fluff = "Almost as good as a hyper."
icon_state = "super" //We don't want roboticists confuse it with a low standard cell
+ charge = 25000
maxcharge = 25000
+ robot_durability = 65
/*
* Hyper
@@ -87,13 +91,13 @@
name = "hyper-capacity power cell"
origin_tech = list(TECH_POWER = 6)
icon_state = "hyper"
+ charge = 30000
maxcharge = 30000
matter = list(MAT_STEEL = 700, MAT_GLASS = 80)
+ robot_durability = 70
-/obj/item/cell/hyper/empty/New()
- ..()
+/obj/item/cell/hyper/empty
charge = 0
- update_icon()
/*
* Mecha
@@ -141,8 +145,10 @@
name = "infinite-capacity power cell!"
icon_state = "infinity"
origin_tech = null
+ charge = 30000
maxcharge = 30000 //determines how badly mobs get shocked
matter = list(MAT_STEEL = 700, MAT_GLASS = 80)
+ robot_durability = 200
/obj/item/cell/infinite/check_charge()
return 1
@@ -161,6 +167,7 @@
charge = 100
maxcharge = 300
minor_fault = 1
+ robot_durability = 30
/*
* Slime
@@ -173,6 +180,7 @@
icon_state = "yellow slime extract" //"potato_battery"
connector_type = "slime"
description_info = "This 'cell' holds a max charge of 10k and self recharges over time."
+ charge = 10000
maxcharge = 10000
matter = null
self_recharge = TRUE
@@ -184,6 +192,7 @@
/obj/item/cell/emergency_light
name = "miniature power cell"
desc = "A tiny power cell with a very low power capacity. Used in light fixtures to power them in the event of an outage."
+ charge = 120
maxcharge = 120 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell
matter = list(MAT_GLASS = 20)
icon_state = "em_light"
@@ -240,3 +249,35 @@
cut_overlays()
target.adjust_nutrition(amount)
user.custom_emote(message = "connects \the [src] to [user == target ? "their" : "[target]'s"] charging port, expending it.")
+
+//The machine cell
+/obj/item/cell/void
+ name = "void cell (machinery)"
+ desc = "An alien technology that produces energy seemingly out of nowhere. Its small, cylinderal shape means it might be able to be used with human technology, perhaps?"
+ origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6)
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cell"
+ charge = 4800
+ maxcharge = 4800 //10x the device version
+ charge_amount = 1200 //10x the device version
+ self_recharge = TRUE
+ charge_delay = 50
+ matter = null
+ standard_overlays = FALSE
+ var/swaps_to = /obj/item/cell/device/weapon/recharge/alien
+ robot_durability = 100
+
+/obj/item/cell/void/attack_self(var/mob/user)
+ user.remove_from_mob(src)
+ to_chat(user, span_notice("You swap [src] to 'device cell' mode."))
+ var/obj/item/cell/newcell = new swaps_to(null)
+ user.put_in_active_hand(newcell)
+ var/percentage = charge/maxcharge
+ newcell.charge = newcell.maxcharge * percentage
+ newcell.persist_storable = persist_storable
+ qdel(src)
+
+/obj/item/cell/void/hybrid
+ icon = 'icons/obj/power_vr.dmi'
+ icon_state = "cellb"
+ swaps_to = /obj/item/cell/device/weapon/recharge/alien/hybrid
diff --git a/code/modules/power/supermatter/setup_supermatter.dm b/code/modules/power/supermatter/setup_supermatter.dm
index 2267909e850..ab3729890d4 100644
--- a/code/modules/power/supermatter/setup_supermatter.dm
+++ b/code/modules/power/supermatter/setup_supermatter.dm
@@ -10,7 +10,7 @@
/datum/admins/proc/setup_supermatter()
- set category = "Debug"
+ set category = "Debug.Game"
set name = "Setup Supermatter"
set desc = "Allows you to start the Supermatter engine."
diff --git a/code/modules/projectiles/targeting/targeting_mob.dm b/code/modules/projectiles/targeting/targeting_mob.dm
index f80255c2b55..17aa15eed7a 100644
--- a/code/modules/projectiles/targeting/targeting_mob.dm
+++ b/code/modules/projectiles/targeting/targeting_mob.dm
@@ -4,7 +4,7 @@
/mob/verb/toggle_gun_mode()
set name = "Toggle Gun Mode"
set desc = "Begin or stop aiming."
- set category = "IC"
+ set category = "IC.Game"
if(isliving(src))
var/mob/living/M = src
diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm
index 6ceb139537e..09ef0e6d2ed 100644
--- a/code/modules/random_map/drop/droppod.dm
+++ b/code/modules/random_map/drop/droppod.dm
@@ -149,7 +149,7 @@
drop.forceMove(T)
/datum/admins/proc/call_drop_pod()
- set category = "Fun"
+ set category = "Fun.Drop Pod"
set desc = "Call an immediate drop pod on your location."
set name = "Call Drop Pod"
diff --git a/code/modules/random_map/drop/supply.dm b/code/modules/random_map/drop/supply.dm
index e4c2047d1f6..2e04d38d922 100644
--- a/code/modules/random_map/drop/supply.dm
+++ b/code/modules/random_map/drop/supply.dm
@@ -33,7 +33,7 @@
/datum/admins/proc/call_supply_drop()
- set category = "Fun"
+ set category = "Fun.Drop Pod"
set desc = "Call an immediate supply drop on your location."
set name = "Call Supply Drop"
diff --git a/code/modules/random_map/random_map_verbs.dm b/code/modules/random_map/random_map_verbs.dm
index c08e5ea119e..8bef0f3231e 100644
--- a/code/modules/random_map/random_map_verbs.dm
+++ b/code/modules/random_map/random_map_verbs.dm
@@ -1,5 +1,5 @@
/client/proc/print_random_map()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Display Random Map"
set desc = "Show the contents of a random map."
@@ -13,7 +13,7 @@
M.display_map(usr)
/client/proc/delete_random_map()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Delete Random Map"
set desc = "Delete a random map."
@@ -30,7 +30,7 @@
qdel(M)
/client/proc/create_random_map()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Create Random Map"
set desc = "Create a random map."
@@ -54,7 +54,7 @@
log_admin("[key_name(usr)] has created [M.name].")
/client/proc/apply_random_map()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Apply Random Map"
set desc = "Apply a map to the game world."
@@ -79,7 +79,7 @@
M.apply_to_map()
/client/proc/overlay_random_map()
- set category = "Debug"
+ set category = "Debug.Events"
set name = "Overlay Random Map"
set desc = "Apply a map to another map."
diff --git a/code/modules/reagents/Chemistry-Logging.dm b/code/modules/reagents/Chemistry-Logging.dm
index 4c7b2343ad8..57ea0270ad7 100644
--- a/code/modules/reagents/Chemistry-Logging.dm
+++ b/code/modules/reagents/Chemistry-Logging.dm
@@ -16,7 +16,7 @@
/client/proc/view_chemical_reaction_logs()
set name = "Show Chemical Reactions"
- set category = "Admin"
+ set category = "Admin.Investigate"
if(!check_rights(R_ADMIN|R_MOD))
return
diff --git a/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm b/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm
index 00287e83734..a33c401f03d 100644
--- a/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm
+++ b/code/modules/reagents/machinery/dispenser/cartridge_spawn.dm
@@ -1,6 +1,6 @@
/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in SSchemistry.chemical_reagents)
set name = "Spawn Chemical Dispenser Cartridge"
- set category = "Admin"
+ set category = "Admin.Events"
var/obj/item/reagent_containers/chem_disp_cartridge/C
switch(size)
diff --git a/code/modules/reagents/machinery/dispenser/reagent_tank.dm b/code/modules/reagents/machinery/dispenser/reagent_tank.dm
index e821a54366b..058cbe26ea8 100644
--- a/code/modules/reagents/machinery/dispenser/reagent_tank.dm
+++ b/code/modules/reagents/machinery/dispenser/reagent_tank.dm
@@ -340,7 +340,7 @@
/obj/structure/reagent_dispensers/water_cooler/Initialize()
. = ..()
if(bottle)
- reagents.add_reagent("water",120)
+ reagents.add_reagent("water",2000)
update_icon()
/obj/structure/reagent_dispensers/water_cooler/examine(mob/user)
diff --git a/code/modules/reagents/machinery/pump.dm b/code/modules/reagents/machinery/pump.dm
index 53bf48365ee..ed371c96732 100644
--- a/code/modules/reagents/machinery/pump.dm
+++ b/code/modules/reagents/machinery/pump.dm
@@ -18,7 +18,7 @@
var/obj/item/cell/cell = null
var/obj/item/hose_connector/output/Output = null
- var/reagents_per_cycle = 40
+ var/reagents_per_cycle = 5 // severe nerf to unupgraded speed
var/on = 0
var/unlocked = 0
var/open = 0
@@ -58,6 +58,8 @@
qdel(src.reagents)
src.reagents = R
+ cell = locate(/obj/item/cell) in src
+
/obj/machinery/pump/update_icon()
..()
cut_overlays()
@@ -158,7 +160,13 @@
return FALSE
default_unfasten_wrench(user, W, 2 SECONDS)
- else if(istype(W, /obj/item/cell) && open)
+ else if(istype(W, /obj/item/cell))
+ if(!open)
+ if(unlocked)
+ to_chat(user, span_notice("The battery panel is screwed shut."))
+ else
+ to_chat(user, span_notice("The battery panel is watertight and cannot be opened without a crowbar."))
+ return FALSE
if(istype(cell))
to_chat(user, span_notice("There is a power cell already installed."))
return FALSE
@@ -168,7 +176,7 @@
else
. = ..()
- RefreshParts()
+ RefreshParts() // Handles cell assignment
update_icon()
@@ -184,13 +192,13 @@
. = ..()
R.add_reagent("water", round(volume, 0.1))
- if(temperature <= T0C)
+ var/datum/gas_mixture/air = return_air() // v
+ if(air.temperature <= T0C) // Uses the current air temp, instead of the turf starting temp
R.add_reagent("ice", round(volume / 2, 0.1))
- for(var/turf/simulated/mineral/M in orange(5))
- if(istype(M.mineral, /obj/effect/mineral))
- var/obj/effect/mineral/ore = M.mineral
- reagents.add_reagent(ore.ore_reagent, round(volume / 2, 0.1))
+ for(var/turf/simulated/mineral/M in orange(5,src)) // Uses the turf as center instead of an unset usr
+ if(M.mineral && prob(40)) // v
+ R.add_reagent(M.mineral.reagent, round(volume / 5, 0.1)) // Was the turf's reagents variable not the R argument, and changed ore_reagent to M.mineral.reagent because of above change. Also nerfed amount to 1/5 instead of 1/2
/turf/simulated/floor/water/pool/pump_reagents(var/datum/reagents/R, var/volume)
. = ..()
diff --git a/code/modules/reagents/reactions/instant/virology.dm b/code/modules/reagents/reactions/instant/virology.dm
new file mode 100644
index 00000000000..f8d50383267
--- /dev/null
+++ b/code/modules/reagents/reactions/instant/virology.dm
@@ -0,0 +1,133 @@
+/decl/chemical_reaction/instant/virus_food_mutagen
+ name = "mutagenic agar"
+ id = "mutagenvirusfood"
+ result = "mutagenvirusfood"
+ required_reagents = list("mutagen" = 1, "virusfood" = 1)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/virus_food_adranol
+ name = "virus rations"
+ id = "adranolvirusfood"
+ result = "adranolvirusfood"
+ required_reagents = list("adranol" = 1, "virusfood" = 1)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/virus_food_phoron
+ name = "phoronic virus food"
+ id = "phoronvirusfood"
+ result = "phoronvirusfood"
+ required_reagents = list("phoron" = 1, "virusfood" = 1)
+ result_amount = 1
+
+/decl/chemical_reaction/instant/virus_food_phoron_adranol
+ name = "weakened phoronic virus food"
+ id = "weakphoronvirusfood"
+ result = "weakphoronvirusfood"
+ required_reagents = list("adranol" = 1, "phoronvirusfood" = 1)
+ result_amount = 2
+
+/decl/chemical_reaction/instant/virus_food_mutagen_sugar
+ name = "sucrose agar"
+ id = "sugarvirusfood"
+ result = "sugarvirusfood"
+ required_reagents = list("sugar" = 1, "mutagenvirusfood" = 1)
+ result_amount = 2
+
+/decl/chemical_reaction/instant/virus_food_mutagen_inaprovaline
+ name = "sucrose agar"
+ id = "inaprovalinevirusfood"
+ result = "sugarvirusfood"
+ required_reagents = list("inaprovaline" = 1, "mutagenvirusfood" = 1)
+ result_amount = 2
+
+/decl/chemical_reaction/instant/mix_virus
+ name = "Mix Virus"
+ id = "mixvirus"
+ required_reagents = list("virusfood" = 1)
+ catalysts = list("blood" = 1)
+ var/level_min = 0
+ var/level_max = 2
+
+/decl/chemical_reaction/instant/mix_virus/on_reaction(datum/reagents/holder)
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
+ if(B && B.data)
+ var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
+ if(D)
+ D.Evolve(level_min, level_max)
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_2
+ name = "Mix Virus 2"
+ id = "mixvirus2"
+ required_reagents = list("mutagen" = 1)
+ level_min = 2
+ level_max = 4
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_3
+ name = "Mix Virus 3"
+ id = "mixvirus3"
+ required_reagents = list("phoron" = 1)
+ level_min = 4
+ level_max = 6
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_4
+ name = "Mix Virus 4"
+ id = "mixvirus4"
+ required_reagents = list("uranium" = 1)
+ level_min = 5
+ level_max = 6
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_5
+ name = "Mix Virus 5"
+ id = "mixvirus5"
+ required_reagents = list("mutagenvirusfood" = 1)
+ level_min = 3
+ level_max = 3
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_6
+ name = "Mix Virus 6"
+ id = "mixvirus6"
+ required_reagents = list("sugarvirusfood" = 1)
+ level_min = 4
+ level_max = 4
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_7
+ name = "Mix Virus 7"
+ id = "mixvirus7"
+ required_reagents = list("weakphoronvirusfood" = 1)
+ level_min = 5
+ level_max = 5
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_8
+ name = "Mix Virus 8"
+ id = "mixvirus8"
+ required_reagents = list("phoronvirusfood" = 1)
+ level_min = 6
+ level_max = 6
+
+/decl/chemical_reaction/instant/mix_virus/mix_virus_9
+ name = "Mix Virus 9"
+ id = "mixvirus9"
+ required_reagents = list("adranolvirusfood" = 1)
+ level_min = 1
+ level_max = 1
+
+/decl/chemical_reaction/instant/mix_virus/rem_virus
+ name = "Devolve Virus"
+ id = "remvirus"
+ required_reagents = list("adranol" = 1)
+ catalysts = list("blood" = 1)
+
+/decl/chemical_reaction/instant/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder)
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
+ if(B && B.data)
+ var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
+ if(D)
+ D.Devolve()
+
+/decl/chemical_reaction/instant/antibodies
+ name = "Antibodies"
+ id = "antibodiesmix"
+ result = "antibodies"
+ required_reagents = list("vaccine")
+ catalysts = list("inaprovaline" = 0.1)
+ result_amount = 0.5
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index e7f7611c796..0298998d7f4 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -39,17 +39,16 @@
/obj/item/storage/secure/safe,
/obj/machinery/iv_drip,
/obj/structure/medical_stand, //VOREStation Add,
- /obj/machinery/disease2/incubator,
/obj/machinery/disposal,
/mob/living/simple_mob/animal/passive/cow,
/mob/living/simple_mob/animal/goat,
- /obj/machinery/computer/centrifuge,
/obj/machinery/sleeper,
/obj/machinery/smartfridge/,
/obj/machinery/biogenerator,
/obj/structure/frame,
/obj/machinery/radiocarbon_spectrometer,
- /obj/machinery/portable_atmospherics/powered/reagent_distillery
+ /obj/machinery/portable_atmospherics/powered/reagent_distillery,
+ /obj/machinery/computer/pandemic
)
/obj/item/reagent_containers/glass/Initialize()
@@ -399,11 +398,18 @@
name = "water-cooler bottle"
icon = 'icons/obj/vending.dmi'
icon_state = "water_cooler_bottle"
- matter = list(MAT_GLASS = 2000)
- w_class = ITEMSIZE_NORMAL
+ matter = list(MAT_PLASTIC = 2000)
+ w_class = ITEMSIZE_NO_CONTAINER
amount_per_transfer_from_this = 20
possible_transfer_amounts = list(10,20,30,60,120)
- volume = 120
+ volume = 2000
+ slowdown = 2
+
+ can_be_placed_into = list(
+ /obj/structure/table,
+ /obj/structure/closet,
+ /obj/structure/sink
+ )
/obj/item/reagent_containers/glass/pint_mug
desc = "A rustic pint mug designed for drinking ale."
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index fb98d48483e..0ba23194183 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -381,5 +381,4 @@
/obj/item/reagent_containers/hypospray/autoinjector/biginjector/contaminated/do_injection(mob/living/carbon/human/H, mob/living/user)
. = ..()
if(.) // Will occur if successfully injected.
- infect_mob_random_lesser(H)
add_attack_logs(user, H, "Infected \the [H] with \the [src], by \the [user].")
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index bc472d3424c..7c5c3cc9c68 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -32,7 +32,7 @@
var/used = FALSE
var/dirtiness = 0
var/list/targets
- var/list/datum/disease2/disease/viruses
+ var/list/datum/disease/viruses
drop_sound = 'sound/items/drop/glass.ogg'
pickup_sound = 'sound/items/pickup/glass.ogg'
@@ -402,10 +402,10 @@
targets |= hash
//Grab any viruses they have
- if(iscarbon(target) && LAZYLEN(target.virus2.len))
+ if(iscarbon(target) && LAZYLEN(target.viruses.len))
LAZYINITLIST(viruses)
- var/datum/disease2/disease/virus = pick(target.virus2.len)
- viruses[hash] = virus.getcopy()
+ var/datum/disease/virus = pick(target.viruses.len)
+ viruses[hash] = virus.Copy()
//Dirtiness should be very low if you're the first injectee. If you're spam-injecting 4 people in a row around you though,
//This gives the last one a 30% chance of infection.
@@ -421,8 +421,8 @@
if(LAZYLEN(viruses) && prob(75))
var/old_hash = pick(viruses)
if(hash != old_hash) //Same virus you already had?
- var/datum/disease2/disease/virus = viruses[old_hash]
- infect_virus2(target,virus.getcopy())
+ var/datum/disease/virus = viruses[old_hash]
+ target.ContractDisease(virus)
if(!used)
START_PROCESSING(SSobj, src)
diff --git a/code/modules/reagents/reagent_containers/virology.dm b/code/modules/reagents/reagent_containers/virology.dm
new file mode 100644
index 00000000000..a1d4403900f
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/virology.dm
@@ -0,0 +1,26 @@
+/obj/item/reagent_containers/glass/bottle/culture
+ name = "virus culture"
+ desc = "A bottle with a virus culture"
+ icon_state = "bottle-1"
+ var/list/data = list("donor" = null, "viruses" = null, "blood_DNA" = null, "blood_type" = null, "resistances" = null, "trace_chems" = null)
+ var/list/diseases = list()
+
+/obj/item/reagent_containers/glass/bottle/culture/cold
+ name = "cold virus culture"
+ desc = "A bottle with the common cold culture"
+
+/obj/item/reagent_containers/glass/bottle/culture/cold/Initialize()
+ . = ..()
+ diseases += new /datum/disease/advance/cold
+ data["viruses"] = diseases
+ reagents.add_reagent("blood", 10, data)
+
+/obj/item/reagent_containers/glass/bottle/culture/flu
+ name = "flu virus culture"
+ desc = "A bottle with the flu culture"
+
+/obj/item/reagent_containers/glass/bottle/culture/flu/Initialize()
+ . = ..()
+ diseases += new /datum/disease/advance/flu
+ data["viruses"] = diseases
+ reagents.add_reagent("blood", 10, data)
diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm
index 10a50a3b982..8157632742d 100644
--- a/code/modules/reagents/reagents/core.dm
+++ b/code/modules/reagents/reagents/core.dm
@@ -23,9 +23,9 @@
/datum/reagent/blood/get_data() // Just in case you have a reagent that handles data differently.
var/t = data.Copy()
- if(t["virus2"])
- var/list/v = t["virus2"]
- t["virus2"] = v.Copy()
+ if(t["viruses"])
+ var/list/v = t["viruses"]
+ t["viruses"] = v.Copy()
return t
/datum/reagent/blood/touch_turf(var/turf/simulated/T)
@@ -70,13 +70,16 @@
if(effective_dose > 15)
if(!is_vampire) //VOREStation Edit.
M.adjustToxLoss(removed) //VOREStation Edit.
- if(data && data["virus2"])
- var/list/vlist = data["virus2"]
+ if(data && data["viruses"])
+ var/list/vlist = data["viruses"]
if(vlist.len)
for(var/ID in vlist)
- var/datum/disease2/disease/V = vlist[ID]
- if(V.spreadtype == "Contact")
- infect_virus2(M, V.getcopy())
+ if(!ID)
+ continue
+ var/datum/disease/D = ID
+ if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
+ continue
+ M.ContractDisease(D)
/datum/reagent/blood/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
if(ishuman(M))
@@ -86,15 +89,59 @@
if(alien == IS_SLIME)
affect_ingest(M, alien, removed)
return
- if(data && data["virus2"])
- var/list/vlist = data["virus2"]
+ if(data && data["viruses"])
+ var/list/vlist = data["viruses"]
if(vlist.len)
for(var/ID in vlist)
- var/datum/disease2/disease/V = vlist[ID]
- if(V.spreadtype == "Contact")
- infect_virus2(M, V.getcopy())
- if(data && data["antibodies"])
- M.antibodies |= data["antibodies"]
+ var/datum/disease/D = ID
+ if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
+ continue
+ M.ContractDisease(D)
+ if(data && data["resistances"])
+ M.resistances |= data["resistances"]
+
+/datum/reagent/blood/mix_data(newdata, newamount)
+ if(!data || !newdata)
+ return
+
+ if(data["viruses"] || newdata["viruses"])
+ var/list/mix1 = data["viruses"]
+ var/list/mix2 = newdata["viruses"]
+
+ var/list/to_mix = list()
+ var/list/preserve = list()
+
+ for(var/datum/disease/advance/AD in mix1)
+ to_mix += AD
+ for(var/datum/disease/advance/AD in mix2)
+ to_mix += AD
+
+ var/datum/disease/advance/mixed_AD = Advance_Mix(to_mix)
+
+ if(mixed_AD)
+ preserve += mixed_AD
+
+ for(var/datum/disease/D1 in mix1)
+ if(!istype(D1, /datum/disease/advance))
+ var/keep = TRUE
+ for(var/datum/disease/D2 in preserve)
+ if(D1.IsSame(D2))
+ keep = FALSE
+ break
+ if(keep)
+ preserve += D1
+
+ for(var/datum/disease/D1 in mix2)
+ if(!istype(D1, /datum/disease/advance))
+ var/keep = TRUE
+ for(var/datum/disease/D2 in preserve)
+ if(D1.IsSame(D2))
+ keep = FALSE
+ break
+ if(keep)
+ preserve += D1
+
+ data["viruses"] = preserve
/datum/reagent/blood/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_SLIME) //They don't have blood, so it seems weird that they would instantly 'process' the chemical like another species does.
diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm
index add0a751561..dcdc0f7c50b 100644
--- a/code/modules/reagents/reagents/dispenser.dm
+++ b/code/modules/reagents/reagents/dispenser.dm
@@ -319,20 +319,7 @@
/datum/reagent/radium/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(issmall(M)) removed *= 2
- M.apply_effect(10 * removed, IRRADIATE, 0) // Radium may increase your chances to cure a disease
- if(M.virus2.len)
- for(var/ID in M.virus2)
- var/datum/disease2/disease/V = M.virus2[ID]
- if(prob(5))
- M.antibodies |= V.antigen
- if(prob(50))
- M.apply_effect(50, IRRADIATE, check_protection = 0) // curing it that way may kill you instead
- var/absorbed = 0
- var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in M.internal_organs
- if(rad_organ && !rad_organ.is_broken())
- absorbed = 1
- if(!absorbed)
- M.adjustToxLoss(100)
+ M.apply_effect(10 * removed, IRRADIATE, 0)
/datum/reagent/radium/touch_turf(var/turf/T)
..()
diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm
index 26b70123304..c0545b8b068 100644
--- a/code/modules/reagents/reagents/toxins.dm
+++ b/code/modules/reagents/reagents/toxins.dm
@@ -973,3 +973,15 @@
/datum/reagent/neurophage_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.adjustBrainLoss(2 * removed) // Their job is to give you a bad time.
M.adjustBruteLoss(2 * removed)
+
+/datum/reagent/salmonella
+ name = "Salmonella"
+ id = "salmonella"
+ description = "A nasty bacteria found in spoiled food."
+ reagent_state = LIQUID
+ color = "#1E4600"
+ taste_mult = 0
+
+/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M)
+ M.ForceContractDisease(new /datum/disease/food_poisoning(0))
+ return ..()
diff --git a/code/modules/reagents/reagents/virology.dm b/code/modules/reagents/reagents/virology.dm
new file mode 100644
index 00000000000..4556b1ed09c
--- /dev/null
+++ b/code/modules/reagents/reagents/virology.dm
@@ -0,0 +1,47 @@
+/datum/reagent/vaccine
+ name = "Vaccine"
+ id = "vaccine"
+ color = "#C81040"
+ taste_description = "antibodies"
+
+/datum/reagent/vaccine/affect_blood(mob/living/carbon/M, alien, removed)
+ if(islist(data))
+ for(var/thing in M.GetViruses())
+ var/datum/disease/D = thing
+ if(D.GetDiseaseID() in data)
+ D.cure()
+ M.resistances |= data
+
+/datum/reagent/vaccines/mix_data(newdata, newamount)
+ if(islist(newdata))
+ var/list/newdatalist = newdata
+ data |= newdatalist.Copy()
+
+/datum/reagent/mutagen/mutagenvirusfood
+ name = "Mutagenic agar"
+ id = "mutagenvirusfood"
+ description = "mutates blood"
+ color = "#A3C00F"
+
+/datum/reagent/mutagen/mutagenvirusfood/sugar
+ name = "Sucrose agar"
+ id = "sugarvirusfood"
+ color = "#41B0C0"
+ taste_mult = 1.5
+
+/datum/reagent/medicine/adranol/adranolvirusfood
+ name = "Virus rations"
+ id = "adranolvirusfood"
+ description = "mutates blood"
+ color = "#D18AA5"
+
+/datum/reagent/phoron_dust/phoronvirusfood
+ name = "Phoronic virus food"
+ id = "phoronvirusfood"
+ description = "mutates blood"
+ color = "#A69DA9"
+
+/datum/reagent/phoron_dust/phoronvirusfood/weak
+ name = "Weakened phoronic virus food"
+ id = "weakphoronvirusfood"
+ color = "#CEC3C6"
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 75f4fb1cacb..745dcf8dfc5 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -168,8 +168,9 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
return
/obj/machinery/r_n_d/circuit_imprinter/proc/removeFromQueue(var/index)
- queue.Cut(index, index + 1)
- return
+ if(queue.len >= index)
+ queue.Cut(index, index + 1)
+ return
/obj/machinery/r_n_d/circuit_imprinter/proc/canBuild(var/datum/design/D)
for(var/M in D.materials)
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
index 803ac462db0..8bf0beb7429 100644
--- a/code/modules/research/prosfab_designs.dm
+++ b/code/modules/research/prosfab_designs.dm
@@ -378,6 +378,50 @@
id = "mmi_ai_shell"
build_path = /obj/item/mmi/inert/ai_remote
+//////////////////// Advanced Components ////////////////////
+/datum/design/item/prosfab/cyborg/component/radio_upgraded
+ name = "Improved Radio"
+ id = "improved_radio"
+ build_path = /obj/item/robot_parts/robot_component/radio/upgraded
+ req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1)
+ materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_PLASTEEL = 3000, MAT_GLASS = 6500, MAT_SILVER = 3000, MAT_MORPHIUM = 560, MAT_DURASTEEL = 800)
+
+/datum/design/item/prosfab/cyborg/component/actuator_upgraded
+ name = "Improved Actuator"
+ id = "improved_actuator"
+ build_path = /obj/item/robot_parts/robot_component/actuator/upgraded
+ req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1)
+ materials = list(MAT_STEEL = 10000, MAT_PLASTEEL = 2500, MAT_MORPHIUM = 500, MAT_DURASTEEL = 500)
+
+/datum/design/item/prosfab/cyborg/component/diagnosis_unit_upgraded
+ name = "Improved Diagnosis Unit"
+ id = "improved_diagnosis_unit"
+ build_path = /obj/item/robot_parts/robot_component/diagnosis_unit/upgraded
+ req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1)
+ materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_URANIUM = 4000, MAT_PLASTEEL = 1000, MAT_GLASS = 400, MAT_SILVER = 1000, MAT_MORPHIUM = 420, MAT_DURASTEEL = 600)
+
+/datum/design/item/prosfab/cyborg/component/camera_upgraded
+ name = "Improved Camera"
+ id = "improved_camera"
+ build_path = /obj/item/robot_parts/robot_component/camera/upgraded
+ req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1)
+ materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_PLASTEEL = 3000, MAT_GLASS = 6500, MAT_SILVER = 3000, MAT_MORPHIUM = 560, MAT_DURASTEEL = 800)
+
+/datum/design/item/prosfab/cyborg/component/binary_communication_device/upgraded
+ name = "Improved Binary Communication Device"
+ id = "improved_binary_communication_device"
+ build_path = /obj/item/robot_parts/robot_component/binary_communication_device/upgraded
+ req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1)
+ materials = list(MAT_STEEL = 10000, MAT_DIAMOND = 2000, MAT_PLASTEEL = 3000, MAT_GLASS = 6500, MAT_GOLD = 3000, MAT_DURASTEEL = 800)
+
+/datum/design/item/prosfab/cyborg/component/armour_very_heavy
+ name = "Armour Plating (Prototype)"
+ id = "titan_armour"
+ build_path = /obj/item/robot_parts/robot_component/armour/armour_titan
+ req_tech = list(TECH_MATERIAL = 9, TECH_PRECURSOR = 3)
+ materials = list(MAT_STEEL = 12000, MAT_MORPHIUM = 3000, MAT_DURASTEEL = 5000)
+
+
//////////////////// Cyborg Modules ////////////////////
/datum/design/item/prosfab/robot_upgrade
category = list("Cyborg Modules")
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index e6f87f61180..0fc4de44c62 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -184,8 +184,9 @@
return
/obj/machinery/r_n_d/protolathe/proc/removeFromQueue(var/index)
- queue.Cut(index, index + 1)
- return
+ if(queue.len >= index)
+ queue.Cut(index, index + 1)
+ return
/obj/machinery/r_n_d/protolathe/proc/canBuild(var/datum/design/D)
for(var/M in D.materials)
diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm
index 4dcc10b43d4..f1e2d3fd535 100644
--- a/code/modules/shieldgen/directional_shield.dm
+++ b/code/modules/shieldgen/directional_shield.dm
@@ -102,12 +102,10 @@
START_PROCESSING(SSobj, src)
AddComponent(/datum/component/recursive_move)
RegisterSignal(src, COMSIG_OBSERVER_MOVED, PROC_REF(moved_event))
- //ChompEDIT START - shields on init
if(always_on)
spawn(0)
if(!QDELETED(src))
create_shields()
- //ChompEDIT END
return ..()
/obj/item/shield_projector/Destroy()
diff --git a/code/modules/tgchat/chat_verbs.dm b/code/modules/tgchat/chat_verbs.dm
index 29edc5b2279..53cb07a84c0 100644
--- a/code/modules/tgchat/chat_verbs.dm
+++ b/code/modules/tgchat/chat_verbs.dm
@@ -1,5 +1,5 @@
/client/verb/export_chat()
- set category = "OOC"
+ set category = "OOC.Chat"
set name = "Export Chatlog"
set desc = "Allows to trigger the chat export"
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index 85b48569ba7..93c5fe81295 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -183,7 +183,7 @@
/client/verb/tgui_fix_white()
set desc = "Only use this if you have a broken TGUI window occupying your screen!"
set name = "Fix TGUI"
- set category = "OOC"
+ set category = "OOC.Debug"
if(alert(src, "Only use this verb if you have a white TGUI window stuck on your screen.", "Fix TGUI", "Continue", "Nevermind") != "Continue") // Not tgui_alert since we're fixing tgui
return
diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm
index ed2f166c6a2..0661d4b146a 100644
--- a/code/modules/tgui/modules/overmap.dm
+++ b/code/modules/tgui/modules/overmap.dm
@@ -2,6 +2,7 @@
var/obj/effect/overmap/visitable/ship/linked
var/list/viewers
var/extra_view = 0
+ var/map_view_used = FALSE
/datum/tgui_module/ship/New()
. = ..()
@@ -77,13 +78,17 @@
user.reset_view(linked)
user.set_viewsize(world.view + extra_view)
user.AddComponent(/datum/component/recursive_move)
- RegisterSignal(user, COMSIG_OBSERVER_MOVED, /datum/tgui_module/ship/proc/unlook)
+ if(!map_view_used)
+ RegisterSignal(user, COMSIG_OBSERVER_MOVED, /datum/tgui_module/ship/proc/unlook)
+ map_view_used = TRUE
LAZYDISTINCTADD(viewers, WEAKREF(user))
/datum/tgui_module/ship/proc/unlook(var/mob/user)
user.reset_view()
user.set_viewsize() // reset to default
- UnregisterSignal(user, COMSIG_OBSERVER_MOVED)
+ if(map_view_used)
+ UnregisterSignal(user, COMSIG_OBSERVER_MOVED)
+ map_view_used = FALSE
LAZYREMOVE(viewers, WEAKREF(user))
/datum/tgui_module/ship/proc/viewing_overmap(mob/user)
diff --git a/code/modules/tgui_panel/external.dm b/code/modules/tgui_panel/external.dm
index 3e7dbc3178f..a4c8855fca5 100644
--- a/code/modules/tgui_panel/external.dm
+++ b/code/modules/tgui_panel/external.dm
@@ -10,7 +10,7 @@
*/
/client/verb/fix_tgui_panel()
set name = "Fix chat"
- set category = "OOC"
+ set category = "OOC.Debug"
var/action
log_tgui(src, "Started fixing.", context = "verb/fix_tgui_panel")
@@ -35,10 +35,16 @@
// Force show the panel to see if there are any errors
winset(src, "output", "is-disabled=1&is-visible=0")
winset(src, "browseroutput", "is-disabled=0;is-visible=1")
+ // TODO: Remove version check with 516
+ if(byond_version >= 516)
+ if(prefs?.read_preference(/datum/preference/toggle/browser_dev_tools))
+ winset(src, null, "browser-options=[DEFAULT_CLIENT_BROWSER_OPTIONS],devtools")
+ else
+ winset(src, null, "browser-options=[DEFAULT_CLIENT_BROWSER_OPTIONS]")
/client/verb/refresh_tgui()
set name = "Refresh TGUI"
- set category = "OOC"
+ set category = "OOC.Debug"
for(var/window_id in tgui_windows)
var/datum/tgui_window/window = tgui_windows[window_id]
diff --git a/code/modules/vchat/vchat_client.dm b/code/modules/vchat/vchat_client.dm
index 5c4b0e16178..c22a790ef54 100644
--- a/code/modules/vchat/vchat_client.dm
+++ b/code/modules/vchat/vchat_client.dm
@@ -387,7 +387,7 @@ var/to_chat_src
/client/proc/vchat_export_log()
set name = "Export chatlog"
- set category = "OOC"
+ set category = "OOC.Chat"
if(chatOutput.broken)
to_chat(src, span_warning("Error: VChat isn't processing your messages!"))
diff --git a/code/modules/ventcrawl/ventcrawl_multiz.dm b/code/modules/ventcrawl/ventcrawl_multiz.dm
index 87ef8f9ba70..1f669b34072 100644
--- a/code/modules/ventcrawl/ventcrawl_multiz.dm
+++ b/code/modules/ventcrawl/ventcrawl_multiz.dm
@@ -1,7 +1,7 @@
/obj/machinery/atmospherics/pipe/zpipe/up/verb/ventcrawl_move_up()
set name = "Ventcrawl Upwards"
set desc = "Climb up through a pipe."
- set category = "Abilities"
+ set category = "Abilities.General"
set src = usr.loc
var/obj/machinery/atmospherics/target = check_ventcrawl(GetAbove(loc))
if(target) ventcrawl_to(usr, target, UP)
@@ -9,7 +9,7 @@
/obj/machinery/atmospherics/pipe/zpipe/down/verb/ventcrawl_move_down()
set name = "Ventcrawl Downwards"
set desc = "Climb down through a pipe."
- set category = "Abilities"
+ set category = "Abilities.General"
set src = usr.loc
var/obj/machinery/atmospherics/target = check_ventcrawl(GetBelow(loc))
if(target) ventcrawl_to(usr, target, DOWN)
@@ -21,4 +21,4 @@
return node1
if(node2 in target)
return node2
- return
\ No newline at end of file
+ return
diff --git a/code/modules/ventcrawl/ventcrawl_verb.dm b/code/modules/ventcrawl/ventcrawl_verb.dm
index b49f22836dc..82352777be0 100644
--- a/code/modules/ventcrawl/ventcrawl_verb.dm
+++ b/code/modules/ventcrawl/ventcrawl_verb.dm
@@ -1,7 +1,7 @@
/mob/living/proc/ventcrawl()
set name = "Crawl through Vent"
set desc = "Enter an air vent and crawl through the pipe system."
- set category = "Abilities"
+ set category = "Abilities.General"
var/pipe = start_ventcrawl()
if(pipe)
handle_ventcrawl()
diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm
deleted file mode 100644
index e8d1687f648..00000000000
--- a/code/modules/virus2/admin.dm
+++ /dev/null
@@ -1,222 +0,0 @@
-/datum/disease2/disease/Topic(href, href_list)
- . = ..()
- if(.) return
-
- if(href_list["info"])
- // spawn or admin privileges to see info about viruses
- if(!check_rights(R_ADMIN|R_SPAWN|R_EVENT)) return
-
- to_chat(usr, "Infection chance: [infectionchance]; Speed: [speed]; Spread type: [spreadtype]")
- to_chat(usr, "Affected species: [english_list(affected_species)]")
- to_chat(usr, "Effects:")
- for(var/datum/disease2/effectholder/E in effects)
- to_chat(usr, "[E.stage]: [E.effect.name]; chance=[E.chance]; multiplier=[E.multiplier]")
- to_chat(usr, "Antigens: [antigens2string(antigen)]; Resistance: [resistance]")
-
- return 1
-
-/datum/disease2/disease/vv_get_header()
- . = list()
- for(var/datum/disease2/effectholder/E in effects)
- . += "[E.stage]: [E.effect.name]"
- . = list({"
- [name()]
- [jointext(., " ")]
- "})
-
-/datum/disease2/disease/get_view_variables_options()
- return ..() + {"
-
- "}
-
-/datum/admins/var/datum/virus2_editor/virus2_editor_datum = new
-/client/proc/virus2_editor()
- set name = "Virus Editor"
- set category = "Admin"
- if(!holder || !check_rights(R_SPAWN)) return // spawn privileges to create viruses
-
- holder.virus2_editor_datum.show_ui(src)
-
-/datum/virus2_editor
- var/list/s = list(/datum/disease2/effect/invisible,/datum/disease2/effect/invisible,/datum/disease2/effect/invisible,/datum/disease2/effect/invisible)
- var/list/s_chance = list(1,1,1,1)
- var/list/s_multiplier = list(1,1,1,1)
- var/species = list()
- var/infectionchance = 70
- var/spreadtype = "Contact"
- var/list/antigens = list()
- var/speed = 1
- var/resistance = 10
- var/mob/living/carbon/infectee = null
-
- // this holds spawned viruses so that the "Info" links work after the proc exits
- var/list/spawned_viruses = list()
-
-/datum/virus2_editor/proc/select(mob/user, stage)
- if(stage < 1 || stage > 4) return
-
- var/list/L = list()
-
- for(var/datum/disease2/effect/f as anything in subtypesof(/datum/disease2/effect))
- if(initial(f.stage) <= stage)
- L[initial(f.name)] = f
-
- var/datum/disease2/effect/Eff = s[stage]
-
- var/C = tgui_input_list(usr, "Select effect for stage [stage]:", "Stage [stage]", L, Eff)
- if(!C) return
- return L[C]
-
-/datum/virus2_editor/proc/show_ui(mob/user)
- var/H = {"
-