" dat += "Hear Vore Sounds: [(cit_toggles & EATING_NOISES) ? "Yes" : "No"] " dat += "Hear Vore Digestion Sounds: [(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"] " + dat += "Lewdchem:[lewdchem == TRUE ? "Enabled" : "Disabled"] " dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"] " dat += "Auto stand: [autostand ? "Enabled" : "Disabled"] " dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")] " @@ -916,11 +951,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += " | Description | BANNED | " + HTML += "[rank]BANNED | " continue var/required_playtime_remaining = job.required_playtime_remaining(user.client) if(required_playtime_remaining) @@ -1020,7 +1051,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/available_in_days = job.available_in_days(user.client) HTML += "[rank]\[IN [(available_in_days)] DAYS\] | " continue - if((job_civilian_low & overflow.flag) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role)) + if(!user.client.prefs.pref_species.qualifies_for_rank(rank, user.client.prefs.features)) + if(user.client.prefs.pref_species.id == "human") + HTML += "[rank]\[MUTANT\] | " + else + HTML += "[rank]\[NON-HUMAN\] | " + continue + if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role)) HTML += "[rank]" continue if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs @@ -1035,32 +1072,32 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/prefUpperLevel = -1 // level to assign on left click var/prefLowerLevel = -1 // level to assign on right click - if(GetJobDepartment(job, 1) & job.flag) - prefLevelLabel = "High" - prefLevelColor = "slateblue" - prefUpperLevel = 4 - prefLowerLevel = 2 - else if(GetJobDepartment(job, 2) & job.flag) - prefLevelLabel = "Medium" - prefLevelColor = "green" - prefUpperLevel = 1 - prefLowerLevel = 3 - else if(GetJobDepartment(job, 3) & job.flag) - prefLevelLabel = "Low" - prefLevelColor = "orange" - prefUpperLevel = 2 - prefLowerLevel = 4 - else - prefLevelLabel = "NEVER" - prefLevelColor = "red" - prefUpperLevel = 3 - prefLowerLevel = 1 - + switch(job_preferences["[job.title]"]) + if(JP_HIGH) + prefLevelLabel = "High" + prefLevelColor = "slateblue" + prefUpperLevel = 4 + prefLowerLevel = 2 + if(JP_MEDIUM) + prefLevelLabel = "Medium" + prefLevelColor = "green" + prefUpperLevel = 1 + prefLowerLevel = 3 + if(JP_LOW) + prefLevelLabel = "Low" + prefLevelColor = "orange" + prefUpperLevel = 2 + prefLowerLevel = 4 + else + prefLevelLabel = "NEVER" + prefLevelColor = "red" + prefUpperLevel = 3 + prefLowerLevel = 1 HTML += "" if(rank == SSjob.overflow_role)//Overflow is special - if(job_civilian_low & overflow.flag) + if(job_preferences["[SSjob.overflow_role]"] == JP_LOW) HTML += "Yes" else HTML += "No" @@ -1091,61 +1128,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/proc/SetJobPreferenceLevel(datum/job/job, level) if (!job) - return 0 + return FALSE - if (level == 1) // to high - // remove any other job(s) set to high - job_civilian_med |= job_civilian_high - job_engsec_med |= job_engsec_high - job_medsci_med |= job_medsci_high - job_civilian_high = 0 - job_engsec_high = 0 - job_medsci_high = 0 + if (level == JP_HIGH) // to high + //Set all other high to medium + for(var/j in job_preferences) + if(job_preferences["[j]"] == JP_HIGH) + job_preferences["[j]"] = JP_MEDIUM + //technically break here - if (job.department_flag == CIVILIAN) - job_civilian_low &= ~job.flag - job_civilian_med &= ~job.flag - job_civilian_high &= ~job.flag - - switch(level) - if (1) - job_civilian_high |= job.flag - if (2) - job_civilian_med |= job.flag - if (3) - job_civilian_low |= job.flag - - return 1 - else if (job.department_flag == ENGSEC) - job_engsec_low &= ~job.flag - job_engsec_med &= ~job.flag - job_engsec_high &= ~job.flag - - switch(level) - if (1) - job_engsec_high |= job.flag - if (2) - job_engsec_med |= job.flag - if (3) - job_engsec_low |= job.flag - - return 1 - else if (job.department_flag == MEDSCI) - job_medsci_low &= ~job.flag - job_medsci_med &= ~job.flag - job_medsci_high &= ~job.flag - - switch(level) - if (1) - job_medsci_high |= job.flag - if (2) - job_medsci_med |= job.flag - if (3) - job_medsci_low |= job.flag - - return 1 - - return 0 + job_preferences["[job.title]"] = level + return TRUE /datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl) if(!SSjob || SSjob.occupations.len <= 0) @@ -1162,64 +1155,29 @@ GLOBAL_LIST_EMPTY(preferences_datums) ShowChoices(user) return - if(role == SSjob.overflow_role) - if(job_civilian_low & job.flag) - job_civilian_low &= ~job.flag - else - job_civilian_low |= job.flag - SetChoices(user) - return 1 + var/jpval = null + switch(desiredLvl) + if(3) + jpval = JP_LOW + if(2) + jpval = JP_MEDIUM + if(1) + jpval = JP_HIGH - SetJobPreferenceLevel(job, desiredLvl) + if(role == SSjob.overflow_role) + if(job_preferences["[job.title]"] == JP_LOW) + jpval = null + else + jpval = JP_LOW + + SetJobPreferenceLevel(job, jpval) SetChoices(user) return 1 /datum/preferences/proc/ResetJobs() - - job_civilian_high = 0 - job_civilian_med = 0 - job_civilian_low = 0 - - job_medsci_high = 0 - job_medsci_med = 0 - job_medsci_low = 0 - - job_engsec_high = 0 - job_engsec_med = 0 - job_engsec_low = 0 - - -/datum/preferences/proc/GetJobDepartment(datum/job/job, level) - if(!job || !level) - return 0 - switch(job.department_flag) - if(CIVILIAN) - switch(level) - if(1) - return job_civilian_high - if(2) - return job_civilian_med - if(3) - return job_civilian_low - if(MEDSCI) - switch(level) - if(1) - return job_medsci_high - if(2) - return job_medsci_med - if(3) - return job_medsci_low - if(ENGSEC) - switch(level) - if(1) - return job_engsec_high - if(2) - return job_engsec_med - if(3) - return job_engsec_low - return 0 + job_preferences = list() /datum/preferences/proc/SetQuirks(mob/user) if(!SSquirks) @@ -1533,7 +1491,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("undie_color") var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", undie_color) as color|null if(n_undie_color) - undie_color = sanitize_hexcolor(n_undie_color, include_crunch= TRUE) + undie_color = sanitize_hexcolor(n_undie_color) if("undershirt") var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_list @@ -1543,7 +1501,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("shirt_color") var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", shirt_color) as color|null if(n_shirt_color) - shirt_color = sanitize_hexcolor(n_shirt_color, include_crunch= TRUE) + shirt_color = sanitize_hexcolor(n_shirt_color) if("socks") var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in GLOB.socks_list @@ -1553,7 +1511,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("socks_color") var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", socks_color) as color|null if(n_socks_color) - socks_color = sanitize_hexcolor(n_socks_color, include_crunch= TRUE) + socks_color = sanitize_hexcolor(n_socks_color) if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null @@ -1561,9 +1519,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) eye_color = sanitize_hexcolor(new_eyes) if("species") - var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_races + var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_race_names if(result) - var/newtype = GLOB.species_list[result] + var/newtype = GLOB.species_list[GLOB.roundstart_race_names[result]] pref_species = new newtype() //let's ensure that no weird shit happens on species swapping. custom_species = null @@ -1691,6 +1649,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["tail_human"] = "None" features["tail_lizard"] = "None" + if("meats") + var/new_meat + new_meat = input(user, "Choose your character's meat type:", "Character Preference") as null|anything in GLOB.meat_types + if(new_meat) + features["meat_type"] = new_meat + if("snout") var/list/snowflake_snouts_list = list() for(var/path in GLOB.snouts_list) @@ -1726,12 +1690,28 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_horns) features["horns"] = new_horns + if("horns_color") + var/new_horn_color = input(user, "Choose your character's horn colour:", "Character Preference","#"+horn_color) as color|null + if(new_horn_color) + if (new_horn_color == "#000000") + horn_color = "#85615A" + else + horn_color = sanitize_hexcolor(new_horn_color) + if("wings") var/new_wings new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.r_wings_list if(new_wings) features["wings"] = new_wings + if("wings_color") + var/new_wing_color = input(user, "Choose your character's wing colour:", "Character Preference","#"+wing_color) as color|null + if(new_wing_color) + if (new_wing_color == "#000000") + wing_color = "#FFFFFF" + else + wing_color = sanitize_hexcolor(new_wing_color) + if("frills") var/new_frills new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in GLOB.frills_list @@ -1760,11 +1740,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["legs"] = new_legs update_preview_icon() - if("moth_wings") - var/new_moth_wings - new_moth_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.moth_wings_list - if(new_moth_wings) - features["moth_wings"] = new_moth_wings + if("insect_wings") + var/new_insect_wings + new_insect_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_wings_list + if(new_insect_wings) + features["insect_wings"] = new_insect_wings + + if("deco_wings") + var/new_deco_wings + new_deco_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.deco_wings_list + if(new_deco_wings) + features["deco_wings"] = new_deco_wings + + if("insect_fluffs") + var/new_insect_fluff + new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list + if(new_insect_fluff) + features["insect_fluff"] = new_insect_fluff if("s_tone") var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones @@ -2037,6 +2029,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["genitals_use_skintone"] = !features["genitals_use_skintone"] if("arousable") arousable = !arousable + if("lewdchem") + lewdchem = !lewdchem if("has_cock") features["has_cock"] = !features["has_cock"] if(features["has_cock"] == FALSE) @@ -2053,6 +2047,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["eggsack_internal"] = !features["eggsack_internal"] if("has_breasts") features["has_breasts"] = !features["has_breasts"] + if(features["has_breasts"] == FALSE) + features["breasts_producing"] = FALSE + if("breasts_producing") + features["breasts_producing"] = !features["breasts_producing"] if("has_vag") features["has_vag"] = !features["has_vag"] if(features["has_vag"] == FALSE) @@ -2236,7 +2234,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(!is_loadout_slot_available(G.category)) to_chat(user, "You cannot take this loadout, as you've already chosen too many of the same category!") return - if(G.ckeywhitelist && G.ckeywhitelist.len && !(user.ckey in G.ckeywhitelist)) + if(G.donoritem && !G.donator_ckey_check(user.ckey)) to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.") return if(gear_points >= initial(G.cost)) @@ -2278,6 +2276,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) organ_eyes.old_eye_color = eye_color character.hair_color = hair_color character.facial_hair_color = facial_hair_color + character.horn_color = horn_color + character.wing_color = wing_color character.skin_tone = skin_tone character.hair_style = hair_style @@ -2318,7 +2318,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("xenotail" in pref_species.default_features) character.dna.species.mutant_bodyparts |= "xenotail" - if(("legs" in character.dna.species.mutant_bodyparts) && character.dna.features["legs"] == "Digitigrade Legs") + if("meat_type" in pref_species.default_features) + character.type_of_meat = GLOB.meat_types[features["meat_type"]] + + if(("legs" in character.dna.species.mutant_bodyparts) && (character.dna.features["legs"] == "Digitigrade" || character.dna.features["legs"] == "Avian")) pref_species.species_traits |= DIGITIGRADE else pref_species.species_traits -= DIGITIGRADE diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4ce91ffd94..01a46a44a0 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 20 +#define SAVEFILE_VERSION_MAX 23 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -49,6 +49,65 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pda_style = "mono" if(current_version < 20) pda_color = "#808000" + if((current_version < 21) && features["meat_type"] && (features["meat_type"] == null)) + features["meat_type"] = "Mammalian" + if(current_version < 22) + + job_preferences = list() //It loaded null from nonexistant savefile field. + + var/job_civilian_high = 0 + var/job_civilian_med = 0 + var/job_civilian_low = 0 + + var/job_medsci_high = 0 + var/job_medsci_med = 0 + var/job_medsci_low = 0 + + var/job_engsec_high = 0 + var/job_engsec_med = 0 + var/job_engsec_low = 0 + + S["job_civilian_high"] >> job_civilian_high + S["job_civilian_med"] >> job_civilian_med + S["job_civilian_low"] >> job_civilian_low + S["job_medsci_high"] >> job_medsci_high + S["job_medsci_med"] >> job_medsci_med + S["job_medsci_low"] >> job_medsci_low + S["job_engsec_high"] >> job_engsec_high + S["job_engsec_med"] >> job_engsec_med + S["job_engsec_low"] >> job_engsec_low + + //Can't use SSjob here since this happens right away on login + for(var/job in subtypesof(/datum/job)) + var/datum/job/J = job + var/new_value + var/fval = initial(J.flag) + switch(initial(J.department_flag)) + if(CIVILIAN) + if(job_civilian_high & fval) + new_value = JP_HIGH + else if(job_civilian_med & fval) + new_value = JP_MEDIUM + else if(job_civilian_low & fval) + new_value = JP_LOW + if(MEDSCI) + if(job_medsci_high & fval) + new_value = JP_HIGH + else if(job_medsci_med & fval) + new_value = JP_MEDIUM + else if(job_medsci_low & fval) + new_value = JP_LOW + if(ENGSEC) + if(job_engsec_high & fval) + new_value = JP_HIGH + else if(job_engsec_med & fval) + new_value = JP_MEDIUM + else if(job_engsec_low & fval) + new_value = JP_LOW + if(new_value) + job_preferences["[initial(J.title)]"] = new_value + else if(current_version < 23) // we are fixing a gamebreaking bug. + job_preferences = list() //It loaded null from nonexistant savefile field. /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) @@ -117,6 +176,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["widescreenpref"] >> widescreenpref S["autostand"] >> autostand S["cit_toggles"] >> cit_toggles + S["lewdchem"] >> lewdchem //try to fix any outdated data if necessary if(needs_update >= 0) @@ -211,6 +271,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["widescreenpref"], widescreenpref) WRITE_FILE(S["autostand"], autostand) WRITE_FILE(S["cit_toggles"], cit_toggles) + WRITE_FILE(S["lewdchem"], lewdchem) return 1 @@ -244,6 +305,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/species_id S["species"] >> species_id if(species_id) + if(species_id == "avian" || species_id == "aquatic") + species_id = "mammal" + else if(species_id == "moth") + species_id = "insect" + var/newtype = GLOB.species_list[species_id] if(newtype) pref_species = new newtype @@ -251,29 +317,37 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000") WRITE_FILE(S["features["mcolor"]"] , "#FFF") + if(!S["features["horn_color"]"] || S["features["horn_color"]"] == "#000") + WRITE_FILE(S["features["horn_color"]"] , "#85615a") + + if(!S["features["wing_color"]"] || S["features["wing_color"]"] == "#000") + WRITE_FILE(S["features["wing_color"]"] , "#FFF") + //Character - S["real_name"] >> real_name - S["nameless"] >> nameless - S["custom_species"] >> custom_species - S["name_is_always_random"] >> be_random_name - S["body_is_always_random"] >> be_random_body - S["gender"] >> gender - S["age"] >> age - S["hair_color"] >> hair_color - S["facial_hair_color"] >> facial_hair_color - S["eye_color"] >> eye_color - S["skin_tone"] >> skin_tone - S["hair_style_name"] >> hair_style - S["facial_style_name"] >> facial_hair_style - S["underwear"] >> underwear - S["undie_color"] >> undie_color - S["undershirt"] >> undershirt - S["shirt_color"] >> shirt_color - S["socks"] >> socks - S["socks_color"] >> socks_color - S["backbag"] >> backbag - S["jumpsuit_style"] >> jumpsuit_style - S["uplink_loc"] >> uplink_spawn_loc + S["real_name"] >> real_name + S["nameless"] >> nameless + S["custom_species"] >> custom_species + S["name_is_always_random"] >> be_random_name + S["body_is_always_random"] >> be_random_body + S["gender"] >> gender + S["age"] >> age + S["hair_color"] >> hair_color + S["facial_hair_color"] >> facial_hair_color + S["eye_color"] >> eye_color + S["skin_tone"] >> skin_tone + S["hair_style_name"] >> hair_style + S["facial_style_name"] >> facial_hair_style + S["underwear"] >> underwear + S["undie_color"] >> undie_color + S["undershirt"] >> undershirt + S["shirt_color"] >> shirt_color + S["socks"] >> socks + S["socks_color"] >> socks_color + S["horn_color"] >> horn_color + S["wing_color"] >> wing_color + S["backbag"] >> backbag + S["jumpsuit_style"] >> jumpsuit_style + S["uplink_loc"] >> uplink_spawn_loc S["feature_mcolor"] >> features["mcolor"] S["feature_lizard_tail"] >> features["tail_lizard"] S["feature_lizard_snout"] >> features["snout"] @@ -282,29 +356,24 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_lizard_spines"] >> features["spines"] S["feature_lizard_body_markings"] >> features["body_markings"] S["feature_lizard_legs"] >> features["legs"] - S["feature_moth_wings"] >> features["moth_wings"] S["feature_human_tail"] >> features["tail_human"] S["feature_human_ears"] >> features["ears"] + S["feature_insect_wings"] >> features["insect_wings"] + S["feature_deco_wings"] >> features["deco_wings"] + S["feature_insect_fluff"] >> features["insect_fluff"] //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this S[savefile_slot_name] >> custom_names[custom_name_id] - S["preferred_ai_core_display"] >> preferred_ai_core_display - S["prefered_security_department"] >> prefered_security_department + S["preferred_ai_core_display"] >> preferred_ai_core_display + S["prefered_security_department"] >> prefered_security_department //Jobs S["joblessrole"] >> joblessrole - S["job_civilian_high"] >> job_civilian_high - S["job_civilian_med"] >> job_civilian_med - S["job_civilian_low"] >> job_civilian_low - S["job_medsci_high"] >> job_medsci_high - S["job_medsci_med"] >> job_medsci_med - S["job_medsci_low"] >> job_medsci_low - S["job_engsec_high"] >> job_engsec_high - S["job_engsec_med"] >> job_engsec_med - S["job_engsec_low"] >> job_engsec_low + //Load prefs + S["job_preferences"] >> job_preferences //Quirks S["all_quirks"] >> all_quirks @@ -323,6 +392,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_mam_tail_animated"] >> features["mam_tail_animated"] S["feature_taur"] >> features["taur"] S["feature_mam_snouts"] >> features["mam_snouts"] + S["feature_meat"] >> features["meat_type"] //Xeno features S["feature_xeno_tail"] >> features["xenotail"] S["feature_xeno_dors"] >> features["xenodorsal"] @@ -347,6 +417,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_breasts_shape"] >> features["breasts_shape"] S["feature_breasts_color"] >> features["breasts_color"] S["feature_breasts_fluid"] >> features["breasts_fluid"] + S["feature_breasts_producing"] >> features["breasts_producing"] //vagina features S["feature_has_vag"] >> features["has_vag"] S["feature_vag_shape"] >> features["vag_shape"] @@ -371,11 +442,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize - real_name = reject_bad_name(real_name) - gender = sanitize_gender(gender, TRUE, TRUE) + real_name = reject_bad_name(real_name) + gender = sanitize_gender(gender, TRUE, TRUE) if(!real_name) - real_name = random_unique_name(gender) - custom_species = reject_bad_name(custom_species) + real_name = random_unique_name(gender) + custom_species = reject_bad_name(custom_species) for(var/custom_name_id in GLOB.preferences_custom_names) var/namedata = GLOB.preferences_custom_names[custom_name_id] custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"]) @@ -385,57 +456,63 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!features["mcolor"] || features["mcolor"] == "#000") features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") - nameless = sanitize_integer(nameless, 0, 1, initial(nameless)) + if(!features["horn_color"] || features["horn_color"] == "#000") + features["horn_color"] = "85615a" + + if(!features["wing_color"] || features["wing_color"] == "#000") + features["wing_color"] = "FFFFFF" + + nameless = sanitize_integer(nameless, 0, 1, initial(nameless)) be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name)) be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body)) if(gender == MALE) - hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list) + hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_male_list) facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_male_list) else - hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list) + hair_style = sanitize_inlist(hair_style, GLOB.hair_styles_female_list) facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_female_list) - underwear = sanitize_inlist(underwear, GLOB.underwear_list) - undie_color = sanitize_hexcolor(undie_color, 6, 1, initial(undie_color)) - undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list) - shirt_color = sanitize_hexcolor(shirt_color, 6, 1, initial(shirt_color)) - socks = sanitize_inlist(socks, GLOB.socks_list) - socks_color = sanitize_hexcolor(socks_color, 6, 1, initial(socks_color)) - age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - hair_color = sanitize_hexcolor(hair_color, 3, 0) - facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0) - eye_color = sanitize_hexcolor(eye_color, 3, 0) - skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones) - backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag)) - jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style)) - uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc)) - features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) - features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard) - features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human) - features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list) - features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list) - features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list) - features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list) - features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list) - features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list) + underwear = sanitize_inlist(underwear, GLOB.underwear_list) + undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color)) + undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list) + shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color)) + socks = sanitize_inlist(socks, GLOB.socks_list) + socks_color = sanitize_hexcolor(socks_color, 3, FALSE, initial(socks_color)) + age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) + hair_color = sanitize_hexcolor(hair_color, 3, 0) + facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0) + eye_color = sanitize_hexcolor(eye_color, 3, 0) + skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones) + horn_color = sanitize_hexcolor(horn_color, 3, FALSE) + wing_color = sanitize_hexcolor(wing_color, 3, FALSE, "#FFFFFF") + backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag)) + jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style)) + uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc)) + features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) + features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard) + features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human) + features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list) + features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list) + features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list) + features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list) + features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list) + features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list) features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list) - features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list) + features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list) + features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None") + features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) - job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) - job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) - job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) - job_medsci_high = sanitize_integer(job_medsci_high, 0, 65535, initial(job_medsci_high)) - job_medsci_med = sanitize_integer(job_medsci_med, 0, 65535, initial(job_medsci_med)) - job_medsci_low = sanitize_integer(job_medsci_low, 0, 65535, initial(job_medsci_low)) - job_engsec_high = sanitize_integer(job_engsec_high, 0, 65535, initial(job_engsec_high)) - job_engsec_med = sanitize_integer(job_engsec_med, 0, 65535, initial(job_engsec_med)) - job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) + //Validate job prefs + for(var/j in job_preferences) + if(job_preferences["[j]"] != JP_LOW && job_preferences["[j]"] != JP_MEDIUM && job_preferences["[j]"] != JP_HIGH) + job_preferences -= j all_quirks = SANITIZE_LIST(all_quirks) + positive_quirks = SANITIZE_LIST(positive_quirks) negative_quirks = SANITIZE_LIST(negative_quirks) - neutral_quirks = SANITIZE_LIST(neutral_quirks) + neutral_quirks = SANITIZE_LIST(neutral_quirks) cit_character_pref_load(S) @@ -457,31 +534,33 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.) //Character - WRITE_FILE(S["real_name"] , real_name) - WRITE_FILE(S["nameless"] , nameless) - WRITE_FILE(S["custom_species"] , custom_species) - WRITE_FILE(S["name_is_always_random"] , be_random_name) - WRITE_FILE(S["body_is_always_random"] , be_random_body) - WRITE_FILE(S["gender"] , gender) - WRITE_FILE(S["age"] , age) - WRITE_FILE(S["hair_color"] , hair_color) - WRITE_FILE(S["facial_hair_color"] , facial_hair_color) - WRITE_FILE(S["eye_color"] , eye_color) - WRITE_FILE(S["skin_tone"] , skin_tone) - WRITE_FILE(S["hair_style_name"] , hair_style) - WRITE_FILE(S["facial_style_name"] , facial_hair_style) - WRITE_FILE(S["underwear"] , underwear) - WRITE_FILE(S["undie_color"] , undie_color) - WRITE_FILE(S["undershirt"] , undershirt) - WRITE_FILE(S["shirt_color"] , shirt_color) - WRITE_FILE(S["socks"] , socks) - WRITE_FILE(S["socks_color"] , socks_color) - WRITE_FILE(S["backbag"] , backbag) - WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style) - WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) - WRITE_FILE(S["species"] , pref_species.id) + WRITE_FILE(S["real_name"] , real_name) + WRITE_FILE(S["nameless"] , nameless) + WRITE_FILE(S["custom_species"] , custom_species) + WRITE_FILE(S["name_is_always_random"] , be_random_name) + WRITE_FILE(S["body_is_always_random"] , be_random_body) + WRITE_FILE(S["gender"] , gender) + WRITE_FILE(S["age"] , age) + WRITE_FILE(S["hair_color"] , hair_color) + WRITE_FILE(S["facial_hair_color"] , facial_hair_color) + WRITE_FILE(S["eye_color"] , eye_color) + WRITE_FILE(S["skin_tone"] , skin_tone) + WRITE_FILE(S["hair_style_name"] , hair_style) + WRITE_FILE(S["facial_style_name"] , facial_hair_style) + WRITE_FILE(S["underwear"] , underwear) + WRITE_FILE(S["undie_color"] , undie_color) + WRITE_FILE(S["undershirt"] , undershirt) + WRITE_FILE(S["shirt_color"] , shirt_color) + WRITE_FILE(S["socks"] , socks) + WRITE_FILE(S["socks_color"] , socks_color) + WRITE_FILE(S["horn_color"] , horn_color) + WRITE_FILE(S["wing_color"] , wing_color) + WRITE_FILE(S["backbag"] , backbag) + WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style) + WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) + WRITE_FILE(S["species"] , pref_species.id) WRITE_FILE(S["feature_mcolor"] , features["mcolor"]) - WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"]) + WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"]) WRITE_FILE(S["feature_human_tail"] , features["tail_human"]) WRITE_FILE(S["feature_lizard_snout"] , features["snout"]) WRITE_FILE(S["feature_lizard_horns"] , features["horns"]) @@ -489,28 +568,24 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_lizard_frills"] , features["frills"]) WRITE_FILE(S["feature_lizard_spines"] , features["spines"]) WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) - WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) - WRITE_FILE(S["feature_moth_wings"] , features["moth_wings"]) + WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) + WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"]) + WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"]) + WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"]) + WRITE_FILE(S["feature_meat"] , features["meat_type"]) //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this WRITE_FILE(S[savefile_slot_name],custom_names[custom_name_id]) - WRITE_FILE(S["preferred_ai_core_display"] , preferred_ai_core_display) - WRITE_FILE(S["prefered_security_department"] , prefered_security_department) + WRITE_FILE(S["preferred_ai_core_display"] , preferred_ai_core_display) + WRITE_FILE(S["prefered_security_department"] , prefered_security_department) //Jobs WRITE_FILE(S["joblessrole"] , joblessrole) - WRITE_FILE(S["job_civilian_high"] , job_civilian_high) - WRITE_FILE(S["job_civilian_med"] , job_civilian_med) - WRITE_FILE(S["job_civilian_low"] , job_civilian_low) - WRITE_FILE(S["job_medsci_high"] , job_medsci_high) - WRITE_FILE(S["job_medsci_med"] , job_medsci_med) - WRITE_FILE(S["job_medsci_low"] , job_medsci_low) - WRITE_FILE(S["job_engsec_high"] , job_engsec_high) - WRITE_FILE(S["job_engsec_med"] , job_engsec_med) - WRITE_FILE(S["job_engsec_low"] , job_engsec_low) + //Write prefs + WRITE_FILE(S["job_preferences"] , job_preferences) //Quirks WRITE_FILE(S["all_quirks"] , all_quirks) diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm index 4049034203..b371372dfe 100644 --- a/code/modules/client/verbs/looc.dm +++ b/code/modules/client/verbs/looc.dm @@ -1,3 +1,6 @@ +GLOBAL_VAR_INIT(LOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour. +GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC") + /client/verb/looc(msg as text) set name = "LOOC" set desc = "Local OOC, seen only by those in view." @@ -59,30 +62,17 @@ continue //Also handled later. if(C.prefs.toggles & CHAT_OOC) -// var/display_name = src.key -// if(holder) -// if(holder.fakekey) -// if(C.holder) -// display_name = "[holder.fakekey]/([src.key])" -// else -// display_name = holder.fakekey - to_chat(C,"LOOC: [src.mob.name]: ") + if(GLOB.LOOC_COLOR) + to_chat(C, "LOOC: [src.mob.name]: ") + else + to_chat(C, "LOOC: [src.mob.name]: ") for(var/client/C in GLOB.admins) if(C.prefs.toggles & CHAT_OOC) var/prefix = "(R)LOOC" if (C.mob in heard) prefix = "LOOC" - to_chat(C,"[ADMIN_FLW(usr)][prefix]: [src.key]/[src.mob.name]: ") - - /*for(var/mob/dead/observer/G in world) - if(!G.client) - continue - var/client/C = G.client - if (C in GLOB.admins) - continue //handled earlier. - if(C.prefs.toggles & CHAT_OOC) - var/prefix = "(G)LOOC" - if (C.mob in heard) - prefix = "LOOC" - to_chat(C,"[prefix]: [src.key]/[src.mob.name]: ")*/ + if(GLOB.LOOC_COLOR) + to_chat(C, "[ADMIN_FLW(usr)] [prefix]: [src.key]/[src.mob.name]: ") + else + to_chat(C, "[ADMIN_FLW(usr)] [prefix]: [src.key]/[src.mob.name]: ") diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 04a8e17b7b..33a83487fc 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -437,7 +437,7 @@ item_state = "gas_alt" resistance_flags = NONE armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 @@ -630,3 +630,27 @@ /obj/item/stamp/chameleon/broken/Initialize() . = ..() chameleon_action.emp_randomise(INFINITY) + +/obj/item/clothing/neck/cloak/chameleon + name = "black tie" + desc = "A neosilk clip-on tie." + icon_state = "blacktie" + item_color = "blacktie" + resistance_flags = NONE + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + +/obj/item/clothing/neck/cloak/chameleon + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/neck/cloak/chameleon/Initialize() + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/neck + chameleon_action.chameleon_name = "Cloak" + chameleon_action.initialize_disguises() + +/obj/item/clothing/neck/cloak/chameleon/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + chameleon_action.emp_randomise() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index ed3e9f9b89..20a8c518f4 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -41,6 +41,13 @@ var/dynamic_hair_suffix = ""//head > mask for head hair var/dynamic_fhair_suffix = ""//mask > head for facial hair + //basically a restriction list. + var/list/species_restricted = null + //Basically syntax is species_restricted = list("Species Name","Species Name") + //Add a "exclude" string to do the opposite, making it only only species listed that can't wear it. + //You append this to clothing objects. + + /obj/item/clothing/Initialize() . = ..() if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) @@ -338,3 +345,38 @@ BLIND // can't see anything deconstruct(FALSE) else ..() + + +//Species-restricted clothing check. - Thanks Oraclestation, BS13, /vg/station etc. +/obj/item/clothing/mob_can_equip(mob/M, slot, disable_warning = TRUE) + + //if we can't equip the item anyway, don't bother with species_restricted (also cuts down on spam) + if(!..()) + return FALSE + + // Skip species restriction checks on non-equipment slots + if(slot in list(SLOT_IN_BACKPACK, SLOT_L_STORE, SLOT_R_STORE)) + return TRUE + + if(species_restricted && ishuman(M)) + + var/wearable = null + var/exclusive = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) //TURNS IT INTO A BLACKLIST - AKA ALL MINUS SPECIES LISTED. + exclusive = TRUE + + if(H.dna.species) + if(exclusive) + if(!(H.dna.species.name in species_restricted)) + wearable = TRUE + else + if(H.dna.species.name in species_restricted) + wearable = TRUE + + if(!wearable) + to_chat(M, "Your species cannot wear [src].") + return FALSE + + return TRUE diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 097b10cae5..4928de288f 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -281,6 +281,33 @@ ..() user.cure_blind("blindfold_[REF(src)]") +/obj/item/clothing/glasses/sunglasses/blindfold/white + name = "blind personnel blindfold" + desc = "Indicates that the wearer suffers from blindness." + icon_state = "blindfoldwhite" + item_state = "blindfoldwhite" + var/colored_before = FALSE + +/obj/item/clothing/glasses/sunglasses/blindfold/white/equipped(mob/living/carbon/human/user, slot) + if(ishuman(user) && slot == SLOT_GLASSES) + update_icon(user) + user.update_inv_glasses() //Color might have been changed by update_icon. + ..() + +/obj/item/clothing/glasses/sunglasses/blindfold/white/update_icon(mob/living/carbon/human/user) + if(ishuman(user) && !colored_before) + add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY) + colored_before = TRUE + +/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, file2use) + . = list() + if(!isinhands && ishuman(loc) && !colored_before) + var/mob/living/carbon/human/H = loc + var/mutable_appearance/M = mutable_appearance('icons/mob/eyes.dmi', "blindfoldwhite") + M.appearance_flags |= RESET_COLOR + M.color = "#[H.eye_color]" + . += M + /obj/item/clothing/glasses/sunglasses/big desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks flashes." icon_state = "bigsunglasses" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index a87e95e28c..387aa65d20 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -24,11 +24,13 @@ desc = "[desc] The display is flickering slightly." /obj/item/clothing/glasses/hud/emag_act(mob/user) + . = ..() if(obj_flags & EMAGGED) return obj_flags |= EMAGGED to_chat(user, "PZZTTPFFFT") desc = "[desc] The display is flickering slightly." + return TRUE /obj/item/clothing/glasses/hud/health name = "health scanner HUD" diff --git a/code/modules/clothing/glasses/vg_glasses.dm b/code/modules/clothing/glasses/vg_glasses.dm index 449b34b22e..a51a03242c 100644 --- a/code/modules/clothing/glasses/vg_glasses.dm +++ b/code/modules/clothing/glasses/vg_glasses.dm @@ -6,21 +6,18 @@ name = "purple sunglasses" icon_state = "sun_purple" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/sunglasses/star name = "star-shaped sunglasses" desc = "Novelty sunglasses, both lenses are in the shape of a star." icon_state = "sun_star" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/sunglasses/rockstar name = "red star-shaped sunglasses" desc = "Novelty sunglasses with a fancy silver frame and two red-tinted star-shaped lenses. You should probably stomp on them and get a pair of normal ones." icon_state = "sun_star_silver" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/gglasses name = "Green Glasses" @@ -28,7 +25,6 @@ icon_state = "gglasses" item_state = "gglasses" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' /obj/item/clothing/glasses/welding/superior name = "superior welding goggles" @@ -36,7 +32,6 @@ icon_state = "rwelding-g" item_state = "rwelding-g" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/glasses.dmi' actions_types = list(/datum/action/item_action/toggle) flash_protect = 2 tint = 1 diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index bc36353ac5..cc6d65b74d 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -65,6 +65,9 @@ var/warcry = "AT" /obj/item/clothing/gloves/rapid/Touch(mob/living/target,proximity = TRUE) + if(!istype(target)) + return + var/mob/living/M = loc if(M.a_intent == INTENT_HARM) @@ -72,9 +75,33 @@ M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click. if(warcry) M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") + .= FALSE + /obj/item/clothing/gloves/rapid/attack_self(mob/user) var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7) if(input) warcry = input + +/obj/item/clothing/gloves/rapid/hug + name = "Hugs of the North Star" + desc = "Just looking at these fills you with an urge to hug the shit out of people" + warcry = "owo" //Shouldn't ever come into play + +/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE) + if(!istype(target)) + return + + var/mob/living/M = loc + + if(M.a_intent == INTENT_HELP) + if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead + if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions + return + else + M.changeNext_move(CLICK_CD_RAPID) + . = FALSE + +/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user) + return FALSE \ No newline at end of file diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index bbae5b261f..a5fb04d393 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -74,4 +74,13 @@ icon_state = "beaniestripedgreen" item_color = "beaniestripedgreen" +/obj/item/clothing/head/beanie/durathread + name = "durathread beanie" + desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer." + icon_state = "beaniedurathread" + item_color = null + armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) + + + //No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet \ No newline at end of file diff --git a/code/modules/clothing/head/cit_hats.dm b/code/modules/clothing/head/cit_hats.dm index 7b0e68264f..df4a21d6c1 100644 --- a/code/modules/clothing/head/cit_hats.dm +++ b/code/modules/clothing/head/cit_hats.dm @@ -4,4 +4,3 @@ icon = 'modular_citadel/icons/obj/clothing/cit_hats.dmi' icon_state = "hunter" item_state = "hunter_worn" - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index f4b4e4a96d..be6e270e45 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -336,3 +336,11 @@ for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() + + +/obj/item/clothing/head/helmet/durathread + name = "makeshift helmet" + desc = "A hardhat with strips of leather and durathread for additional blunt protection." + icon_state = "durathread" + item_state = "durathread" + armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 23e1825c3d..298510564c 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -279,6 +279,13 @@ desc = "This headwear shows off your Cargonian leadership" icon_state = "qmberet" +/obj/item/clothing/head/beret/durathread + name = "durathread beret" + desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer." + icon_state = "beretdurathread" + item_color = null + armor = list("melee" = 25, "bullet" = 10, "laser" = 20,"energy" = 10, "bomb" = 30, "bio" = 15, "rad" = 20, "fire" = 100, "acid" = 50) + #undef DRILL_DEFAULT #undef DRILL_SHOUTING #undef DRILL_YELLING diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 73fde5d50f..041f0ba012 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -312,8 +312,8 @@ /obj/item/clothing/head/pharaoh name = "pharaoh hat" desc = "Walk like an Egyptian." - icon_state = "pharoah_hat" - icon_state = "pharoah_hat" + icon_state = "pharaoh_hat" + icon_state = "pharaoh_hat" /obj/item/clothing/head/jester/alt name = "jester hat" diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 5c7514541d..b14b0575f9 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -129,3 +129,14 @@ icon_state = "emtsoft" item_color = "emt" dog_fashion = null + +/obj/item/clothing/head/soft/baseball + name = "baseball cap" + desc = "It's a robust baseball hat, this one belongs to syndicate major league team." + icon_state = "baseballsoft" + item_color = "baseballsoft" + item_state = "baseballsoft" + flags_inv = HIDEEYES|HIDEFACE + armor = list("melee" = 35, "bullet" = 35, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 90) + strip_delay = 90 //You dont take a Major Leage cap + dog_fashion = null \ No newline at end of file diff --git a/code/modules/clothing/head/vg_hats.dm b/code/modules/clothing/head/vg_hats.dm index efeb5291db..dc245cd39a 100644 --- a/code/modules/clothing/head/vg_hats.dm +++ b/code/modules/clothing/head/vg_hats.dm @@ -1,4 +1,3 @@ - /obj/item/clothing/head/helmet/dredd name = "Judge Helmet" desc = "Judge, Jury, and Executioner." @@ -12,7 +11,6 @@ max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT strip_delay = 80 dog_fashion = null - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/aviatorhelmet name = "Aviator Helmet" @@ -21,15 +19,12 @@ item_state = "aviator_helmet" icon_state = "aviator_helmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/biker name = "Biker's Helmet" desc = "This helmet should protect you from russians and masked vigilantes." armor = list(melee = 25, bullet = 15, laser = 20, energy = 10, bomb = 10, bio = 0, rad = 0) icon_state = "biker_helmet" - icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR /obj/item/clothing/head/helmet/richard @@ -38,7 +33,6 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) icon_state = "richard" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR /obj/item/clothing/head/helmet/megahelmet @@ -47,7 +41,6 @@ icon_state = "megahelmet" item_state = "megahelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' siemens_coefficient = 1 /obj/item/clothing/head/helmet/protohelmet @@ -56,7 +49,6 @@ icon_state = "protohelmet" item_state = "protohelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' siemens_coefficient = 1 /obj/item/clothing/head/helmet/megaxhelmet @@ -65,7 +57,6 @@ icon_state = "megaxhelmet" item_state = "megaxhelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/joehelmet name = "Sniper Helmet" @@ -74,7 +65,6 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR item_state = "joehelmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/helmet/doomguy name = "Doomguy's helmet" @@ -83,7 +73,6 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR item_state = "doom" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' armor = list(melee = 50, bullet = 40, laser = 40,energy = 40, bomb = 5, bio = 0, rad = 0) /obj/item/clothing/head/helmet/neorussian @@ -92,8 +81,6 @@ icon_state = "nr_helmet" item_state = "nr_helmet" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' - /obj/item/clothing/head/stalhelm name = "Stalhelm" @@ -101,7 +88,6 @@ icon_state = "stalhelm" item_state = "stalhelm" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/panzer name = "Panzer Cap" @@ -109,7 +95,6 @@ icon_state = "panzercap" item_state = "panzercap" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/naziofficer name = "Officer Cap" @@ -117,8 +102,6 @@ icon_state = "officercap" item_state = "officercap" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' - /obj/item/clothing/head/russobluecamohat name = "russian blue camo beret" @@ -133,7 +116,6 @@ icon_state = "russofurhat" item_state = "russofurhat" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/squatter_hat name = "slav squatter hat" @@ -141,7 +123,6 @@ item_state = "squatter_hat" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' desc = "Cyka blyat." - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/snake name = "snake head" @@ -149,8 +130,6 @@ icon_state = "snakehead" item_state = "snakehead" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' - /obj/item/clothing/head/mummy_rags name = "mummy rags" desc = "Ancient rags taken off from some mummy." @@ -158,7 +137,6 @@ item_state = "mummy" item_color = "mummy" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS /obj/item/clothing/head/clownpiece @@ -167,7 +145,6 @@ icon_state = "clownpiece" item_state = "clownpiece" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/mitre name = "mitre" @@ -175,7 +152,6 @@ icon_state = "mitre" item_state = "mitre" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' /obj/item/clothing/head/tinfoil name = "tinfoil hat" @@ -183,7 +159,6 @@ icon_state = "foilhat" item_state = "paper" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' siemens_coefficient = 2 /obj/item/clothing/head/celtic @@ -192,4 +167,3 @@ icon_state = "celtic_crown" item_state = "celtic_crown" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index ed0ef27174..947aa048c4 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -4,8 +4,8 @@ icon_state = "breath" item_state = "m_mask" body_parts_covered = 0 - clothing_flags = MASKINTERNALS - visor_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS + visor_flags = ALLOWINTERNALS w_class = WEIGHT_CLASS_SMALL gas_transfer_coefficient = 0.1 permeability_coefficient = 0.5 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index bcf3064c49..c613d1a91e 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -2,7 +2,7 @@ name = "gas mask" desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate icon_state = "gas_alt" - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT w_class = WEIGHT_CLASS_NORMAL item_state = "gas_alt" @@ -59,7 +59,7 @@ /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "clown" item_state = "clown_hat" flags_cover = MASKCOVERSEYES @@ -91,7 +91,7 @@ /obj/item/clothing/mask/gas/sexyclown name = "sexy-clown wig and mask" desc = "A feminine clown mask for the dabbling crossdressers or female entertainers." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "sexyclown" item_state = "sexyclown" flags_cover = MASKCOVERSEYES @@ -100,7 +100,7 @@ /obj/item/clothing/mask/gas/mime name = "mime mask" desc = "The traditional mime's mask. It has an eerie facial posture." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "mime" item_state = "mime" flags_cover = MASKCOVERSEYES @@ -132,7 +132,7 @@ /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" desc = "A mask used when acting as a monkey." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "monkeymask" item_state = "monkeymask" flags_cover = MASKCOVERSEYES @@ -141,7 +141,7 @@ /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" desc = "A traditional female mime's mask." - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS icon_state = "sexymime" item_state = "sexymime" flags_cover = MASKCOVERSEYES @@ -162,7 +162,7 @@ name = "owl mask" desc = "Twoooo!" icon_state = "owl" - clothing_flags = MASKINTERNALS + clothing_flags = ALLOWINTERNALS flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 8860650fbc..086d47e8bf 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -7,10 +7,10 @@ actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust) icon_state = "sechailer" item_state = "sechailer" - clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS flags_inv = HIDEFACIALHAIR|HIDEFACE w_class = WEIGHT_CLASS_SMALL - visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS + visor_flags = BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS visor_flags_inv = HIDEFACE flags_cover = MASKCOVERSMOUTH visor_flags_cover = MASKCOVERSMOUTH @@ -69,12 +69,14 @@ /obj/item/clothing/mask/gas/sechailer/attack_self() halt() -/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user as mob) - if(safety) - safety = FALSE - to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.") - else + +/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user) + . = ..() + if(!safety) return + safety = FALSE + to_chat(user, "You silently fry [src]'s vocal circuit with the cryptographic sequencer.") + return TRUE /obj/item/clothing/mask/gas/sechailer/verb/halt() set category = "Object" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 5dfa7d6047..4b8f16a77f 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -313,3 +313,9 @@ message = replacetextEx(message,regex(capitalize(key),"g"), "[capitalize(value)]") message = replacetextEx(message,regex(key,"g"), "[value]") speech_args[SPEECH_MESSAGE] = trim(message) + +/obj/item/clothing/mask/bandana/durathread + name = "durathread bandana" + desc = "A bandana made from durathread, you wish it would provide some protection to its wearer, but it's far too thin..." + icon_state = "banddurathread" + diff --git a/code/modules/clothing/masks/vg_masks.dm b/code/modules/clothing/masks/vg_masks.dm index 7de27fb780..29b65a6b8e 100644 --- a/code/modules/clothing/masks/vg_masks.dm +++ b/code/modules/clothing/masks/vg_masks.dm @@ -3,18 +3,15 @@ desc = "Some pranksters are truly magical." icon_state = "wizzclown" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi' /obj/item/clothing/mask/chapmask name = "venetian mask" desc = "A plain porcelain mask that covers the entire face. Standard attire for particularly unspeakable religions. The eyes are wide shut." icon_state = "chapmask" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi' /obj/item/clothing/mask/neorussian name = "neo-Russian mask" desc = "Somehow, it makes you act and look way more polite than usual." icon_state = "nr_mask" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/masks.dmi' diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index b4310a7f42..88cc7123fd 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -10,7 +10,7 @@ if(visualsOnly) return - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H) + var/obj/item/implant/mindshield/L = new L.implant(H, null, 1) var/obj/item/radio/R = H.ears @@ -45,16 +45,23 @@ R.recalculateChannels() /datum/outfit/ert/commander/alert - name = "ERT Commander - High Alert" + name = "ERT Commander - Amber Alert" suit = /obj/item/clothing/suit/space/hardsuit/ert/alert glasses = /obj/item/clothing/glasses/thermal/eyepatch backpack_contents = list(/obj/item/storage/box/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ - /obj/item/gun/energy/pulse/pistol/loyalpin=1) + /obj/item/gun/energy/e_gun=1) l_pocket = /obj/item/melee/transforming/energy/sword/saber +/datum/outfit/ert/commander/alert/red + name = "ERT Commander - Red Alert" + backpack_contents = list(/obj/item/storage/box/engineer=1,\ + /obj/item/melee/baton/loaded=1,\ + /obj/item/clothing/mask/gas/sechailer/swat=1,\ + /obj/item/gun/energy/pulse/pistol/loyalpin=1) + /datum/outfit/ert/security name = "ERT Security" @@ -80,15 +87,22 @@ R.recalculateChannels() /datum/outfit/ert/security/alert - name = "ERT Security - High Alert" + name = "ERT Security - Amber Alert" suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec backpack_contents = list(/obj/item/storage/box/engineer=1,\ /obj/item/storage/box/handcuffs=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/melee/baton/loaded=1,\ - /obj/item/gun/energy/pulse/carbine/loyalpin=1) + /obj/item/gun/energy/e_gun/stun=1) +/datum/outfit/ert/security/alert/red + name = "ERT Security - Red Alert" + backpack_contents = list(/obj/item/storage/box/engineer=1,\ + /obj/item/storage/box/handcuffs=1,\ + /obj/item/clothing/mask/gas/sechailer/swat=1,\ + /obj/item/melee/baton/loaded=1,\ + /obj/item/gun/energy/pulse/carbine/loyalpin=1) /datum/outfit/ert/medic name = "ERT Medic" @@ -117,9 +131,18 @@ R.recalculateChannels() /datum/outfit/ert/medic/alert - name = "ERT Medic - High Alert" + name = "ERT Medic - Amber Alert" suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/med + backpack_contents = list(/obj/item/storage/box/engineer=1,\ + /obj/item/melee/baton/loaded=1,\ + /obj/item/clothing/mask/gas/sechailer/swat=1,\ + /obj/item/gun/energy/e_gun=1,\ + /obj/item/reagent_containers/hypospray/combat/nanites=1,\ + /obj/item/gun/medbeam=1) + +/datum/outfit/ert/medic/alert/red + name = "ERT Medic - Red Alert" backpack_contents = list(/obj/item/storage/box/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ @@ -154,15 +177,51 @@ R.recalculateChannels() /datum/outfit/ert/engineer/alert - name = "ERT Engineer - High Alert" + name = "ERT Engineer - Amber Alert" suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/engi + backpack_contents = list(/obj/item/storage/box/engineer=1,\ + /obj/item/melee/baton/loaded=1,\ + /obj/item/clothing/mask/gas/sechailer/swat=1,\ + /obj/item/gun/energy/e_gun=1,\ + /obj/item/construction/rcd/combat=1) + +/datum/outfit/ert/engineer/alert/red + name = "ERT Engineer - Red Alert" backpack_contents = list(/obj/item/storage/box/engineer=1,\ /obj/item/melee/baton/loaded=1,\ /obj/item/clothing/mask/gas/sechailer/swat=1,\ /obj/item/gun/energy/pulse/pistol/loyalpin=1,\ /obj/item/construction/rcd/combat=1) +/datum/outfit/ert/greybois + name = "Emergency Assistant" + + uniform = /obj/item/clothing/under/color/grey/glorf + shoes = /obj/item/clothing/shoes/sneakers/black + gloves = /obj/item/clothing/gloves/color/fyellow + ears = /obj/item/radio/headset + head = /obj/item/clothing/head/soft/grey + belt = /obj/item/storage/belt/utility/full + back = /obj/item/storage/backpack + mask = /obj/item/clothing/mask/gas + l_pocket = /obj/item/tank/internals/emergency_oxygen + l_hand = /obj/item/storage/toolbox/emergency/old + id = /obj/item/card/id + +/datum/outfit/ert/greybois/greygod + suit = /obj/item/clothing/suit/hazardvest + l_hand = /obj/item/storage/toolbox/plastitanium + gloves = /obj/item/clothing/gloves/color/yellow + +/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + var/obj/item/card/id/W = H.wear_id + W.registered_name = H.real_name + W.assignment = "Assistant" + W.access = list(ACCESS_MAINT_TUNNELS,ACCESS_CENT_GENERAL) + W.update_label(W.registered_name, W.assignment) /datum/outfit/centcom_official name = "CentCom Official" diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm new file mode 100644 index 0000000000..20b67891d8 --- /dev/null +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -0,0 +1,164 @@ +/datum/outfit/plasmaman/bar + name = "Bartender Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/white + uniform = /obj/item/clothing/under/plasmaman/enviroslacks + +/datum/outfit/plasmaman/chef + name = "Chef Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/white + uniform = /obj/item/clothing/under/plasmaman/chef + +/datum/outfit/plasmaman/botany + name = "Botany Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/botany + uniform = /obj/item/clothing/under/plasmaman/botany + +/datum/outfit/plasmaman/curator + name = "Curator Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/curator + uniform = /obj/item/clothing/under/plasmaman/curator + +/datum/outfit/plasmaman/chaplain + name = "Chaplain Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain + uniform = /obj/item/clothing/under/plasmaman/chaplain + +/datum/outfit/plasmaman/janitor + name = "Janitor Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/janitor + uniform = /obj/item/clothing/under/plasmaman/janitor + +/datum/outfit/plasmaman/hop + name = "Head of Personell Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/hop + uniform = /obj/item/clothing/under/plasmaman/hop + +/datum/outfit/plasmaman/captain + name = "Captain Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/captain + uniform = /obj/item/clothing/under/plasmaman/captain + +/datum/outfit/plasmaman/security + name = "Security Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/security + uniform = /obj/item/clothing/under/plasmaman/security + ears = /obj/item/radio/headset/headset_sec + +/datum/outfit/plasmaman/detective + name = "Detective Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/white + uniform = /obj/item/clothing/under/plasmaman/enviroslacks + +/datum/outfit/plasmaman/warden + name = "Warden Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden + uniform = /obj/item/clothing/under/plasmaman/security/warden + +/datum/outfit/plasmaman/hos + name = "Head of Security Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos + uniform = /obj/item/clothing/under/plasmaman/security/hos + +/datum/outfit/plasmaman/cargo + name = "Cargo Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/cargo + uniform = /obj/item/clothing/under/plasmaman/cargo + +/datum/outfit/plasmaman/mining + name = "Mining Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/mining + uniform = /obj/item/clothing/under/plasmaman/mining + +/datum/outfit/plasmaman/medical + name = "Medical Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/medical + uniform = /obj/item/clothing/under/plasmaman/medical + +/datum/outfit/plasmaman/cmo + name = "Chief Medical Officer Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/cmo + uniform = /obj/item/clothing/under/plasmaman/cmo + +/datum/outfit/plasmaman/viro + name = "Virology Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/viro + uniform = /obj/item/clothing/under/plasmaman/viro + +/datum/outfit/plasmaman/chemist + name = "Chemist Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/chemist + uniform = /obj/item/clothing/under/plasmaman/chemist + +/datum/outfit/plasmaman/genetics + name = "Genetics Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/genetics + uniform = /obj/item/clothing/under/plasmaman/genetics + +/datum/outfit/plasmaman/science + name = "Science Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/science + uniform = /obj/item/clothing/under/plasmaman/science + +/datum/outfit/plasmaman/rd + name = "Research Director Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/rd + uniform = /obj/item/clothing/under/plasmaman/rd + +/datum/outfit/plasmaman/robotics + name = "Robotics Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/robotics + uniform = /obj/item/clothing/under/plasmaman/robotics + +/datum/outfit/plasmaman/engineering + name = "Engineering Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/engineering + uniform = /obj/item/clothing/under/plasmaman/engineering + +/datum/outfit/plasmaman/ce + name = "Chief Engineer Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce + uniform = /obj/item/clothing/under/plasmaman/engineering/ce + +/datum/outfit/plasmaman/atmospherics + name = "Atmospherics Plasmaman" + + head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics + uniform = /obj/item/clothing/under/plasmaman/atmospherics + +/datum/outfit/plasmaman/mime + name = "Plasmamime" + + head = /obj/item/clothing/head/helmet/space/plasmaman/mime + uniform = /obj/item/clothing/under/plasmaman/mime + mask = /obj/item/clothing/mask/gas/mime + +/datum/outfit/plasmaman/clown + name = "Plasmaclown" + + head = /obj/item/clothing/head/helmet/space/plasmaman/clown + uniform = /obj/item/clothing/under/plasmaman/clown + mask = /obj/item/clothing/mask/gas/clown_hat \ No newline at end of file diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 325c124867..6c961dc250 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -399,7 +399,7 @@ R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn + var/obj/item/implant/mindshield/L = new //Here you go Deuryn L.implant(H, null, 1) @@ -426,7 +426,7 @@ /datum/outfit/debug //Debug objs plus hardsuit name = "Debug outfit" - uniform = /obj/item/clothing/under/patriotsuit + uniform = /obj/item/clothing/under/patriotsuit suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite shoes = /obj/item/clothing/shoes/magboots/advance suit_store = /obj/item/tank/internals/oxygen diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index cd8930641f..cd8115ac7d 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -29,9 +29,9 @@ . = ..() var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80) H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) - var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H) + var/obj/item/implant/weapons_auth/W = new W.implant(H) - var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) + var/obj/item/implant/explosive/E = new E.implant(H) H.faction |= ROLE_SYNDICATE H.update_icons() diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index e6554f6125..080d9281cf 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -62,6 +62,16 @@ desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them." icon_state = "galoshes_dry" +/obj/item/clothing/shoes/sneakers/noslip + desc = "A pair of black shoes, they have the soles of galoshes making them unable to be slipped on a wet surface." + name = "black shoes" + icon_state = "black" + permeability_coefficient = 0.30 + clothing_flags = NOSLIP + strip_delay = 50 + equip_delay_other = 50 + resistance_flags = NONE + /obj/item/clothing/shoes/galoshes/dry/step_action() var/turf/open/t_loc = get_turf(src) SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY) @@ -69,10 +79,8 @@ /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" name = "clown shoes" - icon_state = "clown" - item_state = "clown_shoes" + icon_state = "clown_shoes" slowdown = SHOES_SLOWDOWN+1 - item_color = "clown" pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown /obj/item/clothing/shoes/clown_shoes/Initialize() @@ -98,7 +106,6 @@ name = "jackboots" desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." icon_state = "jackboots" - item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' item_color = "hosred" @@ -115,7 +122,6 @@ name = "winter boots" desc = "Boots lined with 'synthetic' animal fur." icon_state = "winterboots" - item_state = "winterboots" permeability_coefficient = 0.15 cold_protection = FEET|LEGS min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT @@ -127,7 +133,6 @@ name = "work boots" desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar." icon_state = "workboots" - item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' permeability_coefficient = 0.15 @@ -145,7 +150,6 @@ name = "\improper Nar'Sien invoker boots" desc = "A pair of boots worn by the followers of Nar'Sie." icon_state = "cult" - item_state = "cult" item_color = "cult" cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT @@ -178,7 +182,6 @@ name = "roman sandals" desc = "Sandals with buckled leather straps on it." icon_state = "roman" - item_state = "roman" strip_delay = 100 equip_delay_other = 100 permeability_coefficient = 0.9 @@ -187,14 +190,12 @@ name = "griffon boots" desc = "A pair of costume boots fashioned after bird talons." icon_state = "griffinboots" - item_state = "griffinboots" pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes /obj/item/clothing/shoes/bhop name = "jump boots" desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement." icon_state = "jetboots" - item_state = "jetboots" item_color = "hosred" resistance_flags = FIRE_PROOF pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes @@ -219,17 +220,13 @@ var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction - if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, .proc/hop_end))) - jumping = TRUE + if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE)) playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1) + recharging_time = world.time + recharging_rate user.visible_message("[usr] dashes forward into the air!") else to_chat(user, "Something prevents you from dashing forward!") -/obj/item/clothing/shoes/bhop/proc/hop_end() - jumping = FALSE - recharging_time = world.time + recharging_rate - /obj/item/clothing/shoes/singery name = "yellow performer's boots" desc = "These boots were made for dancing." @@ -256,7 +253,6 @@ name = "Wheely-Heels" desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel icon_state = "wheelys" - item_state = "wheelys" actions_types = list(/datum/action/item_action/wheelys) var/wheelToggle = FALSE //False means wheels are not popped out var/obj/vehicle/ridden/scooter/wheelys/W @@ -295,7 +291,6 @@ name = "Kindle Kicks" desc = "They'll sure kindle something in you, and it's not childhood nostalgia..." icon_state = "kindleKicks" - item_state = "kindleKicks" actions_types = list(/datum/action/item_action/kindleKicks) var/lightCycle = 0 var/active = FALSE @@ -316,3 +311,25 @@ set_light(0) lightCycle = 0 active = FALSE + +// kevin is into feet +/obj/item/clothing/shoes/wraps + name = "gilded leg wraps" + desc = "Ankle coverings. These ones have a golden design." + icon_state = "gildedcuffs" + body_parts_covered = FALSE + +/obj/item/clothing/shoes/wraps/silver + name = "silver leg wraps" + desc = "Ankle coverings. Not made of real silver." + icon_state = "silvergildedcuffs" + +/obj/item/clothing/shoes/wraps/red + name = "red leg wraps" + desc = "Ankle coverings. Show off your style with these shiny red ones!" + icon_state = "redcuffs" + +/obj/item/clothing/shoes/wraps/blue + name = "blue leg wraps" + desc = "Ankle coverings. Hang ten, brother." + icon_state = "bluecuffs" \ No newline at end of file diff --git a/code/modules/clothing/shoes/vg_shoes.dm b/code/modules/clothing/shoes/vg_shoes.dm index 931c25b823..627a061181 100644 --- a/code/modules/clothing/shoes/vg_shoes.dm +++ b/code/modules/clothing/shoes/vg_shoes.dm @@ -5,7 +5,6 @@ icon_state = "leather" item_color = "leather" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/magboots/deathsquad @@ -14,7 +13,6 @@ icon_state = "DS-magboots0" magboot_state = "DS-magboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF mutantrace_variation = NO_MUTANTRACE_VARIATION @@ -23,7 +21,6 @@ name = "atmospherics magboots" icon_state = "atmosmagboots0" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' magboot_state = "atmosmagboots" resistance_flags = FIRE_PROOF mutantrace_variation = NO_MUTANTRACE_VARIATION @@ -33,7 +30,6 @@ desc = "Simon's Shoes." icon_state = "simonshoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/kneesocks @@ -41,7 +37,6 @@ desc = "A pair of girly knee-high socks." icon_state = "kneesock" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/jestershoes @@ -49,7 +44,6 @@ desc = "As worn by the clowns of old." icon_state = "jestershoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/aviatorboots @@ -57,7 +51,6 @@ desc = "Boots suitable for just about any occasion." icon_state = "aviator_boots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/libertyshoes @@ -65,7 +58,6 @@ desc = "Freedom isn't free, neither were these shoes." icon_state = "libertyshoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/megaboots @@ -73,7 +65,6 @@ desc = "Large armored boots, very weak to large spikes." icon_state = "megaboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/protoboots @@ -81,7 +72,6 @@ desc = "Functionally identical to the DRN-001 model's boots, but in red." icon_state = "protoboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/megaxboots @@ -89,7 +79,6 @@ desc = "Regardless of how much stronger these boots are than the DRN-001 model's, they're still extremely easy to pierce with a large spike." icon_state = "megaxboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/joeboots @@ -97,7 +86,6 @@ desc = "Nearly identical to the Prototype's boots, except in black." icon_state = "joeboots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/doomguy @@ -105,7 +93,6 @@ desc = "If you look closely, you might see skull fragments still buried in these boots." icon_state = "doom" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/rottenshoes @@ -113,7 +100,6 @@ desc = "These shoes seem perfect for sneaking around." icon_state = "rottenshoes" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/sandal/slippers @@ -121,7 +107,6 @@ icon_state = "slippers" desc = "For the wizard that puts comfort first. Who's going to laugh?" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/slippers_worn @@ -129,7 +114,6 @@ desc = "Fluffy..." icon_state = "slippers_worn" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/shoes/jackboots/neorussian @@ -137,5 +121,4 @@ desc = "Tovarish, no one will realize you stepped on a pile of shit if your pair already looks like shit." icon_state = "nr_boots" icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi' - alternate_worn_icon = 'modular_citadel/icons/mob/citadel/head.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 9d3918ed84..57866b5131 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -4,7 +4,7 @@ name = "space helmet" icon_state = "spaceold" desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS item_state = "spaceold" permeability_coefficient = 0.01 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) @@ -22,6 +22,7 @@ resistance_flags = NONE dog_fashion = null mutantrace_variation = MUTANTRACE_VARIATION + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE /obj/item/clothing/suit/space name = "space suit" @@ -44,4 +45,5 @@ strip_delay = 80 equip_delay_other = 80 resistance_flags = NONE + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //rated for cosmic radation :honk: tauric = TRUE //Citadel Add for tauric hardsuits diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 85503c720a..2694497579 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -624,19 +624,19 @@ desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storge bags on to the suit." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" - armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500) + armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) slowdown = 6 //Slow allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason name = "M.A.S.O.N RIG helmet" desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection." icon_state = "hardsuit0-ancient" item_state = "anc_helm" - armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500) + armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) item_color = "ancient" brightness_on = 16 scan_reagents = TRUE @@ -644,7 +644,7 @@ tint = 1 var/obj/machinery/doppler_array/integrated/bomb_radar max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize() . = ..() diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index d1ee88d5a8..0b07aafa5d 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -12,7 +12,7 @@ var/next_extinguish = 0 var/extinguish_cooldown = 100 var/extinguishes_left = 10 - + mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user) ..() @@ -45,12 +45,18 @@ resistance_flags = FIRE_PROOF var/brightness_on = 4 //luminosity when the light is on var/on = FALSE + var/light_overlay = "envirohelm-light" actions_types = list(/datum/action/item_action/toggle_helmet_light) + mutantrace_variation = NO_MUTANTRACE_VARIATION /obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user) + if(!light_overlay) + return on = !on - icon_state = "[initial(icon_state)][on ? "-light":""]" - item_state = icon_state + if(!on) + cut_overlay(light_overlay) + else + add_overlay(light_overlay) user.update_inv_head() //So the mob overlay updates if(on) @@ -61,3 +67,166 @@ for(var/X in actions) var/datum/action/A=X A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file) + . = ..() + if(!isinhands && on) + . += mutable_appearance(icon_file, light_overlay) + +/obj/item/clothing/head/helmet/space/plasmaman/security + name = "security plasma envirosuit helmet" + desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables." + icon_state = "security_envirohelm" + item_state = "security_envirohelm" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + +/obj/item/clothing/head/helmet/space/plasmaman/security/warden + name = "warden's plasma envirosuit helmet" + desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security." + icon_state = "warden_envirohelm" + item_state = "warden_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/security/hos + name = "head of security's plasma envirosuit helmet" + desc = "A plasmaman containment helmet designed for the head of security, manacing black with red stripes, to differenciate them from other members of security." + icon_state = "hos_envirohelm" + item_state = "hos_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/medical + name = "medical's plasma envirosuit helmet" + desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much." + icon_state = "doctor_envirohelm" + item_state = "doctor_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/cmo + name = "chief medical officer's plasma envirosuit helmet" + desc = "A blue and white envriohelmet designed for the chief medical officer." + icon_state = "cmo_envirohelm" + item_state = "cmo_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/genetics + name = "geneticist's plasma envirosuit helmet" + desc = "A plasmaman envirohelmet designed for geneticists." + icon_state = "geneticist_envirohelm" + item_state = "geneticist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/viro + name = "virology plasma envirosuit helmet" + desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create." + icon_state = "virologist_envirohelm" + item_state = "virologist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/chemist + name = "chemistry plasma envirosuit helmet" + desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face." + icon_state = "chemist_envirohelm" + item_state = "chemist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/science + name = "science plasma envirosuit helmet" + desc = "A plasmaman envirohelmet designed for scientists." + icon_state = "scientist_envirohelm" + item_state = "scientist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/rd + name = "research director's plasma envirosuit helmet" + desc = "A sturdier plasmaman envirohelmet designed for research directors." + icon_state = "rd_envirohelm" + item_state = "rd_envirohelm" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75) + +/obj/item/clothing/head/helmet/space/plasmaman/robotics + name = "robotics plasma envirosuit helmet" + desc = "A plasmaman envirohelmet designed for roboticists." + icon_state = "roboticist_envirohelm" + item_state = "roboticist_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/engineering + name = "engineering plasma envirosuit helmet" + desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange." + icon_state = "engineer_envirohelm" + item_state = "engineer_envirohelm" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75) + +/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce + name = "chief engineer's plasma envirosuit helmet" + desc = "A space-worthy helmet specially designed for the chief engineer, white with gold stripes designed for high visibility." + icon_state = "ce_envirohelm" + item_state = "ce_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/atmospherics + name = "atmospherics plasma envirosuit helmet" + desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue." + icon_state = "atmos_envirohelm" + item_state = "atmos_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/cargo + name = "cargo plasma envirosuit helmet" + desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters." + icon_state = "cargo_envirohelm" + item_state = "cargo_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/mining + name = "mining plasma envirosuit helmet" + desc = "A khaki helmet given to plasmamen miners operating on lavaland." + icon_state = "explorer_envirohelm" + item_state = "explorer_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/chaplain + name = "chaplain's plasma envirosuit helmet" + desc = "An envirohelmet specially designed for only the most pious of plasmamen." + icon_state = "chap_envirohelm" + item_state = "chap_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/white + name = "white plasma envirosuit helmet" + desc = "A generic white envirohelm." + icon_state = "white_envirohelm" + item_state = "white_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/hop + name = "head of personell's plasma envirosuit helmet" + desc = "A finely tailored azure envirohelm designed for head of personell." + icon_state = "hop_envirohelm" + item_state = "hop_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/captain + name = "captain's plasma envirosuit helmet" + desc = "A blue and gold envirohelm designed for the station's captain, nonetheless. Made of superior materials to protect them from the station hazards and more." + icon_state = "captain_envirohelm" + item_state = "captain_envirohelm" + armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 85) + +/obj/item/clothing/head/helmet/space/plasmaman/curator + name = "curator's plasma envirosuit helmet" + desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike." + icon_state = "prototype_envirohelm" + item_state = "prototype_envirohelm" + light_overlay = null + actions_types = list() + +/obj/item/clothing/head/helmet/space/plasmaman/botany + name = "botany plasma envirosuit helmet" + desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries." + icon_state = "botany_envirohelm" + item_state = "botany_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/janitor + name = "janitor's plasma envirosuit helmet" + desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor." + icon_state = "janitor_envirohelm" + item_state = "janitor_envirohelm" + +/obj/item/clothing/head/helmet/space/plasmaman/mime + name = "mime envirosuit helmet" + desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful." + icon_state = "mime_envirohelm" + item_state = "mime_envirohelm" + light_overlay = "mime_envirohelm-light" + +/obj/item/clothing/head/helmet/space/plasmaman/clown + name = "clown envirosuit helmet" + desc = "The make-up is painted on, it's a miracle it doesn't chip. 'HONK!'" + icon_state = "clown_envirohelm" + item_state = "clown_envirohelm" + light_overlay = "clown_envirohelm-light" diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index cf411ef367..342429e480 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -5,6 +5,7 @@ allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) slot_flags = ITEM_SLOT_OCLOTHING + body_parts_covered = CHEST var/blood_overlay_type = "suit" var/togglename = null var/suittoggled = FALSE @@ -54,7 +55,7 @@ if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") IF_HAS_BLOOD_DNA(src) - if(taurmode >= SNEK_TAURIC) + if(tauric) . += mutable_appearance('modular_citadel/icons/mob/64x32_effects.dmi', "[blood_overlay_type]blood") else . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 5eec159462..19050dc36f 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,6 +1,5 @@ /obj/item/clothing/suit/armor allowed = null - body_parts_covered = CHEST cold_protection = CHEST|GROIN min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN @@ -238,3 +237,14 @@ /obj/item/clothing/suit/armor/riot/knight/red icon_state = "knight_red" item_state = "knight_red" + +/obj/item/clothing/suit/armor/vest/durathread + name = "makeshift vest" + desc = "A vest made of durathread with strips of leather acting as trauma plates." + icon_state = "durathread" + item_state = "durathread" + strip_delay = 60 + equip_delay_other = 40 + max_integrity = 200 + resistance_flags = FLAMMABLE + armor = list("melee" = 20, "bullet" = 10, "laser" = 30, "energy" = 5, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index c3276213e1..b8287c7f4c 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -7,7 +7,7 @@ icon_state = "qmcloak" item_state = "qmcloak" w_class = WEIGHT_CLASS_SMALL - body_parts_covered = CHEST|GROIN|LEGS|ARMS + body_parts_covered = CHEST|LEGS|ARMS /obj/item/clothing/head/cloakhood name = "cloak hood" @@ -62,7 +62,7 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/twohanded/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/kitchen/knife/combat/bone, /obj/item/kitchen/knife/combat/survival) armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath - body_parts_covered = CHEST|GROIN|ARMS + body_parts_covered = CHEST|ARMS|LEGS /obj/item/clothing/head/hooded/cloakhood/goliath name = "goliath cloak hood" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index bf11d40caf..4318839845 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -23,30 +23,48 @@ allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/assembly/flash/handheld, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) //Chaplain -/obj/item/clothing/suit/nun +/obj/item/clothing/suit/chaplain + name = "chaplain suit" + desc = "A piece of clothing adorned by the gods of Coding. Should never exist in this mortal realm." + allowed = list(/obj/item/storage/book/bible, HOLY_WEAPONS, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + +/obj/item/clothing/suit/chaplain/nun name = "nun robe" desc = "Maximum piety in this star system." icon_state = "nun" item_state = "nun" body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS flags_inv = HIDESHOES|HIDEJUMPSUIT - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) -/obj/item/clothing/suit/studentuni +/obj/item/clothing/suit/chaplain/studentuni name = "student robe" desc = "The uniform of a bygone institute of learning." icon_state = "studentuni" item_state = "studentuni" body_parts_covered = ARMS|CHEST - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) -/obj/item/clothing/suit/witchhunter +/obj/item/clothing/suit/chaplain/witchhunter name = "witchunter garb" desc = "This worn outfit saw much use back in the day." icon_state = "witchhunter" item_state = "witchhunter" body_parts_covered = CHEST|GROIN|LEGS|ARMS - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + +/obj/item/clothing/suit/chaplain/pharaoh + name = "pharaoh tunic" + desc = "Lavish space tomb not included." + icon_state = "pharaoh" + icon_state = "pharaoh" + body_parts_covered = CHEST|GROIN + +/obj/item/clothing/suit/chaplain/holidaypriest + name = "holiday priest" + desc = "This is a nice holiday, my son." + icon_state = "holidaypriest" + item_state = "w_suit" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + flags_inv = HIDEJUMPSUIT + //Chef /obj/item/clothing/suit/toggle/chef @@ -135,6 +153,7 @@ icon = 'icons/obj/clothing/belts.dmi' icon_state = "suspenders" blood_overlay_type = "armor" //it's the less thing that I can put here + body_parts_covered = NONE //Security /obj/item/clothing/suit/security/officer @@ -177,3 +196,24 @@ armor = list("melee" = 25, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS + + +//Robotocist + +/obj/item/clothing/suit/hooded/techpriest + name = "techpriest robes" + desc = "For those who REALLY love their toasters." + icon_state = "techpriest" + item_state = "techpriest" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + hoodtype = /obj/item/clothing/head/hooded/techpriest + mutantrace_variation = NO_MUTANTRACE_VARIATION + +/obj/item/clothing/head/hooded/techpriest + name = "techpriest's hood" + desc = "A hood for those who REALLY love their toasters." + icon_state = "techpriesthood" + item_state = "techpriesthood" + body_parts_covered = HEAD + flags_inv = HIDEHAIR|HIDEEARS + mutantrace_variation = MUTANTRACE_VARIATION diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index dc1b2b6dc3..bc885868c5 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -67,6 +67,7 @@ item_state = "death" flags_1 = CONDUCT_1 fire_resist = T0C+5200 + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -75,6 +76,7 @@ desc = "this pretty much looks ridiculous" //Needs no fixing icon_state = "justice" item_state = "justice" + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|FEET flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -100,14 +102,14 @@ desc = "A fancy purple apron for a stylish person." icon_state = "purplebartenderapron" item_state = "purplebartenderapron" - body_parts_covered = CHEST|GROIN|LEGS + body_parts_covered = CHEST /obj/item/clothing/suit/syndicatefake name = "black and red space suit replica" icon_state = "syndicate-black-red" item_state = "syndicate-black-red" desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" - w_class = WEIGHT_CLASS_NORMAL + body_parts_covered = CHEST|ARMS|GROIN|LEGS|FEET|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT resistance_flags = NONE @@ -154,7 +156,7 @@ icon_state = "owl_wings" item_state = "owl_wings" togglename = "wings" - body_parts_covered = ARMS|CHEST + body_parts_covered = ARMS actions_types = list(/datum/action/item_action/toggle_wings) /obj/item/clothing/suit/toggle/owlwings/Initialize() @@ -167,16 +169,6 @@ icon_state = "griffin_wings" item_state = "griffin_wings" - -/obj/item/clothing/suit/holidaypriest - name = "holiday priest" - desc = "This is a nice holiday, my son." - icon_state = "holidaypriest" - item_state = "w_suit" - body_parts_covered = CHEST|GROIN|LEGS|ARMS - flags_inv = HIDEJUMPSUIT - allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - /obj/item/clothing/suit/cardborg name = "cardborg suit" desc = "An ordinary cardboard box with holes cut in the sides." @@ -219,6 +211,7 @@ desc = "Your classic, non-racist poncho." icon_state = "classicponcho" item_state = "classicponcho" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/poncho/green name = "green poncho" @@ -255,7 +248,7 @@ desc = "A costume made from 'synthetic' carp scales, it smells." icon_state = "carp_casual" item_state = "labcoat" - body_parts_covered = CHEST|GROIN|ARMS + body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun) @@ -275,9 +268,7 @@ desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs." icon_state = "ian" item_state = "labcoat" - body_parts_covered = CHEST|GROIN|ARMS - //cold_protection = CHEST|GROIN|ARMS - //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET allowed = list() hoodtype = /obj/item/clothing/head/hooded/ian_hood dog_fashion = /datum/dog_fashion/back @@ -287,8 +278,6 @@ desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits." icon_state = "ian" body_parts_covered = HEAD - //cold_protection = HEAD - //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS /obj/item/clothing/suit/hooded/bee_costume // It's Hip! @@ -314,7 +303,7 @@ desc = "A horribly bloated suit made from human skins." icon_state = "lingspacesuit" item_state = "labcoat" - body_parts_covered = CHEST|GROIN|ARMS + body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET|HANDS allowed = list() actions_types = list(/datum/action/item_action/toggle_human_head) hoodtype = /obj/item/clothing/head/hooded/human_head @@ -335,6 +324,23 @@ item_state = "officertanjacket" body_parts_covered = CHEST|ARMS +/obj/item/clothing/suit/ran + name = "Shikigami costume" + desc = "A costume that looks like a certain shikigami, is super fluffy." + icon_state = "ran_suit" + item_state = "ran_suit" + body_parts_covered = CHEST|GROIN|LEGS + flags_inv = HIDEJUMPSUIT|HIDETAUR + heat_protection = CHEST|GROIN|LEGS //fluffy tails! +//2061 + +/obj/item/clothing/head/ran + name = "Shikigami hat" + desc = "A hat that looks like it keeps any fluffy ears contained super warm, has little charms over it." + icon_state = "ran_hat" + item_state = "ran_hat" + flags_inv = HIDEEARS + /* * Misc */ @@ -355,18 +361,21 @@ desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it, but it's pretty close. Good for sleeping in." icon_state = "ianshirt" item_state = "ianshirt" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/nerdshirt name = "gamer shirt" desc = "A baggy shirt with vintage game character Phanic the Weasel. Why would anyone wear this?" icon_state = "nerdshirt" item_state = "nerdshirt" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat. name = "Vape Naysh shirt" desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?" icon_state = "vapeshirt" item_state = "vapeshirt" + body_parts_covered = CHEST|GROIN /obj/item/clothing/suit/jacket name = "bomber jacket" @@ -374,7 +383,7 @@ icon_state = "bomberjacket" item_state = "brownjsuit" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/radio) - body_parts_covered = CHEST|GROIN|ARMS + body_parts_covered = CHEST|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -399,6 +408,7 @@ desc = "A thick jacket with a rubbery, water-resistant shell." icon_state = "pufferjacket" item_state = "hostrench" + body_parts_covered = CHEST|GROIN|ARMS armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/jacket/puffer/vest @@ -446,18 +456,21 @@ desc = "Looks like this belongs in a very old movie set." icon_state = "draculacoat" item_state = "draculacoat" + body_parts_covered = CHEST|ARMS /obj/item/clothing/suit/drfreeze_coat name = "doctor freeze's labcoat" desc = "A labcoat imbued with the power of features and freezes." icon_state = "drfreeze_coat" item_state = "drfreeze_coat" + body_parts_covered = CHEST|GROIN|ARMS /obj/item/clothing/suit/gothcoat name = "gothic coat" desc = "Perfect for those who want stalk in a corner of a bar." icon_state = "gothcoat" item_state = "gothcoat" + body_parts_covered = CHEST|ARMS|HAND_LEFT //peculiar /obj/item/clothing/suit/xenos name = "xenos suit" @@ -468,13 +481,6 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT allowed = list(/obj/item/clothing/mask/facehugger/toy) -/obj/item/clothing/suit/nemes - name = "pharoah tunic" - desc = "Lavish space tomb not included." - icon_state = "pharoah" - icon_state = "pharoah" - body_parts_covered = CHEST|GROIN - // WINTER COATS @@ -603,6 +609,7 @@ name = "spooky ghost" desc = "This is obviously just a bedsheet, but maybe try it on?" icon_state = "bedsheet" + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150) alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire @@ -611,6 +618,7 @@ desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_cuirass_old" + body_parts_covered = CHEST|GROIN|LEGS armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20) /obj/item/clothing/suit/ghost_sheet @@ -623,4 +631,5 @@ throw_range = 2 w_class = WEIGHT_CLASS_TINY flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD alternate_worn_layer = UNDER_HEAD_LAYER diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index d003a20167..fbdca6ddbc 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -130,7 +130,7 @@ equip_delay_other = 60 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = NONE - rad_flags = RAD_PROTECT_CONTENTS + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE mutantrace_variation = MUTANTRACE_VARIATION /obj/item/clothing/suit/radiation @@ -150,5 +150,5 @@ equip_delay_other = 60 flags_inv = HIDEJUMPSUIT|HIDETAUR resistance_flags = NONE - rad_flags = RAD_PROTECT_CONTENTS + rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE tauric = TRUE //Citadel Add for tauric hardsuits diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 396bcb4766..6dd6164d79 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -1,4 +1,4 @@ -/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals and armbands, this accessory system is being kept as-is +/obj/item/clothing/accessory //Ties moved to neck slot items, but as there are still things like medals, pokadots, and armbands, this accessory system is being kept as-is name = "Accessory" desc = "Something has gone wrong!" icon = 'icons/obj/clothing/accessories.dmi' @@ -354,3 +354,68 @@ item_color = "skull" above_suit = TRUE armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) + +/obj/item/clothing/accessory/skullcodpiece/fake + name = "false codpiece" + desc = "A plastic ornament, intended to protect the important things in life. It's not very good at it." + icon_state = "skull" + item_color = "skull" + above_suit = TRUE + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + +///////////////////// +//Synda Accessories// +///////////////////// + +/obj/item/clothing/accessory/padding + name = "soft padding" + desc = "Some long sheets of padding to help soften the blows of a physical attacks." + icon_state = "padding" + item_color = "nothing" + armor = list("melee" = 15, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 0, "rad" = 0, "fire" = -20, "acid" = 45) + +/obj/item/clothing/accessory/kevlar + name = "kevlar sheets" + desc = "Long thin sheets of kevlar to help resist bullets and some physical attacks." + icon_state = "padding" + item_color = "nothing" + armor = list("melee" = 10, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 25) + +/obj/item/clothing/accessory/plastics + name = "underling plastic sheet" + desc = "A full body sheet of white plastic to help defuse lasers and energy based weapons." + icon_state = "plastics" + item_color = "nothing" + armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = -40) + +///////////////////// +//Pokadots On Pants// +///////////////////// + +/obj/item/clothing/accessory/attrocious_pokadots + name = "atrocious pokadots" + desc = "They look like something out of a thrift store. Attaches to clothing not to be worn by itself." + icon_state = "attrocious_pokadots" + item_color = "attrocious_pokadots" + attack_verb = list("horrifed", "eye bleeded") + +/obj/item/clothing/accessory/black_white_pokadots + name = "checkered pokadots" + desc = "You can play a game of chess on these! Attaches to clothing not to be worn by itself." + icon_state = "black_white_pokadots" + item_color = "black_white_pokadots" + attack_verb = list("check", "mate") + +/obj/item/clothing/accessory/nt_pokadots + name = "blue and white pokadots" + desc = "To show your pride in your workplace, in the most annoying possable way. Attaches to clothing not to be worn by itself." + icon_state = "nt_pokadots" + item_color = "nt_pokadots" + attack_verb = list("eye bleeded", "annoyed") + +/obj/item/clothing/accessory/syndi_pokadots + name = "black and red pokadots" + desc = "King me. Attaches to clothing not to be worn by itself." //checkers! + icon_state = "syndi_pokadots" + item_color = "syndi_pokadots" + attack_verb = list("jumped", "taken") \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm new file mode 100644 index 0000000000..74181b05eb --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -0,0 +1,100 @@ +/obj/item/clothing/under/plasmaman/cargo + name = "cargo plasma envirosuit" + desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs." + icon_state = "cargo_envirosuit" + item_state = "cargo_envirosuit" + item_color = "cargo_envirosuit" + +/obj/item/clothing/under/plasmaman/mining + name = "mining plasma envirosuit" + desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen." + icon_state = "explorer_envirosuit" + item_state = "explorer_envirosuit" + item_color = "explorer_envirosuit" + + +/obj/item/clothing/under/plasmaman/chef + name = "chef's plasma envirosuit" + desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef." + icon_state = "chef_envirosuit" + item_state = "chef_envirosuit" + item_color = "chef_envirosuit" + +/obj/item/clothing/under/plasmaman/enviroslacks + name = "enviroslacks" + desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike." + icon_state = "enviroslacks" + item_state = "enviroslacks" + item_color = "enviroslacks" + +/obj/item/clothing/under/plasmaman/chaplain + name = "chaplain's plasma envirosuit" + desc = "An envirosuit specially designed for only the most pious of plasmamen." + icon_state = "chap_envirosuit" + item_state = "chap_envirosuit" + item_color = "chap_envirosuit" + +/obj/item/clothing/under/plasmaman/curator + name = "curator's plasma envirosuit" + desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike." + icon_state = "prototype_envirosuit" + item_state = "prototype_envirosuit" + item_color = "prototype_envirosuit" + +/obj/item/clothing/under/plasmaman/janitor + name = "janitor's plasma envirosuit" + desc = "A grey and purple envirosuit designated for plasmamen janitors." + icon_state = "janitor_envirosuit" + item_state = "janitor_envirosuit" + item_color = "janitor_envirosuit" + +/obj/item/clothing/under/plasmaman/botany + name = "botany envirosuit" + desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries." + icon_state = "botany_envirosuit" + item_state = "botany_envirosuit" + item_color = "botany_envirosuit" + +/obj/item/clothing/under/plasmaman/hop + name = "head of personell's envirosuit" + desc = "A prestigious azure envirosuit designed for head of personell." + icon_state = "hop_envirosuit" + item_state = "hop_envirosuit" + item_color = "hop_envirosuit" + +/obj/item/clothing/under/plasmaman/captain + name = "captain's envirosuit" + desc = "An expensive piece of plasmaman envirosuit fashion. guaranteed to keep you cool while the station goes down in fierceful fires." + icon_state = "captain_envirosuit" + item_state = "captain_envirosuit" + item_color = "captain_envirosuit" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/mime + name = "mime envirosuit" + desc = "It's not very colourful." + icon_state = "mime_envirosuit" + item_state = "mime_envirosuit" + item_color = "mime_envirosuit" + +/obj/item/clothing/under/plasmaman/clown + name = "clown envirosuit" + desc = "'HONK!'" + icon_state = "clown_envirosuit" + item_state = "clown_envirosuit" + item_color = "clown_envirosuit" + +/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H) + if(!istype(H)) + return + + if(H.on_fire) + if(extinguishes_left) + if(next_extinguish > world.time) + return + next_extinguish = world.time + extinguish_cooldown + extinguishes_left-- + H.visible_message("[H]'s suit spews out a tonne of space lube!","Your suit spews out a tonne of space lube!") + H.ExtinguishMob() + new /obj/effect/particle_effect/foam(loc) //Truely terrifying. + return FALSE \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm new file mode 100644 index 0000000000..1f381df4cf --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -0,0 +1,21 @@ +/obj/item/clothing/under/plasmaman/engineering + name = "engineering plasma envirosuit" + desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage." + icon_state = "engineer_envirosuit" + item_state = "engineer_envirosuit" + item_color = "engineer_envirosuit" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/engineering/ce + name = "chief engineer's plasma envirosuit" + desc = "An advanced air-tight suit designed to be used by plasmamen chief engineers, complete with ornamental widgets and gizmo. It protects the user from fire and acid damage." + icon_state = "ce_envirosuit" + item_state = "ce_envirosuit" + item_color = "ce_envirosuit" + +/obj/item/clothing/under/plasmaman/atmospherics + name = "atmospherics plasma envirosuit" + desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue." + icon_state = "atmos_envirosuit" + item_state = "atmos_envirosuit" + item_color = "atmos_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/medsci.dm b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm new file mode 100644 index 0000000000..6106d785a9 --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/medsci.dm @@ -0,0 +1,56 @@ +/obj/item/clothing/under/plasmaman/medical + name = "medical plasma envirosuit" + desc = "A suit designed for the station's more plasma-based doctors." + icon_state = "doctor_envirosuit" + item_state = "doctor_envirosuit" + item_color = "doctor_envirosuit" + +/obj/item/clothing/under/plasmaman/cmo + name = "chief medical officer's plasma envirosuit" + desc = "A suit designed for the station's most plasma-based chief medical officer, but not for their cat." + icon_state = "cmo_envirosuit" + item_state = "cmo_envirosuit" + item_color = "cmo_envirosuit" + +/obj/item/clothing/under/plasmaman/science + name = "science plasma envirosuit" + desc = "A plasmaman envirosuit designed for scientists." + icon_state = "scientist_envirosuit" + item_state = "scientist_envirosuit" + item_color = "scientist_envirosuit" + +/obj/item/clothing/under/plasmaman/rd + name = "research direactor's plasma envirosuit" + desc = "A plasmaman envirosuit designed for the research director to aid them in their job of directing research into the right direction." + icon_state = "rd_envirosuit" + item_state = "rd_envirosuit" + item_color = "rd_envirosuit" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/robotics + name = "robotics plasma envirosuit" + desc = "A plasmaman envirosuit designed for roboticists." + icon_state = "roboticist_envirosuit" + item_state = "roboticist_envirosuit" + item_color = "roboticist_envirosuit" + +/obj/item/clothing/under/plasmaman/viro + name = "virology plasma envirosuit" + desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create." + icon_state = "virologist_envirosuit" + item_state = "virologist_envirosuit" + item_color = "virologist_envirosuit" + +/obj/item/clothing/under/plasmaman/genetics + name = "genetics plasma envirosuit" + desc = "A plasmaman envirosuit designed for geneticists." + icon_state = "geneticist_envirosuit" + item_state = "geneticist_envirosuit" + item_color = "geneticist_envirosuit" + +/obj/item/clothing/under/plasmaman/chemist + name = "chemistry plasma envirosuit" + desc = "A plasmaman envirosuit designed for chemists." + icon_state = "chemist_envirosuit" + item_state = "chemist_envirosuit" + item_color = "chemist_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm new file mode 100644 index 0000000000..ff756e09fd --- /dev/null +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -0,0 +1,21 @@ +/obj/item/clothing/under/plasmaman/security + name = "security plasma envirosuit" + desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." + icon_state = "security_envirosuit" + item_state = "security_envirosuit" + item_color = "security_envirosuit" + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + +/obj/item/clothing/under/plasmaman/security/warden + name = "warden plasma envirosuit" + desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security." + icon_state = "warden_envirosuit" + item_state = "warden_envirosuit" + item_color = "warden_envirosuit" + +/obj/item/clothing/under/plasmaman/security/hos + name = "security plasma envirosuit" + desc = "A slick black and red plasmaman containment suit designed for the head of security, also called the LAW." + icon_state = "hos_envirosuit" + item_state = "hos_envirosuit" + item_color = "hos_envirosuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index abc157fa71..ec39f20b0b 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -589,6 +589,7 @@ item_state = "b_suit" item_color = "sailor" can_adjust = FALSE + /obj/item/clothing/under/plasmaman name = "plasma envirosuit" desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy." @@ -596,12 +597,15 @@ item_state = "plasmaman" item_color = "plasmaman" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) + slowdown = 1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + mutantrace_variation = NO_MUTANTRACE_VARIATION can_adjust = FALSE strip_delay = 80 var/next_extinguish = 0 var/extinguish_cooldown = 100 var/extinguishes_left = 5 + /obj/item/clothing/under/plasmaman/examine(mob/user) ..() to_chat(user, "There are [extinguishes_left] extinguisher charges left in this suit.") @@ -618,6 +622,7 @@ H.ExtinguishMob() new /obj/effect/particle_effect/water(get_turf(H)) return 0 + /obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params) ..() if (istype(E, /obj/item/extinguisher_refill)) @@ -631,11 +636,13 @@ return return return + /obj/item/extinguisher_refill name = "envirosuit extinguisher cartridge" desc = "A cartridge loaded with a compressed extinguisher mix, used to refill the automatic extinguisher on plasma envirosuits." icon_state = "plasmarefill" icon = 'icons/obj/device.dmi' + /obj/item/clothing/under/rank/security/navyblue/russian name = "\improper Russian officer's uniform" desc = "The latest in fashionable russian outfits." @@ -703,14 +710,6 @@ fitted = NO_FEMALE_UNIFORM can_adjust = FALSE resistance_flags = NONE -/obj/item/clothing/under/durathread - name = "durathread jumpsuit" - desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer." - icon_state = "durathread" - item_state = "durathread" - item_color = "durathread" - can_adjust = FALSE - armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5) /obj/item/clothing/under/gear_harness name = "gear harness" @@ -718,3 +717,22 @@ icon_state = "gear_harness" item_state = "gear_harness" //We dont use golem do to being a item, item without faces making it default to error suit sprites. body_parts_covered = CHEST|GROIN + +/obj/item/clothing/under/durathread + name = "durathread jumpsuit" + desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer." + icon_state = "durathread" + item_state = "durathread" + item_color = "durathread" + can_adjust = TRUE + armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5) + +/obj/item/clothing/under/duraskirt + name = "durathread jumpskirt" + desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer. Being a short skirt, it naturally doesn't protect the legs." + icon_state = "duraskirt" + item_state = "duraskirt" + item_color = "durathread" + can_adjust = FALSE + body_parts_covered = CHEST|GROIN|ARMS + armor = list("melee" = 10, "laser" = 10, "fire" = 40, "acid" = 10, "bomb" = 5) \ No newline at end of file diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index 9893edf248..4e3e1aa0cc 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -67,3 +67,14 @@ icon_state = "syndicate_combat" item_color = "syndicate_combat" can_adjust = FALSE + +/obj/item/clothing/under/syndicate/baseball + name = "major league, number unknown" + desc = "A major league outfit with the number faded number on the back. Seems rather robust for just a game" + icon_state = "syndicatebaseball" + item_state = "syndicatebaseball" + item_color = "syndicatebaseball" + has_sensor = NO_SENSORS + armor = list("melee" = 15, "bullet" = 5, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 40) + alt_covers_chest = TRUE + diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 025b4af578..f86691c067 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -211,6 +211,12 @@ time = 40 category = CAT_ROBOT +/datum/crafting_recipe/potatos + name = "Potat-OS" + reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 ) + result = /obj/item/aicard/potato + category = CAT_ROBOT + /datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but name = "Pneumatic Cannon" result = /obj/item/pneumatic_cannon/ghetto @@ -353,6 +359,7 @@ reqs = list(/obj/item/restraints/handcuffs/cable = 1, /obj/item/shard = 1, /obj/item/stack/rods = 1) + parts = list(/obj/item/shard = 1) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -455,6 +462,12 @@ /obj/item/bikehorn = 1) category = CAT_MISC +/datum/crafting_recipe/toyneb + name = "Non-Euplastic Blade" + reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) + result = /obj/item/toy/sword/cx + category = CAT_MISC + /datum/crafting_recipe/chemical_payload name = "Chemical Payload (C4)" result = /obj/item/bombcore/chemical @@ -663,12 +676,12 @@ /datum/crafting_recipe/femur_breaker name = "Femur Breaker" result = /obj/structure/femur_breaker - time = 150 + time = 150 reqs = list(/obj/item/stack/sheet/metal = 20, /obj/item/stack/cable_coil = 30) tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) category = CAT_MISC - + /datum/crafting_recipe/lizardhat name = "Lizard Cloche Hat" result = /obj/item/clothing/head/lizard @@ -874,12 +887,66 @@ /datum/crafting_recipe/smartdartgun name = "Smart dartgun" result = /obj/item/gun/syringe/dart - reqs = list(/obj/item/stack/sheet/metal = 15, - /obj/item/stack/sheet/glass = 10, + reqs = list(/obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/glass = 5, /obj/item/tank/internals = 1, /obj/item/reagent_containers/glass/beaker = 1, - /obj/item/stack/sheet/plastic = 10, - /obj/item/stack/cable_coil = 2) + /obj/item/stack/sheet/plastic = 5, + /obj/item/stack/cable_coil = 1) time = 150 //It's a gun category = CAT_WEAPONRY subcategory = CAT_WEAPON + +/datum/crafting_recipe/rapiddartgun + name = "Rapid Smart dartgun" + result = /obj/item/gun/syringe/dart/rapiddart + reqs = list( + /obj/item/gun/syringe/dart = 1, + /obj/item/stack/sheet/plastic = 5, + /obj/item/stack/cable_coil = 1, + /obj/item/reagent_containers/glass/beaker = 1 + ) + parts = list(/obj/item/reagent_containers/glass/beaker = 1) + time = 120 //Modifying your gun + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/durathread_duffelbag + name = "Durathread Dufflebag" + result = /obj/item/storage/backpack/duffelbag/durathread + reqs = list(/obj/item/stack/sheet/durathread = 7, + /obj/item/stack/sheet/leather = 3) + time = 70 + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_toolbelt + name = "Durathread Toolbelt" + result = /obj/item/storage/belt/durathread + reqs = list(/obj/item/stack/sheet/durathread = 5, + /obj/item/stack/sheet/leather = 1) + time = 30 + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_bandolier + name = "Durathread Bandolier" + result = /obj/item/storage/belt/bandolier/durathread + reqs = list(/obj/item/stack/sheet/durathread = 6, + /obj/item/stack/sheet/leather = 2) + time = 50 + category = CAT_CLOTHING + + /datum/crafting_recipe/durathread_helmet + name = "Makeshift Durathread Helmet" + result = /obj/item/clothing/head/helmet/durathread + reqs = list(/obj/item/stack/sheet/durathread = 4, + /obj/item/stack/sheet/leather = 2) + time = 30 + category = CAT_CLOTHING + +/datum/crafting_recipe/durathread_vest + name = "Makeshift Durathread Armour" + result = /obj/item/clothing/suit/armor/vest/durathread + reqs = list(/obj/item/stack/sheet/durathread = 6, + /obj/item/stack/sheet/leather = 3) + time = 50 + category = CAT_CLOTHING diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 9b72020047..66495d833d 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -19,6 +19,7 @@ new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc) qdel(Poly) + /datum/round_event/spooky/announce(fake) priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index a4e8b276b5..8f77af58eb 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -41,11 +41,16 @@ else L.mind.add_antag_datum(/datum/antagonist/heartbreaker) -/proc/forge_valentines_objective(mob/living/lover,mob/living/date) +/proc/forge_valentines_objective(mob/living/lover,mob/living/date,var/chemLove = FALSE) lover.mind.special_role = "valentine" - var/datum/antagonist/valentine/V = new - V.date = date.mind - lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now + if (chemLove == TRUE) + var/datum/antagonist/valentine/chem/V = new //Changes text and EOG check basically. + V.date = date.mind + lover.mind.add_antag_datum(V) + else + var/datum/antagonist/valentine/V = new + V.date = date.mind + lover.mind.add_antag_datum(V) //These really should be teams but i can't be assed to incorporate third wheels right now /datum/round_event/valentines/announce(fake) priority_announce("It's Valentine's Day! Give a valentine to that special someone!") diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index a76c75dd43..5f9873c387 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -77,7 +77,7 @@ if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) - santa.key = C.key + C.transfer_ckey(santa, FALSE) santa.equipOutfit(/datum/outfit/santa) santa.update_icons() diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 798bcf82dd..604e203cd6 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -1,5 +1,8 @@ // Normal strength +#define SINGULO_BEACON_DISTURBANCE 0.2 //singularity beacon also improve the odds of meteor waves and speed them up a little. +#define SINGULO_BEACON_MAX_DISTURBANCE 0.6 //maximum cap due to how meteor waves can be potentially round ending. + /datum/round_event_control/meteor_wave name = "Meteor Wave: Normal" typepath = /datum/round_event/meteor_wave @@ -15,14 +18,20 @@ var/list/wave_type var/wave_name = "normal" +/datum/round_event/meteor_wave/setup() + announceWhen = 1 + startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + if(GLOB.singularity_counter) + startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) + endWhen = startWhen + 60 + + /datum/round_event/meteor_wave/New() ..() if(!wave_type) determine_wave_type() /datum/round_event/meteor_wave/proc/determine_wave_type() - if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) - wave_name = "halloween" if(!wave_name) wave_name = pickweight(list( "normal" = 50, @@ -34,7 +43,10 @@ if("threatening") wave_type = GLOB.meteors_threatening if("catastrophic") - wave_type = GLOB.meteors_catastrophic + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + wave_type = GLOB.meteorsSPOOKY + else + wave_type = GLOB.meteors_catastrophic if("meaty") wave_type = GLOB.meteorsB if("space dust") @@ -46,7 +58,7 @@ kill() /datum/round_event/meteor_wave/announce(fake) - priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg') + priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", 'sound/ai/meteors.ogg') /datum/round_event/meteor_wave/tick() if(ISMULTIPLE(activeFor, 3)) @@ -73,3 +85,6 @@ /datum/round_event/meteor_wave/catastrophic wave_name = "catastrophic" + +#undef SINGULO_BEACON_DISTURBANCE +#undef SINGULO_BEACON_MAX_DISTURBANCE diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index 55d8ce8b14..96b6cded58 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -48,7 +48,7 @@ spawned_animals++ - SA.key = SG.key + SG.transfer_ckey(SA, FALSE) SA.grant_all_languages(TRUE) diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 1c8ef95baa..29704168e9 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -23,7 +23,7 @@ I.name = I.dna.real_name I.updateappearance(mutcolor_update=1) I.domutcheck() - I.key = C.key + C.transfer_ckey(I, FALSE) var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard) if(!master.wiz_team) master.create_wiz_team() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 88f72d27c3..bac2e0bb65 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -771,7 +771,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( ..() var/turf/source = random_far_turf() if(!sound_type) - sound_type = pick("airlock","airlock pry","console","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") + sound_type = pick("airlock","airlock pry","console","flash","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack") feedback_details += "Type: [sound_type]" //Strange audio switch(sound_type) @@ -788,6 +788,8 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.playsound_local(source,'sound/effects/explosion1.ogg', 50, 1) else target.playsound_local(source, 'sound/effects/explosion2.ogg', 50, 1) + if("flash") + target.playsound_local(source, 'sound/weapons/flash.ogg', 50, 1) if("far explosion") target.playsound_local(source, 'sound/effects/explosionfar.ogg', 50, 1) if("glass") @@ -1291,4 +1293,4 @@ GLOBAL_LIST_INIT(hallucination_list, list( H.hal_target = target H.preparePixelProjectile(target, start) H.fire() - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 0794d274b6..e72b624ae5 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -7,11 +7,12 @@ /obj/item/reagent_containers/food/drinks/bottle amount_per_transfer_from_this = 10 volume = 100 + force = 15 throwforce = 15 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' - var/const/duration = 13 //Directly relates to the 'knockdown' duration. Lowered by armor (i.e. helmets) + var/knockdown_duration = 13 //Directly relates to the 'knockdown' duration. Lowered by armor (i.e. helmets) isGlass = TRUE foodtype = ALCOHOL @@ -61,46 +62,30 @@ to_chat(user, "You don't want to harm [target]!") return - force = 15 //Smashing bottles over someoen's head hurts. - var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at - var/armor_block = 0 //Get the target's armor values for normal attack damage. - var/armor_duration = 0 //The more force the bottle has, the longer the duration. + var/headarmor = 0 // Target's head armor + var/armor_block = min(90, target.run_armor_check(affecting, "melee", null, null,armour_penetration)) // For normal attack damage - //Calculating duration and calculating damage. - if(ishuman(target)) + //If they have a hat/helmet and the user is targeting their head. + if(affecting == BODY_ZONE_HEAD) + var/obj/item/I = target.get_item_by_slot(SLOT_HEAD) + if(I) + headarmor = I.armor.melee - var/mob/living/carbon/human/H = target - var/headarmor = 0 // Target's head armor - armor_block = H.run_armor_check(affecting, "melee", null, null,armour_penetration) // For normal attack damage - - //If they have a hat/helmet and the user is targeting their head. - if(istype(H.head, /obj/item/clothing/head) && affecting == BODY_ZONE_HEAD) - headarmor = H.head.armor.melee - else - headarmor = 0 - - //Calculate the knockdown duration for the target. - armor_duration = (duration - headarmor) + force - - else - //Only humans can have armor, right? - armor_block = target.run_armor_check(affecting, "melee") - if(affecting == BODY_ZONE_HEAD) - armor_duration = duration + force + //Calculate the knockdown duration for the target. + var/armor_duration = (knockdown_duration - headarmor) + force //Apply the damage! - armor_block = min(90,armor_block) target.apply_damage(force, BRUTE, affecting, armor_block) // You are going to knock someone out for longer if they are not wearing a helmet. var/head_attack_message = "" - if(affecting == BODY_ZONE_HEAD && istype(target, /mob/living/carbon/)) + if(affecting == BODY_ZONE_HEAD && iscarbon(target)) head_attack_message = " on the head" //Knockdown the target for the duration that we calculated and divide it by 5. if(armor_duration) - target.apply_effect(min(armor_duration, 200) , EFFECT_KNOCKDOWN) // Never knockdown more than a flash! + target.Knockdown(min(armor_duration, 200)) // Never knockdown more than a flash! //Display an attack message. if(target != user) @@ -202,17 +187,18 @@ desc = "A flask of holy water...it's been sitting in the Necropolis a while though." list_reagents = list("hell_water" = 100) -/obj/item/reagent_containers/food/drinks/holyoil +/obj/item/reagent_containers/food/drinks/bottle/holyoil name = "flask of zelus oil" desc = "A brass flask of Zelus oil, a viscous fluid scenting of brass. Can be thrown to deal damage from afar." icon_state = "zelusflask" - list_reagents = list("holyoil" = 30) //Powerfull + list_reagents = list("holyoil" = 30) volume = 30 foodtype = NONE - force = 12 //Same as a toolbox + force = 18 throwforce = 18 + knockdown_duration = 18 -/obj/item/reagent_containers/food/drinks/holyoil/null +/obj/item/reagent_containers/food/drinks/bottle/holyoil/empty list_reagents = list("holyoil" = 0) /obj/item/reagent_containers/food/drinks/bottle/vermouth diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 31e99535d1..1d0b626d98 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -16,6 +16,7 @@ //Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change(changetype) to change names, descs and sprites. var/list/possible_states = list( "ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."), + "mustard" = list("mustard", "mustard bottle", "A spice mixed with enzymes and water."), "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), @@ -282,6 +283,12 @@ originalname = "ketchup" list_reagents = list("ketchup" = 10) +//Mustard +/obj/item/reagent_containers/food/condiment/pack/mustard + name = "mustard pack" + originalname = "mustard" + list_reagents = list("mustard" = 10) + //Hot sauce /obj/item/reagent_containers/food/condiment/pack/hotsauce name = "hotsauce pack" diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index 1a82d1b406..ee169e9861 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -108,7 +108,7 @@ tastes = list("maggots" = 1, "the inside of a reactor" = 1) foodtype = MEAT | RAW | GROSS -/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect icon_state = "mothmeat" desc = "Unpleasantly powdery and dry. Kind of pretty, though." filling_color = "#BF896B" diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm index d66cfdd667..98f80331a7 100644 --- a/code/modules/food_and_drinks/food/snacks_cake.dm +++ b/code/modules/food_and_drinks/food/snacks_cake.dm @@ -335,7 +335,7 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake icon_state = "vanillacake" slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice bonus_reagents = list("sugar" = 15, "vanilla" = 15) - tastes = list("caje" = 1, "sugar" = 1, "vanilla" = 10) + tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) foodtype = GRAIN | SUGAR | DAIRY /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice @@ -361,4 +361,21 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake icon_state = "clowncake_slice" filling_color = "#00FFFF" tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) - foodtype = GRAIN | SUGAR | DAIRY \ No newline at end of file + foodtype = GRAIN | SUGAR | DAIRY + +/obj/item/reagent_containers/food/snacks/store/cake/peach_cake + name = "peach cake" + desc = "A peach filled cake." + icon_state = "peachcake" + slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/peach_slice + bonus_reagents = list("sugar" = 5, "peachjuice" = 15) + tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10) + foodtype = GRAIN | SUGAR | DAIRY + +/obj/item/reagent_containers/food/snacks/cakeslice/peach_slice + name = "peach cake slice" + desc = "A slice of peach cake." + icon_state = "peach_slice" + filling_color = "#00FFFF" + tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10) + foodtype = GRAIN | SUGAR | DAIRY diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm index c4f8ccf76b..3988909b30 100644 --- a/code/modules/food_and_drinks/food/snacks_frozen.dm +++ b/code/modules/food_and_drinks/food/snacks_frozen.dm @@ -28,6 +28,50 @@ tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1) foodtype = FRUIT | DAIRY | SUGAR +/obj/item/reagent_containers/food/snacks/banana_split + name = "banana split" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "A long glass dish filled with ice-cream, chocolate and a banana down the middle. A timeless classic by any standards." + icon_state = "banana_split" + bonus_reagents = list("nutriment" = 5, "vitamin" = 3) + list_reagents = list("nutriment" = 3, "banana" = 10, "vitamin" = 2) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "banana" = 1, "charries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/cola_float + name = "Root Beer Float" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "A glass filled with cream, soda and ice-cream with a cherry on top." + icon_state = "cola_float" + bonus_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list("nutriment" = 3, "vitamin" = 2) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "space coal" = 1, "cherries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/charrie_float + name = "Cherry Shake" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "Cherries mixed with ice-cream, known for its filling tastes" + icon_state = "cherryshake" + bonus_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list("nutriment" = 3, "vitamin" = 2, "cherryshake" = 15) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "charries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/bluecharrie_float + name = "Blue Cherry Shake" + trash = /obj/item/reagent_containers/food/drinks/drinkingglass + desc = "Cherries mixed with ice-cream, known for its filling tastes. This one is a exotic blue!" + icon_state = "bluecherryshake" + bonus_reagents = list("nutriment" = 3, "vitamin" = 1) + list_reagents = list("nutriment" = 3, "vitamin" = 2, "bluecherryshake" = 10) + filling_color = "#FFFACD" + tastes = list("ice cream" = 1, "blue cherries" = 1) + foodtype = FRUIT | DAIRY | SUGAR + /obj/item/reagent_containers/food/snacks/spacefreezy name = "space freezy" desc = "The best icecream in space." @@ -126,6 +170,22 @@ tastes = list("ice" = 1, "water" = 1, "berries" = 5) foodtype = FRUIT +/obj/item/reagent_containers/food/snacks/snowcones/peach + name = "peach flavored snowcone" + desc = "A peach flavord snowball in a paper cup." + icon_state = "peach_sc" + list_reagents = list("nutriment" = 1, "peachjuice" = 10) + tastes = list("ice" = 1, "water" = 1, " peach" = 5) + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/snowcones/strawberry + name = "strawberry flavored snowcone" + desc = "A strawberry flavord snowball in a paper cup." + icon_state = "blue_sc" + list_reagents = list("nutriment" = 1, "berryjuice" = 10) + tastes = list("ice" = 1, "water" = 1, " strawberry" = 5) + foodtype = FRUIT + /obj/item/reagent_containers/food/snacks/snowcones/fruitsalad name = "mixed fruit flavored snowcone" desc = "A mix of different flavors dizzled on a snowball in a paper cup." diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index cf99bd78d9..0b53ec8822 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -322,6 +322,14 @@ filling_color = "#800000" tastes = list("meat" = 1, "butter" = 1) +/obj/item/reagent_containers/food/snacks/corndog + name = "corndog plate" + desc = "A plate with two small corn dogs, with two dimples of ketchup and mustard to dip them in." + icon_state = "dorndog" + trash = /obj/item/trash/plate/alt + tastes = list("hotdog" = 2, "mustard and ketchup" = 1, "fryed bread" = 1) + bonus_reagents = list("nutriment" = 6, "vitamin" = 2, "mustard" = 5, "ketchup" = 5) + /obj/item/reagent_containers/food/snacks/kebab/rat name = "rat-kebab" desc = "Not so delicious rat meat, on a stick." diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index e36efe750b..ad0824dd79 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -573,4 +573,22 @@ name = "Maintenance Peaches" desc = "I have a mouth and I must eat." icon_state = "peachcanmaint" - tastes = list("peaches" = 1, "tin" = 7) \ No newline at end of file + tastes = list("peaches" = 1, "tin" = 7) + +/obj/item/reagent_containers/food/snacks/chocolatestrawberry + name = "Chocolate dipped strawberries" + desc = "A strawberry dipped in a bit of chocolate." + icon_state = "chocolatestrawberry" + list_reagents = list("sugar" = 5, "nutriment" = 2) + filling_color = "#ffdf26" + tastes = list("strawberries" = 5, "chocolate" = 3) + foodtype = FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/chocolatebanana + name = "Chocolate dipped banana" + desc = "A banana dipped in a bit of chocolate and held on a stick." + icon_state = "banana_coco" + list_reagents = list("sugar" = 5, "nutriment" = 3, "vitamin" = 1) + filling_color = "#ffdf26" + tastes = list("banana" = 5, "chocolate" = 3) + foodtype = FRUIT | SUGAR \ No newline at end of file diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index 238bb4f86a..9b87002738 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -308,7 +308,6 @@ tastes = list("bread" = 1, "egg" = 1, "cheese" = 1) foodtype = GRAIN | MEAT | DAIRY - /obj/item/reagent_containers/food/snacks/sugarcookie name = "sugar cookie" desc = "Just like your little sister used to make." @@ -369,6 +368,16 @@ tastes = list("cake" = 3, "blue cherry" = 1) foodtype = GRAIN | FRUIT | SUGAR +/obj/item/reagent_containers/food/snacks/strawberrycupcake + name = "Strawberry cupcake" + desc = "Strawberry inside a delicious cupcake." + icon_state = "strawberrycupcake" + bonus_reagents = list("nutriment" = 1, "vitamin" = 3) + list_reagents = list("nutriment" = 5, "vitamin" = 1) + filling_color = "#F0E68C" + tastes = list("cake" = 2, "strawberry" = 1) + foodtype = GRAIN | FRUIT | SUGAR + /obj/item/reagent_containers/food/snacks/honeybun name = "honey bun" desc = "A sticky pastry bun glazed with honey." diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 20313fd1b7..bc66d353e1 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -315,4 +315,20 @@ filling_color = "#1E90FF" list_reagents = list("nutriment" = 2, "vitamin" = 4) tastes = list("nuts" = 1, "pie" = 1) - foodtype = GRAIN \ No newline at end of file + foodtype = GRAIN + +/obj/item/reagent_containers/food/snacks/pie/strawberrypie + name = "strawberry pie" + desc = "A strawberry pie." + icon_state = "strawberrypie" + bonus_reagents = list("nutriment" = 6, "vitamin" = 6) + tastes = list("strawberry" = 1, "pie" = 1) + foodtype = GRAIN | FRUIT | SUGAR + +/obj/item/reagent_containers/food/snacks/pie/peachpie + name = "peach pie" + desc = "A pie with peach filling." + icon_state = "strawberrypie" + bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "peachjuice" = 15) + tastes = list("peach" = 1, "pie" = 1) + foodtype = GRAIN | FRUIT diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm index 317a434040..8f661b868e 100644 --- a/code/modules/food_and_drinks/food/snacks_vend.dm +++ b/code/modules/food_and_drinks/food/snacks_vend.dm @@ -7,7 +7,7 @@ desc = "Nougat love it or hate it." icon_state = "candy" trash = /obj/item/trash/candy - list_reagents = list("nutriment" = 1, "sugar" = 3) + list_reagents = list("nutriment" = 1, "sugar" = 3, "cocoa" = 3) junkiness = 25 filling_color = "#D2691E" tastes = list("candy" = 1) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 58d3ef69bb..0f901f2412 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -1,9 +1,13 @@ #define ICECREAM_VANILLA 1 #define ICECREAM_CHOCOLATE 2 #define ICECREAM_STRAWBERRY 3 -#define ICECREAM_BLUE 4 -#define CONE_WAFFLE 5 -#define CONE_CHOC 6 +#define ICECREAM_PEACH 4 +#define ICECREAM_GRAPE 5 +#define ICECREAM_BLUE 6 +#define CONE_WAFFLE 7 +#define CONE_CHOC 8 + + /obj/machinery/icecream_vat name = "ice cream vat" @@ -26,7 +30,9 @@ "cocoa" = 5, "vanilla" = 5, "berryjuice" = 5, - "singulo" = 5) + "singulo" = 5, + "peachjuice" = 5, + "grapejuice" = 5) /obj/machinery/icecream_vat/proc/get_ingredient_list(type) switch(type) @@ -34,6 +40,10 @@ return list("milk", "ice", "cocoa") if(ICECREAM_STRAWBERRY) return list("milk", "ice", "berryjuice") + if(ICECREAM_PEACH) + return list("milk", "ice", "peachjuice") + if(ICECREAM_GRAPE) + return list("milk", "ice", "grapejuice") if(ICECREAM_BLUE) return list("milk", "ice", "singulo") if(CONE_WAFFLE) @@ -50,6 +60,10 @@ return "chocolate" if(ICECREAM_STRAWBERRY) return "strawberry" + if(ICECREAM_PEACH) + return "peach" + if(ICECREAM_GRAPE) + return "grape" if(ICECREAM_BLUE) return "blue" if(CONE_WAFFLE) @@ -62,7 +76,7 @@ /obj/machinery/icecream_vat/Initialize() . = ..() - while(product_types.len < 6) + while(product_types.len < 8) product_types.Add(5) create_reagents(100, OPENCONTAINER | NO_REACT) for(var/reagent in icecream_vat_reagents) @@ -76,6 +90,8 @@ dat += "Vanilla ice cream: Select Make x5 [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice) |
| [prize.equipment_name] | [prize.cost] | Purchase |
Welcome, [client ? client.prefs.real_name : "Unknown User"]
" - output += "" + output += "| "
+ var/column_counter = 0
+ var/free_space = 0
+ for(var/list/category in list(GLOB.command_positions) + list(GLOB.supply_positions) + list(GLOB.engineering_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions))
+ var/cat_color = "fff" //random default
+ if(SSjob.name_occupations && SSjob.name_occupations[category[1]])
+ cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color
+ else
+ cat_color = SSjob.occupations[category[1]].selection_color
+ dat += " " + column_counter++ + if(free_space <=4) + free_space++ + if(column_counter > 0 && (column_counter % 3 == 0)) + dat += " | " + if(free_space >= 5 && (free_space % 5 == 0) && (column_counter % 3 != 0)) + free_space = 0 + column_counter = 0 + dat += " | " + + dat += " |
"
+ dat += "
" \ No newline at end of file diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 673548ff48..a11e7a228e 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -53,7 +53,7 @@ if(mind && isliving(M)) mind.transfer_to(M, 1) // second argument to force key move to new mob else - M.key = key + transfer_ckey(M) if(delete_old_mob) QDEL_IN(src, 1) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 5703e2190b..6394b45aa7 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -75,7 +75,7 @@ O.setOxyLoss(getOxyLoss(), 0) O.setCloneLoss(getCloneLoss(), 0) O.adjustFireLoss(getFireLoss(), 0) - O.setBrainLoss(getBrainLoss(), 0) + O.setOrganLoss(ORGAN_SLOT_BRAIN, getOrganLoss(ORGAN_SLOT_BRAIN), 0) O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina O.updatehealth() O.radiation = radiation @@ -236,7 +236,7 @@ O.setOxyLoss(getOxyLoss(), 0) O.setCloneLoss(getCloneLoss(), 0) O.adjustFireLoss(getFireLoss(), 0) - O.setBrainLoss(getBrainLoss(), 0) + O.setOrganLoss(ORGAN_SLOT_BRAIN, getOrganLoss(ORGAN_SLOT_BRAIN), 0) O.adjustStaminaLoss(getStaminaLoss(), 0)//CIT CHANGE - makes monkey transformations inherit stamina O.updatehealth() O.radiation = radiation @@ -382,7 +382,7 @@ mind.active = FALSE mind.transfer_to(R) else if(transfer_after) - R.key = key + transfer_ckey(R) R.apply_pref_name("cyborg") @@ -401,7 +401,7 @@ qdel(src) //human -> alien -/mob/living/carbon/human/proc/Alienize() +/mob/living/carbon/human/proc/Alienize(mind_transfer = TRUE) if (notransform) return for(var/obj/item/W in src) @@ -425,13 +425,16 @@ new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc) new_xeno.a_intent = INTENT_HARM - new_xeno.key = key + if(mind && mind_transfer) + mind.transfer_to(new_xeno) + else + transfer_ckey(new_xeno) to_chat(new_xeno, "You are now an alien.") . = new_xeno qdel(src) -/mob/living/carbon/human/proc/slimeize(reproduce as num) +/mob/living/carbon/human/proc/slimeize(reproduce, mind_transfer = TRUE) if (notransform) return for(var/obj/item/W in src) @@ -457,20 +460,26 @@ else new_slime = new /mob/living/simple_animal/slime(loc) new_slime.a_intent = INTENT_HARM - new_slime.key = key + if(mind && mind_transfer) + mind.transfer_to(new_slime) + else + transfer_ckey(new_slime) to_chat(new_slime, "You are now a slime. Skreee!") . = new_slime qdel(src) -/mob/proc/become_overmind(starting_points = 60) +/mob/proc/become_overmind(starting_points = 60, mind_transfer = FALSE) var/mob/camera/blob/B = new /mob/camera/blob(get_turf(src), starting_points) - B.key = key + if(mind && mind_transfer) + mind.transfer_to(B) + else + transfer_ckey(B) . = B qdel(src) -/mob/living/carbon/human/proc/corgize() +/mob/living/carbon/human/proc/corgize(mind_transfer = TRUE) if (notransform) return for(var/obj/item/W in src) @@ -485,13 +494,16 @@ var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new /mob/living/simple_animal/pet/dog/corgi (loc) new_corgi.a_intent = INTENT_HARM - new_corgi.key = key + if(mind && mind_transfer) + mind.transfer_to(new_corgi) + else + transfer_ckey(new_corgi) to_chat(new_corgi, "You are now a Corgi. Yap Yap!") . = new_corgi qdel(src) -/mob/living/carbon/proc/gorillize() +/mob/living/carbon/proc/gorillize(mind_transfer = TRUE) if(notransform) return @@ -509,22 +521,22 @@ invisibility = INVISIBILITY_MAXIMUM var/mob/living/simple_animal/hostile/gorilla/new_gorilla = new (get_turf(src)) new_gorilla.a_intent = INTENT_HARM - if(mind) + if(mind && mind_transfer) mind.transfer_to(new_gorilla) else - new_gorilla.key = key + transfer_ckey(new_gorilla) to_chat(new_gorilla, "You are now a gorilla. Ooga ooga!") . = new_gorilla qdel(src) -/mob/living/carbon/human/Animalize() +/mob/living/carbon/human/Animalize(mind_transfer = TRUE) var/list/mobtypes = typesof(/mob/living/simple_animal) - var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes - - if(!safe_animal(mobpath)) - to_chat(usr, "Sorry but this mob type is currently unavailable.") + var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") as null|anything in mobtypes + if(!mobpath) return + if(mind) + mind_transfer = alert("Want to transfer their mind into the new mob", "Mind Transfer", "Yes", "No") == "Yes" ? TRUE : FALSE if(notransform) return @@ -532,8 +544,8 @@ dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 + notransform = TRUE + canmove = FALSE icon = null invisibility = INVISIBILITY_MAXIMUM @@ -541,8 +553,10 @@ qdel(t) var/mob/new_mob = new mobpath(src.loc) - - new_mob.key = key + if(mind && mind_transfer) + mind.transfer_to(new_mob) + else + transfer_ckey(new_mob) new_mob.a_intent = INTENT_HARM @@ -550,59 +564,23 @@ . = new_mob qdel(src) -/mob/proc/Animalize() +/mob/proc/Animalize(mind_transfer = TRUE) var/list/mobtypes = typesof(/mob/living/simple_animal) - var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes - - if(!safe_animal(mobpath)) - to_chat(usr, "Sorry but this mob type is currently unavailable.") + var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") as null|anything in mobtypes + if(!mobpath) return + if(mind) + mind_transfer = alert("Want to transfer their mind into the new mob", "Mind Transfer", "Yes", "No") == "Yes" ? TRUE : FALSE var/mob/new_mob = new mobpath(src.loc) - new_mob.key = key + if(mind && mind_transfer) + mind.transfer_to(new_mob) + else + transfer_ckey(new_mob) new_mob.a_intent = INTENT_HARM to_chat(new_mob, "You feel more... animalistic") . = new_mob qdel(src) - -/* Certain mob types have problems and should not be allowed to be controlled by players. - * - * This proc is here to force coders to manually place their mob in this list, hopefully tested. - * This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them. - */ -/mob/proc/safe_animal(MP) - -//Bad mobs! - Remember to add a comment explaining what's wrong with the mob - if(!MP) - return 0 //Sanity, this should never happen. - - if(ispath(MP, /mob/living/simple_animal/hostile/construct)) - return 0 //Verbs do not appear for players. - -//Good mobs! - if(ispath(MP, /mob/living/simple_animal/pet/cat)) - return 1 - if(ispath(MP, /mob/living/simple_animal/pet/dog/corgi)) - return 1 - if(ispath(MP, /mob/living/simple_animal/crab)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/carp)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/mushroom)) - return 1 - if(ispath(MP, /mob/living/simple_animal/shade)) - return 1 - if(ispath(MP, /mob/living/simple_animal/hostile/killertomato)) - return 1 - if(ispath(MP, /mob/living/simple_animal/mouse)) - return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak) - if(ispath(MP, /mob/living/simple_animal/hostile/bear)) - return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak) - if(ispath(MP, /mob/living/simple_animal/parrot)) - return 1 //Parrots are no longer unfinished! -Nodrak - - //Not in here? Must be untested! - return 0 diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 580374c5c0..db4cdc2ff5 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -178,13 +178,13 @@ turn_on(user) /obj/item/modular_computer/emag_act(mob/user) + . = ..() if(obj_flags & EMAGGED) to_chat(user, "\The [src] was already emagged.") - return 0 - else - obj_flags |= EMAGGED - to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.") - return 1 + return + obj_flags |= EMAGGED + to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.") + return TRUE /obj/item/modular_computer/examine(mob/user) ..() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 19d3b56046..b3476e7046 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -44,7 +44,9 @@ cpu.attack_ghost(user) /obj/machinery/modular_computer/emag_act(mob/user) - return cpu ? cpu.emag_act(user) : 1 + . = ..() + if(cpu) + . |= cpu.emag_act(user) /obj/machinery/modular_computer/update_icon() cut_overlays() diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm index 1c3fbd8147..94be922fdf 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm @@ -8,33 +8,37 @@ Contents: /obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth() - var/mob/living/carbon/human/U = affecting - if(!U) + if(!affecting) return if(stealth) cancel_stealth() else if(cell.charge <= 0) - to_chat(U, "You don't have enough power to enable Stealth!") + to_chat(affecting, "You don't have enough power to enable Stealth!") return stealth = !stealth - animate(U, alpha = 50,time = 15) - U.visible_message("[U.name] vanishes into thin air!", \ + animate(affecting, alpha = 10,time = 15) + affecting.visible_message("[affecting.name] vanishes into thin air!", \ "You are now mostly invisible to normal detection.") + RegisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY), .proc/reduce_stealth) + RegisterSignal(affecting, COMSIG_MOVABLE_BUMP, .proc/bumping_stealth) +/obj/item/clothing/suit/space/space_ninja/proc/reduce_stealth() + affecting.alpha = min(affecting.alpha + 30, 80) + +/obj/item/clothing/suit/space/space_ninja/proc/bumping_stealth(datum/source, atom/A) + if(isliving(A)) + affecting.alpha = min(affecting.alpha + 15, 80) /obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth() - var/mob/living/carbon/human/U = affecting - if(!U) - return 0 - if(stealth) - stealth = !stealth - animate(U, alpha = 255, time = 15) - U.visible_message("[U.name] appears from thin air!", \ - "You are now visible.") - return 1 - return 0 - + if(!affecting || !stealth) + return FALSE + stealth = !stealth + UnregisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_BUMP)) + animate(affecting, alpha = 255, time = 15) + affecting.visible_message("[affecting.name] appears from thin air!", \ + "You are now visible.") + return TRUE /obj/item/clothing/suit/space/space_ninja/proc/stealth() if(!s_busy) diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 1b935a00de..1bda62e064 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -1,9 +1,7 @@ - /obj/item/clothing/shoes/space_ninja name = "ninja shoes" desc = "A pair of running shoes. Excellent for running and even better for smashing skulls." icon_state = "s-ninja" - item_state = "secshoes" permeability_coefficient = 0.01 clothing_flags = NOSLIP resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF @@ -13,3 +11,12 @@ min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT heat_protection = FEET max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT + +/obj/item/clothing/shoes/space_ninja/equipped(mob/user, slot) + . = ..() + if(slot == SLOT_SHOES) + ADD_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]") + +/obj/item/clothing/shoes/space_ninja/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]") diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index b98ef764c0..ac1ef3b96a 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -149,12 +149,11 @@ Contents: /obj/item/clothing/suit/space/space_ninja/examine(mob/user) ..() - if(s_initialized) - if(user == affecting) - to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].") - to_chat(user, "The CLOAK-tech device is [stealth?"active":"inactive"].") - to_chat(user, "There are [s_bombs] smoke bomb\s remaining.") - to_chat(user, "There are [a_boost] adrenaline booster\s remaining.") + if(s_initialized && user == affecting) + to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].\n\ + The CLOAK-tech device is [stealth?"active":"inactive"].\n\ + There are [s_bombs] smoke bomb\s remaining.\n\ + There are [a_boost] adrenaline booster\s remaining.") /obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action) if(istype(action, /datum/action/item_action/initialize_ninja_suit)) diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index 4b159557bc..3d80282fe7 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -48,7 +48,7 @@ /obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U) to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].") s_initialized = TRUE - ntick() + START_PROCESSING(SSprocessing, src) s_busy = FALSE @@ -91,4 +91,5 @@ unlock_suit() U.regenerate_icons() s_initialized = FALSE + STOP_PROCESSING(SSprocessing, src) s_busy = FALSE diff --git a/code/modules/ninja/suit/suit_process.dm b/code/modules/ninja/suit/suit_process.dm index 4a89a59f75..850fb837b4 100644 --- a/code/modules/ninja/suit/suit_process.dm +++ b/code/modules/ninja/suit/suit_process.dm @@ -1,20 +1,17 @@ -/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting) - //Runs in the background while the suit is initialized. - //Requires charge or stealth to process. - spawn while(s_initialized) - if(!affecting) - terminate()//Kills the suit and attached objects. +/obj/item/clothing/suit/space/space_ninja/process() + if(!affecting || !s_initialized) + return PROCESS_KILL - else if(cell.charge > 0) - if(s_coold) - s_coold--//Checks for ability s_cooldown first. + if(cell.charge > 0) + if(s_coold) + s_coold--//Checks for ability s_cooldown first. - cell.charge -= s_cost//s_cost is the default energy cost each ntick, usually 5. - if(stealth)//If stealth is active. - cell.charge -= s_acost + cell.charge -= s_cost//s_cost is the default energy cost each tick, usually 5. + if(stealth)//If stealth is active. + cell.charge -= s_acost + affecting.alpha = max(affecting.alpha - 10, 10) - else - cell.charge = 0 + else + cell.charge = 0 + if(stealth) cancel_stealth() - - sleep(10)//Checks every second. diff --git a/code/modules/oracle_ui/README.md b/code/modules/oracle_ui/README.md new file mode 100644 index 0000000000..bc96eb1f51 --- /dev/null +++ b/code/modules/oracle_ui/README.md @@ -0,0 +1,233 @@ +# `/datum/oracle_ui` + +This datum is a replacement for tgui which does not use any Node.js dependencies, and works entirely through raw HTML, JS and CSS. It's designed to be reasonably easy to port something from tgui to oracle_ui. + +### How to create a UI + +For this example, we're going to port the disposals bin from tgui to oracle_ui. + +#### Step 1 + +In order to create a UI, you will first need to create an instance of `/datum/oracle_ui` or one of its subclasses, in this case `/datum/oracle_ui/themed/nano`. + +You need to pass in `src`, the width of the window, the height of the window, and the template to render from. You can optionally set some flags to disallow window resizing and whether to automatically refresh the UI. + +`code/modules/recycling/disposal-unit.dm` +```dm +/obj/machinery/disposal/bin/Initialize(mapload, obj/structure/disposalconstruct/make_from) + . = ..() + ui = new /datum/oracle_ui/themed/nano(src, 330, 190, "disposal_bin") + ui.auto_refresh = TRUE + ui.can_resize = FALSE +``` + +#### Step 2 + +You will now need to make a template in `html/oracle_ui/content/{template_name}`. + +Values defined as `@{value}` will get replaced at runtime by oracle_ui. + +`html/oracle_ui/content/disposal_bin/index.html` +```html +
+
+```
+
+#### Step 3
+
+Now you need to implement the methods that provide data to oracle_ui. `oui_data` can be adapted from the `ui_data` proc that tgui uses.
+
+The `act` proc generates a hyperlink that will result in `oui_act` getting called on your object when clicked. The `class` argument defines a css class to be added to the hyperlink, and disabled determines whether the hyperlink will be disabled or not.
+
+Calling `soft_update_fields` will result in the UI being updated on all clients, which is useful when the object changes state.
+
+`code/modules/recycling/disposal-unit.dm`
+```dm
+/obj/machinery/disposal/bin/oui_data(mob/user)
+ var/list/data = list()
+ data["flush"] = flush ? ui.act("Disengage", user, "handle-0", class="active") : ui.act("Engage", user, "handle-1")
+ data["full_pressure"] = full_pressure ? "Ready" : (pressure_charging ? "Pressurizing" : "Off")
+ data["pressure_charging"] = pressure_charging ? ui.act("Turn Off", user, "pump-0", class="active", disabled=full_pressure) : ui.act("Turn On", user, "pump-1", disabled=full_pressure)
+ var/per = full_pressure ? 100 : Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 99)
+ data["per"] = "[round(per, 1)]%"
+ data["contents"] = ui.act("Eject Contents", user, "eject", disabled=contents.len < 1)
+ data["isai"] = isAI(user)
+ return data
+/obj/machinery/disposal/bin/oui_act(mob/user, action, list/params)
+ if(..())
+ return
+ switch(action)
+ if("handle-0")
+ flush = FALSE
+ update_icon()
+ . = TRUE
+ if("handle-1")
+ if(!panel_open)
+ flush = TRUE
+ update_icon()
+ . = TRUE
+ if("pump-0")
+ if(pressure_charging)
+ pressure_charging = FALSE
+ update_icon()
+ . = TRUE
+ if("pump-1")
+ if(!pressure_charging)
+ pressure_charging = TRUE
+ update_icon()
+ . = TRUE
+ if("eject")
+ eject()
+ . = TRUE
+ ui.soft_update_fields()
+```
+
+#### Step 4
+
+You now need to hook in and ensure oracle_ui is invoked upon clicking. `render` should be used to open the UI for a user, typically on click.
+
+`code/modules/recycling/disposal-unit.dm`
+```dm
+/obj/machinery/disposal/bin/ui_interact(mob/user, state)
+ if(stat & BROKEN)
+ return
+ if(user.loc == src)
+ to_chat(user, "You cannot reach the controls from inside!")
+ return
+ ui.render(user)
+```
+
+#### Done
+
+
+
+You should have a functional UI at this point. Some additional odds and ends can be discovered throughout `code/modules/recycling/disposal-unit.dm`. For a full diff of the changes made to it, refer to [the original pull request on GitHub](https://github.com/OracleStation/OracleStation/pull/702/files#diff-4b6c20ec7d37222630e7524d9577e230).
+
+### API Reference
+
+#### `/datum/oracle_ui`
+
+The main datum which handles the UI.
+
+##### `get_content(mob/target)`
+Returns the HTML that should be displayed for a specified target mob. Calls `oui_getcontent` on the datasource to get the return value. *This proc is not used in the themed subclass.*
+
+##### `can_view(mob/target)`
+Returns whether the specified target mob can view the UI. Calls `oui_canview` on the datasource to get the return value.
+
+##### `test_viewer(mob/target, updating)`
+Tests whether the client is valid and can view the UI. If updating is TRUE, checks to see if they still have the UI window open.
+
+##### `render(mob/target, updating = FALSE)`
+Opens the UI for a target mob, sending HTML. If updating is TRUE, will only do it to clients which still have the window open.
+
+##### `render_all()`
+Does the above, but for all viewers and with updating set to TRUE.
+
+##### `close(mob/target)`
+Closes the UI for the specified target mob.
+
+##### `close_all()`
+Does the above, but for all viewers.
+
+##### `check_view(mob/target)`
+Checks if the specified target mob can view the UI, and if they can't closes their UI
+
+##### `check_view_all()`
+Does the above, but for all viewers.
+
+##### `call_js(mob/target, js_func, list/parameters = list())`
+Invokes `js_func` in the UI of the specified target mob with the specified parameters.
+
+##### `call_js_all(js_func, list/parameters = list()))`
+Does the above, but for all viewers.
+
+##### `steal_focus(mob/target)`
+Causes the UI to steal focus for the specified target mob.
+
+##### `steal_focus_all()`
+Does the above, but for all viewers.
+
+##### `flash(mob/target, times = -1)`
+Causes the UI to flash for the specified target mob the specified number of times, the default keeps the element flashing until focused.
+
+##### `flash_all()`
+Does the above, but for all viewers.
+
+##### `href(mob/user, action, list/parameters = list())`
+Generates a href for the specified user which will invoke `oui_act` on the datasource with the specified action and parameters.
+
+#### `/datum/oracle_ui/themed`
+
+A subclass which supports templating and theming.
+
+##### `get_file(path)`
+Loads a file from disk and returns the contents. Caches files loaded from disk for you.
+
+##### `get_content_file(filename)`
+Loads a file from the current content folder and returns the contents.
+
+##### `get_themed_file(filename)`
+Loads a file from the current theme folder and returns the contents.
+
+##### `process_template(template, variables)`
+Processes a template and populates it with the provided variables.
+
+##### `get_inner_content(mob/target)`
+Returns the templated content to be inserted into the main template for the specified target mob.
+
+##### `soft_update_fields()`
+For all viewers, updates the fields in the template via the `updateFields` javaScript function.
+
+##### `soft_update_all()`
+For all viewers, updates the content body in the template via the `replaceContent` javaScript function.
+
+##### `change_page(var/newpage)`
+Changes the template to use to draw the page and forces an update to all viewers
+
+##### `act(label, mob/user, action, list/parameters = list(), class = "", disabled = FALSE`
+Returns a fully formatted hyperlink for the specified user. `label` will be the hyperlink label, `action` and `parameters` are what will be passed to `oui_act`, `class` is any CSS classes to apply to the hyperlink and `disabled` will disable the hyperlink.
+
+#### `/datum`
+
+Functions built into all objects to support oracle_ui. There are default implementations for most major superclasses.
+
+##### `oui_canview(mob/user)`
+Returns whether the specified user view the UI at this time.
+
+##### `oui_getcontent(mob/user)`
+Returns the raw HTML to be sent to the specified user. *This proc is not used in the themed subclass of oracle_ui.*
+
+##### `oui_data(mob/user)`
+Returns templating data for the specified user. *This proc is only used in the themed subclass of oracle_ui.*
+
+##### `oui_data_debug(mob/user)`
+Returns the above, but JSON-encoded and escaped, for copy pasting into the web IDE. *This proc is only used for debugging purposes.*
+
+##### `oui_act(mob/user, action, list/params)`
+Called when a hyperlink is clicked in the UI.
diff --git a/code/modules/oracle_ui/assets.dm b/code/modules/oracle_ui/assets.dm
new file mode 100644
index 0000000000..5d26d80a81
--- /dev/null
+++ b/code/modules/oracle_ui/assets.dm
@@ -0,0 +1,8 @@
+/datum/asset/simple/oui_theme_nano
+ assets = list(
+ // JavaScript
+ "sui-nano-common.js" = 'html/oracle_ui/themes/nano/sui-nano-common.js',
+ "sui-nano-jquery.min.js" = 'html/oracle_ui/themes/nano/sui-nano-jquery.min.js',
+ // Stylesheets
+ "sui-nano-common.css" = 'html/oracle_ui/themes/nano/sui-nano-common.css',
+ )
diff --git a/code/modules/oracle_ui/hookup_procs.dm b/code/modules/oracle_ui/hookup_procs.dm
new file mode 100644
index 0000000000..e6038744c1
--- /dev/null
+++ b/code/modules/oracle_ui/hookup_procs.dm
@@ -0,0 +1,44 @@
+/datum/proc/oui_canview(mob/user)
+ return TRUE
+
+/datum/proc/oui_getcontent(mob/user)
+ return "Default Implementation"
+
+/datum/proc/oui_canuse(mob/user)
+ if(isobserver(user) && !user.has_unlimited_silicon_privilege)
+ return FALSE
+ return oui_canview(user)
+
+/datum/proc/oui_data(mob/user)
+ return list()
+
+/datum/proc/oui_data_debug(mob/user)
+ return html_encode(json_encode(oui_data(user)))
+
+/datum/proc/oui_act(mob/user, action, list/params)
+ // No Implementation
+
+/atom/oui_canview(mob/user)
+ if(isobserver(user))
+ return TRUE
+ if(user.incapacitated())
+ return FALSE
+ if(isturf(src.loc) && Adjacent(user))
+ return TRUE
+ return FALSE
+
+/obj/item/oui_canview(mob/user)
+ if(src.loc == user)
+ return src in user.held_items
+ return ..()
+
+/obj/machinery/oui_canview(mob/user)
+ if(user.has_unlimited_silicon_privilege)
+ return TRUE
+ if(!can_interact())
+ return FALSE
+ if(iscyborg(user))
+ return can_see(user, src, 7)
+ if(isAI(user))
+ return GLOB.cameranet.checkTurfVis(get_turf_pixel(src))
+ return ..()
diff --git a/code/modules/oracle_ui/oracle_ui.dm b/code/modules/oracle_ui/oracle_ui.dm
new file mode 100644
index 0000000000..5e8d6b9c7b
--- /dev/null
+++ b/code/modules/oracle_ui/oracle_ui.dm
@@ -0,0 +1,134 @@
+/datum/oracle_ui
+ var/width = 512
+ var/height = 512
+ var/can_close = TRUE
+ var/can_minimize = FALSE
+ var/can_resize = TRUE
+ var/titlebar = TRUE
+ var/window_id = null
+ var/viewers[0]
+ var/auto_check_view = TRUE
+ var/auto_refresh = FALSE
+ var/atom/datasource = null
+ var/datum/asset/assets = null
+
+/datum/oracle_ui/New(atom/n_datasource, n_width = 512, n_height = 512, n_assets = null)
+ datasource = n_datasource
+ window_id = REF(src)
+ width = n_width
+ height = n_height
+
+/datum/oracle_ui/Destroy()
+ close_all()
+ if(src.datum_flags & DF_ISPROCESSING)
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/datum/oracle_ui/process()
+ if(auto_check_view)
+ check_view_all()
+ if(auto_refresh)
+ render_all()
+
+/datum/oracle_ui/proc/get_content(mob/target)
+ return call(datasource, "oui_getcontent")(target)
+
+/datum/oracle_ui/proc/can_view(mob/target)
+ return call(datasource, "oui_canview")(target)
+
+/datum/oracle_ui/proc/test_viewer(mob/target, updating)
+ //If the target is null or does not have a client, remove from viewers and return
+ if(!target | !target.client | !can_view(target))
+ viewers -= target
+ if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING))
+ STOP_PROCESSING(SSobj, src) //No more viewers, stop polling
+ close(target)
+ return FALSE
+ //If this is an update, and they have closed the window, remove from viewers and return
+ if(updating && winget(target, window_id, "is-visible") != "true")
+ viewers -= target
+ if(viewers.len < 1 && (src.datum_flags & DF_ISPROCESSING))
+ STOP_PROCESSING(SSobj, src) //No more viewers, stop polling
+ return FALSE
+ return TRUE
+
+/datum/oracle_ui/proc/render(mob/target, updating = FALSE)
+ set waitfor = FALSE //Makes this an async call
+ if(!can_view(target))
+ return
+ //Check to see if they have the window open still if updating
+ if(updating && !test_viewer(target, updating))
+ return
+ //Send assets
+ if(!updating && assets)
+ assets.send(target)
+ //Add them to the viewers if they aren't there already
+ viewers |= target
+ if(!(src.datum_flags & DF_ISPROCESSING) && (auto_refresh | auto_check_view))
+ START_PROCESSING(SSobj, src) //Start processing to poll for viewability
+ //Send the content
+ if(updating)
+ target << output(get_content(target), "[window_id].browser")
+ else
+ target << browse(get_content(target), "window=[window_id];size=[width]x[height];can_close=[can_close];can_minimize=[can_minimize];can_resize=[can_resize];titlebar=[titlebar];focus=false;")
+ steal_focus(target)
+
+/datum/oracle_ui/proc/render_all()
+ for(var/viewer in viewers)
+ render(viewer, TRUE)
+
+/datum/oracle_ui/proc/close(mob/target)
+ if(target && target.client)
+ target << browse(null, "window=[window_id]")
+
+/datum/oracle_ui/proc/close_all()
+ for(var/viewer in viewers)
+ close(viewer)
+ viewers = list()
+
+/datum/oracle_ui/proc/check_view_all()
+ for(var/viewer in viewers)
+ check_view(viewer)
+
+/datum/oracle_ui/proc/check_view(mob/target)
+ set waitfor = FALSE //Makes this an async call
+ if(!test_viewer(target, TRUE))
+ close(target)
+
+/datum/oracle_ui/proc/call_js(mob/target, js_func, list/parameters = list())
+ set waitfor = FALSE //Makes this an async call
+ if(!test_viewer(target, TRUE))
+ return
+ target << output(list2params(parameters),"[window_id].browser:[js_func]")
+
+/datum/oracle_ui/proc/call_js_all(js_func, list/parameters = list())
+ for(var/viewer in viewers)
+ call_js(viewer, js_func, parameters)
+
+/datum/oracle_ui/proc/steal_focus(mob/target)
+ set waitfor = FALSE //Makes this an async call
+ winset(target, "[window_id]","focus=true")
+
+/datum/oracle_ui/proc/steal_focus_all()
+ for(var/viewer in viewers)
+ steal_focus(viewer)
+
+/datum/oracle_ui/proc/flash(mob/target, times = -1)
+ set waitfor = FALSE //Makes this an async call
+ winset(target, "[window_id]","flash=[times]")
+
+/datum/oracle_ui/proc/flash_all(times = -1)
+ for(var/viewer in viewers)
+ flash(viewer, times)
+
+/datum/oracle_ui/proc/href(mob/user, action, list/parameters = list())
+ var/params_string = replacetext(list2params(parameters),"&",";")
+ return "?src=[REF(src)];sui_action=[action];sui_user=[REF(user)];[params_string]"
+
+/datum/oracle_ui/Topic(href, parameters)
+ var/action = parameters["sui_action"]
+ var/mob/current_user = locate(parameters["sui_user"])
+ if(!call(datasource, "oui_canuse")(current_user))
+ return
+ if(datasource)
+ call(datasource, "oui_act")(current_user, action, parameters);
diff --git a/code/modules/oracle_ui/themed.dm b/code/modules/oracle_ui/themed.dm
new file mode 100644
index 0000000000..56b82c2647
--- /dev/null
+++ b/code/modules/oracle_ui/themed.dm
@@ -0,0 +1,82 @@
+/datum/oracle_ui/themed
+ var/theme = ""
+ var/content_root = ""
+ var/current_page = "index.html"
+ var/root_template = ""
+
+/datum/oracle_ui/themed/New(atom/n_datasource, n_width = 512, n_height = 512, n_content_root = "")
+ root_template = get_themed_file("index.html")
+ content_root = n_content_root
+ return ..(n_datasource, n_width, n_height, get_asset_datum(/datum/asset/simple/oui_theme_nano))
+
+/datum/oracle_ui/themed/process()
+ if(auto_check_view)
+ check_view_all()
+ if(auto_refresh)
+ soft_update_fields()
+
+GLOBAL_LIST_EMPTY(oui_template_variables)
+GLOBAL_LIST_EMPTY(oui_file_cache)
+
+/datum/oracle_ui/themed/proc/get_file(path)
+ if(GLOB.oui_file_cache[path])
+ return GLOB.oui_file_cache[path]
+ else if(fexists(path))
+ var/data = file2text(path)
+ GLOB.oui_file_cache[path] = data
+ return data
+ else
+ var/errormsg = "MISSING PATH '[path]'"
+#ifndef UNIT_TESTS
+ log_world(errormsg) //Because Travis absolutely hates these procs
+#endif
+ return errormsg
+
+/datum/oracle_ui/themed/proc/get_content_file(filename)
+ return get_file("./html/oracle_ui/content/[content_root]/[filename]")
+
+/datum/oracle_ui/themed/proc/get_themed_file(filename)
+ return get_file("./html/oracle_ui/themes/[theme]/[filename]")
+
+/datum/oracle_ui/themed/proc/process_template(template, variables)
+ var/regex/pattern = regex("\\@\\{(\\w+)\\}","gi")
+ GLOB.oui_template_variables = variables
+ var/replaced = pattern.Replace(template, /proc/oui_process_template_replace)
+ GLOB.oui_template_variables = null
+ return replaced
+
+/proc/oui_process_template_replace(match, group1)
+ var/value = GLOB.oui_template_variables[group1]
+ return "[value]"
+
+/datum/oracle_ui/themed/proc/get_inner_content(mob/target)
+ var/list/data = call(datasource, "oui_data")(target)
+ return process_template(get_content_file(current_page), data)
+
+/datum/oracle_ui/themed/get_content(mob/target)
+ var/list/template_data = list("title" = datasource.name, "body" = get_inner_content(target))
+ return process_template(root_template, template_data)
+
+/datum/oracle_ui/themed/proc/soft_update_fields()
+ for(var/viewer in viewers)
+ var/json = json_encode(call(datasource, "oui_data")(viewer))
+ call_js(viewer, "updateFields", list(json))
+
+/datum/oracle_ui/themed/proc/soft_update_all()
+ for(var/viewer in viewers)
+ call_js(viewer, "replaceContent", list(get_inner_content(viewer)))
+
+/datum/oracle_ui/themed/proc/change_page(newpage)
+ if(newpage == current_page)
+ return
+ current_page = newpage
+ render_all()
+
+/datum/oracle_ui/themed/proc/act(label, mob/user, action, list/parameters = list(), class = "", disabled = FALSE)
+ if(disabled)
+ return "[label]"
+ else
+ return "[label]"
+
+/datum/oracle_ui/themed/nano
+ theme = "nano"
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 907fccdc5b..ccbcf34d8c 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -67,6 +67,9 @@
/obj/structure/filingcabinet/ui_interact(mob/user)
. = ..()
+ if(isobserver(user))
+ return
+
if(contents.len <= 0)
to_chat(user, "[src] is empty.")
return
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 37877ffb09..059a42bb36 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -31,6 +31,7 @@
var/spam_flag = 0
var/contact_poison // Reagent ID to transfer on contact
var/contact_poison_volume = 0
+ var/datum/oracle_ui/ui = null
/obj/item/paper/pickup(user)
@@ -40,16 +41,40 @@
if(!istype(G) || G.transfer_prints)
H.reagents.add_reagent(contact_poison,contact_poison_volume)
contact_poison = null
+ ui.check_view_all()
..()
+/obj/item/paper/dropped(mob/user)
+ ui.check_view(user)
+ return ..()
+
/obj/item/paper/Initialize()
. = ..()
pixel_y = rand(-8, 8)
pixel_x = rand(-9, 9)
+ ui = new /datum/oracle_ui(src, 420, 600, get_asset_datum(/datum/asset/spritesheet/simple/paper))
+ ui.can_resize = FALSE
update_icon()
updateinfolinks()
+/obj/item/paper/oui_getcontent(mob/target)
+ if(!target.is_literate())
+ return "@{full_pressure}
+
+
+
+
+
+ @{per}
+ @{flush}
+ @{contents}
+ @{pressure_charging}
+ [stamps]" + else if(istype(target.get_active_held_item(), /obj/item/pen) | istype(target.get_active_held_item(), /obj/item/toy/crayon)) + return " [stamps]" + else + return " [stamps]" + +/obj/item/paper/oui_canview(mob/target) + if(check_rights_for(target.client, R_FUN)) //Allows admins to view faxes + return TRUE + if(isAI(target)) + var/mob/living/silicon/ai/ai = target + return get_dist(src, ai.current) < 2 + if(iscyborg(target)) + return get_dist(src, target) < 2 + return ..() /obj/item/paper/update_icon() @@ -65,20 +90,13 @@ /obj/item/paper/examine(mob/user) ..() to_chat(user, "Alt-click to fold it.") - - var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/simple/paper) - assets.send(user) - - if(in_range(user, src) || isobserver(user)) - if(user.is_literate()) - user << browse(" [stamps]", "window=[name]") - onclose(user, "[name]") - else - user << browse(" [stamps]", "window=[name]") - onclose(user, "[name]") + if(oui_canview(user)) + ui.render(user) else to_chat(user, "You're too far away to read it!") +/obj/item/paper/proc/show_content(mob/user) + user.examinate(src) /obj/item/paper/verb/rename() set name = "Rename paper" @@ -98,7 +116,7 @@ if((loc == usr && usr.stat == CONSCIOUS)) name = "paper[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) - + ui.render_all() /obj/item/paper/suicide_act(mob/user) user.visible_message("[user] scratches a grid on [user.p_their()] wrist with the paper! It looks like [user.p_theyre()] trying to commit sudoku...") @@ -108,7 +126,7 @@ spam_flag = FALSE /obj/item/paper/attack_self(mob/user) - user.examinate(src) + show_content(user) if(rigged && (SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) if(!spam_flag) spam_flag = TRUE @@ -123,11 +141,9 @@ else //cyborg or AI not seeing through a camera dist = get_dist(src, user) if(dist < 2) - usr << browse(" [stamps]", "window=[name]") - onclose(usr, "[name]") + show_content(user) else - usr << browse(" [stamps]", "window=[name]") - onclose(usr, "[name]") + to_chat(user, "You can't quite see it.") /obj/item/paper/proc/addtofield(id, text, links = 0) @@ -173,6 +189,7 @@ for(var/i in 1 to min(fields, 15)) addtofield(i, "write", 1) info_links = info_links + "write" + ui.render_all() /obj/item/paper/proc/clearpaper() @@ -274,7 +291,7 @@ else info += t // Oh, he wants to edit to the end of the file, let him. updateinfolinks() - usr << browse(" [stamps]", "window=[name]") // Update the window + show_content(usr) update_icon() @@ -289,7 +306,7 @@ if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) if(user.is_literate()) - user << browse(" [stamps]", "window=[name]") + show_content(user) return else to_chat(user, "You don't know how to read or write.") @@ -312,6 +329,7 @@ add_overlay(stampoverlay) to_chat(user, "You stamp the paper with your rubber stamp.") + ui.render_all() if(P.is_hot()) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10)) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index a5900aa196..5bcb7a60df 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -164,7 +164,7 @@ /obj/item/pen/sleepy/Initialize() . = ..() create_reagents(45, OPENCONTAINER) - reagents.add_reagent("chloralhydratedelayed", 20) + reagents.add_reagent("chloralhydrate", 20) reagents.add_reagent("mutetoxin", 15) reagents.add_reagent("tirizene", 10) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7c377ffa22..5fc29cb813 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -267,7 +267,7 @@ to_chat(user, "There is an integration cog installed!") to_chat(user, "Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface.") - + if(issilicon(user)) to_chat(user, "Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].") @@ -747,7 +747,7 @@ if(damage_flag == "melee" && damage_amount < damage_deflection) return 0 . = ..() - + /obj/machinery/power/apc/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) if(!(stat & BROKEN)) @@ -759,21 +759,23 @@ update_icon() /obj/machinery/power/apc/emag_act(mob/user) - if(!(obj_flags & EMAGGED) && !malfhack) - if(opened) - to_chat(user, "You must close the cover to swipe an ID card!") - else if(panel_open) - to_chat(user, "You must close the panel first!") - else if(stat & (BROKEN|MAINT)) - to_chat(user, "Nothing happens!") - else - flick("apc-spark", src) - playsound(src, "sparks", 75, 1) - obj_flags |= EMAGGED - locked = FALSE - to_chat(user, "You emag the APC interface.") - update_icon() - + . = ..() + if(obj_flags & EMAGGED || malfhack) + return + if(opened) + to_chat(user, "You must close the cover to swipe an ID card!") + else if(panel_open) + to_chat(user, "You must close the panel first!") + else if(stat & (BROKEN|MAINT)) + to_chat(user, "Nothing happens!") + else + flick("apc-spark", src) + playsound(src, "sparks", 75, 1) + obj_flags |= EMAGGED + locked = FALSE + to_chat(user, "You emag the APC interface.") + update_icon() + return TRUE // attack with hand - remove cell (if cover open) or interact with the APC @@ -800,8 +802,6 @@ if(!ui) ui = new(user, src, ui_key, "apc", name, 535, 515, master_ui, state) ui.open() - if(ui) - ui.set_autoupdate(state = (failure_timer ? 1 : 0)) /obj/machinery/power/apc/ui_data(mob/user) var/list/data = list( diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 3e93d9f42b..1759f31344 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -191,7 +191,7 @@ /obj/item/stock_parts/cell/secborg name = "security borg rechargeable D battery" - maxcharge = 1750 //35/17/8 disabler/laser/taser shots. + maxcharge = 1250 //25/12/6 disabler/laser/taser shots. materials = list(MAT_GLASS=40) /obj/item/stock_parts/cell/secborg/empty/Initialize() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index f82f0ee8e6..8d99cbb485 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -323,6 +323,8 @@ var/BR = brightness var/PO = bulb_power var/CO = bulb_colour + if(color) + CO = color var/area/A = get_area(src) if (A && A.fire) CO = bulb_emergency_colour @@ -360,6 +362,9 @@ else removeStaticPower(static_power_used, STATIC_LIGHT) +/obj/machinery/light/update_atom_colour() + . = ..() + update() /obj/machinery/light/process() if (!cell) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 7a6e313cd0..7375a3e17a 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -194,10 +194,12 @@ return ..() /obj/machinery/power/port_gen/pacman/emag_act(mob/user) + . = ..() if(obj_flags & EMAGGED) return obj_flags |= EMAGGED emp_act(EMP_HEAVY) + return TRUE /obj/machinery/power/port_gen/pacman/attack_ai(mob/user) interact(user) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 4159d9898a..974b210648 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -19,6 +19,7 @@ circuit = /obj/item/circuitboard/machine/rad_collector var/obj/item/tank/internals/plasma/loaded_tank = null var/stored_power = 0 + var/last_push var/active = 0 var/locked = FALSE var/drainratio = 1 @@ -61,9 +62,9 @@ loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2 GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases) - var/bitcoins_mined = RAD_COLLECTOR_OUTPUT - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE) - stored_power-=bitcoins_mined + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE) + last_push = stored_power + stored_power = 0 /obj/machinery/power/rad_collector/interact(mob/user) if(anchored) @@ -170,9 +171,9 @@ . = ..() if(active) if(!bitcoinmining) - to_chat(user, "[src]'s display states that it has stored [DisplayPower(stored_power)], and processing [DisplayPower(RAD_COLLECTOR_OUTPUT)].") + to_chat(user, "[src]'s display states that it has stored [DisplayPower(stored_power)], and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute. The plasma within it's tank is being irradiated into tritium.") else - to_chat(user, "[src]'s display states that it has stored a total of [stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE], and producing [RAD_COLLECTOR_OUTPUT*RAD_COLLECTOR_MINING_CONVERSION_RATE] research points per minute.") + to_chat(user, "[src]'s display states that it's producing a total of [(last_push*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute. The tritium and oxygen within it's tank is being combusted into carbon dioxide.") else if(!bitcoinmining) to_chat(user,"[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\"") diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d805713fa6..4d6ede69d1 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -339,12 +339,13 @@ projectile_sound = initial(projectile_sound) /obj/machinery/power/emitter/emag_act(mob/user) + . = ..() if(obj_flags & EMAGGED) return locked = FALSE obj_flags |= EMAGGED - if(user) - user.visible_message("[user.name] emags [src].","You short out the lock.") + user?.visible_message("[user.name] emags [src].","You short out the lock.") + return TRUE /obj/machinery/power/emitter/prototype diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index bc05e784a4..35710f8d61 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -84,16 +84,18 @@ /obj/singularity/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user + log_game("[key_name(C)] has been disintegrated by attempting to telekenetically grab a singularity.") C.visible_message("[C]'s head begins to collapse in on itself!", "Your head feels like it's collapsing in on itself! This was really not a good idea!", "You hear something crack and explode in gore.") var/turf/T = get_turf(C) for(var/i in 1 to 3) C.apply_damage(30, BRUTE, BODY_ZONE_HEAD) new /obj/effect/gibspawner/generic(T) sleep(1) - C.ghostize() var/obj/item/bodypart/head/rip_u = C.get_bodypart(BODY_ZONE_HEAD) rip_u.dismember(BURN) //nice try jedi qdel(rip_u) + return + return ..() /obj/singularity/ex_act(severity, target) switch(severity) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 026c39c6cf..8d2162a0ff 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -5,12 +5,21 @@ #define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty. #define OXYGEN_HEAT_PENALTY 1 #define CO2_HEAT_PENALTY 0.1 -#define NITROGEN_HEAT_MODIFIER -1.5 +#define PLUOXIUM_HEAT_PENALTY -1 +#define TRITIUM_HEAT_PENALTY 10 +#define NITROGEN_HEAT_PENALTY -1.5 +#define BZ_HEAT_PENALTY 5 #define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation. #define PLASMA_TRANSMIT_MODIFIER 4 +#define BZ_TRANSMIT_MODIFIER -2 + +#define TRITIUM_RADIOACTIVITY_MODIFIER 3 //Higher == Crystal spews out more radiation +#define BZ_RADIOACTIVITY_MODIFIER 5 +#define PLUOXIUM_RADIOACTIVITY_MODIFIER -2 #define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage. +#define PLUOXIUM_HEAT_RESISTANCE 3 #define POWERLOSS_INHIBITION_GAS_THRESHOLD 0.20 //Higher == Higher percentage of inhibitor gas needed before the charge inertia chain reaction effect starts. #define POWERLOSS_INHIBITION_MOLE_THRESHOLD 20 //Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. //Scales powerloss inhibition down until this amount of moles is reached @@ -53,6 +62,7 @@ #define SUPERMATTER_EMERGENCY_PERCENT 25 #define SUPERMATTER_DANGER_PERCENT 50 #define SUPERMATTER_WARNING_PERCENT 100 +#define CRITICAL_TEMPERATURE 10000 #define SUPERMATTER_COUNTDOWN_TIME 30 SECONDS @@ -102,6 +112,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/o2comp = 0 var/co2comp = 0 var/n2ocomp = 0 + var/pluoxiumcomp = 0 + var/tritiumcomp = 0 + var/bzcomp = 0 + + var/pluoxiumbonus = 0 var/combined_gas = 0 var/gasmix_power_ratio = 0 @@ -184,8 +199,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) to_chat(H, "You get headaches just from looking at it.") return -#define CRITICAL_TEMPERATURE 10000 - /obj/machinery/power/supermatter_crystal/proc/get_status() var/turf/T = get_turf(src) if(!T) @@ -316,6 +329,12 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(power) soundloop.volume = min(40, (round(power/100)/50)+1) // 5 +1 volume per 20 power. 2500 power is max + if(isclosedturf(T)) + var/turf/did_it_melt = T.Melt() + if(!isclosedturf(did_it_melt)) //In case some joker finds way to place these on indestructible walls + visible_message("[src] melts through [T]!") + return + //Ok, get the air from the turf var/datum/gas_mixture/env = T.return_air() @@ -354,16 +373,24 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) plasmacomp = max(removed.gases[/datum/gas/plasma]/combined_gas, 0) o2comp = max(removed.gases[/datum/gas/oxygen]/combined_gas, 0) co2comp = max(removed.gases[/datum/gas/carbon_dioxide]/combined_gas, 0) + pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium]/combined_gas, 0) + tritiumcomp = max(removed.gases[/datum/gas/tritium]/combined_gas, 0) + bzcomp = max(removed.gases[/datum/gas/bz]/combined_gas, 0) n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide]/combined_gas, 0) n2comp = max(removed.gases[/datum/gas/nitrogen]/combined_gas, 0) - gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp - n2comp, 0), 1) + if(pluoxiumcomp >= 0.15) + pluoxiumbonus = 1 //makes pluoxium only work at 15%+ + else + pluoxiumbonus = 0 - dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY)+(o2comp * OXYGEN_HEAT_PENALTY)+(co2comp * CO2_HEAT_PENALTY)+(n2comp * NITROGEN_HEAT_MODIFIER), 0.5) - dynamic_heat_resistance = max(n2ocomp * N2O_HEAT_RESISTANCE, 1) + gasmix_power_ratio = min(max(plasmacomp + o2comp + co2comp + tritiumcomp + bzcomp - pluoxiumcomp - n2comp, 0), 1) - power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER), 0) + dynamic_heat_modifier = max((plasmacomp * PLASMA_HEAT_PENALTY) + (o2comp * OXYGEN_HEAT_PENALTY) + (co2comp * CO2_HEAT_PENALTY) + (tritiumcomp * TRITIUM_HEAT_PENALTY) + ((pluoxiumcomp * PLUOXIUM_HEAT_PENALTY) * pluoxiumbonus) + (n2comp * NITROGEN_HEAT_PENALTY) + (bzcomp * BZ_HEAT_PENALTY), 0.5) + dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1) + + power_transmission_bonus = max((plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER), 0) //more moles of gases are harder to heat than fewer, so let's scale heat damage around them mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) @@ -392,7 +419,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload if(prob(50)) - radiation_pulse(src, power * (1 + power_transmission_bonus/10)) + radiation_pulse(src, power * (1 + (tritiumcomp * TRITIUM_RADIOACTIVITY_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_RADIOACTIVITY_MODIFIER) * pluoxiumbonus) * (power_transmission_bonus/(10-(bzcomp * BZ_RADIOACTIVITY_MODIFIER))))) // Rad Modifiers BZ(500%), Tritium(300%), and Pluoxium(-200%) + if(bzcomp >= 0.4 && prob(30 * bzcomp)) + fire_nuclear_particle() // Start to emit radballs at a maximum of 30% chance per tick var/device_energy = power * REACTION_POWER_MODIFIER @@ -527,11 +556,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user + log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a supermatter crystal.") to_chat(C, "That was a really dense idea.") - C.ghostize() + C.visible_message("A bright flare of radiation is seen from [C]'s head, shortly before you hear a sickening sizzling!") var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs rip_u.Remove(C) qdel(rip_u) + return + return ..() /obj/machinery/power/supermatter_crystal/attack_paw(mob/user) dust_mob(user, cause = "monkey attack") diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index bbad3e08b0..9a5486dfe2 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -132,11 +132,14 @@ /obj/singularity/energy_ball/attack_tk(mob/user) if(iscarbon(user)) var/mob/living/carbon/C = user + log_game("[key_name(C)] has been disintegrated by a telekenetic grab on a tesla ball.") to_chat(C, "That was a shockingly dumb idea.") + C.visible_message("A bright flare of lightning is seen from [C]'s head, shortly before you hear a sickening sizzling!") var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs - C.ghostize(0) + rip_u.Remove(C) qdel(rip_u) - C.death() + return + return ..() /obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target) if (istype(target)) diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 089c79effd..0940144721 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -59,6 +59,9 @@ /obj/item/ammo_casing/energy/laser/redtag/hitscan projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan +/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy + projectile_type = /obj/item/projectile/beam/lasertag/redtag/hitscan/holy + /obj/item/ammo_casing/energy/xray projectile_type = /obj/item/projectile/beam/xray e_cost = 50 diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index c9e60ddc1d..36d6e16496 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -25,3 +25,6 @@ fire_sound = 'sound/weapons/taser2.ogg' harmful = FALSE click_cooldown_override = 3.5 + +/obj/item/ammo_casing/energy/disabler/secborg + e_cost = 50 \ No newline at end of file diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index f6356dce99..12006440d2 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -127,15 +127,14 @@ /obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params) if(magazine && istype(A, /obj/item/ammo_casing)) - if(user.temporarilyRemoveItemFromInventory(A)) - if(!chambered) - to_chat(user, "You load a new [A] into \the [src].") - playsound(src, "gun_insert_full_magazine", 70, 1) - chamber_round() - update_icon() - return TRUE - else - to_chat(user, "You cannot seem to get \the [A] out of your hands!") + if(chambered) + to_chat(user, "[src] already has a [magazine_wording] chambered.") + return + if(magazine.attackby(A, user, silent = TRUE)) + to_chat(user, "You load a new [A] into \the [src].") + playsound(src, "gun_insert_full_magazine", 70, 1) + chamber_round() + update_icon() /obj/item/gun/ballistic/rocketlauncher/update_icon() icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f455e0f138..a5fb8a85aa 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -277,12 +277,12 @@ ..() if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing)) chamber_round() + if(A.tool_behaviour == TOOL_SAW || istype(A, /obj/item/gun/energy/plasmacutter)) + sawoff(user) if(istype(A, /obj/item/melee/transforming/energy)) var/obj/item/melee/transforming/energy/W = A if(W.active) sawoff(user) - if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter)) - sawoff(user) /obj/item/gun/ballistic/revolver/doublebarrel/attack_self(mob/living/user) var/num_unloaded = 0 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 856dfed78b..47ccb6076f 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -40,7 +40,7 @@ if(istype(user) && user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes pumping shotguns impossible in stamina softcrit to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto return//CIT CHANGE - ditto - pump(user) + pump(user, TRUE) recentpump = world.time + 10 if(istype(user))//CIT CHANGE - makes pumping shotguns cost a lil bit of stamina. user.adjustStaminaLossBuffered(2) //CIT CHANGE - DITTO. make this scale inversely to the strength stat when stats/skills are added @@ -52,7 +52,9 @@ process_fire(user, user, FALSE) . = 1 -/obj/item/gun/ballistic/shotgun/proc/pump(mob/M) +/obj/item/gun/ballistic/shotgun/proc/pump(mob/M, visible = TRUE) + if(visible) + M.visible_message("[M] racks [src].", "You rack [src].") playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1) pump_unload(M) pump_reload(M) @@ -93,7 +95,7 @@ /obj/item/gun/ballistic/shotgun/riot/attackby(obj/item/A, mob/user, params) ..() - if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter)) + if(A.tool_behaviour == TOOL_SAW || istype(A, /obj/item/gun/energy/plasmacutter)) sawoff(user) if(istype(A, /obj/item/melee/transforming/energy)) var/obj/item/melee/transforming/energy/W = A @@ -205,6 +207,7 @@ name = "combat shotgun" desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." icon_state = "cshotgun" + fire_delay = 3 mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE unique_reskin = list("Tatical" = "cshotgun", diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 54cb9fe5d0..de738c9047 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -118,11 +118,11 @@ switch(fail_tick) if(0 to 200) fail_tick += (2*(fail_chance)) - M.rad_act(40) + M.rad_act(400) to_chat(M, "Your [name] feels warmer.") if(201 to INFINITY) SSobj.processing.Remove(src) - M.rad_act(80) + M.rad_act(800) crit_fail = 1 to_chat(M, "Your [name]'s reactor overloads!") diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index cd0dd53d48..bb97f9cf99 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -159,3 +159,65 @@ /obj/item/gun/energy/laser/redtag/hitscan ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan) + +/obj/item/gun/energy/laser/redtag/hitscan/chaplain + name = "\improper holy lasrifle" + desc = "A lasrifle from the old Imperium. This one seems to be blessed by techpriests." + icon_state = "LaserAK" + item_state = null + force = 14 + pin = /obj/item/firing_pin/holy + icon = 'modular_citadel/icons/obj/guns/VGguns.dmi' + ammo_x_offset = 4 + ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag/hitscan/holy) + lefthand_file = 'modular_citadel/icons/mob/citadel/guns_lefthand.dmi' + righthand_file = 'modular_citadel/icons/mob/citadel/guns_righthand.dmi' + var/chaplain_spawnable = TRUE + total_mass = TOTAL_MASS_MEDIEVAL_WEAPON + throw_speed = 3 + throw_range = 4 + throwforce = 10 + obj_flags = UNIQUE_RENAME + +/obj/item/gun/energy/laser/redtag/hitscan/chaplain/Initialize() + . = ..() + AddComponent(/datum/component/anti_magic, TRUE, TRUE) + +/obj/item/gun/energy/laser/redtag/hitscan/chaplain/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) + if(!ishuman(user) || !ishuman(target)) + return + + if(semicd) + return + + if(user == target) + target.visible_message("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger...", \ + "You stick [src] in your mouth, ready to pull the trigger...") + else + target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \ + "[user] points [src] at your head, ready to pull the trigger...") + + semicd = TRUE + + if(!bypass_timer && (!do_mob(user, target, 120) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) + if(user) + if(user == target) + user.visible_message("[user] decided not to shoot.") + else if(target && target.Adjacent(user)) + target.visible_message("[user] has decided to spare [target]", "[user] has decided to spare your life!") + semicd = FALSE + return + + semicd = FALSE + + target.visible_message("[user] pulls the trigger!", "[user] pulls the trigger!") + + playsound('sound/weapons/dink.ogg', 30, 1) + + if((iscultist(target)) || (is_servant_of_ratvar(target))) + chambered.BB.damage *= 1500 + + else if(chambered && chambered.BB) + chambered.BB.damage *= 5 + + process_fire(target, user, TRUE, params) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 3733dad9a3..c5d4c36813 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -20,7 +20,7 @@ name = "hybrid taser" desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams." icon_state = "advtaser" - ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode) ammo_x_offset = 2 /obj/item/gun/energy/e_gun/advtaser/cyborg @@ -49,6 +49,7 @@ name = "cyborg disabler" desc = "An integrated disabler that draws from a cyborg's power cell. This one contains a limiter to prevent the cyborg's power cell from overheating." can_charge = FALSE + ammo_type = list(/obj/item/ammo_casing/energy/disabler/secborg) selfcharge = EGUN_SELFCHARGE_BORG cell_type = /obj/item/stock_parts/cell/secborg charge_delay = 5 diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 26e66b1987..342ceecbc2 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -122,3 +122,32 @@ else to_chat(user, "You can't put the [A] into \the [src]!") return FALSE + +/obj/item/gun/syringe/dart/rapiddart + name = "Repeating dart gun" + icon_state = "rapiddartgun" + item_state = "rapiddartgun" + +/obj/item/gun/syringe/dart/rapiddart/CheckParts(list/parts_list) + var/obj/item/reagent_containers/glass/beaker/B = locate(/obj/item/reagent_containers/glass/beaker) in parts_list + + if(istype(B, /obj/item/reagent_containers/glass/beaker/large)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 2 + return + else if(istype(B, /obj/item/reagent_containers/glass/beaker/plastic)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 3 + return + else if(istype(B, /obj/item/reagent_containers/glass/beaker/meta)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 4 + return + else if(istype(B, /obj/item/reagent_containers/glass/beaker/bluespace)) + desc = "[initial(desc)] A modification of the dart gun's pressure chamber has been perfomed using a [B], extending it's holding size to [max_syringes]." + max_syringes = 6 + return + else + max_syringes = 1 + desc = "[initial(desc)] It has a [B] strapped to it, but it doesn't seem to be doing anything." + ..() diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 05d6367306..9103340790 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -37,10 +37,12 @@ to_chat(user, "This firearm already has a firing pin installed.") /obj/item/firing_pin/emag_act(mob/user) + . = ..() if(obj_flags & EMAGGED) return obj_flags |= EMAGGED to_chat(user, "You override the authentication mechanism.") + return TRUE /obj/item/firing_pin/proc/gun_insert(mob/living/user, obj/item/gun/G) gun = G @@ -186,6 +188,15 @@ desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it." selfdestruct = TRUE +/obj/item/firing_pin/holy + name = "blessed pin" + desc = "A firing pin that only responds to those who are holier than thou." + +/obj/item/firing_pin/holy/pin_auth(mob/living/user) + if(user.mind.isholy) + return TRUE + return FALSE + // Laser tag pins /obj/item/firing_pin/tag name = "laser tag firing pin" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index efae090707..dace31c2f7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -88,6 +88,8 @@ //Effects var/stun = 0 var/knockdown = 0 + var/knockdown_stamoverride + var/knockdown_stam_max var/unconscious = 0 var/irradiate = 0 var/stutter = 0 @@ -202,7 +204,7 @@ else L.log_message("has been shot by [firer] with [src]", LOG_ATTACK, color="orange") - return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter) + return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter, knockdown_stamoverride, knockdown_stam_max) /obj/item/projectile/proc/vol_by_damage() if(src.damage) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index cbd0348743..e43eb5a3bc 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -151,6 +151,11 @@ /obj/item/projectile/beam/lasertag/redtag/hitscan hitscan = TRUE +/obj/item/projectile/beam/lasertag/redtag/hitscan/holy + name = "lasrifle beam" + damage = 0.1 + damage_type = BURN + /obj/item/projectile/beam/lasertag/bluetag icon_state = "bluelaser" suit_types = list(/obj/item/clothing/suit/redtag) diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index f9aa47c6a3..4a1c954b1b 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -5,7 +5,7 @@ /obj/item/projectile/bullet/shotgun_beanbag name = "beanbag slug" damage = 5 - stamina = 80 + stamina = 70 /obj/item/projectile/bullet/incendiary/shotgun name = "incendiary slug" @@ -61,12 +61,12 @@ /obj/item/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" - damage = 12.5 + damage = 10 /obj/item/projectile/bullet/pellet/shotgun_rubbershot name = "rubbershot pellet" - damage = 3 - stamina = 25 + damage = 2 + stamina = 15 /obj/item/projectile/bullet/pellet/Range() ..() diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index 1753587ad3..e08f806fe5 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -3,10 +3,9 @@ name = "nuclear particle" icon_state = "nuclear_particle" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 20 - damage_type = TOX - irradiate = 2500 //enough to knockdown and induce vomiting - speed = 0.4 + flag = "rad" + irradiate = 5000 + speed = 0.4 hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray var/static/list/particle_colors = list( @@ -25,22 +24,6 @@ add_atom_colour(particle_colors[our_color], FIXED_COLOUR_PRIORITY) set_light(4, 3, particle_colors[our_color]) //Range of 4, brightness of 3 - Same range as a flashlight -/atom/proc/fire_nuclear_particles(power_ratio) //used by fusion to fire random # of nuclear particles - power ratio determines about how many are fired - var/random_particles = rand(3,6) - var/particles_to_fire - var/particles_fired - switch(power_ratio) //multiply random_particles * factor for whatever tier - if(0 to FUSION_MID_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_LOW - if(FUSION_MID_TIER_THRESHOLD to FUSION_HIGH_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_MID - if(FUSION_HIGH_TIER_THRESHOLD to FUSION_SUPER_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_HIGH - if(FUSION_SUPER_TIER_THRESHOLD to INFINITY) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_SUPER - while(particles_to_fire) - particles_fired++ - var/angle = rand(0,360) - var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) - addtimer(CALLBACK(P, /obj/item/projectile.proc/fire, angle), particles_fired) //multiply particles fired * delay so the particles end up stagnated (once every decisecond) - particles_to_fire-- \ No newline at end of file +/atom/proc/fire_nuclear_particle(angle = rand(0,360)) //used by fusion to fire random nuclear particles. Fires one particle in a random direction. + var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) + P.fire(angle) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 895a165f49..d7c8b8b082 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -3,7 +3,9 @@ icon_state = "spark" color = "#FFFF00" nodamage = 1 - knockdown = 100 + knockdown = 60 + knockdown_stamoverride = 36 + knockdown_stam_max = 50 stutter = 5 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' @@ -11,6 +13,7 @@ tracer_type = /obj/effect/projectile/tracer/stun muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun + var/tase_duration = 50 /obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) . = ..() @@ -23,6 +26,7 @@ if(C.dna && C.dna.check_mutation(HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + C.apply_status_effect(STATUS_EFFECT_TASED, tase_duration) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm index d717bed39e..ac4488cae0 100644 --- a/code/modules/projectiles/projectile/special/mindflayer.dm +++ b/code/modules/projectiles/projectile/special/mindflayer.dm @@ -5,5 +5,5 @@ . = ..() if(ishuman(target)) var/mob/living/carbon/human/M = target - M.adjustBrainLoss(20) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) M.hallucination += 30 diff --git a/code/modules/reagents/chem_wiki_render.dm b/code/modules/reagents/chem_wiki_render.dm new file mode 100644 index 0000000000..efb6bdecfd --- /dev/null +++ b/code/modules/reagents/chem_wiki_render.dm @@ -0,0 +1,387 @@ +//Generates a markdown txt file for use with the wiki + +/proc/find_reagent(input) + . = FALSE + if(GLOB.chemical_reagents_list[input]) //prefer IDs! + var/datum/reagent/R = GLOB.chemical_reagents_list[input] + return R + else + for(var/X in GLOB.chemical_reagents_list) + var/datum/reagent/R = GLOB.chemical_reagents_list[X] + if(input == replacetext(lowertext(R.name), " ", "")) + return R + if(input == replacetext(lowertext(R.id), " ", "")) + return R + + + + +/client/proc/generate_wikichem_list() + set name = "Generate Wikichems" + set category = "Debug" + set desc = "Generate a huge loglist of all the chems. Do not click unless you want lag." + + + + var/prefix = "|Name | Reagents | Reaction vars | Description | Chem properties |\n|---|---|---|-----------|---|\n" + var/input_reagent = replacetext(lowertext(input("Input the name/id of a reagent to get it's description on it's own, or leave blank to parse every chem.", "Input") as text), " ", "") //95% of the time, the reagent id is a lowercase/no spaces version of the name + if(input_reagent) + var/input_reagent2 = find_reagent(input_reagent) + if(!input_reagent2) + to_chat(usr, "Unable to find reagent, stopping proc.") + var/single_parse = generate_chemwiki_line(input_reagent2, input_reagent, FALSE) + text2file(single_parse, "[GLOB.log_directory]/chem_parse.md") + to_chat(usr, "[single_parse].") + + single_parse = generate_chemwiki_line(input_reagent2, input_reagent, FALSE) + text2file(single_parse, "[GLOB.log_directory]/chem_parse.md") + to_chat(usr, "[single_parse].") + to_chat(usr, "Saved line to (wherever your root folder is, i.e. where the DME is)/[GLOB.log_directory]/chem_parse.md OR use the Get Current Logs verb under the Admin tab. (if you click Open, and it does nothing, that's because you've not set a .md default program! Try downloading it instead, and use that file to set a default program! Also have a cute day.)") + //Do things here + return + to_chat(usr, "Generating big list") + message_admins("Someone pressed the lag button. (Generate Wikichems)") + ///datum/reagent/medicine, /datum/reagent/toxin, /datum/reagent/consumable, /datum/reagent/plantnutriment, /datum/reagent/uranium, + ///datum/reagent/colorful_reagent, /datum/reagent/mutationtoxin, /datum/reagent/fermi, /datum/reagent/drug, /datum/reagent/impure + + //Probably not the most eligant of solutions. + to_chat(usr, "Attempting reagent scan. Length of list [LAZYLEN(GLOB.chemical_reagents_list)*2]") + var/datum/reagent/R + var/tally = 0 + var/processCR = TRUE //Process reactions first + var/medicine = "" + var/toxin = "" + var/consumable = "" + var/plant = "" + var/uranium = "" + var/colours = "" + var/muta = "" + var/fermi = "" + var/remainder = "" + var/drug = "" + var/basic = "" + var/upgraded = "" + var/drinks = "" + var/alco = "" + var/grinded = "" + var/blob = "" + var/impure = "" + + //Chem_dispencer + var/list/dispensable_reagents = list( + "hydrogen", + "lithium", + "carbon", + "nitrogen", + "oxygen", + "fluorine", + "sodium", + "aluminium", + "silicon", + "phosphorus", + "sulfur", + "chlorine", + "potassium", + "iron", + "copper", + "mercury", + "radium", + "water", + "ethanol", + "sugar", + "sacid", + "welding_fuel", + "silver", + "iodine", + "bromine", + "stable_plasma" + ) + var/list/components = list( + "oil", + "ammonia", + "ash", + "acetone", + "phenol", + "diethylamine", + "saltpetre", + "sodiumchloride", + "lye" + ) + + var/list/grind = list( + "bluespace", + "gold", + "plasma", + "uranium" + ) + + //Bartender + var/dispence_drinks = list( + "water", + "ice", + "coffee", + "cream", + "tea", + "icetea", + "cola", + "spacemountainwind", + "dr_gibb", + "space_up", + "tonic", + "sodawater", + "lemon_lime", + "pwr_game", + "shamblers", + "sugar", + "orangejuice", + "grenadine", + "limejuice", + "tomatojuice", + "lemonjuice", + "menthol" + ) + var/dispence_alco = list( + "beer", + "kahlua", + "whiskey", + "wine", + "vodka", + "gin", + "rum", + "tequila", + "vermouth", + "cognac", + "ale", + "absinthe", + "hcider", + "creme_de_menthe", + "creme_de_cacao", + "triple_sec", + "sake", + "applejack" + ) + + var/breakout = FALSE + for(var/i = 1, i <= 2, i+=1) + for(var/X in GLOB.chemical_reagents_list) + R = GLOB.chemical_reagents_list[X] + if(!R.description) //No description? It's not worth my time. + continue + + for(var/Y in dispensable_reagents) //Why do you have to do this + if(R.id == Y) + basic += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in components) + if(R.id == Y) + upgraded += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in dispence_drinks) + if(R.id == Y) + drinks += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in dispence_alco) + if(R.id == Y) + alco += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + for(var/Y in grind) + if(R.id == Y) + grinded += generate_chemwiki_line(R, X, processCR) + breakout = TRUE + continue + + if(breakout) + breakout = FALSE + continue + + if(istype(R, /datum/reagent/medicine)) + medicine += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/toxin)) + toxin += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/consumable)) + consumable += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/plantnutriment)) + plant += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/uranium)) + uranium += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/colorful_reagent)) + colours += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/mutationtoxin)) + muta += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/fermi)) + fermi += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/drug)) + drug += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/blob)) + blob += generate_chemwiki_line(R, X, processCR) + + else if(istype(R, /datum/reagent/impure)) + impure += generate_chemwiki_line(R, X, processCR) + + else + remainder += generate_chemwiki_line(R, X, processCR) + + tally++ + if((tally%50)==0) + to_chat(usr, "[tally] of [LAZYLEN(GLOB.chemical_reagents_list)*2] done.") + + processCR = FALSE + + to_chat(usr, "finished chems") + + var/wholeString = ("\n# DISPENCEABLE REAGENTS\n\n[prefix][basic]\n\n# COMPONENT REAGENTS\n\n[prefix][upgraded]\n\n# GROUND REAGENTS\n\n[prefix][grinded]\n") + wholeString += ("\n# MEDICINE:\n\n[prefix][medicine]\n\n# TOXIN:\n\n[prefix][toxin]\n\n# DRUGS\n\n[prefix][drug]\n\n# FERMI\n\nThese chems lie on the cutting edge of chemical technology, and as such are not recommended for beginners!\n\n[prefix][fermi]\n\n# IMPURE REAGENTS\n\n[prefix][impure]\n\n# GENERAL REAGENTS\n\n[prefix][remainder]\n\n# DISPENCEABLE SOFT DRINKS\n\n[prefix][drinks]\n\n# DISPENCEABLE HARD DRINKS\n\n[prefix][alco]\n\n# CONSUMABLE\n\n[prefix][consumable]\n\n# PLANTS\n\n[prefix][plant]\n\n# URANIUM\n\n[prefix][uranium]\n\n# COLOURS\n\n[prefix][colours]\n\n# RACE MUTATIONS\n\n[prefix][muta]\n\n\n# BLOB REAGENTS\n\n[prefix][blob]\n") + + prefix = "|Name | Reagents | Reaction vars | Description |\n|---|---|---|----------|\n" + var/CRparse = "" + to_chat(usr, "starting reactions") + + //generate the reactions that we missed from before + for(var/reagent in GLOB.chemical_reactions_list) + for(var/datum/chemical_reaction/CR in GLOB.chemical_reactions_list[reagent]) + CRparse += generate_chemreactwiki_line(CR) + + wholeString += ("\n# CHEMICAL REACTIONS\n\n[prefix][CRparse]\n") + text2file(wholeString, "[GLOB.log_directory]/chem_parse.md") + to_chat(usr, "finished reactions") + to_chat(usr, "Saved file to (wherever your root folder is, i.e. where the DME is)/[GLOB.log_directory]/chem_parse.md OR use the Get Current Logs verb under the Admin tab. (if you click Open, and it does nothing, that's because you've not set a .md default program! Try downloading it instead, and use that file to set a default program! Also have a cute day.)") + + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +//Generate the big list of reagent based reactions. +/proc/generate_chemwiki_line(datum/reagent/R, X, processCR) + //name | Reagent pH | reagents | reaction temp | explosion temp | pH range | Kinetics | description | OD level | Addiction level | Metabolism rate | impure chem | inverse chem + + var/datum/chemical_reaction/CR = get_chemical_reaction(R.id) + if((!CR && processCR) || (CR && !processCR)) // Do reactions first. + return "" + + + var/outstring = "| !\[[R.color]\](https://placehold.it/15/[copytext(R.color, 2, 8)]/000000?text=+)[R.name]pH: [R.pH] | " + var/datum/reagent/R3 + if(CR) + outstring += "
Is Fleshy:" dat += "[selected.is_wet ? "Yes" : "No"]" + if(selected.is_wet) + dat += " Internal loop for prey?:" + dat += "[selected.wet_loop ? "Yes" : "No"]" //Digest Mode Button dat += " Belly Mode:" @@ -241,21 +244,19 @@ dat += " " switch(user.digestable) if(TRUE) - dat += "Toggle Digestable (Currently: ON)" + dat += " Toggle Digestable (Currently: ON)" if(FALSE) - dat += "Toggle Digestable (Currently: OFF)" - + dat += " Toggle Digestable (Currently: OFF)" switch(user.devourable) if(TRUE) - dat += " Toggle Devourable (Currently: ON)" + dat += " Toggle Devourable (Currently: ON)" if(FALSE) - dat += " Toggle Devourable (Currently: OFF)" - + dat += " Toggle Devourable (Currently: OFF)" switch(user.feeding) if(TRUE) - dat += " Toggle Feeding (Currently: ON)" + dat += " Toggle Feeding (Currently: ON)" if(FALSE) - dat += " Toggle Feeding (Currently: OFF)" + dat += " Toggle Feeding (Currently: OFF)" //Returns the dat html to the vore_look return dat @@ -266,12 +267,12 @@ if(href_list["close"]) qdel(src) // Cleanup - user.openpanel = 0 + user.openpanel = FALSE return if(href_list["show_int"]) show_interacts = !show_interacts - return 1 //Force update + return TRUE //Force update if(href_list["int_help"]) alert("These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ @@ -279,13 +280,13 @@ These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest/absorb) \ will affect all prey in that belly, if one resists and triggers digestion/absorption. If multiple trigger at the same time, \ only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.","Interactions Help") - return 0 //Force update + return FALSE //Force update if(href_list["outsidepick"]) var/atom/movable/tgt = locate(href_list["outsidepick"]) var/obj/belly/OB = locate(href_list["outsidebelly"]) if(!(tgt in OB)) //Aren't here anymore, need to update menu. - return 1 + return TRUE var/intent = "Examine" if(istype(tgt,/mob/living)) @@ -298,7 +299,7 @@ if("Help Out") //Help the inside-mob out if(user.stat || user.absorbed || M.absorbed) to_chat(user,"You can't do that in your state!") - return 1 + return TRUE to_chat(user,"You begin to push [M] to freedom!") to_chat(M,"[usr] begins to push you to freedom!") @@ -317,11 +318,11 @@ if("Devour") //Eat the inside mob if(user.absorbed || user.stat) to_chat(user,"You can't do that in your state!") - return 1 + return TRUE if(!user.vore_selected) to_chat(user,"Pick a belly on yourself first!") - return 1 + return TRUE var/obj/belly/TB = user.vore_selected to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") @@ -339,7 +340,7 @@ var/obj/item/T = tgt if(!(tgt in OB)) //Doesn't exist anymore, update. - return 1 + return TRUE intent = alert("What do you want to do to that?","Query","Examine","Use Hand") switch(intent) if("Examine") @@ -348,7 +349,7 @@ if("Use Hand") if(user.stat) to_chat(user,"You can't do that in your state!") - return 1 + return TRUE user.ClickOn(T) sleep(5) //Seems to exit too fast for the panel to update @@ -361,23 +362,23 @@ intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all") switch(intent) if("Cancel") - return 0 + return FALSE if("Eject all") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE selected.release_all_contents() if("Move all") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs if(!choice) - return 0 + return FALSE for(var/atom/movable/tgt in selected) to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!") @@ -385,7 +386,7 @@ var/atom/movable/tgt = locate(href_list["insidepick"]) if(!(tgt in selected)) //Old menu, needs updating because they aren't really there. - return 1 //Forces update + return TRUE //Forces update intent = "Examine" intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") switch(intent) @@ -395,25 +396,25 @@ if("Eject") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE selected.release_specific_contents(tgt) if("Move") if(user.stat) to_chat(user,"You can't do that in your state!") - return 0 + return FALSE var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs if(!choice || !(tgt in selected)) - return 0 + return FALSE to_chat(tgt,"You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]!") selected.transfer_contents(tgt, choice) if(href_list["newbelly"]) if(user.vore_organs.len >= BELLIES_MAX) - return 0 + return FALSE var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) @@ -430,7 +431,7 @@ if(failure_msg) //Something went wrong. alert(user,failure_msg,"Error!") - return 0 + return FALSE var/obj/belly/NB = new(user) NB.name = new_name @@ -459,19 +460,22 @@ if(failure_msg) //Something went wrong. alert(user,failure_msg,"Error!") - return 0 + return FALSE selected.name = new_name if(href_list["b_wetness"]) selected.is_wet = !selected.is_wet + if(href_list["b_wetloop"]) + selected.wet_loop = !selected.wet_loop + if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list if(!new_mode) - return 0 + return FALSE selected.digest_mode = new_mode if(href_list["b_desc"]) @@ -539,12 +543,12 @@ if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") - return 0 + return FALSE selected.vore_verb = new_verb if(href_list["b_release"]) - var/choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in GLOB.release_sounds + var/choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in GLOB.pred_release_sounds if(!choice) return @@ -552,12 +556,12 @@ selected.release_sound = choice if(href_list["b_releasesoundtest"]) - var/sound/releasetest = GLOB.release_sounds[selected.release_sound] + var/sound/releasetest = GLOB.prey_release_sounds[selected.release_sound] if(releasetest) SEND_SOUND(user, releasetest) if(href_list["b_sound"]) - var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.vore_sounds + var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.pred_vore_sounds if(!choice) return @@ -565,7 +569,7 @@ selected.vore_sound = choice if(href_list["b_soundtest"]) - var/sound/voretest = GLOB.vore_sounds[selected.vore_sound] + var/sound/voretest = GLOB.prey_vore_sounds[selected.vore_sound] if(voretest) SEND_SOUND(user, voretest) @@ -586,17 +590,17 @@ selected.bulge_size = (new_bulge/100) if(href_list["b_escapable"]) - if(selected.escapable == 0) //Possibly escapable and special interactions. - selected.escapable = 1 + if(selected.escapable == FALSE) //Possibly escapable and special interactions. + selected.escapable = TRUE to_chat(usr,"Prey now have special interactions with your [lowertext(selected.name)] depending on your settings.") - else if(selected.escapable == 1) //Never escapable. - selected.escapable = 0 + else if(selected.escapable == TRUE) //Never escapable. + selected.escapable = FALSE to_chat(usr,"Prey will not be able to have special interactions with your [lowertext(selected.name)].") - show_interacts = 0 //Force the hiding of the panel + show_interacts = FALSE //Force the hiding of the panel else alert("Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.","Error") //If they somehow have a varable that's not 0 or 1 - selected.escapable = 0 - show_interacts = 0 //Force the hiding of the panel + selected.escapable = FALSE + show_interacts = FALSE //Force the hiding of the panel if(href_list["b_escapechance"]) var/escape_chance_input = input(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance") as num|null @@ -617,7 +621,7 @@ var/obj/belly/choice = input("Where do you want your [lowertext(selected.name)] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected) if(!choice) //They cancelled, no changes - return 0 + return FALSE else if(choice == "None - Remove") selected.transferlocation = null else @@ -636,7 +640,7 @@ if(href_list["b_del"]) var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") if(!alert == "Delete") - return 0 + return FALSE var/failure_msg = "" @@ -657,7 +661,7 @@ if(failure_msg) alert(user,failure_msg,"Error!") - return 0 + return FALSE qdel(selected) selected = user.vore_organs[1] @@ -674,7 +678,7 @@ if(href_list["applyprefs"]) var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel") if(!alert == "Reload") - return 0 + return FALSE if(!user.apply_vore_prefs()) alert("ERROR: Vore preferences failed to apply!","Error") else @@ -683,19 +687,19 @@ if(href_list["setflavor"]) var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null) if(!new_flavor) - return 0 + return FALSE new_flavor = readd_quotes(new_flavor) if(length(new_flavor) > FLAVOR_MAX) alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") - return 0 + return FALSE user.vore_taste = new_flavor if(href_list["toggledg"]) var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") switch(choice) if("Cancel") - return 0 + return FALSE if("Allow Digestion") user.digestable = TRUE if("Prevent Digestion") @@ -708,7 +712,7 @@ var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") switch(choice) if("Cancel") - return 0 + return FALSE if("Allow Devourment") user.devourable = TRUE if("Prevent Devourment") @@ -721,7 +725,7 @@ var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") switch(choice) if("Cancel") - return 0 + return FALSE if("Allow Feeding") user.feeding = TRUE if("Prevent Feeding") @@ -731,4 +735,4 @@ user.client.prefs_vr.feeding = user.feeding //Refresh when interacted with, returning 1 makes vore_look.Topic update - return 1 \ No newline at end of file + return TRUE \ No newline at end of file diff --git a/modular_citadel/code/modules/vore/hook-defs_vr.dm b/code/modules/vore/hook-defs.dm similarity index 100% rename from modular_citadel/code/modules/vore/hook-defs_vr.dm rename to code/modules/vore/hook-defs.dm diff --git a/modular_citadel/code/modules/vore/persistence.dm b/code/modules/vore/persistence.dm similarity index 100% rename from modular_citadel/code/modules/vore/persistence.dm rename to code/modules/vore/persistence.dm diff --git a/modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm b/code/modules/vore/resizing/grav_pull_vr.dm similarity index 100% rename from modular_citadel/code/modules/vore/resizing/grav_pull_vr.dm rename to code/modules/vore/resizing/grav_pull_vr.dm diff --git a/modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm similarity index 100% rename from modular_citadel/code/modules/vore/resizing/holder_micro_vr.dm rename to code/modules/vore/resizing/holder_micro_vr.dm diff --git a/modular_citadel/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm similarity index 100% rename from modular_citadel/code/modules/vore/resizing/resize_vr.dm rename to code/modules/vore/resizing/resize_vr.dm diff --git a/modular_citadel/code/modules/vore/resizing/sizechemicals.dm b/code/modules/vore/resizing/sizechemicals.dm similarity index 98% rename from modular_citadel/code/modules/vore/resizing/sizechemicals.dm rename to code/modules/vore/resizing/sizechemicals.dm index 1164bf65d6..f83ba2ce76 100644 --- a/modular_citadel/code/modules/vore/resizing/sizechemicals.dm +++ b/code/modules/vore/resizing/sizechemicals.dm @@ -84,7 +84,7 @@ return /datum/reagent/medicine/sizeoxadone/overdose_process(mob/living/M) - M.adjustBrainLoss(1) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) M.adjustToxLoss(1) ..() . = 1 diff --git a/modular_citadel/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm similarity index 100% rename from modular_citadel/code/modules/vore/resizing/sizegun_vr.dm rename to code/modules/vore/resizing/sizegun_vr.dm diff --git a/modular_citadel/code/modules/vore/trycatch_vr.dm b/code/modules/vore/trycatch.dm similarity index 100% rename from modular_citadel/code/modules/vore/trycatch_vr.dm rename to code/modules/vore/trycatch.dm diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 9a2455f56d..0f6ef14cd1 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -13,6 +13,7 @@ hitsound = 'sound/hallucinations/growl1.ogg' force = 21 // Just enough to break airlocks with melee attacks damtype = "brute" + total_mass = TOTAL_MASS_HAND_REPLACEMENT /obj/item/zombie_hand/Initialize() . = ..() @@ -72,5 +73,5 @@ user.adjustFireLoss(-hp_gained, 0) user.adjustCloneLoss(-hp_gained, 0) user.updatehealth() - user.adjustBrainLoss(-hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" user.nutrition = min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL) diff --git a/config/admins.txt b/config/admins.txt index 27a2178e2c..1fdf480dd3 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -1,11 +1,11 @@ -############################################################################################### -# Basically, ckey goes first. Rank goes after the "=" # -# Case is not important for ckey. # -# Case IS important for the rank. # -# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. # -# Ranks can be anything defined in admin_ranks.txt # -# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # -# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # -############################################################################################### - -yourckeygoeshere = Host +############################################################################################### +# Basically, ckey goes first. Rank goes after the "=" # +# Case is not important for ckey. # +# Case IS important for the rank. # +# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. # +# Ranks can be anything defined in admin_ranks.txt # +# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # +# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # +############################################################################################### + +yourckeygoeshere = Host \ No newline at end of file diff --git a/config/config.txt b/config/config.txt index 3bc9f873a9..0501d1fd2f 100644 --- a/config/config.txt +++ b/config/config.txt @@ -4,6 +4,7 @@ $include game_options.txt $include dbconfig.txt $include comms.txt $include antag_rep.txt +$include donator_groupings.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: @@ -145,6 +146,9 @@ LOG_MANIFEST ## Enable logging pictures # LOG_PICTURES +## log virus and actions +LOG_VIRUS + ##Log camera pictures - Must have picture logging enabled PICTURE_LOGGING_CAMERA @@ -229,22 +233,22 @@ CHECK_RANDOMIZER # SERVER ss13.example.com:2506 ## forum address -# FORUMURL http://tgstation13.org/phpBB/index.php +# FORUMURL https://citadel-station.net/forum/ ## Wiki address -# WIKIURL http://www.tgstation13.org/wiki +# WIKIURL https://katlin.dog/citadel-wiki ## Rules address -# RULESURL http://www.tgstation13.org/wiki/Rules +# RULESURL https://katlin.dog/citadel-rules/main ## Github address -# GITHUBURL https://www.github.com/tgstation/tgstation +# GITHUBURL https://github.com/Citadel-Station-13/Citadel-Station-13 ## Round specific stats address ## Link to round specific parsed logs; IE statbus. It is appended with the RoundID automatically by ticker/Reboot() ## This will take priority over the game logs address during reboot. ## Example: https://atlantaned.space/statbus/round.php?round= -# ROUNDSTATSURL +# ROUNDSTATSURL http://citadel-station.net/slimbus/ ## Game Logs address ## Incase you don't have a fancy parsing system, but still want players to be able to find where you keep your server's logs. @@ -254,10 +258,10 @@ CHECK_RANDOMIZER ## Github repo id ##This can be found by going to https://api.github.com/users/
+
\ No newline at end of file
diff --git a/html/oracle_ui/editor_tool.html b/html/oracle_ui/editor_tool.html
new file mode 100644
index 0000000000..e0ce75bb29
--- /dev/null
+++ b/html/oracle_ui/editor_tool.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+ @{full_pressure}
+
+
+
+
+
+ @{per}
+ @{flush}
+ @{contents}
+ @{pressure_charging}
+
+
+ Content Template:+ +
+
+ Data:+ +
+
+
+
+
diff --git a/html/oracle_ui/themes/nano/index.html b/html/oracle_ui/themes/nano/index.html
new file mode 100644
index 0000000000..388f6e4ce4
--- /dev/null
+++ b/html/oracle_ui/themes/nano/index.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+ Output:+ +
+
+
+
diff --git a/html/oracle_ui/themes/nano/sui-nano-common.css b/html/oracle_ui/themes/nano/sui-nano-common.css
new file mode 100644
index 0000000000..481b81c3e3
--- /dev/null
+++ b/html/oracle_ui/themes/nano/sui-nano-common.css
@@ -0,0 +1,353 @@
+body
+{
+ padding: 0;
+ margin: 0;
+ background-color: #272727;
+ font-size: 12px;
+ color: #ffffff;
+ line-height: 170%;
+ cursor: default;
+ -moz-user-select: none;
+ -ms-user-select: none;
+}
+
+hr
+{
+ background-color: #40628a;
+ height: 1px;
+}
+
+a, a:link, a:visited, a:active, .linkOn, .linkOff
+{
+ color: #ffffff;
+ text-decoration: none;
+ background: #40628a;
+ border: 1px solid #161616;
+ padding: 1px 4px 1px 4px;
+ margin: 0 2px 0 0;
+ cursor:default;
+}
+
+a:hover
+{
+ color: #40628a;
+ background: #ffffff;
+}
+
+a.white, a.white:link, a.white:visited, a.white:active
+{
+ color: #40628a;
+ text-decoration: none;
+ background: #ffffff;
+ border: 1px solid #161616;
+ padding: 1px 4px 1px 4px;
+ margin: 0 2px 0 0;
+ cursor:default;
+}
+
+a.white:hover
+{
+ color: #ffffff;
+ background: #40628a;
+}
+
+.active, a.active:link, a.active:visited, a.active:active, a.active:hover
+{
+ color: #ffffff;
+ background: #2f943c;
+ border-color: #24722e;
+}
+
+.disabled, a.disabled:link, a.disabled:visited, a.disabled:active, a.disabled:hover
+{
+ color: #ffffff;
+ background: #999999;
+ border-color: #666666;
+}
+
+a.icon, .linkOn.icon, .linkOff.icon
+{
+ position: relative;
+ padding: 1px 4px 2px 20px;
+}
+
+a.icon img, .linkOn.icon img
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 18px;
+ height: 18px;
+}
+
+ul
+{
+ padding: 4px 0 0 10px;
+ margin: 0;
+ list-style-type: none;
+}
+
+li
+{
+ padding: 0 0 2px 0;
+}
+
+img, a img
+{
+ border-style:none;
+}
+
+h1, h2, h3, h4, h5, h6
+{
+ margin: 0;
+ padding: 16px 0 8px 0;
+ color: #517087;
+}
+
+h1
+{
+ font-size: 15px;
+}
+
+h2
+{
+ font-size: 14px;
+}
+
+h3
+{
+ font-size: 13px;
+}
+
+h4
+{
+ font-size: 12px;
+}
+
+.uiWrapper
+{
+
+ width: 100%;
+ height: 100%;
+}
+
+.uiTitle
+{
+ clear: both;
+ padding: 6px 8px 6px 8px;
+ border-bottom: 2px solid #161616;
+ background: #383838;
+ color: #98B0C3;
+ font-size: 16px;
+}
+
+.uiTitle.icon
+{
+ padding: 6px 8px 6px 42px;
+ background-position: 2px 50%;
+ background-repeat: no-repeat;
+}
+
+.uiContent
+{
+ clear: both;
+ padding: 8px;
+ font-family: Verdana, Geneva, sans-serif;
+}
+
+.good
+{
+ color: #00ff00;
+}
+
+.average
+{
+ color: #d09000;
+}
+
+.bad
+{
+ color: #ff0000;
+}
+
+.highlight
+{
+ color: #8BA5C4;
+}
+
+.dark
+{
+ color: #272727;
+}
+
+.notice
+{
+ position: relative;
+ background: #E9C183;
+ color: #15345A;
+ font-size: 10px;
+ font-style: italic;
+ padding: 2px 4px 0 4px;
+ margin: 4px;
+}
+
+.notice.icon
+{
+ padding: 2px 4px 0 20px;
+}
+
+.notice img
+{
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 16px;
+ height: 16px;
+}
+
+div.notice
+{
+ clear: both;
+}
+
+.statusDisplay
+{
+ background: #000000;
+ color: #ffffff;
+ border: 1px solid #40628a;
+ padding: 4px;
+ margin: 3px 0;
+}
+
+.statusLabel
+{
+ width: 138px;
+ float: left;
+ overflow: hidden;
+ color: #98B0C3;
+}
+
+.statusValue
+{
+ float: left;
+}
+
+.block
+{
+ padding: 8px;
+ margin: 10px 4px 4px 4px;
+ border: 1px solid #40628a;
+ background-color: #202020;
+}
+
+.block h3
+{
+ padding: 0;
+}
+
+.progressBar
+{
+ position: relative;
+ width: 185px;
+ height: 14px;
+ border: 1px solid #666666;
+ float: left;
+ overflow: hidden;
+ padding: 1px;
+}
+
+.progressLabel
+{
+ top: -2px;
+ height: 100%;
+ position: absolute;
+ right: 4px;
+ text-align: right;
+}
+
+.progressFill
+{
+ width: 100%;
+ height: 100%;
+ background: #40628a;
+ overflow: hidden;
+ transition: width 2.2s linear;
+}
+
+.progressFill.good
+{
+ color: #ffffff;
+ background: #00ff00;
+}
+
+.progressFill.average
+{
+ color: #ffffff;
+ background: #d09000;
+}
+
+.progressFill.bad
+{
+ color: #ffffff;
+ background: #ff0000;
+}
+
+.progressFill.highlight
+{
+ color: #ffffff;
+ background: #8BA5C4;
+}
+
+.clearBoth
+{
+ clear: both;
+}
+
+.clearLeft
+{
+ clear: left;
+}
+
+.clearRight
+{
+ clear: right;
+}
+
+.line
+{
+ width: 100%;
+ clear: both;
+}
+
+section .label, section .content
+{
+ display: table-cell;
+ margin: 0;
+ text-align: left;
+ vertical-align: middle;
+ padding: 3px 2px
+}
+
+section .label
+{
+ width: 1%;
+ padding-right: 32px;
+ white-space: nowrap;
+ color: #8ba5c4;
+}
+
+section
+{
+ display: table-row;
+ width: 100%
+}
+
+.display {
+ width: calc(100% - 8px);
+ padding: 4px;
+ background-color: #000;
+ background-color: rgba(0, 0, 0, .33);
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, .5);
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";
+ filter: progid: DXImageTransform.Microsoft.gradient(startColorStr=#54000000, endColorStr=#54000000);
+}
\ No newline at end of file
diff --git a/html/oracle_ui/themes/nano/sui-nano-common.js b/html/oracle_ui/themes/nano/sui-nano-common.js
new file mode 100644
index 0000000000..716891a53f
--- /dev/null
+++ b/html/oracle_ui/themes/nano/sui-nano-common.js
@@ -0,0 +1,47 @@
+function replaceContent(body) {
+ var maincontent = document.getElementById('maincontent');
+ if(maincontent) {
+ maincontent.innerHTML = body;
+ }
+}
+
+function updateProgressLabels() {
+ var progressBars = document.getElementsByClassName("progressBar");
+ for(var i = 0; i < progressBars.length; i++) {
+ var progressBar = progressBars[i];
+ if(!progressBar)
+ continue;
+ var progressFill = progressBar.getElementsByClassName("progressFill")[0];
+ if(!progressFill)
+ continue;
+ var width = parseInt(getComputedStyle(progressFill).width);
+ var maxWidth = parseInt(getComputedStyle(progressBar).width);
+ var progressLabel = progressBar.getElementsByClassName("progressLabel")[0];
+ if(progressLabel)
+ progressLabel.innerHTML = Math.round((width / maxWidth) * 100) + '%';
+ }
+}
+
+if(getComputedStyle) { setInterval(updateProgressLabels, 50); } //Fallback
+
+function updateFields(json) {
+ var fields = JSON.parse(json);
+ for (var key in fields) {
+ let value = fields[key];
+ var element = document.getElementById(key);
+ if(element == null) {
+ continue;
+ } else if(element.classList.contains('progressBar')) {
+ var progressFill = element.getElementsByClassName("progressFill")[0];
+ if(progressFill)
+ progressFill.style["width"] = value;
+ if(!getComputedStyle) { //Fallback
+ var progressLabel = element.getElementsByClassName("progressLabel")[0];
+ if(progressLabel)
+ progressLabel.innerHTML = value;
+ }
+ } else {
+ element.innerHTML = value;
+ }
+ }
+}
\ No newline at end of file
diff --git a/html/oracle_ui/themes/nano/sui-nano-jquery.min.js b/html/oracle_ui/themes/nano/sui-nano-jquery.min.js
new file mode 100644
index 0000000000..645c5adc18
--- /dev/null
+++ b/html/oracle_ui/themes/nano/sui-nano-jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;
+ if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length@{title}
+ @{body}
+
+ "," "]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"
").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m});
\ No newline at end of file
diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi
index fcd27698e7..8c42e6610c 100644
Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ
diff --git a/icons/mecha/neovgre.dmi b/icons/mecha/neovgre.dmi
new file mode 100644
index 0000000000..ba9d57daf9
Binary files /dev/null and b/icons/mecha/neovgre.dmi differ
diff --git a/icons/mob/accessories.dmi b/icons/mob/accessories.dmi
index 8e3e48230f..33964645ee 100644
Binary files a/icons/mob/accessories.dmi and b/icons/mob/accessories.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 65b5733ffe..4e23c102ce 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/aibots.dmi b/icons/mob/aibots.dmi
index f4049abc41..5f5987f2d3 100644
Binary files a/icons/mob/aibots.dmi and b/icons/mob/aibots.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 2a85f8a422..e9343c7ed2 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index e3c80708c3..26f81b70df 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index f5ffd262f0..6843bac6bf 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/custom_w.dmi b/icons/mob/custom_w.dmi
index d974d0ca6c..f29231c48d 100644
Binary files a/icons/mob/custom_w.dmi and b/icons/mob/custom_w.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 6cce82b5f7..b981a18f06 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index e7598f35c9..c57a7cc112 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 3ca7290a0f..842562b007 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 10474f94da..164fabe806 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index fc6fafb275..6bd504674f 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 7f10d992bc..8b894fea6b 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 2b39acd3d8..90d96492f2 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index ef6c9b3f06..c5e10b01df 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi
index 0e466486c5..3238b98757 100644
Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi
index 1c265a4137..a103c1a13f 100644
Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi
index 366493eebd..beac56725a 100644
Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi
index 81b075f706..da31cc9710 100644
Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_lefthand.dmi b/icons/mob/inhands/equipment/briefcase_lefthand.dmi
index 08bc3814b0..38aaa98254 100644
Binary files a/icons/mob/inhands/equipment/briefcase_lefthand.dmi and b/icons/mob/inhands/equipment/briefcase_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/briefcase_righthand.dmi b/icons/mob/inhands/equipment/briefcase_righthand.dmi
index 5cc42559cd..fbcea4580e 100644
Binary files a/icons/mob/inhands/equipment/briefcase_righthand.dmi and b/icons/mob/inhands/equipment/briefcase_righthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi
index 277a7d8f05..93cd988cff 100644
Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi
index 0103bd19b5..075b4c2033 100644
Binary files a/icons/mob/inhands/equipment/kitchen_righthand.dmi and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/tiles_lefthand.dmi b/icons/mob/inhands/misc/tiles_lefthand.dmi
new file mode 100644
index 0000000000..d7903fcd48
Binary files /dev/null and b/icons/mob/inhands/misc/tiles_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/tiles_righthand.dmi b/icons/mob/inhands/misc/tiles_righthand.dmi
new file mode 100644
index 0000000000..9295ac7344
Binary files /dev/null and b/icons/mob/inhands/misc/tiles_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_lefthand.dmi b/icons/mob/inhands/weapons/hammers_lefthand.dmi
index 0ea340f1f3..306fd0db8a 100644
Binary files a/icons/mob/inhands/weapons/hammers_lefthand.dmi and b/icons/mob/inhands/weapons/hammers_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/hammers_righthand.dmi b/icons/mob/inhands/weapons/hammers_righthand.dmi
index dbe34513ea..674e4d510b 100644
Binary files a/icons/mob/inhands/weapons/hammers_righthand.dmi and b/icons/mob/inhands/weapons/hammers_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi
index 5529edfa51..5e04b3daa3 100644
Binary files a/icons/mob/inhands/weapons/polearms_lefthand.dmi and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi
index e902dcdc3b..4b304cfc3e 100644
Binary files a/icons/mob/inhands/weapons/polearms_righthand.dmi and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_lefthand.dmi b/icons/mob/inhands/weapons/staves_lefthand.dmi
index ecc92c7d20..8b96b84236 100644
Binary files a/icons/mob/inhands/weapons/staves_lefthand.dmi and b/icons/mob/inhands/weapons/staves_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/staves_righthand.dmi b/icons/mob/inhands/weapons/staves_righthand.dmi
index 92e5b91323..202bab9e21 100644
Binary files a/icons/mob/inhands/weapons/staves_righthand.dmi and b/icons/mob/inhands/weapons/staves_righthand.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 5f0b665ff4..019ae09517 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index 19ebe0a4be..f8d1f22860 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi
index fe0146ccc4..10f29f51e4 100644
Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index c53fa85262..896a87ff3a 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 9ce97dfd6d..3cd7388378 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 835f3448b4..38ac61f318 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index fe0a8a5c62..072511b444 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index b2990a1509..105da7d865 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/advancedtools.dmi b/icons/obj/advancedtools.dmi
new file mode 100644
index 0000000000..974202dd58
Binary files /dev/null and b/icons/obj/advancedtools.dmi differ
diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi
index df9517aeaa..fa0c138d21 100644
Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ
diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi
index 3a5b9fd706..82b4c2e543 100644
Binary files a/icons/obj/bloodpack.dmi and b/icons/obj/bloodpack.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 3754ff052c..9e8fb64aba 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 93daa6149e..5b9e13ed52 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index 1b8eada39c..d3f055d1f2 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index c35956687d..eb019bc44b 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi
index d7bf32d7b1..da8ff0a20b 100644
Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 506cdffe8e..e329720cf7 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 2cdf97bd37..75a03a585c 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 8256c1fc07..c8a007041b 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index a0153b1596..4ec45666c4 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 8d7bd55426..e3a9f6d84e 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 568adb69b3..fb406fb65e 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 315086b4d7..50f9e0a207 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index c3374e9c1c..1307f063a8 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index 4165719a3c..3ab7f4b510 100644
Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index eb4f5813c8..92f7f50279 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 7822cdb8c2..e8b3d434f5 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index f64dfd4740..d3bdc1b1ea 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 92b5203f5d..75df4b5cc5 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi
index 1bf5b7ee96..a74acb4e29 100644
Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ
diff --git a/icons/obj/food/snowcones.dmi b/icons/obj/food/snowcones.dmi
index bdaa89fdf7..8a06cf4e82 100644
Binary files a/icons/obj/food/snowcones.dmi and b/icons/obj/food/snowcones.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 47d05e3470..0a4152af64 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 0ac8ccf566..6b2d9e5c06 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/halloween_items.dmi b/icons/obj/halloween_items.dmi
index c08ea71148..b4f11165dc 100644
Binary files a/icons/obj/halloween_items.dmi and b/icons/obj/halloween_items.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 82dce552a7..dd4d1e1f93 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
index 162c6b047e..e7dee2290d 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/growing_flowers.dmi b/icons/obj/hydroponics/growing_flowers.dmi
index 2752ad8dc5..245841a6b4 100644
Binary files a/icons/obj/hydroponics/growing_flowers.dmi and b/icons/obj/hydroponics/growing_flowers.dmi differ
diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi
index d309884be0..029d49e196 100644
Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index a1ab5b08e5..fa5728f3b4 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 5a2088c332..7caf346f91 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 8788567b36..6336669501 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 687fef6065..1e1033e38e 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index f28b8be5c5..20e0f5f73c 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/machines/harvester.dmi b/icons/obj/machines/harvester.dmi
index d6d9b01fc6..ce272c5774 100644
Binary files a/icons/obj/machines/harvester.dmi and b/icons/obj/machines/harvester.dmi differ
diff --git a/icons/obj/machines/sleeper.dmi b/icons/obj/machines/sleeper.dmi
index b027d0d7b1..ff9e2b197a 100644
Binary files a/icons/obj/machines/sleeper.dmi and b/icons/obj/machines/sleeper.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 6e05bf548b..a7593e4a55 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 647722b1de..87db0caa67 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index b6ca8c178c..685b14cee5 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi
index a575ab292f..e7875efa26 100644
Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_blue.dmi b/icons/obj/smooth_structures/fancy_table_blue.dmi
new file mode 100644
index 0000000000..07e13e99e6
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_blue.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_cyan.dmi b/icons/obj/smooth_structures/fancy_table_cyan.dmi
new file mode 100644
index 0000000000..4f1a90e33b
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_cyan.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_green.dmi b/icons/obj/smooth_structures/fancy_table_green.dmi
new file mode 100644
index 0000000000..ea7f8daa99
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_green.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_orange.dmi b/icons/obj/smooth_structures/fancy_table_orange.dmi
new file mode 100644
index 0000000000..fe0375ddbb
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_orange.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_purple.dmi b/icons/obj/smooth_structures/fancy_table_purple.dmi
new file mode 100644
index 0000000000..c404a9eb5f
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_purple.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_red.dmi b/icons/obj/smooth_structures/fancy_table_red.dmi
new file mode 100644
index 0000000000..8bca0ca8c9
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_red.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_royalblack.dmi b/icons/obj/smooth_structures/fancy_table_royalblack.dmi
new file mode 100644
index 0000000000..064b7c1945
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_royalblack.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_royalblue.dmi b/icons/obj/smooth_structures/fancy_table_royalblue.dmi
new file mode 100644
index 0000000000..9d0eba7265
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_royalblue.dmi differ
diff --git a/icons/obj/smooth_structures/plasmaglass_table.dmi b/icons/obj/smooth_structures/plasmaglass_table.dmi
new file mode 100644
index 0000000000..808e79aa43
Binary files /dev/null and b/icons/obj/smooth_structures/plasmaglass_table.dmi differ
diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi
index 6d2b2b64cd..ac2d42378a 100644
Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 2a6ec3955a..fae8134791 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 2e1fdfa7a8..cad28e12fe 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 1a3b344566..bdfbae3d75 100755
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi
index 80e681399a..59bc7a8e7c 100644
Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 9305e4b7bc..3aa6912da7 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index c983201d5f..6130c67eb3 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/icons/obj/turnstile.dmi b/icons/obj/turnstile.dmi
new file mode 100644
index 0000000000..0107ade705
Binary files /dev/null and b/icons/obj/turnstile.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi
index f7f259ab04..616cb1f521 100644
Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ
diff --git a/icons/turf/floors/carpet_blue.dmi b/icons/turf/floors/carpet_blue.dmi
new file mode 100644
index 0000000000..f797be9745
Binary files /dev/null and b/icons/turf/floors/carpet_blue.dmi differ
diff --git a/icons/turf/floors/carpet_cyan.dmi b/icons/turf/floors/carpet_cyan.dmi
new file mode 100644
index 0000000000..feca351ca9
Binary files /dev/null and b/icons/turf/floors/carpet_cyan.dmi differ
diff --git a/icons/turf/floors/carpet_green.dmi b/icons/turf/floors/carpet_green.dmi
new file mode 100644
index 0000000000..fdd1f071f7
Binary files /dev/null and b/icons/turf/floors/carpet_green.dmi differ
diff --git a/icons/turf/floors/carpet_orange.dmi b/icons/turf/floors/carpet_orange.dmi
new file mode 100644
index 0000000000..ddf239b63b
Binary files /dev/null and b/icons/turf/floors/carpet_orange.dmi differ
diff --git a/icons/turf/floors/carpet_purple.dmi b/icons/turf/floors/carpet_purple.dmi
new file mode 100644
index 0000000000..c1f40ec7fa
Binary files /dev/null and b/icons/turf/floors/carpet_purple.dmi differ
diff --git a/icons/turf/floors/carpet_red.dmi b/icons/turf/floors/carpet_red.dmi
new file mode 100644
index 0000000000..926655688e
Binary files /dev/null and b/icons/turf/floors/carpet_red.dmi differ
diff --git a/icons/turf/floors/carpet_royalblack.dmi b/icons/turf/floors/carpet_royalblack.dmi
new file mode 100644
index 0000000000..bc5cef1cf0
Binary files /dev/null and b/icons/turf/floors/carpet_royalblack.dmi differ
diff --git a/icons/turf/floors/carpet_royalblue.dmi b/icons/turf/floors/carpet_royalblue.dmi
new file mode 100644
index 0000000000..841e49e957
Binary files /dev/null and b/icons/turf/floors/carpet_royalblue.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index 8a4ba5b96b..215765c88d 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -4,11 +4,15 @@
set desc = "Type what you want to know about. This will open the wiki in your web browser. Type nothing to go to the main page."
set hidden = 1
var/wikiurl = CONFIG_GET(string/wikiurl)
+ var/wikiurltg = CONFIG_GET(string/wikiurltg)
if(wikiurl)
if(query)
- var/output = wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query
+ var/output = wikiurl + "?search=" + query
+ src << link(output)
+ output = wikiurltg + "/index.php?title=Special%3ASearch&profile=default&search=" + query
src << link(output)
else if (query != null)
+ src << link(wikiurltg)
src << link(wikiurl)
else
to_chat(src, "The wiki URL is not set in the server configuration.")
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index cdf6df2dab..c51778bbdb 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -153,6 +153,31 @@ h1.alert, h2.alert {color: #000000;}
.redtext {color: #FF0000; font-size: 3;}
.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
+.spooky {color: #FF9100;}
+.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
+@keyframes velvet {
+ 0% { color: #400020; }
+ 40% { color: #FF0000; }
+ 50% { color: #FF8888; }
+ 60% { color: #FF0000; }
+ 100% { color: #400020; }
+}
+
+.hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite;}
+@keyframes hypnocolor {
+ 0% { color: #0d0d0d; }
+ 25% { color: #410194; }
+ 50% { color: #7f17d8; }
+ 75% { color: #410194; }
+ 100% { color: #3bb5d3; }
+}
+
+.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
+ @keyframes phobia {
+ 0% { color: #0d0d0d; }
+ 50% { color: #dd0000; }
+ 100% { color: #0d0d0d; }
+}
.icon {height: 1em; width: auto;}
diff --git a/modular_citadel/code/_onclick/item_attack.dm b/modular_citadel/code/_onclick/item_attack.dm
index dcc9f567e2..80281ee084 100644
--- a/modular_citadel/code/_onclick/item_attack.dm
+++ b/modular_citadel/code/_onclick/item_attack.dm
@@ -17,9 +17,3 @@
/obj/item/proc/altafterattack(atom/target, mob/user, proximity_flag, click_parameters)
return FALSE
-
-/obj/item/proc/getweight()
- if(total_mass)
- return max(total_mass,MIN_MELEE_STAMCOST)
- else
- return w_class*1.25
diff --git a/modular_citadel/code/controllers/subsystem/job.dm b/modular_citadel/code/controllers/subsystem/job.dm
index c433042ae6..46aef6f529 100644
--- a/modular_citadel/code/controllers/subsystem/job.dm
+++ b/modular_citadel/code/controllers/subsystem/job.dm
@@ -13,7 +13,7 @@
var/permitted = TRUE
if(G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles))
permitted = FALSE
- if(G.ckeywhitelist && G.ckeywhitelist.len && !(the_mob.client.ckey in G.ckeywhitelist))
+ if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey))
permitted = FALSE
if(!equipbackpackstuff && G.category == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs
permitted = FALSE
diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm
new file mode 100644
index 0000000000..c496a0fa27
--- /dev/null
+++ b/modular_citadel/code/datums/mood_events/chem_events.dm
@@ -0,0 +1,59 @@
+/datum/mood_event/eigenstate
+ mood_change = -3
+ description = "Where the hell am I? Is this an alternative dimension ?\n"
+
+/datum/mood_event/enthrall
+ mood_change = 5
+
+/datum/mood_event/enthrall/add_effects(message)
+ description = "[message]\n"
+
+/datum/mood_event/enthrallpraise
+ mood_change = 10
+ timeout = 1 MINUTES
+
+/datum/mood_event/enthrallpraise/add_effects(message)
+ description = "[message]\n"
+
+/datum/mood_event/enthrallscold
+ mood_change = -10
+ timeout = 1 MINUTES
+
+/datum/mood_event/enthrallscold/add_effects(message)
+ description = "[message]\n"//aaa I'm not kinky enough for this
+
+/datum/mood_event/enthrallmissing1
+ mood_change = -5
+
+/datum/mood_event/enthrallmissing1/add_effects(message)
+ description = "[message]\n"
+
+/datum/mood_event/enthrallmissing2
+ mood_change = -10
+
+/datum/mood_event/enthrallmissing2/add_effects(message)
+ description = "[message]\n"
+
+/datum/mood_event/enthrallmissing3
+ mood_change = -15
+
+/datum/mood_event/enthrallmissing3/add_effects(message)
+ description = "[message]\n"
+
+/datum/mood_event/enthrallmissing4
+ mood_change = -25
+
+/datum/mood_event/enthrallmissing4/add_effects(message)
+ description = "[message]\n"
+
+/datum/mood_event/InLove
+ mood_change = 10
+
+/datum/mood_event/InLove/add_effects(message)
+ description = "[message]\n"
+
+/datum/mood_event/MissingLove
+ mood_change = -10
+
+/datum/mood_event/MissingLove/add_effects(message)
+ description = "[message]\n"
diff --git a/modular_citadel/code/datums/mood_events/generic_negative_events.dm b/modular_citadel/code/datums/mood_events/generic_negative_events.dm
index c0f2591656..bb04b0b283 100644
--- a/modular_citadel/code/datums/mood_events/generic_negative_events.dm
+++ b/modular_citadel/code/datums/mood_events/generic_negative_events.dm
@@ -3,19 +3,19 @@
/datum/mood_event/plushjack
description = "I have butchered a plush recently.\n"
mood_change = -1
- timeout = 1200
+ timeout = 2 MINUTES
/datum/mood_event/plush_nostuffing
description = "A plush I tried to pet had no stuffing...\n"
mood_change = -1
- timeout = 1200
+ timeout = 2 MINUTES
/datum/mood_event/emptypred
description = "I had to let someone out.\n"
mood_change = -2
- timeout = 600
+ timeout = 1 MINUTES
/datum/mood_event/emptyprey
description = "It feels quite cold out here.\n"
mood_change = -2
- timeout = 600
\ No newline at end of file
+ timeout = 1 MINUTES
diff --git a/modular_citadel/code/datums/mood_events/generic_positive_events.dm b/modular_citadel/code/datums/mood_events/generic_positive_events.dm
index 7b989d7700..ffa661e6e9 100644
--- a/modular_citadel/code/datums/mood_events/generic_positive_events.dm
+++ b/modular_citadel/code/datums/mood_events/generic_positive_events.dm
@@ -3,12 +3,12 @@
/datum/mood_event/headpat
description = "Headpats are nice.\n"
mood_change = 2
- timeout = 1200
+ timeout = 2 MINUTES
/datum/mood_event/hugbox
description = "I hugged a box of hugs recently.\n"
mood_change = 1
- timeout = 1200
+ timeout = 2 MINUTES
/datum/mood_event/plushpet
description = "I pet a plush recently.\n"
diff --git a/modular_citadel/code/datums/mood_events/moodular.dm b/modular_citadel/code/datums/mood_events/moodular.dm
index b53ce417e8..aa87f1b97a 100644
--- a/modular_citadel/code/datums/mood_events/moodular.dm
+++ b/modular_citadel/code/datums/mood_events/moodular.dm
@@ -3,9 +3,7 @@
// box of hugs
/obj/item/storage/box/hug/attack_self(mob/user)
. = ..()
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("hugbox", /datum/mood_event/hugbox)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"hugbox", /datum/mood_event/hugbox)
//Removed headpats here, duplicate code?
@@ -13,25 +11,17 @@
/obj/item/toy/plush/attack_self(mob/user)
. = ..()
if(stuffed || grenade)
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plushpet", /datum/mood_event/plushpet)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet)
else
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plush_nostuffing", /datum/mood_event/plush_nostuffing)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing)
// Jack the Ripper starring plush
/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
. = ..()
if(I.is_sharp())
if(!grenade)
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plushjack", /datum/mood_event/plushjack)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushjack", /datum/mood_event/plushjack)
// plush playing (plush-on-plush action)
if(istype(I, /obj/item/toy/plush))
- GET_COMPONENT_FROM(mood, /datum/component/mood, user)
- if(mood)
- mood.add_event("plushplay", /datum/mood_event/plushplay)
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushplay", /datum/mood_event/plushplay)
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
new file mode 100644
index 0000000000..1b1886173b
--- /dev/null
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -0,0 +1,759 @@
+#define DICK_MOVEMENT_SPEED "hugedick"
+#define BREAST_MOVEMENT_SPEED "megamilk"
+
+/datum/status_effect/chem/SGDF
+ id = "SGDF"
+ var/mob/living/fermi_Clone
+ var/mob/living/original
+ var/datum/mind/originalmind
+ var/status_set = FALSE
+ alert_type = null
+
+/datum/status_effect/chem/SGDF/on_apply()
+ log_game("FERMICHEM: SGDF status appied on [owner], ID: [owner.key]")
+ fermi_Clone = owner
+ return ..()
+
+/datum/status_effect/chem/SGDF/tick()
+ if(!status_set)
+ return ..()
+ if(original.stat == DEAD || original == null || !original)
+ if((fermi_Clone && fermi_Clone.stat != DEAD) || (fermi_Clone == null))
+ if(originalmind)
+ owner.remove_status_effect(src)
+ ..()
+
+/datum/status_effect/chem/SGDF/on_remove(mob/living/carbon/M)
+ log_game("FERMICHEM: SGDF mind shift applied. [owner] is now playing as their clone and should not have memories after their clone split (look up SGDF status applied). ID: [owner.key]")
+ originalmind.transfer_to(fermi_Clone)
+ to_chat(owner, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.")
+ to_chat(M, "Lucidity shoots to your previously blank mind as your mind suddenly finishes the cloning process. You marvel for a moment at yourself, as your mind subconciously recollects all your memories up until the point when you cloned yourself. curiously, you find that you memories are blank after you ingested the sythetic serum, leaving you to wonder where the other you is.")
+ fermi_Clone = null
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/status_effect/chem/breast_enlarger
+ id = "breast_enlarger"
+ alert_type = null
+ var/moveCalc = 1
+ var/cachedmoveCalc = 1
+
+/datum/status_effect/chem/breast_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now.
+ log_game("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]")
+ var/mob/living/carbon/human/o = owner
+ var/items = o.get_contents()
+ for(var/obj/item/W in items)
+ if(W == o.w_uniform || W == o.wear_suit)
+ o.dropItemToGround(W, TRUE)
+ playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!")
+ o.visible_message("[o]'s chest suddenly bursts forth, ripping their clothes off!'")
+ else
+ to_chat(o, "Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.")
+ return ..()
+
+/datum/status_effect/chem/breast_enlarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge
+ var/mob/living/carbon/human/o = owner
+ var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts")
+ moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click.
+ if(!B)
+ o.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED)
+ sizeMoveMod(1)
+ owner.remove_status_effect(src)
+ var/items = o.get_contents()
+ for(var/obj/item/W in items)
+ if(W == o.w_uniform || W == o.wear_suit)
+ o.dropItemToGround(W, TRUE)
+ playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ to_chat(owner, "Your enormous breasts are way too large to fit anything over them!")
+ if (B.size == "huge")
+ if(prob(1))
+ to_chat(owner, "Your back is feeling sore.")
+ var/target = o.get_bodypart(BODY_ZONE_CHEST)
+ o.apply_damage(0.1, BRUTE, target)
+ if(!B.cached_size == B.breast_values[B.prev_size])
+ o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ sizeMoveMod(moveCalc)
+ return ..()
+ else if (B.breast_values[B.size] > B.breast_values[B.prev_size])
+ o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ sizeMoveMod(moveCalc)
+ else if (B.breast_values[B.size] < B.breast_values[B.prev_size])
+ o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ sizeMoveMod(moveCalc)
+ if((B.cached_size) < 16)
+ switch(round(B.cached_size))
+ if(9)
+ if (B.breast_values[B.prev_size] != B.breast_values[B.size])
+ to_chat(o, "Your expansive chest has become a more managable size, liberating your movements.")
+ if(10 to INFINITY)
+ if (B.breast_values[B.prev_size] != B.breast_values[B.size])
+ to_chat(H, "Your indulgent busom is so substantial, it's affecting your movements!")
+ if(prob(1))
+ to_chat(owner, "Your back is feeling a little sore.")
+ ..()
+
+/datum/status_effect/chem/breast_enlarger/on_remove(mob/living/carbon/M)
+ log_game("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]")
+ owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED)
+ sizeMoveMod(1)
+
+/datum/status_effect/chem/breast_enlarger/proc/sizeMoveMod(var/value)
+ if(cachedmoveCalc == value)
+ return
+ owner.next_move_modifier /= cachedmoveCalc
+ owner.next_move_modifier *= value
+ cachedmoveCalc = value
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/status_effect/chem/penis_enlarger
+ id = "penis_enlarger"
+ alert_type = null
+ var/bloodCalc
+ var/moveCalc
+
+/datum/status_effect/chem/penis_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now.
+ log_game("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]")
+ var/mob/living/carbon/human/o = owner
+ var/items = o.get_contents()
+ if(o.w_uniform || o.wear_suit)
+ to_chat(o, "Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!")
+ owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'")
+ else
+ to_chat(o, "Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.")
+ for(var/obj/item/W in items)
+ if(W == o.w_uniform || W == o.wear_suit)
+ o.dropItemToGround(W, TRUE)
+ playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ return ..()
+
+
+/datum/status_effect/chem/penis_enlarger/tick(mob/living/carbon/M)
+ var/mob/living/carbon/human/o = owner
+ var/obj/item/organ/genital/penis/P = o.getorganslot("penis")
+ moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move
+ bloodCalc = 1+((round(P.length) - 21)/15) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.)
+ if(!P)
+ o.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
+ o.ResetBloodVol()
+ owner.remove_status_effect(src)
+ var/items = o.get_contents()
+ for(var/obj/item/W in items)
+ if(W == o.w_uniform || W == o.wear_suit)
+ o.dropItemToGround(W, TRUE)
+ playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ to_chat(owner, "Your enormous package is way to large to fit anything over!")
+ switch(round(P.cached_length))
+ if(21)
+ to_chat(o, "Your rascally willy has become a more managable size, liberating your movements.")
+ o.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
+ o.AdjustBloodVol(bloodCalc)
+ if(22 to INFINITY)
+ if(prob(2))
+ to_chat(o, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!")
+ o.add_movespeed_modifier(DICK_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
+ o.AdjustBloodVol(bloodCalc)
+ ..()
+
+/datum/status_effect/chem/penis_enlarger/on_remove(mob/living/carbon/human/o)
+ log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]")
+ owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
+ owner.ResetBloodVol()
+
+
+/*//////////////////////////////////////////
+ Mind control functions
+///////////////////////////////////////////
+*/
+
+//Preamble
+/*
+/mob/living
+ var/lewd = TRUE
+*/
+
+/mob/living/verb/toggle_lewd()
+ set category = "IC"
+ set name = "Toggle Lewdchem"
+ set desc = "Allows you to toggle if you'd like lewd flavour messages."
+ client.prefs.lewdchem = !(client.prefs.lewdchem)
+ to_chat(usr, "You [(client.prefs.lewdchem?"will":"no longer")] receive lewdchem messages.")
+
+/datum/status_effect/chem/enthrall
+ id = "enthrall"
+ alert_type = null
+ //examine_text TODO
+ var/enthrallTally = 1 //Keeps track of the enthralling process
+ var/resistanceTally = 0 //Keeps track of the resistance
+ var/deltaResist //The total resistance added per resist click
+
+ var/phase = 1 //-1: resisted state, due to be removed.0: sleeper agent, no effects unless triggered 1: initial, 2: 2nd stage - more commands, 3rd: fully enthralled, 4th Mindbroken
+
+ var/status = null //status effects
+ var/statusStrength = 0 //strength of status effect
+
+ var/mob/living/master //Enchanter's person
+ var/enthrallID //Enchanter's ckey
+ var/enthrallGender //Use master or mistress
+
+ var/mental_capacity //Higher it is, lower the cooldown on commands, capacity reduces with resistance.
+ var/datum/weakref/redirect_component //resistance
+
+ var/distancelist = list(2,1.5,1,0.8,0.6,0.5,0.4,0.3,0.2) //Distance multipliers
+
+ var/withdrawal = FALSE //withdrawl
+ var/withdrawalTick = 0 //counts how long withdrawl is going on for
+
+ var/list/customTriggers = list() //the list of custom triggers
+
+ var/cooldown = 0 //cooldown on commands
+ var/cooldownMsg = TRUE //If cooldown message has been sent
+ var/cTriggered = FALSE //If someone is triggered (so they can't trigger themselves with what they say for infinite loops)
+ var/resistGrowth = 0 //Resistance accrues over time
+ var/DistApart = 1 //Distance between master and owner
+ var/tranceTime = 0 //how long trance effects apply on trance status
+
+ var/customEcho //Custom looping text in owner
+ var/customSpan //Custom spans for looping text
+
+/datum/status_effect/chem/enthrall/on_apply()
+ var/mob/living/carbon/M = owner
+ var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list
+ if(!E)
+ message_admins("WARNING: FermiChem: No master found in thrall, did you bus in the status? You need to set up the vars manually in the chem if it's not reacted/bussed. Someone set up the reaction/status proc incorrectly if not (Don't use donor blood). Console them with a chemcat plush maybe?")
+ owner.remove_status_effect(src)
+ enthrallID = E.creatorID
+ enthrallGender = E.creatorGender
+ master = get_mob_by_key(enthrallID)
+ //if(M.ckey == enthrallID)
+ // owner.remove_status_effect(src)//At the moment, a user can enthrall themselves, toggle this back in if that should be removed.
+ redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/owner_resist)))) //Do resistance calc if resist is pressed#
+ RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear)
+ mental_capacity = 500 - M.getOrganLoss(ORGAN_SLOT_BRAIN)//It's their brain!
+ var/mob/living/carbon/human/H = owner
+ if(H)//Prefs
+ if(!H.canbearoused)
+ H.client?.prefs.lewdchem = FALSE
+ var/message = "[(owner.client?.prefs.lewdchem?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]"
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message)
+ to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!")
+ log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthrall attempts")
+ return ..()
+
+/datum/status_effect/chem/enthrall/tick()
+ var/mob/living/carbon/M = owner
+
+ //chem calculations
+ if(!owner.reagents.has_reagent("enthrall") && !owner.reagents.has_reagent("enthrallTest"))
+ if (phase < 3 && phase != 0)
+ deltaResist += 3//If you've no chem, then you break out quickly
+ if(prob(5))
+ to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.")
+ if (mental_capacity <= 500 || phase == 4)
+ if (owner.reagents.has_reagent("mannitol"))
+ mental_capacity += 5
+ if (owner.reagents.has_reagent("neurine"))
+ mental_capacity += 10
+
+ //mindshield check
+ if(HAS_TRAIT(M, TRAIT_MINDSHIELD))//If you manage to enrapture a head, wow, GJ. (resisting gives a bigger bonus with a mindshield) From what I can tell, this isn't possible.
+ resistanceTally += 2
+ if(prob(10))
+ to_chat(owner, "You feel lucidity returning to your mind as the mindshield buzzes, attempting to return your brain to normal function.")
+ if(phase == 4)
+ mental_capacity += 5
+
+ //phase specific events
+ switch(phase)
+ if(-1)//fully removed
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall")
+ log_game("FERMICHEM: MKULTRA: Status REMOVED from [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].")
+ owner.remove_status_effect(src)
+ return
+ if(0)// sleeper agent
+ if (cooldown > 0)
+ cooldown -= 1
+ return
+ if(1)//Initial enthrallment
+ if (enthrallTally > 125)
+ phase += 1
+ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity.
+ resistanceTally /= 2
+ enthrallTally = 0
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthralled to state 2")
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.")
+ else
+ to_chat(owner, "Your conciousness slips, as you feel more drawn to following [master].")
+
+ else if (resistanceTally > 125)
+ phase = -1
+ to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!")
+ if(DistApart < 10)
+ to_chat(master, "[(master.client?.prefs.lewdchem?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls broken free")
+ owner.remove_status_effect(src) //If resisted in phase 1, effect is removed.
+ if(prob(10))
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].")
+ if (2) //partially enthralled
+ if(enthrallTally > 200)
+ phase += 1
+ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity.
+ enthrallTally = 0
+ resistanceTally /= 2
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "Your mind gives, eagerly obeying and serving [master].")
+ to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP.
+ else
+ to_chat(owner, "You are unable to put up a resistance any longer, and now are under the influence of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot follow [master] in death. ")
+ to_chat(master, "Your [(master.client?.prefs.lewdchem?"pet":"follower")] [owner] appears to have fully fallen under your sway.")
+ log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.")
+ else if (resistanceTally > 200)
+ enthrallTally *= 0.5
+ phase -= 1
+ resistanceTally = 0
+ resistGrowth = 0
+ to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].")
+ if(prob(10))
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].")
+ if (3)//fully entranced
+ if ((resistanceTally >= 200 && withdrawalTick >= 150) || (HAS_TRAIT(M, TRAIT_MINDSHIELD) && (resistanceTally >= 100)))
+ enthrallTally = 0
+ phase -= 1
+ resistanceTally = 0
+ resistGrowth = 0
+ to_chat(owner, "The separation from [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.")
+ REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra")
+ if(prob(1))
+ if(owner.client?.prefs.lewdchem && !customEcho)
+ to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].")
+ if (4) //mindbroken
+ if (mental_capacity >= 499 && (owner.getOrganLoss(ORGAN_SLOT_BRAIN) <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra"))
+ phase = 2
+ mental_capacity = 500
+ customTriggers = list()
+ to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive amounts of chem injected into your system earlier, returning clarity to your mind. Though, you still feel drawn towards [master]'s words...'")
+ M.slurring = 0
+ M.confused = 0
+ resistGrowth = 0
+ else
+ if (cooldown > 0)
+ cooldown -= (0.8 + (mental_capacity/500))
+ cooldownMsg = FALSE
+ else if (cooldownMsg == FALSE)
+ if(DistApart < 10)
+ if(master.client?.prefs.lewdchem)
+ to_chat(master, "Your pet [owner] appears to have finished internalising your last command.")
+ cooldownMsg = TRUE
+ else
+ to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.")
+ cooldownMsg = TRUE
+ if(get_dist(master, owner) > 10)
+ if(prob(10))
+ to_chat(owner, "You feel [(owner.client?.prefs.lewdchem?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].")
+ M.throw_at(get_step_towards(master,owner), 5, 1)
+ return//If you break the mind of someone, you can't use status effects on them.
+
+
+ //distance calculations
+ DistApart = get_dist(master, owner)
+ switch(DistApart)
+ if(0 to 8)//If the enchanter is within range, increase enthrallTally, remove withdrawal subproc and undo withdrawal effects.
+ if(phase <= 2)
+ enthrallTally += distancelist[get_dist(master, owner)+1]
+ if(withdrawalTick > 0)
+ withdrawalTick -= 1
+ //calming effects
+ M.hallucination = max(0, M.hallucination - 5)
+ M.stuttering = max(0, M.stuttering - 5)
+ M.jitteriness = max(0, M.jitteriness - 5)
+ if(owner.getOrganLoss(ORGAN_SLOT_BRAIN) >=20)
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -0.2)
+ if(withdrawal == TRUE)
+ REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4")
+ withdrawal = FALSE
+ if(9 to INFINITY)//If they're not nearby, enable withdrawl effects.
+ withdrawal = TRUE
+
+ //Withdrawal subproc:
+ if (withdrawal == TRUE)//Your minions are really REALLY needy.
+ switch(withdrawalTick)//denial
+ if(5)//To reduce spam
+ to_chat(owner, "You are unable to complete [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.")
+ ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT
+ if(10 to 35)//Gives wiggle room, so you're not SUPER needy
+ if(prob(5))
+ to_chat(owner, "You're starting to miss [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].")
+ if(prob(5))
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1)
+ to_chat(owner, "[(owner.client?.prefs.lewdchem?"[enthrallGender]":"[master]")] will surely be back soon") //denial
+ if(36)
+ var/message = "[(owner.client?.prefs.lewdchem?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]"
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1, message)
+ if(37 to 65)//barganing
+ if(prob(10))
+ to_chat(owner, "They are coming back, right...?")
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)
+ if(prob(10))
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.")
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5)
+ if(66)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
+ var/message = "[(owner.client?.prefs.lewdchem?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]"
+ to_chat(owner, "You start to feel really angry about how you're not with [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]!")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message)
+ owner.stuttering += 50
+ owner.jitteriness += 250
+ if(67 to 89) //anger
+ if(prob(10))
+ addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2)
+ addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2)
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!")
+ else
+ to_chat(owner, "You are overwhelmed with anger and suddenly lash out!")
+ if(90)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
+ var/message = "[(owner.client?.prefs.lewdchem?"Where are you [enthrallGender]??!":"I need to find [master]!")]"
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3, message)
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore!")
+ else
+ to_chat(owner, "You need to find [master] at all costs, you can't hold yourself back anymore!")
+ if(91 to 100)//depression
+ if(prob(10))
+ M.gain_trauma_type(BRAIN_TRAUMA_MILD)
+ owner.stuttering += 35
+ owner.jitteriness += 35
+ else if(prob(25))
+ M.hallucination += 10
+ if(101)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
+ var/message = "[(owner.client?.prefs.lewdchem?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]"
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message)
+ to_chat(owner, "You can hardly find the strength to continue without [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].")
+ M.gain_trauma_type(BRAIN_TRAUMA_SEVERE)
+ if(102 to 140) //depression 2, revengeance
+ if(prob(20))
+ owner.Stun(50)
+ owner.emote("cry")//does this exist?
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.")
+ else
+ to_chat(owner, "You are overwheled with withdrawl from [master].")
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1)
+ owner.stuttering += 35
+ owner.jitteriness += 35
+ if(prob(10))//2% chance
+ switch(rand(1,5))//Now let's see what hopefully-not-important part of the brain we cut off
+ if(1 to 3)
+ M.gain_trauma_type(BRAIN_TRAUMA_MILD)
+ if(4)
+ M.gain_trauma_type(BRAIN_TRAUMA_SEVERE)
+ if(5)//0.4% chance
+ M.gain_trauma_type(BRAIN_TRAUMA_SPECIAL)
+ if(prob(5))
+ deltaResist += 5
+ if(140 to INFINITY) //acceptance
+ if(prob(15))
+ deltaResist += 5
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1)
+ if(prob(20))
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "Maybe you'll be okay without your [enthrallGender].")
+ else
+ to_chat(owner, "You feel your mental functions slowly begin to return.")
+ if(prob(5))
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1)
+ M.hallucination += 30
+
+ withdrawalTick += 0.5//Enough to leave you with a major brain trauma, but not kill you.
+
+ //Status subproc - statuses given to you from your Master
+ //currently 3 statuses; antiresist -if you press resist, increases your enthrallment instead, HEAL - which slowly heals the pet, CHARGE - which breifly increases speed, PACIFY - makes pet a pacifist, ANTIRESIST - frustrates resist presses.
+ if (status)
+
+ if(status == "Antiresist")
+ if (statusStrength < 0)
+ status = null
+ to_chat(owner, "Your mind feels able to resist oncemore.")
+ else
+ statusStrength -= 1
+
+ else if(status == "heal")
+ if (statusStrength < 0)
+ status = null
+ to_chat(owner, "You finish licking your wounds.")
+ else
+ statusStrength -= 1
+ owner.heal_overall_damage(1, 1, 0, FALSE, FALSE)
+ cooldown += 1 //Cooldown doesn't process till status is done
+
+ else if(status == "charge")
+ ADD_TRAIT(owner, TRAIT_GOTTAGOFAST, "MKUltra")
+ status = "charged"
+ if(master.client?.prefs.lewdchem)
+ to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!")
+ else
+ to_chat(owner, "[master]'s command fills you with a burst of speed!")
+
+ else if (status == "charged")
+ if (statusStrength < 0)
+ status = null
+ REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST, "MKUltra")
+ owner.Knockdown(50)
+ to_chat(owner, "Your body gives out as the adrenaline in your system runs out.")
+ else
+ statusStrength -= 1
+ cooldown += 1 //Cooldown doesn't process till status is done
+
+ else if (status == "pacify")
+ ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltraStatus")
+ status = null
+
+ //Truth serum?
+ //adrenals?
+
+ //customEcho
+ if(customEcho && withdrawal == FALSE && owner.client?.prefs.lewdchem)
+ if(prob(2))
+ if(!customSpan) //just in case!
+ customSpan = "notice"
+ to_chat(owner, "[customEcho].")
+
+ //final tidying
+ resistanceTally += deltaResist
+ deltaResist = 0
+ if(cTriggered >= 0)
+ cTriggered -= 1
+ if (cooldown > 0)
+ cooldown -= (0.8 + (mental_capacity/500))
+ cooldownMsg = FALSE
+ else if (cooldownMsg == FALSE)
+ if(DistApart < 10)
+ if(master.client?.prefs.lewdchem)
+ to_chat(master, "Your pet [owner] appears to have finished internalising your last command.")
+ else
+ to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.")
+ cooldownMsg = TRUE
+ cooldown = 0
+ if (tranceTime > 0 && tranceTime != 51) //custom trances only last 50 ticks.
+ tranceTime -= 1
+ else if (tranceTime == 0) //remove trance after.
+ M.cure_trauma_type(/datum/brain_trauma/hypnosis, TRAUMA_RESILIENCE_SURGERY)
+ M.remove_status_effect(/datum/status_effect/trance)
+ tranceTime = 51
+ //..()
+
+//Remove all stuff
+/datum/status_effect/chem/enthrall/on_remove()
+ var/mob/living/carbon/M = owner
+ M.mind.remove_antag_datum(/datum/antagonist/brainwashed)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrall")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallpraise")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "enthrallscold")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing4")
+ qdel(redirect_component.resolve())
+ redirect_component = null
+ UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
+ REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra")
+ to_chat(owner, "You're now free of [master]'s influence, and fully independent!'")
+ UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL)
+
+
+/datum/status_effect/chem/enthrall/proc/owner_hear(var/hearer, message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
+ if(owner.client?.prefs.lewdchem == FALSE)
+ return
+ if (cTriggered > 0)
+ return
+ var/mob/living/carbon/C = owner
+ raw_message = lowertext(raw_message)
+ for (var/trigger in customTriggers)
+ var/cached_trigger = lowertext(trigger)
+ if (findtext(raw_message, cached_trigger))//if trigger1 is the message
+ cTriggered = 5 //Stops triggerparties and as a result, stops servercrashes.
+ log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been triggered with [cached_trigger] from [speaker] saying: \"[message]\". (their master being [master] ckey: [enthrallID].)")
+
+ //Speak (Forces player to talk)
+ if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2
+ var/saytext = "Your mouth moves on it's own before you can even catch it."
+ if(HAS_TRAIT(C, TRAIT_NYMPHO))
+ saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it."
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[saytext]"), 5)
+ addtimer(CALLBACK(C, /atom/movable/proc/say, "[customTriggers[trigger][2]]"), 5)
+ //(C.say(customTriggers[trigger][2]))//trigger3
+ log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.")
+
+
+ //Echo (repeats message!) allows customisation, but won't display var calls! Defaults to hypnophrase.
+ else if (lowertext(customTriggers[trigger][1]) == "echo")//trigger2
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[customTriggers[trigger][2]]"), 5)
+ //(to_chat(owner, "[customTriggers[trigger][2]]"))//trigger3
+
+ //Shocking truth!
+ else if (lowertext(customTriggers[trigger]) == "shock")
+ if (C.canbearoused && C.client?.prefs.lewdchem)
+ C.adjustArousalLoss(5)
+ C.jitteriness += 100
+ C.stuttering += 25
+ C.Knockdown(60)
+ C.Stun(60)
+ to_chat(owner, "Your muscles seize up, then start spasming wildy!")
+
+ //wah intensifies wah-rks
+ else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ if (HAS_TRAIT(C, TRAIT_NYMPHO) && C.client?.prefs.lewdchem)
+ if (C.getArousalLoss() > 80)
+ C.mob_climax(forced_climax=TRUE)
+ C.SetStun(10)//We got your stun effects in somewhere, Kev.
+ else
+ C.adjustArousalLoss(10)
+ to_chat(C, "You feel a surge of arousal!")
+ else
+ C.throw_at(get_step_towards(speaker,C), 3, 1) //cut this if it's too hard to get working
+
+ //kneel (knockdown)
+ else if (lowertext(customTriggers[trigger]) == "kneel")//as close to kneeling as you can get, I suppose.
+ to_chat(owner, "You drop to the ground unsurreptitiously.")
+ C.lay_down()
+
+ //strip (some) clothes
+ else if (lowertext(customTriggers[trigger]) == "strip")//This wasn't meant to just be a lewd thing oops.
+ var/mob/living/carbon/human/o = owner
+ var/items = o.get_contents()
+ for(var/obj/item/W in items)
+ if(W == o.w_uniform || W == o.wear_suit)
+ o.dropItemToGround(W, TRUE)
+ to_chat(owner,"You feel compelled to strip your clothes.")
+
+ //trance
+ else if (lowertext(customTriggers[trigger]) == "trance")//Maaaybe too strong. Weakened it, only lasts 50 ticks.
+ var/mob/living/carbon/human/o = owner
+ o.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
+ tranceTime = 50
+ log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been tranced from previous trigger.")
+
+ return
+
+/datum/status_effect/chem/enthrall/proc/owner_resist()
+ var/mob/living/carbon/M = owner
+ to_chat(owner, "You attempt to fight against [master]'s influence!")
+
+ //Able to resist checks
+ if (status == "Sleeper" || phase == 0)
+ return
+ else if (phase == 4)
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting. Unless you can fix the brain damage, you won't be able to break free of your [enthrallGender]'s control.")
+ else
+ to_chat(owner, "Your brain is too overwhelmed with from the high volume of chemicals in your system, rendering you unable to resist, unless you can fix the brain damage.")
+ return
+ else if (phase == 3 && withdrawal == FALSE)
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. If you get split up from them, then you might be able to entertain the idea of resisting.")
+ else
+ to_chat(owner, "You are unable to resist [master] in your current state. If you get split up from them, then you might be able to resist.")
+ return
+ else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled.
+ if (statusStrength > 0)
+ if(owner.client?.prefs.lewdchem)
+ to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance! You'll have to wait a bit before attemping again, lest your attempts become frustrated again.")
+ else
+ to_chat(owner, "The order from your [master] to give in is conflicting with your attempt to resist. You'll have to wait a bit before attemping again, lest your attempts become frustrated again.")
+ statusStrength += 1
+ enthrallTally += 1
+ return
+ else
+ status = null
+
+ //base resistance
+ if (deltaResist != 0)//So you can't spam it, you get one deltaResistance per tick.
+ deltaResist += 0.1 //Though I commend your spamming efforts.
+ return
+ else
+ deltaResist = 1.8 + resistGrowth
+ resistGrowth += 0.05
+
+ //distance modifer
+ switch(DistApart)
+ if(0)
+ deltaResist *= 0.8
+ if(1 to 8)//If they're far away, increase resistance.
+ deltaResist *= (1+(DistApart/10))
+ if(9 to INFINITY)//If
+ deltaResist *= 2
+
+
+ if(prob(5))
+ M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes
+ deltaResist *= 1.5
+ //nymphomania
+ if (M.canbearoused && HAS_TRAIT(M, TRAIT_NYMPHO))//I'm okay with this being removed.
+ deltaResist*= 0.5-(((2/200)*M.arousalloss)/1)//more aroused you are, the weaker resistance you can give, the less you are, the more you gain. (+/- 0.5)
+
+ //chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist.
+ if (owner.reagents.has_reagent("mannitol"))
+ deltaResist *= 1.25
+ if (owner.reagents.has_reagent("neurine"))
+ deltaResist *= 1.5
+ if (!HAS_TRAIT(owner, TRAIT_CROCRIN_IMMUNE) && M.canbearoused)
+ if (owner.reagents.has_reagent("anaphro"))
+ deltaResist *= 1.5
+ if (owner.reagents.has_reagent("anaphro+"))
+ deltaResist *= 2
+ if (owner.reagents.has_reagent("aphro"))
+ deltaResist *= 0.75
+ if (owner.reagents.has_reagent("aphro+"))
+ deltaResist *= 0.5
+
+ //Antag resistance
+ //cultists are already brainwashed by their god
+ if(iscultist(owner))
+ deltaResist *= 1.3
+ else if (is_servant_of_ratvar(owner))
+ deltaResist *= 1.3
+ //antags should be able to resist, so they can do their other objectives. This chem does frustrate them, but they've all the tools to break free when an oportunity presents itself.
+ else if (owner.mind.assigned_role in GLOB.antagonists)
+ deltaResist *= 1.2
+
+ //role resistance
+ //Chaplains are already brainwashed by their god
+ if(owner.mind.assigned_role == "Chaplain")
+ deltaResist *= 1.2
+ //Command staff has authority,
+ if(owner.mind.assigned_role in GLOB.command_positions)
+ deltaResist *= 1.1
+ //Chemists should be familiar with drug effects
+ if(owner.mind.assigned_role == "Chemist")
+ deltaResist *= 1.2
+
+ //Happiness resistance
+ //Your Thralls are like pets, you need to keep them happy.
+ if(owner.nutrition < 300)
+ deltaResist += (300-owner.nutrition)/6
+ if(owner.health < 100)//Harming your thrall will make them rebel harder.
+ deltaResist *= ((120-owner.health)/100)+1
+ //if(owner.mood.mood) //datum/component/mood TO ADD in FERMICHEM 2
+ //Add cold/hot, oxygen, sanity, happiness? (happiness might be moot, since the mood effects are so strong)
+ //Mental health could play a role too in the other direction
+
+ //If you've a collar, you get a sense of pride
+ if(istype(M.wear_neck, /obj/item/clothing/neck/petcollar))
+ deltaResist *= 0.5
+ if(HAS_TRAIT(M, TRAIT_MINDSHIELD))
+ deltaResist += 5//even faster!
+
+ return
diff --git a/modular_citadel/code/datums/traits/negative.dm b/modular_citadel/code/datums/traits/negative.dm
new file mode 100644
index 0000000000..c0cbe57b5a
--- /dev/null
+++ b/modular_citadel/code/datums/traits/negative.dm
@@ -0,0 +1 @@
+// Citadel-specific Negative Traits
diff --git a/modular_citadel/code/datums/traits/neutral.dm b/modular_citadel/code/datums/traits/neutral.dm
index 05aeb27361..197c9b94e1 100644
--- a/modular_citadel/code/datums/traits/neutral.dm
+++ b/modular_citadel/code/datums/traits/neutral.dm
@@ -31,3 +31,13 @@
mob_trait = TRAIT_MASO
gain_text = "You desire to be hurt."
lose_text = "Pain has become less exciting for you."
+
+/datum/quirk/pharmacokinesis //Prevents unwanted organ additions.
+ name = "Acute hepatic pharmacokinesis"
+ desc = "You've a rare genetic disorder that causes Incubus draft and Sucubus milk to be absorbed by your liver instead."
+ value = 0
+ mob_trait = TRAIT_PHARMA
+ lose_text = "Your liver feels different."
+ var/active = FALSE
+ var/power = 0
+ var/cachedmoveCalc = 1
diff --git a/modular_citadel/code/game/gamemodes/gangs/dominator.dm b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
index 5ad740ed2e..4946cad510 100644
--- a/modular_citadel/code/game/gamemodes/gangs/dominator.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/dominator.dm
@@ -1,6 +1,7 @@
#define DOM_BLOCKED_SPAM_CAP 6
//32 instead of 40 for safety reasons. How many turfs aren't walls around dominator for it to work
-#define DOM_REQUIRED_TURFS 32
+//Update ppl somehow fuckup at 32, now we are down to 25. I hope to god they don't try harder to wall it.
+#define DOM_REQUIRED_TURFS 25
#define DOM_HULK_HITS_REQUIRED 10
/obj/machinery/dominator
@@ -85,6 +86,9 @@
if(gang && gang.domination_time != NOT_DOMINATING)
var/time_remaining = gang.domination_time_remaining()
if(time_remaining > 0)
+ if(!is_station_level(z))
+ explosion(src, 5, 10, 20, 30) //you now get a nice explosion if this moves off station.
+ qdel(src) //to make sure it doesn't continue to exist.
if(excessive_walls_check())
gang.domination_time += 20
if(spam_prevention < DOM_BLOCKED_SPAM_CAP)
@@ -164,7 +168,7 @@
examine(user)
return
- if(tempgang.domination_time != NOT_DOMINATING)
+ if(tempgang.domination_time != NOT_DOMINATING)
to_chat(user, "Error: Hostile Takeover is already in progress.")
return
diff --git a/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm b/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
index 334d6bf423..9d6c03d9f6 100644
--- a/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
+++ b/modular_citadel/code/game/gamemodes/gangs/gang_datums.dm
@@ -52,7 +52,7 @@
name = "Omni"
color = "#008080"
inner_outfits = list(/obj/item/clothing/under/color/teal)
- outer_outfits = list(/obj/item/clothing/suit/studentuni)
+ outer_outfits = list(/obj/item/clothing/suit/chaplain/studentuni)
/datum/team/gang/newton
name = "Newton"
@@ -64,7 +64,7 @@
name = "Cyber"
color = "#00f904" //Cyber and waffle shared colors, I made these guys green and made weed darker green.
inner_outfits = list(/obj/item/clothing/under/color/lightbrown)
- outer_outfits = list(/obj/item/clothing/suit/nemes)
+ outer_outfits = list(/obj/item/clothing/suit/chaplain/pharaoh)
/datum/team/gang/donk
name = "Donk"
@@ -136,4 +136,4 @@
name = "Weed"
color = "#6cd648"
inner_outfits = list(/obj/item/clothing/under/color/darkgreen)
- outer_outfits = list(/obj/item/clothing/suit/vapeshirt)
\ No newline at end of file
+ outer_outfits = list(/obj/item/clothing/suit/vapeshirt)
diff --git a/modular_citadel/code/game/machinery/plasmacases.dm b/modular_citadel/code/game/machinery/plasmacases.dm
deleted file mode 100644
index ac3621b58a..0000000000
--- a/modular_citadel/code/game/machinery/plasmacases.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/obj/structure/guncase/plasma
- name = "plasma rifle locker"
- desc = "A locker that holds plasma rifles. Only opens in dire emergencies."
- icon_state = "ecase"
- case_type = "egun"
- gun_category = /obj/item/gun/energy/plasma
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF //because fuck you, powergaming nerds.
-
-/obj/structure/guncase/plasma/attackby(obj/item/W, mob/user, params)
- return
-
-/obj/structure/guncase/plasma/MouseDrop(over_object, src_location, over_location)
- if(GLOB.security_level == SEC_LEVEL_RED || GLOB.security_level == SEC_LEVEL_DELTA)
- . = ..()
- else
- to_chat(usr, "The storage unit will only unlock during a Red or Delta security alert.")
-
-/obj/structure/guncase/plasma/attack_hand(mob/user)
- return MouseDrop(user)
-
-/obj/structure/guncase/plasma/emag_act()
- to_chat(usr, "The locking mechanism is fitted with old style parts, The card has no effect.")
- return
\ No newline at end of file
diff --git a/modular_citadel/code/game/machinery/toylathe.dm b/modular_citadel/code/game/machinery/toylathe.dm
index 903235c763..78b5fdea88 100644
--- a/modular_citadel/code/game/machinery/toylathe.dm
+++ b/modular_citadel/code/game/machinery/toylathe.dm
@@ -4,24 +4,34 @@
/obj/machinery/autoylathe
name = "autoylathe"
- desc = "It produces items using plastic, metal and glass."
+ desc = "It produces toys using plastic, metal and glass."
icon_state = "autolathe"
density = TRUE
- anchored = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
circuit = /obj/item/circuitboard/machine/autoylathe
+ layer = BELOW_OBJ_LAYER
+
+ var/operating = FALSE
+ var/list/L = list()
+ var/list/LL = list()
var/hacked = FALSE
- var/disabled = FALSE
+ var/disabled = 0
var/shocked = FALSE
+ var/hack_wire
+ var/disable_wire
+ var/shock_wire
+
var/busy = FALSE
var/prod_coeff = 1
+
var/datum/design/being_built
var/datum/techweb/stored_research
var/list/datum/design/matching_designs
var/selected_category
var/screen = 1
+
var/list/categories = list(
"Toys",
"Figurines",
@@ -36,8 +46,8 @@
)
/obj/machinery/autoylathe/Initialize()
- . = ..()
AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_PLASTIC), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
+ . = ..()
wires = new /datum/wires/autoylathe(src)
stored_research = new /datum/techweb/specialized/autounlocking/autoylathe
@@ -47,7 +57,8 @@
QDEL_NULL(wires)
return ..()
-/obj/machinery/autoylathe/interact(mob/user)
+/obj/machinery/autoylathe/ui_interact(mob/user)
+ . = ..()
if(!is_operational())
return
@@ -81,9 +92,6 @@
updateUsrDialog()
return TRUE
- if(exchange_parts(user, O))
- return TRUE
-
if(default_deconstruction_crowbar(O))
return TRUE
@@ -148,6 +156,7 @@
var/multiplier = text2num(href_list["multiplier"])
var/is_stack = ispath(being_built.build_path, /obj/item/stack)
+ multiplier = CLAMP(multiplier,1,50)
/////////////////
@@ -194,6 +203,7 @@
else
for(var/i=1, i<=multiplier, i++)
var/obj/item/new_item = new being_built.build_path(A)
+ new_item.materials = new_item.materials.Copy()
for(var/mat in materials_used)
new_item.materials[mat] = materials_used[mat] / multiplier
new_item.autoylathe_crafted(src)
@@ -347,7 +357,7 @@
disabled = FALSE
/obj/machinery/autoylathe/proc/shock(mob/user, prb)
- if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
+ if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
return FALSE
if(!prob(prb))
return FALSE
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 12c29f7d98..6a91810173 100755
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -22,6 +22,7 @@
/obj/item/storage/hypospraykit/toxin = 2,
/obj/item/storage/hypospraykit/o2 = 2,
/obj/item/storage/hypospraykit/brute = 2,
+ /obj/item/storage/hypospraykit/enlarge = 2,
/obj/item/reagent_containers/glass/bottle/vial/small = 5)
/obj/machinery/vending/wardrobe/chap_wardrobe
@@ -42,18 +43,33 @@
vend_reply = "Have fun, you shameless pervert!"
products = list(
/obj/item/clothing/under/maid = 5,
- /obj/item/clothing/under/stripper_pink = 5,
- /obj/item/clothing/under/stripper_green = 5,
- /obj/item/dildo/custom = 5
- )
- contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5,
/obj/item/clothing/neck/petcollar = 5,
- /obj/item/clothing/under/mankini = 1,
- /obj/item/dildo/flared/huge = 1
+ /obj/item/clothing/neck/petcollar/choker = 5,
+ /obj/item/clothing/neck/petcollar/leather = 5,
+ /obj/item/restraints/handcuffs/fake/kinky = 5,
+ /obj/item/clothing/glasses/sunglasses/blindfold = 4,
+ /obj/item/clothing/mask/muzzle = 4,
+ /obj/item/clothing/under/stripper_pink = 3,
+ /obj/item/clothing/under/stripper_green = 3,
+ /obj/item/dildo/custom = 5,
+ /obj/item/electropack/shockcollar = 3,
+ /obj/item/assembly/signaler = 3
+ )
+ contraband = list(
+ /obj/item/clothing/neck/petcollar/locked = 2,
+ /obj/item/key/collar = 2,
+ /obj/item/clothing/head/kitty = 3,
+ /obj/item/clothing/head/rabbitears = 3,
+ /obj/item/clothing/under/mankini = 2,
+ /obj/item/clothing/under/jabroni = 2,
+ /obj/item/dildo/flared/huge = 3,
+ /obj/item/reagent_containers/glass/bottle/crocin = 5,
+ /obj/item/reagent_containers/glass/bottle/camphor = 5
)
premium = list(
- /obj/item/electropack/shockcollar = 3,
- /obj/item/clothing/neck/petcollar/locked = 1
+ /obj/item/clothing/accessory/skullcodpiece/fake = 3,
+ /obj/item/clothing/under/gear_harness = 10,
+ /obj/item/reagent_containers/glass/bottle/hexacrocin = 10
)
refill_canister = /obj/item/vending_refill/kink
/*
diff --git a/modular_citadel/code/game/machinery/wishgranter.dm b/modular_citadel/code/game/machinery/wishgranter.dm
index f7c2c57d08..f24062a126 100644
--- a/modular_citadel/code/game/machinery/wishgranter.dm
+++ b/modular_citadel/code/game/machinery/wishgranter.dm
@@ -95,7 +95,7 @@
killwish.grasp_range = 6
killwish.melee_damage_upper = 30
killwish.grasp_chance = 50
- killwish.loot = list(/obj/item/twohanded/hypereutactic)
+ killwish.loot = list(/obj/item/twohanded/dualsaber/hypereutactic)
charges--
insisting = FALSE
if(!charges)
diff --git a/modular_citadel/code/game/objects/ids.dm b/modular_citadel/code/game/objects/ids.dm
index 89a3c0f0c2..8ef724581e 100644
--- a/modular_citadel/code/game/objects/ids.dm
+++ b/modular_citadel/code/game/objects/ids.dm
@@ -49,7 +49,7 @@
/obj/item/emagrecharge
name = "electromagnet charging device"
- desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices."
+ desc = "A small cell with two prongs lazily jabbed into it. It looks like it's made for charging the small batteries found in electromagnetic devices, sadly this can't be recharged like a normal cell."
icon = 'icons/obj/module.dmi'
icon_state = "cell_mini"
item_flags = NOBLUDGEON
@@ -63,7 +63,7 @@
to_chat(user, "It has a small, red, blinking light coming from inside of it. It's spent.")
/obj/item/card/emag
- var/uses = 10
+ var/uses = 15
/obj/item/card/emag/examine(mob/user)
. = ..()
diff --git a/modular_citadel/code/game/objects/items.dm b/modular_citadel/code/game/objects/items.dm
index 337db986b0..c94923f9de 100644
--- a/modular_citadel/code/game/objects/items.dm
+++ b/modular_citadel/code/game/objects/items.dm
@@ -1,6 +1,4 @@
/obj/item
- var/total_mass //Total mass in arbitrary pound-like values. If there's no balance reasons for an item to have otherwise, this var should be the item's weight in pounds.
-
var/list/alternate_screams = list() //REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
// lazy for screaming.
diff --git a/modular_citadel/code/game/objects/items/devices/genemods.dm b/modular_citadel/code/game/objects/items/devices/genemods.dm
deleted file mode 100644
index 5efebf4860..0000000000
--- a/modular_citadel/code/game/objects/items/devices/genemods.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-//Will include consumable gene mods in the future.
-
-/obj/item/genemod
- name = "genetic modifier"
- desc = "Microbodies which can grow, morph, or otherwise change an organism into something else."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "dnainjector"
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_TINY
- var/applied_region = "chest"
- var/list/add_mutations = list()
- var/list/remove_mutations = list()
-
- var/list/add_mutations_static = list()
- var/list/remove_mutations_static = list()
-
- var/used = 0
-
-/obj/item/genemod/proc/use(mob/living/carbon/human/target)
- return
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items/holy_weapons.dm b/modular_citadel/code/game/objects/items/holy_weapons.dm
index 3ecc6cc31b..06cdb0f5fd 100644
--- a/modular_citadel/code/game/objects/items/holy_weapons.dm
+++ b/modular_citadel/code/game/objects/items/holy_weapons.dm
@@ -30,24 +30,16 @@
"You kneel[M == user ? null : " next to [M]"] and begin a prayer to [deity_name].")
praying = TRUE
- if(do_after(user, 100, target = M))
+ if(do_after(user, 20, target = M))
if(istype(M, /mob/living/carbon/human)) // This probably should not work on catpeople. They're unholy abominations.
var/mob/living/carbon/human/target = M
-
- if(iscultist(M) || is_servant_of_ratvar(M)) //ripped from holywater code.
- if(iscultist(M))
- SSticker.mode.remove_cultist(M.mind, FALSE, TRUE)
- else if(is_servant_of_ratvar(M))
- remove_servant_of_ratvar(M)
-
+ M.reagents.add_reagent("holywater", 5)
to_chat(target, "[user]'s prayer to [deity_name] has eased your pain!")
target.adjustToxLoss(-5, TRUE, TRUE)
target.adjustOxyLoss(-5)
target.adjustBruteLoss(-5)
target.adjustFireLoss(-5)
-
praying = FALSE
-
else
to_chat(user, "Your prayer to [deity_name] was interrupted.")
praying = FALSE
diff --git a/modular_citadel/code/game/objects/items/meat.dm b/modular_citadel/code/game/objects/items/meat.dm
deleted file mode 100644
index 3891c5ca9d..0000000000
--- a/modular_citadel/code/game/objects/items/meat.dm
+++ /dev/null
@@ -1,26 +0,0 @@
-/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
- icon = 'modular_citadel/icons/obj/foods.dmi'
- icon_state = "ipcmeat"
- desc = "Gross robot meat."
- filling_color = "#000000"
- tastes = list("metal" = 1)
-
-/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth
- icon = 'modular_citadel/icons/obj/foods.dmi'
- icon_state = "mothmeat"
- desc = "Moth meat."
- filling_color = "#BF896B"
- tastes = list("insects" = 1)
-
-
-/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/avian
- icon = 'modular_citadel/icons/obj/foods.dmi'
- icon_state = "birdmeat"
- desc = "Quality bird meat."
- filling_color = "#BF896B"
- tastes = list("chicken" = 1)
-
-/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
- desc = "Furry meat. WHO DID THIS?!"
- filling_color = "#6B8E23"
- tastes = list("brains" = 1, "meat" = 1)
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items/melee/energy.dm b/modular_citadel/code/game/objects/items/melee/energy.dm
deleted file mode 100644
index c37f88eacf..0000000000
--- a/modular_citadel/code/game/objects/items/melee/energy.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/obj/item/melee/transforming/energy/sword
- total_mass = 0.375 //Survival flashlights typically weigh around 5 ounces.
- total_mass_on = 3.4 //The typical medieval sword, on the other hand, weighs roughly 3 pounds.
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
index 6e28a3115f..e677c1f3ab 100644
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
@@ -124,21 +124,12 @@
return
else
to_chat(user, "You combine the two light swords, making a single supermassive blade! You're cool.")
- new /obj/item/twohanded/hypereutactic(user.drop_location())
+ new /obj/item/twohanded/dualsaber/hypereutactic(user.drop_location())
qdel(W)
qdel(src)
else
return ..()
-/obj/item/melee/transforming/energy/sword/cx/chaplain
- name = "divine lightblade"
- force_on = 20 //haha i'll regret this
- block_chance = 50
-
-/obj/item/melee/transforming/energy/sword/cx/chaplain/Initialize()
- . = ..()
- AddComponent(/datum/component/anti_magic, TRUE, TRUE)
-
//OBLIGATORY TOY MEMES /////////////////////////////////////
/obj/item/toy/sword/cx
@@ -233,7 +224,7 @@
return
else
to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.")
- new /obj/item/twohanded/hypereutactic/toy(user.loc)
+ new /obj/item/twohanded/dualsaber/hypereutactic/toy(user.loc)
qdel(W)
qdel(src)
else
@@ -247,7 +238,7 @@
// HYPEREUTACTIC Blades /////////////////////////
/////////////////////////////////////////////////////
-/obj/item/twohanded/hypereutactic
+/obj/item/twohanded/dualsaber/hypereutactic
icon = 'modular_citadel/icons/eutactic/item/hypereutactic.dmi'
icon_state = "hypereutactic"
lefthand_file = 'modular_citadel/icons/eutactic/mob/hypereutactic_left.dmi'
@@ -258,58 +249,47 @@
name = "hypereutactic blade"
desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
force = 7
- throwforce = 5
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_SMALL
- var/w_class_on = WEIGHT_CLASS_BULKY
force_unwielded = 7
force_wielded = 40
wieldsound = 'sound/weapons/nebon.ogg'
unwieldsound = 'sound/weapons/neboff.ogg'
- hitsound = "swing_hit"
+ hitsound_on = 'sound/weapons/nebhit.ogg'
+ slowdown_wielded = 1
armour_penetration = 60
light_color = "#37FFF7"
+ rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
- block_chance = 75
- max_integrity = 200
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
- resistance_flags = FIRE_PROOF
- var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
- item_flags = SLOWS_WHILE_IN_HAND
+ spinnable = FALSE
+ total_mass_on = 4
-/obj/item/twohanded/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain
+ name = "\improper divine lightblade"
+ desc = "A giant blade of bright and holy light, said to cut down the wicked with ease."
+ force = 5
+ force_unwielded = 5
+ force_wielded = 20
+ block_chance = 50
+ armour_penetration = 0
+ var/chaplain_spawnable = TRUE
+ obj_flags = UNIQUE_RENAME
+
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE)
+
+/obj/item/twohanded/dualsaber/hypereutactic/chaplain/IsReflect()
+ return FALSE
+
+/obj/item/twohanded/dualsaber/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
altafterattack(A, user, TRUE, params)
return TRUE
-/obj/item/twohanded/hypereutactic/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
+/obj/item/twohanded/dualsaber/hypereutactic/altafterattack(atom/target, mob/living/user, proximity_flag, click_parameters) //does right click memes
if(istype(user))
user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
return TRUE
-/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
- if(M.has_dna())
- if(M.dna.check_mutation(HULK))
- to_chat(M, "You lack the grace to wield this!")
- return
- ..()
- if(wielded)
- sharpness = IS_SHARP
- w_class = w_class_on
- hitsound = 'sound/weapons/nebhit.ogg'
- START_PROCESSING(SSobj, src)
- set_light(brightness_on)
-
-/obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds.
- sharpness = initial(sharpness)
- w_class = initial(w_class)
- ..()
- hitsound = "swing_hit"
- STOP_PROCESSING(SSobj, src)
- set_light(0)
- slowdown = initial(slowdown)
-
-/obj/item/twohanded/hypereutactic/update_icon()
+/obj/item/twohanded/dualsaber/hypereutactic/update_icon()
var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_blade")
var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/eutactic/item/hypereutactic.dmi', "hypereutactic_gem")
@@ -329,21 +309,21 @@
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is)
-/obj/item/twohanded/hypereutactic/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
+/obj/item/twohanded/dualsaber/hypereutactic/AltClick(mob/living/user)
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
return
if(user.incapacitated() || !istype(user))
to_chat(user, "You can't do that right now!")
return
-
if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
var/energy_color_input = input(usr,"","Choose Energy Color",light_color) as color|null
- if(energy_color_input)
- light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ if(!energy_color_input || !user.canUseTopic(src, BE_CLOSE, FALSE) || hacked)
+ return
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
update_icon()
update_light()
-/obj/item/twohanded/hypereutactic/worn_overlays(isinhands, icon_file)
+/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file)
. = ..()
if(isinhands)
var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
@@ -354,70 +334,19 @@
blade_inhand.color = light_color
. += blade_inhand
-/obj/item/twohanded/hypereutactic/examine(mob/user)
+/obj/item/twohanded/dualsaber/hypereutactic/examine(mob/user)
..()
- to_chat(user, "Alt-click to recolor it.")
+ if(!hacked)
+ to_chat(user, "Alt-click to recolor it.")
-////////// stuff beneath this is all taken from the desword //////////// wow very professional such OOP wow
-
-/obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user)
- if(user.has_dna())
- if(user.dna.check_mutation(HULK))
- to_chat(user, "You grip the blade too hard and accidentally close it!")
- unwield()
- return
- ..()
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && (wielded) && prob(40))
- impale(user)
- return
-
-/obj/item/twohanded/hypereutactic/Destroy()
- STOP_PROCESSING(SSobj, src)
+/obj/item/twohanded/dualsaber/hypereutactic/rainbow_process()
. = ..()
-
-/obj/item/twohanded/hypereutactic/proc/impale(mob/living/user)
- to_chat(user, "You spin around a bit before losing your balance and impaling yourself on [src].")
- if (force_wielded)
- user.take_bodypart_damage(20,25)
- else
- user.adjustStaminaLoss(25)
-
-/obj/item/twohanded/hypereutactic/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(wielded)
- return ..()
- return FALSE
-
-/obj/item/twohanded/hypereutactic/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
- if(wielded)
- to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!")
- return TRUE
-
-/obj/item/twohanded/hypereutactic/process()
- if(wielded)
- open_flame()
- else
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/twohanded/hypereutactic/IsReflect()
- if(wielded)
- return TRUE
-
-/obj/item/twohanded/hypereutactic/ignition_effect(atom/A, mob/user)
- // same as /obj/item/melee/transforming/energy, mostly
- if(!wielded)
- return ""
- var/in_mouth = ""
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(C.wear_mask == src)
- in_mouth = ", barely missing their nose"
- . = "[user] swings [user.p_their()] [src][in_mouth]. [user.p_they()] light[user.p_s()] [A] in the process."
- playsound(loc, hitsound, get_clamped_volume(), 1, -1)
- add_fingerprint(user)
+ update_icon()
+ update_light()
////////////////// TOY VERSION /////////////////////////////
-/obj/item/twohanded/hypereutactic/toy
+/obj/item/twohanded/dualsaber/hypereutactic/toy
name = "\improper DX Hyper-Euplastic LightSword"
desc = "A supermassive toy envisioned to cleave the very fabric of space and time itself in twain. Realistic visuals and sounds! Ages 8 and up."
force = 0
@@ -427,11 +356,13 @@
force_unwielded = 0
force_wielded = 0
attack_verb = list("attacked", "struck", "hit")
+ total_mass_on = TOTAL_MASS_TOY_SWORD
+ slowdown_wielded = 0
-/obj/item/twohanded/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+/obj/item/twohanded/dualsaber/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
return FALSE
-/obj/item/twohanded/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
+/obj/item/twohanded/dualsaber/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
return FALSE
//////// Tatortot NEB /////////////// (same stats as regular esword)
@@ -455,17 +386,7 @@
//RAINBOW MEMES
-/obj/item/twohanded/hypereutactic/toy/rainbow
+/obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander"
desc = "A custom-built toy with fancy rainbow lights built-in."
- var/list/rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
-
-/obj/item/twohanded/hypereutactic/toy/rainbow/process()
- . = ..()
- var/set_color = pick(rainbow_colors)
- light_color = set_color
- update_light()
- update_icon()
-
-/obj/item/twohanded/hypereutactic/toy/rainbow/AltClick(mob/living/user)
- return
+ hacked = TRUE
diff --git a/modular_citadel/code/game/objects/items/melee/misc.dm b/modular_citadel/code/game/objects/items/melee/misc.dm
deleted file mode 100644
index 6a53adcc1f..0000000000
--- a/modular_citadel/code/game/objects/items/melee/misc.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-/obj/item/melee/classic_baton
- var/last_hit = 0
- var/stun_stam_cost_coeff = 1.25
- var/hardstun_ds = 1
- var/softstun_ds = 0
- var/stam_dmg = 30
- cooldown = 20
- total_mass = 3.75
-
-/obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user)
- if(!on)
- return ..()
-
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes batons unusuable in stamina softcrit
- to_chat(user, "You're too exhausted for that.")//CIT CHANGE - ditto
- return //CIT CHANGE - ditto
-
- add_fingerprint(user)
- if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
- to_chat(user, "You club yourself over the head.")
- user.Knockdown(60 * force)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
- else
- user.take_bodypart_damage(2*force)
- return
- if(iscyborg(target))
- ..()
- return
- if(!isliving(target))
- return
- if (user.a_intent == INTENT_HARM)
- if(!..())
- return
- if(!iscyborg(target))
- return
- else
- if(last_hit + cooldown < world.time)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if (H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
- return
- if(check_martial_counter(H, user))
- return
- playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1)
- target.Knockdown(softstun_ds, TRUE, FALSE, hardstun_ds, stam_dmg)
- log_combat(user, target, "stunned", src)
- src.add_fingerprint(user)
- target.visible_message("[user] has knocked down [target] with [src]!", \
- "[user] has knocked down [target] with [src]!")
- if(!iscarbon(user))
- target.LAssailant = null
- else
- target.LAssailant = user
- last_hit = world.time
- user.adjustStaminaLossBuffered(getweight())//CIT CHANGE - makes swinging batons cost stamina
diff --git a/modular_citadel/code/game/objects/items/melee/transforming.dm b/modular_citadel/code/game/objects/items/melee/transforming.dm
deleted file mode 100644
index 46610f4e54..0000000000
--- a/modular_citadel/code/game/objects/items/melee/transforming.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/obj/item/melee/transforming
- var/total_mass_on //Total mass in ounces when transformed. Primarily for balance purposes. Don't think about it too hard.
-
-/obj/item/melee/transforming/getweight()
- if(total_mass && total_mass_on)
- if(active)
- return max(total_mass_on,MIN_MELEE_STAMCOST)
- else
- return max(total_mass,MIN_MELEE_STAMCOST)
- else
- return initial(w_class)*1.25
-
-/obj/item/melee/transforming/cleaving_saw
- total_mass = 2.75
- total_mass_on = 5
diff --git a/modular_citadel/code/game/objects/items/robot/robot_upgrades.dm b/modular_citadel/code/game/objects/items/robot/robot_upgrades.dm
deleted file mode 100644
index 5f65b97173..0000000000
--- a/modular_citadel/code/game/objects/items/robot/robot_upgrades.dm
+++ /dev/null
@@ -1,29 +0,0 @@
-// Citadel's Vtech Controller
-/obj/effect/proc_holder/silicon/cyborg/vtecControl
- name = "vTec Control"
- desc = "Allows finer-grained control of the vTec speed boost."
- action_icon = 'icons/mob/actions.dmi'
- action_icon_state = "Chevron_State_0"
-
- var/currentState = 0
- var/maxReduction = 2
-
-
-/obj/effect/proc_holder/silicon/cyborg/vtecControl/Click(mob/living/silicon/robot/user)
- var/mob/living/silicon/robot/self = usr
-
- currentState = (currentState + 1) % 3
-
- if(usr)
- switch(currentState)
- if (0)
- self.speed = maxReduction
- if (1)
- self.speed -= maxReduction*0.5
- if (2)
- self.speed -= maxReduction*1.25
-
- action.button_icon_state = "Chevron_State_[currentState]"
- action.UpdateButtonIcon()
-
- return
diff --git a/modular_citadel/code/game/objects/items/storage/firstaid.dm b/modular_citadel/code/game/objects/items/storage/firstaid.dm
index 6ff1bfbe2c..125330a9b9 100755
--- a/modular_citadel/code/game/objects/items/storage/firstaid.dm
+++ b/modular_citadel/code/game/objects/items/storage/firstaid.dm
@@ -103,6 +103,22 @@
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src)
+/obj/item/storage/hypospraykit/enlarge
+ name = "organomegaly trauma hypospray kit"
+ icon_state = "enlarge-mini"
+ item_state = "firstaid-brute"
+
+/obj/item/storage/hypospraykit/enlarge/PopulateContents()
+ if(empty)
+ return
+ new /obj/item/hypospray/mkii/enlarge(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction(src)
+
/obj/item/storage/hypospraykit/brute
name = "brute trauma hypospray kit"
icon_state = "brute-mini"
diff --git a/modular_citadel/code/game/objects/items/stunsword.dm b/modular_citadel/code/game/objects/items/stunsword.dm
index 1262b0018a..7a5398f7d2 100644
--- a/modular_citadel/code/game/objects/items/stunsword.dm
+++ b/modular_citadel/code/game/objects/items/stunsword.dm
@@ -7,6 +7,14 @@
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
+/obj/item/melee/baton/stunsword/get_belt_overlay()
+ if(istype(loc, /obj/item/storage/belt/sabre))
+ return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "stunsword")
+ return ..()
+
+/obj/item/melee/baton/stunsword/get_worn_belt_overlay(icon_file)
+ return mutable_appearance(icon_file, "-stunsword")
+
/obj/item/ssword_kit
name = "stunsword kit"
desc = "a modkit for making a stunbaton into a stunsword"
diff --git a/modular_citadel/code/game/objects/structures/beds_chairs/sofa.dm b/modular_citadel/code/game/objects/structures/beds_chairs/sofa.dm
deleted file mode 100644
index 69d0f4b8d8..0000000000
--- a/modular_citadel/code/game/objects/structures/beds_chairs/sofa.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/obj/structure/chair/sofa
- name = "old ratty sofa"
- icon_state = "sofamiddle"
- icon = 'icons/obj/sofa.dmi'
- buildstackamount = 1
-
-/obj/structure/chair/sofa/left
- icon_state = "sofaend_left"
-/obj/structure/chair/sofa/right
- icon_state = "sofaend_right"
-/obj/structure/chair/sofa/corner
- icon_state = "sofacorner"
\ No newline at end of file
diff --git a/modular_citadel/code/init.dm b/modular_citadel/code/init.dm
index 2c2b5b811f..a85c3a249c 100644
--- a/modular_citadel/code/init.dm
+++ b/modular_citadel/code/init.dm
@@ -3,23 +3,3 @@
/proc/cit_initialize()
load_mentors()
initialize_global_loadout_items()
-
- //body parts and things
- init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, GLOB.mam_tails_animated_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, GLOB.xeno_head_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_tail, GLOB.xeno_tail_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/screen, GLOB.ipc_screens_list, roundstart = TRUE)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/antenna, GLOB.ipc_antennas_list, roundstart = TRUE)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
- for(var/K in GLOB.cock_shapes_list)
- var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
- GLOB.cock_shapes_icons[K] = value.icon_state
- init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
- GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
diff --git a/modular_citadel/code/modules/admin/chat_commands.dm b/modular_citadel/code/modules/admin/chat_commands.dm
index 918b1dda5a..501e0fa25a 100644
--- a/modular_citadel/code/modules/admin/chat_commands.dm
+++ b/modular_citadel/code/modules/admin/chat_commands.dm
@@ -20,3 +20,20 @@
/datum/tgs_chat_command/despacito/Run()
return "https://www.youtube.com/watch?v=kJQP7kiw5Fk"
+
+/datum/tgs_chat_command/poly
+ name = "poly"
+ help_text = "The Lewder, more applicable Poly speak for Citadel Station 13."
+ var/list/speech_buffer
+
+/datum/tgs_chat_command/poly/Run()
+ LAZYINITLIST(speech_buffer) //I figure this is just safe to do for everything at this point
+ if(length(speech_buffer)) //Let's not look up the whole json EVERY TIME, just the first time.
+ return "[pick(speech_buffer)]"
+ else
+ var/json_file = file("data/npc_saves/Poly.json")
+ if(!fexists(json_file))
+ return "**BAWWWWWK!** LEAVE THE HEADSET! ***BAWKKKKK!!***"
+ var/list/json = json_decode(file2text(json_file))
+ speech_buffer = json["phrases"]
+ return "[pick(speech_buffer)]"
diff --git a/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm b/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
deleted file mode 100644
index 6afa92af65..0000000000
--- a/modular_citadel/code/modules/antagonists/cit_crewobjectives.dm
+++ /dev/null
@@ -1,35 +0,0 @@
-/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
- for(var/datum/mind/crewMind in SSticker.minds)
- if(prob(5) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
- generate_miscreant_objectives(crewMind)
- else
- if(CONFIG_GET(flag/allow_crew_objectives))
- generate_individual_objectives(crewMind)
- return
-
-/datum/controller/subsystem/ticker/proc/generate_individual_objectives(var/datum/mind/crewMind)
- if(!(CONFIG_GET(flag/allow_crew_objectives)))
- return
- if(!crewMind)
- return
- if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
- return
- if(!crewMind.assigned_role)
- return
- var/list/validobjs = crewobjjobs["[ckey(crewMind.assigned_role)]"]
- if(!validobjs || !validobjs.len)
- return
- var/selectedObj = pick(validobjs)
- var/datum/objective/crew/newObjective = new selectedObj
- if(!newObjective)
- return
- newObjective.owner = crewMind
- crewMind.objectives += newObjective
- to_chat(crewMind, "As a part of Nanotrasen's anti-tide efforts, you have been assigned an optional objective. It will be checked at the end of the shift. Performing traitorous acts in pursuit of your objective may result in termination of your employment.")
- to_chat(crewMind, "Your optional objective: [newObjective.explanation_text]")
-
-/datum/objective/crew/
- var/jobs = ""
- explanation_text = "Yell on the development discussion channel on Citadels discord if this ever shows up. Something just broke here, dude"
-
-/datum/objective/crew/proc/setup()
diff --git a/modular_citadel/code/modules/antagonists/cit_miscreants.dm b/modular_citadel/code/modules/antagonists/cit_miscreants.dm
deleted file mode 100644
index 5726167820..0000000000
--- a/modular_citadel/code/modules/antagonists/cit_miscreants.dm
+++ /dev/null
@@ -1,52 +0,0 @@
-/datum/controller/subsystem/ticker/proc/generate_miscreant_objectives(var/datum/mind/crewMind)
- if(!GLOB.miscreants_allowed)
- return
- if(!crewMind)
- return
- if(!crewMind.current || !crewMind.objectives || crewMind.special_role)
- return
- if(!crewMind.assigned_role)
- return
- if(!(ROLE_MISCREANT in crewMind.current.client.prefs.be_special))
- return
- if(jobban_isbanned(crewMind, "Syndicate"))
- return
- var/list/objectiveTypes = miscreantobjlist
- if(!objectiveTypes.len)
- return
- var/selectedType = pick(objectiveTypes)
- var/datum/objective/miscreant/newObjective = new selectedType
- if(!newObjective)
- return
- newObjective.owner = crewMind
- crewMind.objectives += newObjective
- crewMind.special_role = "miscreant"
- to_chat(crewMind, "You are a Miscreant.")
- to_chat(crewMind, "Pursuing your objective is entirely optional, as the completion of your objective is unable to be tracked. Performing traitorous acts not directly related to your objective may result in permanent termination of your employment.")
- to_chat(crewMind, "Your objective: [newObjective.explanation_text]")
-
-/datum/objective/miscreant
- explanation_text = "Something broke. Horribly. Dear god, im so sorry. Yell about this in the development discussion channel of citadels discord."
-
-/* Goon's Miscreant Objectives */
-
-
-/datum/objective/miscreant/incompetent
- explanation_text = "Be as useless and incompetent as possible without getting killed."
-
-/datum/objective/miscreant/litterbug
- explanation_text = "Make a huge mess wherever you go."
-
-/datum/objective/miscreant/creepy
- explanation_text = "Sneak around looking as suspicious as possible without actually doing anything illegal."
-
-/datum/objective/miscreant/whiny
- explanation_text = "Complain incessantly about every minor issue you find."
-
-/* Citadel's Miscreant Objectives */
-
-/datum/objective/miscreant/immersions
- explanation_text = "Act as uncharacteristic as you possibly can." // corrected from "Act as out of character as you can" people thought it meant to just ooc in ic
-
-/datum/objective/miscreant/cargonia
- explanation_text = "Attempt to establish independence of your department."
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
deleted file mode 100644
index 010337b49f..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_cargo.dm
+++ /dev/null
@@ -1,81 +0,0 @@
-/* CARGO OBJECTIVES */
-
-/datum/objective/crew/petsplosion
- explanation_text = "Ensure there are at least (If you see this, yell on citadels discord in the development discussion channel) pets on the station by the end of the shift. Interpret this as you wish."
- jobs = "quartermaster,cargotechnician"
-
-/datum/objective/crew/petsplosion/New()
- . = ..()
- target_amount = rand(10,30)
- update_explanation_text()
-
-/datum/objective/crew/petsplosion/update_explanation_text()
- . = ..()
- explanation_text = "Ensure there are at least [target_amount] pets on the station by the end of the shift. Interpret this as you wish."
-
-/datum/objective/crew/petsplosion/check_completion()
- var/petcount = target_amount
- for(var/mob/living/simple_animal/pet/P in GLOB.mob_list)
- if(!(P.stat == DEAD))
- if(P.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(P)])
- petcount--
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(!(H.stat == DEAD))
- if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
- if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar))
- petcount--
- if(petcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/points //ported from old hippie
- explanation_text = "Make sure the station has at least (Something broke, report this to the development discussion channel of citadels discord) supply points at the end of the shift."
- jobs = "quartermaster,cargotechnician"
-
-/datum/objective/crew/points/New()
- . = ..()
- target_amount = rand(25000,100000)
- update_explanation_text()
-
-/datum/objective/crew/points/update_explanation_text()
- . = ..()
- explanation_text = "Make sure the station has at least [target_amount] supply points at the end of the shift."
-
-/datum/objective/crew/points/check_completion()
- if(SSshuttle.points >= target_amount)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/bubblegum
- explanation_text = "Ensure Bubblegum is dead at the end of the shift."
- jobs = "shaftminer"
-
-/datum/objective/crew/bubblegum/check_completion()
- for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list)
- if(!(B.stat == DEAD))
- return FALSE
- return TRUE
-
-/datum/objective/crew/fatstacks //ported from old hippie
- explanation_text = "Have at least (something broke, report this to the development discussion channel of citadels discord) mining points on your ID at the end of the shift."
- jobs = "shaftminer"
-
-/datum/objective/crew/fatstacks/New()
- . = ..()
- target_amount = rand(15000,50000)
- update_explanation_text()
-
-/datum/objective/crew/fatstacks/update_explanation_text()
- . = ..()
- explanation_text = "Have at least [target_amount] mining points on your ID at the end of the shift."
-
-/datum/objective/crew/fatstacks/check_completion()
- if(owner && owner.current)
- var/mob/living/carbon/human/H = owner.current
- var/obj/item/card/id/theID = H.get_idcard()
- if(istype(theID))
- if(theID.mining_points >= target_amount)
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
deleted file mode 100644
index 491285e9c4..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_civilian.dm
+++ /dev/null
@@ -1,249 +0,0 @@
-/* CIVILIAN OBJECTIVES */
-
-/datum/objective/crew/druglordbot //ported from old Hippie with adjustments
- var/targetchem = "none"
- var/datum/reagent/chempath
- explanation_text = "Have at least (somethin broke here) harvested plants containing (report this on the development discussion channel of citadel's discord) when the shift ends."
- jobs = "botanist"
-
-/datum/objective/crew/druglordbot/New()
- . = ..()
- target_amount = rand(3,20)
- var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingadrenaline, /datum/reagent/medicine/changelinghaste)
- var/drugs = typesof(/datum/reagent/drug) - blacklist
- var/meds = typesof(/datum/reagent/medicine) - blacklist
- var/chemlist = drugs + meds
- chempath = pick(chemlist)
- targetchem = initial(chempath.id)
- update_explanation_text()
-
-/datum/objective/crew/druglordbot/update_explanation_text()
- . = ..()
- explanation_text = "Have at least [target_amount] harvested plants containing [initial(chempath.name)] when the shift ends."
-
-/datum/objective/crew/druglordbot/check_completion()
- var/pillcount = target_amount
- if(owner && owner.current)
- if(owner.current.contents)
- for(var/obj/item/reagent_containers/food/snacks/grown/P in owner.current.get_contents())
- if(P.reagents.has_reagent(targetchem))
- pillcount--
- if(pillcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/foodhoard
- var/datum/crafting_recipe/food/targetfood
- var/obj/item/reagent_containers/food/foodpath
- explanation_text = "Personally deliver at least (yo something broke) (report this to the developer discussion channel in citadels discord)s to Centcom."
- jobs = "cook"
-
-/datum/objective/crew/foodhoard/New()
- . = ..()
- target_amount = rand(2,10)
- var/blacklist = list(/datum/crafting_recipe/food, /datum/crafting_recipe/food/cak)
- var/possiblefoods = typesof(/datum/crafting_recipe/food) - blacklist
- targetfood = pick(possiblefoods)
- foodpath = initial(targetfood.result)
- update_explanation_text()
-
-/datum/objective/crew/foodhoard/update_explanation_text()
- . = ..()
- explanation_text = "Personally deliver at least [target_amount] [initial(foodpath.name)]s to Centcom."
-
-/datum/objective/crew/foodhoard/check_completion()
- if(owner && owner.current && owner.current.check_contents_for(foodpath) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/responsibility
- explanation_text = "Make sure nobody dies with alcohol poisoning."
- jobs = "bartender"
-
-/datum/objective/crew/responsibility/check_completion()
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(H.stat == DEAD && H.drunkenness >= 80)
- if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
- return FALSE
- return TRUE
-
-/datum/objective/crew/clean //ported from old Hippie
- var/list/areas = list()
- var/hardmode = FALSE
- explanation_text = "Ensure sure that (Yo, something broke. Yell about this in citadels devlopmeent discussion channel.) remain spotless at the end of the shift."
- jobs = "janitor"
-
-/datum/objective/crew/clean/New()
- . = ..()
- if(prob(1))
- hardmode = TRUE
- var/list/blacklistnormal = list(typesof(/area/space) - typesof(/area/lavaland) - typesof(/area/mine) - typesof(/area/ai_monitored/turret_protected) - typesof(/area/tcommsat))
- var/list/blacklisthard = list(typesof(/area/lavaland) - typesof(/area/mine))
- var/list/possibleareas = list()
- if(hardmode)
- possibleareas = GLOB.teleportlocs - /area - blacklisthard
- else
- possibleareas = GLOB.teleportlocs - /area - blacklistnormal
- for(var/i in 1 to rand(1,6))
- areas |= pick_n_take(possibleareas)
- update_explanation_text()
-
-/datum/objective/crew/clean/update_explanation_text()
- . = ..()
- explanation_text = "Ensure that the"
- for(var/i in 1 to areas.len)
- var/area/A = areas[i]
- explanation_text += " [A]"
- if(i != areas.len && areas.len >= 3)
- explanation_text += ","
- if(i == areas.len - 1)
- explanation_text += "and"
- explanation_text += " [(areas.len ==1) ? "is completely" : "are [(areas.len == 2) ? "completely" : "all"]"] clean at the end of the shift."
- if(hardmode)
- explanation_text += " Chop-chop."
-
-/datum/objective/crew/clean/check_completion()
- for(var/area/A in areas)
- for(var/obj/effect/decal/cleanable/C in area_contents(A))
- if(C && C.alpha >= 150)
- return FALSE
- return TRUE
-
-/datum/objective/crew/slipster //ported from old Hippie with adjustments
- explanation_text = "Slip at least (Yell on citadel's development discussion channel if you see this) different people with your PDA, and have it on you at the end of the shift."
- jobs = "clown"
-
-/datum/objective/crew/slipster/New()
- . = ..()
- target_amount = rand(5, 20)
- update_explanation_text()
-
-/datum/objective/crew/slipster/update_explanation_text()
- . = ..()
- explanation_text = "Slip at least [target_amount] different people with your PDA, and have it on you at the end of the shift."
-
-/datum/objective/crew/slipster/check_completion()
- var/list/uniqueslips = list()
- if(owner && owner.current)
- for(var/obj/item/pda/clown/PDA in owner.current.get_contents())
- for(var/mob/living/carbon/human/H in PDA.slipvictims)
- uniqueslips |= H
- if(uniqueslips.len >= target_amount)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/vow //ported from old Hippie
- explanation_text = "Never break your vow of silence."
- jobs = "mime"
-
-/datum/objective/crew/vow/check_completion()
- if(owner && owner.current)
- var/list/say_log = owner.current.logging[INDIVIDUAL_SAY_LOG]
- if(say_log.len > 0)
- return FALSE
- return TRUE
-
-/datum/objective/crew/nullrod
- explanation_text = "Don't lose your holy rod."
- jobs = "chaplain"
-
-/datum/objective/crew/nullrod/check_completion()
- if(owner && owner.current)
- for(var/nullrodtypes in typesof(/obj/item/nullrod))
- if(owner.current.check_contents_for(nullrodtypes))
- return TRUE
- if(owner.current.getorgan(/obj/item/organ/genital/penis))
- return TRUE
- return FALSE
-
-/datum/objective/crew/reporter //ported from old hippie
- var/charcount = 100
- explanation_text = "Publish at least (Yo something broke) articles containing at least (Report this to Citadels development channel) characters."
- jobs = "curator"
-
-/datum/objective/crew/reporter/New()
- . = ..()
- target_amount = rand(2,10)
- charcount = rand(20,250)
- update_explanation_text()
-
-/datum/objective/crew/reporter/update_explanation_text()
- . = ..()
- explanation_text = "Publish at least [target_amount] articles containing at least [charcount] characters."
-
-/datum/objective/crew/reporter/check_completion()
- if(owner && owner.current)
- var/ownername = "[ckey(owner.current.real_name)][ckey(owner.assigned_role)]"
- for(var/datum/newscaster/feed_channel/chan in GLOB.news_network.network_channels)
- for(var/datum/newscaster/feed_message/msg in chan.messages)
- if(ckey(msg.returnAuthor()) == ckey(ownername))
- if(length(msg.returnBody()) >= charcount)
- target_amount--
- if(target_amount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/pwrgame //ported from Goon with adjustments
- var/obj/item/clothing/targettidegarb
- explanation_text = "Get your grubby hands on a (Dear god something broke. Report this to Citadel's development dicussion channel)."
- jobs = "assistant"
-
-/datum/objective/crew/pwrgame/New()
- . = ..()
- var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask)
- if(prob(10))
- muhvalids += list(/obj/item/clothing/suit/space)
- targettidegarb = pick(muhvalids)
- update_explanation_text()
-
-/datum/objective/crew/pwrgame/update_explanation_text()
- . = ..()
- explanation_text = "Get your grubby hands on a [initial(targettidegarb.name)]."
-/* DM is not a sane language in any way, shape, or form. If anyone wants to try to get this bit functioning proper, I hold no responsibility for broken keyboards.
- if(owner && owner.current)
- var/mob/living/carbon/human/H = owner.current
- if(H && H.dna && H.dna.species && H.dna.species.id)
- explanation_text = "Get your "
- if(H.dna.species.id == "avian")
- explanation_text += "scratchy claws "
- else if(H.dna.species.id == "mammal")
- explanation_text += "dirty paws "
- else if(H.dna.species.id == "aquatic")
- explanation_text += "fishy hands "
- else if(H.dna.species.id == "xeno")
- explanation_text += "weird claws "
- else if(H.dna.species.id == "guilmon")
- explanation_text += "digital claws "
- else if(H.dna.species.id == "lizard")
- explanation_text += "slimy claws "
- else if(H.dna.species.id == "datashark")
- explanation_text += "glitchy hands "
- else if(H.dna.species.id == "insect")
- explanation_text += "gross grabbers "
- else
- explanation_text += "grubby hands "
- explanation_text += "on a space suit." replace this if you're making this monstrosity work */
-
-/datum/objective/crew/pwrgame/check_completion()
- if(owner && owner.current)
- for(var/tidegarbtypes in typesof(targettidegarb))
- if(owner.current.check_contents_for(tidegarbtypes))
- return TRUE
- return FALSE
-
-/datum/objective/crew/promotion //ported from Goon
- explanation_text = "Have a non-assistant ID registered to you at the end of the shift."
- jobs = "assistant"
-
-/datum/objective/crew/promotion/check_completion()
- if(owner && owner.current)
- var/mob/living/carbon/human/H = owner.current
- var/obj/item/card/id/theID = H.get_idcard()
- if(istype(theID))
- if(!(H.get_assignment() == "Assistant") && !(H.get_assignment() == "No id") && !(H.get_assignment() == "No job"))
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
deleted file mode 100644
index f01c887c9f..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_command.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/* COMMAND OBJECTIVES */
-
-/datum/objective/crew/caphat //Ported from Goon
- explanation_text = "Don't lose your hat."
- jobs = "captain"
-
-/datum/objective/crew/caphat/check_completion()
- if(owner && owner.current && owner.current.check_contents_for(/obj/item/clothing/head/caphat))
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/datfukkendisk //Ported from old Hippie
- explanation_text = "Defend the nuclear authentication disk at all costs, and be the one to personally deliver it to Centcom."
- jobs = "captain" //give this to other heads at your own risk.
-
-/datum/objective/crew/datfukkendisk/check_completion()
- if(owner && owner.current && owner.current.check_contents_for(/obj/item/disk/nuclear) && SSshuttle.emergency.shuttle_areas[get_area(owner.current)])
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/ian //Ported from old Hippie
- explanation_text = "Defend Ian at all costs, and ensure he gets delivered to Centcom at the end of the shift."
- jobs = "headofpersonnel"
-
-/datum/objective/crew/ian/check_completion()
- if(owner && owner.current)
- for(var/mob/living/simple_animal/pet/dog/corgi/Ian/goodboy in GLOB.mob_list)
- if(goodboy.stat != DEAD && SSshuttle.emergency.shuttle_areas[get_area(goodboy)])
- return TRUE
- return FALSE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
deleted file mode 100644
index 44d961e9c3..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_engineering.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/* ENGINEERING OBJECTIVES */
-
-/datum/objective/crew/integrity //ported from old Hippie
- explanation_text = "Ensure the station's integrity rating is at least (Yo something broke, yell on the development discussion channel of citadels discord about this)% when the shift ends."
- jobs = "chiefengineer,stationengineer"
-
-/datum/objective/crew/integrity/New()
- . = ..()
- target_amount = rand(60,95)
- update_explanation_text()
-
-/datum/objective/crew/integrity/update_explanation_text()
- . = ..()
- explanation_text = "Ensure the station's integrity rating is at least [target_amount]% when the shift ends."
-
-/datum/objective/crew/integrity/check_completion()
- var/datum/station_state/end_state = new /datum/station_state()
- end_state.count()
- var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100)
- if(!SSticker.mode.station_was_nuked && station_integrity >= target_amount)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/poly
- explanation_text = "Make sure Poly keeps his headset, and stays alive until the end of the shift."
- jobs = "chiefengineer"
-
-/datum/objective/crew/poly/check_completion()
- for(var/mob/living/simple_animal/parrot/Poly/dumbbird in GLOB.mob_list)
- if(!(dumbbird.stat == DEAD) && dumbbird.ears)
- if(istype(dumbbird.ears, /obj/item/radio/headset))
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
deleted file mode 100644
index aad6e95df4..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_medical.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-/* MEDICAL OBJECTIVES */
-
-/datum/objective/crew/morgue //Ported from old Hippie
- explanation_text = "Ensure there are no corpses on the station outside of the morgue when the shift ends."
- jobs = "chiefmedicalofficer,geneticist,medicaldoctor"
-
-/datum/objective/crew/morgue/check_completion()
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(H.stat == DEAD && H.z == SSmapping.station_start)
- if(get_area(H) != /area/medical/morgue)
- return FALSE
- return TRUE
-
-/datum/objective/crew/chems //Ported from old Hippie
- var/targetchem = "none"
- var/datum/reagent/chempath
- explanation_text = "Have (yell about this in the development discussion channel of citadel's discord, something broke) in your bloodstream when the shift ends."
- jobs = "chiefmedicalofficer,chemist"
-
-/datum/objective/crew/chems/New()
- . = ..()
- var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol, /datum/reagent/medicine, /datum/reagent/medicine/adminordrazine, /datum/reagent/medicine/adminordrazine/nanites, /datum/reagent/medicine/mine_salve, /datum/reagent/medicine/omnizine, /datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/earthsblood, /datum/reagent/medicine/strange_reagent, /datum/reagent/medicine/miningnanites, /datum/reagent/medicine/changelingadrenaline, /datum/reagent/medicine/changelinghaste)
- var/drugs = typesof(/datum/reagent/drug) - blacklist
- var/meds = typesof(/datum/reagent/medicine) - blacklist
- var/chemlist = drugs + meds
- chempath = pick(chemlist)
- targetchem = initial(chempath.id)
- update_explanation_text()
-
-/datum/objective/crew/chems/update_explanation_text()
- . = ..()
- explanation_text = "Have [initial(chempath.name)] in your bloodstream when the shift ends."
-
-/datum/objective/crew/chems/check_completion()
- if(owner.current)
- if(!owner.current.stat == DEAD && owner.current.reagents)
- if(owner.current.reagents.has_reagent(targetchem))
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/druglordchem //ported from old Hippie with adjustments
- var/targetchem = "none"
- var/datum/reagent/chempath
- var/chemamount = 0
- explanation_text = "Have at least (somethin broke here) pills containing at least (like really broke) units of(report this on the development discussion channel of citadel's discord) when the shift ends."
- jobs = "chemist"
-
-/datum/objective/crew/druglordchem/New()
- . = ..()
- target_amount = rand(5,50)
- chemamount = rand(1,20)
- var/blacklist = list(/datum/reagent/drug, /datum/reagent/drug/nicotine, /datum/reagent/drug/menthol)
- var/drugs = typesof(/datum/reagent/drug) - blacklist
- var/chemlist = drugs
- chempath = pick(chemlist)
- targetchem = initial(chempath.id)
- update_explanation_text()
-
-/datum/objective/crew/druglordchem/update_explanation_text()
- . = ..()
- explanation_text = "Have at least [target_amount] pills containing at least [chemamount] units of [initial(chempath.name)] when the shift ends."
-
-/datum/objective/crew/druglordchem/check_completion()
- var/pillcount = target_amount
- if(owner.current)
- if(owner.current.contents)
- for(var/obj/item/reagent_containers/pill/P in owner.current.get_contents())
- if(P.reagents.has_reagent(targetchem, chemamount))
- pillcount--
- if(pillcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/noinfections
- explanation_text = "Make sure there are no crew members with harmful diseases at the end of the shift."
- jobs = "virologist"
-
-/datum/objective/crew/noinfections/check_completion()
- for(var/mob/living/carbon/human/H in GLOB.mob_list)
- if(!H.stat == DEAD)
- if(H.z == SSmapping.station_start || SSshuttle.emergency.shuttle_areas[get_area(H)])
- if(H.check_virus() == 2)
- return FALSE
- return TRUE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
deleted file mode 100644
index fb260583fd..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_science.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/* SCIENCE OBJECTIVES */
-
-/datum/objective/crew/cyborgs //Ported from old Hippie
- explanation_text = "Ensure there are at least (Yo something broke here, yell on citadel's development discussion channel about this) functioning cyborgs when the shift ends."
- jobs = "researchdirector,roboticist"
-
-/datum/objective/crew/cyborgs/New()
- . = ..()
- target_amount = rand(3,10)
- update_explanation_text()
-
-/datum/objective/crew/cyborgs/update_explanation_text()
- . = ..()
- explanation_text = "Ensure there are at least [target_amount] functioning cyborgs when the shift ends."
-
-/datum/objective/crew/cyborgs/check_completion()
- var/borgcount = target_amount
- for(var/mob/living/silicon/robot/R in GLOB.alive_mob_list)
- if(!(R.stat == DEAD))
- borgcount--
- if(borgcount <= 0)
- return TRUE
- else
- return FALSE
-
-/datum/objective/crew/research //inspired by old hippie's research level objective. should hopefully be compatible with techwebs when that gets finished. hopefully. should be easy to update in the event that it is incompatible with techwebs.
- var/datum/design/targetdesign
- explanation_text = "Make sure the research required to produce a (something broke, yell on citadel's development discussion channel about this) is available on the R&D server by the end of the shift."
- jobs = "researchdirector,scientist"
-
-/datum/objective/crew/research/New()
- . = ..()
- targetdesign = pick(subtypesof(/datum/design))
- update_explanation_text()
-
-/datum/objective/crew/research/update_explanation_text()
- . = ..()
- explanation_text = "Make sure the research required to produce a [initial(targetdesign.name)] is available on the R&D server by the end of the shift."
-
-/datum/objective/crew/research/check_completion()
- for(var/obj/machinery/rnd/server/S in GLOB.machines)
- if(S && S.stored_research)
- if(S.stored_research.researched_designs[initial(targetdesign.id)])
- return TRUE
- return FALSE
diff --git a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm b/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
deleted file mode 100644
index 8906c268d2..0000000000
--- a/modular_citadel/code/modules/antagonists/crew_objectives/cit_crewobjectives_security.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/* SECURITY OBJECTIVES */
-
-/datum/objective/crew/enjoyyourstay
- explanation_text = "Enforce Space Law to the best of your ability."
- jobs = "headofsecurity,securityofficer,warden,detective"
-
-/datum/objective/crew/enjoyyourstay/check_completion()
- if(owner && owner.current)
- if(owner.current.stat != DEAD)
- return TRUE
- return FALSE
-
-/datum/objective/crew/justicecrew
- explanation_text = "Ensure there are no innocent crew members in the brig when the shift ends."
- jobs = "lawyer"
-
-/datum/objective/crew/justicecrew/check_completion()
- if(owner && owner.current)
- for(var/datum/mind/M in SSticker.minds)
- if(M.current && isliving(M.current))
- if(!M.special_role && !(M.assigned_role == "Security Officer") && !(M.assigned_role == "Detective") && !(M.assigned_role == "Head of Security") && !(M.assigned_role == "Lawyer") && !(M.assigned_role == "Warden") && get_area(M.current) != typesof(/area/security))
- return FALSE
- return TRUE
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 1223f0b616..3df2218766 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -5,20 +5,22 @@
icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
zone = "chest"
slot = "breasts"
- size = BREASTS_SIZE_DEF
+ w_class = 3
+ size = BREASTS_SIZE_DEF //SHOULD BE A LETTER, starts as a number...???
+ var/cached_size = null //for enlargement SHOULD BE A NUMBER
+ var/prev_size //For flavour texts SHOULD BE A LETTER
+ //var/breast_sizes = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "huge", "flat")
+ var/breast_values = list ("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0)
+ var/statuscheck = FALSE
fluid_id = "milk"
var/amount = 2
producing = TRUE
- shape = "pair"
+ shape = "Pair"
can_masturbate_with = TRUE
masturbation_verb = "massage"
can_climax = TRUE
fluid_transfer_factor = 0.5
-/obj/item/organ/genital/breasts/Initialize()
- . = ..()
- reagents.add_reagent(fluid_id, fluid_max_volume)
-
/obj/item/organ/genital/breasts/on_life()
if(QDELETED(src))
return
@@ -26,6 +28,14 @@
return
reagents.maximum_volume = fluid_max_volume
if(fluid_id && producing)
+ if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
+ fluid_rate = 0.1
+ else
+ fluid_rate = CUM_RATE
+ if(reagents.total_volume >= 5)
+ fluid_mult = 0.5
+ else
+ fluid_mult = 1
generate_milk()
/obj/item/organ/genital/breasts/proc/generate_milk()
@@ -45,10 +55,15 @@
desc = "You see three sets of breasts, running from their chest to their belly."
else
desc = "You see some breasts, they seem to be quite exotic."
- if (size)
- desc += " You estimate that they're [uppertext(size)]-cups."
- else
- desc += " You wouldn't measure them in cup sizes."
+ if(cached_size > 16)
+ desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(cached_size)]cm in diameter."
+ else if (!isnum(size))
+ if (size == "flat")
+ desc += " They're very small and flatchested, however."
+ else
+ desc += " You estimate that they're [uppertext(size)]-cups."
+ //string = "breasts_[lowertext(shape)]_[size]-s"
+
if(producing && aroused_state)
desc += " They're leaking [fluid_id]."
var/string
@@ -65,3 +80,57 @@
var/mob/living/carbon/human/H = owner
icon_state = sanitize_text(string)
H.update_genitals()
+
+ icon_state = sanitize_text(string)
+
+
+//Allows breasts to grow and change size, with sprite changes too.
+//maximum wah
+//Comical sizes slow you down in movement and actions.
+//Rediculous sizes makes you more cumbersome.
+//this is far too lewd wah
+
+/obj/item/organ/genital/breasts/update_size()//wah
+
+ if(!ishuman(owner) || !owner)
+ return
+ if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed
+ to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.")
+ src.Remove(owner)
+ switch(round(cached_size))
+ if(0) //If flatchested
+ size = "flat"
+ if(owner.has_status_effect(/datum/status_effect/chem/breast_enlarger))
+ owner.remove_status_effect(/datum/status_effect/chem/breast_enlarger)
+ statuscheck = FALSE
+ if(1 to 8) //If modest size
+ size = breast_values[round(cached_size)]
+ if(owner.has_status_effect(/datum/status_effect/chem/breast_enlarger))
+ owner.remove_status_effect(/datum/status_effect/chem/breast_enlarger)
+ statuscheck = FALSE
+ if(9 to 15) //If massive
+ size = breast_values[round(cached_size)]
+ if(!owner.has_status_effect(/datum/status_effect/chem/breast_enlarger))
+ owner.apply_status_effect(/datum/status_effect/chem/breast_enlarger)
+ statuscheck = TRUE
+ if(16 to INFINITY) //if Rediculous
+ size = cached_size
+
+ if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this.
+ if (prev_size == 0)
+ prev_size = "flat"
+ if(size == 0)//Bloody byond with it's counting from 1
+ size = "flat"
+ if(isnum(prev_size))
+ prev_size = breast_values[prev_size]
+ if (breast_values[size] > breast_values[prev_size])
+ to_chat(owner, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.")
+ var/mob/living/carbon/human/H = owner
+ H.Force_update_genitals()
+ else if ((breast_values[size] < breast_values[prev_size]) && (breast_values[size] > 0.5))
+ to_chat(owner, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.")
+ var/mob/living/carbon/human/H = owner
+ H.Force_update_genitals()
+ prev_size = size
+ else if (cached_size >= 16)
+ size = "huge"
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index 63d6834409..3abe7ecb1f 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -1,7 +1,7 @@
/obj/item/organ/genital
color = "#fcccb3"
w_class = WEIGHT_CLASS_NORMAL
- var/shape = "human"
+ var/shape = "Human" //Changed to be uppercase, let me know if this breaks everything..!!
var/sensitivity = AROUSAL_START_VALUE
var/list/genital_flags = list()
var/can_masturbate_with = FALSE
@@ -10,7 +10,7 @@
var/fluid_transfer_factor = 0.0 //How much would a partner get in them if they climax using this?
var/size = 2 //can vary between num or text, just used in icon_state strings
var/fluid_id = null
- var/fluid_max_volume = 50
+ var/fluid_max_volume = 15
var/fluid_efficiency = 1
var/fluid_rate = 1
var/fluid_mult = 1
@@ -172,6 +172,8 @@
P.length = dna.features["cock_length"]
P.girth_ratio = dna.features["cock_girth_ratio"]
P.shape = dna.features["cock_shape"]
+ P.prev_length = P.length
+ P.cached_length = P.length
P.update()
/mob/living/carbon/human/proc/give_balls()
@@ -214,8 +216,21 @@
else
B.color = "#[dna.features["breasts_color"]]"
B.size = dna.features["breasts_size"]
+ if(!isnum(B.size))
+ if(B.size == "flat")
+ B.cached_size = 0
+ B.prev_size = 0
+ else if (B.cached_size == "huge")
+ B.prev_size = "huge"
+ else
+ B.cached_size = B.breast_values[B.size]
+ B.prev_size = B.size
+ else
+ B.cached_size = B.size
+ B.prev_size = B.size
B.shape = dna.features["breasts_shape"]
B.fluid_id = dna.features["breasts_fluid"]
+ B.producing = dna.features["breasts_producing"]
B.update()
@@ -256,8 +271,8 @@
switch(layer)
if(GENITALS_BEHIND_LAYER)
return "BEHIND"
- if(GENITALS_ADJ_LAYER)
- return "ADJ"
+ /*if(GENITALS_ADJ_LAYER)
+ return "ADJ"*/
if(GENITALS_FRONT_LAYER)
return "FRONT"
@@ -279,27 +294,65 @@
if(src && !QDELETED(src))
dna.species.handle_genitals(src)
-/datum/species/proc/handle_genitals(mob/living/carbon/human/H)
+//fermichem procs
+/mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) //called in fermiChem
+ dna.species.handle_genitals(src)//should work.
+ //dna.species.handle_breasts(src)
+
+//Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours.
+/mob/living/carbon/human/proc/emergent_genital_call()
+ var/organCheck = FALSE
+ var/breastCheck = FALSE
+ var/willyCheck = FALSE
+ if(!canbearoused)
+ ADD_TRAIT(src, TRAIT_PHARMA, "pharma")//Prefs prevent unwanted organs.
+ return
+ for(var/obj/item/organ/O in internal_organs)
+ if(istype(O, /obj/item/organ/genital))
+ organCheck = TRUE
+ if(/obj/item/organ/genital/penis)
+ //dna.features["has_cock"] = TRUE
+ willyCheck = TRUE
+ if(/obj/item/organ/genital/breasts)
+ //dna.features["has_breasts"] = TRUE//Goddamnit get in there.
+ breastCheck = TRUE
+ if(organCheck == FALSE)
+ if(ishuman(src) && dna.species.id == "human")
+ dna.features["genitals_use_skintone"] = TRUE
+ dna.species.use_skintones = TRUE
+ if(MUTCOLORS)
+ if(src.dna.species.fixed_mut_color)
+ dna.features["cock_color"] = "[src.dna.species.fixed_mut_color]"
+ dna.features["breasts_color"] = "[src.dna.species.fixed_mut_color]"
+ return
+ //So people who haven't set stuff up don't get rainbow surprises.
+ dna.features["cock_color"] = "[dna.features["mcolor"]]"
+ dna.features["breasts_color"] = "[dna.features["mcolor"]]"
+ else //If there's a new organ, make it the same colour.
+ if(breastCheck == FALSE)
+ dna.features["breasts_color"] = dna.features["cock_color"]
+ else if (willyCheck == FALSE)
+ dna.features["cock_color"] = dna.features["breasts_color"]
+ return
+
+/datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness
if(!H)//no args
CRASH("H = null")
if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done
return
- if(NOGENITALS in species_traits)//golems and such
+ if((NOGENITALS in species_traits) && (H.genital_override = FALSE))//golems and such - things that shouldn't
return
if(HAS_TRAIT(H, TRAIT_HUSK))
return
-
var/list/genitals_to_add = list()
- var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER)
+ var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_FRONT_LAYER) //GENITALS_ADJ_LAYER removed
var/list/standing = list()
var/size
var/aroused_state
for(var/L in relevant_layers) //Less hardcode
H.remove_overlay(L)
-
//start scanning for genitals
- //var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again
for(var/obj/item/organ/O in H.internal_organs)
if(isgenital(O))
var/obj/item/organ/genital/G = O
@@ -308,7 +361,6 @@
if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes
genitals_to_add += H.getorganslot(G.slot)
//Now we added all genitals that aren't internal and should be rendered
-
//start applying overlays
for(var/layer in relevant_layers)
var/layertext = genitals_layertext(layer)
@@ -326,6 +378,9 @@
if(/obj/item/organ/genital/breasts)
S = GLOB.breasts_shapes_list[G.shape]
+
+
+
if(!S || S.icon_state == "none")
continue
diff --git a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
index b913a90fb6..f4af8a40ba 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm
@@ -31,6 +31,19 @@
icon_state = "tapered"
name = "Tapered"
+/datum/sprite_accessory/penis/tentacle
+ icon_state = "tentacle"
+ name = "Tentacled"
+
+/datum/sprite_accessory/penis/hemi
+ icon_state = "hemi"
+ name = "Hemi"
+
+/datum/sprite_accessory/penis/hemiknot
+ icon_state = "hemiknot"
+ name = "Knotted Hemi"
+
+
////////////////////////
// Taur cocks go here //
////////////////////////
@@ -111,6 +124,10 @@
icon_state = "furred"
name = "Furred"
+/datum/sprite_accessory/vagina/gaping
+ icon_state = "gaping"
+ name = "Gaping"
+
//BREASTS BE HERE
/datum/sprite_accessory/breasts
icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi'
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index b6cb8fa4b2..43a512acf6 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -12,28 +12,61 @@
size = 2 //arbitrary value derived from length and girth for sprites.
var/length = 6 //inches
var/cached_length //used to detect a change in length
- var/girth = 0
+ var/girth = 4.38
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
var/list/dickflags = list()
var/list/knotted_types = list("knotted", "barbed, knotted")
+ var/prev_length = 6 //really should be renamed to prev_length
+
+/obj/item/organ/genital/penis/Initialize()
+ . = ..()
+ /* I hate genitals.*/
/obj/item/organ/genital/penis/update_size()
- if(length == cached_length)
+ var/mob/living/carbon/human/o = owner
+ if(!ishuman(o) || !o)
return
- switch(length)
- if(-INFINITY to 5)
+ if(cached_length < 0)//I don't actually know what round() does to negative numbers, so to be safe!!
+ var/obj/item/organ/genital/penis/P = o.getorganslot("penis")
+ to_chat(o, "You feel your tallywacker shrinking away from your body as your groin flattens out!")
+ P.Remove(o)
+ switch(round(cached_length))
+ if(0 to 4) //If modest size
+ length = cached_length
size = 1
- if(5 to 9)
+ if(owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
+ o.remove_status_effect(/datum/status_effect/chem/penis_enlarger)
+ if(5 to 10) //If modest size
+ length = cached_length
size = 2
- if(15 to INFINITY)
- size = 3//no new sprites for anything larger yet
-/* if(9 to 15)
+ if(owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
+ o.remove_status_effect(/datum/status_effect/chem/penis_enlarger)
+ if(11 to 20) //If massive
+ length = cached_length
size = 3
- if(15 to INFINITY)
- size = 3*/
- girth = (length * girth_ratio)
- cached_length = length
+ if(owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
+ o.remove_status_effect(/datum/status_effect/chem/penis_enlarger)
+ if(21 to 35) //If massive and due for large effects
+ length = cached_length
+ size = 3
+ if(!owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
+ o.apply_status_effect(/datum/status_effect/chem/penis_enlarger)
+ if(36 to INFINITY) //If comical
+ length = cached_length
+ size = 4 //no new sprites for anything larger yet
+ if(!owner.has_status_effect(/datum/status_effect/chem/penis_enlarger))
+ o.apply_status_effect(/datum/status_effect/chem/penis_enlarger)
+
+ if (round(length) > round(prev_length))
+ to_chat(o, "Your [pick(GLOB.gentlemans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.")
+ else if ((round(length) < round(prev_length)) && (length > 0.5))
+ to_chat(o, "Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.")
+ prev_length = length
+ icon_state = sanitize_text("penis_[shape]_[size]")
+ girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay?
+
+ //I have no idea on how to update sprites and I hate it
/obj/item/organ/genital/penis/update_appearance()
var/string
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 1e6b4d62d4..f4ef4b5064 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -16,14 +16,18 @@
can_climax = TRUE
var/sent_full_message = TRUE //defaults to 1 since they're full to start
-/obj/item/organ/genital/testicles/Initialize()
- . = ..()
- reagents.add_reagent(fluid_id, fluid_max_volume)
-
/obj/item/organ/genital/testicles/on_life()
if(QDELETED(src))
return
if(reagents && producing)
+ if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
+ fluid_rate = 0.1
+ else
+ fluid_rate = CUM_RATE
+ if(reagents.total_volume >= 5)
+ fluid_mult = 0.5
+ else
+ fluid_mult = 1
generate_cum()
/obj/item/organ/genital/testicles/proc/generate_cum()
diff --git a/modular_citadel/code/modules/arousal/organs/womb.dm b/modular_citadel/code/modules/arousal/organs/womb.dm
index 686d9059a0..3f190b72ac 100644
--- a/modular_citadel/code/modules/arousal/organs/womb.dm
+++ b/modular_citadel/code/modules/arousal/organs/womb.dm
@@ -9,14 +9,18 @@
fluid_id = "femcum"
producing = TRUE
-/obj/item/organ/genital/womb/Initialize()
- . = ..()
- reagents.add_reagent(fluid_id, fluid_max_volume)
-
/obj/item/organ/genital/womb/on_life()
if(QDELETED(src))
return
if(reagents && producing)
+ if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
+ fluid_rate = 0.1
+ else
+ fluid_rate = CUM_RATE
+ if(reagents.total_volume >= 5)
+ fluid_mult = 0.5
+ else
+ fluid_mult = 1
generate_femcum()
/obj/item/organ/genital/womb/proc/generate_femcum()
diff --git a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
index f6991f1d9f..ccbf9a42fe 100644
--- a/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
+++ b/modular_citadel/code/modules/awaymissions/citadel_ghostrole_spawners.dm
@@ -49,7 +49,7 @@
/datum/outfit/lavaknight/captain
name ="Cydonian Knight Captain"
- l_pocket = /obj/item/twohanded/hypereutactic
+ l_pocket = /obj/item/twohanded/dualsaber/hypereutactic
/datum/outfit/lavaknight/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
diff --git a/modular_citadel/code/modules/cargo/console.dm b/modular_citadel/code/modules/cargo/console.dm
index 490f72d1d1..f54a6c577a 100644
--- a/modular_citadel/code/modules/cargo/console.dm
+++ b/modular_citadel/code/modules/cargo/console.dm
@@ -1,13 +1,9 @@
/obj/machinery/computer/cargo
req_access = list(ACCESS_CARGO)
-
+
/obj/machinery/computer/cargo/request
req_access = list()
-/obj/machinery/computer/cargo/emag_act(mob/user)
- req_access = list()
- . = ..()
-
/obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui)
if(!allowed(usr))
to_chat(usr, "Access denied.")
diff --git a/modular_citadel/code/modules/cargo/packs.dm b/modular_citadel/code/modules/cargo/packs.dm
deleted file mode 100644
index 6d39a51a76..0000000000
--- a/modular_citadel/code/modules/cargo/packs.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-//supply packs
-
-/datum/supply_pack/misc/kinkmate
- name = "Kinkmate construction kit"
- cost = 2000
- contraband = TRUE
- contains = list(/obj/item/vending_refill/kink, /obj/item/circuitboard/machine/kinkmate)
- crate_name = "Kinkmate construction kit"
-
-
-//Food and livestocks
-
-/datum/supply_pack/organic/critter/kiwi
- name = "Space kiwi Crate"
- cost = 2000
- contains = list( /mob/living/simple_animal/kiwi)
- crate_name = "space kiwi crate"
-
-
-//////////////////////////////////////////////////////////////////////////////
-//////////////////////////// Miscellaneous ///////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////
-
-/datum/supply_pack/misc/jukebox
- name = "Jukebox"
- cost = 35000
- contains = list(/obj/machinery/jukebox)
- crate_name = "Jukebox"
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index e75a63f540..7e7038cb31 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -220,13 +220,13 @@
/datum/gear/torisword
name = "Rainbow Zweihander"
category = SLOT_IN_BACKPACK
- path = /obj/item/twohanded/hypereutactic/toy/rainbow
+ path = /obj/item/twohanded/dualsaber/hypereutactic/toy/rainbow
ckeywhitelist = list("annoymous35")
/datum/gear/darksabre
name = "Dark Sabre"
category = SLOT_IN_BACKPACK
- path = /obj/item/toy/sword/darksabre
+ path = /obj/item/toy/darksabre
ckeywhitelist = list("inferno707")
datum/gear/darksabresheath
@@ -438,7 +438,17 @@ datum/gear/darksabresheath
/datum/gear/borgplush
name = "Robot Plush"
category = SLOT_IN_BACKPACK
- /obj/item/toy/plush/borgplushie
+ path = /obj/item/toy/plush/borgplushie
ckeywhitelist = list("nicholaiavenicci")
+/datum/gear/donorberet
+ name = "Atmos Beret"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/blueberet
+ ckeywhitelist = list("foxystalin")
+/datum/gear/donorgoggles
+ name = "Flight Goggles"
+ category = SLOT_HEAD
+ path = /obj/item/clothing/head/flight
+ ckeywhitelist = list("maxlynchy")
diff --git a/modular_citadel/code/modules/client/loadout/loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm
similarity index 79%
rename from modular_citadel/code/modules/client/loadout/loadout.dm
rename to modular_citadel/code/modules/client/loadout/_loadout.dm
index 2e11519d0b..d48da1b863 100644
--- a/modular_citadel/code/modules/client/loadout/loadout.dm
+++ b/modular_citadel/code/modules/client/loadout/_loadout.dm
@@ -50,12 +50,32 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/path //item-to-spawn path
var/cost = 1 //normally, each loadout costs a single point.
var/geargroupID //defines the ID that the gear inherits from the config
+
+ //NEW DONATOR SYTSEM STUFF
+ var/donoritem //autoset on new if null
+ var/donator_group_id //New donator group ID system.
+ //END
+
var/list/restricted_roles
+
+ //Old donator system/snowflake ckey whitelist, used for single ckeys/exceptions
var/list/ckeywhitelist
+ //END
+
var/restricted_desc
/datum/gear/New()
- ..()
+ if(isnull(donoritem))
+ if(donator_group_id || ckeywhitelist)
+ donoritem = TRUE
if(!description && path)
var/obj/O = path
description = initial(O.desc)
+
+//a comprehensive donator check proc is intentionally not implemented due to the fact that we (((might))) have job-whitelists for donator items in the future and I like to stay on the safe side.
+
+//ckey only check
+/datum/gear/proc/donator_ckey_check(key)
+ if(ckeywhitelist && ckeywhitelist.Find(key))
+ return TRUE
+ return IS_CKEY_DONATOR_GROUP(key, donator_group_id)
diff --git a/modular_citadel/code/modules/client/loadout/glasses.dm b/modular_citadel/code/modules/client/loadout/glasses.dm
index 9e7b68bf0d..57270d8e57 100644
--- a/modular_citadel/code/modules/client/loadout/glasses.dm
+++ b/modular_citadel/code/modules/client/loadout/glasses.dm
@@ -1,3 +1,8 @@
+/datum/gear/blindfold
+ name = "Blindfold"
+ category = SLOT_GLASSES
+ path = /obj/item/clothing/glasses/sunglasses/blindfold
+
/datum/gear/cold
name = "Cold goggles"
category = SLOT_GLASSES
diff --git a/modular_citadel/code/modules/client/loadout/shoes.dm b/modular_citadel/code/modules/client/loadout/shoes.dm
index 95675ccaeb..6688529c73 100644
--- a/modular_citadel/code/modules/client/loadout/shoes.dm
+++ b/modular_citadel/code/modules/client/loadout/shoes.dm
@@ -37,3 +37,23 @@
name = "White shoes"
category = SLOT_SHOES
path = /obj/item/clothing/shoes/sneakers/white
+
+/datum/gear/gildedcuffs
+ name = "Gilded leg wraps"
+ category = SLOT_SHOES
+ path= /obj/item/clothing/shoes/wraps
+
+/datum/gear/silvercuffs
+ name = "Silver leg wraps"
+ category = SLOT_SHOES
+ path= /obj/item/clothing/shoes/wraps/silver
+
+/datum/gear/redcuffs
+ name = "Red leg wraps"
+ category = SLOT_SHOES
+ path= /obj/item/clothing/shoes/wraps/red
+
+/datum/gear/bluecuffs
+ name = "Blue leg wraps"
+ category = SLOT_SHOES
+ path= /obj/item/clothing/shoes/wraps/blue
\ No newline at end of file
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index dfe419964e..1caa4cfed7 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -15,6 +15,7 @@
var/arousable = TRUE
var/widescreenpref = TRUE
var/autostand = TRUE
+ var/lewdchem = TRUE
//vore prefs
var/toggleeatingnoise = TRUE
@@ -53,5 +54,6 @@ datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1)
character.give_genitals(TRUE)
character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially
character.canbearoused = arousable
+ character.client?.prefs.lewdchem = lewdchem
if(icon_updates)
character.update_genitals()
diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm
index 2921f70684..0a353e3f5d 100644
--- a/modular_citadel/code/modules/client/preferences_savefile.dm
+++ b/modular_citadel/code/modules/client/preferences_savefile.dm
@@ -65,6 +65,7 @@
WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"])
WRITE_FILE(S["feature_breasts_color"], features["breasts_color"])
WRITE_FILE(S["feature_breasts_fluid"], features["breasts_fluid"])
+ WRITE_FILE(S["feature_breasts_producing"], features["breasts_producing"])
//vagina features
WRITE_FILE(S["feature_has_vag"], features["has_vag"])
WRITE_FILE(S["feature_vag_shape"], features["vag_shape"])
diff --git a/modular_citadel/code/modules/clothing/clothing.dm b/modular_citadel/code/modules/clothing/clothing.dm
index fc71d5bdde..7f366ecf35 100644
--- a/modular_citadel/code/modules/clothing/clothing.dm
+++ b/modular_citadel/code/modules/clothing/clothing.dm
@@ -38,6 +38,8 @@
var/secondary_color = "#FFFFFF"
var/tertiary_color = "#808080"
+ var/force_alternate_icon = FALSE
+
/obj/item/clothing/update_icon() // picks the colored overlays from the ICON file
..()
if(hasprimary) //Checks if the overlay is enabled
diff --git a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
index 49eb089afa..1b13ba5dc8 100644
--- a/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
+++ b/modular_citadel/code/modules/clothing/glasses/phantomthief.dm
@@ -35,6 +35,8 @@
. = ..()
if(!istype(user))
return
+ if(slot != SLOT_GLASSES)
+ return
if(!combattoggle_redir)
combattoggle_redir = user.AddComponent(/datum/component/redirect, list(COMSIG_COMBAT_TOGGLED = CALLBACK(src, .proc/injectadrenaline)))
diff --git a/modular_citadel/code/modules/clothing/suits/suits.dm b/modular_citadel/code/modules/clothing/suits/suits.dm
index 22e4aef6a9..5cce40ad09 100644
--- a/modular_citadel/code/modules/clothing/suits/suits.dm
+++ b/modular_citadel/code/modules/clothing/suits/suits.dm
@@ -12,6 +12,7 @@
icon_state = "hostrench"
item_state = "hostrench"
mutantrace_variation = NO_MUTANTRACE_VARIATION
+ body_parts_covered = CHEST|ARMS|LEGS
/obj/item/clothing/suit/hooded/cloak/david
name = "red cloak"
diff --git a/modular_citadel/code/modules/clothing/under/trek_under.dm b/modular_citadel/code/modules/clothing/under/trek_under.dm
index a60f7653c5..5cd0620a9d 100644
--- a/modular_citadel/code/modules/clothing/under/trek_under.dm
+++ b/modular_citadel/code/modules/clothing/under/trek_under.dm
@@ -14,6 +14,7 @@
desc = "Oooh... right."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ force_alternate_icon = TRUE
item_state = ""
can_adjust = FALSE //to prevent you from "wearing it casually"
@@ -23,7 +24,7 @@
desc = "The uniform worn by command officers in the mid 2260s."
icon_state = "trek_command"
item_state = "trek_command"
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
/obj/item/clothing/under/rank/trek/engsec
name = "Operations Uniform"
@@ -94,6 +95,7 @@
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
icon_state = "trek_ds9_coat"
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ force_alternate_icon = TRUE
item_state = "trek_ds9_coat"
body_parts_covered = CHEST|GROIN|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -138,6 +140,7 @@
desc = "A uniform jacket from the United Federation. Set phasers to awesome."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ force_alternate_icon = TRUE
icon_state = "fedcoat"
item_state = "fedcoat"
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -204,6 +207,7 @@
desc = "A modern uniform jacket from the United Federation."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ force_alternate_icon = TRUE
icon_state = "fedmodern"
item_state = "fedmodern"
body_parts_covered = CHEST|GROIN|ARMS
@@ -236,6 +240,7 @@
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
icon_state = "fedcapofficer"
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
+ force_alternate_icon = TRUE
item_state = "fedcapofficer"
//Variants
diff --git a/modular_citadel/code/modules/crafting/recipes.dm b/modular_citadel/code/modules/crafting/recipes.dm
deleted file mode 100644
index 6c6001b040..0000000000
--- a/modular_citadel/code/modules/crafting/recipes.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/datum/crafting_recipe/toyneb
- name = "Non-Euplastic Blade"
- reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4)
- result = /obj/item/toy/sword/cx
- category = CAT_MISC
-
-/datum/crafting_recipe/potatos
- name = "Potat-OS"
- reqs = list(/obj/item/stack/cable_coil = 1, /obj/item/stack/rods = 1, /obj/item/reagent_containers/food/snacks/grown/potato = 1, /obj/item/aicard = 1 )
- result = /obj/item/aicard/potato
- category = CAT_ROBOT
\ No newline at end of file
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 0ce4fbdd78..32c73cc40a 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -49,7 +49,7 @@
item_color = "steele"
medaltype = "medal-silver"
-/obj/item/toy/sword/darksabre
+/obj/item/toy/darksabre
name = "Kiara's Sabre"
desc = "This blade looks as dangerous as its owner."
icon = 'icons/obj/custom.dmi'
@@ -58,9 +58,13 @@
item_state = "darksabre"
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
- w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
+/obj/item/toy/darksabre/get_belt_overlay()
+ return mutable_appearance('icons/obj/custom.dmi', "darksheath-darksabre")
+
+/obj/item/toy/darksabre/get_worn_belt_overlay(icon_file)
+ return mutable_appearance(icon_file, "darksheath-darksabre")
/obj/item/storage/belt/sabre/darksabre
name = "Ornate Sheathe"
@@ -69,32 +73,8 @@
alternate_worn_icon = 'icons/mob/custom_w.dmi'
icon_state = "darksheath"
item_state = "darksheath"
- w_class = WEIGHT_CLASS_BULKY
-
-/obj/item/storage/belt/sabre/darksabre/ComponentInitialize()
- . = ..()
- GET_COMPONENT(STR, /datum/component/storage)
- STR.max_items = 1
- STR.rustle_sound = FALSE
- STR.max_w_class = WEIGHT_CLASS_BULKY
- STR.can_hold = typecacheof(list(
- /obj/item/toy/sword/darksabre
- ))
-
-/obj/item/storage/belt/sabre/darksabre/update_icon()
- icon_state = "darksheath"
- item_state = "darksheath"
- if(contents.len)
- icon_state += "-darksabre"
- item_state += "-darksabre"
- if(loc && isliving(loc))
- var/mob/living/L = loc
- L.regenerate_icons()
- ..()
-
-/obj/item/storage/belt/sabre/darksabre/PopulateContents()
- new /obj/item/toy/sword/darksabre(src)
- update_icon()
+ fitting_swords = list(/obj/item/toy/darksabre)
+ starting_sword = /obj/item/toy/darksabre
/obj/item/clothing/suit/armor/vest/darkcarapace
name = "Dark Armor"
@@ -342,31 +322,6 @@
name = "worn pet collar"
desc = "a pet collar that looks well used."
-/obj/item/clothing/neck/petcollar/naomi/examine(mob/user)
- . = ..()
- if(usr.ckey != "technicalmagi")
- to_chat(user, "There's something odd about the it. You probably shouldn't wear it...")//warn people not to wear it if they're not Naomi, lest they become as crazy as she is
-
-/obj/item/clothing/neck/petcollar/naomi/equipped()
- . = ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/clothing/neck/petcollar/naomi/dropped()
- . = ..()
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/clothing/neck/petcollar/naomi/process()
- var/mob/living/carbon/human/H
- if(ishuman(loc))
- H = loc
- if(!H)
- return
- else if(H.get_item_by_slot(SLOT_NECK) == src)
- if(H.arousalloss < H.max_arousal / 3)
- H.arousalloss = H.max_arousal / 3
- if(prob(5) && H.hallucination < 15)
- H.hallucination += 10
-
/obj/item/clothing/neck/cloak/green
name = "Generic Green Cloak"
desc = "This cloak doesn't seem too special."
@@ -492,6 +447,7 @@
item_state = "kimono"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/commjacket
@@ -501,6 +457,7 @@
item_state = "commjacket"
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
+ body_parts_covered = CHEST|GROIN|LEGS|ARMS
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/under/mw2_russian_para
@@ -528,3 +485,19 @@
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
+
+/obj/item/clothing/head/blueberet
+ name = "Atmos Beret"
+ desc = "A fitted beret designed to be worn by Atmos Techs."
+ icon_state = "blueberet"
+ item_state = "blueberet"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
+
+/obj/item/clothing/head/flight
+ name = "flight goggles"
+ desc = "Old style flight goggles with a leather cap attached."
+ icon_state = "flight-g"
+ item_state = "flight-g"
+ icon = 'icons/obj/custom.dmi'
+ alternate_worn_icon = 'icons/mob/custom_w.dmi'
diff --git a/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm b/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm
index eba3660f8d..f1b5d622bc 100644
--- a/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm
+++ b/modular_citadel/code/modules/food_and_drinks/snacks/meat.dm
@@ -1,3 +1,29 @@
/obj/item/reagent_containers/food/snacks/carpmeat/aquatic
name = "fillet"
desc = "A fillet of one of the local water dwelling species."
+
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
+ icon = 'modular_citadel/icons/obj/foods.dmi'
+ icon_state = "ipcmeat"
+ desc = "Gross robot meat."
+ filling_color = "#000000"
+ tastes = list("metal" = 1)
+
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
+ desc = "Tastes like chicken, that's... not what it is!"
+ icon = 'modular_citadel/icons/obj/foods.dmi'
+ icon_state = "mothmeat"
+ filling_color = "#BF896B"
+ tastes = list("insects" = 1)
+
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/avian
+ desc = "Tastes like chicken, that's because it is!"
+ icon = 'modular_citadel/icons/obj/foods.dmi'
+ icon_state = "birdmeat"
+ filling_color = "#BF896B"
+ tastes = list("chicken" = 1)
+
+/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
+ desc = "Tastes sweet... reminds you vaguely of chicken."
+ filling_color = "#6B8E23"
+ tastes = list("brains" = 1, "meat" = 1)
diff --git a/modular_citadel/code/modules/mining/mine_items.dm b/modular_citadel/code/modules/mining/mine_items.dm
deleted file mode 100644
index d2cd1f2aa3..0000000000
--- a/modular_citadel/code/modules/mining/mine_items.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/obj/machinery/computer/shuttle/mining
- req_access = list(ACCESS_MINING)
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
index aff1739ae4..7e7a77538a 100644
--- a/modular_citadel/code/modules/mob/cit_emotes.dm
+++ b/modular_citadel/code/modules/mob/cit_emotes.dm
@@ -185,22 +185,6 @@
emote_type = EMOTE_AUDIBLE
restraint_check = TRUE
-
-
-/datum/emote/living/dab/run_emote(mob/living/user, params)
- if (ishuman(user))
- var/def_zone = BODY_ZONE_CHEST
- var/luck = (rand(1,100))
- if(luck >= 65)
- user.adjustStaminaLoss(70)
- if(luck >= 80)
- def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
- user.apply_damage(20, BRUTE, def_zone)
- if(luck >= 95)
- user.adjustBrainLoss(100)
- . = ..()
-
-
/datum/emote/living/mothsqueak
key = "msqueak"
key_third_person = "lets out a tiny squeak"
@@ -229,3 +213,18 @@
user.nextsoundemote = world.time + 7
playsound(user, 'modular_citadel/sound/voice/merp.ogg', 50, 1, -1)
. = ..()
+
+/datum/emote/living/bark
+ key = "bark"
+ key_third_person = "barks"
+ message = "barks!"
+ emote_type = EMOTE_AUDIBLE
+
+/datum/emote/living/bark/run_emote(mob/living/user, params)
+ if(ishuman(user))
+ if(user.nextsoundemote >= world.time)
+ return
+ user.nextsoundemote = world.time + 7
+ var/sound = pick('modular_citadel/sound/voice/bark1.ogg', 'modular_citadel/sound/voice/bark2.ogg')
+ playsound(user, sound, 50, 1, -1)
+ . = ..()
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
deleted file mode 100644
index bf811b777c..0000000000
--- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ /dev/null
@@ -1,2083 +0,0 @@
-/datum/sprite_accessory
- var/extra = FALSE
- var/extra_color_src = MUTCOLORS2 //The color source for the extra overlay.
- var/extra2 = FALSE
- var/extra_icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- var/extra2_icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- var/extra2_color_src = MUTCOLORS3
- var/list/ckeys_allowed
-
-/datum/sprite_accessory/moth_wings/none
- name = "None"
- icon_state = "none"
-
-/***************** Alphabetical Order please ***************
-************* Keep it to Ears, Tails, Tails Animated *********/
-
-
-/datum/sprite_accessory/tails/lizard/none
- name = "None"
- icon_state = "None"
-
-/datum/sprite_accessory/tails_animated/lizard/none
- name = "None"
- icon_state = "None"
-
-
-/datum/sprite_accessory/tails/lizard/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/lizard/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/body_markings/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/tails/lizard/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/lizard/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-//christ this was a mistake, but it's here just in case someone wants to selectively fix
-/************* Lizard compatable snoots ***********
-/datum/sprite_accessory/snouts/bird
- name = "Beak"
- icon_state = "bird"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/bigbeak
- name = "Big Beak"
- icon_state = "bigbeak"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/bug
- name = "Bug"
- icon_state = "bug"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- extra2 = TRUE
- extra2_color_src = MUTCOLORS3
-
-/datum/sprite_accessory/snouts/elephant
- name = "Elephant"
- icon_state = "elephant"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
- extra = TRUE
- extra_color_src = MUTCOLORS3
-
-/datum/sprite_accessory/snouts/lcanid
- name = "Mammal, Long"
- icon_state = "lcanid"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/lcanidalt
- name = "Mammal, Long ALT"
- icon_state = "lcanidalt"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/scanid
- name = "Mammal, Short"
- icon_state = "scanid"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/scanidalt
- name = "Mammal, Short ALT"
- icon_state = "scanidalt"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/wolf
- name = "Mammal, Thick"
- icon_state = "wolf"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/wolfalt
- name = "Mammal, Thick ALT"
- icon_state = "wolfalt"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/redpanda
- name = "WahCoon"
- icon_state = "wah"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/rhino
- name = "Horn"
- icon_state = "rhino"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
- extra = TRUE
- extra = MUTCOLORS3
-
-/datum/sprite_accessory/snouts/rodent
- name = "Rodent"
- icon_state = "rodent"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/husky
- name = "Husky"
- icon_state = "husky"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/otie
- name = "Otie"
- icon_state = "otie"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/pede
- name = "Scolipede"
- icon_state = "pede"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/sergal
- name = "Sergal"
- icon_state = "sergal"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/snouts/shark
- name = "Shark"
- icon_state = "shark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
-
-/datum/sprite_accessory/snouts/toucan
- name = "Toucan"
- icon_state = "toucan"
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
- color_src = MATRIXED
-*/
-
-/******************************************
-*************** Human Ears ****************
-*******************************************/
-
-/datum/sprite_accessory/ears/human/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
-/datum/sprite_accessory/ears/human/bear
- name = "Bear"
- icon_state = "bear"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/bigwolf
- name = "Big Wolf"
- icon_state = "bigwolf"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/bigwolfinner
- name = "Big Wolf (ALT)"
- icon_state = "bigwolfinner"
- hasinner = 1
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/bigwolfdark
- name = "Dark Big Wolf"
- icon_state = "bigwolfdark"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/bigwolfinnerdark
- name = "Dark Big Wolf (ALT)"
- icon_state = "bigwolfinnerdark"
- hasinner = 1
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/cow
- name = "Cow"
- icon_state = "cow"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/curled
- name = "Curled Horn"
- icon_state = "horn1"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MUTCOLORS3
-
-/datum/sprite_accessory/ears/human/eevee
- name = "Eevee"
- icon_state = "eevee"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/elephant
- name = "Elephant"
- icon_state = "elephant"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/elf
- name = "Elf"
- icon_state = "elf"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = SKINTONE
-
-/datum/sprite_accessory/ears/fennec
- name = "Fennec"
- icon_state = "fennec"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/fish
- name = "Fish"
- icon_state = "fish"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/fox
- name = "Fox"
- icon_state = "fox"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
-/datum/sprite_accessory/ears/human/jellyfish
- name = "Jellyfish"
- icon_state = "jellyfish"
- color_src = HAIR
-
-/datum/sprite_accessory/ears/lab
- name = "Dog, Floppy"
- icon_state = "lab"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
-/datum/sprite_accessory/ears/murid
- name = "Murid"
- icon_state = "murid"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/otie
- name = "Otusian"
- icon_state = "otie"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
-/datum/sprite_accessory/ears/human/pede
- name = "Scolipede"
- icon_state = "pede"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
-/datum/sprite_accessory/ears/human/sergal
- name = "Sergal"
- icon_state = "sergal"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/human/skunk
- name = "skunk"
- icon_state = "skunk"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/ears/wolf
- name = "Wolf"
- icon_state = "wolf"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
-
-
-/******************************************
-************** Human Tails ****************
-*******************************************/
-
-/datum/sprite_accessory/tails/human/ailurus
- name = "Red Panda"
- icon_state = "wah"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/ailurus
- name = "Red Panda"
- icon_state = "wah"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/bee
- name = "Bee"
- icon_state = "bee"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/bee
- name = "Bee"
- icon_state = "bee"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/cat
- name = "Cat"
- icon_state = "cat"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = HAIR
-
-/datum/sprite_accessory/tails_animated/human/cat
- name = "Cat"
- icon_state = "cat"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = HAIR
-
-/datum/sprite_accessory/tails/human/catbig
- name = "Cat, Big"
- icon_state = "catbig"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/catbig
- name = "Cat, Big"
- icon_state = "catbig"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/cow
- name = "Cow"
- icon_state = "cow"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/cow
- name = "Cow"
- icon_state = "cow"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/corvid
- name = "Corvid"
- icon_state = "crow"
-
-/datum/sprite_accessory/tails_animated/human/corvid
- name = "Corvid"
- icon_state = "crow"
-
-/datum/sprite_accessory/tails/human/eevee
- name = "Eevee"
- icon_state = "eevee"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/eevee
- name = "Eevee"
- icon_state = "eevee"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/fennec
- name = "Fennec"
- icon_state = "fennec"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/fennec
- name = "Fennec"
- icon_state = "fennec"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/fish
- name = "Fish"
- icon_state = "fish"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/fish
- name = "Fish"
- icon_state = "fish"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/fox
- name = "Fox"
- icon_state = "fox"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/fox
- name = "Fox"
- icon_state = "fox"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/horse
- name = "Horse"
- icon_state = "horse"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = HAIR
-
-/datum/sprite_accessory/tails_animated/human/horse
- name = "Horse"
- icon_state = "horse"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = HAIR
-
-/datum/sprite_accessory/tails/human/husky
- name = "Husky"
- icon_state = "husky"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/husky
- name = "Husky"
- icon_state = "husky"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/insect
- name = "Insect"
- icon_state = "insect"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails_animated/human/insect
- name = "insect"
- icon_state = "insect"
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/tails/human/kitsune
- name = "Kitsune"
- icon_state = "kitsune"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/kitsune
- name = "Kitsune"
- icon_state = "kitsune"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/murid
- name = "Murid"
- icon_state = "murid"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/murid
- name = "Murid"
- icon_state = "murid"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/otie
- name = "Otusian"
- icon_state = "otie"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/otie
- name = "Otusian"
- icon_state = "otie"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/orca
- name = "Orca"
- icon_state = "orca"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/orca
- name = "Orca"
- icon_state = "orca"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/pede
- name = "Scolipede"
- icon_state = "pede"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/pede
- name = "Scolipede"
- icon_state = "pede"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/sergal
- name = "Sergal"
- icon_state = "sergal"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/sergal
- name = "Sergal"
- icon_state = "sergal"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/skunk
- name = "skunk"
- icon_state = "skunk"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/skunk
- name = "skunk"
- icon_state = "skunk"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/shark
- name = "Shark"
- icon_state = "shark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/shark
- name = "Shark"
- icon_state = "shark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/datashark
- name = "datashark"
- icon_state = "datashark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/datashark
- name = "datashark"
- icon_state = "datashark"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/straighttail
- name = "Straight Tail"
- icon_state = "straighttail"
-
-/datum/sprite_accessory/tails_animated/human/straighttail
- name = "Straight Tail"
- icon_state = "straighttail"
-
-/datum/sprite_accessory/tails/human/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/tentacle
- name = "Tentacle"
- icon_state = "tentacle"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/tentacle
- name = "Tentacle"
- icon_state = "tentacle"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/tiger
- name = "Tiger"
- icon_state = "tiger"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/tiger
- name = "Tiger"
- icon_state = "tiger"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails/human/wolf
- name = "Wolf"
- icon_state = "wolf"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/tails_animated/human/wolf
- name = "Wolf"
- icon_state = "wolf"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/******************************************
-*********** Mammal Body Parts *************
-*******************************************/
-
-/datum/sprite_accessory/mam_ears
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
- color_src = MATRIXED
-
-/datum/sprite_accessory/mam_ears/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/mam_tails
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/mam_tails/none
- name = "None"
- icon_state = "none"
-
-/datum/sprite_accessory/mam_tails_animated
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_tails.dmi'
-
-/datum/sprite_accessory/mam_tails_animated/none
- name = "None"
- icon_state = "none"
- color_src = MATRIXED
-
-/datum/sprite_accessory/mam_snouts
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
-
-/datum/sprite_accessory/mam_snouts/none
- name = "None"
- icon_state = "none"
-
-
-/******************************************
-**************** Snouts *******************
-*******************************************/
-
-/datum/sprite_accessory/mam_snouts/bird
- name = "Beak"
- icon_state = "bird"
-
-/datum/sprite_accessory/mam_snouts/bigbeak
- name = "Big Beak"
- icon_state = "bigbeak"
-
-/datum/sprite_accessory/mam_snouts/bug
- name = "Bug"
- icon_state = "bug"
- color_src = MUTCOLORS
- extra2 = TRUE
- extra2_color_src = MUTCOLORS3
-
-/datum/sprite_accessory/mam_snouts/elephant
- name = "Elephant"
- icon_state = "elephant"
- extra = TRUE
- extra_color_src = MUTCOLORS3
-
-/datum/sprite_accessory/mam_snouts/lcanid
- name = "Mammal, Long"
- icon_state = "lcanid"
-
-/datum/sprite_accessory/mam_snouts/lcanidalt
- name = "Mammal, Long ALT"
- icon_state = "lcanidalt"
-
-/datum/sprite_accessory/mam_snouts/scanid
- name = "Mammal, Short"
- icon_state = "scanid"
-
-/datum/sprite_accessory/mam_snouts/scanidalt
- name = "Mammal, Short ALT"
- icon_state = "scanidalt"
-
-/datum/sprite_accessory/mam_snouts/wolf
- name = "Mammal, Thick"
- icon_state = "wolf"
-
-/datum/sprite_accessory/mam_snouts/wolfalt
- name = "Mammal, Thick ALT"
- icon_state = "wolfalt"
-
-/datum/sprite_accessory/mam_snouts/redpanda
- name = "WahCoon"
- icon_state = "wah"
-
-/datum/sprite_accessory/mam_snouts/redpandaalt
- name = "WahCoon ALT"
- icon_state = "wahalt"
-
-/datum/sprite_accessory/mam_snouts/rhino
- name = "Horn"
- icon_state = "rhino"
- extra = TRUE
- extra = MUTCOLORS3
-
-/datum/sprite_accessory/mam_snouts/rodent
- name = "Rodent"
- icon_state = "rodent"
-
-/datum/sprite_accessory/mam_snouts/husky
- name = "Husky"
- icon_state = "husky"
-
-/datum/sprite_accessory/mam_snouts/otie
- name = "Otie"
- icon_state = "otie"
-
-/datum/sprite_accessory/mam_snouts/pede
- name = "Scolipede"
- icon_state = "pede"
-
-/datum/sprite_accessory/mam_snouts/sergal
- name = "Sergal"
- icon_state = "sergal"
-
-/datum/sprite_accessory/mam_snouts/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/mam_snouts/toucan
- name = "Toucan"
- icon_state = "toucan"
-
-/datum/sprite_accessory/mam_snouts/sharp
- name = "Sharp"
- icon_state = "sharp"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/mam_snouts/round
- name = "Round"
- icon_state = "round"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/mam_snouts/sharplight
- name = "Sharp + Light"
- icon_state = "sharplight"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/mam_snouts/roundlight
- name = "Round + Light"
- icon_state = "roundlight"
- color_src = MUTCOLORS
-
-
-/******************************************
-**************** Snouts *******************
-*************but higher up*****************/
-
-/datum/sprite_accessory/mam_snouts/fbird
- name = "Beak (Top)"
- icon_state = "fbird"
-
-/datum/sprite_accessory/mam_snouts/fbigbeak
- name = "Big Beak (Top)"
- icon_state = "fbigbeak"
-
-/datum/sprite_accessory/mam_snouts/fbug
- name = "Bug (Top)"
- icon_state = "fbug"
- color_src = MUTCOLORS
- extra2 = TRUE
- extra2_color_src = MUTCOLORS3
-
-/datum/sprite_accessory/mam_snouts/felephant
- name = "Elephant (Top)"
- icon_state = "felephant"
- extra = TRUE
- extra_color_src = MUTCOLORS3
-
-/datum/sprite_accessory/mam_snouts/flcanid
- name = "Mammal, Long (Top)"
- icon_state = "flcanid"
-
-/datum/sprite_accessory/mam_snouts/flcanidalt
- name = "Mammal, Long ALT (Top)"
- icon_state = "flcanidalt"
-
-/datum/sprite_accessory/mam_snouts/fscanid
- name = "Mammal, Short (Top)"
- icon_state = "fscanid"
-
-/datum/sprite_accessory/mam_snouts/fscanidalt
- name = "Mammal, Short ALT (Top)"
- icon_state = "fscanidalt"
-
-/datum/sprite_accessory/mam_snouts/fwolf
- name = "Mammal, Thick (Top)"
- icon_state = "fwolf"
-
-/datum/sprite_accessory/mam_snouts/fwolfalt
- name = "Mammal, Thick ALT (Top)"
- icon_state = "fwolfalt"
-
-/datum/sprite_accessory/mam_snouts/fredpanda
- name = "WahCoon (Top)"
- icon_state = "fwah"
-
-/datum/sprite_accessory/mam_snouts/frhino
- name = "Horn (Top)"
- icon_state = "frhino"
- extra = TRUE
- extra = MUTCOLORS3
-
-/datum/sprite_accessory/mam_snouts/frodent
- name = "Rodent (Top)"
- icon_state = "frodent"
-
-/datum/sprite_accessory/mam_snouts/fhusky
- name = "Husky (Top)"
- icon_state = "fhusky"
-
-/datum/sprite_accessory/mam_snouts/fotie
- name = "Otie (Top)"
- icon_state = "fotie"
-
-/datum/sprite_accessory/mam_snouts/fpede
- name = "Scolipede (Top)"
- icon_state = "fpede"
-
-/datum/sprite_accessory/mam_snouts/fsergal
- name = "Sergal (Top)"
- icon_state = "fsergal"
-
-/datum/sprite_accessory/mam_snouts/fshark
- name = "Shark (Top)"
- icon_state = "fshark"
-
-/datum/sprite_accessory/mam_snouts/ftoucan
- name = "Toucan (Top)"
- icon_state = "ftoucan"
-
-/datum/sprite_accessory/mam_snouts/fsharp
- name = "Sharp (Top)"
- icon_state = "fsharp"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/mam_snouts/fround
- name = "Round (Top)"
- icon_state = "fround"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/mam_snouts/fsharplight
- name = "Sharp + Light (Top)"
- icon_state = "fsharplight"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/mam_snouts/froundlight
- name = "Round + Light (Top)"
- icon_state = "froundlight"
- color_src = MUTCOLORS
-
-/******************************************
-***************** Ears ********************
-*******************************************/
-
-/datum/sprite_accessory/mam_ears/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
-
-/datum/sprite_accessory/mam_ears/bear
- name = "Bear"
- icon_state = "bear"
-
-/datum/sprite_accessory/mam_ears/bigwolf
- name = "Big Wolf"
- icon_state = "bigwolf"
-
-/datum/sprite_accessory/mam_ears/bigwolfinner
- name = "Big Wolf (ALT)"
- icon_state = "bigwolfinner"
- hasinner = 1
-
-/datum/sprite_accessory/mam_ears/bigwolfdark
- name = "Dark Big Wolf"
- icon_state = "bigwolfdark"
-
-/datum/sprite_accessory/mam_ears/bigwolfinnerdark
- name = "Dark Big Wolf (ALT)"
- icon_state = "bigwolfinnerdark"
- hasinner = 1
-
-/datum/sprite_accessory/mam_ears/cat
- name = "Cat"
- icon_state = "cat"
- hasinner = 1
- color_src = HAIR
-
-/datum/sprite_accessory/mam_ears/catbig
- name = "Cat, Big"
- icon_state = "catbig"
-
-/datum/sprite_accessory/mam_ears/cow
- name = "Cow"
- icon_state = "cow"
-
-/datum/sprite_accessory/mam_ears/curled
- name = "Curled Horn"
- icon_state = "horn1"
- color_src = MUTCOLORS3
-
-/datum/sprite_accessory/mam_ears/deer
- name = "Deer"
- icon_state = "deer"
- color_src = MUTCOLORS3
-
-/datum/sprite_accessory/mam_ears/eevee
- name = "Eevee"
- icon_state = "eevee"
-
-
-/datum/sprite_accessory/mam_ears/elf
- name = "Elf"
- icon_state = "elf"
- color_src = MUTCOLORS3
-
-
-/datum/sprite_accessory/mam_ears/elephant
- name = "Elephant"
- icon_state = "elephant"
-
-/datum/sprite_accessory/mam_ears/fennec
- name = "Fennec"
- icon_state = "fennec"
-
-/datum/sprite_accessory/mam_ears/fish
- name = "Fish"
- icon_state = "fish"
-
-/datum/sprite_accessory/mam_ears/fox
- name = "Fox"
- icon_state = "fox"
-
-/datum/sprite_accessory/mam_ears/husky
- name = "Husky"
- icon_state = "wolf"
-
-/datum/sprite_accessory/mam_ears/kangaroo
- name = "kangaroo"
- icon_state = "kangaroo"
-
-/datum/sprite_accessory/mam_ears/jellyfish
- name = "Jellyfish"
- icon_state = "jellyfish"
- color_src = HAIR
-
-/datum/sprite_accessory/mam_ears/lab
- name = "Dog, Long"
- icon_state = "lab"
-
-/datum/sprite_accessory/mam_ears/murid
- name = "Murid"
- icon_state = "murid"
-
-/datum/sprite_accessory/mam_ears/otie
- name = "Otusian"
- icon_state = "otie"
-
-/datum/sprite_accessory/mam_ears/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
-
-/datum/sprite_accessory/mam_ears/pede
- name = "Scolipede"
- icon_state = "pede"
-
-/datum/sprite_accessory/mam_ears/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
-
-/datum/sprite_accessory/mam_ears/sergal
- name = "Sergal"
- icon_state = "sergal"
-
-/datum/sprite_accessory/mam_ears/skunk
- name = "skunk"
- icon_state = "skunk"
-
-/datum/sprite_accessory/mam_ears/wolf
- name = "Wolf"
- icon_state = "wolf"
-
-/******************************************
-*********** Tails and Things **************
-*******************************************/
-
-/datum/sprite_accessory/mam_tails/ailurus
- name = "Red Panda"
- icon_state = "wah"
- extra = TRUE
-
-/datum/sprite_accessory/mam_tails_animated/ailurus
- name = "Red Panda"
- icon_state = "wah"
- extra = TRUE
-
-/datum/sprite_accessory/mam_tails/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
-
-/datum/sprite_accessory/mam_tails_animated/axolotl
- name = "Axolotl"
- icon_state = "axolotl"
-
-/datum/sprite_accessory/mam_tails/bee
- name = "Bee"
- icon_state = "bee"
-
-/datum/sprite_accessory/mam_tails_animated/bee
- name = "Bee"
- icon_state = "bee"
-
-/datum/sprite_accessory/mam_tails/cat
- name = "Cat"
- icon_state = "cat"
- color_src = HAIR
-
-/datum/sprite_accessory/mam_tails_animated/cat
- name = "Cat"
- icon_state = "cat"
- color_src = HAIR
-
-/datum/sprite_accessory/mam_tails/catbig
- name = "Cat, Big"
- icon_state = "catbig"
-
-/datum/sprite_accessory/mam_tails_animated/catbig
- name = "Cat, Big"
- icon_state = "catbig"
-
-/datum/sprite_accessory/mam_tails/corvid
- name = "Corvid"
- icon_state = "crow"
-
-/datum/sprite_accessory/mam_tails_animated/corvid
- name = "Corvid"
- icon_state = "crow"
-
-/datum/sprite_accessory/mam_tail/cow
- name = "Cow"
- icon_state = "cow"
-
-/datum/sprite_accessory/mam_tails_animated/cow
- name = "Cow"
- icon_state = "cow"
-
-/datum/sprite_accessory/mam_tails/eevee
- name = "Eevee"
- icon_state = "eevee"
-
-/datum/sprite_accessory/mam_tails_animated/eevee
- name = "Eevee"
- icon_state = "eevee"
-
-/datum/sprite_accessory/mam_tails/fennec
- name = "Fennec"
- icon_state = "fennec"
-
-/datum/sprite_accessory/mam_tails_animated/fennec
- name = "Fennec"
- icon_state = "fennec"
-
-/datum/sprite_accessory/mam_tails/human/fish
- name = "Fish"
- icon_state = "fish"
-
-/datum/sprite_accessory/mam_tails_animated/human/fish
- name = "Fish"
- icon_state = "fish"
-
-/datum/sprite_accessory/mam_tails/fox
- name = "Fox"
- icon_state = "fox"
-
-/datum/sprite_accessory/mam_tails_animated/fox
- name = "Fox"
- icon_state = "fox"
-
-/datum/sprite_accessory/mam_tails/hawk
- name = "Hawk"
- icon_state = "hawk"
-
-/datum/sprite_accessory/mam_tails_animated/hawk
- name = "Hawk"
- icon_state = "hawk"
-
-/datum/sprite_accessory/mam_tails/horse
- name = "Horse"
- icon_state = "horse"
- color_src = HAIR
-
-/datum/sprite_accessory/mam_tails_animated/horse
- name = "Horse"
- icon_state = "Horse"
- color_src = HAIR
-
-/datum/sprite_accessory/mam_tails/husky
- name = "Husky"
- icon_state = "husky"
-
-/datum/sprite_accessory/mam_tails_animated/husky
- name = "Husky"
- icon_state = "husky"
-
-datum/sprite_accessory/mam_tails/insect
- name = "Insect"
- icon_state = "insect"
-
-/datum/sprite_accessory/mam_tails_animated/insect
- name = "Insect"
- icon_state = "insect"
-
-/datum/sprite_accessory/mam_tails/kangaroo
- name = "kangaroo"
- icon_state = "kangaroo"
-
-/datum/sprite_accessory/mam_tails_animated/kangaroo
- name = "kangaroo"
- icon_state = "kangaroo"
-
-/datum/sprite_accessory/mam_tails/kitsune
- name = "Kitsune"
- icon_state = "kitsune"
-
-/datum/sprite_accessory/mam_tails_animated/kitsune
- name = "Kitsune"
- icon_state = "kitsune"
-
-/datum/sprite_accessory/mam_tails/lab
- name = "Lab"
- icon_state = "lab"
-
-/datum/sprite_accessory/mam_tails_animated/lab
- name = "Lab"
- icon_state = "lab"
-
-/datum/sprite_accessory/mam_tails/murid
- name = "Murid"
- icon_state = "murid"
-
-/datum/sprite_accessory/mam_tails_animated/murid
- name = "Murid"
- icon_state = "murid"
-
-/datum/sprite_accessory/mam_tails/otie
- name = "Otusian"
- icon_state = "otie"
-
-/datum/sprite_accessory/mam_tails_animated/otie
- name = "Otusian"
- icon_state = "otie"
-
-/datum/sprite_accessory/mam_tails/orca
- name = "Orca"
- icon_state = "orca"
-
-/datum/sprite_accessory/mam_tails_animated/orca
- name = "Orca"
- icon_state = "orca"
-
-/datum/sprite_accessory/mam_tails/pede
- name = "Scolipede"
- icon_state = "pede"
-
-/datum/sprite_accessory/mam_tails_animated/pede
- name = "Scolipede"
- icon_state = "pede"
-
-/datum/sprite_accessory/mam_tails/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
-
-/datum/sprite_accessory/mam_tails_animated/rabbit
- name = "Rabbit"
- icon_state = "rabbit"
-
-/datum/sprite_accessory/mam_tails/sergal
- name = "Sergal"
- icon_state = "sergal"
-
-/datum/sprite_accessory/mam_tails_animated/sergal
- name = "Sergal"
- icon_state = "sergal"
-
-/datum/sprite_accessory/mam_tails/skunk
- name = "Skunk"
- icon_state = "skunk"
-
-/datum/sprite_accessory/mam_tails_animated/skunk
- name = "Skunk"
- icon_state = "skunk"
-
-/datum/sprite_accessory/mam_tails/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/mam_tails_animated/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/mam_tails/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
-
-/datum/sprite_accessory/mam_tails_animated/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
-
-/datum/sprite_accessory/mam_tails/straighttail
- name = "Straight Tail"
- icon_state = "straighttail"
-
-/datum/sprite_accessory/mam_tails_animated/straighttail
- name = "Straight Tail"
- icon_state = "straighttail"
-
-/datum/sprite_accessory/mam_tails/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
-
-/datum/sprite_accessory/mam_tails_animated/squirrel
- name = "Squirrel"
- icon_state = "squirrel"
-
-/datum/sprite_accessory/mam_tails/tentacle
- name = "Tentacle"
- icon_state = "tentacle"
-
-/datum/sprite_accessory/mam_tails_animated/tentacle
- name = "Tentacle"
- icon_state = "tentacle"
-
-/datum/sprite_accessory/mam_tails/tiger
- name = "Tiger"
- icon_state = "tiger"
-
-/datum/sprite_accessory/mam_tails_animated/tiger
- name = "Tiger"
- icon_state = "tiger"
-
-/datum/sprite_accessory/mam_tails/wolf
- name = "Wolf"
- icon_state = "wolf"
-
-/datum/sprite_accessory/mam_tails_animated/wolf
- name = "Wolf"
- icon_state = "wolf"
-
-/******************************************
-************ Body Markings ****************
-*******************************************/
-
-/datum/sprite_accessory/mam_body_markings
- extra = FALSE
- extra2 = FALSE
- color_src = MATRIXED
- gender_specific = 0
- icon = 'modular_citadel/icons/mob/mam_markings.dmi'
-
-/datum/sprite_accessory/mam_body_markings/none
- name = "None"
- icon_state = "none"
- ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme")
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/plain
- name = "Plain"
- icon_state = "plain"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/redpanda
- name = "Redpanda"
- icon_state = "redpanda"
-
-/datum/sprite_accessory/mam_body_markings/bee
- name = "Bee"
- icon_state = "bee"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/belly
- name = "Belly"
- icon_state = "belly"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/bellyslim
- name = "Bellyslim"
- icon_state = "bellyslim"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/corgi
- name = "Corgi"
- icon_state = "corgi"
-
-/datum/sprite_accessory/mam_body_markings/cow
- name = "Bovine"
- icon_state = "bovine"
-
-/datum/sprite_accessory/mam_body_markings/corvid
- name = "Corvid"
- icon_state = "corvid"
-
-/datum/sprite_accessory/mam_body_markings/dalmation
- name = "Dalmation"
- icon_state = "dalmation"
-
-/datum/sprite_accessory/mam_body_markings/deer
- name = "Deer"
- icon_state = "deer"
-
-/datum/sprite_accessory/mam_body_markings/dog
- name = "Dog"
- icon_state = "dog"
-
-/datum/sprite_accessory/mam_body_markings/eevee
- name = "Eevee"
- icon_state = "eevee"
-
-/datum/sprite_accessory/mam_body_markings/hippo
- name = "Hippo"
- icon_state = "hippo"
-
-/datum/sprite_accessory/mam_body_markings/fennec
- name = "Fennec"
- icon_state = "Fennec"
-
-/datum/sprite_accessory/mam_body_markings/fox
- name = "Fox"
- icon_state = "fox"
-
-/datum/sprite_accessory/mam_body_markings/frog
- name = "Frog"
- icon_state = "frog"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/goat
- name = "Goat"
- icon_state = "goat"
-
-/datum/sprite_accessory/mam_body_markings/handsfeet
- name = "Handsfeet"
- icon_state = "handsfeet"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/hawk
- name = "Hawk"
- icon_state = "hawk"
-
-/datum/sprite_accessory/mam_body_markings/husky
- name = "Husky"
- icon_state = "husky"
-
-/datum/sprite_accessory/mam_body_markings/hyena
- name = "Hyena"
- icon_state = "hyena"
-
-/datum/sprite_accessory/mam_body_markings/lab
- name = "Lab"
- icon_state = "lab"
-
-/datum/sprite_accessory/mam_body_markings/moth
- name = "Moth"
- icon_state = "moth"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/otie
- name = "Otie"
- icon_state = "otie"
-
-/datum/sprite_accessory/mam_body_markings/otter
- name = "Otter"
- icon_state = "otter"
-
-/datum/sprite_accessory/mam_body_markings/orca
- name = "Orca"
- icon_state = "orca"
-
-/datum/sprite_accessory/mam_body_markings/panther
- name = "Panther"
- icon_state = "panther"
-
-/datum/sprite_accessory/mam_body_markings/possum
- name = "Possum"
- icon_state = "possum"
-
-/datum/sprite_accessory/mam_body_markings/raccoon
- name = "Raccoon"
- icon_state = "raccoon"
-
-/datum/sprite_accessory/mam_body_markings/pede
- name = "Scolipede"
- icon_state = "scolipede"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/shark
- name = "Shark"
- icon_state = "shark"
-
-/datum/sprite_accessory/mam_body_markings/skunk
- name = "Skunk"
- icon_state = "skunk"
-
-/datum/sprite_accessory/mam_body_markings/sergal
- name = "Sergal"
- icon_state = "sergal"
-
-/datum/sprite_accessory/mam_body_markings/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
-
-/datum/sprite_accessory/mam_body_markings/tajaran
- name = "Tajaran"
- icon_state = "tajaran"
-
-/datum/sprite_accessory/mam_body_markings/tiger
- name = "Tiger"
- icon_state = "tiger"
-
-/datum/sprite_accessory/mam_body_markings/turian
- name = "Turian"
- icon_state = "turian"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-/datum/sprite_accessory/mam_body_markings/wolf
- name = "Wolf"
- icon_state = "wolf"
-
-/datum/sprite_accessory/mam_body_markings/xeno
- name = "Xeno"
- icon_state = "xeno"
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
-
-
-/******************************************
-************ Taur Bodies ******************
-*******************************************/
-/datum/sprite_accessory/taur
- icon = 'modular_citadel/icons/mob/mam_taur.dmi'
- extra_icon = 'modular_citadel/icons/mob/mam_taur.dmi'
- extra = TRUE
- extra2_icon = 'modular_citadel/icons/mob/mam_taur.dmi'
- extra2 = TRUE
- center = TRUE
- dimension_x = 64
- var/taur_mode = NOT_TAURIC
- color_src = MATRIXED
-
-/datum/sprite_accessory/taur/none
- name = "None"
- icon_state = "None"
-
-/datum/sprite_accessory/taur/cow
- name = "Cow"
- icon_state = "cow"
- taur_mode = HOOF_TAURIC
-
-/datum/sprite_accessory/taur/deer
- name = "Deer"
- icon_state = "deer"
- taur_mode = HOOF_TAURIC
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/taur/drake
- name = "Drake"
- icon_state = "drake"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/drider
- name = "Drider"
- icon_state = "drider"
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/taur/eevee
- name = "Eevee"
- icon_state = "eevee"
- taur_mode = PAW_TAURIC
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/taur/fox
- name = "Fox"
- icon_state = "fox"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/husky
- name = "Husky"
- icon_state = "husky"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/horse
- name = "Horse"
- icon_state = "horse"
- taur_mode = HOOF_TAURIC
-
-/datum/sprite_accessory/taur/lab
- name = "Lab"
- icon_state = "lab"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/naga
- name = "Naga"
- icon_state = "naga"
- taur_mode = SNEK_TAURIC
-
-/datum/sprite_accessory/taur/otie
- name = "Otie"
- icon_state = "otie"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/pede
- name = "Scolipede"
- icon_state = "pede"
- taur_mode = PAW_TAURIC
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/taur/panther
- name = "Panther"
- icon_state = "panther"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/shepherd
- name = "Shepherd"
- icon_state = "shepherd"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/tentacle
- name = "Tentacle"
- icon_state = "tentacle"
- taur_mode = SNEK_TAURIC
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/taur/tiger
- name = "Tiger"
- icon_state = "tiger"
- taur_mode = PAW_TAURIC
-
-/datum/sprite_accessory/taur/wolf
- name = "Wolf"
- icon_state = "wolf"
- taur_mode = PAW_TAURIC
-
-/******************************************
-*************** Ayyliums ******************
-*******************************************/
-
-//Xeno Dorsal Tubes
-/datum/sprite_accessory/xeno_dorsal
- icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi'
-
-/datum/sprite_accessory/xeno_dorsal/standard
- name = "Standard"
- icon_state = "standard"
-
-/datum/sprite_accessory/xeno_dorsal/royal
- name = "Royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/xeno_dorsal/down
- name = "Dorsal Down"
- icon_state = "down"
-
-//Xeno Tail
-/datum/sprite_accessory/xeno_tail
- icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi'
-
-/datum/sprite_accessory/xeno_tail/none
- name = "None"
-
-/datum/sprite_accessory/xeno_tail/standard
- name = "Xenomorph Tail"
- icon_state = "xeno"
-
-//Xeno Caste Heads
-/datum/sprite_accessory/xeno_head
- icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi'
-
-/datum/sprite_accessory/xeno_head/standard
- name = "Standard"
- icon_state = "standard"
-
-/datum/sprite_accessory/xeno_head/royal
- name = "royal"
- icon_state = "royal"
-
-/datum/sprite_accessory/xeno_head/hollywood
- name = "hollywood"
- icon_state = "hollywood"
-
-/datum/sprite_accessory/xeno_head/warrior
- name = "warrior"
- icon_state = "warrior"
-
-// IPCs
-/datum/sprite_accessory/screen
- icon = 'modular_citadel/icons/mob/ipc_screens.dmi'
- color_src = null
-
-/datum/sprite_accessory/screen/blank
- name = "Blank"
- icon_state = "blank"
-
-/datum/sprite_accessory/screen/pink
- name = "Pink"
- icon_state = "pink"
-
-/datum/sprite_accessory/screen/green
- name = "Green"
- icon_state = "green"
-
-/datum/sprite_accessory/screen/red
- name = "Red"
- icon_state = "red"
-
-/datum/sprite_accessory/screen/blue
- name = "Blue"
- icon_state = "blue"
-
-/datum/sprite_accessory/screen/yellow
- name = "Yellow"
- icon_state = "yellow"
-
-/datum/sprite_accessory/screen/shower
- name = "Shower"
- icon_state = "shower"
-
-/datum/sprite_accessory/screen/nature
- name = "Nature"
- icon_state = "nature"
-
-/datum/sprite_accessory/screen/eight
- name = "Eight"
- icon_state = "eight"
-
-/datum/sprite_accessory/screen/goggles
- name = "Goggles"
- icon_state = "goggles"
-
-/datum/sprite_accessory/screen/heart
- name = "Heart"
- icon_state = "heart"
-
-/datum/sprite_accessory/screen/monoeye
- name = "Mono eye"
- icon_state = "monoeye"
-
-/datum/sprite_accessory/screen/breakout
- name = "Breakout"
- icon_state = "breakout"
-
-/datum/sprite_accessory/screen/purple
- name = "Purple"
- icon_state = "purple"
-
-/datum/sprite_accessory/screen/scroll
- name = "Scroll"
- icon_state = "scroll"
-
-/datum/sprite_accessory/screen/console
- name = "Console"
- icon_state = "console"
-
-/datum/sprite_accessory/screen/rgb
- name = "RGB"
- icon_state = "rgb"
-
-/datum/sprite_accessory/screen/golglider
- name = "Gol Glider"
- icon_state = "golglider"
-
-/datum/sprite_accessory/screen/rainbow
- name = "Rainbow"
- icon_state = "rainbow"
-
-/datum/sprite_accessory/screen/sunburst
- name = "Sunburst"
- icon_state = "sunburst"
-
-/datum/sprite_accessory/screen/static
- name = "Static"
- icon_state = "static"
-
-//Oracle Station sprites
-
-/datum/sprite_accessory/screen/bsod
- name = "BSOD"
- icon_state = "bsod"
-
-/datum/sprite_accessory/screen/redtext
- name = "Red Text"
- icon_state = "retext"
-
-/datum/sprite_accessory/screen/sinewave
- name = "Sine wave"
- icon_state = "sinewave"
-
-/datum/sprite_accessory/screen/squarewave
- name = "Square wave"
- icon_state = "squarwave"
-
-/datum/sprite_accessory/screen/ecgwave
- name = "ECG wave"
- icon_state = "ecgwave"
-
-/datum/sprite_accessory/screen/eyes
- name = "Eyes"
- icon_state = "eyes"
-
-/datum/sprite_accessory/screen/textdrop
- name = "Text drop"
- icon_state = "textdrop"
-
-/datum/sprite_accessory/screen/stars
- name = "Stars"
- icon_state = "stars"
-
-// IPC Antennas
-
-/datum/sprite_accessory/antenna
- icon = 'modular_citadel/icons/mob/ipc_antennas.dmi'
- color_src = MUTCOLORS2
-
-/datum/sprite_accessory/antenna/none
- name = "None"
- icon_state = "None"
-
-/datum/sprite_accessory/antenna/antennae
- name = "Angled Antennae"
- icon_state = "antennae"
-
-/datum/sprite_accessory/antenna/tvantennae
- name = "TV Antennae"
- icon_state = "tvantennae"
-
-/datum/sprite_accessory/antenna/cyberhead
- name = "Cyberhead"
- icon_state = "cyberhead"
-
-/datum/sprite_accessory/antenna/antlers
- name = "Antlers"
- icon_state = "antlers"
-
-/datum/sprite_accessory/antenna/crowned
- name = "Crowned"
- icon_state = "crowned"
-
-// *** Snooooow flaaaaake ***
-
-/datum/sprite_accessory/horns/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- icon = 'modular_citadel/icons/mob/mam_ears.dmi'
-
-/datum/sprite_accessory/snout/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
-
-/datum/sprite_accessory/mam_tails/shark/datashark
- name = "DataShark"
- icon_state = "datashark"
- ckeys_allowed = list("rubyflamewing")
-
-/datum/sprite_accessory/mam_tails_animated/shark/datashark
- name = "DataShark"
- icon_state = "datashark"
-
-/datum/sprite_accessory/mam_body_markings/shark/datashark
- name = "DataShark"
- icon_state = "datashark"
- ckeys_allowed = list("rubyflamewing")
-
-//Sabresune
-/datum/sprite_accessory/mam_ears/sabresune
- name = "sabresune"
- icon_state = "sabresune"
- ckeys_allowed = list("poojawa")
- extra = TRUE
-
-/datum/sprite_accessory/mam_tails/sabresune
- name = "sabresune"
- icon_state = "sabresune"
- ckeys_allowed = list("poojawa")
-
-
-/datum/sprite_accessory/mam_tails_animated/sabresune
- name = "sabresune"
- icon_state = "sabresune"
-
-/datum/sprite_accessory/mam_body_markings/sabresune
- name = "Sabresune"
- icon_state = "sabresune"
- ckeys_allowed = list("poojawa")
-
-
-//Lunasune
-/datum/sprite_accessory/mam_ears/lunasune
- name = "lunasune"
- icon_state = "lunasune"
- ckeys_allowed = list("invader4352")
-
-/datum/sprite_accessory/mam_tails/lunasune
- name = "lunasune"
- icon_state = "lunasune"
- ckeys_allowed = list("invader4352")
-
-/datum/sprite_accessory/mam_tails_animated/lunasune
- name = "lunasune"
- icon_state = "lunasune"
-
-/*************** VIRGO PORTED HAIRS ****************************/
-#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = #_name + " (Virgo)"
-//VIRGO PORTED HAIRS
-VHAIR("Short Hair Rosa", hair_rosa_s)
-VHAIR("Short Hair 80s", hair_80s_s)
-VHAIR("Long Bedhead", hair_long_bedhead_s)
-VHAIR("Dave", hair_dave_s)
-VHAIR("Country", hair_country_s)
-VHAIR("Shy", hair_shy_s)
-VHAIR("Unshaven Mohawk", hair_unshaven_mohawk_s)
-VHAIR("Manbun", hair_manbun_s)
-VHAIR("Longer Bedhead", hair_longer_bedhead_s)
-VHAIR("Ponytail", hair_ponytail_s)
-VHAIR("Ziegler", hair_ziegler_s)
-VHAIR("Emo Fringe", hair_emofringe_s)
-VHAIR("Very Short Over Eye Alt", hair_veryshortovereyealternate_s)
-VHAIR("Shorthime", hair_shorthime_s)
-VHAIR("High Tight", hair_hightight_s)
-VHAIR("Thinning Front", hair_thinningfront_s)
-VHAIR("Big Afro", hair_bigafro_s)
-VHAIR("Afro", hair_afro_s)
-VHAIR("High Braid", hair_hbraid_s)
-VHAIR("Braid", hair_braid_s)
-VHAIR("Sargeant", hair_sargeant_s)
-VHAIR("Gelled", hair_gelled_s)
-VHAIR("Kagami", hair_kagami_s)
-VHAIR("ShortTail", hair_stail_s)
-VHAIR("Gentle", hair_gentle_s)
-VHAIR("Grande", hair_grande_s)
-VHAIR("Bobcurl", hair_bobcurl_s)
-VHAIR("Pompadeur", hair_pompadour_s)
-VHAIR("Plait", hair_plait_s)
-VHAIR("Long", hair_long_s)
-VHAIR("Rattail", hair_rattail_s)
-VHAIR("Tajspiky", hair_tajspiky_s)
-VHAIR("Messy", hair_messy_s)
-VHAIR("Bangs", hair_bangs_s)
-VHAIR("TBraid", hair_tbraid_s)
-VHAIR("Toriyama2", hair_toriyama2_s)
-VHAIR("CIA", hair_cia_s)
-VHAIR("Mulder", hair_mulder_s)
-VHAIR("Scully", hair_scully_s)
-VHAIR("Nitori", hair_nitori_s)
-VHAIR("Joestar", hair_joestar_s)
-VHAIR("Ponytail4", hair_ponytail4_s)
-VHAIR("Ponytail5", hair_ponytail5_s)
-VHAIR("Beehive2", hair_beehive2_s)
-VHAIR("Short Braid", hair_shortbraid_s)
-VHAIR("Reverse Mohawk", hair_reversemohawk_s)
-VHAIR("SHort Bangs", hair_shortbangs_s)
-VHAIR("Half Shaved", hair_halfshaved_s)
-VHAIR("Longer Alt 2", hair_longeralt2_s)
-VHAIR("Bun", hair_bun_s)
-VHAIR("Curly", hair_curly_s)
-VHAIR("Victory", hair_victory_s)
-VHAIR("Ponytail6", hair_ponytail6_s)
-VHAIR("Undercut3", hair_undercut3_s)
-VHAIR("Bobcut Alt", hair_bobcultalt_s)
-VHAIR("Fingerwave", hair_fingerwave_s)
-VHAIR("Oxton", hair_oxton_s)
-VHAIR("Poofy2", hair_poofy2_s)
-VHAIR("Fringe Tail", hair_fringetail_s)
-VHAIR("Bun3", hair_bun3_s)
-VHAIR("Wisp", hair_wisp_s)
-VHAIR("Undercut2", hair_undercut2_s)
-VHAIR("TBob", hair_tbob_s)
-VHAIR("Spiky Ponytail", hair_spikyponytail_s)
-VHAIR("Rowbun", hair_rowbun_s)
-VHAIR("Rowdualtail", hair_rowdualtail_s)
-VHAIR("Rowbraid", hair_rowbraid_s)
-VHAIR("Shaved Mohawk", hair_shavedmohawk_s)
-VHAIR("Topknot", hair_topknot_s)
-VHAIR("Ronin", hair_ronin_s)
-VHAIR("Bowlcut2", hair_bowlcut2_s)
-VHAIR("Thinning Rear", hair_thinningrear_s)
-VHAIR("Thinning", hair_thinning_s)
-VHAIR("Jade", hair_jade_s)
-VHAIR("Bedhead", hair_bedhead_s)
-VHAIR("Dreadlocks", hair_dreads_s)
-VHAIR("Very Long", hair_vlong_s)
-VHAIR("Jensen", hair_jensen_s)
-VHAIR("Halfbang", hair_halfbang_s)
-VHAIR("Kusangi", hair_kusangi_s)
-VHAIR("Ponytail", hair_ponytail_s)
-VHAIR("Ponytail3", hair_ponytail3_s)
-VHAIR("Halfbang Alt", hair_halfbang_alt_s)
-VHAIR("Bedhead V2", hair_bedheadv2_s)
-VHAIR("Long Fringe", hair_longfringe_s)
-VHAIR("Flair", hair_flair_s)
-VHAIR("Bedhead V3", hair_bedheadv3_s)
-VHAIR("Himecut", hair_himecut_s)
-VHAIR("Curls", hair_curls_s)
-VHAIR("Very Long Fringe", hair_vlongfringe_s)
-VHAIR("Longest", hair_longest_s)
-VHAIR("Father", hair_father_s)
-VHAIR("Emo Long", hair_emolong_s)
-VHAIR("Short Hair 3", hair_shorthair3_s)
-VHAIR("Double Bun", hair_doublebun_s)
-VHAIR("Sleeze", hair_sleeze_s)
-VHAIR("Twintail", hair_twintail_s)
-VHAIR("Emo 2", hair_emo2_s)
-VHAIR("Low Fade", hair_lowfade_s)
-VHAIR("Med Fade", hair_medfade_s)
-VHAIR("High Fade", hair_highfade_s)
-VHAIR("Bald Fade", hair_baldfade_s)
-VHAIR("No Fade", hair_nofade_s)
-VHAIR("Trim Flat", hair_trimflat_s)
-VHAIR("Shaved", hair_shaved_s)
-VHAIR("Trimmed", hair_trimmed_s)
-VHAIR("Tight Bun", hair_tightbun_s)
-VHAIR("Short Hair 4", hair_d_s)
-VHAIR("Short Hair 5", hair_e_s)
-VHAIR("Short Hair 6", hair_f_s)
-VHAIR("Skinhead", hair_skinhead_s)
-VHAIR("Afro2", hair_afro2_s)
-VHAIR("Bobcut", hair_bobcut_s)
-VHAIR("Emo", hair_emo_s)
-VHAIR("Long Over Eye", hair_longovereye_s)
-VHAIR("Feather", hair_feather_s)
-VHAIR("Hitop", hair_hitop_s)
-VHAIR("Short Over Eye", hair_shortoverye_s)
-VHAIR("Straight", hair_straight_s)
-VHAIR("Buzzcut", hair_buzzcut_s)
-VHAIR("Combover", hair_combover_s)
-VHAIR("Crewcut", hair_crewcut_s)
-VHAIR("Devillock", hair_devilock_s)
-VHAIR("Clean", hair_clean_s)
-VHAIR("Shaggy", hair_shaggy_s)
-VHAIR("Updo", hair_updo_s)
-VHAIR("Mohawk", hair_mohawk_s)
-VHAIR("Odango", hair_odango_s)
-VHAIR("Ombre", hair_ombre_s)
-VHAIR("Parted", hair_parted_s)
-VHAIR("Quiff", hair_quiff_s)
-VHAIR("Volaju", hair_volaju_s)
-VHAIR("Bun2", hair_bun2_s)
-VHAIR("Rows1", hair_rows1_s)
-VHAIR("Rows2", hair_rows2_s)
-VHAIR("Dandy Pompadour", hair_dandypompadour_s)
-VHAIR("Poofy", hair_poofy_s)
-VHAIR("Toriyama", hair_toriyama_s)
-VHAIR("Drillruru", hair_drillruru_s)
-VHAIR("Bowlcut", hair_bowlcut_s)
-VHAIR("Coffee House", hair_coffeehouse_s)
-VHAIR("Family Man", hair_thefamilyman_s)
-VHAIR("Shaved Part", hair_shavedpart_s)
-VHAIR("Modern", hair_modern_s)
-VHAIR("One Shoulder", hair_oneshoulder_s)
-VHAIR("Very Short Over Eye", hair_veryshortovereye_s)
-VHAIR("Unkept", hair_unkept_s)
-VHAIR("Wife", hair_wife_s)
-VHAIR("Nia", hair_nia_s)
-VHAIR("Undercut", hair_undercut_s)
-VHAIR("Bobcut Alt", hair_bobcutalt_s)
-VHAIR("Short Hair 4 alt", hair_shorthair4_s)
-VHAIR("Tressshoulder", hair_tressshoulder_s)
- //END
-#undef VHAIR
-
-#define VFACE(_name, new_state) /datum/sprite_accessory/facial_hair/##new_state/icon_state=#new_state;;/datum/sprite_accessory/facial_hair/##new_state/name= #_name + " (Virgo)"
-VFACE("Watson", facial_watson_s)
-VFACE("Chaplin", facial_chaplin_s)
-VFACE("Fullbeard", facial_fullbeard_s)
-VFACE("Vandyke", facial_vandyke_s)
-VFACE("Elvis", facial_elvis_s)
-VFACE("Abe", facial_abe_s)
-VFACE("Chin", facial_chin_s)
-VFACE("GT", facial_gt_s)
-VFACE("Hip", facial_hip_s)
-VFACE("Hogan", facial_hogan_s)
-VFACE("Selleck", facial_selleck_s)
-VFACE("Neckbeard", facial_neckbeard_s)
-VFACE("Longbeard", facial_longbeard_s)
-VFACE("Dwarf", facial_dwarf_s)
-VFACE("Sideburn", facial_sideburn_s)
-VFACE("Mutton", facial_mutton_s)
-VFACE("Moustache", facial_moustache_s)
-VFACE("Pencilstache", facial_pencilstache_s)
-VFACE("Goatee", facial_goatee_s)
-VFACE("Smallstache", facial_smallstache_s)
-VFACE("Volaju", facial_volaju_s)
-VFACE("3 O\'clock", facial_3oclock_s)
-VFACE("5 O\'clock", facial_5oclock_s)
-VFACE("7 O\'clock", facial_7oclock_s)
-VFACE("5 O\'clock Moustache", facial_5oclockmoustache_s)
-VFACE("7 O\'clock", facial_7oclockmoustache_s)
-VFACE("Walrus", facial_walrus_s)
-VFACE("Muttonmus", facial_muttonmus_s)
-VFACE("Wise", facial_wise_s)
-VFACE("Martial Artist", facial_martialartist_s)
-VFACE("Dorsalfnil", facial_dorsalfnil_s)
-VFACE("Hornadorns", facial_hornadorns_s)
-VFACE("Spike", facial_spike_s)
-VFACE("Chinhorns", facial_chinhorns_s)
-VFACE("Cropped Fullbeard", facial_croppedfullbeard_s)
-VFACE("Chinless Beard", facial_chinlessbeard_s)
-VFACE("Moonshiner", facial_moonshiner_s)
-VFACE("Tribearder", facial_tribearder_s)
-#undef VFACE
diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
index 43931db689..02b98bdbf2 100644
--- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
@@ -18,9 +18,13 @@
return FALSE
return .
-/mob/living/carbon/proc/toggle_combat_mode()
+/mob/living/carbon/proc/toggle_combat_mode(forced)
if(recoveringstam)
return TRUE
+ if(!forced)
+ for(var/datum/status_effect/S in status_effects)
+ if(S.blocks_combatmode)
+ return TRUE
combatmode = !combatmode
if(voremode)
toggle_vore_mode()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human.dm b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
index 70bac64825..e0d592827e 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human.dm
@@ -1,30 +1,25 @@
/mob/living/carbon/human/species/mammal
race = /datum/species/mammal
-/mob/living/carbon/human/species/avian
- race = /datum/species/avian
-
-/mob/living/carbon/human/species/aquatic
- race = /datum/species/aquatic
-
/mob/living/carbon/human/species/insect
race = /datum/species/insect
/mob/living/carbon/human/species/xeno
race = /datum/species/xeno
-/mob/living/carbon/human/resist()
- . = ..()
- if(wear_suit && wear_suit.breakouttime)//added in human cuff breakout proc
+/mob/living/proc/resist_embedded()
+ return
+
+/mob/living/carbon/human/resist_embedded()
+ if(handcuffed || legcuffed || (wear_suit && wear_suit.breakouttime))
return
- if(.)
- if(canmove && !on_fire)
- for(var/obj/item/bodypart/L in bodyparts)
- if(istype(L) && L.embedded_objects.len)
- for(var/obj/item/I in L.embedded_objects)
- if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist
- remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully.
- return FALSE //Hands are occupied
+ if(canmove && !on_fire)
+ for(var/obj/item/bodypart/L in bodyparts)
+ if(istype(L) && L.embedded_objects.len)
+ for(var/obj/item/I in L.embedded_objects)
+ if(istype(I) && I.w_class >= WEIGHT_CLASS_NORMAL) //minimum weight class to insta-ripout via resist
+ remove_embedded_unsafe(L, I, src, 1.5) //forcefully call the remove embedded unsafe proc but with extra pain multiplier. if you want to remove it less painfully, examine and remove it carefully.
+ return TRUE //Hands are occupied
return
/mob/living/carbon/human/proc/remove_embedded_unsafe(obj/item/bodypart/L, obj/item/I, mob/user, painmul = 1)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/life.dm b/modular_citadel/code/modules/mob/living/carbon/human/life.dm
deleted file mode 100644
index e728d70c97..0000000000
--- a/modular_citadel/code/modules/mob/living/carbon/human/life.dm
+++ /dev/null
@@ -1,21 +0,0 @@
-/mob/living/carbon/human/Life()
- //citadel code
- if(stat != DEAD)
- handle_arousal()
- . = ..()
-
-/mob/living/carbon/human/calculate_affecting_pressure(pressure)
- if(ismob(loc))
- return ONE_ATMOSPHERE
- if(istype(loc, /obj/item/dogborg/sleeper))
- return ONE_ATMOSPHERE
- . = ..()
-
-/mob/living/carbon/human/update_health_hud(shown_health_amount)
- . = ..()
- if(!client || !hud_used)
- return
- if(hud_used.staminas)
- hud_used.staminas.icon_state = staminahudamount()
- if(hud_used.staminabuffer)
- hud_used.staminabuffer.icon_state = staminabufferhudamount()
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species.dm b/modular_citadel/code/modules/mob/living/carbon/human/species.dm
deleted file mode 100644
index 1e86da47e1..0000000000
--- a/modular_citadel/code/modules/mob/living/carbon/human/species.dm
+++ /dev/null
@@ -1,164 +0,0 @@
-/datum/species
- var/should_draw_citadel = FALSE
-
-/datum/species/proc/alt_spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
- if(!istype(M))
- return TRUE
- CHECK_DNA_AND_SPECIES(M)
- CHECK_DNA_AND_SPECIES(H)
-
- if(!istype(M)) //sanity check for drones.
- return TRUE
- if(M.mind)
- attacker_style = M.mind.martial_art
- if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
- log_combat(M, H, "attempted to touch")
- H.visible_message("[M] attempted to touch [H]!")
- return TRUE
- switch(M.a_intent)
- if(INTENT_HELP)
- if(M == H)
- althelp(M, H, attacker_style)
- return TRUE
- return FALSE
- if(INTENT_DISARM)
- altdisarm(M, H, attacker_style)
- return TRUE
- return FALSE
-
-/datum/species/proc/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
- if(user == target && istype(user))
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
- to_chat(user, "You're too exhausted for that.")
- return
- if(!user.resting)
- to_chat(user, "You can only force yourself up if you're on the ground.")
- return
- user.visible_message("[user] forces [p_them()]self up to [p_their()] feet!", "You force yourself up to your feet!")
- user.resting = 0
- user.update_canmove()
- user.adjustStaminaLossBuffered(user.stambuffer) //Rewards good stamina management by making it easier to instantly get up from resting
- playsound(user, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
-
-/datum/species/proc/altdisarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
- if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
- to_chat(user, "You're too exhausted.")
- return FALSE
- if(target.check_block())
- target.visible_message("[target] blocks [user]'s shoving attempt!")
- return FALSE
- if(attacker_style && attacker_style.disarm_act(user,target))
- return TRUE
- if(user.resting)
- return FALSE
- else
- if(user == target)
- return
- user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
- user.adjustStaminaLossBuffered(4)
- playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
-
- if(target.w_uniform)
- target.w_uniform.add_fingerprint(user)
- SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected)
-
- if(!target.resting)
- target.adjustStaminaLoss(5)
-
-
- var/turf/target_oldturf = target.loc
- var/shove_dir = get_dir(user.loc, target_oldturf)
- var/turf/target_shove_turf = get_step(target.loc, shove_dir)
- var/mob/living/carbon/human/target_collateral_human
- var/obj/structure/table/target_table
- var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied
-
- //Thank you based whoneedsspace
- target_collateral_human = locate(/mob/living/carbon/human) in target_shove_turf.contents
- if(target_collateral_human)
- shove_blocked = TRUE
- else
- target.Move(target_shove_turf, shove_dir)
- if(get_turf(target) == target_oldturf)
- var/thoushallnotpass = FALSE
- for(var/obj/O in target_shove_turf)
- if(O.density)
- shove_blocked = TRUE
- if(istype(O, /obj/structure/table))
- target_table = O
- else
- thoushallnotpass = TRUE
- if(thoushallnotpass)
- target_table = null
-
- if(target.is_shove_knockdown_blocked())
- return
-
- if(shove_blocked)
- var/directional_blocked = FALSE
- if(shove_dir in GLOB.cardinals) //Directional checks to make sure that we're not shoving through a windoor or something like that
- var/target_turf = get_turf(target)
- for(var/obj/O in target_turf)
- if(O.flags_1 & ON_BORDER_1 && O.dir == shove_dir && O.density)
- directional_blocked = TRUE
- break
- if(target_turf != target_shove_turf) //Make sure that we don't run the exact same check twice on the same tile
- for(var/obj/O in target_shove_turf)
- if(O.flags_1 & ON_BORDER_1 && O.dir == turn(shove_dir, 180) && O.density)
- directional_blocked = TRUE
- break
- var/targetatrest = target.resting
- if(((!target_table && !target_collateral_human) || directional_blocked) && !targetatrest)
- target.Knockdown(SHOVE_KNOCKDOWN_SOLID)
- user.visible_message("[user.name] shoves [target.name], knocking them down!",
- "You shove [target.name], knocking them down!", null, COMBAT_MESSAGE_RANGE)
- log_combat(user, target, "shoved", "knocking them down")
- else if(target_table)
- if(!targetatrest)
- target.Knockdown(SHOVE_KNOCKDOWN_TABLE)
- user.visible_message("[user.name] shoves [target.name] onto \the [target_table]!",
- "You shove [target.name] onto \the [target_table]!", null, COMBAT_MESSAGE_RANGE)
- target.forceMove(target_shove_turf)
- log_combat(user, target, "shoved", "onto [target_table]")
- else if(target_collateral_human && !targetatrest)
- target.Knockdown(SHOVE_KNOCKDOWN_HUMAN)
- if(!target_collateral_human.resting)
- target_collateral_human.Knockdown(SHOVE_KNOCKDOWN_COLLATERAL)
- user.visible_message("[user.name] shoves [target.name] into [target_collateral_human.name]!",
- "You shove [target.name] into [target_collateral_human.name]!", null, COMBAT_MESSAGE_RANGE)
- log_combat(user, target, "shoved", "into [target_collateral_human.name]")
-
- else
- user.visible_message("[user.name] shoves [target.name]!",
- "You shove [target.name]!", null, COMBAT_MESSAGE_RANGE)
- var/target_held_item = target.get_active_held_item()
- var/knocked_item = FALSE
- if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types))
- target_held_item = null
- if(!target.has_movespeed_modifier(SHOVE_SLOWDOWN_ID))
- target.add_movespeed_modifier(SHOVE_SLOWDOWN_ID, multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH)
- if(target_held_item)
- target.visible_message("[target.name]'s grip on \the [target_held_item] loosens!",
- "Your grip on \the [target_held_item] loosens!", null, COMBAT_MESSAGE_RANGE)
- addtimer(CALLBACK(target, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH)
- else if(target_held_item)
- target.dropItemToGround(target_held_item)
- knocked_item = TRUE
- target.visible_message("[target.name] drops \the [target_held_item]!!",
- "You drop \the [target_held_item]!!", null, COMBAT_MESSAGE_RANGE)
- var/append_message = ""
- if(target_held_item)
- if(knocked_item)
- append_message = "causing them to drop [target_held_item]"
- else
- append_message = "loosening their grip on [target_held_item]"
- log_combat(user, target, "shoved", append_message)
-
-
-////////////////////
-/////BODYPARTS/////
-////////////////////
-
-
-/obj/item/bodypart
- var/should_draw_citadel = FALSE
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
deleted file mode 100644
index 6b6349c0f3..0000000000
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ /dev/null
@@ -1,237 +0,0 @@
-/datum/species/mammal
- name = "Mammal"
- id = "mammal"
- default_color = "4B4B4B"
- should_draw_citadel = TRUE
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "legs")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
- attack_verb = "claw"
- attack_sound = 'sound/weapons/slash.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
- meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
- liked_food = MEAT | FRIED
- disliked_food = TOXIC
-
-//Curiosity killed the cat's wagging tail.
-/datum/species/mammal/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/mammal/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/mammal/can_wag_tail(mob/living/carbon/human/H)
- return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/mammal/is_wagging_tail(mob/living/carbon/human/H)
- return ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/mammal/start_wagging_tail(mob/living/carbon/human/H)
- if("mam_tail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_tail"
- mutant_bodyparts |= "mam_waggingtail"
- H.update_body()
-
-/datum/species/mammal/stop_wagging_tail(mob/living/carbon/human/H)
- if("mam_waggingtail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_waggingtail"
- mutant_bodyparts |= "mam_tail"
- H.update_body()
-
-
-/datum/species/mammal/qualifies_for_rank(rank, list/features)
- return TRUE
-
-
-//AVIAN//
-/datum/species/avian
- name = "Avian"
- id = "avian"
- say_mod = "chirps"
- default_color = "BCAC9B"
- should_draw_citadel = TRUE
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("mam_snouts", "wings", "taur", "mam_tail", "mam_body_markings", "taur")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Beak", "mam_body_markings" = "Hawk", "wings" = "None", "taur" = "None", "mam_tail" = "Hawk")
- attack_verb = "peck"
- attack_sound = 'sound/weapons/slash.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
- liked_food = MEAT | FRUIT
- disliked_food = TOXIC
-
-/datum/species/avian/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/avian/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/avian/can_wag_tail(mob/living/carbon/human/H)
- return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/avian/is_wagging_tail(mob/living/carbon/human/H)
- return ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/avian/start_wagging_tail(mob/living/carbon/human/H)
- if("mam_tail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_tail"
- mutant_bodyparts |= "mam_waggingtail"
- H.update_body()
-
-/datum/species/avian/stop_wagging_tail(mob/living/carbon/human/H)
- if("mam_waggingtail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_waggingtail"
- mutant_bodyparts |= "mam_tail"
- H.update_body()
-
-/datum/species/avian/qualifies_for_rank(rank, list/features)
- return TRUE
-
-//AQUATIC//
-/datum/species/aquatic
- name = "Aquatic"
- id = "aquatic"
- default_color = "BCAC9B"
- should_draw_citadel = TRUE
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("mam_tail", "mam_ears","mam_body_markings", "taur", "legs", "mam_snouts")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "Shark", "mam_ears" = "None", "mam_body_markings" = "Shark", "mam_snouts" = "Round", "taur" = "None", "legs" = "Normal Legs")
- attack_verb = "bite"
- attack_sound = 'sound/weapons/bite.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
- liked_food = MEAT
- disliked_food = TOXIC
- meat = /obj/item/reagent_containers/food/snacks/carpmeat/aquatic
-
-/datum/species/aquatic/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/aquatic/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/aquatic/can_wag_tail(mob/living/carbon/human/H)
- return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/aquatic/is_wagging_tail(mob/living/carbon/human/H)
- return ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/aquatic/start_wagging_tail(mob/living/carbon/human/H)
- if("mam_tail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_tail"
- mutant_bodyparts |= "mam_waggingtail"
- H.update_body()
-
-/datum/species/aquatic/stop_wagging_tail(mob/living/carbon/human/H)
- if("mam_waggingtail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_waggingtail"
- mutant_bodyparts |= "mam_tail"
- H.update_body()
-
-/datum/species/aquatic/qualifies_for_rank(rank, list/features)
- return TRUE
-
-//INSECT//
-/datum/species/insect
- name = "Insect"
- id = "insect"
- default_color = "BCAC9B"
- should_draw_citadel = TRUE
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
- mutant_bodyparts = list("mam_ears", "mam_body_markings", "mam_tail", "taur", "moth_wings", "mam_snouts")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "Plain", "mam_snouts" = "Bug", "mam_body_markings" = "Moth", "taur" = "None")
- attack_verb = "flutter" //wat?
- attack_sound = 'sound/weapons/slash.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
- liked_food = MEAT | FRUIT
- disliked_food = TOXIC
-
-/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/insect/can_wag_tail(mob/living/carbon/human/H)
- return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H)
- return ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H)
- if("mam_tail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_tail"
- mutant_bodyparts |= "mam_waggingtail"
- H.update_body()
-
-/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H)
- if("mam_waggingtail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_waggingtail"
- mutant_bodyparts |= "mam_tail"
- H.update_body()
-
-/datum/species/insect/qualifies_for_rank(rank, list/features)
- return TRUE
-
-//Alien//
-/datum/species/xeno
- // A cloning mistake, crossing human and xenomorph DNA
- name = "Xeno Hybrid"
- id = "xeno"
- say_mod = "hisses"
- default_color = "00FF00"
- should_draw_citadel = TRUE
- species_traits = list(MUTCOLORS,EYECOLOR,LIPS)
- inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "mam_body_markings", "taur", "legs")
- default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade Legs")
- attack_verb = "slash"
- attack_sound = 'sound/weapons/slash.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
- meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno
- skinned_type = /obj/item/stack/sheet/animalhide/xeno
- exotic_bloodtype = "L"
- damage_overlay_type = "xeno"
- liked_food = MEAT
-
-/datum/species/xeno/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
- if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs")
- species_traits += DIGITIGRADE
- if(DIGITIGRADE in species_traits)
- C.Digitigrade_Leg_Swap(FALSE)
- . = ..()
-
-/datum/species/xeno/on_species_loss(mob/living/carbon/human/C, datum/species/new_species)
- if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Normal Legs")
- species_traits -= DIGITIGRADE
- if(DIGITIGRADE in species_traits)
- C.Digitigrade_Leg_Swap(TRUE)
- . = ..()
-
-//Praise the Omnissiah, A challange worthy of my skills - HS
-
-//EXOTIC//
-//These races will likely include lots of downsides and upsides. Keep them relatively balanced.//
-
-//misc
-/mob/living/carbon/human/dummy
- no_vore = TRUE
-
-/mob/living/carbon/human/vore
- devourable = TRUE
- digestable = TRUE
- feeding = TRUE
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
deleted file mode 100644
index c18303ad84..0000000000
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ /dev/null
@@ -1,257 +0,0 @@
-/datum/species/jelly/slime
- name = "Xenobiological Slimeperson"
-
-//##########SLIMEPEOPLE##########
-
-/datum/species/jelly/roundstartslime
- name = "Slimeperson"
- id = "slimeperson"
- limbs_id = "slime"
- default_color = "00FFFF"
- species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
- inherent_traits = list(TRAIT_TOXINLOVER)
- mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur")
- default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
- say_mod = "says"
- hair_color = "mutcolor"
- hair_alpha = 160 //a notch brighter so it blends better.
- coldmod = 3
- heatmod = 1
- burnmod = 1
-
-/datum/species/jelly/roundstartslime/spec_death(gibbed, mob/living/carbon/human/H)
- if(H)
- stop_wagging_tail(H)
-
-/datum/species/jelly/roundstartslime/spec_stun(mob/living/carbon/human/H,amount)
- if(H)
- stop_wagging_tail(H)
- . = ..()
-
-/datum/species/jelly/roundstartslime/can_wag_tail(mob/living/carbon/human/H)
- return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/jelly/roundstartslime/is_wagging_tail(mob/living/carbon/human/H)
- return ("mam_waggingtail" in mutant_bodyparts)
-
-/datum/species/jelly/roundstartslime/start_wagging_tail(mob/living/carbon/human/H)
- if("mam_tail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_tail"
- mutant_bodyparts |= "mam_waggingtail"
- H.update_body()
-
-/datum/species/jelly/roundstartslime/stop_wagging_tail(mob/living/carbon/human/H)
- if("mam_waggingtail" in mutant_bodyparts)
- mutant_bodyparts -= "mam_waggingtail"
- mutant_bodyparts |= "mam_tail"
- H.update_body()
-
-
-/datum/action/innate/slime_change
- name = "Alter Form"
- check_flags = AB_CHECK_CONSCIOUS
- button_icon_state = "alter_form" //placeholder
- icon_icon = 'modular_citadel/icons/mob/actions/actions_slime.dmi'
- background_icon_state = "bg_alien"
-
-/datum/action/innate/slime_change/Activate()
- var/mob/living/carbon/human/H = owner
- if(!isjellyperson(H))
- return
- else
- H.visible_message("[owner] gains a look of \
- concentration while standing perfectly still.\
- Their body seems to shift and starts getting more goo-like.",
- "You focus intently on altering your body while \
- standing perfectly still...")
- change_form()
-
-/datum/action/innate/slime_change/proc/change_form()
- var/mob/living/carbon/human/H = owner
- var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Cancel")
- if(select_alteration == "Hair Style")
- if(H.gender == MALE)
- var/new_style = input(owner, "Select a facial hair style", "Hair Alterations") as null|anything in GLOB.facial_hair_styles_list
- if(new_style)
- H.facial_hair_style = new_style
- else
- H.facial_hair_style = "Shaved"
- //handle normal hair
- var/new_style = input(owner, "Select a hair style", "Hair Alterations") as null|anything in GLOB.hair_styles_list
- if(new_style)
- H.hair_style = new_style
- H.update_hair()
- else if (select_alteration == "Genitals")
- var/list/organs = list()
- var/operation = input("Select organ operation.", "Organ Manipulation", "cancel") in list("add sexual organ", "remove sexual organ", "cancel")
- switch(operation)
- if("add sexual organ")
- var/new_organ = input("Select sexual organ:", "Organ Manipulation") in list("Penis", "Testicles", "Breasts", "Vagina", "Womb", "Cancel")
- if(new_organ == "Penis")
- H.give_penis()
- else if(new_organ == "Testicles")
- H.give_balls()
- else if(new_organ == "Breasts")
- H.give_breasts()
- else if(new_organ == "Vagina")
- H.give_vagina()
- else if(new_organ == "Womb")
- H.give_womb()
- else
- return
- if("remove sexual organ")
- for(var/obj/item/organ/genital/X in H.internal_organs)
- var/obj/item/organ/I = X
- organs["[I.name] ([I.type])"] = I
- var/obj/item/organ = input("Select sexual organ:", "Organ Manipulation", null) in organs
- organ = organs[organ]
- if(!organ)
- return
- var/obj/item/organ/genital/O
- if(isorgan(organ))
- O = organ
- O.Remove(H)
- organ.forceMove(get_turf(H))
- qdel(organ)
- H.update_genitals()
-
- else if (select_alteration == "Ears")
- var/list/snowflake_ears_list = list("Normal" = null)
- for(var/path in GLOB.mam_ears_list)
- var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
- snowflake_ears_list[S.name] = path
- var/new_ears
- new_ears = input(owner, "Choose your character's ears:", "Ear Alteration") as null|anything in snowflake_ears_list
- if(new_ears)
- H.dna.features["mam_ears"] = new_ears
- H.update_body()
-
- else if (select_alteration == "Snout")
- var/list/snowflake_snouts_list = list("Normal" = null)
- for(var/path in GLOB.mam_snouts_list)
- var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
- snowflake_snouts_list[S.name] = path
- var/new_snout
- new_snout = input(owner, "Choose your character's face:", "Face Alteration") as null|anything in snowflake_snouts_list
- if(new_snout)
- H.dna.features["mam_snouts"] = new_snout
- H.update_body()
-
- else if (select_alteration == "Markings")
- var/list/snowflake_markings_list = list()
- for(var/path in GLOB.mam_body_markings_list)
- var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
- snowflake_markings_list[S.name] = path
- var/new_mam_body_markings
- new_mam_body_markings = input(H, "Choose your character's body markings:", "Marking Alteration") as null|anything in snowflake_markings_list
- if(new_mam_body_markings)
- H.dna.features["mam_body_markings"] = new_mam_body_markings
- if(new_mam_body_markings == "None")
- H.dna.features["mam_body_markings"] = "Plain"
- for(var/X in H.bodyparts) //propagates the markings changes
- var/obj/item/bodypart/BP = X
- BP.update_limb(FALSE, H)
- H.update_body()
-
- else if (select_alteration == "Tail")
- var/list/snowflake_tails_list = list("Normal" = null)
- for(var/path in GLOB.mam_tails_list)
- var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
- snowflake_tails_list[S.name] = path
- var/new_tail
- new_tail = input(owner, "Choose your character's Tail(s):", "Tail Alteration") as null|anything in snowflake_tails_list
- if(new_tail)
- H.dna.features["mam_tail"] = new_tail
- if(new_tail != "None")
- H.dna.features["taur"] = "None"
- H.update_body()
-
- else if (select_alteration == "Taur body")
- var/list/snowflake_taur_list = list("Normal" = null)
- for(var/path in GLOB.taur_list)
- var/datum/sprite_accessory/taur/instance = GLOB.taur_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
- snowflake_taur_list[S.name] = path
- var/new_taur
- new_taur = input(owner, "Choose your character's tauric body:", "Tauric Alteration") as null|anything in snowflake_taur_list
- if(new_taur)
- H.dna.features["taur"] = new_taur
- if(new_taur != "None")
- H.dna.features["mam_tail"] = "None"
- H.update_body()
-
- else if (select_alteration == "Penis")
- for(var/obj/item/organ/genital/penis/X in H.internal_organs)
- qdel(X)
- var/new_shape
- new_shape = input(owner, "Choose your character's dong", "Genital Alteration") as null|anything in GLOB.cock_shapes_list
- if(new_shape)
- H.dna.features["cock_shape"] = new_shape
- H.update_genitals()
- H.give_balls()
- H.give_penis()
- H.apply_overlay()
-
-
- else if (select_alteration == "Vagina")
- for(var/obj/item/organ/genital/vagina/X in H.internal_organs)
- qdel(X)
- var/new_shape
- new_shape = input(owner, "Choose your character's pussy", "Genital Alteration") as null|anything in GLOB.vagina_shapes_list
- if(new_shape)
- H.dna.features["vag_shape"] = new_shape
- H.update_genitals()
- H.give_womb()
- H.give_vagina()
- H.apply_overlay()
-
- else if (select_alteration == "Penis Length")
- for(var/obj/item/organ/genital/penis/X in H.internal_organs)
- qdel(X)
- var/new_length
- new_length = input(owner, "Penis length in inches:\n([COCK_SIZE_MIN]-[COCK_SIZE_MAX])", "Genital Alteration") as num|null
- if(new_length)
- H.dna.features["cock_length"] = max(min( round(text2num(new_length)), COCK_SIZE_MAX),COCK_SIZE_MIN)
- H.update_genitals()
- H.apply_overlay()
- H.give_balls()
- H.give_penis()
-
- else if (select_alteration == "Breast Size")
- for(var/obj/item/organ/genital/breasts/X in H.internal_organs)
- qdel(X)
- var/new_size
- new_size = input(owner, "Breast Size", "Genital Alteration") as null|anything in GLOB.breasts_size_list
- if(new_size)
- H.dna.features["breasts_size"] = new_size
- H.update_genitals()
- H.apply_overlay()
- H.give_breasts()
-
- else if (select_alteration == "Breast Shape")
- for(var/obj/item/organ/genital/breasts/X in H.internal_organs)
- qdel(X)
- var/new_shape
- new_shape = input(owner, "Breast Shape", "Genital Alteration") as null|anything in GLOB.breasts_shapes_list
- if(new_shape)
- H.dna.features["breasts_shape"] = new_shape
- H.update_genitals()
- H.apply_overlay()
- H.give_breasts()
-
- else
- return
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index ac79ea7f25..ed33041d58 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -116,7 +116,7 @@
to_chat(src, "You're too exhausted to keep going...")
resting = TRUE
if(combatmode)
- toggle_combat_mode()
+ toggle_combat_mode(TRUE)
recoveringstam = TRUE
filters += CIT_FILTER_STAMINACRIT
update_canmove()
diff --git a/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm b/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm
new file mode 100644
index 0000000000..b1e112aac5
--- /dev/null
+++ b/modular_citadel/code/modules/mob/living/silicon/ai/vox_sounds.dm
@@ -0,0 +1,633 @@
+// List is required to compile the resources into the game when it loads.
+// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
+#ifdef AI_VOX
+
+GLOBAL_LIST_INIT(vox_sounds_male, list("," = 'modular_citadel/sound/vox/_comma.ogg',
+"." = 'modular_citadel/sound/vox/_period.ogg',
+"a" = 'modular_citadel/sound/vox/a.ogg',
+"accelerating" = 'modular_citadel/sound/vox/accelerating.ogg',
+"accelerator" = 'modular_citadel/sound/vox/accelerator.ogg',
+"accepted" = 'modular_citadel/sound/vox/accepted.ogg',
+"access" = 'modular_citadel/sound/vox/access.ogg',
+"acknowledge" = 'modular_citadel/sound/vox/acknowledge.ogg',
+"acknowledged" = 'modular_citadel/sound/vox/acknowledged.ogg',
+"acquired" = 'modular_citadel/sound/vox/acquired.ogg',
+"acquisition" = 'modular_citadel/sound/vox/acquisition.ogg',
+"across" = 'modular_citadel/sound/vox/across.ogg',
+"activate" = 'modular_citadel/sound/vox/activate.ogg',
+"activated" = 'modular_citadel/sound/vox/activated.ogg',
+"activity" = 'modular_citadel/sound/vox/activity.ogg',
+"adios" = 'modular_citadel/sound/vox/adios.ogg',
+"administration" = 'modular_citadel/sound/vox/administration.ogg',
+"advanced" = 'modular_citadel/sound/vox/advanced.ogg',
+"after" = 'modular_citadel/sound/vox/after.ogg',
+"agent" = 'modular_citadel/sound/vox/agent.ogg',
+"alarm" = 'modular_citadel/sound/vox/alarm.ogg',
+"alert" = 'modular_citadel/sound/vox/alert.ogg',
+"alien" = 'modular_citadel/sound/vox/alien.ogg',
+"aligned" = 'modular_citadel/sound/vox/aligned.ogg',
+"all" = 'modular_citadel/sound/vox/all.ogg',
+"alpha" = 'modular_citadel/sound/vox/alpha.ogg',
+"am" = 'modular_citadel/sound/vox/am.ogg',
+"amigo" = 'modular_citadel/sound/vox/amigo.ogg',
+"ammunition" = 'modular_citadel/sound/vox/ammunition.ogg',
+"an" = 'modular_citadel/sound/vox/an.ogg',
+"and" = 'modular_citadel/sound/vox/and.ogg',
+"announcement" = 'modular_citadel/sound/vox/announcement.ogg',
+"anomalous" = 'modular_citadel/sound/vox/anomalous.ogg',
+"antenna" = 'modular_citadel/sound/vox/antenna.ogg',
+"any" = 'modular_citadel/sound/vox/any.ogg',
+"apprehend" = 'modular_citadel/sound/vox/apprehend.ogg',
+"approach" = 'modular_citadel/sound/vox/approach.ogg',
+"are" = 'modular_citadel/sound/vox/are.ogg',
+"area" = 'modular_citadel/sound/vox/area.ogg',
+"arm" = 'modular_citadel/sound/vox/arm.ogg',
+"armed" = 'modular_citadel/sound/vox/armed.ogg',
+"armor" = 'modular_citadel/sound/vox/armor.ogg',
+"armory" = 'modular_citadel/sound/vox/armory.ogg',
+"arrest" = 'modular_citadel/sound/vox/arrest.ogg',
+"ass" = 'modular_citadel/sound/vox/ass.ogg',
+"at" = 'modular_citadel/sound/vox/at.ogg',
+"atomic" = 'modular_citadel/sound/vox/atomic.ogg',
+"attention" = 'modular_citadel/sound/vox/attention.ogg',
+"authorize" = 'modular_citadel/sound/vox/authorize.ogg',
+"authorized" = 'modular_citadel/sound/vox/authorized.ogg',
+"automatic" = 'modular_citadel/sound/vox/automatic.ogg',
+"away" = 'modular_citadel/sound/vox/away.ogg',
+"b" = 'modular_citadel/sound/vox/b.ogg',
+"back" = 'modular_citadel/sound/vox/back.ogg',
+"backman" = 'modular_citadel/sound/vox/backman.ogg',
+"bad" = 'modular_citadel/sound/vox/bad.ogg',
+"bag" = 'modular_citadel/sound/vox/bag.ogg',
+"bailey" = 'modular_citadel/sound/vox/bailey.ogg',
+"barracks" = 'modular_citadel/sound/vox/barracks.ogg',
+"base" = 'modular_citadel/sound/vox/base.ogg',
+"bay" = 'modular_citadel/sound/vox/bay.ogg',
+"be" = 'modular_citadel/sound/vox/be.ogg',
+"been" = 'modular_citadel/sound/vox/been.ogg',
+"before" = 'modular_citadel/sound/vox/before.ogg',
+"beyond" = 'modular_citadel/sound/vox/beyond.ogg',
+"biohazard" = 'modular_citadel/sound/vox/biohazard.ogg',
+"biological" = 'modular_citadel/sound/vox/biological.ogg',
+"birdwell" = 'modular_citadel/sound/vox/birdwell.ogg',
+"bizwarn" = 'modular_citadel/sound/vox/bizwarn.ogg',
+"black" = 'modular_citadel/sound/vox/black.ogg',
+"blast" = 'modular_citadel/sound/vox/blast.ogg',
+"blocked" = 'modular_citadel/sound/vox/blocked.ogg',
+"bloop" = 'modular_citadel/sound/vox/bloop.ogg',
+"blue" = 'modular_citadel/sound/vox/blue.ogg',
+"bottom" = 'modular_citadel/sound/vox/bottom.ogg',
+"bravo" = 'modular_citadel/sound/vox/bravo.ogg',
+"breach" = 'modular_citadel/sound/vox/breach.ogg',
+"breached" = 'modular_citadel/sound/vox/breached.ogg',
+"break" = 'modular_citadel/sound/vox/break.ogg',
+"bridge" = 'modular_citadel/sound/vox/bridge.ogg',
+"bust" = 'modular_citadel/sound/vox/bust.ogg',
+"but" = 'modular_citadel/sound/vox/but.ogg',
+"button" = 'modular_citadel/sound/vox/button.ogg',
+"buzwarn" = 'modular_citadel/sound/vox/buzwarn.ogg',
+"bypass" = 'modular_citadel/sound/vox/bypass.ogg',
+"c" = 'modular_citadel/sound/vox/c.ogg',
+"cable" = 'modular_citadel/sound/vox/cable.ogg',
+"call" = 'modular_citadel/sound/vox/call.ogg',
+"called" = 'modular_citadel/sound/vox/called.ogg',
+"canal" = 'modular_citadel/sound/vox/canal.ogg',
+"cap" = 'modular_citadel/sound/vox/cap.ogg',
+"captain" = 'modular_citadel/sound/vox/captain.ogg',
+"capture" = 'modular_citadel/sound/vox/capture.ogg',
+"captured" = 'modular_citadel/sound/vox/captured.ogg',
+"ceiling" = 'modular_citadel/sound/vox/ceiling.ogg',
+"celsius" = 'modular_citadel/sound/vox/celsius.ogg',
+"center" = 'modular_citadel/sound/vox/center.ogg',
+"centi" = 'modular_citadel/sound/vox/centi.ogg',
+"central" = 'modular_citadel/sound/vox/central.ogg',
+"chamber" = 'modular_citadel/sound/vox/chamber.ogg',
+"charlie" = 'modular_citadel/sound/vox/charlie.ogg',
+"check" = 'modular_citadel/sound/vox/check.ogg',
+"checkpoint" = 'modular_citadel/sound/vox/checkpoint.ogg',
+"chemical" = 'modular_citadel/sound/vox/chemical.ogg',
+"cleanup" = 'modular_citadel/sound/vox/cleanup.ogg',
+"clear" = 'modular_citadel/sound/vox/clear.ogg',
+"clearance" = 'modular_citadel/sound/vox/clearance.ogg',
+"close" = 'modular_citadel/sound/vox/close.ogg',
+"clown" = 'modular_citadel/sound/vox/clown.ogg',
+"code" = 'modular_citadel/sound/vox/code.ogg',
+"coded" = 'modular_citadel/sound/vox/coded.ogg',
+"collider" = 'modular_citadel/sound/vox/collider.ogg',
+"command" = 'modular_citadel/sound/vox/command.ogg',
+"communication" = 'modular_citadel/sound/vox/communication.ogg',
+"complex" = 'modular_citadel/sound/vox/complex.ogg',
+"computer" = 'modular_citadel/sound/vox/computer.ogg',
+"condition" = 'modular_citadel/sound/vox/condition.ogg',
+"containment" = 'modular_citadel/sound/vox/containment.ogg',
+"contamination" = 'modular_citadel/sound/vox/contamination.ogg',
+"control" = 'modular_citadel/sound/vox/control.ogg',
+"coolant" = 'modular_citadel/sound/vox/coolant.ogg',
+"coomer" = 'modular_citadel/sound/vox/coomer.ogg',
+"core" = 'modular_citadel/sound/vox/core.ogg',
+"correct" = 'modular_citadel/sound/vox/correct.ogg',
+"corridor" = 'modular_citadel/sound/vox/corridor.ogg',
+"crew" = 'modular_citadel/sound/vox/crew.ogg',
+"cross" = 'modular_citadel/sound/vox/cross.ogg',
+"cryogenic" = 'modular_citadel/sound/vox/cryogenic.ogg',
+"d" = 'modular_citadel/sound/vox/d.ogg',
+"dadeda" = 'modular_citadel/sound/vox/dadeda.ogg',
+"damage" = 'modular_citadel/sound/vox/damage.ogg',
+"damaged" = 'modular_citadel/sound/vox/damaged.ogg',
+"danger" = 'modular_citadel/sound/vox/danger.ogg',
+"day" = 'modular_citadel/sound/vox/day.ogg',
+"deactivated" = 'modular_citadel/sound/vox/deactivated.ogg',
+"decompression" = 'modular_citadel/sound/vox/decompression.ogg',
+"decontamination" = 'modular_citadel/sound/vox/decontamination.ogg',
+"deeoo" = 'modular_citadel/sound/vox/deeoo.ogg',
+"defense" = 'modular_citadel/sound/vox/defense.ogg',
+"degrees" = 'modular_citadel/sound/vox/degrees.ogg',
+"delta" = 'modular_citadel/sound/vox/delta.ogg',
+"denied" = 'modular_citadel/sound/vox/denied.ogg',
+"deploy" = 'modular_citadel/sound/vox/deploy.ogg',
+"deployed" = 'modular_citadel/sound/vox/deployed.ogg',
+"destroy" = 'modular_citadel/sound/vox/destroy.ogg',
+"destroyed" = 'modular_citadel/sound/vox/destroyed.ogg',
+"detain" = 'modular_citadel/sound/vox/detain.ogg',
+"detected" = 'modular_citadel/sound/vox/detected.ogg',
+"detonation" = 'modular_citadel/sound/vox/detonation.ogg',
+"device" = 'modular_citadel/sound/vox/device.ogg',
+"did" = 'modular_citadel/sound/vox/did.ogg',
+"die" = 'modular_citadel/sound/vox/die.ogg',
+"dimensional" = 'modular_citadel/sound/vox/dimensional.ogg',
+"dirt" = 'modular_citadel/sound/vox/dirt.ogg',
+"disengaged" = 'modular_citadel/sound/vox/disengaged.ogg',
+"dish" = 'modular_citadel/sound/vox/dish.ogg',
+"disposal" = 'modular_citadel/sound/vox/disposal.ogg',
+"distance" = 'modular_citadel/sound/vox/distance.ogg',
+"distortion" = 'modular_citadel/sound/vox/distortion.ogg',
+"do" = 'modular_citadel/sound/vox/do.ogg',
+"doctor" = 'modular_citadel/sound/vox/doctor.ogg',
+"doop" = 'modular_citadel/sound/vox/doop.ogg',
+"door" = 'modular_citadel/sound/vox/door.ogg',
+"down" = 'modular_citadel/sound/vox/down.ogg',
+"dual" = 'modular_citadel/sound/vox/dual.ogg',
+"duct" = 'modular_citadel/sound/vox/duct.ogg',
+"e" = 'modular_citadel/sound/vox/e.ogg',
+"east" = 'modular_citadel/sound/vox/east.ogg',
+"echo" = 'modular_citadel/sound/vox/echo.ogg',
+"ed" = 'modular_citadel/sound/vox/ed.ogg',
+"effect" = 'modular_citadel/sound/vox/effect.ogg',
+"egress" = 'modular_citadel/sound/vox/egress.ogg',
+"eight" = 'modular_citadel/sound/vox/eight.ogg',
+"eighteen" = 'modular_citadel/sound/vox/eighteen.ogg',
+"eighty" = 'modular_citadel/sound/vox/eighty.ogg',
+"electric" = 'modular_citadel/sound/vox/electric.ogg',
+"electromagnetic" = 'modular_citadel/sound/vox/electromagnetic.ogg',
+"elevator" = 'modular_citadel/sound/vox/elevator.ogg',
+"eleven" = 'modular_citadel/sound/vox/eleven.ogg',
+"eliminate" = 'modular_citadel/sound/vox/eliminate.ogg',
+"emergency" = 'modular_citadel/sound/vox/emergency.ogg',
+"enemy" = 'modular_citadel/sound/vox/enemy.ogg',
+"energy" = 'modular_citadel/sound/vox/energy.ogg',
+"engage" = 'modular_citadel/sound/vox/engage.ogg',
+"engaged" = 'modular_citadel/sound/vox/engaged.ogg',
+"engine" = 'modular_citadel/sound/vox/engine.ogg',
+"enter" = 'modular_citadel/sound/vox/enter.ogg',
+"entry" = 'modular_citadel/sound/vox/entry.ogg',
+"environment" = 'modular_citadel/sound/vox/environment.ogg',
+"error" = 'modular_citadel/sound/vox/error.ogg',
+"escape" = 'modular_citadel/sound/vox/escape.ogg',
+"evacuate" = 'modular_citadel/sound/vox/evacuate.ogg',
+"exchange" = 'modular_citadel/sound/vox/exchange.ogg',
+"exit" = 'modular_citadel/sound/vox/exit.ogg',
+"expect" = 'modular_citadel/sound/vox/expect.ogg',
+"experiment" = 'modular_citadel/sound/vox/experiment.ogg',
+"experimental" = 'modular_citadel/sound/vox/experimental.ogg',
+"explode" = 'modular_citadel/sound/vox/explode.ogg',
+"explosion" = 'modular_citadel/sound/vox/explosion.ogg',
+"exposure" = 'modular_citadel/sound/vox/exposure.ogg',
+"exterminate" = 'modular_citadel/sound/vox/exterminate.ogg',
+"extinguish" = 'modular_citadel/sound/vox/extinguish.ogg',
+"extinguisher" = 'modular_citadel/sound/vox/extinguisher.ogg',
+"extreme" = 'modular_citadel/sound/vox/extreme.ogg',
+"f" = 'modular_citadel/sound/vox/f.ogg',
+"face" = 'modular_citadel/sound/vox/face.ogg',
+"facility" = 'modular_citadel/sound/vox/facility.ogg',
+"fahrenheit" = 'modular_citadel/sound/vox/fahrenheit.ogg',
+"failed" = 'modular_citadel/sound/vox/failed.ogg',
+"failure" = 'modular_citadel/sound/vox/failure.ogg',
+"farthest" = 'modular_citadel/sound/vox/farthest.ogg',
+"fast" = 'modular_citadel/sound/vox/fast.ogg',
+"feet" = 'modular_citadel/sound/vox/feet.ogg',
+"field" = 'modular_citadel/sound/vox/field.ogg',
+"fifteen" = 'modular_citadel/sound/vox/fifteen.ogg',
+"fifth" = 'modular_citadel/sound/vox/fifth.ogg',
+"fifty" = 'modular_citadel/sound/vox/fifty.ogg',
+"final" = 'modular_citadel/sound/vox/final.ogg',
+"fine" = 'modular_citadel/sound/vox/fine.ogg',
+"fire" = 'modular_citadel/sound/vox/fire.ogg',
+"first" = 'modular_citadel/sound/vox/first.ogg',
+"five" = 'modular_citadel/sound/vox/five.ogg',
+"flag" = 'modular_citadel/sound/vox/flag.ogg',
+"flooding" = 'modular_citadel/sound/vox/flooding.ogg',
+"floor" = 'modular_citadel/sound/vox/floor.ogg',
+"fool" = 'modular_citadel/sound/vox/fool.ogg',
+"for" = 'modular_citadel/sound/vox/for.ogg',
+"forbidden" = 'modular_citadel/sound/vox/forbidden.ogg',
+"force" = 'modular_citadel/sound/vox/force.ogg',
+"forms" = 'modular_citadel/sound/vox/forms.ogg',
+"found" = 'modular_citadel/sound/vox/found.ogg',
+"four" = 'modular_citadel/sound/vox/four.ogg',
+"fourteen" = 'modular_citadel/sound/vox/fourteen.ogg',
+"fourth" = 'modular_citadel/sound/vox/fourth.ogg',
+"fourty" = 'modular_citadel/sound/vox/fourty.ogg',
+"foxtrot" = 'modular_citadel/sound/vox/foxtrot.ogg',
+"freeman" = 'modular_citadel/sound/vox/freeman.ogg',
+"freezer" = 'modular_citadel/sound/vox/freezer.ogg',
+"from" = 'modular_citadel/sound/vox/from.ogg',
+"front" = 'modular_citadel/sound/vox/front.ogg',
+"fuel" = 'modular_citadel/sound/vox/fuel.ogg',
+"g" = 'modular_citadel/sound/vox/g.ogg',
+"gay" = 'modular_citadel/sound/vox/gay.ogg',
+"get" = 'modular_citadel/sound/vox/get.ogg',
+"go" = 'modular_citadel/sound/vox/go.ogg',
+"going" = 'modular_citadel/sound/vox/going.ogg',
+"good" = 'modular_citadel/sound/vox/good.ogg',
+"goodbye" = 'modular_citadel/sound/vox/goodbye.ogg',
+"gordon" = 'modular_citadel/sound/vox/gordon.ogg',
+"got" = 'modular_citadel/sound/vox/got.ogg',
+"government" = 'modular_citadel/sound/vox/government.ogg',
+"granted" = 'modular_citadel/sound/vox/granted.ogg',
+"great" = 'modular_citadel/sound/vox/great.ogg',
+"green" = 'modular_citadel/sound/vox/green.ogg',
+"grenade" = 'modular_citadel/sound/vox/grenade.ogg',
+"guard" = 'modular_citadel/sound/vox/guard.ogg',
+"gulf" = 'modular_citadel/sound/vox/gulf.ogg',
+"gun" = 'modular_citadel/sound/vox/gun.ogg',
+"guthrie" = 'modular_citadel/sound/vox/guthrie.ogg',
+"handling" = 'modular_citadel/sound/vox/handling.ogg',
+"hangar" = 'modular_citadel/sound/vox/hangar.ogg',
+"has" = 'modular_citadel/sound/vox/has.ogg',
+"have" = 'modular_citadel/sound/vox/have.ogg',
+"hazard" = 'modular_citadel/sound/vox/hazard.ogg',
+"head" = 'modular_citadel/sound/vox/head.ogg',
+"health" = 'modular_citadel/sound/vox/health.ogg',
+"heat" = 'modular_citadel/sound/vox/heat.ogg',
+"helicopter" = 'modular_citadel/sound/vox/helicopter.ogg',
+"helium" = 'modular_citadel/sound/vox/helium.ogg',
+"hello" = 'modular_citadel/sound/vox/hello.ogg',
+"help" = 'modular_citadel/sound/vox/help.ogg',
+"here" = 'modular_citadel/sound/vox/here.ogg',
+"hide" = 'modular_citadel/sound/vox/hide.ogg',
+"high" = 'modular_citadel/sound/vox/high.ogg',
+"highest" = 'modular_citadel/sound/vox/highest.ogg',
+"hit" = 'modular_citadel/sound/vox/hit.ogg',
+"holds" = 'modular_citadel/sound/vox/holds.ogg',
+"hole" = 'modular_citadel/sound/vox/hole.ogg',
+"hostile" = 'modular_citadel/sound/vox/hostile.ogg',
+"hot" = 'modular_citadel/sound/vox/hot.ogg',
+"hotel" = 'modular_citadel/sound/vox/hotel.ogg',
+"hour" = 'modular_citadel/sound/vox/hour.ogg',
+"hours" = 'modular_citadel/sound/vox/hours.ogg',
+"hundred" = 'modular_citadel/sound/vox/hundred.ogg',
+"hydro" = 'modular_citadel/sound/vox/hydro.ogg',
+"i" = 'modular_citadel/sound/vox/i.ogg',
+"idiot" = 'modular_citadel/sound/vox/idiot.ogg',
+"illegal" = 'modular_citadel/sound/vox/illegal.ogg',
+"immediate" = 'modular_citadel/sound/vox/immediate.ogg',
+"immediately" = 'modular_citadel/sound/vox/immediately.ogg',
+"in" = 'modular_citadel/sound/vox/in.ogg',
+"inches" = 'modular_citadel/sound/vox/inches.ogg',
+"india" = 'modular_citadel/sound/vox/india.ogg',
+"ing" = 'modular_citadel/sound/vox/ing.ogg',
+"inoperative" = 'modular_citadel/sound/vox/inoperative.ogg',
+"inside" = 'modular_citadel/sound/vox/inside.ogg',
+"inspection" = 'modular_citadel/sound/vox/inspection.ogg',
+"inspector" = 'modular_citadel/sound/vox/inspector.ogg',
+"interchange" = 'modular_citadel/sound/vox/interchange.ogg',
+"intruder" = 'modular_citadel/sound/vox/intruder.ogg',
+"invallid" = 'modular_citadel/sound/vox/invallid.ogg',
+"invasion" = 'modular_citadel/sound/vox/invasion.ogg',
+"is" = 'modular_citadel/sound/vox/is.ogg',
+"it" = 'modular_citadel/sound/vox/it.ogg',
+"johnson" = 'modular_citadel/sound/vox/johnson.ogg',
+"juliet" = 'modular_citadel/sound/vox/juliet.ogg',
+"key" = 'modular_citadel/sound/vox/key.ogg',
+"kill" = 'modular_citadel/sound/vox/kill.ogg',
+"kilo" = 'modular_citadel/sound/vox/kilo.ogg',
+"kit" = 'modular_citadel/sound/vox/kit.ogg',
+"lab" = 'modular_citadel/sound/vox/lab.ogg',
+"lambda" = 'modular_citadel/sound/vox/lambda.ogg',
+"laser" = 'modular_citadel/sound/vox/laser.ogg',
+"last" = 'modular_citadel/sound/vox/last.ogg',
+"launch" = 'modular_citadel/sound/vox/launch.ogg',
+"leak" = 'modular_citadel/sound/vox/leak.ogg',
+"leave" = 'modular_citadel/sound/vox/leave.ogg',
+"left" = 'modular_citadel/sound/vox/left.ogg',
+"legal" = 'modular_citadel/sound/vox/legal.ogg',
+"level" = 'modular_citadel/sound/vox/level.ogg',
+"lever" = 'modular_citadel/sound/vox/lever.ogg',
+"lie" = 'modular_citadel/sound/vox/lie.ogg',
+"lieutenant" = 'modular_citadel/sound/vox/lieutenant.ogg',
+"life" = 'modular_citadel/sound/vox/life.ogg',
+"light" = 'modular_citadel/sound/vox/light.ogg',
+"lima" = 'modular_citadel/sound/vox/lima.ogg',
+"liquid" = 'modular_citadel/sound/vox/liquid.ogg',
+"loading" = 'modular_citadel/sound/vox/loading.ogg',
+"locate" = 'modular_citadel/sound/vox/locate.ogg',
+"located" = 'modular_citadel/sound/vox/located.ogg',
+"location" = 'modular_citadel/sound/vox/location.ogg',
+"lock" = 'modular_citadel/sound/vox/lock.ogg',
+"locked" = 'modular_citadel/sound/vox/locked.ogg',
+"locker" = 'modular_citadel/sound/vox/locker.ogg',
+"lockout" = 'modular_citadel/sound/vox/lockout.ogg',
+"lower" = 'modular_citadel/sound/vox/lower.ogg',
+"lowest" = 'modular_citadel/sound/vox/lowest.ogg',
+"magnetic" = 'modular_citadel/sound/vox/magnetic.ogg',
+"main" = 'modular_citadel/sound/vox/main.ogg',
+"maintenance" = 'modular_citadel/sound/vox/maintenance.ogg',
+"malfunction" = 'modular_citadel/sound/vox/malfunction.ogg',
+"man" = 'modular_citadel/sound/vox/man.ogg',
+"mass" = 'modular_citadel/sound/vox/mass.ogg',
+"materials" = 'modular_citadel/sound/vox/materials.ogg',
+"maximum" = 'modular_citadel/sound/vox/maximum.ogg',
+"may" = 'modular_citadel/sound/vox/may.ogg',
+"med" = 'modular_citadel/sound/vox/med.ogg',
+"medical" = 'modular_citadel/sound/vox/medical.ogg',
+"men" = 'modular_citadel/sound/vox/men.ogg',
+"mercy" = 'modular_citadel/sound/vox/mercy.ogg',
+"mesa" = 'modular_citadel/sound/vox/mesa.ogg',
+"message" = 'modular_citadel/sound/vox/message.ogg',
+"meter" = 'modular_citadel/sound/vox/meter.ogg',
+"micro" = 'modular_citadel/sound/vox/micro.ogg',
+"middle" = 'modular_citadel/sound/vox/middle.ogg',
+"mike" = 'modular_citadel/sound/vox/mike.ogg',
+"miles" = 'modular_citadel/sound/vox/miles.ogg',
+"military" = 'modular_citadel/sound/vox/military.ogg',
+"milli" = 'modular_citadel/sound/vox/milli.ogg',
+"million" = 'modular_citadel/sound/vox/million.ogg',
+"minefield" = 'modular_citadel/sound/vox/minefield.ogg',
+"minimum" = 'modular_citadel/sound/vox/minimum.ogg',
+"minutes" = 'modular_citadel/sound/vox/minutes.ogg',
+"mister" = 'modular_citadel/sound/vox/mister.ogg',
+"mode" = 'modular_citadel/sound/vox/mode.ogg',
+"motor" = 'modular_citadel/sound/vox/motor.ogg',
+"motorpool" = 'modular_citadel/sound/vox/motorpool.ogg',
+"move" = 'modular_citadel/sound/vox/move.ogg',
+"must" = 'modular_citadel/sound/vox/must.ogg',
+"nearest" = 'modular_citadel/sound/vox/nearest.ogg',
+"nice" = 'modular_citadel/sound/vox/nice.ogg',
+"nine" = 'modular_citadel/sound/vox/nine.ogg',
+"nineteen" = 'modular_citadel/sound/vox/nineteen.ogg',
+"ninety" = 'modular_citadel/sound/vox/ninety.ogg',
+"no" = 'modular_citadel/sound/vox/no.ogg',
+"nominal" = 'modular_citadel/sound/vox/nominal.ogg',
+"north" = 'modular_citadel/sound/vox/north.ogg',
+"not" = 'modular_citadel/sound/vox/not.ogg',
+"november" = 'modular_citadel/sound/vox/november.ogg',
+"now" = 'modular_citadel/sound/vox/now.ogg',
+"number" = 'modular_citadel/sound/vox/number.ogg',
+"objective" = 'modular_citadel/sound/vox/objective.ogg',
+"observation" = 'modular_citadel/sound/vox/observation.ogg',
+"of" = 'modular_citadel/sound/vox/of.ogg',
+"officer" = 'modular_citadel/sound/vox/officer.ogg',
+"ok" = 'modular_citadel/sound/vox/ok.ogg',
+"on" = 'modular_citadel/sound/vox/on.ogg',
+"one" = 'modular_citadel/sound/vox/one.ogg',
+"open" = 'modular_citadel/sound/vox/open.ogg',
+"operating" = 'modular_citadel/sound/vox/operating.ogg',
+"operations" = 'modular_citadel/sound/vox/operations.ogg',
+"operative" = 'modular_citadel/sound/vox/operative.ogg',
+"option" = 'modular_citadel/sound/vox/option.ogg',
+"order" = 'modular_citadel/sound/vox/order.ogg',
+"organic" = 'modular_citadel/sound/vox/organic.ogg',
+"oscar" = 'modular_citadel/sound/vox/oscar.ogg',
+"out" = 'modular_citadel/sound/vox/out.ogg',
+"outside" = 'modular_citadel/sound/vox/outside.ogg',
+"over" = 'modular_citadel/sound/vox/over.ogg',
+"overload" = 'modular_citadel/sound/vox/overload.ogg',
+"override" = 'modular_citadel/sound/vox/override.ogg',
+"pacify" = 'modular_citadel/sound/vox/pacify.ogg',
+"pain" = 'modular_citadel/sound/vox/pain.ogg',
+"pal" = 'modular_citadel/sound/vox/pal.ogg',
+"panel" = 'modular_citadel/sound/vox/panel.ogg',
+"percent" = 'modular_citadel/sound/vox/percent.ogg',
+"perimeter" = 'modular_citadel/sound/vox/perimeter.ogg',
+"permitted" = 'modular_citadel/sound/vox/permitted.ogg',
+"personnel" = 'modular_citadel/sound/vox/personnel.ogg',
+"pipe" = 'modular_citadel/sound/vox/pipe.ogg',
+"plant" = 'modular_citadel/sound/vox/plant.ogg',
+"platform" = 'modular_citadel/sound/vox/platform.ogg',
+"please" = 'modular_citadel/sound/vox/please.ogg',
+"point" = 'modular_citadel/sound/vox/point.ogg',
+"portal" = 'modular_citadel/sound/vox/portal.ogg',
+"power" = 'modular_citadel/sound/vox/power.ogg',
+"presence" = 'modular_citadel/sound/vox/presence.ogg',
+"press" = 'modular_citadel/sound/vox/press.ogg',
+"primary" = 'modular_citadel/sound/vox/primary.ogg',
+"proceed" = 'modular_citadel/sound/vox/proceed.ogg',
+"processing" = 'modular_citadel/sound/vox/processing.ogg',
+"progress" = 'modular_citadel/sound/vox/progress.ogg',
+"proper" = 'modular_citadel/sound/vox/proper.ogg',
+"propulsion" = 'modular_citadel/sound/vox/propulsion.ogg',
+"prosecute" = 'modular_citadel/sound/vox/prosecute.ogg',
+"protective" = 'modular_citadel/sound/vox/protective.ogg',
+"push" = 'modular_citadel/sound/vox/push.ogg',
+"quantum" = 'modular_citadel/sound/vox/quantum.ogg',
+"quebec" = 'modular_citadel/sound/vox/quebec.ogg',
+"question" = 'modular_citadel/sound/vox/question.ogg',
+"questioning" = 'modular_citadel/sound/vox/questioning.ogg',
+"quick" = 'modular_citadel/sound/vox/quick.ogg',
+"quit" = 'modular_citadel/sound/vox/quit.ogg',
+"radiation" = 'modular_citadel/sound/vox/radiation.ogg',
+"radioactive" = 'modular_citadel/sound/vox/radioactive.ogg',
+"rads" = 'modular_citadel/sound/vox/rads.ogg',
+"rapid" = 'modular_citadel/sound/vox/rapid.ogg',
+"reach" = 'modular_citadel/sound/vox/reach.ogg',
+"reached" = 'modular_citadel/sound/vox/reached.ogg',
+"reactor" = 'modular_citadel/sound/vox/reactor.ogg',
+"red" = 'modular_citadel/sound/vox/red.ogg',
+"relay" = 'modular_citadel/sound/vox/relay.ogg',
+"released" = 'modular_citadel/sound/vox/released.ogg',
+"remaining" = 'modular_citadel/sound/vox/remaining.ogg',
+"renegade" = 'modular_citadel/sound/vox/renegade.ogg',
+"repair" = 'modular_citadel/sound/vox/repair.ogg',
+"report" = 'modular_citadel/sound/vox/report.ogg',
+"reports" = 'modular_citadel/sound/vox/reports.ogg',
+"required" = 'modular_citadel/sound/vox/required.ogg',
+"research" = 'modular_citadel/sound/vox/research.ogg',
+"reset" = 'modular_citadel/sound/vox/reset.ogg',
+"resevoir" = 'modular_citadel/sound/vox/resevoir.ogg',
+"resistance" = 'modular_citadel/sound/vox/resistance.ogg',
+"returned" = 'modular_citadel/sound/vox/returned.ogg',
+"right" = 'modular_citadel/sound/vox/right.ogg',
+"rocket" = 'modular_citadel/sound/vox/rocket.ogg',
+"roger" = 'modular_citadel/sound/vox/roger.ogg',
+"romeo" = 'modular_citadel/sound/vox/romeo.ogg',
+"room" = 'modular_citadel/sound/vox/room.ogg',
+"round" = 'modular_citadel/sound/vox/round.ogg',
+"run" = 'modular_citadel/sound/vox/run.ogg',
+"safe" = 'modular_citadel/sound/vox/safe.ogg',
+"safety" = 'modular_citadel/sound/vox/safety.ogg',
+"sargeant" = 'modular_citadel/sound/vox/sargeant.ogg',
+"satellite" = 'modular_citadel/sound/vox/satellite.ogg',
+"save" = 'modular_citadel/sound/vox/save.ogg',
+"science" = 'modular_citadel/sound/vox/science.ogg',
+"scores" = 'modular_citadel/sound/vox/scores.ogg',
+"scream" = 'modular_citadel/sound/vox/scream.ogg',
+"screen" = 'modular_citadel/sound/vox/screen.ogg',
+"search" = 'modular_citadel/sound/vox/search.ogg',
+"second" = 'modular_citadel/sound/vox/second.ogg',
+"secondary" = 'modular_citadel/sound/vox/secondary.ogg',
+"seconds" = 'modular_citadel/sound/vox/seconds.ogg',
+"sector" = 'modular_citadel/sound/vox/sector.ogg',
+"secure" = 'modular_citadel/sound/vox/secure.ogg',
+"secured" = 'modular_citadel/sound/vox/secured.ogg',
+"security" = 'modular_citadel/sound/vox/security.ogg',
+"select" = 'modular_citadel/sound/vox/select.ogg',
+"selected" = 'modular_citadel/sound/vox/selected.ogg',
+"service" = 'modular_citadel/sound/vox/service.ogg',
+"seven" = 'modular_citadel/sound/vox/seven.ogg',
+"seventeen" = 'modular_citadel/sound/vox/seventeen.ogg',
+"seventy" = 'modular_citadel/sound/vox/seventy.ogg',
+"severe" = 'modular_citadel/sound/vox/severe.ogg',
+"sewage" = 'modular_citadel/sound/vox/sewage.ogg',
+"sewer" = 'modular_citadel/sound/vox/sewer.ogg',
+"shield" = 'modular_citadel/sound/vox/shield.ogg',
+"shipment" = 'modular_citadel/sound/vox/shipment.ogg',
+"shock" = 'modular_citadel/sound/vox/shock.ogg',
+"shoot" = 'modular_citadel/sound/vox/shoot.ogg',
+"shower" = 'modular_citadel/sound/vox/shower.ogg',
+"shut" = 'modular_citadel/sound/vox/shut.ogg',
+"side" = 'modular_citadel/sound/vox/side.ogg',
+"sierra" = 'modular_citadel/sound/vox/sierra.ogg',
+"sight" = 'modular_citadel/sound/vox/sight.ogg',
+"silo" = 'modular_citadel/sound/vox/silo.ogg',
+"six" = 'modular_citadel/sound/vox/six.ogg',
+"sixteen" = 'modular_citadel/sound/vox/sixteen.ogg',
+"sixty" = 'modular_citadel/sound/vox/sixty.ogg',
+"slime" = 'modular_citadel/sound/vox/slime.ogg',
+"slow" = 'modular_citadel/sound/vox/slow.ogg',
+"soldier" = 'modular_citadel/sound/vox/soldier.ogg',
+"some" = 'modular_citadel/sound/vox/some.ogg',
+"someone" = 'modular_citadel/sound/vox/someone.ogg',
+"something" = 'modular_citadel/sound/vox/something.ogg',
+"son" = 'modular_citadel/sound/vox/son.ogg',
+"sorry" = 'modular_citadel/sound/vox/sorry.ogg',
+"south" = 'modular_citadel/sound/vox/south.ogg',
+"squad" = 'modular_citadel/sound/vox/squad.ogg',
+"square" = 'modular_citadel/sound/vox/square.ogg',
+"stairway" = 'modular_citadel/sound/vox/stairway.ogg',
+"status" = 'modular_citadel/sound/vox/status.ogg',
+"sterile" = 'modular_citadel/sound/vox/sterile.ogg',
+"sterilization" = 'modular_citadel/sound/vox/sterilization.ogg',
+"stolen" = 'modular_citadel/sound/vox/stolen.ogg',
+"storage" = 'modular_citadel/sound/vox/storage.ogg',
+"sub" = 'modular_citadel/sound/vox/sub.ogg',
+"subsurface" = 'modular_citadel/sound/vox/subsurface.ogg',
+"sudden" = 'modular_citadel/sound/vox/sudden.ogg',
+"suit" = 'modular_citadel/sound/vox/suit.ogg',
+"superconducting" = 'modular_citadel/sound/vox/superconducting.ogg',
+"supercooled" = 'modular_citadel/sound/vox/supercooled.ogg',
+"supply" = 'modular_citadel/sound/vox/supply.ogg',
+"surface" = 'modular_citadel/sound/vox/surface.ogg',
+"surrender" = 'modular_citadel/sound/vox/surrender.ogg',
+"surround" = 'modular_citadel/sound/vox/surround.ogg',
+"surrounded" = 'modular_citadel/sound/vox/surrounded.ogg',
+"switch" = 'modular_citadel/sound/vox/switch.ogg',
+"system" = 'modular_citadel/sound/vox/system.ogg',
+"systems" = 'modular_citadel/sound/vox/systems.ogg',
+"tactical" = 'modular_citadel/sound/vox/tactical.ogg',
+"take" = 'modular_citadel/sound/vox/take.ogg',
+"talk" = 'modular_citadel/sound/vox/talk.ogg',
+"tango" = 'modular_citadel/sound/vox/tango.ogg',
+"tank" = 'modular_citadel/sound/vox/tank.ogg',
+"target" = 'modular_citadel/sound/vox/target.ogg',
+"team" = 'modular_citadel/sound/vox/team.ogg',
+"temperature" = 'modular_citadel/sound/vox/temperature.ogg',
+"temporal" = 'modular_citadel/sound/vox/temporal.ogg',
+"ten" = 'modular_citadel/sound/vox/ten.ogg',
+"terminal" = 'modular_citadel/sound/vox/terminal.ogg',
+"terminated" = 'modular_citadel/sound/vox/terminated.ogg',
+"termination" = 'modular_citadel/sound/vox/termination.ogg',
+"test" = 'modular_citadel/sound/vox/test.ogg',
+"that" = 'modular_citadel/sound/vox/that.ogg',
+"the" = 'modular_citadel/sound/vox/the.ogg',
+"then" = 'modular_citadel/sound/vox/then.ogg',
+"there" = 'modular_citadel/sound/vox/there.ogg',
+"third" = 'modular_citadel/sound/vox/third.ogg',
+"thirteen" = 'modular_citadel/sound/vox/thirteen.ogg',
+"thirty" = 'modular_citadel/sound/vox/thirty.ogg',
+"this" = 'modular_citadel/sound/vox/this.ogg',
+"those" = 'modular_citadel/sound/vox/those.ogg',
+"thousand" = 'modular_citadel/sound/vox/thousand.ogg',
+"threat" = 'modular_citadel/sound/vox/threat.ogg',
+"three" = 'modular_citadel/sound/vox/three.ogg',
+"through" = 'modular_citadel/sound/vox/through.ogg',
+"time" = 'modular_citadel/sound/vox/time.ogg',
+"to" = 'modular_citadel/sound/vox/to.ogg',
+"top" = 'modular_citadel/sound/vox/top.ogg',
+"topside" = 'modular_citadel/sound/vox/topside.ogg',
+"touch" = 'modular_citadel/sound/vox/touch.ogg',
+"towards" = 'modular_citadel/sound/vox/towards.ogg',
+"track" = 'modular_citadel/sound/vox/track.ogg',
+"train" = 'modular_citadel/sound/vox/train.ogg',
+"transportation" = 'modular_citadel/sound/vox/transportation.ogg',
+"truck" = 'modular_citadel/sound/vox/truck.ogg',
+"tunnel" = 'modular_citadel/sound/vox/tunnel.ogg',
+"turn" = 'modular_citadel/sound/vox/turn.ogg',
+"turret" = 'modular_citadel/sound/vox/turret.ogg',
+"twelve" = 'modular_citadel/sound/vox/twelve.ogg',
+"twenty" = 'modular_citadel/sound/vox/twenty.ogg',
+"two" = 'modular_citadel/sound/vox/two.ogg',
+"unauthorized" = 'modular_citadel/sound/vox/unauthorized.ogg',
+"under" = 'modular_citadel/sound/vox/under.ogg',
+"uniform" = 'modular_citadel/sound/vox/uniform.ogg',
+"unlocked" = 'modular_citadel/sound/vox/unlocked.ogg',
+"until" = 'modular_citadel/sound/vox/until.ogg',
+"up" = 'modular_citadel/sound/vox/up.ogg',
+"upper" = 'modular_citadel/sound/vox/upper.ogg',
+"uranium" = 'modular_citadel/sound/vox/uranium.ogg',
+"us" = 'modular_citadel/sound/vox/us.ogg',
+"usa" = 'modular_citadel/sound/vox/usa.ogg',
+"use" = 'modular_citadel/sound/vox/use.ogg',
+"used" = 'modular_citadel/sound/vox/used.ogg',
+"user" = 'modular_citadel/sound/vox/user.ogg',
+"vacate" = 'modular_citadel/sound/vox/vacate.ogg',
+"valid" = 'modular_citadel/sound/vox/valid.ogg',
+"vapor" = 'modular_citadel/sound/vox/vapor.ogg',
+"vent" = 'modular_citadel/sound/vox/vent.ogg',
+"ventillation" = 'modular_citadel/sound/vox/ventillation.ogg',
+"victor" = 'modular_citadel/sound/vox/victor.ogg',
+"violated" = 'modular_citadel/sound/vox/violated.ogg',
+"violation" = 'modular_citadel/sound/vox/violation.ogg',
+"voltage" = 'modular_citadel/sound/vox/voltage.ogg',
+"vox_login" = 'modular_citadel/sound/vox/vox_login.ogg',
+"walk" = 'modular_citadel/sound/vox/walk.ogg',
+"wall" = 'modular_citadel/sound/vox/wall.ogg',
+"want" = 'modular_citadel/sound/vox/want.ogg',
+"wanted" = 'modular_citadel/sound/vox/wanted.ogg',
+"warm" = 'modular_citadel/sound/vox/warm.ogg',
+"warn" = 'modular_citadel/sound/vox/warn.ogg',
+"warning" = 'modular_citadel/sound/vox/warning.ogg',
+"waste" = 'modular_citadel/sound/vox/waste.ogg',
+"water" = 'modular_citadel/sound/vox/water.ogg',
+"we" = 'modular_citadel/sound/vox/we.ogg',
+"weapon" = 'modular_citadel/sound/vox/weapon.ogg',
+"west" = 'modular_citadel/sound/vox/west.ogg',
+"whiskey" = 'modular_citadel/sound/vox/whiskey.ogg',
+"white" = 'modular_citadel/sound/vox/white.ogg',
+"wilco" = 'modular_citadel/sound/vox/wilco.ogg',
+"will" = 'modular_citadel/sound/vox/will.ogg',
+"with" = 'modular_citadel/sound/vox/with.ogg',
+"without" = 'modular_citadel/sound/vox/without.ogg',
+"woop" = 'modular_citadel/sound/vox/woop.ogg',
+"xeno" = 'modular_citadel/sound/vox/xeno.ogg',
+"yankee" = 'modular_citadel/sound/vox/yankee.ogg',
+"yards" = 'modular_citadel/sound/vox/yards.ogg',
+"year" = 'modular_citadel/sound/vox/year.ogg',
+"yellow" = 'modular_citadel/sound/vox/yellow.ogg',
+"yes" = 'modular_citadel/sound/vox/yes.ogg',
+"you" = 'modular_citadel/sound/vox/you.ogg',
+"your" = 'modular_citadel/sound/vox/your.ogg',
+"yourself" = 'modular_citadel/sound/vox/yourself.ogg',
+"zero" = 'modular_citadel/sound/vox/zero.ogg',
+"zone" = 'modular_citadel/sound/vox/zone.ogg',
+"zulu" = 'modular_citadel/sound/vox/zulu.ogg',))
+#endif
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
index 5e10e71433..de3f43f8ee 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -18,9 +18,10 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
name = "combat jaws"
desc = "The jaws of the law. Very sharp."
icon_state = "jaws"
- force = 12
+ force = 10 //Lowered to match secborg. No reason it should be more than a secborg's baton.
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
+
/obj/item/dogborg/jaws/small
name = "puppy jaws"
desc = "Rubberized teeth designed to protect accidental harm. Sharp enough for specialized tasks however."
@@ -32,7 +33,6 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
..()
user.do_attack_animation(A, ATTACK_EFFECT_BITE)
- log_combat(user, A, "bit")
/obj/item/dogborg/jaws/small/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
@@ -307,8 +307,8 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/mob/living/silicon/robot
var/leaping = 0
var/pounce_cooldown = 0
- var/pounce_cooldown_time = 50 //Nearly doubled, u happy?
- var/pounce_spoolup = 3
+ var/pounce_cooldown_time = 20 //Buffed to counter balance changes
+ var/pounce_spoolup = 1
var/leap_at
var/disabler
var/laser
@@ -338,7 +338,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
//It's also extremely buggy visually, so it's balance+bugfix
return
- if(cell.charge <= 500)
+ if(cell.charge <= 750)
to_chat(src,"Insufficent reserves for jump actuators!")
return
@@ -348,7 +348,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
pixel_y = 10
update_icons()
throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
- cell.use(500) //Doubled the energy consumption
+ cell.use(750) //Less than a stunbaton since stunbatons hit everytime.
weather_immunities -= "lava"
/mob/living/silicon/robot/throw_impact(atom/A)
@@ -366,13 +366,13 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
blocked = 1
if(!blocked)
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
- L.Knockdown(iscarbon(L) ? 450 : 45) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
+ L.Knockdown(iscarbon(L) ? 225 : 45) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice.
playsound(src, 'sound/weapons/Egloves.ogg', 50, 1)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
log_combat(src, L, "borg pounced")
else
- Knockdown(45, 1, 1)
+ Knockdown(15, 1, 1)
pounce_cooldown = !pounce_cooldown
spawn(pounce_cooldown_time) //3s by default
@@ -380,7 +380,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
else if(A.density && !A.CanPass(src))
visible_message("[src] smashes into [A]!", "You smash into [A]!")
playsound(src, 'sound/items/trayhit1.ogg', 50, 1)
- Knockdown(45, 1, 1)
+ Knockdown(15, 1, 1)
if(leaping)
leaping = 0
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm
index 66147a41e7..de98f9685c 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot.dm
@@ -10,7 +10,7 @@ mob/living/silicon
/mob/living/silicon/robot/update_canmove()
..()
- if(client && stat != DEAD && dogborg == TRUE)
+ if(client && stat != DEAD && dogborg == FALSE)
if(resting)
cut_overlays()
icon_state = "[module.cyborg_base_icon]-rest"
@@ -18,6 +18,9 @@ mob/living/silicon
icon_state = "[module.cyborg_base_icon]"
update_icons()
+
+
+
/mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_stamina = 1)
if(istype(cell))
cell.charge -= amount*5
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
index a0dbe3a02a..c063d8b9ef 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -13,7 +13,7 @@
/mob/living/silicon/robot/proc/get_cit_modules()
var/list/modulelist = list()
modulelist["MediHound"] = /obj/item/robot_module/medihound
- if(!CONFIG_GET(flag/disable_secborg))
+ if(BORG_SEC_AVAILABLE)
modulelist["Security K-9"] = /obj/item/robot_module/k9
modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup
modulelist["Borgi"] = /obj/item/robot_module/borgi
@@ -61,7 +61,7 @@
/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/sechoundmodels = list("Default")
+ var/list/sechoundmodels = list("Default", "Dark", "Vale")
if(R.client && R.client.ckey in list("nezuli"))
sechoundmodels += "Alina"
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels
@@ -70,11 +70,14 @@
switch(borg_icon)
if("Default")
cyborg_base_icon = "k9"
- moduleselect_icon = "k9"
if("Alina")
cyborg_base_icon = "alina-sec"
special_light_key = "alina"
sleeper_overlay = "alinasleeper"
+ if("Dark")
+ cyborg_base_icon = "k9dark"
+ if("Vale")
+ cyborg_base_icon = "valesec"
return ..()
/obj/item/robot_module/medihound
@@ -109,7 +112,7 @@
/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/medhoundmodels = list("Default", "Dark")
+ var/list/medhoundmodels = list("Default", "Dark", "Vale")
if(R.client && R.client.ckey in list("nezuli"))
medhoundmodels += "Alina"
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels
@@ -121,6 +124,9 @@
if("Dark")
cyborg_base_icon = "medihounddark"
sleeper_overlay = "mdsleeper"
+ if("Vale")
+ cyborg_base_icon = "valemed"
+ sleeper_overlay = "valemedsleeper"
if("Alina")
cyborg_base_icon = "alina-med"
special_light_key = "alina"
@@ -313,7 +319,7 @@
/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro")
+ var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro", "DarkK9", "Vale", "ValeDark")
if(!borg_icon)
return FALSE
switch(borg_icon)
@@ -339,11 +345,32 @@
cyborg_base_icon = "heavyserv"
special_light_key = "heavyserv"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
+ if("DarkK9")
+ cyborg_base_icon = "k50"
+ special_light_key = "k50"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ if("Vale")
+ cyborg_base_icon = "valeserv"
+ special_light_key = "valeserv"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
+ if("ValeDark")
+ cyborg_base_icon = "valeservdark"
+ special_light_key = "valeservdark"
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
return ..()
/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer")
+ var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "Vale")
if(R.client && R.client.ckey in list("nezuli"))
engymodels += "Alina"
var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
@@ -386,6 +413,14 @@
has_snowflake_deadsprite = TRUE
dogborg = TRUE
cyborg_pixel_offset = -16
+ if("Vale")
+ cyborg_base_icon = "valeeng"
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+ cyborg_icon_override = 'modular_citadel/icons/mob/widerobot.dmi'
+ has_snowflake_deadsprite = TRUE
+ dogborg = TRUE
+ cyborg_pixel_offset = -16
if("Alina")
cyborg_base_icon = "alina-eng"
special_light_key = "alina"
diff --git a/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm b/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
index d2006cd12c..fdc271a158 100644
--- a/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
+++ b/modular_citadel/code/modules/mob/living/simple_animal/banana_spider.dm
@@ -38,7 +38,7 @@
return
to_chat(user, "You decide to wake up the banana spider...")
awakening = 1
-
+
spawn(30)
if(!QDELETED(src))
var/mob/living/simple_animal/banana_spider/S = new /mob/living/simple_animal/banana_spider(get_turf(src.loc))
@@ -98,7 +98,7 @@
if(be_spider == "No" || QDELETED(src) || !isobserver(user))
return
sentience_act()
- key = user.key
+ user.transfer_ckey(src, FALSE)
density = TRUE
/mob/living/simple_animal/banana_spider/ComponentInitialize()
diff --git a/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm b/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
deleted file mode 100644
index c3514719f6..0000000000
--- a/modular_citadel/code/modules/mob/living/simple_animal/pokemon.dm
+++ /dev/null
@@ -1,306 +0,0 @@
-//Sprites are trademarks of Gamefreak, Nintendo, The Pokemon Company, and Spike Chunsoft.
-#define ispokemon(A) (istype(A, /mob/living/simple_animal/pokemon))
-//POKEBALL
-/obj/item/pokeball
- name = "pokeball"
- icon = 'icons/obj/pokeball.dmi'
- icon_state = "pokeball"
- force = 0
- throwforce = 0
- var/success_chance = 25
- var/pokemon
-/obj/item/pokeball/great
- name = "great ball"
- icon_state = "pokeball_great"
- success_chance = 50
-/obj/item/pokeball/ultra
- icon_state = "pokeball_ultra"
- name = "ultra ball"
- success_chance = 75
-/obj/item/pokeball/master
- icon_state = "pokeball_master"
- name = "master ball"
- success_chance = 100
-/* //WIP
-/obj/item/pokeball/throw_impact(atom/hit_atom)
- if(ispokemon(hit_atom))
- var/mob/living/simple_animal/pokemon/pmon = hit_atom
- var/initial_success_chance = success_chance
- pmon.resize = 0.1
- pmon.color = "RED"
- pmon.canmove = 0
- sleep(15)
- if(pmon.pokeball == src)
- pmon.loc = src
- pokemon = pmon
-
- return 1
- if(pmon.pokeball && pmon.pokeball !=src)
- return ..()
- var/bonus_chance = ((pmon.maxHealth - pmon.health) / 2)
- if(bonus_chance > 100)
- bonus_chance = 100
- success_chance = (success_chance + bonus_chance)
- if(success_chance > 100)
- success_chance = 100
- if(success_chance < 0)//just in case
- success_chance = 0
- sleep(15)
- if(prob(success_chance))
- visible_message("[src] shakes...")
- else
- escape()
- sleep(15)
- if(prob(success_chance))
- visible_message("[src] shakes...")
- else
- escape()
- sleep(15)
- if(prob(success_chance))
- visible_message("[src] shakes...")
- else
- escape()
- else
- ..()
-/obj/item/pokeball/proc/capture(mob/living/simple_animal/pokemon/pmon, mob/living/user)
-
-/obj/item/pokeball/proc/escape(mob/living/simple_animal/pokemon/pmon, mob/living/user)
- if(!pokemon)
- return
- pmon.resize = 10
- pmon.color = null
- pmon.canmove = 1
- pmon.loc = src.loc
- if(pmon.pokeball != src)
- visible_message("[pmon] breaks free from [src]")
- PoolOrNew(/obj/effect/particle_effect/sparks, loc)
- playsound(src.loc, "sparks", 50, 1)
- qdel(src)
-
- else
-/obj/item/pokeball/proc/recall
-/obj/item/pokeball/proc/release
-*/
-/mob/living/simple_animal/pokemon
- name = "eevee"
- icon_state = "eevee"
- icon_living = "eevee"
- icon_dead = "eevee_d"
- desc = "Gotta catch 'em all!"
- icon = 'icons/mob/pokemon.dmi'
- var/pokeball
- pixel_x = -16
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5)
- ventcrawler = 2
- health = 100
- maxHealth = 100
- layer = 4
- response_help = "pets"
- wander = 1
- turns_per_move = 2
- pass_flags = PASSTABLE | PASSMOB
-
-/mob/living/simple_animal/pokemon/proc/simple_lay_down()
- set name = "Rest"
- set category = "IC"
-
- resting = !resting
- src << "You are now [resting ? "resting" : "getting up"]."
- update_canmove()
- update_icon()
-
-/mob/living/simple_animal/pokemon/proc/update_icon()
- if(lying || resting || sleeping)
- icon_state = "[icon_state]_rest"
- else
- icon_state = "[icon_living]"
-
-/mob/living/simple_animal/pokemon/New()
- ..()
- verbs += /mob/living/simple_animal/pokemon/proc/simple_lay_down
-
-/*
-/////TEMPLATE/////
-
-/mob/living/simple_animal/pokemon/
- name = ""
- icon_state = ""
- icon_living = ""
- icon_dead = ""
-*/
-
-/mob/living/simple_animal/pokemon/leg
- icon = 'icons/mob/legendary.dmi'
- pixel_x = -32
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 12)
- health = 200
- maxHealth = 200
-
-
-/mob/living/simple_animal/pokemon/leg/articuno
- name = "Articuno"
- icon_state = "articuno"
- icon_living = "articuno"
- icon_dead = "articuno_d"
- flying = 1
-
-/mob/living/simple_animal/pokemon/leg/rayquaza
- name = "Rayquaza"
- icon_state = "rayquaza"
- icon_living = "rayquaza"
- icon_dead = "rayquaza_d"
- flying = 1
-
-//ALPHABETICAL PLEASE
-
-/mob/living/simple_animal/pokemon/absol
- name = "absol"
- icon_state = "absol"
- icon_living = "absol"
- icon_dead = "absol_d"
- speak = list("Absol!", "Ab-Absol!")
-
-/mob/living/simple_animal/pokemon/aggron
- name = "aggron"
- icon_state = "aggron"
- icon_living = "aggron"
- icon_dead = "aggron_d"
-
-/mob/living/simple_animal/pokemon/ampharos
- name = "ampharos"
- icon_state = "ampharos"
- icon_living = "ampharos"
- icon_dead = "ampharos_d"
-
-/mob/living/simple_animal/pokemon/charmander
- name = "charmander"
- icon_state = "charmander"
- icon_living = "charmander"
- icon_dead = "charmander_d"
-
-/mob/living/simple_animal/pokemon/ditto
- name = "ditto"
- icon_state = "ditto"
- icon_living = "ditto"
- icon_dead = "ditto_d"
-
-/mob/living/simple_animal/pokemon/dratini/dragonair
- name = "dragonair"
- desc = "A Dragonair stores an enormous amount of energy inside its body. It is said to alter the weather around it by loosing energy from the crystals on its neck and tail."
- icon_state = "dragonair"
- icon_living = "dragonair"
- icon_dead = "dragonair_d"
-
-/mob/living/simple_animal/pokemon/dratini/dragonair/dragonite
- name = "dragonite"
- desc = "It can circle the globe in just 16 hours. It is a kindhearted Pokmon that leads lost and foundering ships in a storm to the safety of land."
- icon_state = "dragonite"
- icon_living = "dragonite"
- icon_dead = "dragonite_d"
-
-/mob/living/simple_animal/pokemon/dratini
- name = "dratini"
- desc = "A Dratini continually molts and sloughs off its old skin. It does so because the life energy within its body steadily builds to reach uncontrollable levels."
- icon_state = "dratini"
- icon_living = "dratini"
- icon_dead = "dratini_d"
-
-/mob/living/simple_animal/pokemon/eevee
- name = "eevee"
- desc = "Eevee has an unstable genetic makeup that suddenly mutates due to its environment. Radiation from various stones causes this Pokmon to evolve."
- icon_state = "eevee"
- icon_living = "eevee"
- icon_dead = "eevee_d"
- speak = list("Eevee!", "Ee-Eevee!")
- response_help = "pets"
- response_harm = "hits"
-
-/mob/living/simple_animal/pokemon/eevee/espeon
- name = "espeon"
- desc = "Espeon is extremely loyal to any trainer it considers to be worthy. It is said to have developed precognitive powers to protect its trainer from harm."
- icon_state = "espeon"
- icon_living = "espeon"
- icon_dead = "espeon_d"
-
-/mob/living/simple_animal/pokemon/flaaffy
- name = "flaaffy"
- icon_state = "flaaffy"
- icon_living = "flaaffy"
- icon_dead = "flaaffy_d"
-
-/mob/living/simple_animal/pokemon/eevee/flareon
- name = "flareon"
- desc = "Flareon's fluffy fur releases heat into the air so that its body does not get excessively hot. Its body temperature can rise to a maximum of 1,650 degrees F."
- icon_state = "flareon"
- icon_living = "flareon"
- icon_dead = "flareon_d"
- speak = list("Flare!", "Flareon!")
-
-/mob/living/simple_animal/pokemon/eevee/glaceon
- name = "glaceon"
- desc = "By controlling its body heat, it can freeze the atmosphere around it to make a diamond-dust flurry."
- icon_state = "glaceon"
- icon_living = "glaceon"
- icon_dead = "glaceon_d"
- speak = list("Glace!", "Glaceon!")
-
-/mob/living/simple_animal/pokemon/eevee/jolteon
- name = "jolteon"
- desc = "Its cells generate weak power that is amplified by its fur's static electricity to drop thunderbolts. The bristling fur is made of electrically charged needles."
- icon_state = "jolteon"
- icon_living = "jolteon"
- icon_dead = "jolteon_d"
- speak = list("Jolt!", "Jolteon!")
-
-/mob/living/simple_animal/pokemon/larvitar
- name = "larvitar"
- desc = "It is born deep underground. It can't emerge until it has entirely consumed the soil around it."
- icon_state = "larvitar"
- icon_living = "larvitar"
- icon_dead = "larvitar_d"
-
-/mob/living/simple_animal/pokemon/mareep
- name = "mareep"
- icon_state = "mareep"
- icon_living = "mareep"
- icon_dead = "mareep_d"
-
-/mob/living/simple_animal/pokemon/poochyena/mightyena
- name = "mightyena"
- icon_state = "mightyena"
- icon_living = "mightyena"
- icon_dead = "mightyena"
-
-/mob/living/simple_animal/pokemon/miltank
- name = "miltank"
- icon_state = "miltank"
- icon_living = "miltank"
- icon_dead = "miltank_d"
-
-/mob/living/simple_animal/pokemon/poochyena
- name = "poochyena"
- icon_state = "poochyena"
- icon_living = "poochyena"
- icon_dead = "poochyena_d"
-
-/mob/living/simple_animal/pokemon/eevee/sylveon
- name = "Sylveon"
- desc = "Sylveon, the Intertwining Pokmon. Sylveon affectionately wraps its ribbon-like feelers around its Trainer's arm as they walk together."
- icon_state = "sylveon"
- icon_living = "sylveon"
- icon_dead = "sylveon_d"
- speak = list("Sylveon!", "Syl!")
- response_help = "pets"
- response_harm = "hits"
-
-/mob/living/simple_animal/pokemon/eevee/umbreon
- name = "umbreon"
- icon_state = "umbreon"
- icon_dead = "umbreon_d"
- icon_living = "umbreon"
-
-/mob/living/simple_animal/pokemon/vulpix
- name = "vulpix"
- icon_state = "vulpix"
- icon_living = "vulpix"
- icon_dead = "vulpix_d"
diff --git a/modular_citadel/code/modules/projectiles/projectile/energy.dm b/modular_citadel/code/modules/projectiles/projectile/energy.dm
deleted file mode 100644
index a32f23f0fc..0000000000
--- a/modular_citadel/code/modules/projectiles/projectile/energy.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/obj/item/projectile/energy/electrode
- stamina = 36
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
new file mode 100644
index 0000000000..4e80f42d87
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -0,0 +1,371 @@
+/*
+////////////////////////////////////////
+// MKULTA //
+////////////////////////////////////////
+The magnum opus of FermiChem -
+Long and complicated, I highly recomend you look at the two other files heavily involved in this
+modular_citadel/code/datums/status_effects/chems.dm - handles the subject's reactions
+code/modules/surgery/organs/vocal_cords.dm - handles the enchanter speaking
+
+HOW IT WORKS
+Fermis_Reagent.dm
+There's 3 main ways this chemical works; I'll start off with discussing how it's set up.
+Upon reacting with blood as a catalyst, the blood is used to define who the enthraller is - thus only the creator is/can choose who the master will be. As a side note, you can't adminbus this chem, even admins have to earn it.
+This uses the fermichem only proc; FermiCreate, which is basically the same as On_new, except it doesn't require "data" which is something to do with blood and breaks everything so I said bugger it and made my own proc. It basically sets up vars.
+When it's first made, the creator has to drink some of it, in order to give them the vocal chords needed.
+When it's given to someone, it gives them the status effect and kicks off that side of things. For every metabolism tick, it increases the enthrall tally.
+Finally, if you manage to pump 100u into some poor soul, you overload them, and mindbreak them. Making them your willing, but broken slave. Which can only be reversed by; fixing their brain with mannitol and neurine (100 / 50u respectively) (or less with both),
+
+vocal_cords.dm
+This handles when the enchanter speaks - basically uses code from voice of god, but only for people with the staus effect. Most of the words are self explainitory, and has a smaller range of commands. If you're not sure what one does, it likely affects the enthrall tally, or the resist tally.
+list of commands:
+
+-mixables-
+enthral_words
+reward_words
+punish_words
+0
+saymyname_words
+wakeup_words
+1
+silence_words
+antiresist_words
+resist_words
+forget_words
+attract_words
+orgasm_words
+2
+awoo_words
+nya_words
+sleep_words
+strip_words
+walk_words
+run_words
+knockdown_words
+3
+statecustom_words
+custom_words
+objective_words
+heal_words
+stun_words
+hallucinate_words
+hot_words
+cold_words
+getup_words
+pacify_words
+charge_words
+
+Mixables can be used intersperced with other commands, 0 is commands that work on sleeper against (i.e. players enthralled to state 3, then ordered to wake up and forget, they can be triggered back instantly)
+1 is for players who immediately are injected with the chem - no stuns, only a silence and something that draws them towrds them. This is the best time to try to fight it and you're likely to win by spamming resist, unless the enchantress has plans.
+2 is the seconds stage, which allows removal of clothes, slowdown and light stunning. You can also make them nya and awoo, because cute.
+3 is the finaly state, which allows application of a few status effects (see chem.dm) and allows custom triggers to be installed (kind of like nanites), again, see chem.dm
+In a nutshell, this is the way you enthrall people, by typing messages into chat and managing cooldowns on the stronger words. You have to type words and your message strength is increases with the number of characters - if you type short messages the cooldown will be too much and the other player will overcome the chem.
+I suppose people could spam gdjshogndjoadphgiuaodp but, the truth of this chem is that it mostly allows a casus beli for subs to give in, and everyones a sub on cit (mostly), so if you aujigbnadjgipagdsjk then they might resist harder cause you're a baddie and baddies don't deserve pets.
+Also, the use of this chem as a murder aid is antithetic to it's design, the subject gains bonus resistance if they're hurt or hungry (I'd like to expland this more, I like the idea that you have to look after all of them otherwise they aren't as effective, kind of like tamagachis!). If this becomes a problem, I'll deal with it, I'm not happy with people abusing this chem for an easy murder. (I might make it so you an't strike your pet when health is too low.)
+Additionaly, in lieu of previous statement - the pet is ordered to not kill themselves, even if ordered to.
+
+chem.dm
+oof
+There's a few basic things that have to be understood with this status effect
+1. There is a min loop which calculates the enthrall state of the subject, when the entrall tally is over a certain amount, it will push you up 1 phase.
+0 - Sleeper
+1 - initial
+2 - enthralled
+3 - Fully entranced
+4 - mindbroken
+4 can only be reached via OD, whereas you can increment up from 1 > 2 > 3. 0 is only obtainable on a state 3 pet, and it toggles between the two.
+
+1.5 Chem warfare
+Since this is a chem, it's expected that you will use all of the chemicals at your disposal. Using aphro and aphro+ will weaken the resistance of the subject, while ananphro, anaphro+, mannitol and neurine will strengthen it.
+Additionally, the more aroused you are, the weaker your resistance will be, as a result players immune to aphro and anaphro give a flat bonus to the enthraller.
+using furranium and hatmium on the enchanter weakens their power considerably, because they sound rediculous. "Youwe fweewing wery sweepy uwu" This completely justifies their existance.
+The impure toxin for this chem increases resistance too, so if they're a bad chemist it'll be unlikely they have a good ratio (and as a secret bonus, really good chemists cann purposely make the impure chem, to use either to combat the use of it against them, or as smoke grenades to deal with a large party)
+
+2. There is a resistance proc which occurs whenever the player presses resist. You have to press it a lot, this is intentional. If you're trying to fight the enchanter, then you can't click both. You usually will win if you just mash resist and the enchanter does nothing, so you've got to react.
+Each step futher it becomes harder to resist, in state 2 it's longer, but resisting is still worthwhile. If you're not in state 3, and you've not got MKultra inside of you, you generate resistance very fast. So in some cases the better option will be to stall out any attempts to entrance you.
+At the moment, resistance doesn't affect the commands - mostly because it's a way to tell if a state 3 is trying to resist. But this might change if it gets too hard to fight them off.
+Durign state 3, it's impossible to resist if the enthraller is in your presence (8 tiles), you generate no resistance if so. If they're out of your range, then you start to go into the addiction processed
+As your resistance is tied to your arousal, sometimes your best option is to wah
+
+3. The addition process starts when the enthraller is out of range, it roughtly follows the five stages of grief; denial, anger, bargaining, depression and acceptance.
+What it mostly does makes you sad, hurts your brain, and sometimes you lash out in anger.
+Denial - minor brain damaged
+bargaining - 50:50 chance of brain damage and brain healing
+anger - randomly lashing out and hitting people
+depression - massive mood loss, stuttering, jittering, hallucinations and brain damage
+depression, again - random stunning and crying, brain damage, and resistance
+acceptance - minor brain damage and resistance.
+You can also resist while out of range, but you can only break free of a stange 3 enthrallment by hitting the acceptance phase with a high enough resistance.
+Finally, being near your enthraller reverts the damages caused.
+It is expected that if you intend to break free you'll need to use psicodine and mannitol or you'll end up in a bad, but not dead, state. This gives more work for medical!! Finally the true rational of this complicated chem comes out.
+
+4. Status effects in status effects.
+There's a few commands that give status effects, such as antiresist, which will cause resistance presses to increase the enthrallment instead, theses are called from the vocal chords.
+They're mostly self explainitory; antiresist, charge, pacify and heal. Heals quite weak for obvious reasons. I'd like to add more, maybe some weak adneals with brute/exhaustion costs after the status is over. A truth serum might be neat too.
+State 4 pets don't get status effects.
+
+5. Custom triggers
+Because it wasnt complicated enough already.
+Custom triggers are set by stating a trigger word, which will call a sub proc, which is also defined when the trigger is Called
+The effects avalible at the moment are:
+Speak - forces pet to say a preallocated phrase in response to the trigger
+Echo - sends a message to that player only (i.e. makes them think something)
+Shock - gives them a seizure/zaps them
+You can look this one up yourself - it's what you expect, it's cit
+kneel - gives a short knockdown
+strip - strips jumpsuit only
+objective - gives the pet a new objective. This requires a high ammount of mental capasity - which is determined by how much you resist. If you resist enough during phase 1 and 2, then they can't give you an objective.
+Feel free to add more.
+triggers work when said by ANYONE, not just the enchanter.
+This is only state 3 pets, state 4 pets cannot get custom triggers, you broke them you bully.
+
+7. If you're an antage you get a bonus to resistance AND to enthralling. Thus it can be worth using this on both sides. It shouldn't be hard to resist as an antag. There are futher bonuses to command, Chaplains and chemist.
+If you give your pet a collar then their resistance reduced too.
+(I think thats everything?)
+
+Failstates:
+Blowing up the reaction produces a gas that causes everyone to fall in love with one another.
+
+Creating a chem with a low purity will make you permanently fall in love with someone, and tasked with keeping them safe. If someone else drinks it, you fall for them.
+*/
+
+/datum/reagent/fermi/enthrall
+ name = "MKUltra"
+ id = "enthrall"
+ description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it."
+ color = "#660015" // rgb: , 0, 255
+ taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses"
+ overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please.
+ metabolization_rate = 0.1//It has to be slow, so there's time for the effect.
+ data = list("creatorID" = null, "creatorGender" = null, "creatorName" = null)
+ var/creatorID //ckey
+ var/creatorGender
+ var/creatorName
+ var/mob/living/creator
+ pH = 10
+ chemical_flags = REAGENT_ONMOBMERGE | REAGENT_DONOTSPLIT //Procs on_mob_add when merging into a human
+ can_synth = FALSE
+
+
+/datum/reagent/fermi/enthrall/test
+ name = "MKUltraTest"
+ id = "enthrallTest"
+ description = "A forbidden deep red mixture that makes you like Fermis a little too much. Unobtainable and due to be removed from the wiki."
+ data = list("creatorID" = "honkatonkbramblesnatch", "creatorGender" = "Mistress", "creatorName" = "Fermis Yakumo")
+ creatorID = "honkatonkbramblesnatch"//ckey
+ creatorGender = "Mistress"
+ creatorName = "Fermis Yakumo"
+ purity = 1
+
+/datum/reagent/fermi/enthrall/test/on_new()
+ id = "enthrall"
+ ..()
+ creator = get_mob_by_key(creatorID)
+
+/datum/reagent/fermi/enthrall/on_new(list/data)
+ creatorID = data.["creatorID"]
+ creatorGender = data.["creatorGender"]
+ creatorName = data.["creatorName"]
+ creator = get_mob_by_key(creatorID)
+
+/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M)
+ . = ..()
+ if(!ishuman(M))//Just to make sure screwy stuff doesn't happen.
+ return
+ if(!creatorID)
+ //This happens when the reaction explodes.
+ return
+ if(purity < 0.5)//Impure chems don't function as you expect
+ return
+ var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)
+ if(E)
+ if(E.enthrallID == M.ckey && creatorID != M.ckey)//If you're enthralled to yourself (from OD) and someone else tries to enthrall you, you become thralled to them instantly.
+ E.enthrallID = creatorID
+ E.enthrallGender = creatorGender
+ E.master = get_mob_by_key(creatorID)
+ to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.client?.prefs.lewdchem?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE.
+ log_game("FERMICHEM: Narcissist [M] ckey: [M.key] been rebound to [creatorName], ID: [creatorID]")
+ return
+ if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?)
+ log_game("FERMICHEM: [M] ckey: [M.key] has been given velvetspeech")
+ var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE)
+ var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet
+ if(Vc)
+ Vc.Remove(M)
+ nVc.Insert(M)
+ qdel(Vc)
+ to_chat(M, "You feel your vocal chords tingle as your voice comes out in a more sultry tone.")
+ else
+ log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]")
+ M.apply_status_effect(/datum/status_effect/chem/enthrall)
+ log_game("FERMICHEM: [M] ckey: [M.key] has taken MKUltra")
+
+/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(purity < 0.5)//DO NOT SPLIT INTO DIFFERENT CHEM: This relies on DoNotSplit - has to be done this way.
+ if(volume < 0.5)//You don't get to escape that easily
+ FallInLove(pick(GLOB.player_list), M)
+ M.reagents.remove_reagent(id, volume)
+
+ if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them.
+ if(M.has_status_effect(STATUS_EFFECT_INLOVE))//Can't be enthralled when enthralled, so to speak.
+ return
+ var/list/seen = viewers(7, get_turf(M))
+ for(var/victim in seen)
+ if(ishuman(victim))
+ var/mob/living/carbon/V = victim
+ if((V == M) || (!V.client) || (V.stat == DEAD))
+ seen = seen - victim
+ else
+ seen = seen - victim
+
+ if(LAZYLEN(seen))
+ return
+ M.reagents.remove_reagent(id, volume)
+ FallInLove(M, pick(seen))
+ return
+
+ else // If someone else drinks it, the creator falls in love with them!
+ var/mob/living/carbon/C = get_mob_by_key(creatorID)
+ if(M.has_status_effect(STATUS_EFFECT_INLOVE))
+ return
+ if((C in viewers(7, get_turf(M))) && (C.client))
+ M.reagents.remove_reagent(id, volume)
+ FallInLove(C, M)
+ return
+
+ if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. NEVERMIND ADD THIS LATER I CAN'T GET IT TO WORK
+ return
+ if(!M.client)
+ metabolization_rate = 0 //Stops powergamers from quitting to avoid affects. but prevents affects on players that don't exist for performance.
+ return
+ if(metabolization_rate == 0)
+ metabolization_rate = 0.1
+ var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)//If purity is over 5, works as intended
+ if(!E)
+ return
+ else
+ E.enthrallTally += 1
+ ..()
+
+/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I made it so the creator is set to gain the status for someone random.
+ . = ..()
+ metabolization_rate = 1//Mostly to manage brain damage and reduce server stress
+ if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.)
+ if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
+ to_chat(M, "You are unable to resist your own charms anymore, and become a full blown narcissist.")
+ /*Old way of handling, left in as an option B
+ var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
+ for(var/mob/living/carbon/victim in seen)
+ if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey
+ seen = seen - victim
+ if(!victim.ckey)
+ seen = seen - victim
+ var/mob/living/carbon/chosen = pick(seen)
+ creatorID = chosen.ckey
+ if (chosen.gender == "female")
+ creatorGender = "Mistress"
+ else
+ creatorGender = "Master"
+ creatorName = chosen.real_name
+ creator = get_mob_by_key(creatorID)
+ */
+ ADD_TRAIT(M, TRAIT_PACIFISM, "MKUltra")
+ var/datum/status_effect/chem/enthrall/E
+ if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
+ M.apply_status_effect(/datum/status_effect/chem/enthrall)
+ E = M.has_status_effect(/datum/status_effect/chem/enthrall)
+ E.enthrallID = creatorID
+ E.enthrallGender = creatorGender
+ E.master = creator
+ else
+ E = M.has_status_effect(/datum/status_effect/chem/enthrall)
+ if(M.client?.prefs.lewdchem)
+ to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.")
+ else
+ to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what [creatorName] has been saying. Your highest priority is now to stay by their side and protect them at all costs.")
+ log_game("FERMICHEM: [M] ckey: [M.key] has been mindbroken for [creatorName] ckey: [creatorID]")
+ M.slurring = 100
+ M.confused = 100
+ E.phase = 4
+ E.mental_capacity = 0
+ E.customTriggers = list()
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls mindbroken")
+
+/datum/reagent/fermi/enthrall/overdose_process(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2)//should be ~30 in total
+ ..()
+
+//Creates a gas cloud when the reaction blows up, causing everyone in it to fall in love with someone/something while it's in their system.
+/datum/reagent/fermi/enthrallExplo//Created in a gas cloud when it explodes
+ name = "Gaseous MKUltra"
+ id = "enthrallExplo"
+ description = "A forbidden deep red gas that overwhelms a foreign body, causing the person they next lay their eyes on to become more interesting. Studies have shown that people are 66% more likely to make friends with this in the air. Produced when MKUltra explodes."
+ color = "#2C051A" // rgb: , 0, 255
+ metabolization_rate = 0.1
+ taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses."
+ chemical_flags = REAGENT_DONOTSPLIT
+ can_synth = FALSE
+ var/mob/living/carbon/love
+
+/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough.
+ if(HAS_TRAIT(M, TRAIT_MINDSHIELD))
+ return ..()
+ if(!M.has_status_effect(STATUS_EFFECT_INLOVE))
+ var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
+ for(var/victim in seen)
+ if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (M.stat == DEAD) || (!isliving(victim)))
+ seen = seen - victim
+ if(seen.len == 0)
+ return
+ love = pick(seen)
+ if(!love)
+ return
+ M.apply_status_effect(STATUS_EFFECT_INLOVE, love)
+ to_chat(M, "[(M.client?.prefs.lewdchem?"":"")][(M.client?.prefs.lewdchem?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.")
+ log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded")
+ else
+ if(get_dist(M, love) < 8)
+ if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated.
+ M.adjustArousalLoss(5)
+ var/message = "[(M.client?.prefs.lewdchem?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]"
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove, message)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
+ else
+ var/message = "[(M.client?.prefs.lewdchem?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]"
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove, message)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
+ if(prob(5))
+ M.Stun(10)
+ M.emote("whimper")//does this exist?
+ to_chat(M, "[(M.client?.prefs.lewdchem?"":"")] You're overcome with a desire to see [love].")
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)//I found out why everyone was so damaged!
+ ..()
+
+/datum/reagent/fermi/enthrallExplo/on_mob_delete(mob/living/carbon/M)
+ if(HAS_TRAIT(M, TRAIT_MINDSHIELD))
+ return ..()
+ M.remove_status_effect(STATUS_EFFECT_INLOVE)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
+ to_chat(M, "[(M.client?.prefs.lewdchem?"":"")]Your feelings for [love] suddenly vanish!")
+ log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond")
+ ..()
+
+/datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love)
+ if(Lover.has_status_effect(STATUS_EFFECT_INLOVE))
+ to_chat(Lover, "You are already fully devoted to someone else!")
+ return
+ to_chat(Lover, "[(Lover.client?.prefs.lewdchem?"":"")]You develop a deep and sudden bond with [Love][(Lover.client?.prefs.lewdchem?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.")
+ if(Lover.mind)
+ Lover.mind.store_memory("You are in love with [Love].")
+ Lover.faction |= "[REF(Love)]"
+ Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love)
+ forge_valentines_objective(Lover, Love, TRUE)
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have become infatuated.")
+ log_game("FERMICHEM: [Lover] ckey: [Lover.key] has been chemically made to fall for [Love] ckey: [Love.key]")
+ return
+
+//For addiction see chem.dm
+//For vocal commands see vocal_cords.dm
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
new file mode 100644
index 0000000000..e5844f204a
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm
@@ -0,0 +1,375 @@
+/*SDGF
+////////////////////////////////////////////////////
+// synthetic-derived growth factor //
+//////////////////////////////////////////////////
+other files that are relivant:
+modular_citadel/code/datums/status_effects/chems.dm - SDGF
+WHAT IT DOES
+
+Several outcomes are possible (in priority order):
+
+Before the chem is even created, there is a risk of the reaction "exploding", which produces an angry teratoma that attacks the player.
+0. Before the chem is activated, the purity is checked, if the purity of the reagent is less than 0.5, then sythetic-derived zombie factor is metabolised instead
+ 0.1 If SDZF is injected, the chem appears to act the same as normal, with nutrition gain, until the end, where it becomes toxic instead, giving a short window of warning to the player
+ 0.1.2 If the player can take pent in time, the player will spawn a hostile teratoma on them (less damaging), if they don't, then a zombie is spawned instead, with a small defence increase propotional to the volume
+ 0.2 If the purity is above 0.5, then the remaining impure volume created SDGFtox instead, which reduces blood volume and causes clone damage
+1.Normal function creates a (another)player controlled clone of the player, which is spawned nude, with damage to the clone
+ 1.1 The remaining volume is transferred to the clone, which heals it over time, thus the player has to make a substantial ammount of the chem in order to produce a healthy clone
+ 1.2 If the player is infected with a zombie tumor, the tumor is transferred to the ghost controlled clone ONLY.
+2. If no player can be found, a brainless clone is created over a long period of time, this body has no controller.
+ 2.1 If the player dies with a clone, then they play as the clone instead. However no memories are retained after splitting.
+3. If there is already a clone, then SDGF heals clone, fire and brute damage slowly. This shouldn't normalise this chem as the de facto clone healing chem, as it will always try to make a ghost clone, and then a brainless clone first.
+4. If there is insuffient volume to complete the cloning process, there are two outcomes
+ 4.1 At lower volumes, the players nutrition and blood is refunded, with light healing
+ 4.2 At higher volumes a stronger heal is applied to the user
+
+IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
+1. The most important factor is the required volume, this is easily edited with the metabolism rate, this chem is HARD TO MAKE, You need to make a lot of it and it's a substantial effort on the players part. There is also a substantial risk; you could spawn a hotile teratoma during the reation, you could damage yourself with clone damage, you could accidentally spawn a zombie... Basically, you've a good chance of killing yourself.
+ 1.1 Additionally, if you're trying to make SDZF purposely, you've no idea if you have or not, and that reaction is even harder to do. Plus, the player has a huge time window to get to medical to deal with it. If you take pent while it's in you, it'll be removed before it can spawn, and only spawns a teratoma if it's late stage.
+2. The rate in which the clone is made, This thing takes time to produce fruits, it slows you down and makes you useless in combat/working. Basically you can't do anything during it. It will only get you killed if you use it in combat, If you do use it and you spawn a player clone, they're gimped for a long time, as they have to heal off the clone damage.
+3. The healing - it's pretty low and a cyropod is more Useful
+4. If you're an antag, you've a 50% chance of making a clone that will help you with your efforts, and you've no idea if they will or not. While clones can't directly harm you and care for you, they can hinder your efforts.
+5. If people are being arses when they're a clone, slap them for it, they are told to NOT bugger around with someone else character, if it gets bad I'll add a blacklist, or do a check to see if you've played X amount of hours.
+ 5.1 Another solution I'm okay with is to rename the clone to [M]'s clone, so it's obvious, this obviously ruins anyone trying to clone themselves to get an alibi however. I'd prefer this to not be the case.
+ 5.2 Additionally, this chem is a soft buff to changelings, which apparently need a buff!
+ 5.3 Other similar things exist already though in the codebase; impostors, split personalites, abductors, ect.
+6. Giving this to someone without concent is against space law and gets you sent to gulag.
+*/
+
+//Clone serum #chemClone
+/datum/reagent/fermi/SDGF //vars, mostly only care about keeping track if there's a player in the clone or not.
+ name = "synthetic-derived growth factor"
+ id = "SDGF"
+ description = "A rapidly diving mass of Embryonic stem cells. These cells are missing a nucleus and quickly replicate a host’s DNA before growing to form an almost perfect clone of the host. In some cases neural replication takes longer, though the underlying reason underneath has yet to be determined."
+ color = "#a502e0" // rgb: 96, 0, 255
+ var/playerClone = FALSE
+ var/unitCheck = FALSE
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ taste_description = "a weird chemical fleshy flavour"
+ //var/datum/status_effect/chem/SDGF/candidates/candies
+ var/list/candies = list()
+ //var/polling = FALSE
+ var/list/result = list()
+ var/list/group = null
+ var/pollStarted = FALSE
+ var/location_created
+ var/startHunger
+ impure_chem = "SDGFtox"
+ inverse_chem_val = 0.5
+ inverse_chem = "SDZF"
+ can_synth = TRUE
+
+
+//Main SDGF chemical
+/datum/reagent/fermi/SDGF/on_mob_life(mob/living/carbon/M) //Clones user, then puts a ghost in them! If that fails, makes a braindead clone.
+ //Setup clone
+ switch(current_cycle)
+ if(1)
+ startHunger = M.nutrition
+ if(pollStarted == FALSE)
+ pollStarted = TRUE
+ candies = pollGhostCandidates("Do you want and agree to play as a clone of [M], respect their character and not engage in ERP without permission from the original?", ignore_category = POLL_IGNORE_CLONE)
+ log_game("FERMICHEM: [M] ckey: [M.key] has taken SDGF, and ghosts have been polled.")
+ if(20 to INFINITY)
+ if(LAZYLEN(candies) && playerClone == FALSE) //If there's candidates, clone the person and put them in there!
+ to_chat(M, "The cells reach a critical micelle concentration, nucleating rapidly within your body!")
+ var/typepath = M.type
+ var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc)
+ var/mob/living/carbon/human/SM = fermi_Gclone
+ if(istype(SM) && istype(M))
+ SM.real_name = M.real_name
+ M.dna.transfer_identity(SM)
+ SM.updateappearance(mutcolor_update=1)
+
+
+ candies = shuffle(candies)//Shake those ghosts up!
+ for(var/mob/dead/observer/C2 in candies)
+ if(C2.key && C2)
+ C2.transfer_ckey(SM, FALSE)
+ message_admins("Ghost candidate found! [C2] key [C2.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)")
+ log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [C2]")
+ break
+ else
+ candies -= C2
+ if(!SM.mind) //Something went wrong, use alt mechanics
+ return ..()
+ SM.mind.enslave_mind_to_creator(M)
+
+ //If they're a zombie, they can try to negate it with this.
+ //I seriously wonder if anyone will ever use this function.
+ if(M.getorganslot(ORGAN_SLOT_ZOMBIE))//sure, it "treats" it, but "you've" still got it. Doesn't always work as well; needs a ghost.
+ var/obj/item/organ/zombie_infection/ZI = M.getorganslot(ORGAN_SLOT_ZOMBIE)
+ ZI.Remove(M)
+ ZI.Insert(SM)
+ log_game("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone")
+
+ to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with your original, a perfect clone of your origin.")
+
+ if(prob(50))
+ to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original.")
+ log_game("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.")
+ else
+ to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. Your mind has not deviated from the tasks you set out to do, and now that there's two of you the tasks should be much easier.")
+ log_game("FERMICHEM: [SM] ckey: [SM.key]'s is bound by [M] ckey [M.key]'s objectives, and is encouraged to help them complete them.")
+
+ to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you, before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with yourself.")
+ M.visible_message("[M] suddenly shudders, and splits into two identical twins!")
+ SM.copy_known_languages_from(M, FALSE)
+ playerClone = TRUE
+ M.next_move_modifier = 1
+ M.nutrition -= 500
+
+ //Damage the clone
+ SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/2
+ SM.adjustCloneLoss(60, 0)
+ SM.setOrganLoss(ORGAN_SLOT_BRAIN, 40)
+ SM.nutrition = startHunger/2
+
+ //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger.
+ SM.reagents.add_reagent("SDGFheal", volume)
+ M.reagents.remove_reagent(id, volume)
+ log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Sentient clones made")
+ return
+
+ else if(playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!).
+ unitCheck = TRUE
+ if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow.
+ switch(current_cycle)
+ if(21)
+ to_chat(M, "The cells fail to catalyse around a nucleation event, instead merging with your cells.") //This stuff is hard enough to make to rob a user of some benefit. Shouldn't replace Rezadone as it requires the user to not only risk making a player controlled clone, but also requires them to have split in two (which also requires 30u of SGDF).
+ REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
+ log_game("FERMICHEM: [M] ckey: [M.key] is being healed by SDGF")
+ if(22 to INFINITY)
+ M.adjustCloneLoss(-1, 0)
+ M.adjustBruteLoss(-1, 0)
+ M.adjustFireLoss(-1, 0)
+ M.heal_bodypart_damage(1,1)
+ M.reagents.remove_reagent(id, 1)//faster rate of loss.
+ else //If there's no ghosts, but they've made a large amount, then proceed to make flavourful clone, where you become fat and useless until you split.
+ switch(current_cycle)
+ if(21)
+ to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.")
+ if(22 to 29)
+ M.nutrition = M.nutrition + (M.nutrition/10)
+ if(30)
+ to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.")
+ if(31 to 49)
+ M.nutrition = M.nutrition + (M.nutrition/5)
+ if(50)
+ to_chat(M, "The synthetic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.")
+ M.next_move_modifier += 4//If this makes you fast then please fix it, it should make you slow!!
+ //candidates = pollGhostCandidates("Do you want to play as a clone of [M.name] and do you agree to respect their character and act in a similar manner to them? I swear to god if you diddle them I will be very disapointed in you. ", "FermiClone", null, ROLE_SENTIENCE, 300) // see poll_ignore.dm, should allow admins to ban greifers or bullies
+ if(51 to 79)
+ M.nutrition = M.nutrition + (M.nutrition/2)
+ if(80)
+ to_chat(M, "The cells begin to precipitate outwards of your body, you feel like you'll split soon...")
+ if (M.nutrition < 20000)
+ M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI
+ if(86)//Upon splitting, you get really hungry and are capable again. Deletes the chem after you're done.
+ M.nutrition = 15//YOU BEST BE EATTING AFTER THIS YOU CUTIE
+ M.next_move_modifier -= 4
+ to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.")
+
+ //clone
+ var/typepath = M.type
+ var/mob/living/fermi_Clone = new typepath(M.loc)
+ var/mob/living/carbon/C = fermi_Clone
+
+ if(istype(C) && istype(M))
+ C.real_name = M.real_name
+ M.dna.transfer_identity(C, transfer_SE=1)
+ C.updateappearance(mutcolor_update=1)
+ C.apply_status_effect(/datum/status_effect/chem/SGDF)
+ var/datum/status_effect/chem/SGDF/S = C.has_status_effect(/datum/status_effect/chem/SGDF)
+ S.original = M
+ S.originalmind = M.mind
+ S.status_set = TRUE
+
+ log_game("FERMICHEM: [M] ckey: [M.key] has created a mindless clone of themselves")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Braindead clones made")
+ if(87 to INFINITY)
+ M.reagents.remove_reagent(id, volume)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing.
+
+
+ ..()
+
+/datum/reagent/fermi/SDGF/on_mob_delete(mob/living/M) //When the chem is removed, a few things can happen, mostly consolation prizes.
+ pollStarted = FALSE
+ if (playerClone == TRUE)//If the player made a clone with it, then thats all they get.
+ playerClone = FALSE
+ return
+ if (M.next_move_modifier == 4 && !M.has_status_effect(/datum/status_effect/chem/SGDF))//checks if they're ingested over 20u of the stuff, but fell short of the required 30u to make a clone.
+ to_chat(M, "You feel the cells begin to merge with your body, unable to reach nucleation, they instead merge with your body, healing any wounds.")
+ M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete.
+ M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there.
+ M.adjustFireLoss(-25, 0)
+ M.blood_volume += 250
+ M.heal_bodypart_damage(1,1)
+ M.next_move_modifier = 1
+ if (M.nutrition < 1500)
+ M.nutrition += 250
+ else if (unitCheck == TRUE && !M.has_status_effect(/datum/status_effect/chem/SGDF))// If they're ingested a little bit (10u minimum), then give them a little healing.
+ unitCheck = FALSE
+ to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.")
+ M.adjustBruteLoss(-10, 0)
+ M.adjustFireLoss(-10, 0)
+ M.blood_volume += 100
+ M.next_move_modifier = 1
+ if (M.nutrition < 1500)
+ M.nutrition += 500
+
+/datum/reagent/fermi/SDGF/reaction_mob(mob/living/carbon/human/M, method=TOUCH, reac_volume)
+ if(volume<5)
+ M.visible_message("The growth factor froths upon [M]'s body, failing to do anything of note.")
+ return
+ if(M.stat == DEAD)
+ if(M.suiciding || (HAS_TRAIT(M, TRAIT_NOCLONE)) || M.hellbound)
+ M.visible_message("The growth factor inertly sticks to [M]'s body, failing to do anything of note.")
+ return
+ if(!M.mind)
+ M.visible_message("The growth factor shudders, merging with [M]'s body, but is unable to replicate properly.")
+
+ var/bodydamage = (M.getBruteLoss() + M.getFireLoss())
+ var/typepath = M.type
+ volume =- 5
+
+ var/mob/living/carbon/human/fermi_Gclone = new typepath(M.loc)
+ var/mob/living/carbon/human/SM = fermi_Gclone
+ if(istype(SM) && istype(M))
+ SM.real_name = M.real_name
+ M.dna.transfer_identity(SM)
+ SM.updateappearance(mutcolor_update=1)
+ M.mind.transfer_to(SM)
+ M.visible_message("[M]'s body shudders, the growth factor rapidly splitting into a new clone of [M].")
+
+ if(bodydamage>50)
+ SM.adjustOxyLoss(-(bodydamage/10), 0)
+ SM.adjustToxLoss(-(bodydamage/10), 0)
+ SM.blood_volume = (BLOOD_VOLUME_NORMAL*SM.blood_ratio)/1.5
+ SM.adjustCloneLoss((bodydamage/10), 0)
+ SM.setOrganLoss(ORGAN_SLOT_BRAIN, (bodydamage/10))
+ SM.nutrition = 400
+ if(bodydamage>200)
+ SM.gain_trauma_type(BRAIN_TRAUMA_MILD)
+ if(bodydamage>300)
+ var/obj/item/bodypart/l_arm = SM.get_bodypart(BODY_ZONE_L_ARM) //We get the body parts we want this way.
+ var/obj/item/bodypart/r_arm = SM.get_bodypart(BODY_ZONE_R_ARM)
+ l_arm.drop_limb()
+ r_arm.drop_limb()
+ if(bodydamage>400)
+ var/obj/item/bodypart/l_leg = SM.get_bodypart(BODY_ZONE_L_LEG) //We get the body parts we want this way.
+ var/obj/item/bodypart/r_leg = SM.get_bodypart(BODY_ZONE_R_LEG)
+ l_leg.drop_limb()
+ r_leg.drop_limb()
+ if(bodydamage>500)
+ SM.gain_trauma_type(BRAIN_TRAUMA_SEVERE)
+ if(bodydamage>600)
+ var/datum/species/mutation = pick(subtypesof(/datum/species))
+ SM.set_species(mutation)
+
+ //Transfer remaining reagent to clone. I think around 30u will make a healthy clone, otherwise they'll have clone damage, blood loss, brain damage and hunger.
+ SM.reagents.add_reagent("SDGFheal", volume)
+ M.reagents.remove_reagent(id, volume)
+
+ SM.updatehealth()
+ SM.emote("gasp")
+ log_combat(M, M, "SDGF clone-vived", src)
+ ..()
+
+//Unobtainable, used in clone spawn.
+/datum/reagent/fermi/SDGFheal
+ name = "synthetic-derived healing factor"
+ id = "SDGFheal"
+ description = "Leftover SDGF is transferred into the resulting clone, which quickly heals up the stresses from suddenly splitting. Restores blood, nutrition, and repaires brain and clone damage quickly. Only obtainable from using excess SDGF, and only enters the cloned body."
+ metabolization_rate = 1
+ can_synth = FALSE
+
+/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated)
+ if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
+ M.blood_volume += 10
+ M.adjustCloneLoss(-2, 0)
+ M.setOrganLoss(ORGAN_SLOT_BRAIN, -1)
+ M.nutrition += 10
+ ..()
+
+//Unobtainable, used if SDGF is impure but not too impure
+/datum/reagent/impure/SDGFtox
+ name = "Synthetic-derived apoptosis factor"
+ id = "SDGFtox"
+ description = "Impure synthetic-derived growth factor causes certain cells to undergo cell death, causing clone damage, and damaging blood cells."//i.e. tell me please, figure it's a good way to get pinged for bugfixes.
+ metabolization_rate = 1
+ can_synth = FALSE
+
+/datum/reagent/impure/SDGFtox/on_mob_life(mob/living/carbon/M)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good)
+ M.blood_volume -= 10
+ M.adjustCloneLoss(2, 0)
+ ..()
+
+//Fail state of SDGF
+/datum/reagent/impure/SDZF
+ name = "synthetic-derived zombie factor"
+ id = "SDZF"
+ description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. Emulates normal synthetic-derived growth factor, but produces a hostile zombie at the end of it."
+ color = "#a502e0" // rgb: 96, 0, 255
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ var/startHunger
+ can_synth = TRUE
+ chemical_flags = REAGENT_SNEAKYNAME
+
+/datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
+ switch(current_cycle)//Pretends to be normal
+ if(20)
+ to_chat(M, "You feel the synethic cells rest uncomfortably within your body as they start to pulse and grow rapidly.")
+ startHunger = M.nutrition
+ if(21 to 29)
+ M.nutrition = M.nutrition + (M.nutrition/10)
+ if(30)
+ to_chat(M, "You feel the synethic cells grow and expand within yourself, bloating your body outwards.")
+ if(31 to 49)
+ M.nutrition = M.nutrition + (M.nutrition/5)
+ if(50)
+ to_chat(M, "The synethic cells begin to merge with your body, it feels like your body is made of a viscous water, making your movements difficult.")
+ M.next_move_modifier = 4//If this makes you fast then please fix it, it should make you slow!!
+ if(51 to 73)
+ M.nutrition = M.nutrition + (M.nutrition/2)
+ if(74)
+ to_chat(M, "The cells begin to precipitate outwards of your body, but... something is wrong, the sythetic cells are beginnning to rot...")
+ if (M.nutrition < 20000) //whoever knows the maxcap, please let me know, this seems a bit low.
+ M.nutrition = 20000 //https://www.youtube.com/watch?v=Bj_YLenOlZI
+ if(75 to 85)
+ M.adjustToxLoss(1, 0)// the warning!
+
+ if(86)//mean clone time!
+ if (!M.reagents.has_reagent("pen_acid"))//Counterplay is pent.)
+ message_admins("(non-infectious) SDZF: Zombie spawned at [M] [COORD(M)]!")
+ M.nutrition = startHunger - 500//YOU BEST BE RUNNING AWAY AFTER THIS YOU BADDIE
+ M.next_move_modifier = 1
+ to_chat(M, "Your body splits away from the cell clone of yourself, your attempted clone birthing itself violently from you as it begins to shamble around, a terrifying abomination of science.")
+ M.visible_message("[M] suddenly shudders, and splits into a funky smelling copy of themselves!")
+ M.emote("scream")
+ M.adjustToxLoss(30, 0)
+ var/mob/living/simple_animal/hostile/unemployedclone/ZI = new(get_turf(M.loc))
+ ZI.damage_coeff = list(BRUTE = ((1 / volume)**0.25) , BURN = ((1 / volume)**0.1), TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ ZI.real_name = M.real_name//Give your offspring a big old kiss.
+ ZI.name = M.real_name
+ ZI.desc = "[M]'s clone, gone horribly wrong."
+ log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying zombie instead")
+ M.reagents.remove_reagent(id, 20)
+
+ else//easier to deal with
+ to_chat(M, "The pentetic acid seems to have stopped the decay for now, clumping up the cells into a horrifying tumour!")
+ M.nutrition = startHunger - 500
+ var/mob/living/simple_animal/slime/S = new(get_turf(M.loc),"grey") //TODO: replace slime as own simplemob/add tumour slime cores for science/chemistry interplay
+ S.damage_coeff = list(BRUTE = ((1 / volume)**0.1) , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ S.name = "Living teratoma"
+ S.real_name = "Living teratoma"//horrifying!!
+ S.rabid = 1//Make them an angery boi
+ M.reagents.remove_reagent(id, volume)
+ to_chat(M, "A large glob of the tumour suddenly splits itself from your body. You feel grossed out and slimey...")
+ log_game("FERMICHEM: [M] ckey: [M.key]'s clone has become a horrifying teratoma instead")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Zombie clones made!")
+
+ if(87 to INFINITY)
+ M.adjustToxLoss(1, 0)
+ ..()
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
new file mode 100644
index 0000000000..88586b423e
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm
@@ -0,0 +1,152 @@
+/*
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// ASTROGEN
+///////////////////////////////////////////////////////////////////////////////////////////////////
+More fun chems!
+When you take it, it spawns a ghost that the player controls. (No access to deadchat)
+This ghost moves pretty quickly and is mostly invisible, but is still visible for people with eyes.
+When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential.
+Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up)
+There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it.
+I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction.
+*/
+
+
+
+/datum/reagent/fermi/astral // Gives you the ability to astral project for a moment!
+ name = "Astrogen"
+ id = "astral"
+ description = "An opalescent murky liquid that is said to distort your soul from your being."
+ color = "#A080H4" // rgb: , 0, 255
+ taste_description = "your mind"
+ metabolization_rate = 0//Removal is exponential, see code
+ overdose_threshold = 20
+ addiction_threshold = 24.5
+ addiction_stage1_end = 9999//Should never end. There is no escape make your time
+ var/mob/living/carbon/origin
+ var/mob/living/simple_animal/astral/G = null
+ var/datum/mind/originalmind
+ var/antiGenetics = 255
+ var/sleepytime = 0
+ inverse_chem_val = 0.25
+ can_synth = FALSE
+
+/datum/action/chem/astral
+ name = "Return to body"
+ var/mob/living/carbon/origin = null
+ var/mob/living/simple_animal/hostile/retaliate/ghost = null
+
+/datum/action/chem/astral/Trigger()
+ ghost.mind.transfer_to(origin)
+ qdel(src)
+
+/datum/reagent/fermi/astral/reaction_turf(turf/T, reac_volume)
+ if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel))
+ var/turf/open/floor/F = T
+ F.PlaceOnTop(/turf/open/floor/fakespace)
+ ..()
+
+/datum/reagent/fermi/astral/reaction_obj(obj/O, reac_volume)
+ if(istype(O, /obj/item/bedsheet))
+ new /obj/item/bedsheet/cosmos(get_turf(O))
+ qdel(O)
+
+
+/datum/reagent/fermi/astral/on_mob_life(mob/living/carbon/M) // Gives you the ability to astral project for a moment!
+ M.alpha = 255
+ if(current_cycle == 0)
+ originalmind = M.mind
+ log_game("FERMICHEM: [M] ckey: [M.key] became an astral ghost")
+ origin = M
+ if (G == null)
+ G = new(get_turf(M.loc))
+ G.name = "[M]'s astral projection"
+ var/datum/action/chem/astral/AS = new(G)
+ AS.origin = M
+ AS.ghost = G
+ if(M.mind)
+ M.mind.transfer_to(G)
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections")
+ if(overdosed)
+ if(prob(50))
+ to_chat(G, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!")
+ do_teleport(G, M.loc)
+ M.reagents.remove_reagent(id, current_cycle/10, FALSE)//exponent
+ sleepytime+=5
+ if(G)//This is a mess because of how slow qdel is, so this is all to stop runtimes.
+ if(G.mind)
+ if(G.stat == DEAD || G.pseudo_death == TRUE)
+ G.mind.transfer_to(M)
+ qdel(G)
+ ..()
+
+/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M)
+ if(!G)
+ if(M.mind)
+ var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
+ M.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
+ to_chat(G, "[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'")
+ log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
+ originalmind.transfer_to(M)
+ else if(G.mind)
+ G.mind.transfer_to(origin)
+ qdel(G)
+ if(overdosed)
+ to_chat(M, "The high volume of astrogen you just took causes you to black out momentarily as your mind snaps back to your body.")
+ M.Sleeping(sleepytime, 0)
+ antiGenetics = 255
+ if(G)//just in case
+ qdel(G)
+ log_game("FERMICHEM: [M] has astrally returned to their body!")
+ ..()
+
+//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 50-80 minutes to die from this.
+/datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M)
+ if(addiction_stage < 2)
+ antiGenetics = 255
+ M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them.
+ if(prob(70))
+ M.alpha--
+ antiGenetics--
+ switch(antiGenetics)
+ if(245)
+ to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?")
+ M.alpha--
+ antiGenetics--
+ log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to Astrogen")
+ if(220)
+ to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?")
+ M.alpha--
+ antiGenetics--
+ if(200)
+ to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.")
+ M.alpha--
+ antiGenetics--
+ ADD_TRAIT(M, TRAIT_NOCLONE, "astral") //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else.
+ M.hellbound = TRUE
+ if(180)
+ to_chat(M, "You feel fear build up in yourself as more and more of your body and consciousness begins to fade.")
+ M.alpha--
+ antiGenetics--
+ if(120)
+ to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.")
+ M.alpha--
+ antiGenetics--
+ if(80)
+ to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates your forthcoming oblivion.")
+ M.alpha--
+ antiGenetics--
+ if(45)
+ to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.")
+ M.alpha--
+ antiGenetics--
+ if(-INFINITY to 30)
+ to_chat(M, "Your body disperses from existence, as you become one with the universe.")
+ to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag, you do not remember the afterlife IC)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only.
+ deadchat_broadcast("[M] has become one with the universe, meaning that their IC conciousness is continuous in a new life. If they find a way back to life, they are allowed to remember their previous life. Be careful what you say. If they abuse this, bwoink the FUCK outta them.")
+ M.visible_message("[M] suddenly disappears, their body evaporating from existence, freeing [M] from their mortal coil.")
+ message_admins("[M] (ckey: [M.ckey]) has become one with the universe, and have continuous memories thoughout their lives should they find a way to come back to life (such as an inteligence potion, midround antag, ghost role).")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral obliterations")
+ qdel(M) //Approx 60minutes till death from initial addiction
+ log_game("FERMICHEM: [M] ckey: [M.key] has been obliterated from Astrogen addiction")
+ ..()
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
new file mode 100644
index 0000000000..bf915d5b6f
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
@@ -0,0 +1,203 @@
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// EIGENSTASIUM
+///////////////////////////////////////////////////////////////////////////////////////////////////
+//eigenstate Chem
+//Teleports you to chemistry and back
+//OD teleports you randomly around the Station
+//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself.
+//During the process you get really hungry, then your items start teleporting randomly,
+//then alternative versions of yourself are brought in from a different universe and they yell at you.
+//and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative
+
+/datum/reagent/fermi/eigenstate
+ name = "Eigenstasium"
+ id = "eigenstate"
+ description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient"
+ taste_description = "wiggly cosmic dust."
+ color = "#5020F4" // rgb: 50, 20, 255
+ overdose_threshold = 15
+ addiction_threshold = 15
+ metabolization_rate = 1.2 * REAGENTS_METABOLISM
+ addiction_stage2_end = 30
+ addiction_stage3_end = 41
+ addiction_stage4_end = 44 //Incase it's too long
+ data = list("location_created" = null)
+ var/turf/location_created
+ var/obj/effect/overlay/holo_pad_hologram/Eigenstate
+ var/turf/open/location_return = null
+ var/addictCyc3 = 0
+ var/mob/living/carbon/fermi_Tclone = null
+ var/teleBool = FALSE
+ pH = 3.7
+ can_synth = TRUE
+
+/datum/reagent/fermi/eigenstate/on_new(list/data)
+ location_created = data.["location_created"]
+
+//Main functions
+/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry!
+ if(current_cycle == 0)
+ log_game("FERMICHEM: [M] ckey: [M.key] took eigenstasium")
+
+ //make hologram at return point
+ Eigenstate = new(loc)
+ Eigenstate.appearance = M.appearance
+ Eigenstate.alpha = 170
+ Eigenstate.add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY)
+ Eigenstate.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it.
+ Eigenstate.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them.
+ Eigenstate.setAnchored(TRUE)//So space wind cannot drag it.
+ Eigenstate.name = "[M]'s' eigenstate"//If someone decides to right click.
+ Eigenstate.set_light(2) //hologram lighting
+
+ location_return = get_turf(M) //sets up return point
+ to_chat(M, "You feel your wavefunction split!")
+ if(purity > 0.9) //Teleports you home if it's pure enough
+ if(!location_created && data) //Just in case
+ location_created = data.["location_created"]
+ log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium")
+ do_sparks(5,FALSE,M)
+ do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg')
+ do_sparks(5,FALSE,M)
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Pure eigentstate jumps")
+
+
+ if(prob(20))
+ do_sparks(5,FALSE,M)
+ ..()
+
+/datum/reagent/fermi/eigenstate/on_mob_delete(mob/living/M) //returns back to original location
+ do_sparks(5,FALSE,M)
+ to_chat(M, "You feel your wavefunction collapse!")
+ do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
+ do_sparks(5,FALSE,M)
+ qdel(Eigenstate)
+ ..()
+
+/datum/reagent/fermi/eigenstate/overdose_start(mob/living/M) //Overdose, makes you teleport randomly
+ . = ..()
+ to_chat(M, "Oh god, you feel like your wavefunction is about to tear.")
+ log_game("FERMICHEM: [M] ckey: [M.key] has overdosed on eigenstasium")
+ M.Jitter(20)
+ metabolization_rate += 0.5 //So you're not stuck forever teleporting.
+
+/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you.
+ do_sparks(5,FALSE,M)
+ do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg')
+ do_sparks(5,FALSE,M)
+ ..()
+
+//Addiction
+/datum/reagent/fermi/eigenstate/addiction_act_stage1(mob/living/M) //Welcome to Fermis' wild ride.
+ if(addiction_stage == 1)
+ to_chat(M, "Your wavefunction feels like it's been ripped in half. You feel empty inside.")
+ log_game("FERMICHEM: [M] ckey: [M.key] has become addicted to eigenstasium")
+ M.Jitter(10)
+ M.nutrition = M.nutrition - (M.nutrition/15)
+ ..()
+
+/datum/reagent/fermi/eigenstate/addiction_act_stage2(mob/living/M)
+ if(addiction_stage == 11)
+ to_chat(M, "You start to convlse violently as you feel your consciousness split and merge across realities as your possessions fly wildy off your body.")
+ M.Jitter(200)
+ M.Knockdown(200)
+ M.Stun(80)
+ var/items = M.get_contents()
+ if(!LAZYLEN(items))
+ return ..()
+ var/obj/item/I = pick(items)
+ if(istype(I, /obj/item/implant))
+ qdel(I)
+ to_chat(M, "You feel your implant rip itself out of you, sent flying off to another dimention!")
+ else
+ M.dropItemToGround(I, TRUE)
+ do_sparks(5,FALSE,I)
+ do_teleport(I, get_turf(I), 5, no_effects=TRUE);
+ do_sparks(5,FALSE,I)
+ ..()
+
+/datum/reagent/fermi/eigenstate/addiction_act_stage3(mob/living/M)//Pulls multiple copies of the character from alternative realities while teleporting them around!
+ //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in
+ switch(addictCyc3) //Loops 0 -> 1 -> 2 -> 1 -> 2 -> 1 ...ect.
+ if(0)
+ M.Jitter(100)
+ to_chat(M, "Your eigenstate starts to rip apart, causing a localised collapsed field as you're ripped from alternative universes, trapped around the densisty of the event horizon.")
+ if(1)
+ var/typepath = M.type
+ fermi_Tclone = new typepath(M.loc)
+ var/mob/living/carbon/C = fermi_Tclone
+ fermi_Tclone.appearance = M.appearance
+ C.real_name = M.real_name
+ M.visible_message("[M] collapses in from an alternative reality!")
+ do_teleport(C, get_turf(C), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one!
+ do_sparks(5,FALSE,C)
+ C.emote("spin")
+ M.emote("spin")
+ M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE)
+ C.emote("me",1,"[pick("says", "cries", "mewls", "giggles", "shouts", "screams", "gasps", "moans", "whispers", "announces")], \"[pick("Bugger me, whats all this then?", "Hot damn, where is this?", "sacre bleu! Ou suis-je?!", "Yee haw! This is one hell of a hootenanny!", "WHAT IS HAPPENING?!", "Picnic!", "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", "I've come from the future to warn you to not take eigenstasium! Oh no! I'm too late!", "You fool! You took too much eigenstasium! You've doomed us all!", "What...what's with these teleports? It's like one of my Japanese animes...!", "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", "This must be the will of Stein's gate.", "Fermichem was a mistake", "This is one hell of a beepsky smash.", "Now neither of us will be virgins!")]\"")
+ if(2)
+ var/mob/living/carbon/C = fermi_Tclone
+ do_sparks(5,FALSE,C)
+ qdel(C) //Deletes CLONE, or at least I hope it is.
+ M.visible_message("[M] is snapped across to a different alternative reality!")
+ addictCyc3 = 0 //counter
+ fermi_Tclone = null
+ addictCyc3++
+ do_teleport(M, get_turf(M), 2, no_effects=TRUE) //Teleports player randomly
+ do_sparks(5,FALSE,M)
+ ..()
+
+/datum/reagent/fermi/eigenstate/addiction_act_stage4(mob/living/M) //Thanks for riding Fermis' wild ride. Mild jitter and player buggery.
+ if(addiction_stage == 42)
+ do_sparks(5,FALSE,M)
+ do_teleport(M, get_turf(M), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one!
+ do_sparks(5,FALSE,M)
+ M.Sleeping(100, 0)
+ M.Jitter(50)
+ M.Knockdown(100)
+ to_chat(M, "You feel your eigenstate settle, snapping an alternative version of yourself into reality. All your previous memories are lost and replaced with the alternative version of yourself. This version of you feels more [pick("affectionate", "happy", "lusty", "radical", "shy", "ambitious", "frank", "voracious", "sensible", "witty")] than your previous self, sent to god knows what universe.")
+ M.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE)
+ log_game("FERMICHEM: [M] ckey: [M.key] has become an alternative universe version of themselves.")
+ M.reagents.remove_all_type(/datum/reagent, 100, 0, 1)
+ /*
+ for(var/datum/mood_event/Me in M)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, Me) //Why does this not work?
+ */
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "Alternative dimension", /datum/mood_event/eigenstate)
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "Wild rides ridden")
+
+ if(prob(20))
+ do_sparks(5,FALSE,M)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[id]_overdose")//holdover until above fix works
+ ..()
+
+/datum/reagent/fermi/eigenstate/reaction_turf(turf/T, reac_volume)
+ //if(cached_purity < 0.99) To add with next batch of fixes and tweaks.
+ var/obj/structure/closet/First
+ var/obj/structure/closet/Previous
+ for(var/obj/structure/closet/C in T.contents)
+ if(C.eigen_teleport == TRUE)
+ C.visible_message("[C] fizzes, it's already linked to something else!")
+ continue
+ if(!Previous)
+ First = C
+ Previous = C
+ continue
+ C.eigen_teleport = TRUE
+ C.eigen_target = Previous
+ C.color = "#9999FF" //Tint the locker slightly.
+ C.alpha = 200
+ do_sparks(5,FALSE,C)
+ Previous = C
+ if(!First)
+ return
+ if(Previous == First)
+ return
+ First.eigen_teleport = TRUE
+ First.eigen_target = Previous
+ First.color = "#9999FF"
+ First.alpha = 200
+ do_sparks(5,FALSE,First)
+ First.visible_message("The lockers' eigenstates spilt and merge, linking each of their contents together.")
+
+//eigenstate END
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
new file mode 100644
index 0000000000..69f76e380b
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
@@ -0,0 +1,365 @@
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// BREAST ENLARGE
+///////////////////////////////////////////////////////////////////////////////////////////////////
+//Other files that are relivant:
+//modular_citadel/code/datums/status_effects/chems.dm
+//modular_citadel/code/modules/arousal/organs/breasts.dm
+
+//breast englargement
+//Honestly the most requested chems
+//I'm not a very kinky person, sorry if it's not great
+//I tried to make it interesting..!!
+
+//Normal function increases your breast size by 0.05, 10units = 1 cup.
+//If you get stupid big, it presses against your clothes, causing brute and oxydamage. Then rips them off.
+//If you keep going, it makes you slower, in speed and action.
+//decreasing your size will return you to normal.
+//(see the status effect in chem.dm)
+//Overdosing on (what is essentially space estrogen) makes you female, removes balls and shrinks your dick.
+//OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early.
+
+/datum/reagent/fermi/breast_enlarger
+ name = "Succubus milk"
+ id = "breast_enlarger"
+ description = "A volatile collodial mixture derived from milk that encourages mammary production via a potent estrogen mix."
+ color = "#E60584" // rgb: 96, 0, 255
+ taste_description = "a milky ice cream like flavour."
+ overdose_threshold = 17
+ metabolization_rate = 0.25
+ impure_chem = "BEsmaller" //If you make an inpure chem, it stalls growth
+ inverse_chem_val = 0.35
+ inverse_chem = "BEsmaller" //At really impure vols, it just becomes 100% inverse
+ can_synth = FALSE
+
+/datum/reagent/fermi/breast_enlarger/on_mob_add(mob/living/carbon/M)
+ . = ..()
+ if(!ishuman(M)) //The monkey clause
+ if(volume >= 15) //To prevent monkey breast farms
+ var/turf/T = get_turf(M)
+ var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(T)
+ var/list/seen = viewers(8, T)
+ for(var/mob/S in seen)
+ to_chat(S, "A pair of breasts suddenly fly out of the [M]!")
+ //var/turf/T2 = pick(turf in view(5, M))
+ var/T2 = get_random_station_turf()
+ M.adjustBruteLoss(25)
+ M.Knockdown(50)
+ M.Stun(50)
+ B.throw_at(T2, 8, 1)
+ M.reagents.remove_reagent(id, volume)
+ return
+ log_game("FERMICHEM: [M] ckey: [M.key] has ingested Sucubus milk")
+ var/mob/living/carbon/human/H = M
+ H.genital_override = TRUE
+ var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts")
+ if(!B)
+ H.emergent_genital_call()
+ return
+ if(!B.size == "huge")
+ var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5)
+ B.prev_size = B.size
+ B.cached_size = sizeConv[B.size]
+
+/datum/reagent/fermi/breast_enlarger/on_mob_life(mob/living/carbon/M) //Increases breast size
+ if(!ishuman(M))//Just in case
+ return..()
+
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts")
+ if(!B) //If they don't have breasts, give them breasts.
+
+ //If they have Acute hepatic pharmacokinesis, then route processing though liver.
+ if(HAS_TRAIT(M, TRAIT_PHARMA))
+ var/obj/item/organ/liver/L = M.getorganslot("liver")
+ if(L)
+ L.swelling+= 0.05
+ return..()
+ else
+ M.adjustToxLoss(1)
+ return..()
+
+ //otherwise proceed as normal
+ var/obj/item/organ/genital/breasts/nB = new
+ nB.Insert(M)
+ if(nB)
+ if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"])
+ nB.color = skintone2hex(H.skin_tone)
+ else if(M.dna.features["breasts_color"])
+ nB.color = "#[M.dna.features["breasts_color"]]"
+ else
+ nB.color = skintone2hex(H.skin_tone)
+ nB.size = "flat"
+ nB.cached_size = 0
+ nB.prev_size = 0
+ to_chat(M, "Your chest feels warm, tingling with newfound sensitivity.")
+ M.reagents.remove_reagent(id, 5)
+ B = nB
+ //If they have them, increase size. If size is comically big, limit movement and rip clothes.
+ B.cached_size = B.cached_size + 0.05
+ if (B.cached_size >= 8.5 && B.cached_size < 9)
+ if(H.w_uniform || H.wear_suit)
+ var/target = M.get_bodypart(BODY_ZONE_CHEST)
+ to_chat(M, "Your breasts begin to strain against your clothes tightly!")
+ M.adjustOxyLoss(5, 0)
+ M.apply_damage(1, BRUTE, target)
+ B.update()
+ ..()
+
+/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders.
+
+ //Acute hepatic pharmacokinesis.
+ if(HAS_TRAIT(M, TRAIT_PHARMA))
+ var/obj/item/organ/liver/L = M.getorganslot("liver")
+ L.swelling+= 0.05
+ return ..()
+
+ var/obj/item/organ/genital/penis/P = M.getorganslot("penis")
+ var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles")
+ var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina")
+ var/obj/item/organ/genital/womb/W = M.getorganslot("womb")
+
+ if(M.gender == MALE)
+ M.gender = FEMALE
+ M.visible_message("[M] suddenly looks more feminine!", "You suddenly feel more feminine!")
+
+ if(P)
+ P.cached_length = P.cached_length - 0.05
+ P.update()
+ if(T)
+ T.Remove(M)
+ if(!V)
+ var/obj/item/organ/genital/vagina/nV = new
+ nV.Insert(M)
+ V = nV
+ if(!W)
+ var/obj/item/organ/genital/womb/nW = new
+ nW.Insert(M)
+ W = nW
+ ..()
+
+/datum/reagent/fermi/BEsmaller
+ name = "Modesty milk"
+ id = "BEsmaller"
+ description = "A volatile collodial mixture derived from milk that encourages mammary reduction via a potent estrogen mix. Produced by reacting impure Succubus milk."
+ color = "#E60584" // rgb: 96, 0, 255
+ taste_description = "a milky ice cream like flavour."
+ metabolization_rate = 0.25
+ can_synth = FALSE
+
+/datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M)
+ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts")
+ if(!B)
+ //Acute hepatic pharmacokinesis.
+ if(HAS_TRAIT(M, TRAIT_PHARMA))
+ var/obj/item/organ/liver/L = M.getorganslot("liver")
+ L.swelling-= 0.05
+ return ..()
+
+ //otherwise proceed as normal
+ return..()
+ B.cached_size = B.cached_size - 0.05
+ B.update()
+ ..()
+
+/datum/reagent/fermi/BEsmaller_hypo
+ name = "Rectify milk" //Rectify
+ id = "BEsmaller_hypo"
+ color = "#E60584"
+ taste_description = "a milky ice cream like flavour."
+ metabolization_rate = 0.25
+ description = "A medicine used to treat organomegaly in a patient's breasts."
+ var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5)
+ can_synth = TRUE
+
+/datum/reagent/fermi/BEsmaller_hypo/on_mob_add(mob/living/carbon/M)
+ . = ..()
+ if(!M.getorganslot("vagina"))
+ if(M.dna.features["has_vag"])
+ var/obj/item/organ/genital/vagina/nV = new
+ nV.Insert(M)
+ if(!M.getorganslot("womb"))
+ if(M.dna.features["has_womb"])
+ var/obj/item/organ/genital/womb/nW = new
+ nW.Insert(M)
+
+/datum/reagent/fermi/BEsmaller_hypo/on_mob_life(mob/living/carbon/M)
+ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts")
+ if(!B)
+ return..()
+ if(!M.dna.features["has_breasts"])//Fast fix for those who don't want it.
+ B.cached_size = B.cached_size - 0.1
+ B.update()
+ else if(B.cached_size > (sizeConv[M.dna.features["breasts_size"]]+0.1))
+ B.cached_size = B.cached_size - 0.05
+ B.update()
+ else if(B.cached_size < (sizeConv[M.dna.features["breasts_size"]])+0.1)
+ B.cached_size = B.cached_size + 0.05
+ B.update()
+ ..()
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// PENIS ENLARGE
+///////////////////////////////////////////////////////////////////////////////////////////////////
+//See breast explanation, it's the same but with taliwhackers
+//instead of slower movement and attacks, it slows you and increases the total blood you need in your system.
+//Since someone else made this in the time it took me to PR it, I merged them.
+/datum/reagent/fermi/penis_enlarger // Due to popular demand...!
+ name = "Incubus draft"
+ id = "penis_enlarger"
+ description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb
+ color = "#888888" // This is greyish..?
+ taste_description = "chinese dragon powder"
+ overdose_threshold = 17 //ODing makes you male and removes female genitals
+ metabolization_rate = 0.5
+ impure_chem = "PEsmaller" //If you make an inpure chem, it stalls growth
+ inverse_chem_val = 0.35
+ inverse_chem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead.
+ can_synth = FALSE
+
+/datum/reagent/fermi/penis_enlarger/on_mob_add(mob/living/carbon/M)
+ . = ..()
+ if(!ishuman(M)) //Just monkeying around.
+ if(volume >= 15) //to prevent monkey penis farms
+ var/turf/T = get_turf(M)
+ var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(T)
+ var/list/seen = viewers(8, T)
+ for(var/mob/S in seen)
+ to_chat(S, "A penis suddenly flies out of the [M]!")
+ var/T2 = get_random_station_turf()
+ M.adjustBruteLoss(25)
+ M.Knockdown(50)
+ M.Stun(50)
+ P.throw_at(T2, 8, 1)
+ M.reagents.remove_reagent(id, volume)
+ return
+ var/mob/living/carbon/human/H = M
+ H.genital_override = TRUE
+ var/obj/item/organ/genital/penis/P = M.getorganslot("penis")
+ if(!P)
+ H.emergent_genital_call()
+ return
+ P.prev_length = P.length
+ P.cached_length = P.length
+
+/datum/reagent/fermi/penis_enlarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch.
+ if(!ishuman(M))
+ return
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/genital/penis/P = M.getorganslot("penis")
+ if(!P)//They do have a preponderance for escapism, or so I've heard.
+
+ //If they have Acute hepatic pharmacokinesis, then route processing though liver.
+ if(HAS_TRAIT(M, TRAIT_PHARMA))
+ var/obj/item/organ/liver/L = M.getorganslot("liver")
+ if(L)
+ L.swelling+= 0.05
+ return..()
+ else
+ M.adjustToxLoss(1)
+ return..()
+
+ //otherwise proceed as normal
+ var/obj/item/organ/genital/penis/nP = new
+ nP.Insert(M)
+ if(nP)
+ nP.length = 1
+ to_chat(M, "Your groin feels warm, as you feel a newly forming bulge down below.")
+ nP.cached_length = 1
+ nP.prev_length = 1
+ M.reagents.remove_reagent(id, 5)
+ P = nP
+
+ P.cached_length = P.cached_length + 0.1
+ if (P.cached_length >= 20.5 && P.cached_length < 21)
+ if(H.w_uniform || H.wear_suit)
+ var/target = M.get_bodypart(BODY_ZONE_CHEST)
+ to_chat(M, "Your cock begin to strain against your clothes tightly!")
+ M.apply_damage(2.5, BRUTE, target)
+
+ P.update()
+ ..()
+
+/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders.
+ //Acute hepatic pharmacokinesis.
+ if(HAS_TRAIT(M, TRAIT_PHARMA))
+ var/obj/item/organ/liver/L = M.getorganslot("liver")
+ L.swelling+= 0.05
+ return..()
+
+ var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts")
+ var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles")
+ var/obj/item/organ/genital/vagina/V = M.getorganslot("vagina")
+ var/obj/item/organ/genital/womb/W = M.getorganslot("womb")
+
+ if(M.gender == FEMALE)
+ M.gender = MALE
+ M.visible_message("[M] suddenly looks more masculine!", "You suddenly feel more masculine!")
+
+ if(B)
+ B.cached_size = B.cached_size - 0.05
+ B.update()
+ if(V)
+ V.Remove(M)
+ if(W)
+ W.Remove(M)
+ if(!T)
+ var/obj/item/organ/genital/testicles/nT = new
+ nT.Insert(M)
+ T = nT
+ ..()
+
+/datum/reagent/fermi/PEsmaller // Due to cozmo's request...!
+ name = "Chastity draft"
+ id = "PEsmaller"
+ description = "A volatile collodial mixture derived from various masculine solutions that encourages a smaller gentleman's package via a potent testosterone mix. Produced by reacting impure Incubus draft."
+ color = "#888888" // This is greyish..?
+ taste_description = "chinese dragon powder"
+ metabolization_rate = 0.5
+ can_synth = FALSE
+
+/datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M)
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/genital/penis/P = H.getorganslot("penis")
+ if(!P)
+ //Acute hepatic pharmacokinesis.
+ if(HAS_TRAIT(M, TRAIT_PHARMA))
+ var/obj/item/organ/liver/L = M.getorganslot("liver")
+ L.swelling-= 0.05
+ return..()
+
+ //otherwise proceed as normal
+ return..()
+ P.cached_length = P.cached_length - 0.1
+ P.update()
+ ..()
+
+/datum/reagent/fermi/PEsmaller_hypo
+ name = "Rectify draft"
+ id = "PEsmaller_hypo"
+ color = "#888888" // This is greyish..?
+ taste_description = "chinese dragon powder"
+ description = "A medicine used to treat organomegaly in a patient's penis."
+ metabolization_rate = 0.5
+ can_synth = TRUE
+
+/datum/reagent/fermi/PEsmaller_hypo/on_mob_add(mob/living/carbon/M)
+ . = ..()
+ if(!M.getorganslot("testicles"))
+ if(M.dna.features["has_balls"])
+ var/obj/item/organ/genital/testicles/nT = new
+ nT.Insert(M)
+
+/datum/reagent/fermi/PEsmaller_hypo/on_mob_life(mob/living/carbon/M)
+ var/obj/item/organ/genital/penis/P = M.getorganslot("penis")
+ if(!P)
+ return ..()
+ if(!M.dna.features["has_cock"])//Fast fix for those who don't want it.
+ P.cached_length = P.cached_length - 0.2
+ P.update()
+ else if(P.cached_length > (M.dna.features["cock_length"]+0.1))
+ P.cached_length = P.cached_length - 0.1
+ P.update()
+ else if(P.cached_length < (M.dna.features["cock_length"]+0.1))
+ P.cached_length = P.cached_length + 0.1
+ P.update()
+ ..()
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
new file mode 100644
index 0000000000..4acfda0573
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -0,0 +1,412 @@
+ //Fermichem!!
+//Fun chems for all the family
+
+/datum/reagent/fermi
+ name = "Fermi" //This should never exist, but it does so that it can exist in the case of errors..
+ id = "fermi"
+ taste_description = "affection and love!"
+ can_synth = FALSE
+ //SplitChem = TRUE
+ impure_chem = "fermiTox"// What chemical is metabolised with an inpure reaction
+ inverse_chem_val = 0.25 // If the impurity is below 0.5, replace ALL of the chem with inverse_chemupon metabolising
+ inverse_chem = "fermiTox"
+
+//This should process fermichems to find out how pure they are and what effect to do.
+/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount)
+ . = ..()
+
+
+//When merging two fermichems, see above
+/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging
+ . = ..()
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// HATIMUIM
+///////////////////////////////////////////////////////////////////////////////////////////////////
+//Adds a heat upon your head, and tips their hat
+//Also has a speech alteration effect when the hat is there
+//Increase armour; 1 armour per 10u
+//but if you OD it becomes negative.
+
+
+/datum/reagent/fermi/hatmium //for hatterhat
+ name = "Hat growth serium"
+ id = "hatmium"
+ description = "A strange substance that draws in a hat from the hat dimention."
+ color = "#7c311a" // rgb: , 0, 255
+ taste_description = "like jerky, whiskey and an off aftertaste of a crypt."
+ metabolization_rate = 0.2
+ overdose_threshold = 25
+ chemical_flags = REAGENT_DONOTSPLIT
+ pH = 4
+ can_synth = TRUE
+
+
+/datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M)
+ . = ..()
+ if(M.head)
+ var/obj/item/W = M.head
+ if(istype(W, /obj/item/clothing/head/hattip))
+ qdel(W)
+ else
+ M.dropItemToGround(W, TRUE)
+ var/hat = new /obj/item/clothing/head/hattip()
+ M.equip_to_slot(hat, SLOT_HEAD, 1, 1)
+
+
+/datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M)
+ if(!istype(M.head, /obj/item/clothing/head/hattip))
+ return ..()
+ var/hatArmor = 0
+ if(!overdosed)
+ hatArmor = (purity/10)
+ else
+ hatArmor = - (purity/10)
+ if(hatArmor > 90)
+ return ..()
+ var/obj/item/W = M.head
+ W.armor = W.armor.modifyAllRatings(hatArmor)
+ ..()
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// FURRANIUM
+///////////////////////////////////////////////////////////////////////////////////////////////////
+//OwO whats this?
+//Makes you nya and awoo
+//At a certain amount of time in your system it gives you a fluffy tongue, if pure enough, it's permanent.
+
+/datum/reagent/fermi/furranium
+ name = "Furranium"
+ id = "furranium"
+ description = "OwO whats this?"
+ color = "#f9b9bc" // rgb: , 0, 255
+ taste_description = "dewicious degenyewacy"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ inverse_chem_val = 0
+ var/obj/item/organ/tongue/nT
+ chemical_flags = REAGENT_DONOTSPLIT
+ pH = 5
+ var/obj/item/organ/tongue/T
+ can_synth = TRUE
+
+/datum/reagent/fermi/furranium/reaction_mob(mob/living/carbon/human/M, method=INJECT, reac_volume)
+ if(method == INJECT)
+ var/turf/T = get_turf(M)
+ M.adjustOxyLoss(15)
+ M.Knockdown(50)
+ M.Stun(50)
+ M.emote("cough")
+ var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush))
+ new P(T)
+ to_chat(M, "You feel a lump form in your throat, as you suddenly cough up what seems to be a hairball?")
+ var/list/seen = viewers(8, T)
+ for(var/mob/S in seen)
+ to_chat(S, "[M] suddenly coughs up a [P.name]!")
+ var/T2 = get_random_station_turf()
+ P.throw_at(T2, 8, 1)
+ ..()
+
+/datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M)
+
+ switch(current_cycle)
+ if(1 to 9)
+ if(prob(20))
+ to_chat(M, "Your tongue feels... fluffy")
+ if(10 to 15)
+ if(prob(10))
+ to_chat(M, "You find yourself unable to supress the desire to meow!")
+ M.emote("nya")
+ if(prob(10))
+ to_chat(M, "You find yourself unable to supress the desire to howl!")
+ M.emote("awoo")
+ if(prob(20))
+ var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers
+ for(var/victim in seen)
+ if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim)))
+ seen = seen - victim
+ if(LAZYLEN(seen))
+ to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]")
+ if(16)
+ T = M.getorganslot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/tongue/nT = new /obj/item/organ/tongue/fluffy
+ T.Remove(M)
+ nT.Insert(M)
+ T.moveToNullspace()//To valhalla
+ to_chat(M, "Your tongue feels... weally fwuffy!!")
+ if(17 to INFINITY)
+ if(prob(5))
+ to_chat(M, "You find yourself unable to supress the desire to meow!")
+ M.emote("nya")
+ if(prob(5))
+ to_chat(M, "You find yourself unable to supress the desire to howl!")
+ M.emote("awoo")
+ if(prob(5))
+ var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers
+ for(var/victim in seen)
+ if((istype(victim, /mob/living/simple_animal/pet/)) || (victim == M) || (!isliving(victim)))
+ seen = seen - victim
+ if(LAZYLEN(seen))
+ to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]")
+ ..()
+
+/datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M)
+ if(purity < 1)//Only permanent if you're a good chemist.
+ nT = M.getorganslot(ORGAN_SLOT_TONGUE)
+ nT.Remove(M)
+ qdel(nT)
+ T.Insert(M)
+ to_chat(M, "You feel your tongue.... unfluffify...?")
+ M.say("Pleh!")
+ else
+ log_game("FERMICHEM: [M] ckey: [M.key]'s tongue has been made permanent")
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+//Nanite removal
+//Writen by Trilby!! Embellsished a little by me.
+
+/datum/reagent/fermi/nanite_b_gone
+ name = "Nanite bane"
+ id = "nanite_b_gone"
+ description = "A stablised EMP that is highly volatile, shocking small nano machines that will kill them off at a rapid rate in a patient's system."
+ color = "#708f8f"
+ overdose_threshold = 15
+ impure_chem = "nanite_b_goneTox" //If you make an inpure chem, it stalls growth
+ inverse_chem_val = 0.25
+ inverse_chem = "nanite_b_goneTox" //At really impure vols, it just becomes 100% inverse
+ taste_description = "what can only be described as licking a battery."
+ pH = 9
+ can_synth = FALSE
+
+/datum/reagent/fermi/nanite_b_gone/on_mob_life(mob/living/carbon/C)
+ //var/component/nanites/N = M.GetComponent(/datum/component/nanites)
+ GET_COMPONENT_FROM(N, /datum/component/nanites, C)
+ if(isnull(N))
+ return ..()
+ N.nanite_volume = -purity//0.5 seems to be the default to me, so it'll neuter them.
+ ..()
+
+/datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C)
+ //var/component/nanites/N = M.GetComponent(/datum/component/nanites)
+ GET_COMPONENT_FROM(N, /datum/component/nanites, C)
+ if(prob(5))
+ to_chat(C, "The residual voltage from the nanites causes you to seize up!")
+ C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
+ if(prob(10))
+ //empulse((get_turf(C)), 3, 2)//So the nanites randomize
+ var/atom/T = C
+ T.emp_act(EMP_HEAVY)
+ to_chat(C, "You feel a strange tingling sensation come from your core.")
+ if(isnull(N))
+ return ..()
+ N.nanite_volume = -2
+ ..()
+
+/datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
+ O.emp_act(EMP_HEAVY)
+
+/datum/reagent/fermi/nanite_b_goneTox
+ name = "Electromagnetic crystals"
+ id = "nanite_b_goneTox"
+ description = "Causes items upon the patient to sometimes short out, as well as causing a shock in the patient, if the residual charge between the crystals builds up to sufficient quantities"
+ metabolization_rate = 0.5
+ chemical_flags = REAGENT_INVISIBLE
+
+//Increases shock events.
+/datum/reagent/fermi/nanite_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good)
+ if(prob(15))
+ to_chat(C, "The residual voltage in your system causes you to seize up!")
+ C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
+ if(prob(50))
+ var/atom/T = C
+ T.emp_act(EMP_HEAVY)
+ to_chat(C, "You feel your hair stand on end as you glow brightly for a moment!")
+ ..()
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// MISC FERMICHEM CHEMS FOR SPECIFIC INTERACTIONS ONLY
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/reagent/fermi/fermiAcid
+ name = "Acid vapour"
+ id = "fermiAcid"
+ description = "Someone didn't do like an otter, and add acid to water."
+ taste_description = "acid burns, ow"
+ color = "#FFFFFF"
+ pH = 0
+ can_synth = FALSE
+
+/datum/reagent/fermi/fermiAcid/reaction_mob(mob/living/carbon/C, method)
+ var/target = C.get_bodypart(BODY_ZONE_CHEST)
+ var/acidstr
+ if(!C.reagents.pH || C.reagents.pH >5)
+ acidstr = 3
+ else
+ acidstr = ((5-C.reagents.pH)*2) //runtime - null.pH ?
+ C.adjustFireLoss(acidstr/2, 0)
+ if((method==VAPOR) && (!C.wear_mask))
+ if(prob(20))
+ to_chat(C, "You can feel your lungs burning!")
+ C.adjustOrganLoss(ORGAN_SLOT_LUNGS, acidstr*2)
+ C.apply_damage(acidstr/5, BURN, target)
+ C.acid_act(acidstr, volume)
+ ..()
+
+/datum/reagent/fermi/fermiAcid/reaction_obj(obj/O, reac_volume)
+ if(ismob(O.loc)) //handled in human acid_act()
+ return
+ if((holder.pH > 5) || (volume < 0.1)) //Shouldn't happen, but just in case
+ return
+ reac_volume = round(volume,0.1)
+ var/acidstr = (5-holder.pH)*2 //(max is 10)
+ O.acid_act(acidstr, volume)
+ ..()
+
+/datum/reagent/fermi/fermiAcid/reaction_turf(turf/T, reac_volume)
+ if (!istype(T))
+ return
+ reac_volume = round(volume,0.1)
+ var/acidstr = (5-holder.pH)
+ T.acid_act(acidstr, volume)
+ ..()
+
+/datum/reagent/fermi/fermiTest
+ name = "Fermis Test Reagent"
+ id = "fermiTest"
+ description = "You should be really careful with this...! Also, how did you get this?"
+ chemical_flags = REAGENT_FORCEONNEW
+ can_synth = FALSE
+
+/datum/reagent/fermi/fermiTest/on_new(datum/reagents/holder)
+ ..()
+ if(LAZYLEN(holder.reagent_list) == 1)
+ return
+ else
+ holder.remove_reagent("fermiTest", volume)//Avoiding recurrsion
+ var/location = get_turf(holder.my_atom)
+ if(purity < 0.34 || purity == 1)
+ var/datum/effect_system/foam_spread/s = new()
+ s.set_up(volume*2, location, holder)
+ s.start()
+ if((purity < 0.67 && purity >= 0.34)|| purity == 1)
+ var/datum/effect_system/smoke_spread/chem/s = new()
+ s.set_up(holder, volume*2, location)
+ s.start()
+ if(purity >= 0.67)
+ for (var/datum/reagent/reagent in holder.reagent_list)
+ if (istype(reagent, /datum/reagent/fermi))
+ var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.id]
+ Ferm.FermiExplode(src, holder.my_atom, holder, holder.total_volume, holder.chem_temp, holder.pH)
+ else
+ var/datum/chemical_reaction/Ferm = GLOB.chemical_reagents_list[reagent.id]
+ Ferm.on_reaction(holder, reagent.volume)
+ for(var/mob/M in viewers(8, location))
+ to_chat(M, "The solution reacts dramatically, with a meow!")
+ playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1)
+ holder.clear_reagents()
+
+/datum/reagent/fermi/acidic_buffer
+ name = "Acidic buffer"
+ id = "acidic_buffer"
+ description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another."
+ color = "#fbc314"
+ pH = 0
+ can_synth = TRUE
+
+//Consumes self on addition and shifts pH
+/datum/reagent/fermi/acidic_buffer/on_new(datapH)
+ if(holder.has_reagent("stabilizing_agent"))
+ return ..()
+ data = datapH
+ if(LAZYLEN(holder.reagent_list) == 1)
+ return ..()
+ holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume))
+ var/list/seen = viewers(5, get_turf(holder))
+ for(var/mob/M in seen)
+ to_chat(M, "The beaker fizzes as the pH changes!")
+ playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1)
+ holder.remove_reagent(id, volume, ignore_pH = TRUE)
+ ..()
+
+/datum/reagent/fermi/basic_buffer
+ name = "Basic buffer"
+ id = "basic_buffer"
+ description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another."
+ color = "#3853a4"
+ pH = 14
+ can_synth = TRUE
+
+/datum/reagent/fermi/basic_buffer/on_new(datapH)
+ if(holder.has_reagent("stabilizing_agent"))
+ return ..()
+ data = datapH
+ if(LAZYLEN(holder.reagent_list) == 1)
+ return ..()
+ holder.pH = ((holder.pH * holder.total_volume)+(pH * (volume)))/(holder.total_volume + (volume))
+ var/list/seen = viewers(5, get_turf(holder))
+ for(var/mob/M in seen)
+ to_chat(M, "The beaker froths as the pH changes!")
+ playsound(get_turf(holder.my_atom), 'sound/FermiChem/bufferadd.ogg', 50, 1)
+ holder.remove_reagent(id, volume, ignore_pH = TRUE)
+ ..()
+
+//Turns you into a cute catto while it's in your system.
+//If you manage to gamble perfectly, makes you have cat ears after you transform back. But really, you shouldn't end up with that with how random it is.
+/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem?
+ name = "secretcatchem" //an attempt at hiding it
+ id = "secretcatchem"
+ description = "An illegal and hidden chem that turns people into cats. It's said that it's so rare and unstable that having it means you've been blessed."
+ taste_description = "hairballs and cream"
+ color = "#ffc224"
+ var/catshift = FALSE
+ var/mob/living/simple_animal/pet/cat/custom_cat/catto = null
+ can_synth = FALSE
+
+/datum/reagent/fermi/secretcatchem/New()
+ name = "Catbalti[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]"//rename
+
+/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H)
+ . = ..()
+ if(purity >= 0.8)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there.
+ //exception(al) handler:
+ H.dna.features["ears"] = "Cat"
+ H.dna.features["mam_ears"] = "Cat"
+ H.verb_say = "mewls"
+ catshift = TRUE
+ playsound(get_turf(H), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
+ to_chat(H, "You suddenly turn into a cat!")
+ catto = new(get_turf(H.loc))
+ H.mind.transfer_to(catto)
+ catto.name = H.name
+ catto.desc = "A cute catto! They remind you of [H] somehow."
+ catto.color = "#[H.dna.features["mcolor"]]"
+ catto.pseudo_death = TRUE
+ H.forceMove(catto)
+ log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.")
+ SSblackbox.record_feedback("tally", "fermi_chem", 1, "cats")
+ //Just to deal with rascally ghosts
+ //ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work
+ //catto.health = 1000 //To simulate fake death, while preventing ghosts escaping.
+
+/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H)
+ if(catto.health <= 0) //So the dead can't ghost
+ if(prob(10))
+ to_chat(H, "You feel your body start to slowly shift back from it's dead form.")
+ else if(prob(5))
+ playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
+ catto.say("lets out a meowrowr!*")
+ ..()
+
+/datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H)
+ var/words = "Your body shifts back to normal."
+ H.forceMove(catto.loc)
+ catto.mind.transfer_to(H)
+ if(catshift == TRUE)
+ words += " ...But wait, are those cat ears?"
+ H.say("*wag")//force update sprites.
+ to_chat(H, "[words]")
+ qdel(catto)
+ log_game("FERMICHEM: [H] ckey: [H.key] has returned to normal")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
new file mode 100644
index 0000000000..4949cc6ecf
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -0,0 +1,151 @@
+/datum/reagent/fermi/yamerol
+ name = "Yamerol"
+ id = "yamerol"
+ description = "For when you've trouble speaking or breathing, just yell YAMEROL! A chem that helps soothe any congestion problems and at high concentrations restores damaged lungs and tongues!"
+ taste_description = "a weird, syrupy flavour, yamero"
+ color = "#68e83a"
+ pH = 8.6
+ overdose_threshold = 35
+ impure_chem = "yamerol_tox"
+ inverse_chem_val = 0.4
+ inverse_chem = "yamerol_tox"
+ can_synth = TRUE
+
+/datum/reagent/fermi/yamerol/on_mob_life(mob/living/carbon/C)
+ var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
+
+ if(T)
+ T.applyOrganDamage(-2)
+ if(L)
+ C.adjustOrganLoss(ORGAN_SLOT_LUNGS, -5)
+ C.adjustOxyLoss(-2)
+ else
+ C.adjustOxyLoss(-10)
+
+ if(T)
+ if(T.name == "fluffy tongue")
+ var/obj/item/organ/tongue/nT
+ if(C.dna && C.dna.species && C.dna.species.mutanttongue)
+ nT = new C.dna.species.mutanttongue()
+ else
+ nT = new()
+ T.Remove(C)
+ qdel(T)
+ nT.Insert(C)
+ to_chat(C, "You feel your tongue.... unfluffify...?")
+ holder.remove_reagent(src.id, "10")
+ ..()
+
+/datum/reagent/fermi/yamerol/overdose_process(mob/living/carbon/C)
+ var/obj/item/organ/tongue/oT = C.getorganslot(ORGAN_SLOT_TONGUE)
+ if(current_cycle == 1)
+ to_chat(C, "You feel the Yamerol sooth your tongue and lungs.")
+ if(current_cycle > 10)
+ if(!C.getorganslot(ORGAN_SLOT_TONGUE))
+ var/obj/item/organ/tongue/T
+ if(C.dna && C.dna.species && C.dna.species.mutanttongue)
+ T = new C.dna.species.mutanttongue()
+ else
+ T = new()
+ T.Insert(C)
+ to_chat(C, "You feel your tongue reform in your mouth.")
+ holder.remove_reagent(src.id, "10")
+ else
+ if((oT.name == "fluffy tongue") && (purity == 1))
+ var/obj/item/organ/tongue/T
+ if(C.dna && C.dna.species && C.dna.species.mutanttongue)
+ T = new C.dna.species.mutanttongue()
+ else
+ T = new()
+ oT.Remove(C)
+ qdel(oT)
+ T.Insert(C)
+ to_chat(C, "You feel your tongue.... unfluffify...?")
+ holder.remove_reagent(src.id, "10")
+
+ if(!C.getorganslot(ORGAN_SLOT_LUNGS))
+ var/obj/item/organ/lungs/yamerol/L = new()
+ L.Insert(C)
+ to_chat(C, "You feel the yamerol merge in your chest.")
+ holder.remove_reagent(src.id, "10")
+
+ C.adjustOxyLoss(-3)
+ ..()
+
+/datum/reagent/impure/yamerol_tox
+ name = "Yamer oh no"
+ id = "yamerol_tox"
+ description = "A dangerous, cloying toxin that stucks to a patient’s respiratory system, damaging their tongue, lungs and causing suffocation."
+ taste_description = "a weird, syrupy flavour, yamero"
+ color = "#68e83a"
+ pH = 8.6
+
+/datum/reagent/impure/yamerol_tox/on_mob_life(mob/living/carbon/C)
+ var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
+ var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
+
+ if(T)
+ T.applyOrganDamage(1)
+ if(L)
+ C.adjustOrganLoss(ORGAN_SLOT_LUNGS, 4)
+ C.adjustOxyLoss(3)
+ else
+ C.adjustOxyLoss(10)
+ ..()
+
+
+/datum/reagent/synthtissue
+ name = "Synthtissue"
+ id = "synthtissue"
+ description = "Synthetic tissue used for grafting onto damaged organs during surgery, or for treating limb damage. Has a very tight growth window between 305-320, any higher and the temperature will cause the cells to die. Additionally, growth time is considerably long, so chemists are encouraged to leave beakers with said reaction ongoing, while they tend to their other duties."
+ pH = 7.6
+ metabolization_rate = 0.05 //Give them time to graft
+ data = list("grown_volume" = 0, "injected_vol" = 0)
+
+/datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
+ if(iscarbon(M))
+ var/target = M.zone_selected
+ if (M.stat == DEAD)
+ show_message = 0
+ if(method in list(PATCH, TOUCH))
+ M.apply_damage(reac_volume*-1.5, BRUTE, target)
+ M.apply_damage(reac_volume*-1.5, BURN, target)
+ if(show_message)
+ to_chat(M, "You feel your [target] heal! It stings like hell!")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ if(method==INJECT)
+ data["injected_vol"] = reac_volume
+ ..()
+
+/datum/reagent/synthtissue/on_mob_life(mob/living/carbon/C)
+ if(!iscarbon(C))
+ return ..()
+ if(data["injected_vol"] > 14)
+ if(data["grown_volume"] > 175) //I don't think this is even possible, but damn to I want to see if someone can (bare in mind it takes 2s to grow 0.05u)
+ if(volume >= 14)
+ if(C.regenerate_organs(only_one = TRUE))
+ C.reagents.remove_reagent(id, 15)
+ to_chat(C, "You feel something reform inside of you!")
+
+ data["injected_vol"] -= metabolization_rate
+ ..()
+
+/datum/reagent/synthtissue/on_merge(passed_data)
+ if(!passed_data)
+ return ..()
+ if(passed_data["grown_volume"] > data["grown_volume"])
+ data["grown_volume"] = passed_data["grown_volume"]
+ if(iscarbon(holder.my_atom))
+ data["injected_vol"] = data["injected_vol"] + passed_data["injected_vol"]
+ passed_data["injected_vol"] = 0
+ ..()
+
+/datum/reagent/synthtissue/on_new(passed_data)
+ if(!passed_data)
+ return ..()
+ if(passed_data["grown_volume"] > data["grown_volume"])
+ data["grown_volume"] = passed_data["grown_volume"]
+ ..()
+
+//NEEDS ON_MOB_DEAD()
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py b/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py
new file mode 100644
index 0000000000..9ffc057743
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/FermiCalc.Py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Fri May 17 05:12:17 2019
+
+@author: Fermi
+"""
+
+import numpy
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
new file mode 100644
index 0000000000..47f71d1acf
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -0,0 +1,576 @@
+/datum/chemical_reaction/fermi
+ mix_sound = 'sound/effects/bubbles.ogg'
+
+//Called for every reaction step
+/datum/chemical_reaction/proc/FermiCreate(datum/reagents/holder, added_volume, added_purity)
+ return
+
+//Called when reaction STOP_PROCESSING
+/datum/chemical_reaction/proc/FermiFinish(datum/reagents/holder, var/atom/my_atom, reactVol)
+ if(clear_conversion == REACTION_CLEAR_IMPURE | REACTION_CLEAR_INVERSE)
+ for(var/id in results)
+ var/datum/reagent/R = my_atom.reagents.has_reagent("[id]")
+ if(R.purity == 1)
+ continue
+
+ var/cached_volume = R.volume
+ if(clear_conversion == REACTION_CLEAR_INVERSE && R.inverse_chem)
+ if(R.inverse_chem_val > R.purity)
+ my_atom.reagents.remove_reagent(R.id, cached_volume, FALSE)
+ my_atom.reagents.add_reagent(R.inverse_chem, cached_volume, FALSE, other_purity = 1)
+
+ else if (clear_conversion == REACTION_CLEAR_IMPURE && R.impure_chem)
+ var/impureVol = cached_volume * (1 - R.purity)
+ my_atom.reagents.remove_reagent(R.id, (impureVol), FALSE)
+ my_atom.reagents.add_reagent(R.impure_chem, impureVol, FALSE, other_purity = 1)
+ R.cached_purity = R.purity
+ R.purity = 1
+ return
+
+//Called when temperature is above a certain threshold, or if purity is too low.
+/datum/chemical_reaction/proc/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH, Exploding = FALSE)
+ if (Exploding == TRUE)
+ return
+
+ if(!pH)//Dunno how things got here without a pH, but just in case
+ pH = 7
+ var/ImpureTot = 0
+ var/turf/T = get_turf(my_atom)
+
+ if(temp>500)//if hot, start a fire
+ switch(temp)
+ if (500 to 750)
+ for(var/turf/turf in range(1,T))
+ new /obj/effect/hotspot(turf)
+ volume*=1.1
+
+ if (751 to 1100)
+ for(var/turf/turf in range(2,T))
+ new /obj/effect/hotspot(turf)
+ volume*=1.2
+
+ if (1101 to 1500) //If you're crafty
+ for(var/turf/turf in range(3,T))
+ new /obj/effect/hotspot(turf)
+ volume*=1.3
+
+ if (1501 to 2500) //requested
+ for(var/turf/turf in range(4,T))
+ new /obj/effect/hotspot(turf)
+ volume*=1.4
+
+ if (2501 to 5000)
+ for(var/turf/turf in range(5,T))
+ new /obj/effect/hotspot(turf)
+ volume*=1.5
+
+ if (5001 to INFINITY)
+ for(var/turf/turf in range(6,T))
+ new /obj/effect/hotspot(turf)
+ volume*=1.6
+
+
+ message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].")
+ log_game("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].")
+ var/datum/reagents/R = new/datum/reagents(3000)//Hey, just in case.
+ var/datum/effect_system/smoke_spread/chem/s = new()
+ R.my_atom = my_atom //Give the gas a fingerprint
+
+ for (var/datum/reagent/reagent in R0.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding
+ R.add_reagent(reagent.id, reagent.volume/3) //Seems fine? I think I fixed the infinite explosion bug.
+
+ if (reagent.purity < 0.6)
+ ImpureTot = (ImpureTot + (1-reagent.purity)) / 2
+
+ if(pH < 4) //if acidic, make acid spray
+ R.add_reagent("fermiAcid", (volume/3))
+ if(R.reagent_list)
+ s.set_up(R, (volume/5), my_atom)
+ s.start()
+
+ if (pH > 10) //if alkaline, small explosion.
+ var/datum/effect_system/reagents_explosion/e = new()
+ e.set_up(round((volume/28)*(pH-9)), T, 0, 0)
+ e.start()
+
+ if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less)
+ ImpureTot *= volume
+ var/empVol = CLAMP (volume/10, 0, 15)
+ empulse(T, empVol, ImpureTot/10, 1)
+
+ my_atom.reagents.clear_reagents() //just in case
+ return
+
+/datum/chemical_reaction/fermi/eigenstate
+ name = "Eigenstasium"
+ id = "eigenstate"
+ results = list("eigenstate" = 1)
+ required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1)
+ mix_message = "the reaction zaps suddenly!"
+ //FermiChem vars:
+ OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions
+ OptimalTempMax = 600 // Upper end for above
+ ExplodeTemp = 650 //Temperature at which reaction explodes
+ OptimalpHMin = 7 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
+ OptimalpHMax = 9 // Higest value for above
+ ReactpHLim = 5 // How far out pH wil react, giving impurity place (Exponential phase)
+ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
+ CurveSharpT = 1.5 // How sharp the temperature exponential curve is (to the power of value)
+ CurveSharppH = 3 // How sharp the pH exponential curve is (to the power of value)
+ ThermicConstant = 10 //Temperature change per 1u produced
+ HIonRelease = -0.02 //pH change per 1u reaction
+ RateUpLim = 3 //Optimal/max rate possible if all conditions are perfect
+ FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
+ FermiExplode = FALSE //If the chemical explodes in a special way
+ PurityMin = 0.4 //The minimum purity something has to be above, otherwise it explodes.
+
+/datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does.
+ var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
+ if(!E)
+ return
+ var/turf/open/location = get_turf(my_atom)
+ if(location)
+ E.location_created = location
+ E.data.["location_created"] = location
+
+
+//serum
+/datum/chemical_reaction/fermi/SDGF
+ name = "Synthetic-derived growth factor"
+ id = "SDGF"
+ results = list("SDGF" = 3)
+ required_reagents = list("stable_plasma" = 1.5, "clonexadone" = 1.5, "uranium" = 1.5, "synthflesh" = 1.5)
+ mix_message = "the reaction gives off a blorble!"
+ required_temp = 1
+ //FermiChem vars:
+ OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions
+ OptimalTempMax = 630 // Upper end for above
+ ExplodeTemp = 635 // Temperature at which reaction explodes
+ OptimalpHMin = 3 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
+ OptimalpHMax = 3.5 // Higest value for above
+ ReactpHLim = 2 // How far out pH wil react, giving impurity place (Exponential phase)
+ CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
+ CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
+ CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
+ ThermicConstant = -10 // Temperature change per 1u produced
+ HIonRelease = 0.02 // pH change per 1u reaction (inverse for some reason)
+ RateUpLim = 1 // Optimal/max rate possible if all conditions are perfect
+ FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics
+ FermiExplode = TRUE // If the chemical explodes in a special way
+ PurityMin = 0.2
+
+/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!
+ var/turf/T = get_turf(my_atom)
+ var/amount_to_spawn = round((volume/100), 1)
+ if(amount_to_spawn <= 0)
+ amount_to_spawn = 1
+ for(var/i in 1 to amount_to_spawn)
+ var/mob/living/simple_animal/slime/S = new(T,"green")
+ S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ S.name = "Living teratoma"
+ S.real_name = "Living teratoma"
+ S.rabid = 1//Make them an angery boi
+ S.color = "#810010"
+ my_atom.reagents.clear_reagents()
+ var/list/seen = viewers(8, get_turf(my_atom))
+ for(var/mob/M in seen)
+ to_chat(M, "The cells clump up into a horrifying tumour!")
+
+/datum/chemical_reaction/fermi/breast_enlarger
+ name = "Sucubus milk"
+ id = "breast_enlarger"
+ results = list("breast_enlarger" = 8)
+ required_reagents = list("salglu_solution" = 1, "milk" = 1, "synthflesh" = 2, "silicon" = 3, "aphro" = 3)
+ mix_message = "the reaction gives off a mist of milk."
+ //FermiChem vars:
+ OptimalTempMin = 200
+ OptimalTempMax = 800
+ ExplodeTemp = 900
+ OptimalpHMin = 6
+ OptimalpHMax = 10
+ ReactpHLim = 3
+ CatalystFact = 0
+ CurveSharpT = 2
+ CurveSharppH = 1
+ ThermicConstant = 1
+ HIonRelease = -0.1
+ RateUpLim = 5
+ FermiChem = TRUE
+ FermiExplode = TRUE
+ PurityMin = 0.1
+
+/datum/chemical_reaction/fermi/breast_enlarger/FermiFinish(datum/reagents/holder, var/atom/my_atom)
+ var/datum/reagent/fermi/breast_enlarger/BE = locate(/datum/reagent/fermi/breast_enlarger) in my_atom.reagents.reagent_list
+ var/cached_volume = BE.volume
+ if(BE.purity < 0.35)
+ holder.remove_reagent(src.id, cached_volume)
+ holder.add_reagent("BEsmaller", cached_volume)
+
+
+/datum/chemical_reaction/fermi/breast_enlarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
+ var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(get_turf(my_atom))
+ var/list/seen = viewers(8, get_turf(my_atom))
+ for(var/mob/M in seen)
+ to_chat(M, "The reaction suddenly condenses, creating a pair of breasts!")
+ var/datum/reagent/fermi/breast_enlarger/BE = locate(/datum/reagent/fermi/breast_enlarger) in my_atom.reagents.reagent_list
+ B.size = ((BE.volume * BE.purity) / 10) //half as effective.
+ my_atom.reagents.clear_reagents()
+
+/datum/chemical_reaction/fermi/penis_enlarger
+ name = "Incubus draft"
+ id = "penis_enlarger"
+ results = list("penis_enlarger" = 8)
+ required_reagents = list("blood" = 5, "synthflesh" = 2, "carbon" = 2, "aphro" = 2, "salglu_solution" = 1)
+ mix_message = "the reaction gives off a spicy mist."
+ //FermiChem vars:
+ OptimalTempMin = 200
+ OptimalTempMax = 800
+ ExplodeTemp = 900
+ OptimalpHMin = 2
+ OptimalpHMax = 6
+ ReactpHLim = 3
+ CatalystFact = 0
+ CurveSharpT = 2
+ CurveSharppH = 1
+ ThermicConstant = 1
+ HIonRelease = 0.1
+ RateUpLim = 5
+ FermiChem = TRUE
+ FermiExplode = TRUE
+ PurityMin = 0.1
+
+/datum/chemical_reaction/fermi/penis_enlarger/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
+ var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(get_turf(my_atom))
+ var/list/seen = viewers(8, get_turf(my_atom))
+ for(var/mob/M in seen)
+ to_chat(M, "The reaction suddenly condenses, creating a penis!")
+ var/datum/reagent/fermi/penis_enlarger/PE = locate(/datum/reagent/fermi/penis_enlarger) in my_atom.reagents.reagent_list
+ P.length = ((PE.volume * PE.purity) / 10)//half as effective.
+ my_atom.reagents.clear_reagents()
+
+/datum/chemical_reaction/fermi/penis_enlarger/FermiFinish(datum/reagents/holder, var/atom/my_atom)
+ var/datum/reagent/fermi/penis_enlarger/PE = locate(/datum/reagent/fermi/penis_enlarger) in my_atom.reagents.reagent_list
+ var/cached_volume = PE.volume
+ if(PE.purity < 0.35)
+ holder.remove_reagent(src.id, cached_volume)
+ holder.add_reagent("PEsmaller", cached_volume)
+
+/datum/chemical_reaction/fermi/astral
+ name = "Astrogen"
+ id = "astral"
+ results = list("astral" = 5)
+ required_reagents = list("eigenstate" = 1, "plasma" = 3, "synaptizine" = 1, "aluminium" = 5)
+ //FermiChem vars:
+ OptimalTempMin = 700
+ OptimalTempMax = 800
+ ExplodeTemp = 1150
+ OptimalpHMin = 10
+ OptimalpHMax = 13
+ ReactpHLim = 2
+ CatalystFact = 0
+ CurveSharpT = 1
+ CurveSharppH = 1
+ ThermicConstant = 25
+ HIonRelease = 0.02
+ RateUpLim = 15
+ FermiChem = TRUE
+ FermiExplode = TRUE
+ PurityMin = 0.25
+
+
+/datum/chemical_reaction/fermi/enthrall/ //check this
+ name = "MKUltra"
+ id = "enthrall"
+ results = list("enthrall" = 5)
+ //required_reagents = list("iron" = 1, "iodine" = 1) Test vars
+ //required_reagents = list("cocoa" = 1, "astral" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1)
+ required_reagents = list("cocoa" = 1, "bluespace" = 1, "mindbreaker" = 1, "psicodine" = 1, "happiness" = 1) //TEMPORARY UNTIL HEADMINS GIVE THE OKAY FOR MK USE.
+ required_catalysts = list("blood" = 1)
+ mix_message = "the reaction gives off a burgundy plume of smoke!"
+ //FermiChem vars:
+ OptimalTempMin = 780
+ OptimalTempMax = 820
+ ExplodeTemp = 840
+ OptimalpHMin = 12
+ OptimalpHMax = 13
+ ReactpHLim = 2
+ //CatalystFact = 0
+ CurveSharpT = 0.5
+ CurveSharppH = 4
+ ThermicConstant = 15
+ HIonRelease = 0.1
+ RateUpLim = 1
+ FermiChem = TRUE
+ FermiExplode = TRUE
+ PurityMin = 0.2
+
+/datum/chemical_reaction/fermi/enthrall/FermiFinish(datum/reagents/holder, var/atom/my_atom)
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in my_atom.reagents.reagent_list
+ var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list
+ if(!B)
+ return
+ if(!B.data)
+ var/list/seen = viewers(5, get_turf(my_atom))
+ for(var/mob/M in seen)
+ to_chat(M, "The reaction splutters and fails to react properly.") //Just in case
+ E.purity = 0
+ if (B.data.["gender"] == "female")
+ E.data.["creatorGender"] = "Mistress"
+ E.creatorGender = "Mistress"
+ else
+ E.data.["creatorGender"] = "Master"
+ E.creatorGender = "Master"
+ E.data["creatorName"] = B.data.["real_name"]
+ E.creatorName = B.data.["real_name"]
+ E.data.["creatorID"] = B.data.["ckey"]
+ E.creatorID = B.data.["ckey"]
+
+//So slimes can play too.
+/datum/chemical_reaction/fermi/enthrall/slime
+ required_catalysts = list("slimejelly" = 1)
+
+/datum/chemical_reaction/fermi/enthrall/slime/FermiFinish(datum/reagents/holder, var/atom/my_atom)
+ var/datum/reagent/toxin/slimejelly/B = locate(/datum/reagent/toxin/slimejelly) in my_atom.reagents.reagent_list//The one line change.
+ var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in my_atom.reagents.reagent_list
+ if(!B.data)
+ var/list/seen = viewers(5, get_turf(my_atom))
+ for(var/mob/M in seen)
+ to_chat(M, "The reaction splutters and fails to react.") //Just in case
+ E.purity = 0
+ if (B.data.["gender"] == "female")
+ E.data.["creatorGender"] = "Mistress"
+ E.creatorGender = "Mistress"
+ else
+ E.data.["creatorGender"] = "Master"
+ E.creatorGender = "Master"
+ E.data["creatorName"] = B.data.["real_name"]
+ E.creatorName = B.data.["real_name"]
+ E.data.["creatorID"] = B.data.["ckey"]
+ E.creatorID = B.data.["ckey"]
+
+/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
+ var/turf/T = get_turf(my_atom)
+ var/datum/reagents/R = new/datum/reagents(1000)
+ var/datum/effect_system/smoke_spread/chem/s = new()
+ R.add_reagent("enthrallExplo", volume)
+ s.set_up(R, volume/2, T)
+ s.start()
+ my_atom.reagents.clear_reagents()
+
+/datum/chemical_reaction/fermi/hatmium // done
+ name = "Hat growth serum"
+ id = "hatmium"
+ results = list("hatmium" = 5)
+ required_reagents = list("ethanol" = 1, "nutriment" = 3, "cooking_oil" = 2, "iron" = 1, "gold" = 3)
+ //mix_message = ""
+ //FermiChem vars:
+ OptimalTempMin = 500
+ OptimalTempMax = 700
+ ExplodeTemp = 750
+ OptimalpHMin = 2
+ OptimalpHMax = 5
+ ReactpHLim = 3
+ //CatalystFact = 0 //To do 1
+ CurveSharpT = 8
+ CurveSharppH = 0.5
+ ThermicConstant = -2
+ HIonRelease = -0.1
+ RateUpLim = 2
+ FermiChem = TRUE
+ FermiExplode = TRUE
+ PurityMin = 0.5
+
+/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH)
+ var/amount_to_spawn = round((volume/100), 1)
+ if(amount_to_spawn <= 0)
+ amount_to_spawn = 1
+ for(var/i in 1 to amount_to_spawn)
+ var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
+ hat.animate_atom_living()
+ var/list/seen = viewers(8, get_turf(my_atom))
+ for(var/mob/M in seen)
+ to_chat(M, "The [my_atom] makes an off sounding pop, as a hat suddenly climbs out of it!")
+ my_atom.reagents.clear_reagents()
+
+/datum/chemical_reaction/fermi/furranium
+ name = "Furranium"
+ id = "furranium"
+ results = list("furranium" = 5)
+ required_reagents = list("aphro" = 1, "moonsugar" = 1, "silver" = 2, "salglu_solution" = 1)
+ mix_message = "You think you can hear a howl come from the beaker."
+ //FermiChem vars:
+ OptimalTempMin = 350
+ OptimalTempMax = 600
+ ExplodeTemp = 700
+ OptimalpHMin = 8
+ OptimalpHMax = 10
+ ReactpHLim = 2
+ //CatalystFact = 0 //To do 1
+ CurveSharpT = 2
+ CurveSharppH = 0.5
+ ThermicConstant = -10
+ HIonRelease = -0.1
+ RateUpLim = 2
+ FermiChem = TRUE
+ PurityMin = 0.3
+
+/datum/chemical_reaction/fermi/furranium/organic
+ required_reagents = list("aphro" = 1, "catnip" = 1, "silver" = 2, "salglu_solution" = 1)
+
+//FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10.
+//There's a weird rounding error or something ugh.
+
+//Nano-b-gone
+/datum/chemical_reaction/fermi/nanite_b_gone//done test
+ name = "Naninte bain"
+ id = "nanite_b_gone"
+ results = list("nanite_b_gone" = 4)
+ required_reagents = list("synthflesh" = 1, "uranium" = 1, "iron" = 1, "salglu_solution" = 1)
+ mix_message = "the reaction gurgles, encapsulating the reagents in flesh before the emp can be set off."
+ required_temp = 450//To force fermireactions before EMP.
+ //FermiChem vars:
+ OptimalTempMin = 500
+ OptimalTempMax = 600
+ ExplodeTemp = 700
+ OptimalpHMin = 6
+ OptimalpHMax = 6.25
+ ReactpHLim = 3
+ //CatalystFact = 0 //To do 1
+ CurveSharpT = 0
+ CurveSharppH = 1
+ ThermicConstant = 5
+ HIonRelease = 0.01
+ RateUpLim = 1
+ FermiChem = TRUE
+
+/datum/chemical_reaction/fermi/acidic_buffer//done test
+ name = "Acetic acid buffer"
+ id = "acidic_buffer"
+ results = list("acidic_buffer" = 10) //acetic acid
+ required_reagents = list("salglu_solution" = 1, "ethanol" = 3, "oxygen" = 3, "water" = 3)
+ //FermiChem vars:
+ OptimalTempMin = 250
+ OptimalTempMax = 500
+ ExplodeTemp = 9999 //check to see overflow doesn't happen!
+ OptimalpHMin = 0
+ OptimalpHMax = 14
+ ReactpHLim = 0
+ //CatalystFact = 0 //To do 1
+ CurveSharpT = 4
+ CurveSharppH = 0
+ ThermicConstant = 0
+ HIonRelease = -0.01
+ RateUpLim = 20
+ FermiChem = TRUE
+
+
+/datum/chemical_reaction/fermi/acidic_buffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this
+ if(!locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list)
+ return
+ var/datum/reagent/fermi/acidic_buffer/Fa = locate(/datum/reagent/fermi/acidic_buffer) in my_atom.reagents.reagent_list
+ Fa.data = 0.1//setting it to 0 means byond thinks it's not there.
+
+/datum/chemical_reaction/fermi/basic_buffer//done test
+ name = "Ethyl Ethanoate buffer"
+ id = "basic_buffer"
+ results = list("basic_buffer" = 5)
+ required_reagents = list("lye" = 1, "ethanol" = 2, "water" = 2)
+ required_catalysts = list("sacid" = 1) //vagely acetic
+ //FermiChem vars:
+ OptimalTempMin = 250
+ OptimalTempMax = 500
+ ExplodeTemp = 9999 //check to see overflow doesn't happen!
+ OptimalpHMin = 0
+ OptimalpHMax = 14
+ ReactpHLim = 0
+ //CatalystFact = 0 //To do 1
+ CurveSharpT = 4
+ CurveSharppH = 0
+ ThermicConstant = 0
+ HIonRelease = 0.01
+ RateUpLim = 15
+ FermiChem = TRUE
+
+
+/datum/chemical_reaction/fermi/basic_buffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this
+ if(!locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list)
+ return
+ var/datum/reagent/fermi/basic_buffer/Fb = locate(/datum/reagent/fermi/basic_buffer) in my_atom.reagents.reagent_list
+ Fb.data = 14
+
+//secretcatchemcode, shh!! Of couse I hide it amongst cats. Though, I moved it with your requests.
+//I'm not trying to be sneaky, I'm trying to keep it a secret!
+//I don't know how to do hidden chems like Aurora
+//ChemReactionVars:
+/datum/chemical_reaction/fermi/secretcatchem //DONE
+ name = "secretcatchem"
+ id = "secretcatchem"
+ results = list("secretcatchem" = 5)
+ required_reagents = list("stable_plasma" = 1, "sugar" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a plushie if you don't lucky guess. It'll eat all your reagents too.
+ required_catalysts = list("SDGF" = 1)
+ required_temp = 600
+ mix_message = "the reaction gives off a meow!"
+ mix_sound = "modular_citadel/sound/voice/merowr.ogg"
+ //FermiChem vars:
+ OptimalTempMin = 650
+ OptimalpHMin = 0
+ ReactpHLim = 2
+ CurveSharpT = 0
+ CurveSharppH = 0
+ ThermicConstant = 0
+ HIonRelease = 0
+ RateUpLim = 0.1
+ FermiChem = TRUE
+ FermiExplode = FALSE
+ PurityMin = 0.2
+
+/datum/chemical_reaction/fermi/secretcatchem/New()
+ //rand doesn't seem to work with n^-e
+ OptimalTempMin += rand(-100, 100)
+ OptimalTempMax = (OptimalTempMin+rand(20, 200))
+ ExplodeTemp = (OptimalTempMax+rand(20, 200))
+ OptimalpHMin += rand(1, 10)
+ OptimalpHMax = (OptimalpHMin + rand(1, 5))
+ ReactpHLim += rand(-1.5, 2.5)
+ CurveSharpT += (rand(1, 500)/100)
+ CurveSharppH += (rand(1, 500)/100)
+ ThermicConstant += rand(-20, 20)
+ HIonRelease += (rand(-25, 25)/100)
+ RateUpLim += (rand(1, 1000)/100)
+ PurityMin += (rand(-1, 1)/10)
+ var/additions = list("aluminium", "silver", "gold", "plasma", "silicon", "uranium", "milk")
+ required_reagents[pick(additions)] = rand(1, 5)//weird
+
+/datum/chemical_reaction/fermi/secretcatchem/FermiFinish(datum/reagents/holder, var/atom/my_atom)
+ SSblackbox.record_feedback("tally", "catgirlium")//log
+
+/datum/chemical_reaction/fermi/secretcatchem/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
+ var/mob/living/simple_animal/pet/cat/custom_cat/catto = new(get_turf(my_atom))
+ var/list/seen = viewers(8, get_turf(my_atom))
+ for(var/mob/M in seen)
+ to_chat(M, "The reaction suddenly gives out a meow, condensing into a chemcat!")//meow!
+ playsound(get_turf(my_atom), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
+ catto.name = "Chemcat"
+ catto.desc = "A cute chem cat, created by a lot of compicated and confusing chemistry!"
+ catto.color = "#770000"
+ my_atom.reagents.remove_all(5)
+
+/datum/chemical_reaction/fermi/yamerol//done test
+ name = "Yamerol"
+ id = "yamerol"
+ results = list("yamerol" = 3)
+ required_reagents = list("perfluorodecalin" = 1, "salbutamol" = 1, "water" = 1)
+ //FermiChem vars:
+ OptimalTempMin = 300
+ OptimalTempMax = 500
+ ExplodeTemp = 800 //check to see overflow doesn't happen!
+ OptimalpHMin = 6.8
+ OptimalpHMax = 7.2
+ ReactpHLim = 4
+ //CatalystFact = 0 //To do 1
+ CurveSharpT = 5
+ CurveSharppH = 0.5
+ ThermicConstant = -15
+ HIonRelease = 0.1
+ RateUpLim = 2
+ FermiChem = TRUE
diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm
new file mode 100644
index 0000000000..708f1f59f8
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/objects/clothes.dm
@@ -0,0 +1,69 @@
+//Fermiclothes!
+//Clothes made from FermiChem
+
+/obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds
+ name = "Sythetic hat"
+ icon = 'icons/obj/clothing/hats.dmi'
+ icon_state = "cowboy"
+ desc = "A sythesized hat, you can't seem to take it off. And tips their hat."
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ //item_flags = NODROP //Tips their hat!
+
+/obj/item/clothing/head/hattip/attack_hand(mob/user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(is_ninja(C))
+ to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.")
+ return ..()
+
+ if(src == C.head)
+ C.emote("me",1,"tips their hat.",TRUE)
+ return
+ else
+ user.emote("me",1,"admires such a spiffy hat.",TRUE)
+ return ..()
+
+/obj/item/clothing/head/hattip/MouseDrop(atom/over_object)
+ //You sure do love tipping your hat.
+ if(usr)
+ var/mob/living/carbon/C = usr
+ if(is_ninja(C))
+ to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.")
+ return ..()
+
+ if(src == C.head)
+ C.emote("me",1,"tips their hat.",TRUE)
+ return
+ ..()
+
+/obj/item/clothing/head/hattip/equipped(mob/M, slot)
+ . = ..()
+ if (slot == SLOT_HEAD)
+ RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ else
+ UnregisterSignal(M, COMSIG_MOB_SAY)
+
+/obj/item/clothing/head/hattip/dropped(mob/M)
+ . = ..()
+ UnregisterSignal(M, COMSIG_MOB_SAY)
+
+/obj/item/clothing/head/hattip/proc/handle_speech(datum/source, mob/speech_args)
+ var/message = speech_args[SPEECH_MESSAGE]
+ var/mob/living/carbon/C = get_wearer()//user
+ var/obj/item/organ/tongue/T = C.getorganslot(ORGAN_SLOT_TONGUE)
+ if (T.name == "fluffy tongue")
+ if(prob(0.01))
+ message += "\" and tips their hat. \"swpy's sappin' my chem dispwencer uwu!!"
+ else
+ message += "\" and tips their hat. \"[pick("weehaw!", "bwoy howdy.", "dawn tuutin'.", "weww don't that beat aww.", "whoooowee, wouwd ya wook at that!", "whoooowee! makin' bwacon!", "cweam gwavy!", "yippekeeyah-heeyapeeah-kwayoh!", "mwove 'em uut!", "gwiddy up!")]"
+ speech_args[SPEECH_MESSAGE] = trim(message)
+ return
+ if(prob(0.01))
+ message += "\" and tips their hat. \"Spy's sappin' my chem dispenser!"//How did I not think of this earlier
+ message_admins("I really appreciate all the hard work you put into adminning citadel, I hope you're all having a good day and I hope this hidden and rare message_admins brightens up your day.")
+ else
+ message += "\" and tips their hat. \"[pick("Yeehaw!", "Boy howdy.", "Darn tootin'.", "Well don't that beat all.", "Whoooowee, would ya look at that!", "Whoooowee! Makin' bacon!", "Cream Gravy!", "Yippekeeyah-heeyapeeah-kayoh!", "Move 'em out!", "Giddy up!")]"
+ speech_args[SPEECH_MESSAGE] = trim(message)
+
+/obj/item/clothing/head/hattip/proc/get_wearer()
+ return loc
diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm
new file mode 100644
index 0000000000..02f2db7c1e
--- /dev/null
+++ b/modular_citadel/code/modules/reagents/objects/items.dm
@@ -0,0 +1,147 @@
+/obj/item/fermichem/pHbooklet
+ name = "pH indicator booklet"
+ desc = "A booklet containing paper soaked in universal indicator."
+ icon_state = "pHbooklet"
+ icon = 'modular_citadel/icons/obj/FermiChem.dmi'
+ item_flags = NOBLUDGEON
+ var/numberOfPages = 50
+ resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_TINY
+
+//A little janky with pockets
+/obj/item/fermichem/pHbooklet/attack_hand(mob/user)
+ if(user.get_held_index_of_item(src))//Does this check pockets too..?
+ if(numberOfPages == 50)
+ icon_state = "pHbookletOpen"
+ if(numberOfPages >= 1)
+ var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper
+ P.add_fingerprint(user)
+ P.forceMove(user.loc)
+ user.put_in_active_hand(P)
+ to_chat(user, "You take [P] out of \the [src].")
+ numberOfPages--
+ playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ add_fingerprint(user)
+ if(numberOfPages == 0)
+ icon_state = "pHbookletEmpty"
+ return
+ else
+ to_chat(user, "[src] is empty!")
+ add_fingerprint(user)
+ return
+ . = ..()
+ if(. & COMPONENT_NO_INTERACT)
+ return
+ var/I = user.get_active_held_item()
+ if(!I)
+ user.put_in_active_hand(src)
+
+/obj/item/fermichem/pHbooklet/MouseDrop()
+ var/mob/living/user = usr
+ if(numberOfPages >= 1)
+ var/obj/item/fermichem/pHpaper/P = new /obj/item/fermichem/pHpaper
+ P.add_fingerprint(user)
+ P.forceMove(user)
+ user.put_in_active_hand(P)
+ to_chat(user, "You take [P] out of \the [src].")
+ numberOfPages--
+ playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ add_fingerprint(user)
+ if(numberOfPages == 0)
+ icon_state = "pHbookletEmpty"
+ return
+ else
+ to_chat(user, "[src] is empty!")
+ add_fingerprint(user)
+ return
+ ..()
+
+/obj/item/fermichem/pHpaper
+ name = "pH indicator strip"
+ desc = "A piece of paper that will change colour depending on the pH of a solution."
+ icon_state = "pHpaper"
+ icon = 'modular_citadel/icons/obj/FermiChem.dmi'
+ item_flags = NOBLUDGEON
+ color = "#f5c352"
+ var/used = FALSE
+ resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/fermichem/pHpaper/afterattack(obj/item/reagent_containers/cont, mob/user, proximity)
+ if(!istype(cont))
+ return
+ if(used == TRUE)
+ to_chat(user, "[user] has already been used!")
+ return
+ if(!LAZYLEN(cont.reagents.reagent_list))
+ return
+ switch(round(cont.reagents.pH, 1))
+ if(14 to INFINITY)
+ color = "#462c83"
+ if(13 to 14)
+ color = "#63459b"
+ if(12 to 13)
+ color = "#5a51a2"
+ if(11 to 12)
+ color = "#3853a4"
+ if(10 to 11)
+ color = "#3f93cf"
+ if(9 to 10)
+ color = "#0bb9b7"
+ if(8 to 9)
+ color = "#23b36e"
+ if(7 to 8)
+ color = "#3aa651"
+ if(6 to 7)
+ color = "#4cb849"
+ if(5 to 6)
+ color = "#b5d335"
+ if(4 to 5)
+ color = "#f7ec1e"
+ if(3 to 4)
+ color = "#fbc314"
+ if(2 to 3)
+ color = "#f26724"
+ if(1 to 2)
+ color = "#ef1d26"
+ if(-INFINITY to 1)
+ color = "#c6040c"
+ desc += " The paper looks to be around a pH of [round(cont.reagents.pH, 1)]"
+ used = TRUE
+
+/obj/item/fermichem/pHmeter
+ name = "Chemistry Analyser"
+ desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution. The screen currently displays nothing."
+ icon_state = "pHmeter"
+ icon = 'modular_citadel/icons/obj/FermiChem.dmi'
+ resistance_flags = FLAMMABLE
+ w_class = WEIGHT_CLASS_TINY
+ var/scanmode = 1
+
+/obj/item/fermichem/pHmeter/attack_self(mob/user)
+ if(!scanmode)
+ to_chat(user, "You switch the chemical analyzer to give a detailed report.")
+ scanmode = 1
+ else
+ to_chat(user, "You switch the chemical analyzer to give a reduced report.")
+ scanmode = 0
+
+/obj/item/fermichem/pHmeter/afterattack(atom/A, mob/user, proximity)
+ . = ..()
+ if(!istype(A, /obj/item/reagent_containers))
+ return
+ var/obj/item/reagent_containers/cont = A
+ if(LAZYLEN(cont.reagents.reagent_list) == null)
+ return
+ var/out_message
+ to_chat(user, "The chemistry meter beeps and displays:")
+ out_message += "Total volume: [round(cont.volume, 0.01)] Total pH: [round(cont.reagents.pH, 0.1)]\n"
+ if(cont.reagents.fermiIsReacting)
+ out_message += "A reaction appears to be occuring currently.\n"
+ out_message += "Chemicals found in the beaker:\n"
+ for(var/datum/reagent/R in cont.reagents.reagent_list)
+ out_message += "[R.volume]u of [R.name], Purity: [R.purity], [(scanmode?"[(R.overdose_threshold?"Overdose: [R.overdose_threshold]u, ":"")][(R.addiction_threshold?"Addiction: [R.addiction_threshold]u, ":"")]Base pH: [R.pH].":".")]\n"
+ if(scanmode)
+ out_message += "Analysis: [R.description]\n"
+ to_chat(user, "[out_message]")
+ desc = "An electrode attached to a small circuit box that will analyse a beaker. It can be toggled to give a reduced or extended report. The screen currently displays [round(cont.reagents.pH, 0.1)]."
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
index bee56cde15..4aa634a488 100755
--- a/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/hypospraymkii.dm
@@ -50,6 +50,9 @@
/obj/item/hypospray/mkii/tricord
start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord
+/obj/item/hypospray/mkii/enlarge
+ spawnwithvial = FALSE
+
/obj/item/hypospray/mkii/CMO
name = "hypospray mk.II deluxe"
allowed_containers = list(/obj/item/reagent_containers/glass/bottle/vial/tiny, /obj/item/reagent_containers/glass/bottle/vial/small, /obj/item/reagent_containers/glass/bottle/vial/large)
@@ -93,7 +96,10 @@
/obj/item/hypospray/mkii/examine(mob/user)
. = ..()
- to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.")
+ if(vial)
+ to_chat(user, "[vial] has [vial.reagents.total_volume]u remaining.")
+ else
+ to_chat(user, "It has no vial loaded in.")
to_chat(user, "[src] is set to [mode ? "Inject" : "Spray"] contents on application.")
/obj/item/hypospray/mkii/proc/unload_hypo(obj/item/I, mob/user)
@@ -138,12 +144,18 @@
// Gunna allow this for now, still really don't approve - Pooj
/obj/item/hypospray/mkii/emag_act(mob/user)
+ . = ..()
+ if(obj_flags & EMAGGED)
+ to_chat(user, "[src] happens to be already overcharged.")
+ return
inject_wait = COMBAT_WAIT_INJECT
spray_wait = COMBAT_WAIT_SPRAY
spray_self = COMBAT_SELF_INJECT
inject_self = COMBAT_SELF_SPRAY
penetrates = TRUE
to_chat(user, "You overcharge [src]'s control circuit.")
+ obj_flags |= EMAGGED
+ return TRUE
/obj/item/hypospray/mkii/attack_hand(mob/user)
. = ..() //Don't bother changing this or removing it from containers will break.
diff --git a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
index 4b7972d0a7..c1e0d6ff01 100755
--- a/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/hypovial.dm
@@ -14,7 +14,8 @@
"green hypovial" = "hypovial-a",
"orange hypovial" = "hypovial-k",
"purple hypovial" = "hypovial-p",
- "black hypovial" = "hypovial-t"
+ "black hypovial" = "hypovial-t",
+ "pink hypovial" = "hypovial-pink"
)
always_reskinnable = TRUE
@@ -136,6 +137,16 @@
icon_state = "hypovial"
comes_with = list("tricordrazine" = 30)
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/breastreduction
+ name = "pink hypovial (breast treatment)"
+ icon_state = "hypovial-pink"
+ comes_with = list("BEsmaller_hypo" = 30)
+
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/penisreduction
+ name = "pink hypovial (penis treatment)"
+ icon_state = "hypovial-pink"
+ comes_with = list("PEsmaller_hypo" = 30)
+
/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
name = "deluxe hypovial"
icon_state = "hypoviallarge-cmos"
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index ee8268128a..0e823a658f 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -8,6 +8,7 @@
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
reagent_state = LIQUID
color = "#FFFFFF" // rgb: 255, 255, 255
+ can_synth = FALSE
nutriment_factor = 0.5 * REAGENTS_METABOLISM
/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume)
@@ -19,7 +20,6 @@
var/obj/effect/decal/cleanable/semen/S = locate() in T
if(!S)
S = new(T)
- S.reagents.add_reagent("semen", reac_volume)
if(data["blood_DNA"])
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
@@ -50,6 +50,7 @@
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
reagent_state = LIQUID
color = "#AAAAAA77"
+ can_synth = FALSE
nutriment_factor = 0.5 * REAGENTS_METABOLISM
/obj/effect/decal/cleanable/femcum
@@ -82,7 +83,6 @@
var/obj/effect/decal/cleanable/femcum/S = locate() in T
if(!S)
S = new(T)
- S.reagents.add_reagent("femcum", reac_volume)
if(data["blood_DNA"])
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
@@ -138,16 +138,16 @@
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M)
if(prob(30))
- M.adjustBrainLoss(2)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2)
..()
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage3(mob/living/M)
if(prob(30))
- M.adjustBrainLoss(3)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3)
..()
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage4(mob/living/M)
if(prob(30))
- M.adjustBrainLoss(4)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4)
..()
/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M)
diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dm
deleted file mode 100644
index c0ddaceaf7..0000000000
--- a/modular_citadel/code/modules/research/techweb/all_nodes.dm
+++ /dev/null
@@ -1,36 +0,0 @@
-/datum/techweb_node/bluespace_basic/New()
- . = ..()
- design_ids += "xenobio_monkeys"
-
-/datum/techweb_node/practical_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimebasic"
-
-/datum/techweb_node/adv_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimeadv"
-
-/datum/techweb_node/ballistic_weapons/New()
- . = ..()
- design_ids += "mag_oldsmg_rubber"
-
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Games and Toys"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "arcade_minesweeper", "slotmachine", "autoylathe")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
-
-/datum/techweb_node/ballistic_weapons
- design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_tx")
-
-/datum/techweb_node/advanced_illegl_ballistics
- id = "advanced_illegal_ballistics"
- display_name = "Advanced Illegal Ballistics"
- description = "Advanced Ballistic for Illegal weaponds."
- design_ids = list("10mm","10mmap","10mminc","10mmhp","pistolm9mm","m45","bolt_clip")
- prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space.
- export_price = 7000
diff --git a/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm b/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm
deleted file mode 100644
index d968cfdcc7..0000000000
--- a/modular_citadel/code/modules/research/techweb/all_nodes.dme.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/datum/techweb_node/bluespace_basic/New()
- . = ..()
- design_ids += "xenobio_monkeys"
-
-/datum/techweb_node/practical_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimebasic"
-
-/datum/techweb_node/adv_bluespace/New()
- . = ..()
- design_ids += "xenobio_slimeadv"
-
-/datum/techweb_node/ballistic_weapons/New()
- . = ..()
- design_ids += "mag_oldsmg_rubber"
-
-/datum/techweb_node/computer_board_gaming
- id = "computer_board_gaming"
- display_name = "Games and Toys"
- description = "For the slackers on the station."
- prereq_ids = list("comptech")
- design_ids = list("arcade_battle", "arcade_orion", "slotmachine", "autoylathe")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
- export_price = 5000
-
-/datum/techweb_node/advanced_illegl_ballistics
- id = "advanced_illegal_ballistics"
- display_name = "Advanced Illegal Ballistics
- description = "Advanced Ballistic for Illegal weaponds."
- design_ids = list("10mm","10mmap","10mminc","10mmhp","9mm","point_45","bolt_clip")
- prereq_ids = list("ballistic_weapons","syndicate_basic","explosive_weapons")
- research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) //This gives sec lethal mags/clips for guns form traitors or space.
- export_price = 7000
diff --git a/modular_citadel/icons/firstaid.dmi b/modular_citadel/icons/firstaid.dmi
index 693f5a2fa4..d061adf9f2 100644
Binary files a/modular_citadel/icons/firstaid.dmi and b/modular_citadel/icons/firstaid.dmi differ
diff --git a/modular_citadel/icons/misc/misc.dmi b/modular_citadel/icons/misc/misc.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/misc/misc.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/glasses.dmi b/modular_citadel/icons/mob/citadel/glasses.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/glasses.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/head.dmi b/modular_citadel/icons/mob/citadel/head.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/head.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/masks.dmi b/modular_citadel/icons/mob/citadel/masks.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/masks.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel/shoes.dmi b/modular_citadel/icons/mob/citadel/shoes.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/mob/citadel/shoes.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi b/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi
index fa7285ae4c..7fbb26f1af 100644
Binary files a/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi and b/modular_citadel/icons/mob/citadel_refs/widerobot_vr.dmi differ
diff --git a/modular_citadel/icons/mob/clothing/fed hats n modern.dmi b/modular_citadel/icons/mob/clothing/fed hats n modern.dmi
deleted file mode 100644
index ab8682b785..0000000000
Binary files a/modular_citadel/icons/mob/clothing/fed hats n modern.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/clothing/fedcoats.dmi b/modular_citadel/icons/mob/clothing/fedcoats.dmi
deleted file mode 100644
index 6554b3a45d..0000000000
Binary files a/modular_citadel/icons/mob/clothing/fedcoats.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/digishoes.dmi b/modular_citadel/icons/mob/digishoes.dmi
index a499db6262..a8e6c49423 100644
Binary files a/modular_citadel/icons/mob/digishoes.dmi and b/modular_citadel/icons/mob/digishoes.dmi differ
diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index 569667a82d..a23716562e 100644
Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index 8327be6eaf..dce56de556 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index b16de1c0de..5395e5c7c6 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/modular_citadel/icons/mob/markings_notmammals.dmi b/modular_citadel/icons/mob/markings_notmammals.dmi
index 59b10e93aa..d9577698d1 100644
Binary files a/modular_citadel/icons/mob/markings_notmammals.dmi and b/modular_citadel/icons/mob/markings_notmammals.dmi differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index 1e12d2bf1a..8c0856429b 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/icons/mob/muzzled_helmet.dmi b/modular_citadel/icons/mob/muzzled_helmet.dmi
index e321f8ae47..a318f394f8 100644
Binary files a/modular_citadel/icons/mob/muzzled_helmet.dmi and b/modular_citadel/icons/mob/muzzled_helmet.dmi differ
diff --git a/modular_citadel/icons/mob/taur_canine.dmi b/modular_citadel/icons/mob/taur_canine.dmi
index 0242d2e673..15d6214446 100644
Binary files a/modular_citadel/icons/mob/taur_canine.dmi and b/modular_citadel/icons/mob/taur_canine.dmi differ
diff --git a/modular_citadel/icons/mob/taur_hooved.dmi b/modular_citadel/icons/mob/taur_hooved.dmi
index e9860f2014..63e604b430 100644
Binary files a/modular_citadel/icons/mob/taur_hooved.dmi and b/modular_citadel/icons/mob/taur_hooved.dmi differ
diff --git a/modular_citadel/icons/mob/taur_naga.dmi b/modular_citadel/icons/mob/taur_naga.dmi
index 1ca4509db7..7214ec7073 100644
Binary files a/modular_citadel/icons/mob/taur_naga.dmi and b/modular_citadel/icons/mob/taur_naga.dmi differ
diff --git a/modular_citadel/icons/mob/uniform_digi.dmi b/modular_citadel/icons/mob/uniform_digi.dmi
index 7e00c60caf..513ebce439 100644
Binary files a/modular_citadel/icons/mob/uniform_digi.dmi and b/modular_citadel/icons/mob/uniform_digi.dmi differ
diff --git a/modular_citadel/icons/mob/werenerd.dmi b/modular_citadel/icons/mob/werenerd.dmi
deleted file mode 100644
index 706d4248f8..0000000000
Binary files a/modular_citadel/icons/mob/werenerd.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/werenerdleap.dmi b/modular_citadel/icons/mob/werenerdleap.dmi
deleted file mode 100644
index eb5339733b..0000000000
Binary files a/modular_citadel/icons/mob/werenerdleap.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/widerobot.dmi b/modular_citadel/icons/mob/widerobot.dmi
index c730467e1d..19dd8dba86 100644
Binary files a/modular_citadel/icons/mob/widerobot.dmi and b/modular_citadel/icons/mob/widerobot.dmi differ
diff --git a/modular_citadel/icons/obj/FermiChem.dmi b/modular_citadel/icons/obj/FermiChem.dmi
new file mode 100644
index 0000000000..de7a86d574
Binary files /dev/null and b/modular_citadel/icons/obj/FermiChem.dmi differ
diff --git a/modular_citadel/icons/obj/clothing/hats.dmi b/modular_citadel/icons/obj/clothing/hats.dmi
new file mode 100644
index 0000000000..ba9b4b5f8e
Binary files /dev/null and b/modular_citadel/icons/obj/clothing/hats.dmi differ
diff --git a/modular_citadel/icons/obj/clothing/trek_item_icon.dmi b/modular_citadel/icons/obj/clothing/trek_item_icon.dmi
index ed3286615b..570acbf4cf 100644
Binary files a/modular_citadel/icons/obj/clothing/trek_item_icon.dmi and b/modular_citadel/icons/obj/clothing/trek_item_icon.dmi differ
diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi
index 8c76891396..d70207ee69 100644
Binary files a/modular_citadel/icons/obj/genitals/breasts.dmi and b/modular_citadel/icons/obj/genitals/breasts.dmi differ
diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi
index c4b75b1172..371041b6f4 100644
Binary files a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi and b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi differ
diff --git a/modular_citadel/icons/obj/genitals/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi
index 397fa335e5..517758b248 100644
Binary files a/modular_citadel/icons/obj/genitals/penis.dmi and b/modular_citadel/icons/obj/genitals/penis.dmi differ
diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi
index 434f171e22..416965415d 100644
Binary files a/modular_citadel/icons/obj/genitals/penis_onmob.dmi and b/modular_citadel/icons/obj/genitals/penis_onmob.dmi differ
diff --git a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi
index 3debbd0047..ae2339e2e0 100644
Binary files a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi and b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi differ
diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi
index c4cf891eac..ab71b22e3b 100644
Binary files a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi and b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi differ
diff --git a/modular_citadel/icons/obj/structures.dmi b/modular_citadel/icons/obj/structures.dmi
deleted file mode 100644
index cf74d73796..0000000000
Binary files a/modular_citadel/icons/obj/structures.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/tools.dmi b/modular_citadel/icons/obj/tools.dmi
index 5d5a0d8abd..7b99880799 100644
Binary files a/modular_citadel/icons/obj/tools.dmi and b/modular_citadel/icons/obj/tools.dmi differ
diff --git a/modular_citadel/icons/obj/vial.dmi b/modular_citadel/icons/obj/vial.dmi
index bc282ab1d3..8d1fefe470 100755
Binary files a/modular_citadel/icons/obj/vial.dmi and b/modular_citadel/icons/obj/vial.dmi differ
diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf
index c5b5138609..025a53bdca 100644
--- a/modular_citadel/interface/skin.dmf
+++ b/modular_citadel/interface/skin.dmf
@@ -54,7 +54,7 @@ window "mainwindow"
size = 640x440
anchor1 = none
anchor2 = none
- background-color = #eeeeee
+ background-color = #242424
is-default = true
saved-params = "pos;size;is-minimized;is-maximized"
icon = 'icons\\ss13_64.png'
@@ -66,7 +66,7 @@ window "mainwindow"
size = 637x440
anchor1 = 0,0
anchor2 = 100,100
- background-color = #eeeeee
+ background-color = #272727
saved-params = "splitter"
left = "mapwindow"
right = "infowindow"
@@ -78,7 +78,7 @@ window "mainwindow"
size = 200x200
anchor1 = none
anchor2 = none
- background-color = #ffffff
+ background-color = #272727
is-visible = false
saved-params = ""
elem "tooltip"
@@ -87,7 +87,7 @@ window "mainwindow"
size = 999x999
anchor1 = none
anchor2 = none
- background-color = #ffffff
+ background-color = #272727
is-visible = false
saved-params = ""
@@ -119,7 +119,7 @@ window "infowindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #eeeeee
+ background-color = #242424
saved-params = "pos;size;is-minimized;is-maximized"
is-pane = true
elem "info"
@@ -128,6 +128,7 @@ window "infowindow"
size = 640x445
anchor1 = 0,0
anchor2 = 100,100
+ background-color = #272727
saved-params = "splitter"
left = "statwindow"
right = "outputwindow"
@@ -138,7 +139,8 @@ window "infowindow"
size = 104x20
anchor1 = 3,0
anchor2 = 19,0
- background-color = #90b3dd
+ text-color = #e0e0e0
+ background-color = #40628a
saved-params = "is-checked"
text = "Changelog"
command = "changelog"
@@ -148,7 +150,8 @@ window "infowindow"
size = 100x20
anchor1 = 19,0
anchor2 = 34,0
- background-color = #90b3dd
+ text-color = #e0e0e0
+ background-color = #40628a
saved-params = "is-checked"
text = "Rules"
command = "rules"
@@ -158,7 +161,8 @@ window "infowindow"
size = 100x20
anchor1 = 34,0
anchor2 = 50,0
- background-color = #90b3dd
+ text-color = #e0e0e0
+ background-color = #40628a
saved-params = "is-checked"
text = "Wiki"
command = "wiki"
@@ -168,7 +172,8 @@ window "infowindow"
size = 100x20
anchor1 = 50,0
anchor2 = 66,0
- background-color = #90b3dd
+ text-color = #e0e0e0
+ background-color = #40628a
saved-params = "is-checked"
text = "Forum"
command = "forum"
@@ -178,7 +183,8 @@ window "infowindow"
size = 100x20
anchor1 = 66,0
anchor2 = 81,0
- background-color = #90b3dd
+ text-color = #e0e0e0
+ background-color = #40628a
saved-params = "is-checked"
text = "GitHub"
command = "github"
@@ -189,7 +195,8 @@ window "infowindow"
anchor1 = 81,0
anchor2 = 97,0
font-size = 8
- background-color = #ef7f7f
+ text-color = #e0e0e0
+ background-color = #A92c2c
saved-params = "is-checked"
text = "Report Issue"
command = "report-issue"
@@ -201,7 +208,7 @@ window "outputwindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #eeeeee
+ background-color = #272727
saved-params = "pos;size;is-minimized;is-maximized"
titlebar = false
statusbar = false
@@ -225,7 +232,8 @@ window "outputwindow"
size = 37x20
anchor1 = 100,100
anchor2 = none
- background-color = #eeeeee
+ text-color = #e0e0e0
+ background-color = #272727
saved-params = "is-checked"
text = "Chat"
command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\""
@@ -237,7 +245,7 @@ window "outputwindow"
size = 640x456
anchor1 = 0,0
anchor2 = 100,100
- background-color = #ffffff
+ background-color = #272727
is-visible = false
is-disabled = true
saved-params = ""
@@ -248,6 +256,8 @@ window "outputwindow"
size = 640x456
anchor1 = 0,0
anchor2 = 100,100
+ text-color = #e0e0e0
+ background-color = #272727
is-default = true
saved-params = ""
@@ -258,7 +268,7 @@ window "statwindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #eeeeee
+ background-color = #242424
saved-params = "pos;size;is-minimized;is-maximized"
is-pane = true
elem "stat"
@@ -267,9 +277,14 @@ window "statwindow"
size = 640x480
anchor1 = 0,0
anchor2 = 100,100
+ text-color = #e0e0e0
+ background-color = #272727
is-default = true
saved-params = ""
- tab-background-color = #eeeeee
+ tab-text-color = #e0e0e0
+ tab-background-color = #242424
+ prefix-color = #e0e0e0
+ suffix-color = #e0e0e0
window "preferences_window"
elem "preferences_window"
diff --git a/modular_citadel/sound/vox/_comma.ogg b/modular_citadel/sound/vox/_comma.ogg
new file mode 100644
index 0000000000..55ee3102a0
Binary files /dev/null and b/modular_citadel/sound/vox/_comma.ogg differ
diff --git a/modular_citadel/sound/vox/_period.ogg b/modular_citadel/sound/vox/_period.ogg
new file mode 100644
index 0000000000..dfb816d006
Binary files /dev/null and b/modular_citadel/sound/vox/_period.ogg differ
diff --git a/modular_citadel/sound/vox/a.ogg b/modular_citadel/sound/vox/a.ogg
new file mode 100644
index 0000000000..ad3a851290
Binary files /dev/null and b/modular_citadel/sound/vox/a.ogg differ
diff --git a/modular_citadel/sound/vox/accelerating.ogg b/modular_citadel/sound/vox/accelerating.ogg
new file mode 100644
index 0000000000..d6426aa798
Binary files /dev/null and b/modular_citadel/sound/vox/accelerating.ogg differ
diff --git a/modular_citadel/sound/vox/accelerator.ogg b/modular_citadel/sound/vox/accelerator.ogg
new file mode 100644
index 0000000000..6e8e1f10e8
Binary files /dev/null and b/modular_citadel/sound/vox/accelerator.ogg differ
diff --git a/modular_citadel/sound/vox/accepted.ogg b/modular_citadel/sound/vox/accepted.ogg
new file mode 100644
index 0000000000..f6c411f8c5
Binary files /dev/null and b/modular_citadel/sound/vox/accepted.ogg differ
diff --git a/modular_citadel/sound/vox/access.ogg b/modular_citadel/sound/vox/access.ogg
new file mode 100644
index 0000000000..ae8390e516
Binary files /dev/null and b/modular_citadel/sound/vox/access.ogg differ
diff --git a/modular_citadel/sound/vox/acknowledge.ogg b/modular_citadel/sound/vox/acknowledge.ogg
new file mode 100644
index 0000000000..da3143b729
Binary files /dev/null and b/modular_citadel/sound/vox/acknowledge.ogg differ
diff --git a/modular_citadel/sound/vox/acknowledged.ogg b/modular_citadel/sound/vox/acknowledged.ogg
new file mode 100644
index 0000000000..b4b89eaa52
Binary files /dev/null and b/modular_citadel/sound/vox/acknowledged.ogg differ
diff --git a/modular_citadel/sound/vox/acquired.ogg b/modular_citadel/sound/vox/acquired.ogg
new file mode 100644
index 0000000000..ba4595a908
Binary files /dev/null and b/modular_citadel/sound/vox/acquired.ogg differ
diff --git a/modular_citadel/sound/vox/acquisition.ogg b/modular_citadel/sound/vox/acquisition.ogg
new file mode 100644
index 0000000000..fcdf6a9832
Binary files /dev/null and b/modular_citadel/sound/vox/acquisition.ogg differ
diff --git a/modular_citadel/sound/vox/across.ogg b/modular_citadel/sound/vox/across.ogg
new file mode 100644
index 0000000000..d026b3dba9
Binary files /dev/null and b/modular_citadel/sound/vox/across.ogg differ
diff --git a/modular_citadel/sound/vox/activate.ogg b/modular_citadel/sound/vox/activate.ogg
new file mode 100644
index 0000000000..5611c456a7
Binary files /dev/null and b/modular_citadel/sound/vox/activate.ogg differ
diff --git a/modular_citadel/sound/vox/activated.ogg b/modular_citadel/sound/vox/activated.ogg
new file mode 100644
index 0000000000..e3fafca3b2
Binary files /dev/null and b/modular_citadel/sound/vox/activated.ogg differ
diff --git a/modular_citadel/sound/vox/activity.ogg b/modular_citadel/sound/vox/activity.ogg
new file mode 100644
index 0000000000..66535b485d
Binary files /dev/null and b/modular_citadel/sound/vox/activity.ogg differ
diff --git a/modular_citadel/sound/vox/adios.ogg b/modular_citadel/sound/vox/adios.ogg
new file mode 100644
index 0000000000..1eedd5468b
Binary files /dev/null and b/modular_citadel/sound/vox/adios.ogg differ
diff --git a/modular_citadel/sound/vox/administration.ogg b/modular_citadel/sound/vox/administration.ogg
new file mode 100644
index 0000000000..44f8b3e8d8
Binary files /dev/null and b/modular_citadel/sound/vox/administration.ogg differ
diff --git a/modular_citadel/sound/vox/advanced.ogg b/modular_citadel/sound/vox/advanced.ogg
new file mode 100644
index 0000000000..df110dd8db
Binary files /dev/null and b/modular_citadel/sound/vox/advanced.ogg differ
diff --git a/modular_citadel/sound/vox/after.ogg b/modular_citadel/sound/vox/after.ogg
new file mode 100644
index 0000000000..8c0857f99c
Binary files /dev/null and b/modular_citadel/sound/vox/after.ogg differ
diff --git a/modular_citadel/sound/vox/agent.ogg b/modular_citadel/sound/vox/agent.ogg
new file mode 100644
index 0000000000..eae99227bc
Binary files /dev/null and b/modular_citadel/sound/vox/agent.ogg differ
diff --git a/modular_citadel/sound/vox/alarm.ogg b/modular_citadel/sound/vox/alarm.ogg
new file mode 100644
index 0000000000..54bcc0b980
Binary files /dev/null and b/modular_citadel/sound/vox/alarm.ogg differ
diff --git a/modular_citadel/sound/vox/alert.ogg b/modular_citadel/sound/vox/alert.ogg
new file mode 100644
index 0000000000..08620fa58c
Binary files /dev/null and b/modular_citadel/sound/vox/alert.ogg differ
diff --git a/modular_citadel/sound/vox/alien.ogg b/modular_citadel/sound/vox/alien.ogg
new file mode 100644
index 0000000000..cb3c3d7787
Binary files /dev/null and b/modular_citadel/sound/vox/alien.ogg differ
diff --git a/modular_citadel/sound/vox/aligned.ogg b/modular_citadel/sound/vox/aligned.ogg
new file mode 100644
index 0000000000..f561a1ec2f
Binary files /dev/null and b/modular_citadel/sound/vox/aligned.ogg differ
diff --git a/modular_citadel/sound/vox/all.ogg b/modular_citadel/sound/vox/all.ogg
new file mode 100644
index 0000000000..48d05f1007
Binary files /dev/null and b/modular_citadel/sound/vox/all.ogg differ
diff --git a/modular_citadel/sound/vox/alpha.ogg b/modular_citadel/sound/vox/alpha.ogg
new file mode 100644
index 0000000000..b80828c408
Binary files /dev/null and b/modular_citadel/sound/vox/alpha.ogg differ
diff --git a/modular_citadel/sound/vox/am.ogg b/modular_citadel/sound/vox/am.ogg
new file mode 100644
index 0000000000..9d4289758e
Binary files /dev/null and b/modular_citadel/sound/vox/am.ogg differ
diff --git a/modular_citadel/sound/vox/amigo.ogg b/modular_citadel/sound/vox/amigo.ogg
new file mode 100644
index 0000000000..6992689553
Binary files /dev/null and b/modular_citadel/sound/vox/amigo.ogg differ
diff --git a/modular_citadel/sound/vox/ammunition.ogg b/modular_citadel/sound/vox/ammunition.ogg
new file mode 100644
index 0000000000..108fb2dc83
Binary files /dev/null and b/modular_citadel/sound/vox/ammunition.ogg differ
diff --git a/modular_citadel/sound/vox/an.ogg b/modular_citadel/sound/vox/an.ogg
new file mode 100644
index 0000000000..53382c68a0
Binary files /dev/null and b/modular_citadel/sound/vox/an.ogg differ
diff --git a/modular_citadel/sound/vox/and.ogg b/modular_citadel/sound/vox/and.ogg
new file mode 100644
index 0000000000..b9b4de26bf
Binary files /dev/null and b/modular_citadel/sound/vox/and.ogg differ
diff --git a/modular_citadel/sound/vox/announcement.ogg b/modular_citadel/sound/vox/announcement.ogg
new file mode 100644
index 0000000000..ba16d76c18
Binary files /dev/null and b/modular_citadel/sound/vox/announcement.ogg differ
diff --git a/modular_citadel/sound/vox/anomalous.ogg b/modular_citadel/sound/vox/anomalous.ogg
new file mode 100644
index 0000000000..a331afd06e
Binary files /dev/null and b/modular_citadel/sound/vox/anomalous.ogg differ
diff --git a/modular_citadel/sound/vox/antenna.ogg b/modular_citadel/sound/vox/antenna.ogg
new file mode 100644
index 0000000000..547e64786a
Binary files /dev/null and b/modular_citadel/sound/vox/antenna.ogg differ
diff --git a/modular_citadel/sound/vox/any.ogg b/modular_citadel/sound/vox/any.ogg
new file mode 100644
index 0000000000..49d578758b
Binary files /dev/null and b/modular_citadel/sound/vox/any.ogg differ
diff --git a/modular_citadel/sound/vox/apprehend.ogg b/modular_citadel/sound/vox/apprehend.ogg
new file mode 100644
index 0000000000..de0fc4d664
Binary files /dev/null and b/modular_citadel/sound/vox/apprehend.ogg differ
diff --git a/modular_citadel/sound/vox/approach.ogg b/modular_citadel/sound/vox/approach.ogg
new file mode 100644
index 0000000000..3135bb7fc4
Binary files /dev/null and b/modular_citadel/sound/vox/approach.ogg differ
diff --git a/modular_citadel/sound/vox/are.ogg b/modular_citadel/sound/vox/are.ogg
new file mode 100644
index 0000000000..b3e68aa8a6
Binary files /dev/null and b/modular_citadel/sound/vox/are.ogg differ
diff --git a/modular_citadel/sound/vox/area.ogg b/modular_citadel/sound/vox/area.ogg
new file mode 100644
index 0000000000..1408fedf4c
Binary files /dev/null and b/modular_citadel/sound/vox/area.ogg differ
diff --git a/modular_citadel/sound/vox/arm.ogg b/modular_citadel/sound/vox/arm.ogg
new file mode 100644
index 0000000000..e078c567b5
Binary files /dev/null and b/modular_citadel/sound/vox/arm.ogg differ
diff --git a/modular_citadel/sound/vox/armed.ogg b/modular_citadel/sound/vox/armed.ogg
new file mode 100644
index 0000000000..2b1d092658
Binary files /dev/null and b/modular_citadel/sound/vox/armed.ogg differ
diff --git a/modular_citadel/sound/vox/armor.ogg b/modular_citadel/sound/vox/armor.ogg
new file mode 100644
index 0000000000..70217b55a4
Binary files /dev/null and b/modular_citadel/sound/vox/armor.ogg differ
diff --git a/modular_citadel/sound/vox/armory.ogg b/modular_citadel/sound/vox/armory.ogg
new file mode 100644
index 0000000000..22835188f8
Binary files /dev/null and b/modular_citadel/sound/vox/armory.ogg differ
diff --git a/modular_citadel/sound/vox/arrest.ogg b/modular_citadel/sound/vox/arrest.ogg
new file mode 100644
index 0000000000..bfef18601f
Binary files /dev/null and b/modular_citadel/sound/vox/arrest.ogg differ
diff --git a/modular_citadel/sound/vox/ass.ogg b/modular_citadel/sound/vox/ass.ogg
new file mode 100644
index 0000000000..6bf9c01e62
Binary files /dev/null and b/modular_citadel/sound/vox/ass.ogg differ
diff --git a/modular_citadel/sound/vox/at.ogg b/modular_citadel/sound/vox/at.ogg
new file mode 100644
index 0000000000..5146ab9afb
Binary files /dev/null and b/modular_citadel/sound/vox/at.ogg differ
diff --git a/modular_citadel/sound/vox/atomic.ogg b/modular_citadel/sound/vox/atomic.ogg
new file mode 100644
index 0000000000..b8b1e1cec7
Binary files /dev/null and b/modular_citadel/sound/vox/atomic.ogg differ
diff --git a/modular_citadel/sound/vox/attention.ogg b/modular_citadel/sound/vox/attention.ogg
new file mode 100644
index 0000000000..ca5073e6c4
Binary files /dev/null and b/modular_citadel/sound/vox/attention.ogg differ
diff --git a/modular_citadel/sound/vox/authorize.ogg b/modular_citadel/sound/vox/authorize.ogg
new file mode 100644
index 0000000000..7ef68781ef
Binary files /dev/null and b/modular_citadel/sound/vox/authorize.ogg differ
diff --git a/modular_citadel/sound/vox/authorized.ogg b/modular_citadel/sound/vox/authorized.ogg
new file mode 100644
index 0000000000..5142ceba8d
Binary files /dev/null and b/modular_citadel/sound/vox/authorized.ogg differ
diff --git a/modular_citadel/sound/vox/automatic.ogg b/modular_citadel/sound/vox/automatic.ogg
new file mode 100644
index 0000000000..48d09f2304
Binary files /dev/null and b/modular_citadel/sound/vox/automatic.ogg differ
diff --git a/modular_citadel/sound/vox/away.ogg b/modular_citadel/sound/vox/away.ogg
new file mode 100644
index 0000000000..3e99af620e
Binary files /dev/null and b/modular_citadel/sound/vox/away.ogg differ
diff --git a/modular_citadel/sound/vox/b.ogg b/modular_citadel/sound/vox/b.ogg
new file mode 100644
index 0000000000..00b64030d6
Binary files /dev/null and b/modular_citadel/sound/vox/b.ogg differ
diff --git a/modular_citadel/sound/vox/back.ogg b/modular_citadel/sound/vox/back.ogg
new file mode 100644
index 0000000000..a8ca34ef52
Binary files /dev/null and b/modular_citadel/sound/vox/back.ogg differ
diff --git a/modular_citadel/sound/vox/backman.ogg b/modular_citadel/sound/vox/backman.ogg
new file mode 100644
index 0000000000..e0e6351f57
Binary files /dev/null and b/modular_citadel/sound/vox/backman.ogg differ
diff --git a/modular_citadel/sound/vox/bad.ogg b/modular_citadel/sound/vox/bad.ogg
new file mode 100644
index 0000000000..2dd38058a2
Binary files /dev/null and b/modular_citadel/sound/vox/bad.ogg differ
diff --git a/modular_citadel/sound/vox/bag.ogg b/modular_citadel/sound/vox/bag.ogg
new file mode 100644
index 0000000000..6daa1ab172
Binary files /dev/null and b/modular_citadel/sound/vox/bag.ogg differ
diff --git a/modular_citadel/sound/vox/bailey.ogg b/modular_citadel/sound/vox/bailey.ogg
new file mode 100644
index 0000000000..b912fe5801
Binary files /dev/null and b/modular_citadel/sound/vox/bailey.ogg differ
diff --git a/modular_citadel/sound/vox/barracks.ogg b/modular_citadel/sound/vox/barracks.ogg
new file mode 100644
index 0000000000..5e13a42773
Binary files /dev/null and b/modular_citadel/sound/vox/barracks.ogg differ
diff --git a/modular_citadel/sound/vox/base.ogg b/modular_citadel/sound/vox/base.ogg
new file mode 100644
index 0000000000..17d60fbc02
Binary files /dev/null and b/modular_citadel/sound/vox/base.ogg differ
diff --git a/modular_citadel/sound/vox/bay.ogg b/modular_citadel/sound/vox/bay.ogg
new file mode 100644
index 0000000000..7ac9991c69
Binary files /dev/null and b/modular_citadel/sound/vox/bay.ogg differ
diff --git a/modular_citadel/sound/vox/be.ogg b/modular_citadel/sound/vox/be.ogg
new file mode 100644
index 0000000000..01865aba54
Binary files /dev/null and b/modular_citadel/sound/vox/be.ogg differ
diff --git a/modular_citadel/sound/vox/been.ogg b/modular_citadel/sound/vox/been.ogg
new file mode 100644
index 0000000000..cf9e92a032
Binary files /dev/null and b/modular_citadel/sound/vox/been.ogg differ
diff --git a/modular_citadel/sound/vox/before.ogg b/modular_citadel/sound/vox/before.ogg
new file mode 100644
index 0000000000..fc16e8fef4
Binary files /dev/null and b/modular_citadel/sound/vox/before.ogg differ
diff --git a/modular_citadel/sound/vox/beyond.ogg b/modular_citadel/sound/vox/beyond.ogg
new file mode 100644
index 0000000000..e25982e700
Binary files /dev/null and b/modular_citadel/sound/vox/beyond.ogg differ
diff --git a/modular_citadel/sound/vox/biohazard.ogg b/modular_citadel/sound/vox/biohazard.ogg
new file mode 100644
index 0000000000..12d20ff2f3
Binary files /dev/null and b/modular_citadel/sound/vox/biohazard.ogg differ
diff --git a/modular_citadel/sound/vox/biological.ogg b/modular_citadel/sound/vox/biological.ogg
new file mode 100644
index 0000000000..538c2c4604
Binary files /dev/null and b/modular_citadel/sound/vox/biological.ogg differ
diff --git a/modular_citadel/sound/vox/birdwell.ogg b/modular_citadel/sound/vox/birdwell.ogg
new file mode 100644
index 0000000000..d3735d2531
Binary files /dev/null and b/modular_citadel/sound/vox/birdwell.ogg differ
diff --git a/modular_citadel/sound/vox/bizwarn.ogg b/modular_citadel/sound/vox/bizwarn.ogg
new file mode 100644
index 0000000000..1f875c644e
Binary files /dev/null and b/modular_citadel/sound/vox/bizwarn.ogg differ
diff --git a/modular_citadel/sound/vox/black.ogg b/modular_citadel/sound/vox/black.ogg
new file mode 100644
index 0000000000..28e5d48afe
Binary files /dev/null and b/modular_citadel/sound/vox/black.ogg differ
diff --git a/modular_citadel/sound/vox/blast.ogg b/modular_citadel/sound/vox/blast.ogg
new file mode 100644
index 0000000000..84a28e1fc8
Binary files /dev/null and b/modular_citadel/sound/vox/blast.ogg differ
diff --git a/modular_citadel/sound/vox/blocked.ogg b/modular_citadel/sound/vox/blocked.ogg
new file mode 100644
index 0000000000..f6efacfda1
Binary files /dev/null and b/modular_citadel/sound/vox/blocked.ogg differ
diff --git a/modular_citadel/sound/vox/bloop.ogg b/modular_citadel/sound/vox/bloop.ogg
new file mode 100644
index 0000000000..ada6ed636e
Binary files /dev/null and b/modular_citadel/sound/vox/bloop.ogg differ
diff --git a/modular_citadel/sound/vox/blue.ogg b/modular_citadel/sound/vox/blue.ogg
new file mode 100644
index 0000000000..a336a61968
Binary files /dev/null and b/modular_citadel/sound/vox/blue.ogg differ
diff --git a/modular_citadel/sound/vox/bottom.ogg b/modular_citadel/sound/vox/bottom.ogg
new file mode 100644
index 0000000000..b81c30477c
Binary files /dev/null and b/modular_citadel/sound/vox/bottom.ogg differ
diff --git a/modular_citadel/sound/vox/bravo.ogg b/modular_citadel/sound/vox/bravo.ogg
new file mode 100644
index 0000000000..df47058d5c
Binary files /dev/null and b/modular_citadel/sound/vox/bravo.ogg differ
diff --git a/modular_citadel/sound/vox/breach.ogg b/modular_citadel/sound/vox/breach.ogg
new file mode 100644
index 0000000000..3a4bae3f0d
Binary files /dev/null and b/modular_citadel/sound/vox/breach.ogg differ
diff --git a/modular_citadel/sound/vox/breached.ogg b/modular_citadel/sound/vox/breached.ogg
new file mode 100644
index 0000000000..0823bfc0d9
Binary files /dev/null and b/modular_citadel/sound/vox/breached.ogg differ
diff --git a/modular_citadel/sound/vox/break.ogg b/modular_citadel/sound/vox/break.ogg
new file mode 100644
index 0000000000..1bebe2b940
Binary files /dev/null and b/modular_citadel/sound/vox/break.ogg differ
diff --git a/modular_citadel/sound/vox/bridge.ogg b/modular_citadel/sound/vox/bridge.ogg
new file mode 100644
index 0000000000..8de8159b1e
Binary files /dev/null and b/modular_citadel/sound/vox/bridge.ogg differ
diff --git a/modular_citadel/sound/vox/bust.ogg b/modular_citadel/sound/vox/bust.ogg
new file mode 100644
index 0000000000..67622a5e4a
Binary files /dev/null and b/modular_citadel/sound/vox/bust.ogg differ
diff --git a/modular_citadel/sound/vox/but.ogg b/modular_citadel/sound/vox/but.ogg
new file mode 100644
index 0000000000..3c4d7172ef
Binary files /dev/null and b/modular_citadel/sound/vox/but.ogg differ
diff --git a/modular_citadel/sound/vox/button.ogg b/modular_citadel/sound/vox/button.ogg
new file mode 100644
index 0000000000..74639090f8
Binary files /dev/null and b/modular_citadel/sound/vox/button.ogg differ
diff --git a/modular_citadel/sound/vox/buzwarn.ogg b/modular_citadel/sound/vox/buzwarn.ogg
new file mode 100644
index 0000000000..34595dfe9b
Binary files /dev/null and b/modular_citadel/sound/vox/buzwarn.ogg differ
diff --git a/modular_citadel/sound/vox/bypass.ogg b/modular_citadel/sound/vox/bypass.ogg
new file mode 100644
index 0000000000..649fb0ca72
Binary files /dev/null and b/modular_citadel/sound/vox/bypass.ogg differ
diff --git a/modular_citadel/sound/vox/c.ogg b/modular_citadel/sound/vox/c.ogg
new file mode 100644
index 0000000000..99fc8eeb61
Binary files /dev/null and b/modular_citadel/sound/vox/c.ogg differ
diff --git a/modular_citadel/sound/vox/cable.ogg b/modular_citadel/sound/vox/cable.ogg
new file mode 100644
index 0000000000..8a03fec7a3
Binary files /dev/null and b/modular_citadel/sound/vox/cable.ogg differ
diff --git a/modular_citadel/sound/vox/call.ogg b/modular_citadel/sound/vox/call.ogg
new file mode 100644
index 0000000000..1cd702986d
Binary files /dev/null and b/modular_citadel/sound/vox/call.ogg differ
diff --git a/modular_citadel/sound/vox/called.ogg b/modular_citadel/sound/vox/called.ogg
new file mode 100644
index 0000000000..96c87be172
Binary files /dev/null and b/modular_citadel/sound/vox/called.ogg differ
diff --git a/modular_citadel/sound/vox/canal.ogg b/modular_citadel/sound/vox/canal.ogg
new file mode 100644
index 0000000000..0d4e92deb4
Binary files /dev/null and b/modular_citadel/sound/vox/canal.ogg differ
diff --git a/modular_citadel/sound/vox/cap.ogg b/modular_citadel/sound/vox/cap.ogg
new file mode 100644
index 0000000000..c229e6f5b1
Binary files /dev/null and b/modular_citadel/sound/vox/cap.ogg differ
diff --git a/modular_citadel/sound/vox/captain.ogg b/modular_citadel/sound/vox/captain.ogg
new file mode 100644
index 0000000000..69d2521e68
Binary files /dev/null and b/modular_citadel/sound/vox/captain.ogg differ
diff --git a/modular_citadel/sound/vox/capture.ogg b/modular_citadel/sound/vox/capture.ogg
new file mode 100644
index 0000000000..18eab2035b
Binary files /dev/null and b/modular_citadel/sound/vox/capture.ogg differ
diff --git a/modular_citadel/sound/vox/captured.ogg b/modular_citadel/sound/vox/captured.ogg
new file mode 100644
index 0000000000..fd6b652809
Binary files /dev/null and b/modular_citadel/sound/vox/captured.ogg differ
diff --git a/modular_citadel/sound/vox/ceiling.ogg b/modular_citadel/sound/vox/ceiling.ogg
new file mode 100644
index 0000000000..2f8d7eca0a
Binary files /dev/null and b/modular_citadel/sound/vox/ceiling.ogg differ
diff --git a/modular_citadel/sound/vox/celsius.ogg b/modular_citadel/sound/vox/celsius.ogg
new file mode 100644
index 0000000000..abb728c5c3
Binary files /dev/null and b/modular_citadel/sound/vox/celsius.ogg differ
diff --git a/modular_citadel/sound/vox/center.ogg b/modular_citadel/sound/vox/center.ogg
new file mode 100644
index 0000000000..1936e9190d
Binary files /dev/null and b/modular_citadel/sound/vox/center.ogg differ
diff --git a/modular_citadel/sound/vox/centi.ogg b/modular_citadel/sound/vox/centi.ogg
new file mode 100644
index 0000000000..63f9ce0aed
Binary files /dev/null and b/modular_citadel/sound/vox/centi.ogg differ
diff --git a/modular_citadel/sound/vox/central.ogg b/modular_citadel/sound/vox/central.ogg
new file mode 100644
index 0000000000..a805204243
Binary files /dev/null and b/modular_citadel/sound/vox/central.ogg differ
diff --git a/modular_citadel/sound/vox/chamber.ogg b/modular_citadel/sound/vox/chamber.ogg
new file mode 100644
index 0000000000..e3c77e927f
Binary files /dev/null and b/modular_citadel/sound/vox/chamber.ogg differ
diff --git a/modular_citadel/sound/vox/charlie.ogg b/modular_citadel/sound/vox/charlie.ogg
new file mode 100644
index 0000000000..bdadd74ca0
Binary files /dev/null and b/modular_citadel/sound/vox/charlie.ogg differ
diff --git a/modular_citadel/sound/vox/check.ogg b/modular_citadel/sound/vox/check.ogg
new file mode 100644
index 0000000000..f4a2a95de7
Binary files /dev/null and b/modular_citadel/sound/vox/check.ogg differ
diff --git a/modular_citadel/sound/vox/checkpoint.ogg b/modular_citadel/sound/vox/checkpoint.ogg
new file mode 100644
index 0000000000..aca98b09fa
Binary files /dev/null and b/modular_citadel/sound/vox/checkpoint.ogg differ
diff --git a/modular_citadel/sound/vox/chemical.ogg b/modular_citadel/sound/vox/chemical.ogg
new file mode 100644
index 0000000000..f7eae25c99
Binary files /dev/null and b/modular_citadel/sound/vox/chemical.ogg differ
diff --git a/modular_citadel/sound/vox/cleanup.ogg b/modular_citadel/sound/vox/cleanup.ogg
new file mode 100644
index 0000000000..2118f130cb
Binary files /dev/null and b/modular_citadel/sound/vox/cleanup.ogg differ
diff --git a/modular_citadel/sound/vox/clear.ogg b/modular_citadel/sound/vox/clear.ogg
new file mode 100644
index 0000000000..1b97835f0f
Binary files /dev/null and b/modular_citadel/sound/vox/clear.ogg differ
diff --git a/modular_citadel/sound/vox/clearance.ogg b/modular_citadel/sound/vox/clearance.ogg
new file mode 100644
index 0000000000..d2b641df40
Binary files /dev/null and b/modular_citadel/sound/vox/clearance.ogg differ
diff --git a/modular_citadel/sound/vox/close.ogg b/modular_citadel/sound/vox/close.ogg
new file mode 100644
index 0000000000..15e9fd315c
Binary files /dev/null and b/modular_citadel/sound/vox/close.ogg differ
diff --git a/modular_citadel/sound/vox/clown.ogg b/modular_citadel/sound/vox/clown.ogg
new file mode 100644
index 0000000000..e72f9703fd
Binary files /dev/null and b/modular_citadel/sound/vox/clown.ogg differ
diff --git a/modular_citadel/sound/vox/code.ogg b/modular_citadel/sound/vox/code.ogg
new file mode 100644
index 0000000000..cee2e4c036
Binary files /dev/null and b/modular_citadel/sound/vox/code.ogg differ
diff --git a/modular_citadel/sound/vox/coded.ogg b/modular_citadel/sound/vox/coded.ogg
new file mode 100644
index 0000000000..d4435296ae
Binary files /dev/null and b/modular_citadel/sound/vox/coded.ogg differ
diff --git a/modular_citadel/sound/vox/collider.ogg b/modular_citadel/sound/vox/collider.ogg
new file mode 100644
index 0000000000..a29bda0d17
Binary files /dev/null and b/modular_citadel/sound/vox/collider.ogg differ
diff --git a/modular_citadel/sound/vox/comma.ogg b/modular_citadel/sound/vox/comma.ogg
new file mode 100644
index 0000000000..a94221d0ed
Binary files /dev/null and b/modular_citadel/sound/vox/comma.ogg differ
diff --git a/modular_citadel/sound/vox/command.ogg b/modular_citadel/sound/vox/command.ogg
new file mode 100644
index 0000000000..cf6c32f736
Binary files /dev/null and b/modular_citadel/sound/vox/command.ogg differ
diff --git a/modular_citadel/sound/vox/communication.ogg b/modular_citadel/sound/vox/communication.ogg
new file mode 100644
index 0000000000..67ec74b30d
Binary files /dev/null and b/modular_citadel/sound/vox/communication.ogg differ
diff --git a/modular_citadel/sound/vox/complex.ogg b/modular_citadel/sound/vox/complex.ogg
new file mode 100644
index 0000000000..66dad5b30a
Binary files /dev/null and b/modular_citadel/sound/vox/complex.ogg differ
diff --git a/modular_citadel/sound/vox/computer.ogg b/modular_citadel/sound/vox/computer.ogg
new file mode 100644
index 0000000000..849cf4e96c
Binary files /dev/null and b/modular_citadel/sound/vox/computer.ogg differ
diff --git a/modular_citadel/sound/vox/condition.ogg b/modular_citadel/sound/vox/condition.ogg
new file mode 100644
index 0000000000..b16ea99736
Binary files /dev/null and b/modular_citadel/sound/vox/condition.ogg differ
diff --git a/modular_citadel/sound/vox/containment.ogg b/modular_citadel/sound/vox/containment.ogg
new file mode 100644
index 0000000000..0a1424a8c0
Binary files /dev/null and b/modular_citadel/sound/vox/containment.ogg differ
diff --git a/modular_citadel/sound/vox/contamination.ogg b/modular_citadel/sound/vox/contamination.ogg
new file mode 100644
index 0000000000..0d60c1c351
Binary files /dev/null and b/modular_citadel/sound/vox/contamination.ogg differ
diff --git a/modular_citadel/sound/vox/control.ogg b/modular_citadel/sound/vox/control.ogg
new file mode 100644
index 0000000000..7e4fae7220
Binary files /dev/null and b/modular_citadel/sound/vox/control.ogg differ
diff --git a/modular_citadel/sound/vox/coolant.ogg b/modular_citadel/sound/vox/coolant.ogg
new file mode 100644
index 0000000000..ca51223548
Binary files /dev/null and b/modular_citadel/sound/vox/coolant.ogg differ
diff --git a/modular_citadel/sound/vox/coomer.ogg b/modular_citadel/sound/vox/coomer.ogg
new file mode 100644
index 0000000000..eb684a6ab7
Binary files /dev/null and b/modular_citadel/sound/vox/coomer.ogg differ
diff --git a/modular_citadel/sound/vox/core.ogg b/modular_citadel/sound/vox/core.ogg
new file mode 100644
index 0000000000..6170255986
Binary files /dev/null and b/modular_citadel/sound/vox/core.ogg differ
diff --git a/modular_citadel/sound/vox/correct.ogg b/modular_citadel/sound/vox/correct.ogg
new file mode 100644
index 0000000000..99ca3efccc
Binary files /dev/null and b/modular_citadel/sound/vox/correct.ogg differ
diff --git a/modular_citadel/sound/vox/corridor.ogg b/modular_citadel/sound/vox/corridor.ogg
new file mode 100644
index 0000000000..e3ddeb39cc
Binary files /dev/null and b/modular_citadel/sound/vox/corridor.ogg differ
diff --git a/modular_citadel/sound/vox/crew.ogg b/modular_citadel/sound/vox/crew.ogg
new file mode 100644
index 0000000000..b63ce31874
Binary files /dev/null and b/modular_citadel/sound/vox/crew.ogg differ
diff --git a/modular_citadel/sound/vox/cross.ogg b/modular_citadel/sound/vox/cross.ogg
new file mode 100644
index 0000000000..ffd9f4161d
Binary files /dev/null and b/modular_citadel/sound/vox/cross.ogg differ
diff --git a/modular_citadel/sound/vox/cryogenic.ogg b/modular_citadel/sound/vox/cryogenic.ogg
new file mode 100644
index 0000000000..def31fe7c0
Binary files /dev/null and b/modular_citadel/sound/vox/cryogenic.ogg differ
diff --git a/modular_citadel/sound/vox/d.ogg b/modular_citadel/sound/vox/d.ogg
new file mode 100644
index 0000000000..08b85fc9eb
Binary files /dev/null and b/modular_citadel/sound/vox/d.ogg differ
diff --git a/modular_citadel/sound/vox/dadeda.ogg b/modular_citadel/sound/vox/dadeda.ogg
new file mode 100644
index 0000000000..9fd19f577c
Binary files /dev/null and b/modular_citadel/sound/vox/dadeda.ogg differ
diff --git a/modular_citadel/sound/vox/damage.ogg b/modular_citadel/sound/vox/damage.ogg
new file mode 100644
index 0000000000..d45cb0b532
Binary files /dev/null and b/modular_citadel/sound/vox/damage.ogg differ
diff --git a/modular_citadel/sound/vox/damaged.ogg b/modular_citadel/sound/vox/damaged.ogg
new file mode 100644
index 0000000000..cec2617cd2
Binary files /dev/null and b/modular_citadel/sound/vox/damaged.ogg differ
diff --git a/modular_citadel/sound/vox/danger.ogg b/modular_citadel/sound/vox/danger.ogg
new file mode 100644
index 0000000000..50bce6a5a5
Binary files /dev/null and b/modular_citadel/sound/vox/danger.ogg differ
diff --git a/modular_citadel/sound/vox/day.ogg b/modular_citadel/sound/vox/day.ogg
new file mode 100644
index 0000000000..c11c1b696c
Binary files /dev/null and b/modular_citadel/sound/vox/day.ogg differ
diff --git a/modular_citadel/sound/vox/deactivated.ogg b/modular_citadel/sound/vox/deactivated.ogg
new file mode 100644
index 0000000000..2c700cf4a7
Binary files /dev/null and b/modular_citadel/sound/vox/deactivated.ogg differ
diff --git a/modular_citadel/sound/vox/decompression.ogg b/modular_citadel/sound/vox/decompression.ogg
new file mode 100644
index 0000000000..39ba52f36a
Binary files /dev/null and b/modular_citadel/sound/vox/decompression.ogg differ
diff --git a/modular_citadel/sound/vox/decontamination.ogg b/modular_citadel/sound/vox/decontamination.ogg
new file mode 100644
index 0000000000..2115ec8aa4
Binary files /dev/null and b/modular_citadel/sound/vox/decontamination.ogg differ
diff --git a/modular_citadel/sound/vox/deeoo.ogg b/modular_citadel/sound/vox/deeoo.ogg
new file mode 100644
index 0000000000..22197de5e6
Binary files /dev/null and b/modular_citadel/sound/vox/deeoo.ogg differ
diff --git a/modular_citadel/sound/vox/defense.ogg b/modular_citadel/sound/vox/defense.ogg
new file mode 100644
index 0000000000..dc00256e0f
Binary files /dev/null and b/modular_citadel/sound/vox/defense.ogg differ
diff --git a/modular_citadel/sound/vox/degrees.ogg b/modular_citadel/sound/vox/degrees.ogg
new file mode 100644
index 0000000000..eb640ca08c
Binary files /dev/null and b/modular_citadel/sound/vox/degrees.ogg differ
diff --git a/modular_citadel/sound/vox/delta.ogg b/modular_citadel/sound/vox/delta.ogg
new file mode 100644
index 0000000000..93cbe2bdb6
Binary files /dev/null and b/modular_citadel/sound/vox/delta.ogg differ
diff --git a/modular_citadel/sound/vox/denied.ogg b/modular_citadel/sound/vox/denied.ogg
new file mode 100644
index 0000000000..8ef3366dbc
Binary files /dev/null and b/modular_citadel/sound/vox/denied.ogg differ
diff --git a/modular_citadel/sound/vox/deploy.ogg b/modular_citadel/sound/vox/deploy.ogg
new file mode 100644
index 0000000000..71bd4c4d7d
Binary files /dev/null and b/modular_citadel/sound/vox/deploy.ogg differ
diff --git a/modular_citadel/sound/vox/deployed.ogg b/modular_citadel/sound/vox/deployed.ogg
new file mode 100644
index 0000000000..d21fa814ba
Binary files /dev/null and b/modular_citadel/sound/vox/deployed.ogg differ
diff --git a/modular_citadel/sound/vox/destroy.ogg b/modular_citadel/sound/vox/destroy.ogg
new file mode 100644
index 0000000000..954d474a07
Binary files /dev/null and b/modular_citadel/sound/vox/destroy.ogg differ
diff --git a/modular_citadel/sound/vox/destroyed.ogg b/modular_citadel/sound/vox/destroyed.ogg
new file mode 100644
index 0000000000..cf5f20bf84
Binary files /dev/null and b/modular_citadel/sound/vox/destroyed.ogg differ
diff --git a/modular_citadel/sound/vox/detain.ogg b/modular_citadel/sound/vox/detain.ogg
new file mode 100644
index 0000000000..98a6d34c2f
Binary files /dev/null and b/modular_citadel/sound/vox/detain.ogg differ
diff --git a/modular_citadel/sound/vox/detected.ogg b/modular_citadel/sound/vox/detected.ogg
new file mode 100644
index 0000000000..80704064a4
Binary files /dev/null and b/modular_citadel/sound/vox/detected.ogg differ
diff --git a/modular_citadel/sound/vox/detonation.ogg b/modular_citadel/sound/vox/detonation.ogg
new file mode 100644
index 0000000000..a6c64c331c
Binary files /dev/null and b/modular_citadel/sound/vox/detonation.ogg differ
diff --git a/modular_citadel/sound/vox/device.ogg b/modular_citadel/sound/vox/device.ogg
new file mode 100644
index 0000000000..3f1b4905df
Binary files /dev/null and b/modular_citadel/sound/vox/device.ogg differ
diff --git a/modular_citadel/sound/vox/did.ogg b/modular_citadel/sound/vox/did.ogg
new file mode 100644
index 0000000000..966e8a3a13
Binary files /dev/null and b/modular_citadel/sound/vox/did.ogg differ
diff --git a/modular_citadel/sound/vox/die.ogg b/modular_citadel/sound/vox/die.ogg
new file mode 100644
index 0000000000..b2f99b4152
Binary files /dev/null and b/modular_citadel/sound/vox/die.ogg differ
diff --git a/modular_citadel/sound/vox/dimensional.ogg b/modular_citadel/sound/vox/dimensional.ogg
new file mode 100644
index 0000000000..a4ed638db0
Binary files /dev/null and b/modular_citadel/sound/vox/dimensional.ogg differ
diff --git a/modular_citadel/sound/vox/dirt.ogg b/modular_citadel/sound/vox/dirt.ogg
new file mode 100644
index 0000000000..b175b93205
Binary files /dev/null and b/modular_citadel/sound/vox/dirt.ogg differ
diff --git a/modular_citadel/sound/vox/disengaged.ogg b/modular_citadel/sound/vox/disengaged.ogg
new file mode 100644
index 0000000000..eb75ab975b
Binary files /dev/null and b/modular_citadel/sound/vox/disengaged.ogg differ
diff --git a/modular_citadel/sound/vox/dish.ogg b/modular_citadel/sound/vox/dish.ogg
new file mode 100644
index 0000000000..3b0f1f58ce
Binary files /dev/null and b/modular_citadel/sound/vox/dish.ogg differ
diff --git a/modular_citadel/sound/vox/disposal.ogg b/modular_citadel/sound/vox/disposal.ogg
new file mode 100644
index 0000000000..1a4c1f8bd1
Binary files /dev/null and b/modular_citadel/sound/vox/disposal.ogg differ
diff --git a/modular_citadel/sound/vox/distance.ogg b/modular_citadel/sound/vox/distance.ogg
new file mode 100644
index 0000000000..8bcec9ac7c
Binary files /dev/null and b/modular_citadel/sound/vox/distance.ogg differ
diff --git a/modular_citadel/sound/vox/distortion.ogg b/modular_citadel/sound/vox/distortion.ogg
new file mode 100644
index 0000000000..7ee3a5f560
Binary files /dev/null and b/modular_citadel/sound/vox/distortion.ogg differ
diff --git a/modular_citadel/sound/vox/do.ogg b/modular_citadel/sound/vox/do.ogg
new file mode 100644
index 0000000000..7202691b87
Binary files /dev/null and b/modular_citadel/sound/vox/do.ogg differ
diff --git a/modular_citadel/sound/vox/doctor.ogg b/modular_citadel/sound/vox/doctor.ogg
new file mode 100644
index 0000000000..adbbfab77a
Binary files /dev/null and b/modular_citadel/sound/vox/doctor.ogg differ
diff --git a/modular_citadel/sound/vox/doop.ogg b/modular_citadel/sound/vox/doop.ogg
new file mode 100644
index 0000000000..b497a8594d
Binary files /dev/null and b/modular_citadel/sound/vox/doop.ogg differ
diff --git a/modular_citadel/sound/vox/door.ogg b/modular_citadel/sound/vox/door.ogg
new file mode 100644
index 0000000000..db389b4eb9
Binary files /dev/null and b/modular_citadel/sound/vox/door.ogg differ
diff --git a/modular_citadel/sound/vox/down.ogg b/modular_citadel/sound/vox/down.ogg
new file mode 100644
index 0000000000..e16b0249dd
Binary files /dev/null and b/modular_citadel/sound/vox/down.ogg differ
diff --git a/modular_citadel/sound/vox/dual.ogg b/modular_citadel/sound/vox/dual.ogg
new file mode 100644
index 0000000000..d8833faf9b
Binary files /dev/null and b/modular_citadel/sound/vox/dual.ogg differ
diff --git a/modular_citadel/sound/vox/duct.ogg b/modular_citadel/sound/vox/duct.ogg
new file mode 100644
index 0000000000..23379f6cc2
Binary files /dev/null and b/modular_citadel/sound/vox/duct.ogg differ
diff --git a/modular_citadel/sound/vox/e.ogg b/modular_citadel/sound/vox/e.ogg
new file mode 100644
index 0000000000..105ea13ef2
Binary files /dev/null and b/modular_citadel/sound/vox/e.ogg differ
diff --git a/modular_citadel/sound/vox/east.ogg b/modular_citadel/sound/vox/east.ogg
new file mode 100644
index 0000000000..9e69856edb
Binary files /dev/null and b/modular_citadel/sound/vox/east.ogg differ
diff --git a/modular_citadel/sound/vox/echo.ogg b/modular_citadel/sound/vox/echo.ogg
new file mode 100644
index 0000000000..3ee16750a4
Binary files /dev/null and b/modular_citadel/sound/vox/echo.ogg differ
diff --git a/modular_citadel/sound/vox/ed.ogg b/modular_citadel/sound/vox/ed.ogg
new file mode 100644
index 0000000000..094bd4f3ba
Binary files /dev/null and b/modular_citadel/sound/vox/ed.ogg differ
diff --git a/modular_citadel/sound/vox/effect.ogg b/modular_citadel/sound/vox/effect.ogg
new file mode 100644
index 0000000000..01a77a1bba
Binary files /dev/null and b/modular_citadel/sound/vox/effect.ogg differ
diff --git a/modular_citadel/sound/vox/egress.ogg b/modular_citadel/sound/vox/egress.ogg
new file mode 100644
index 0000000000..6da62c754a
Binary files /dev/null and b/modular_citadel/sound/vox/egress.ogg differ
diff --git a/modular_citadel/sound/vox/eight.ogg b/modular_citadel/sound/vox/eight.ogg
new file mode 100644
index 0000000000..7c64ba326b
Binary files /dev/null and b/modular_citadel/sound/vox/eight.ogg differ
diff --git a/modular_citadel/sound/vox/eighteen.ogg b/modular_citadel/sound/vox/eighteen.ogg
new file mode 100644
index 0000000000..73330bfaa2
Binary files /dev/null and b/modular_citadel/sound/vox/eighteen.ogg differ
diff --git a/modular_citadel/sound/vox/eighty.ogg b/modular_citadel/sound/vox/eighty.ogg
new file mode 100644
index 0000000000..c190b69e02
Binary files /dev/null and b/modular_citadel/sound/vox/eighty.ogg differ
diff --git a/modular_citadel/sound/vox/electric.ogg b/modular_citadel/sound/vox/electric.ogg
new file mode 100644
index 0000000000..7d7154b350
Binary files /dev/null and b/modular_citadel/sound/vox/electric.ogg differ
diff --git a/modular_citadel/sound/vox/electromagnetic.ogg b/modular_citadel/sound/vox/electromagnetic.ogg
new file mode 100644
index 0000000000..160725e8c0
Binary files /dev/null and b/modular_citadel/sound/vox/electromagnetic.ogg differ
diff --git a/modular_citadel/sound/vox/elevator.ogg b/modular_citadel/sound/vox/elevator.ogg
new file mode 100644
index 0000000000..bcafc3ce3f
Binary files /dev/null and b/modular_citadel/sound/vox/elevator.ogg differ
diff --git a/modular_citadel/sound/vox/eleven.ogg b/modular_citadel/sound/vox/eleven.ogg
new file mode 100644
index 0000000000..6607692e1d
Binary files /dev/null and b/modular_citadel/sound/vox/eleven.ogg differ
diff --git a/modular_citadel/sound/vox/eliminate.ogg b/modular_citadel/sound/vox/eliminate.ogg
new file mode 100644
index 0000000000..2e81f5eb6c
Binary files /dev/null and b/modular_citadel/sound/vox/eliminate.ogg differ
diff --git a/modular_citadel/sound/vox/emergency.ogg b/modular_citadel/sound/vox/emergency.ogg
new file mode 100644
index 0000000000..5d2e068944
Binary files /dev/null and b/modular_citadel/sound/vox/emergency.ogg differ
diff --git a/modular_citadel/sound/vox/enemy.ogg b/modular_citadel/sound/vox/enemy.ogg
new file mode 100644
index 0000000000..ecee923235
Binary files /dev/null and b/modular_citadel/sound/vox/enemy.ogg differ
diff --git a/modular_citadel/sound/vox/energy.ogg b/modular_citadel/sound/vox/energy.ogg
new file mode 100644
index 0000000000..82d07e95dd
Binary files /dev/null and b/modular_citadel/sound/vox/energy.ogg differ
diff --git a/modular_citadel/sound/vox/engage.ogg b/modular_citadel/sound/vox/engage.ogg
new file mode 100644
index 0000000000..7e1cf2e625
Binary files /dev/null and b/modular_citadel/sound/vox/engage.ogg differ
diff --git a/modular_citadel/sound/vox/engaged.ogg b/modular_citadel/sound/vox/engaged.ogg
new file mode 100644
index 0000000000..0e8196b026
Binary files /dev/null and b/modular_citadel/sound/vox/engaged.ogg differ
diff --git a/modular_citadel/sound/vox/engine.ogg b/modular_citadel/sound/vox/engine.ogg
new file mode 100644
index 0000000000..0ed1b4bd80
Binary files /dev/null and b/modular_citadel/sound/vox/engine.ogg differ
diff --git a/modular_citadel/sound/vox/enter.ogg b/modular_citadel/sound/vox/enter.ogg
new file mode 100644
index 0000000000..d7392eeada
Binary files /dev/null and b/modular_citadel/sound/vox/enter.ogg differ
diff --git a/modular_citadel/sound/vox/entry.ogg b/modular_citadel/sound/vox/entry.ogg
new file mode 100644
index 0000000000..1ef6b14442
Binary files /dev/null and b/modular_citadel/sound/vox/entry.ogg differ
diff --git a/modular_citadel/sound/vox/environment.ogg b/modular_citadel/sound/vox/environment.ogg
new file mode 100644
index 0000000000..d05ba3106a
Binary files /dev/null and b/modular_citadel/sound/vox/environment.ogg differ
diff --git a/modular_citadel/sound/vox/error.ogg b/modular_citadel/sound/vox/error.ogg
new file mode 100644
index 0000000000..237191732a
Binary files /dev/null and b/modular_citadel/sound/vox/error.ogg differ
diff --git a/modular_citadel/sound/vox/escape.ogg b/modular_citadel/sound/vox/escape.ogg
new file mode 100644
index 0000000000..15e1181ac6
Binary files /dev/null and b/modular_citadel/sound/vox/escape.ogg differ
diff --git a/modular_citadel/sound/vox/evacuate.ogg b/modular_citadel/sound/vox/evacuate.ogg
new file mode 100644
index 0000000000..d0d755f1ba
Binary files /dev/null and b/modular_citadel/sound/vox/evacuate.ogg differ
diff --git a/modular_citadel/sound/vox/exchange.ogg b/modular_citadel/sound/vox/exchange.ogg
new file mode 100644
index 0000000000..d69eac774a
Binary files /dev/null and b/modular_citadel/sound/vox/exchange.ogg differ
diff --git a/modular_citadel/sound/vox/exit.ogg b/modular_citadel/sound/vox/exit.ogg
new file mode 100644
index 0000000000..a201b6b76b
Binary files /dev/null and b/modular_citadel/sound/vox/exit.ogg differ
diff --git a/modular_citadel/sound/vox/expect.ogg b/modular_citadel/sound/vox/expect.ogg
new file mode 100644
index 0000000000..95e559fdd3
Binary files /dev/null and b/modular_citadel/sound/vox/expect.ogg differ
diff --git a/modular_citadel/sound/vox/experiment.ogg b/modular_citadel/sound/vox/experiment.ogg
new file mode 100644
index 0000000000..34ef253e69
Binary files /dev/null and b/modular_citadel/sound/vox/experiment.ogg differ
diff --git a/modular_citadel/sound/vox/experimental.ogg b/modular_citadel/sound/vox/experimental.ogg
new file mode 100644
index 0000000000..6635998222
Binary files /dev/null and b/modular_citadel/sound/vox/experimental.ogg differ
diff --git a/modular_citadel/sound/vox/explode.ogg b/modular_citadel/sound/vox/explode.ogg
new file mode 100644
index 0000000000..16b38926e4
Binary files /dev/null and b/modular_citadel/sound/vox/explode.ogg differ
diff --git a/modular_citadel/sound/vox/explosion.ogg b/modular_citadel/sound/vox/explosion.ogg
new file mode 100644
index 0000000000..ede66453bd
Binary files /dev/null and b/modular_citadel/sound/vox/explosion.ogg differ
diff --git a/modular_citadel/sound/vox/exposure.ogg b/modular_citadel/sound/vox/exposure.ogg
new file mode 100644
index 0000000000..d2f66ca1ba
Binary files /dev/null and b/modular_citadel/sound/vox/exposure.ogg differ
diff --git a/modular_citadel/sound/vox/exterminate.ogg b/modular_citadel/sound/vox/exterminate.ogg
new file mode 100644
index 0000000000..34be77f8e2
Binary files /dev/null and b/modular_citadel/sound/vox/exterminate.ogg differ
diff --git a/modular_citadel/sound/vox/extinguish.ogg b/modular_citadel/sound/vox/extinguish.ogg
new file mode 100644
index 0000000000..c003ff4547
Binary files /dev/null and b/modular_citadel/sound/vox/extinguish.ogg differ
diff --git a/modular_citadel/sound/vox/extinguisher.ogg b/modular_citadel/sound/vox/extinguisher.ogg
new file mode 100644
index 0000000000..d23b898014
Binary files /dev/null and b/modular_citadel/sound/vox/extinguisher.ogg differ
diff --git a/modular_citadel/sound/vox/extreme.ogg b/modular_citadel/sound/vox/extreme.ogg
new file mode 100644
index 0000000000..c3f5a2d9f0
Binary files /dev/null and b/modular_citadel/sound/vox/extreme.ogg differ
diff --git a/modular_citadel/sound/vox/f.ogg b/modular_citadel/sound/vox/f.ogg
new file mode 100644
index 0000000000..344734986f
Binary files /dev/null and b/modular_citadel/sound/vox/f.ogg differ
diff --git a/modular_citadel/sound/vox/face.ogg b/modular_citadel/sound/vox/face.ogg
new file mode 100644
index 0000000000..acdd8722ef
Binary files /dev/null and b/modular_citadel/sound/vox/face.ogg differ
diff --git a/modular_citadel/sound/vox/facility.ogg b/modular_citadel/sound/vox/facility.ogg
new file mode 100644
index 0000000000..43649febb0
Binary files /dev/null and b/modular_citadel/sound/vox/facility.ogg differ
diff --git a/modular_citadel/sound/vox/fahrenheit.ogg b/modular_citadel/sound/vox/fahrenheit.ogg
new file mode 100644
index 0000000000..4730726ea4
Binary files /dev/null and b/modular_citadel/sound/vox/fahrenheit.ogg differ
diff --git a/modular_citadel/sound/vox/failed.ogg b/modular_citadel/sound/vox/failed.ogg
new file mode 100644
index 0000000000..f801962345
Binary files /dev/null and b/modular_citadel/sound/vox/failed.ogg differ
diff --git a/modular_citadel/sound/vox/failure.ogg b/modular_citadel/sound/vox/failure.ogg
new file mode 100644
index 0000000000..e9b5808f27
Binary files /dev/null and b/modular_citadel/sound/vox/failure.ogg differ
diff --git a/modular_citadel/sound/vox/farthest.ogg b/modular_citadel/sound/vox/farthest.ogg
new file mode 100644
index 0000000000..3d18f669b1
Binary files /dev/null and b/modular_citadel/sound/vox/farthest.ogg differ
diff --git a/modular_citadel/sound/vox/fast.ogg b/modular_citadel/sound/vox/fast.ogg
new file mode 100644
index 0000000000..dbf82c32a4
Binary files /dev/null and b/modular_citadel/sound/vox/fast.ogg differ
diff --git a/modular_citadel/sound/vox/feet.ogg b/modular_citadel/sound/vox/feet.ogg
new file mode 100644
index 0000000000..eba093e73d
Binary files /dev/null and b/modular_citadel/sound/vox/feet.ogg differ
diff --git a/modular_citadel/sound/vox/field.ogg b/modular_citadel/sound/vox/field.ogg
new file mode 100644
index 0000000000..bba79e6ddd
Binary files /dev/null and b/modular_citadel/sound/vox/field.ogg differ
diff --git a/modular_citadel/sound/vox/fifteen.ogg b/modular_citadel/sound/vox/fifteen.ogg
new file mode 100644
index 0000000000..60eca844ae
Binary files /dev/null and b/modular_citadel/sound/vox/fifteen.ogg differ
diff --git a/modular_citadel/sound/vox/fifth.ogg b/modular_citadel/sound/vox/fifth.ogg
new file mode 100644
index 0000000000..d6a76567d2
Binary files /dev/null and b/modular_citadel/sound/vox/fifth.ogg differ
diff --git a/modular_citadel/sound/vox/fifty.ogg b/modular_citadel/sound/vox/fifty.ogg
new file mode 100644
index 0000000000..30fd60072b
Binary files /dev/null and b/modular_citadel/sound/vox/fifty.ogg differ
diff --git a/modular_citadel/sound/vox/final.ogg b/modular_citadel/sound/vox/final.ogg
new file mode 100644
index 0000000000..d06bef9fc2
Binary files /dev/null and b/modular_citadel/sound/vox/final.ogg differ
diff --git a/modular_citadel/sound/vox/fine.ogg b/modular_citadel/sound/vox/fine.ogg
new file mode 100644
index 0000000000..3445a9ea54
Binary files /dev/null and b/modular_citadel/sound/vox/fine.ogg differ
diff --git a/modular_citadel/sound/vox/fire.ogg b/modular_citadel/sound/vox/fire.ogg
new file mode 100644
index 0000000000..094043b953
Binary files /dev/null and b/modular_citadel/sound/vox/fire.ogg differ
diff --git a/modular_citadel/sound/vox/first.ogg b/modular_citadel/sound/vox/first.ogg
new file mode 100644
index 0000000000..84977e4eb7
Binary files /dev/null and b/modular_citadel/sound/vox/first.ogg differ
diff --git a/modular_citadel/sound/vox/five.ogg b/modular_citadel/sound/vox/five.ogg
new file mode 100644
index 0000000000..0a28539c34
Binary files /dev/null and b/modular_citadel/sound/vox/five.ogg differ
diff --git a/modular_citadel/sound/vox/flag.ogg b/modular_citadel/sound/vox/flag.ogg
new file mode 100644
index 0000000000..0d13587d60
Binary files /dev/null and b/modular_citadel/sound/vox/flag.ogg differ
diff --git a/modular_citadel/sound/vox/flooding.ogg b/modular_citadel/sound/vox/flooding.ogg
new file mode 100644
index 0000000000..c32bf475f5
Binary files /dev/null and b/modular_citadel/sound/vox/flooding.ogg differ
diff --git a/modular_citadel/sound/vox/floor.ogg b/modular_citadel/sound/vox/floor.ogg
new file mode 100644
index 0000000000..14d4a84131
Binary files /dev/null and b/modular_citadel/sound/vox/floor.ogg differ
diff --git a/modular_citadel/sound/vox/fool.ogg b/modular_citadel/sound/vox/fool.ogg
new file mode 100644
index 0000000000..965251cc4a
Binary files /dev/null and b/modular_citadel/sound/vox/fool.ogg differ
diff --git a/modular_citadel/sound/vox/for.ogg b/modular_citadel/sound/vox/for.ogg
new file mode 100644
index 0000000000..b69a8f4b6c
Binary files /dev/null and b/modular_citadel/sound/vox/for.ogg differ
diff --git a/modular_citadel/sound/vox/forbidden.ogg b/modular_citadel/sound/vox/forbidden.ogg
new file mode 100644
index 0000000000..23daae8496
Binary files /dev/null and b/modular_citadel/sound/vox/forbidden.ogg differ
diff --git a/modular_citadel/sound/vox/force.ogg b/modular_citadel/sound/vox/force.ogg
new file mode 100644
index 0000000000..ff4cb84c3a
Binary files /dev/null and b/modular_citadel/sound/vox/force.ogg differ
diff --git a/modular_citadel/sound/vox/forms.ogg b/modular_citadel/sound/vox/forms.ogg
new file mode 100644
index 0000000000..7ef1862bb6
Binary files /dev/null and b/modular_citadel/sound/vox/forms.ogg differ
diff --git a/modular_citadel/sound/vox/found.ogg b/modular_citadel/sound/vox/found.ogg
new file mode 100644
index 0000000000..660a2f8520
Binary files /dev/null and b/modular_citadel/sound/vox/found.ogg differ
diff --git a/modular_citadel/sound/vox/four.ogg b/modular_citadel/sound/vox/four.ogg
new file mode 100644
index 0000000000..df8adfcd31
Binary files /dev/null and b/modular_citadel/sound/vox/four.ogg differ
diff --git a/modular_citadel/sound/vox/fourteen.ogg b/modular_citadel/sound/vox/fourteen.ogg
new file mode 100644
index 0000000000..21b61a0fd5
Binary files /dev/null and b/modular_citadel/sound/vox/fourteen.ogg differ
diff --git a/modular_citadel/sound/vox/fourth.ogg b/modular_citadel/sound/vox/fourth.ogg
new file mode 100644
index 0000000000..986102ea54
Binary files /dev/null and b/modular_citadel/sound/vox/fourth.ogg differ
diff --git a/modular_citadel/sound/vox/fourty.ogg b/modular_citadel/sound/vox/fourty.ogg
new file mode 100644
index 0000000000..b0edb0a7c7
Binary files /dev/null and b/modular_citadel/sound/vox/fourty.ogg differ
diff --git a/modular_citadel/sound/vox/foxtrot.ogg b/modular_citadel/sound/vox/foxtrot.ogg
new file mode 100644
index 0000000000..3be534fd22
Binary files /dev/null and b/modular_citadel/sound/vox/foxtrot.ogg differ
diff --git a/modular_citadel/sound/vox/freeman.ogg b/modular_citadel/sound/vox/freeman.ogg
new file mode 100644
index 0000000000..b2bc590942
Binary files /dev/null and b/modular_citadel/sound/vox/freeman.ogg differ
diff --git a/modular_citadel/sound/vox/freezer.ogg b/modular_citadel/sound/vox/freezer.ogg
new file mode 100644
index 0000000000..6bb30ad953
Binary files /dev/null and b/modular_citadel/sound/vox/freezer.ogg differ
diff --git a/modular_citadel/sound/vox/from.ogg b/modular_citadel/sound/vox/from.ogg
new file mode 100644
index 0000000000..535de03d14
Binary files /dev/null and b/modular_citadel/sound/vox/from.ogg differ
diff --git a/modular_citadel/sound/vox/front.ogg b/modular_citadel/sound/vox/front.ogg
new file mode 100644
index 0000000000..f1755a788b
Binary files /dev/null and b/modular_citadel/sound/vox/front.ogg differ
diff --git a/modular_citadel/sound/vox/fuel.ogg b/modular_citadel/sound/vox/fuel.ogg
new file mode 100644
index 0000000000..53d7889314
Binary files /dev/null and b/modular_citadel/sound/vox/fuel.ogg differ
diff --git a/modular_citadel/sound/vox/g.ogg b/modular_citadel/sound/vox/g.ogg
new file mode 100644
index 0000000000..a3702ca3e5
Binary files /dev/null and b/modular_citadel/sound/vox/g.ogg differ
diff --git a/modular_citadel/sound/vox/gay.ogg b/modular_citadel/sound/vox/gay.ogg
new file mode 100644
index 0000000000..a70d05716b
Binary files /dev/null and b/modular_citadel/sound/vox/gay.ogg differ
diff --git a/modular_citadel/sound/vox/get.ogg b/modular_citadel/sound/vox/get.ogg
new file mode 100644
index 0000000000..b5c0d47cd5
Binary files /dev/null and b/modular_citadel/sound/vox/get.ogg differ
diff --git a/modular_citadel/sound/vox/go.ogg b/modular_citadel/sound/vox/go.ogg
new file mode 100644
index 0000000000..f7dcb56f8e
Binary files /dev/null and b/modular_citadel/sound/vox/go.ogg differ
diff --git a/modular_citadel/sound/vox/going.ogg b/modular_citadel/sound/vox/going.ogg
new file mode 100644
index 0000000000..3ff4fe5427
Binary files /dev/null and b/modular_citadel/sound/vox/going.ogg differ
diff --git a/modular_citadel/sound/vox/good.ogg b/modular_citadel/sound/vox/good.ogg
new file mode 100644
index 0000000000..c8115bb5fb
Binary files /dev/null and b/modular_citadel/sound/vox/good.ogg differ
diff --git a/modular_citadel/sound/vox/goodbye.ogg b/modular_citadel/sound/vox/goodbye.ogg
new file mode 100644
index 0000000000..e793ba2fa6
Binary files /dev/null and b/modular_citadel/sound/vox/goodbye.ogg differ
diff --git a/modular_citadel/sound/vox/gordon.ogg b/modular_citadel/sound/vox/gordon.ogg
new file mode 100644
index 0000000000..5d5ab4ddba
Binary files /dev/null and b/modular_citadel/sound/vox/gordon.ogg differ
diff --git a/modular_citadel/sound/vox/got.ogg b/modular_citadel/sound/vox/got.ogg
new file mode 100644
index 0000000000..3d712c9fc4
Binary files /dev/null and b/modular_citadel/sound/vox/got.ogg differ
diff --git a/modular_citadel/sound/vox/government.ogg b/modular_citadel/sound/vox/government.ogg
new file mode 100644
index 0000000000..830b59bac2
Binary files /dev/null and b/modular_citadel/sound/vox/government.ogg differ
diff --git a/modular_citadel/sound/vox/granted.ogg b/modular_citadel/sound/vox/granted.ogg
new file mode 100644
index 0000000000..4dae196cf6
Binary files /dev/null and b/modular_citadel/sound/vox/granted.ogg differ
diff --git a/modular_citadel/sound/vox/great.ogg b/modular_citadel/sound/vox/great.ogg
new file mode 100644
index 0000000000..d820a56179
Binary files /dev/null and b/modular_citadel/sound/vox/great.ogg differ
diff --git a/modular_citadel/sound/vox/green.ogg b/modular_citadel/sound/vox/green.ogg
new file mode 100644
index 0000000000..05f6e6b0fa
Binary files /dev/null and b/modular_citadel/sound/vox/green.ogg differ
diff --git a/modular_citadel/sound/vox/grenade.ogg b/modular_citadel/sound/vox/grenade.ogg
new file mode 100644
index 0000000000..971a5d515b
Binary files /dev/null and b/modular_citadel/sound/vox/grenade.ogg differ
diff --git a/modular_citadel/sound/vox/guard.ogg b/modular_citadel/sound/vox/guard.ogg
new file mode 100644
index 0000000000..795ba08486
Binary files /dev/null and b/modular_citadel/sound/vox/guard.ogg differ
diff --git a/modular_citadel/sound/vox/gulf.ogg b/modular_citadel/sound/vox/gulf.ogg
new file mode 100644
index 0000000000..87cc1f953d
Binary files /dev/null and b/modular_citadel/sound/vox/gulf.ogg differ
diff --git a/modular_citadel/sound/vox/gun.ogg b/modular_citadel/sound/vox/gun.ogg
new file mode 100644
index 0000000000..472620ea76
Binary files /dev/null and b/modular_citadel/sound/vox/gun.ogg differ
diff --git a/modular_citadel/sound/vox/guthrie.ogg b/modular_citadel/sound/vox/guthrie.ogg
new file mode 100644
index 0000000000..b87c5f6cb1
Binary files /dev/null and b/modular_citadel/sound/vox/guthrie.ogg differ
diff --git a/modular_citadel/sound/vox/handling.ogg b/modular_citadel/sound/vox/handling.ogg
new file mode 100644
index 0000000000..be05e82d75
Binary files /dev/null and b/modular_citadel/sound/vox/handling.ogg differ
diff --git a/modular_citadel/sound/vox/hangar.ogg b/modular_citadel/sound/vox/hangar.ogg
new file mode 100644
index 0000000000..d6fe4084ae
Binary files /dev/null and b/modular_citadel/sound/vox/hangar.ogg differ
diff --git a/modular_citadel/sound/vox/has.ogg b/modular_citadel/sound/vox/has.ogg
new file mode 100644
index 0000000000..055cb0dc15
Binary files /dev/null and b/modular_citadel/sound/vox/has.ogg differ
diff --git a/modular_citadel/sound/vox/have.ogg b/modular_citadel/sound/vox/have.ogg
new file mode 100644
index 0000000000..c514165582
Binary files /dev/null and b/modular_citadel/sound/vox/have.ogg differ
diff --git a/modular_citadel/sound/vox/hazard.ogg b/modular_citadel/sound/vox/hazard.ogg
new file mode 100644
index 0000000000..032b1fb251
Binary files /dev/null and b/modular_citadel/sound/vox/hazard.ogg differ
diff --git a/modular_citadel/sound/vox/head.ogg b/modular_citadel/sound/vox/head.ogg
new file mode 100644
index 0000000000..e4902fcc6f
Binary files /dev/null and b/modular_citadel/sound/vox/head.ogg differ
diff --git a/modular_citadel/sound/vox/health.ogg b/modular_citadel/sound/vox/health.ogg
new file mode 100644
index 0000000000..c11ad1bcf2
Binary files /dev/null and b/modular_citadel/sound/vox/health.ogg differ
diff --git a/modular_citadel/sound/vox/heat.ogg b/modular_citadel/sound/vox/heat.ogg
new file mode 100644
index 0000000000..a6c0752ab8
Binary files /dev/null and b/modular_citadel/sound/vox/heat.ogg differ
diff --git a/modular_citadel/sound/vox/helicopter.ogg b/modular_citadel/sound/vox/helicopter.ogg
new file mode 100644
index 0000000000..6bfe6466b2
Binary files /dev/null and b/modular_citadel/sound/vox/helicopter.ogg differ
diff --git a/modular_citadel/sound/vox/helium.ogg b/modular_citadel/sound/vox/helium.ogg
new file mode 100644
index 0000000000..4a5c8326a5
Binary files /dev/null and b/modular_citadel/sound/vox/helium.ogg differ
diff --git a/modular_citadel/sound/vox/hello.ogg b/modular_citadel/sound/vox/hello.ogg
new file mode 100644
index 0000000000..622e4669ef
Binary files /dev/null and b/modular_citadel/sound/vox/hello.ogg differ
diff --git a/modular_citadel/sound/vox/help.ogg b/modular_citadel/sound/vox/help.ogg
new file mode 100644
index 0000000000..038438d63b
Binary files /dev/null and b/modular_citadel/sound/vox/help.ogg differ
diff --git a/modular_citadel/sound/vox/here.ogg b/modular_citadel/sound/vox/here.ogg
new file mode 100644
index 0000000000..ef69f1b282
Binary files /dev/null and b/modular_citadel/sound/vox/here.ogg differ
diff --git a/modular_citadel/sound/vox/hide.ogg b/modular_citadel/sound/vox/hide.ogg
new file mode 100644
index 0000000000..aa329d1f72
Binary files /dev/null and b/modular_citadel/sound/vox/hide.ogg differ
diff --git a/modular_citadel/sound/vox/high.ogg b/modular_citadel/sound/vox/high.ogg
new file mode 100644
index 0000000000..c20e382388
Binary files /dev/null and b/modular_citadel/sound/vox/high.ogg differ
diff --git a/modular_citadel/sound/vox/highest.ogg b/modular_citadel/sound/vox/highest.ogg
new file mode 100644
index 0000000000..d64bfd528c
Binary files /dev/null and b/modular_citadel/sound/vox/highest.ogg differ
diff --git a/modular_citadel/sound/vox/hit.ogg b/modular_citadel/sound/vox/hit.ogg
new file mode 100644
index 0000000000..bfe3cd0501
Binary files /dev/null and b/modular_citadel/sound/vox/hit.ogg differ
diff --git a/modular_citadel/sound/vox/holds.ogg b/modular_citadel/sound/vox/holds.ogg
new file mode 100644
index 0000000000..41b88d990e
Binary files /dev/null and b/modular_citadel/sound/vox/holds.ogg differ
diff --git a/modular_citadel/sound/vox/hole.ogg b/modular_citadel/sound/vox/hole.ogg
new file mode 100644
index 0000000000..a5dea701c8
Binary files /dev/null and b/modular_citadel/sound/vox/hole.ogg differ
diff --git a/modular_citadel/sound/vox/hostile.ogg b/modular_citadel/sound/vox/hostile.ogg
new file mode 100644
index 0000000000..7b8e495c87
Binary files /dev/null and b/modular_citadel/sound/vox/hostile.ogg differ
diff --git a/modular_citadel/sound/vox/hot.ogg b/modular_citadel/sound/vox/hot.ogg
new file mode 100644
index 0000000000..508f643856
Binary files /dev/null and b/modular_citadel/sound/vox/hot.ogg differ
diff --git a/modular_citadel/sound/vox/hotel.ogg b/modular_citadel/sound/vox/hotel.ogg
new file mode 100644
index 0000000000..5a5b66cdbf
Binary files /dev/null and b/modular_citadel/sound/vox/hotel.ogg differ
diff --git a/modular_citadel/sound/vox/hour.ogg b/modular_citadel/sound/vox/hour.ogg
new file mode 100644
index 0000000000..39f0fd0917
Binary files /dev/null and b/modular_citadel/sound/vox/hour.ogg differ
diff --git a/modular_citadel/sound/vox/hours.ogg b/modular_citadel/sound/vox/hours.ogg
new file mode 100644
index 0000000000..691b7a643b
Binary files /dev/null and b/modular_citadel/sound/vox/hours.ogg differ
diff --git a/modular_citadel/sound/vox/hundred.ogg b/modular_citadel/sound/vox/hundred.ogg
new file mode 100644
index 0000000000..3a254a137a
Binary files /dev/null and b/modular_citadel/sound/vox/hundred.ogg differ
diff --git a/modular_citadel/sound/vox/hydro.ogg b/modular_citadel/sound/vox/hydro.ogg
new file mode 100644
index 0000000000..47c9ad5d01
Binary files /dev/null and b/modular_citadel/sound/vox/hydro.ogg differ
diff --git a/modular_citadel/sound/vox/i.ogg b/modular_citadel/sound/vox/i.ogg
new file mode 100644
index 0000000000..1c4ce81b7a
Binary files /dev/null and b/modular_citadel/sound/vox/i.ogg differ
diff --git a/modular_citadel/sound/vox/idiot.ogg b/modular_citadel/sound/vox/idiot.ogg
new file mode 100644
index 0000000000..66e058effc
Binary files /dev/null and b/modular_citadel/sound/vox/idiot.ogg differ
diff --git a/modular_citadel/sound/vox/illegal.ogg b/modular_citadel/sound/vox/illegal.ogg
new file mode 100644
index 0000000000..e1f22738bd
Binary files /dev/null and b/modular_citadel/sound/vox/illegal.ogg differ
diff --git a/modular_citadel/sound/vox/immediate.ogg b/modular_citadel/sound/vox/immediate.ogg
new file mode 100644
index 0000000000..3e551dfa57
Binary files /dev/null and b/modular_citadel/sound/vox/immediate.ogg differ
diff --git a/modular_citadel/sound/vox/immediately.ogg b/modular_citadel/sound/vox/immediately.ogg
new file mode 100644
index 0000000000..0ca780ddac
Binary files /dev/null and b/modular_citadel/sound/vox/immediately.ogg differ
diff --git a/modular_citadel/sound/vox/in.ogg b/modular_citadel/sound/vox/in.ogg
new file mode 100644
index 0000000000..e0b20f4795
Binary files /dev/null and b/modular_citadel/sound/vox/in.ogg differ
diff --git a/modular_citadel/sound/vox/inches.ogg b/modular_citadel/sound/vox/inches.ogg
new file mode 100644
index 0000000000..058f8e9131
Binary files /dev/null and b/modular_citadel/sound/vox/inches.ogg differ
diff --git a/modular_citadel/sound/vox/india.ogg b/modular_citadel/sound/vox/india.ogg
new file mode 100644
index 0000000000..1eefc45266
Binary files /dev/null and b/modular_citadel/sound/vox/india.ogg differ
diff --git a/modular_citadel/sound/vox/ing.ogg b/modular_citadel/sound/vox/ing.ogg
new file mode 100644
index 0000000000..d8c5c72fc9
Binary files /dev/null and b/modular_citadel/sound/vox/ing.ogg differ
diff --git a/modular_citadel/sound/vox/inoperative.ogg b/modular_citadel/sound/vox/inoperative.ogg
new file mode 100644
index 0000000000..01f13af948
Binary files /dev/null and b/modular_citadel/sound/vox/inoperative.ogg differ
diff --git a/modular_citadel/sound/vox/inside.ogg b/modular_citadel/sound/vox/inside.ogg
new file mode 100644
index 0000000000..778f4539ed
Binary files /dev/null and b/modular_citadel/sound/vox/inside.ogg differ
diff --git a/modular_citadel/sound/vox/inspection.ogg b/modular_citadel/sound/vox/inspection.ogg
new file mode 100644
index 0000000000..60a2b3e788
Binary files /dev/null and b/modular_citadel/sound/vox/inspection.ogg differ
diff --git a/modular_citadel/sound/vox/inspector.ogg b/modular_citadel/sound/vox/inspector.ogg
new file mode 100644
index 0000000000..177651d631
Binary files /dev/null and b/modular_citadel/sound/vox/inspector.ogg differ
diff --git a/modular_citadel/sound/vox/interchange.ogg b/modular_citadel/sound/vox/interchange.ogg
new file mode 100644
index 0000000000..6c4230d2d1
Binary files /dev/null and b/modular_citadel/sound/vox/interchange.ogg differ
diff --git a/modular_citadel/sound/vox/intruder.ogg b/modular_citadel/sound/vox/intruder.ogg
new file mode 100644
index 0000000000..db4810966f
Binary files /dev/null and b/modular_citadel/sound/vox/intruder.ogg differ
diff --git a/modular_citadel/sound/vox/invallid.ogg b/modular_citadel/sound/vox/invallid.ogg
new file mode 100644
index 0000000000..b2e5628fa5
Binary files /dev/null and b/modular_citadel/sound/vox/invallid.ogg differ
diff --git a/modular_citadel/sound/vox/invasion.ogg b/modular_citadel/sound/vox/invasion.ogg
new file mode 100644
index 0000000000..8e9a41fc10
Binary files /dev/null and b/modular_citadel/sound/vox/invasion.ogg differ
diff --git a/modular_citadel/sound/vox/is.ogg b/modular_citadel/sound/vox/is.ogg
new file mode 100644
index 0000000000..db3ca1dc81
Binary files /dev/null and b/modular_citadel/sound/vox/is.ogg differ
diff --git a/modular_citadel/sound/vox/it.ogg b/modular_citadel/sound/vox/it.ogg
new file mode 100644
index 0000000000..c0d3de3992
Binary files /dev/null and b/modular_citadel/sound/vox/it.ogg differ
diff --git a/modular_citadel/sound/vox/johnson.ogg b/modular_citadel/sound/vox/johnson.ogg
new file mode 100644
index 0000000000..ea74d8a61f
Binary files /dev/null and b/modular_citadel/sound/vox/johnson.ogg differ
diff --git a/modular_citadel/sound/vox/juliet.ogg b/modular_citadel/sound/vox/juliet.ogg
new file mode 100644
index 0000000000..c9a61b63ab
Binary files /dev/null and b/modular_citadel/sound/vox/juliet.ogg differ
diff --git a/modular_citadel/sound/vox/key.ogg b/modular_citadel/sound/vox/key.ogg
new file mode 100644
index 0000000000..b761d5c1f9
Binary files /dev/null and b/modular_citadel/sound/vox/key.ogg differ
diff --git a/modular_citadel/sound/vox/kill.ogg b/modular_citadel/sound/vox/kill.ogg
new file mode 100644
index 0000000000..00db499476
Binary files /dev/null and b/modular_citadel/sound/vox/kill.ogg differ
diff --git a/modular_citadel/sound/vox/kilo.ogg b/modular_citadel/sound/vox/kilo.ogg
new file mode 100644
index 0000000000..7786c4fc7c
Binary files /dev/null and b/modular_citadel/sound/vox/kilo.ogg differ
diff --git a/modular_citadel/sound/vox/kit.ogg b/modular_citadel/sound/vox/kit.ogg
new file mode 100644
index 0000000000..15bbe46087
Binary files /dev/null and b/modular_citadel/sound/vox/kit.ogg differ
diff --git a/modular_citadel/sound/vox/lab.ogg b/modular_citadel/sound/vox/lab.ogg
new file mode 100644
index 0000000000..2031fdd255
Binary files /dev/null and b/modular_citadel/sound/vox/lab.ogg differ
diff --git a/modular_citadel/sound/vox/lambda.ogg b/modular_citadel/sound/vox/lambda.ogg
new file mode 100644
index 0000000000..f933c45376
Binary files /dev/null and b/modular_citadel/sound/vox/lambda.ogg differ
diff --git a/modular_citadel/sound/vox/laser.ogg b/modular_citadel/sound/vox/laser.ogg
new file mode 100644
index 0000000000..04b5ec4341
Binary files /dev/null and b/modular_citadel/sound/vox/laser.ogg differ
diff --git a/modular_citadel/sound/vox/last.ogg b/modular_citadel/sound/vox/last.ogg
new file mode 100644
index 0000000000..9ce61ac234
Binary files /dev/null and b/modular_citadel/sound/vox/last.ogg differ
diff --git a/modular_citadel/sound/vox/launch.ogg b/modular_citadel/sound/vox/launch.ogg
new file mode 100644
index 0000000000..c8e3b0820e
Binary files /dev/null and b/modular_citadel/sound/vox/launch.ogg differ
diff --git a/modular_citadel/sound/vox/leak.ogg b/modular_citadel/sound/vox/leak.ogg
new file mode 100644
index 0000000000..3154ac53c3
Binary files /dev/null and b/modular_citadel/sound/vox/leak.ogg differ
diff --git a/modular_citadel/sound/vox/leave.ogg b/modular_citadel/sound/vox/leave.ogg
new file mode 100644
index 0000000000..cec4a6befd
Binary files /dev/null and b/modular_citadel/sound/vox/leave.ogg differ
diff --git a/modular_citadel/sound/vox/left.ogg b/modular_citadel/sound/vox/left.ogg
new file mode 100644
index 0000000000..c6f32829ad
Binary files /dev/null and b/modular_citadel/sound/vox/left.ogg differ
diff --git a/modular_citadel/sound/vox/legal.ogg b/modular_citadel/sound/vox/legal.ogg
new file mode 100644
index 0000000000..c8f5163bd1
Binary files /dev/null and b/modular_citadel/sound/vox/legal.ogg differ
diff --git a/modular_citadel/sound/vox/level.ogg b/modular_citadel/sound/vox/level.ogg
new file mode 100644
index 0000000000..4d898a5ef7
Binary files /dev/null and b/modular_citadel/sound/vox/level.ogg differ
diff --git a/modular_citadel/sound/vox/lever.ogg b/modular_citadel/sound/vox/lever.ogg
new file mode 100644
index 0000000000..28c8c33e76
Binary files /dev/null and b/modular_citadel/sound/vox/lever.ogg differ
diff --git a/modular_citadel/sound/vox/lie.ogg b/modular_citadel/sound/vox/lie.ogg
new file mode 100644
index 0000000000..1516dc0072
Binary files /dev/null and b/modular_citadel/sound/vox/lie.ogg differ
diff --git a/modular_citadel/sound/vox/lieutenant.ogg b/modular_citadel/sound/vox/lieutenant.ogg
new file mode 100644
index 0000000000..1393b36008
Binary files /dev/null and b/modular_citadel/sound/vox/lieutenant.ogg differ
diff --git a/modular_citadel/sound/vox/life.ogg b/modular_citadel/sound/vox/life.ogg
new file mode 100644
index 0000000000..0d03320ce2
Binary files /dev/null and b/modular_citadel/sound/vox/life.ogg differ
diff --git a/modular_citadel/sound/vox/light.ogg b/modular_citadel/sound/vox/light.ogg
new file mode 100644
index 0000000000..c4e8a9fc78
Binary files /dev/null and b/modular_citadel/sound/vox/light.ogg differ
diff --git a/modular_citadel/sound/vox/lima.ogg b/modular_citadel/sound/vox/lima.ogg
new file mode 100644
index 0000000000..84e26666cf
Binary files /dev/null and b/modular_citadel/sound/vox/lima.ogg differ
diff --git a/modular_citadel/sound/vox/liquid.ogg b/modular_citadel/sound/vox/liquid.ogg
new file mode 100644
index 0000000000..b942e3cf6c
Binary files /dev/null and b/modular_citadel/sound/vox/liquid.ogg differ
diff --git a/modular_citadel/sound/vox/loading.ogg b/modular_citadel/sound/vox/loading.ogg
new file mode 100644
index 0000000000..2dfefd952e
Binary files /dev/null and b/modular_citadel/sound/vox/loading.ogg differ
diff --git a/modular_citadel/sound/vox/locate.ogg b/modular_citadel/sound/vox/locate.ogg
new file mode 100644
index 0000000000..2ea19ec257
Binary files /dev/null and b/modular_citadel/sound/vox/locate.ogg differ
diff --git a/modular_citadel/sound/vox/located.ogg b/modular_citadel/sound/vox/located.ogg
new file mode 100644
index 0000000000..cd161b556b
Binary files /dev/null and b/modular_citadel/sound/vox/located.ogg differ
diff --git a/modular_citadel/sound/vox/location.ogg b/modular_citadel/sound/vox/location.ogg
new file mode 100644
index 0000000000..966c9ae3f6
Binary files /dev/null and b/modular_citadel/sound/vox/location.ogg differ
diff --git a/modular_citadel/sound/vox/lock.ogg b/modular_citadel/sound/vox/lock.ogg
new file mode 100644
index 0000000000..c4c89992db
Binary files /dev/null and b/modular_citadel/sound/vox/lock.ogg differ
diff --git a/modular_citadel/sound/vox/locked.ogg b/modular_citadel/sound/vox/locked.ogg
new file mode 100644
index 0000000000..d1a05ba323
Binary files /dev/null and b/modular_citadel/sound/vox/locked.ogg differ
diff --git a/modular_citadel/sound/vox/locker.ogg b/modular_citadel/sound/vox/locker.ogg
new file mode 100644
index 0000000000..2c5c9ccb4b
Binary files /dev/null and b/modular_citadel/sound/vox/locker.ogg differ
diff --git a/modular_citadel/sound/vox/lockout.ogg b/modular_citadel/sound/vox/lockout.ogg
new file mode 100644
index 0000000000..36748ecb71
Binary files /dev/null and b/modular_citadel/sound/vox/lockout.ogg differ
diff --git a/modular_citadel/sound/vox/lower.ogg b/modular_citadel/sound/vox/lower.ogg
new file mode 100644
index 0000000000..a3a6a3ae9d
Binary files /dev/null and b/modular_citadel/sound/vox/lower.ogg differ
diff --git a/modular_citadel/sound/vox/lowest.ogg b/modular_citadel/sound/vox/lowest.ogg
new file mode 100644
index 0000000000..787fa2a961
Binary files /dev/null and b/modular_citadel/sound/vox/lowest.ogg differ
diff --git a/modular_citadel/sound/vox/magnetic.ogg b/modular_citadel/sound/vox/magnetic.ogg
new file mode 100644
index 0000000000..1211ab1cfd
Binary files /dev/null and b/modular_citadel/sound/vox/magnetic.ogg differ
diff --git a/modular_citadel/sound/vox/main.ogg b/modular_citadel/sound/vox/main.ogg
new file mode 100644
index 0000000000..a1e49b2c16
Binary files /dev/null and b/modular_citadel/sound/vox/main.ogg differ
diff --git a/modular_citadel/sound/vox/maintenance.ogg b/modular_citadel/sound/vox/maintenance.ogg
new file mode 100644
index 0000000000..691fea8b60
Binary files /dev/null and b/modular_citadel/sound/vox/maintenance.ogg differ
diff --git a/modular_citadel/sound/vox/malfunction.ogg b/modular_citadel/sound/vox/malfunction.ogg
new file mode 100644
index 0000000000..5e0d416d4f
Binary files /dev/null and b/modular_citadel/sound/vox/malfunction.ogg differ
diff --git a/modular_citadel/sound/vox/man.ogg b/modular_citadel/sound/vox/man.ogg
new file mode 100644
index 0000000000..10ca95640a
Binary files /dev/null and b/modular_citadel/sound/vox/man.ogg differ
diff --git a/modular_citadel/sound/vox/mass.ogg b/modular_citadel/sound/vox/mass.ogg
new file mode 100644
index 0000000000..6b785f5e8b
Binary files /dev/null and b/modular_citadel/sound/vox/mass.ogg differ
diff --git a/modular_citadel/sound/vox/materials.ogg b/modular_citadel/sound/vox/materials.ogg
new file mode 100644
index 0000000000..0321e579f7
Binary files /dev/null and b/modular_citadel/sound/vox/materials.ogg differ
diff --git a/modular_citadel/sound/vox/maximum.ogg b/modular_citadel/sound/vox/maximum.ogg
new file mode 100644
index 0000000000..ef566342a7
Binary files /dev/null and b/modular_citadel/sound/vox/maximum.ogg differ
diff --git a/modular_citadel/sound/vox/may.ogg b/modular_citadel/sound/vox/may.ogg
new file mode 100644
index 0000000000..2f9fa02cf0
Binary files /dev/null and b/modular_citadel/sound/vox/may.ogg differ
diff --git a/modular_citadel/sound/vox/med.ogg b/modular_citadel/sound/vox/med.ogg
new file mode 100644
index 0000000000..280a12362f
Binary files /dev/null and b/modular_citadel/sound/vox/med.ogg differ
diff --git a/modular_citadel/sound/vox/medical.ogg b/modular_citadel/sound/vox/medical.ogg
new file mode 100644
index 0000000000..3a293f31b2
Binary files /dev/null and b/modular_citadel/sound/vox/medical.ogg differ
diff --git a/modular_citadel/sound/vox/men.ogg b/modular_citadel/sound/vox/men.ogg
new file mode 100644
index 0000000000..a9e92245f1
Binary files /dev/null and b/modular_citadel/sound/vox/men.ogg differ
diff --git a/modular_citadel/sound/vox/mercy.ogg b/modular_citadel/sound/vox/mercy.ogg
new file mode 100644
index 0000000000..2de89bc70a
Binary files /dev/null and b/modular_citadel/sound/vox/mercy.ogg differ
diff --git a/modular_citadel/sound/vox/mesa.ogg b/modular_citadel/sound/vox/mesa.ogg
new file mode 100644
index 0000000000..649d3671ba
Binary files /dev/null and b/modular_citadel/sound/vox/mesa.ogg differ
diff --git a/modular_citadel/sound/vox/message.ogg b/modular_citadel/sound/vox/message.ogg
new file mode 100644
index 0000000000..1454e3df9e
Binary files /dev/null and b/modular_citadel/sound/vox/message.ogg differ
diff --git a/modular_citadel/sound/vox/meter.ogg b/modular_citadel/sound/vox/meter.ogg
new file mode 100644
index 0000000000..7afc6fb3d1
Binary files /dev/null and b/modular_citadel/sound/vox/meter.ogg differ
diff --git a/modular_citadel/sound/vox/micro.ogg b/modular_citadel/sound/vox/micro.ogg
new file mode 100644
index 0000000000..38d59ed2de
Binary files /dev/null and b/modular_citadel/sound/vox/micro.ogg differ
diff --git a/modular_citadel/sound/vox/middle.ogg b/modular_citadel/sound/vox/middle.ogg
new file mode 100644
index 0000000000..ef33287eff
Binary files /dev/null and b/modular_citadel/sound/vox/middle.ogg differ
diff --git a/modular_citadel/sound/vox/mike.ogg b/modular_citadel/sound/vox/mike.ogg
new file mode 100644
index 0000000000..27d4fdeb9e
Binary files /dev/null and b/modular_citadel/sound/vox/mike.ogg differ
diff --git a/modular_citadel/sound/vox/miles.ogg b/modular_citadel/sound/vox/miles.ogg
new file mode 100644
index 0000000000..fbf06913e2
Binary files /dev/null and b/modular_citadel/sound/vox/miles.ogg differ
diff --git a/modular_citadel/sound/vox/military.ogg b/modular_citadel/sound/vox/military.ogg
new file mode 100644
index 0000000000..8273851291
Binary files /dev/null and b/modular_citadel/sound/vox/military.ogg differ
diff --git a/modular_citadel/sound/vox/milli.ogg b/modular_citadel/sound/vox/milli.ogg
new file mode 100644
index 0000000000..806bccebab
Binary files /dev/null and b/modular_citadel/sound/vox/milli.ogg differ
diff --git a/modular_citadel/sound/vox/million.ogg b/modular_citadel/sound/vox/million.ogg
new file mode 100644
index 0000000000..e4c10a2d86
Binary files /dev/null and b/modular_citadel/sound/vox/million.ogg differ
diff --git a/modular_citadel/sound/vox/minefield.ogg b/modular_citadel/sound/vox/minefield.ogg
new file mode 100644
index 0000000000..b437449d1d
Binary files /dev/null and b/modular_citadel/sound/vox/minefield.ogg differ
diff --git a/modular_citadel/sound/vox/minimum.ogg b/modular_citadel/sound/vox/minimum.ogg
new file mode 100644
index 0000000000..a15483bde6
Binary files /dev/null and b/modular_citadel/sound/vox/minimum.ogg differ
diff --git a/modular_citadel/sound/vox/minutes.ogg b/modular_citadel/sound/vox/minutes.ogg
new file mode 100644
index 0000000000..2b7bf579ea
Binary files /dev/null and b/modular_citadel/sound/vox/minutes.ogg differ
diff --git a/modular_citadel/sound/vox/mister.ogg b/modular_citadel/sound/vox/mister.ogg
new file mode 100644
index 0000000000..bc5409bbed
Binary files /dev/null and b/modular_citadel/sound/vox/mister.ogg differ
diff --git a/modular_citadel/sound/vox/mode.ogg b/modular_citadel/sound/vox/mode.ogg
new file mode 100644
index 0000000000..04d6684bde
Binary files /dev/null and b/modular_citadel/sound/vox/mode.ogg differ
diff --git a/modular_citadel/sound/vox/motor.ogg b/modular_citadel/sound/vox/motor.ogg
new file mode 100644
index 0000000000..5a3084201a
Binary files /dev/null and b/modular_citadel/sound/vox/motor.ogg differ
diff --git a/modular_citadel/sound/vox/motorpool.ogg b/modular_citadel/sound/vox/motorpool.ogg
new file mode 100644
index 0000000000..a29772d545
Binary files /dev/null and b/modular_citadel/sound/vox/motorpool.ogg differ
diff --git a/modular_citadel/sound/vox/move.ogg b/modular_citadel/sound/vox/move.ogg
new file mode 100644
index 0000000000..cc6344813f
Binary files /dev/null and b/modular_citadel/sound/vox/move.ogg differ
diff --git a/modular_citadel/sound/vox/must.ogg b/modular_citadel/sound/vox/must.ogg
new file mode 100644
index 0000000000..d52d2c85e0
Binary files /dev/null and b/modular_citadel/sound/vox/must.ogg differ
diff --git a/modular_citadel/sound/vox/nearest.ogg b/modular_citadel/sound/vox/nearest.ogg
new file mode 100644
index 0000000000..fdf34564ad
Binary files /dev/null and b/modular_citadel/sound/vox/nearest.ogg differ
diff --git a/modular_citadel/sound/vox/nice.ogg b/modular_citadel/sound/vox/nice.ogg
new file mode 100644
index 0000000000..102f0eaf87
Binary files /dev/null and b/modular_citadel/sound/vox/nice.ogg differ
diff --git a/modular_citadel/sound/vox/nine.ogg b/modular_citadel/sound/vox/nine.ogg
new file mode 100644
index 0000000000..1d4fd45add
Binary files /dev/null and b/modular_citadel/sound/vox/nine.ogg differ
diff --git a/modular_citadel/sound/vox/nineteen.ogg b/modular_citadel/sound/vox/nineteen.ogg
new file mode 100644
index 0000000000..907ecc6e92
Binary files /dev/null and b/modular_citadel/sound/vox/nineteen.ogg differ
diff --git a/modular_citadel/sound/vox/ninety.ogg b/modular_citadel/sound/vox/ninety.ogg
new file mode 100644
index 0000000000..0f1c3c4fb5
Binary files /dev/null and b/modular_citadel/sound/vox/ninety.ogg differ
diff --git a/modular_citadel/sound/vox/no.ogg b/modular_citadel/sound/vox/no.ogg
new file mode 100644
index 0000000000..85d8497891
Binary files /dev/null and b/modular_citadel/sound/vox/no.ogg differ
diff --git a/modular_citadel/sound/vox/nominal.ogg b/modular_citadel/sound/vox/nominal.ogg
new file mode 100644
index 0000000000..45da127f1b
Binary files /dev/null and b/modular_citadel/sound/vox/nominal.ogg differ
diff --git a/modular_citadel/sound/vox/north.ogg b/modular_citadel/sound/vox/north.ogg
new file mode 100644
index 0000000000..03eb6f88d2
Binary files /dev/null and b/modular_citadel/sound/vox/north.ogg differ
diff --git a/modular_citadel/sound/vox/not.ogg b/modular_citadel/sound/vox/not.ogg
new file mode 100644
index 0000000000..bc691af375
Binary files /dev/null and b/modular_citadel/sound/vox/not.ogg differ
diff --git a/modular_citadel/sound/vox/november.ogg b/modular_citadel/sound/vox/november.ogg
new file mode 100644
index 0000000000..4819c132dc
Binary files /dev/null and b/modular_citadel/sound/vox/november.ogg differ
diff --git a/modular_citadel/sound/vox/now.ogg b/modular_citadel/sound/vox/now.ogg
new file mode 100644
index 0000000000..0e26869bac
Binary files /dev/null and b/modular_citadel/sound/vox/now.ogg differ
diff --git a/modular_citadel/sound/vox/number.ogg b/modular_citadel/sound/vox/number.ogg
new file mode 100644
index 0000000000..c139db7d17
Binary files /dev/null and b/modular_citadel/sound/vox/number.ogg differ
diff --git a/modular_citadel/sound/vox/objective.ogg b/modular_citadel/sound/vox/objective.ogg
new file mode 100644
index 0000000000..2496f83ccf
Binary files /dev/null and b/modular_citadel/sound/vox/objective.ogg differ
diff --git a/modular_citadel/sound/vox/observation.ogg b/modular_citadel/sound/vox/observation.ogg
new file mode 100644
index 0000000000..af04410915
Binary files /dev/null and b/modular_citadel/sound/vox/observation.ogg differ
diff --git a/modular_citadel/sound/vox/of.ogg b/modular_citadel/sound/vox/of.ogg
new file mode 100644
index 0000000000..ee71e1a46e
Binary files /dev/null and b/modular_citadel/sound/vox/of.ogg differ
diff --git a/modular_citadel/sound/vox/officer.ogg b/modular_citadel/sound/vox/officer.ogg
new file mode 100644
index 0000000000..c9f94915e6
Binary files /dev/null and b/modular_citadel/sound/vox/officer.ogg differ
diff --git a/modular_citadel/sound/vox/ok.ogg b/modular_citadel/sound/vox/ok.ogg
new file mode 100644
index 0000000000..cf58af4d13
Binary files /dev/null and b/modular_citadel/sound/vox/ok.ogg differ
diff --git a/modular_citadel/sound/vox/on.ogg b/modular_citadel/sound/vox/on.ogg
new file mode 100644
index 0000000000..3c59c6abd8
Binary files /dev/null and b/modular_citadel/sound/vox/on.ogg differ
diff --git a/modular_citadel/sound/vox/one.ogg b/modular_citadel/sound/vox/one.ogg
new file mode 100644
index 0000000000..377f270179
Binary files /dev/null and b/modular_citadel/sound/vox/one.ogg differ
diff --git a/modular_citadel/sound/vox/open.ogg b/modular_citadel/sound/vox/open.ogg
new file mode 100644
index 0000000000..81c11de72f
Binary files /dev/null and b/modular_citadel/sound/vox/open.ogg differ
diff --git a/modular_citadel/sound/vox/operating.ogg b/modular_citadel/sound/vox/operating.ogg
new file mode 100644
index 0000000000..cd2de79d79
Binary files /dev/null and b/modular_citadel/sound/vox/operating.ogg differ
diff --git a/modular_citadel/sound/vox/operations.ogg b/modular_citadel/sound/vox/operations.ogg
new file mode 100644
index 0000000000..9323d95f46
Binary files /dev/null and b/modular_citadel/sound/vox/operations.ogg differ
diff --git a/modular_citadel/sound/vox/operative.ogg b/modular_citadel/sound/vox/operative.ogg
new file mode 100644
index 0000000000..ba9c7d0cf4
Binary files /dev/null and b/modular_citadel/sound/vox/operative.ogg differ
diff --git a/modular_citadel/sound/vox/option.ogg b/modular_citadel/sound/vox/option.ogg
new file mode 100644
index 0000000000..c404be5556
Binary files /dev/null and b/modular_citadel/sound/vox/option.ogg differ
diff --git a/modular_citadel/sound/vox/order.ogg b/modular_citadel/sound/vox/order.ogg
new file mode 100644
index 0000000000..2961f353ed
Binary files /dev/null and b/modular_citadel/sound/vox/order.ogg differ
diff --git a/modular_citadel/sound/vox/organic.ogg b/modular_citadel/sound/vox/organic.ogg
new file mode 100644
index 0000000000..6195be46b4
Binary files /dev/null and b/modular_citadel/sound/vox/organic.ogg differ
diff --git a/modular_citadel/sound/vox/oscar.ogg b/modular_citadel/sound/vox/oscar.ogg
new file mode 100644
index 0000000000..5f43814f5e
Binary files /dev/null and b/modular_citadel/sound/vox/oscar.ogg differ
diff --git a/modular_citadel/sound/vox/out.ogg b/modular_citadel/sound/vox/out.ogg
new file mode 100644
index 0000000000..3a64ae9751
Binary files /dev/null and b/modular_citadel/sound/vox/out.ogg differ
diff --git a/modular_citadel/sound/vox/outside.ogg b/modular_citadel/sound/vox/outside.ogg
new file mode 100644
index 0000000000..a6417b9f97
Binary files /dev/null and b/modular_citadel/sound/vox/outside.ogg differ
diff --git a/modular_citadel/sound/vox/over.ogg b/modular_citadel/sound/vox/over.ogg
new file mode 100644
index 0000000000..193bbd797b
Binary files /dev/null and b/modular_citadel/sound/vox/over.ogg differ
diff --git a/modular_citadel/sound/vox/overload.ogg b/modular_citadel/sound/vox/overload.ogg
new file mode 100644
index 0000000000..d90e52e97d
Binary files /dev/null and b/modular_citadel/sound/vox/overload.ogg differ
diff --git a/modular_citadel/sound/vox/override.ogg b/modular_citadel/sound/vox/override.ogg
new file mode 100644
index 0000000000..f2efb63799
Binary files /dev/null and b/modular_citadel/sound/vox/override.ogg differ
diff --git a/modular_citadel/sound/vox/pacify.ogg b/modular_citadel/sound/vox/pacify.ogg
new file mode 100644
index 0000000000..232865ebe2
Binary files /dev/null and b/modular_citadel/sound/vox/pacify.ogg differ
diff --git a/modular_citadel/sound/vox/pain.ogg b/modular_citadel/sound/vox/pain.ogg
new file mode 100644
index 0000000000..88e8813158
Binary files /dev/null and b/modular_citadel/sound/vox/pain.ogg differ
diff --git a/modular_citadel/sound/vox/pal.ogg b/modular_citadel/sound/vox/pal.ogg
new file mode 100644
index 0000000000..185a15a6ac
Binary files /dev/null and b/modular_citadel/sound/vox/pal.ogg differ
diff --git a/modular_citadel/sound/vox/panel.ogg b/modular_citadel/sound/vox/panel.ogg
new file mode 100644
index 0000000000..e200e9ddd9
Binary files /dev/null and b/modular_citadel/sound/vox/panel.ogg differ
diff --git a/modular_citadel/sound/vox/percent.ogg b/modular_citadel/sound/vox/percent.ogg
new file mode 100644
index 0000000000..43c04572ba
Binary files /dev/null and b/modular_citadel/sound/vox/percent.ogg differ
diff --git a/modular_citadel/sound/vox/perimeter.ogg b/modular_citadel/sound/vox/perimeter.ogg
new file mode 100644
index 0000000000..7bd3f039ef
Binary files /dev/null and b/modular_citadel/sound/vox/perimeter.ogg differ
diff --git a/modular_citadel/sound/vox/period.ogg b/modular_citadel/sound/vox/period.ogg
new file mode 100644
index 0000000000..e333dc159b
Binary files /dev/null and b/modular_citadel/sound/vox/period.ogg differ
diff --git a/modular_citadel/sound/vox/permitted.ogg b/modular_citadel/sound/vox/permitted.ogg
new file mode 100644
index 0000000000..832fec7c24
Binary files /dev/null and b/modular_citadel/sound/vox/permitted.ogg differ
diff --git a/modular_citadel/sound/vox/personnel.ogg b/modular_citadel/sound/vox/personnel.ogg
new file mode 100644
index 0000000000..f499fb9f1d
Binary files /dev/null and b/modular_citadel/sound/vox/personnel.ogg differ
diff --git a/modular_citadel/sound/vox/pipe.ogg b/modular_citadel/sound/vox/pipe.ogg
new file mode 100644
index 0000000000..63ab07e4cb
Binary files /dev/null and b/modular_citadel/sound/vox/pipe.ogg differ
diff --git a/modular_citadel/sound/vox/plant.ogg b/modular_citadel/sound/vox/plant.ogg
new file mode 100644
index 0000000000..d82d73900d
Binary files /dev/null and b/modular_citadel/sound/vox/plant.ogg differ
diff --git a/modular_citadel/sound/vox/platform.ogg b/modular_citadel/sound/vox/platform.ogg
new file mode 100644
index 0000000000..cf9eb6ce53
Binary files /dev/null and b/modular_citadel/sound/vox/platform.ogg differ
diff --git a/modular_citadel/sound/vox/please.ogg b/modular_citadel/sound/vox/please.ogg
new file mode 100644
index 0000000000..cc21919798
Binary files /dev/null and b/modular_citadel/sound/vox/please.ogg differ
diff --git a/modular_citadel/sound/vox/point.ogg b/modular_citadel/sound/vox/point.ogg
new file mode 100644
index 0000000000..29925c714c
Binary files /dev/null and b/modular_citadel/sound/vox/point.ogg differ
diff --git a/modular_citadel/sound/vox/portal.ogg b/modular_citadel/sound/vox/portal.ogg
new file mode 100644
index 0000000000..4492842d97
Binary files /dev/null and b/modular_citadel/sound/vox/portal.ogg differ
diff --git a/modular_citadel/sound/vox/power.ogg b/modular_citadel/sound/vox/power.ogg
new file mode 100644
index 0000000000..109dde7b19
Binary files /dev/null and b/modular_citadel/sound/vox/power.ogg differ
diff --git a/modular_citadel/sound/vox/presence.ogg b/modular_citadel/sound/vox/presence.ogg
new file mode 100644
index 0000000000..fc929ee991
Binary files /dev/null and b/modular_citadel/sound/vox/presence.ogg differ
diff --git a/modular_citadel/sound/vox/press.ogg b/modular_citadel/sound/vox/press.ogg
new file mode 100644
index 0000000000..704c907141
Binary files /dev/null and b/modular_citadel/sound/vox/press.ogg differ
diff --git a/modular_citadel/sound/vox/primary.ogg b/modular_citadel/sound/vox/primary.ogg
new file mode 100644
index 0000000000..6f667e6a57
Binary files /dev/null and b/modular_citadel/sound/vox/primary.ogg differ
diff --git a/modular_citadel/sound/vox/proceed.ogg b/modular_citadel/sound/vox/proceed.ogg
new file mode 100644
index 0000000000..86df9fcf25
Binary files /dev/null and b/modular_citadel/sound/vox/proceed.ogg differ
diff --git a/modular_citadel/sound/vox/processing.ogg b/modular_citadel/sound/vox/processing.ogg
new file mode 100644
index 0000000000..f5aae3574c
Binary files /dev/null and b/modular_citadel/sound/vox/processing.ogg differ
diff --git a/modular_citadel/sound/vox/progress.ogg b/modular_citadel/sound/vox/progress.ogg
new file mode 100644
index 0000000000..c07c102a97
Binary files /dev/null and b/modular_citadel/sound/vox/progress.ogg differ
diff --git a/modular_citadel/sound/vox/proper.ogg b/modular_citadel/sound/vox/proper.ogg
new file mode 100644
index 0000000000..0dbfbaf599
Binary files /dev/null and b/modular_citadel/sound/vox/proper.ogg differ
diff --git a/modular_citadel/sound/vox/propulsion.ogg b/modular_citadel/sound/vox/propulsion.ogg
new file mode 100644
index 0000000000..8a4a77274a
Binary files /dev/null and b/modular_citadel/sound/vox/propulsion.ogg differ
diff --git a/modular_citadel/sound/vox/prosecute.ogg b/modular_citadel/sound/vox/prosecute.ogg
new file mode 100644
index 0000000000..c0895c54ef
Binary files /dev/null and b/modular_citadel/sound/vox/prosecute.ogg differ
diff --git a/modular_citadel/sound/vox/protective.ogg b/modular_citadel/sound/vox/protective.ogg
new file mode 100644
index 0000000000..67c1f1195b
Binary files /dev/null and b/modular_citadel/sound/vox/protective.ogg differ
diff --git a/modular_citadel/sound/vox/push.ogg b/modular_citadel/sound/vox/push.ogg
new file mode 100644
index 0000000000..2d9cfca1f7
Binary files /dev/null and b/modular_citadel/sound/vox/push.ogg differ
diff --git a/modular_citadel/sound/vox/quantum.ogg b/modular_citadel/sound/vox/quantum.ogg
new file mode 100644
index 0000000000..5082f84e7d
Binary files /dev/null and b/modular_citadel/sound/vox/quantum.ogg differ
diff --git a/modular_citadel/sound/vox/quebec.ogg b/modular_citadel/sound/vox/quebec.ogg
new file mode 100644
index 0000000000..59e84cd4a3
Binary files /dev/null and b/modular_citadel/sound/vox/quebec.ogg differ
diff --git a/modular_citadel/sound/vox/question.ogg b/modular_citadel/sound/vox/question.ogg
new file mode 100644
index 0000000000..197f11ca9a
Binary files /dev/null and b/modular_citadel/sound/vox/question.ogg differ
diff --git a/modular_citadel/sound/vox/questioning.ogg b/modular_citadel/sound/vox/questioning.ogg
new file mode 100644
index 0000000000..ba0436cf32
Binary files /dev/null and b/modular_citadel/sound/vox/questioning.ogg differ
diff --git a/modular_citadel/sound/vox/quick.ogg b/modular_citadel/sound/vox/quick.ogg
new file mode 100644
index 0000000000..19d4e91261
Binary files /dev/null and b/modular_citadel/sound/vox/quick.ogg differ
diff --git a/modular_citadel/sound/vox/quit.ogg b/modular_citadel/sound/vox/quit.ogg
new file mode 100644
index 0000000000..7ab07efa87
Binary files /dev/null and b/modular_citadel/sound/vox/quit.ogg differ
diff --git a/modular_citadel/sound/vox/radiation.ogg b/modular_citadel/sound/vox/radiation.ogg
new file mode 100644
index 0000000000..8d8fbdc001
Binary files /dev/null and b/modular_citadel/sound/vox/radiation.ogg differ
diff --git a/modular_citadel/sound/vox/radioactive.ogg b/modular_citadel/sound/vox/radioactive.ogg
new file mode 100644
index 0000000000..f5751882d4
Binary files /dev/null and b/modular_citadel/sound/vox/radioactive.ogg differ
diff --git a/modular_citadel/sound/vox/rads.ogg b/modular_citadel/sound/vox/rads.ogg
new file mode 100644
index 0000000000..e42722dd62
Binary files /dev/null and b/modular_citadel/sound/vox/rads.ogg differ
diff --git a/modular_citadel/sound/vox/rapid.ogg b/modular_citadel/sound/vox/rapid.ogg
new file mode 100644
index 0000000000..c803204bc8
Binary files /dev/null and b/modular_citadel/sound/vox/rapid.ogg differ
diff --git a/modular_citadel/sound/vox/reach.ogg b/modular_citadel/sound/vox/reach.ogg
new file mode 100644
index 0000000000..ab1a02e9ee
Binary files /dev/null and b/modular_citadel/sound/vox/reach.ogg differ
diff --git a/modular_citadel/sound/vox/reached.ogg b/modular_citadel/sound/vox/reached.ogg
new file mode 100644
index 0000000000..eddba60eed
Binary files /dev/null and b/modular_citadel/sound/vox/reached.ogg differ
diff --git a/modular_citadel/sound/vox/reactor.ogg b/modular_citadel/sound/vox/reactor.ogg
new file mode 100644
index 0000000000..75ea481a37
Binary files /dev/null and b/modular_citadel/sound/vox/reactor.ogg differ
diff --git a/modular_citadel/sound/vox/red.ogg b/modular_citadel/sound/vox/red.ogg
new file mode 100644
index 0000000000..97f2513772
Binary files /dev/null and b/modular_citadel/sound/vox/red.ogg differ
diff --git a/modular_citadel/sound/vox/relay.ogg b/modular_citadel/sound/vox/relay.ogg
new file mode 100644
index 0000000000..edc904c3f4
Binary files /dev/null and b/modular_citadel/sound/vox/relay.ogg differ
diff --git a/modular_citadel/sound/vox/released.ogg b/modular_citadel/sound/vox/released.ogg
new file mode 100644
index 0000000000..b86a39af72
Binary files /dev/null and b/modular_citadel/sound/vox/released.ogg differ
diff --git a/modular_citadel/sound/vox/remaining.ogg b/modular_citadel/sound/vox/remaining.ogg
new file mode 100644
index 0000000000..3ca55d3373
Binary files /dev/null and b/modular_citadel/sound/vox/remaining.ogg differ
diff --git a/modular_citadel/sound/vox/renegade.ogg b/modular_citadel/sound/vox/renegade.ogg
new file mode 100644
index 0000000000..6a4a3f3d50
Binary files /dev/null and b/modular_citadel/sound/vox/renegade.ogg differ
diff --git a/modular_citadel/sound/vox/repair.ogg b/modular_citadel/sound/vox/repair.ogg
new file mode 100644
index 0000000000..9435fe2ade
Binary files /dev/null and b/modular_citadel/sound/vox/repair.ogg differ
diff --git a/modular_citadel/sound/vox/report.ogg b/modular_citadel/sound/vox/report.ogg
new file mode 100644
index 0000000000..873ad6cbfe
Binary files /dev/null and b/modular_citadel/sound/vox/report.ogg differ
diff --git a/modular_citadel/sound/vox/reports.ogg b/modular_citadel/sound/vox/reports.ogg
new file mode 100644
index 0000000000..2fbf3151d0
Binary files /dev/null and b/modular_citadel/sound/vox/reports.ogg differ
diff --git a/modular_citadel/sound/vox/required.ogg b/modular_citadel/sound/vox/required.ogg
new file mode 100644
index 0000000000..902071124c
Binary files /dev/null and b/modular_citadel/sound/vox/required.ogg differ
diff --git a/modular_citadel/sound/vox/research.ogg b/modular_citadel/sound/vox/research.ogg
new file mode 100644
index 0000000000..c75b2ad2d0
Binary files /dev/null and b/modular_citadel/sound/vox/research.ogg differ
diff --git a/modular_citadel/sound/vox/reset.ogg b/modular_citadel/sound/vox/reset.ogg
new file mode 100644
index 0000000000..9864b79a54
Binary files /dev/null and b/modular_citadel/sound/vox/reset.ogg differ
diff --git a/modular_citadel/sound/vox/resevoir.ogg b/modular_citadel/sound/vox/resevoir.ogg
new file mode 100644
index 0000000000..30364c6400
Binary files /dev/null and b/modular_citadel/sound/vox/resevoir.ogg differ
diff --git a/modular_citadel/sound/vox/resistance.ogg b/modular_citadel/sound/vox/resistance.ogg
new file mode 100644
index 0000000000..dfbe6c512d
Binary files /dev/null and b/modular_citadel/sound/vox/resistance.ogg differ
diff --git a/modular_citadel/sound/vox/returned.ogg b/modular_citadel/sound/vox/returned.ogg
new file mode 100644
index 0000000000..0119402e24
Binary files /dev/null and b/modular_citadel/sound/vox/returned.ogg differ
diff --git a/modular_citadel/sound/vox/right.ogg b/modular_citadel/sound/vox/right.ogg
new file mode 100644
index 0000000000..b46b8cb135
Binary files /dev/null and b/modular_citadel/sound/vox/right.ogg differ
diff --git a/modular_citadel/sound/vox/rocket.ogg b/modular_citadel/sound/vox/rocket.ogg
new file mode 100644
index 0000000000..bfb2d3b0ed
Binary files /dev/null and b/modular_citadel/sound/vox/rocket.ogg differ
diff --git a/modular_citadel/sound/vox/roger.ogg b/modular_citadel/sound/vox/roger.ogg
new file mode 100644
index 0000000000..b249613c56
Binary files /dev/null and b/modular_citadel/sound/vox/roger.ogg differ
diff --git a/modular_citadel/sound/vox/romeo.ogg b/modular_citadel/sound/vox/romeo.ogg
new file mode 100644
index 0000000000..4c0b2356e3
Binary files /dev/null and b/modular_citadel/sound/vox/romeo.ogg differ
diff --git a/modular_citadel/sound/vox/room.ogg b/modular_citadel/sound/vox/room.ogg
new file mode 100644
index 0000000000..5151e39d46
Binary files /dev/null and b/modular_citadel/sound/vox/room.ogg differ
diff --git a/modular_citadel/sound/vox/round.ogg b/modular_citadel/sound/vox/round.ogg
new file mode 100644
index 0000000000..685f42d223
Binary files /dev/null and b/modular_citadel/sound/vox/round.ogg differ
diff --git a/modular_citadel/sound/vox/run.ogg b/modular_citadel/sound/vox/run.ogg
new file mode 100644
index 0000000000..9d6012cf3b
Binary files /dev/null and b/modular_citadel/sound/vox/run.ogg differ
diff --git a/modular_citadel/sound/vox/safe.ogg b/modular_citadel/sound/vox/safe.ogg
new file mode 100644
index 0000000000..d7a16d66b4
Binary files /dev/null and b/modular_citadel/sound/vox/safe.ogg differ
diff --git a/modular_citadel/sound/vox/safety.ogg b/modular_citadel/sound/vox/safety.ogg
new file mode 100644
index 0000000000..68ad663df4
Binary files /dev/null and b/modular_citadel/sound/vox/safety.ogg differ
diff --git a/modular_citadel/sound/vox/sargeant.ogg b/modular_citadel/sound/vox/sargeant.ogg
new file mode 100644
index 0000000000..1ab4150c9c
Binary files /dev/null and b/modular_citadel/sound/vox/sargeant.ogg differ
diff --git a/modular_citadel/sound/vox/satellite.ogg b/modular_citadel/sound/vox/satellite.ogg
new file mode 100644
index 0000000000..c07895ab77
Binary files /dev/null and b/modular_citadel/sound/vox/satellite.ogg differ
diff --git a/modular_citadel/sound/vox/save.ogg b/modular_citadel/sound/vox/save.ogg
new file mode 100644
index 0000000000..8a53055d62
Binary files /dev/null and b/modular_citadel/sound/vox/save.ogg differ
diff --git a/modular_citadel/sound/vox/science.ogg b/modular_citadel/sound/vox/science.ogg
new file mode 100644
index 0000000000..6e2e748cbb
Binary files /dev/null and b/modular_citadel/sound/vox/science.ogg differ
diff --git a/modular_citadel/sound/vox/scores.ogg b/modular_citadel/sound/vox/scores.ogg
new file mode 100644
index 0000000000..3328f38dc7
Binary files /dev/null and b/modular_citadel/sound/vox/scores.ogg differ
diff --git a/modular_citadel/sound/vox/scream.ogg b/modular_citadel/sound/vox/scream.ogg
new file mode 100644
index 0000000000..c795ca95ba
Binary files /dev/null and b/modular_citadel/sound/vox/scream.ogg differ
diff --git a/modular_citadel/sound/vox/screen.ogg b/modular_citadel/sound/vox/screen.ogg
new file mode 100644
index 0000000000..514cc3f71a
Binary files /dev/null and b/modular_citadel/sound/vox/screen.ogg differ
diff --git a/modular_citadel/sound/vox/search.ogg b/modular_citadel/sound/vox/search.ogg
new file mode 100644
index 0000000000..638710b721
Binary files /dev/null and b/modular_citadel/sound/vox/search.ogg differ
diff --git a/modular_citadel/sound/vox/second.ogg b/modular_citadel/sound/vox/second.ogg
new file mode 100644
index 0000000000..fc4dc806ca
Binary files /dev/null and b/modular_citadel/sound/vox/second.ogg differ
diff --git a/modular_citadel/sound/vox/secondary.ogg b/modular_citadel/sound/vox/secondary.ogg
new file mode 100644
index 0000000000..3cffa3dbe9
Binary files /dev/null and b/modular_citadel/sound/vox/secondary.ogg differ
diff --git a/modular_citadel/sound/vox/seconds.ogg b/modular_citadel/sound/vox/seconds.ogg
new file mode 100644
index 0000000000..98d08be46c
Binary files /dev/null and b/modular_citadel/sound/vox/seconds.ogg differ
diff --git a/modular_citadel/sound/vox/sector.ogg b/modular_citadel/sound/vox/sector.ogg
new file mode 100644
index 0000000000..ae2d733b87
Binary files /dev/null and b/modular_citadel/sound/vox/sector.ogg differ
diff --git a/modular_citadel/sound/vox/secure.ogg b/modular_citadel/sound/vox/secure.ogg
new file mode 100644
index 0000000000..c860e376dd
Binary files /dev/null and b/modular_citadel/sound/vox/secure.ogg differ
diff --git a/modular_citadel/sound/vox/secured.ogg b/modular_citadel/sound/vox/secured.ogg
new file mode 100644
index 0000000000..3134b679fa
Binary files /dev/null and b/modular_citadel/sound/vox/secured.ogg differ
diff --git a/modular_citadel/sound/vox/security.ogg b/modular_citadel/sound/vox/security.ogg
new file mode 100644
index 0000000000..40f6bc61af
Binary files /dev/null and b/modular_citadel/sound/vox/security.ogg differ
diff --git a/modular_citadel/sound/vox/select.ogg b/modular_citadel/sound/vox/select.ogg
new file mode 100644
index 0000000000..ef04570d32
Binary files /dev/null and b/modular_citadel/sound/vox/select.ogg differ
diff --git a/modular_citadel/sound/vox/selected.ogg b/modular_citadel/sound/vox/selected.ogg
new file mode 100644
index 0000000000..23891f5189
Binary files /dev/null and b/modular_citadel/sound/vox/selected.ogg differ
diff --git a/modular_citadel/sound/vox/service.ogg b/modular_citadel/sound/vox/service.ogg
new file mode 100644
index 0000000000..90294bd34b
Binary files /dev/null and b/modular_citadel/sound/vox/service.ogg differ
diff --git a/modular_citadel/sound/vox/seven.ogg b/modular_citadel/sound/vox/seven.ogg
new file mode 100644
index 0000000000..a0b2de4119
Binary files /dev/null and b/modular_citadel/sound/vox/seven.ogg differ
diff --git a/modular_citadel/sound/vox/seventeen.ogg b/modular_citadel/sound/vox/seventeen.ogg
new file mode 100644
index 0000000000..f23a0b0572
Binary files /dev/null and b/modular_citadel/sound/vox/seventeen.ogg differ
diff --git a/modular_citadel/sound/vox/seventy.ogg b/modular_citadel/sound/vox/seventy.ogg
new file mode 100644
index 0000000000..54f6cd6aef
Binary files /dev/null and b/modular_citadel/sound/vox/seventy.ogg differ
diff --git a/modular_citadel/sound/vox/severe.ogg b/modular_citadel/sound/vox/severe.ogg
new file mode 100644
index 0000000000..9a0cf3784e
Binary files /dev/null and b/modular_citadel/sound/vox/severe.ogg differ
diff --git a/modular_citadel/sound/vox/sewage.ogg b/modular_citadel/sound/vox/sewage.ogg
new file mode 100644
index 0000000000..44fb0d7fd5
Binary files /dev/null and b/modular_citadel/sound/vox/sewage.ogg differ
diff --git a/modular_citadel/sound/vox/sewer.ogg b/modular_citadel/sound/vox/sewer.ogg
new file mode 100644
index 0000000000..10516d86de
Binary files /dev/null and b/modular_citadel/sound/vox/sewer.ogg differ
diff --git a/modular_citadel/sound/vox/shield.ogg b/modular_citadel/sound/vox/shield.ogg
new file mode 100644
index 0000000000..c190383867
Binary files /dev/null and b/modular_citadel/sound/vox/shield.ogg differ
diff --git a/modular_citadel/sound/vox/shipment.ogg b/modular_citadel/sound/vox/shipment.ogg
new file mode 100644
index 0000000000..9677d3db98
Binary files /dev/null and b/modular_citadel/sound/vox/shipment.ogg differ
diff --git a/modular_citadel/sound/vox/shock.ogg b/modular_citadel/sound/vox/shock.ogg
new file mode 100644
index 0000000000..1c44bcca33
Binary files /dev/null and b/modular_citadel/sound/vox/shock.ogg differ
diff --git a/modular_citadel/sound/vox/shoot.ogg b/modular_citadel/sound/vox/shoot.ogg
new file mode 100644
index 0000000000..978a4aaa35
Binary files /dev/null and b/modular_citadel/sound/vox/shoot.ogg differ
diff --git a/modular_citadel/sound/vox/shower.ogg b/modular_citadel/sound/vox/shower.ogg
new file mode 100644
index 0000000000..d131987f13
Binary files /dev/null and b/modular_citadel/sound/vox/shower.ogg differ
diff --git a/modular_citadel/sound/vox/shut.ogg b/modular_citadel/sound/vox/shut.ogg
new file mode 100644
index 0000000000..ceba400b93
Binary files /dev/null and b/modular_citadel/sound/vox/shut.ogg differ
diff --git a/modular_citadel/sound/vox/side.ogg b/modular_citadel/sound/vox/side.ogg
new file mode 100644
index 0000000000..dbc3a7c9ff
Binary files /dev/null and b/modular_citadel/sound/vox/side.ogg differ
diff --git a/modular_citadel/sound/vox/sierra.ogg b/modular_citadel/sound/vox/sierra.ogg
new file mode 100644
index 0000000000..5c33745f28
Binary files /dev/null and b/modular_citadel/sound/vox/sierra.ogg differ
diff --git a/modular_citadel/sound/vox/sight.ogg b/modular_citadel/sound/vox/sight.ogg
new file mode 100644
index 0000000000..027c356b8d
Binary files /dev/null and b/modular_citadel/sound/vox/sight.ogg differ
diff --git a/modular_citadel/sound/vox/silo.ogg b/modular_citadel/sound/vox/silo.ogg
new file mode 100644
index 0000000000..3e0801f8ba
Binary files /dev/null and b/modular_citadel/sound/vox/silo.ogg differ
diff --git a/modular_citadel/sound/vox/six.ogg b/modular_citadel/sound/vox/six.ogg
new file mode 100644
index 0000000000..3544814963
Binary files /dev/null and b/modular_citadel/sound/vox/six.ogg differ
diff --git a/modular_citadel/sound/vox/sixteen.ogg b/modular_citadel/sound/vox/sixteen.ogg
new file mode 100644
index 0000000000..8c1159e147
Binary files /dev/null and b/modular_citadel/sound/vox/sixteen.ogg differ
diff --git a/modular_citadel/sound/vox/sixty.ogg b/modular_citadel/sound/vox/sixty.ogg
new file mode 100644
index 0000000000..bdf47b25b8
Binary files /dev/null and b/modular_citadel/sound/vox/sixty.ogg differ
diff --git a/modular_citadel/sound/vox/slime.ogg b/modular_citadel/sound/vox/slime.ogg
new file mode 100644
index 0000000000..0a6c1254e8
Binary files /dev/null and b/modular_citadel/sound/vox/slime.ogg differ
diff --git a/modular_citadel/sound/vox/slow.ogg b/modular_citadel/sound/vox/slow.ogg
new file mode 100644
index 0000000000..7639f9c7c2
Binary files /dev/null and b/modular_citadel/sound/vox/slow.ogg differ
diff --git a/modular_citadel/sound/vox/soldier.ogg b/modular_citadel/sound/vox/soldier.ogg
new file mode 100644
index 0000000000..3eb10ff590
Binary files /dev/null and b/modular_citadel/sound/vox/soldier.ogg differ
diff --git a/modular_citadel/sound/vox/some.ogg b/modular_citadel/sound/vox/some.ogg
new file mode 100644
index 0000000000..bcb5bbbbd3
Binary files /dev/null and b/modular_citadel/sound/vox/some.ogg differ
diff --git a/modular_citadel/sound/vox/someone.ogg b/modular_citadel/sound/vox/someone.ogg
new file mode 100644
index 0000000000..420a58e925
Binary files /dev/null and b/modular_citadel/sound/vox/someone.ogg differ
diff --git a/modular_citadel/sound/vox/something.ogg b/modular_citadel/sound/vox/something.ogg
new file mode 100644
index 0000000000..e3d26ede65
Binary files /dev/null and b/modular_citadel/sound/vox/something.ogg differ
diff --git a/modular_citadel/sound/vox/son.ogg b/modular_citadel/sound/vox/son.ogg
new file mode 100644
index 0000000000..843536c84a
Binary files /dev/null and b/modular_citadel/sound/vox/son.ogg differ
diff --git a/modular_citadel/sound/vox/sorry.ogg b/modular_citadel/sound/vox/sorry.ogg
new file mode 100644
index 0000000000..c125765112
Binary files /dev/null and b/modular_citadel/sound/vox/sorry.ogg differ
diff --git a/modular_citadel/sound/vox/south.ogg b/modular_citadel/sound/vox/south.ogg
new file mode 100644
index 0000000000..d32f048772
Binary files /dev/null and b/modular_citadel/sound/vox/south.ogg differ
diff --git a/modular_citadel/sound/vox/squad.ogg b/modular_citadel/sound/vox/squad.ogg
new file mode 100644
index 0000000000..582f6459af
Binary files /dev/null and b/modular_citadel/sound/vox/squad.ogg differ
diff --git a/modular_citadel/sound/vox/square.ogg b/modular_citadel/sound/vox/square.ogg
new file mode 100644
index 0000000000..a9beddd3c9
Binary files /dev/null and b/modular_citadel/sound/vox/square.ogg differ
diff --git a/modular_citadel/sound/vox/stairway.ogg b/modular_citadel/sound/vox/stairway.ogg
new file mode 100644
index 0000000000..31b0042edd
Binary files /dev/null and b/modular_citadel/sound/vox/stairway.ogg differ
diff --git a/modular_citadel/sound/vox/status.ogg b/modular_citadel/sound/vox/status.ogg
new file mode 100644
index 0000000000..611088f19a
Binary files /dev/null and b/modular_citadel/sound/vox/status.ogg differ
diff --git a/modular_citadel/sound/vox/sterile.ogg b/modular_citadel/sound/vox/sterile.ogg
new file mode 100644
index 0000000000..4e4d9fad22
Binary files /dev/null and b/modular_citadel/sound/vox/sterile.ogg differ
diff --git a/modular_citadel/sound/vox/sterilization.ogg b/modular_citadel/sound/vox/sterilization.ogg
new file mode 100644
index 0000000000..fec2104d0b
Binary files /dev/null and b/modular_citadel/sound/vox/sterilization.ogg differ
diff --git a/modular_citadel/sound/vox/stolen.ogg b/modular_citadel/sound/vox/stolen.ogg
new file mode 100644
index 0000000000..7e8c624bdf
Binary files /dev/null and b/modular_citadel/sound/vox/stolen.ogg differ
diff --git a/modular_citadel/sound/vox/storage.ogg b/modular_citadel/sound/vox/storage.ogg
new file mode 100644
index 0000000000..e47ef4e09f
Binary files /dev/null and b/modular_citadel/sound/vox/storage.ogg differ
diff --git a/modular_citadel/sound/vox/sub.ogg b/modular_citadel/sound/vox/sub.ogg
new file mode 100644
index 0000000000..ca9a621ad1
Binary files /dev/null and b/modular_citadel/sound/vox/sub.ogg differ
diff --git a/modular_citadel/sound/vox/subsurface.ogg b/modular_citadel/sound/vox/subsurface.ogg
new file mode 100644
index 0000000000..08c98d50f5
Binary files /dev/null and b/modular_citadel/sound/vox/subsurface.ogg differ
diff --git a/modular_citadel/sound/vox/sudden.ogg b/modular_citadel/sound/vox/sudden.ogg
new file mode 100644
index 0000000000..7140e0f874
Binary files /dev/null and b/modular_citadel/sound/vox/sudden.ogg differ
diff --git a/modular_citadel/sound/vox/suit.ogg b/modular_citadel/sound/vox/suit.ogg
new file mode 100644
index 0000000000..c636d5f278
Binary files /dev/null and b/modular_citadel/sound/vox/suit.ogg differ
diff --git a/modular_citadel/sound/vox/superconducting.ogg b/modular_citadel/sound/vox/superconducting.ogg
new file mode 100644
index 0000000000..244bda01c6
Binary files /dev/null and b/modular_citadel/sound/vox/superconducting.ogg differ
diff --git a/modular_citadel/sound/vox/supercooled.ogg b/modular_citadel/sound/vox/supercooled.ogg
new file mode 100644
index 0000000000..c758cdf7f8
Binary files /dev/null and b/modular_citadel/sound/vox/supercooled.ogg differ
diff --git a/modular_citadel/sound/vox/supply.ogg b/modular_citadel/sound/vox/supply.ogg
new file mode 100644
index 0000000000..13341124b3
Binary files /dev/null and b/modular_citadel/sound/vox/supply.ogg differ
diff --git a/modular_citadel/sound/vox/surface.ogg b/modular_citadel/sound/vox/surface.ogg
new file mode 100644
index 0000000000..f498cfd6bd
Binary files /dev/null and b/modular_citadel/sound/vox/surface.ogg differ
diff --git a/modular_citadel/sound/vox/surrender.ogg b/modular_citadel/sound/vox/surrender.ogg
new file mode 100644
index 0000000000..ba1864d38f
Binary files /dev/null and b/modular_citadel/sound/vox/surrender.ogg differ
diff --git a/modular_citadel/sound/vox/surround.ogg b/modular_citadel/sound/vox/surround.ogg
new file mode 100644
index 0000000000..7a3ab9a69a
Binary files /dev/null and b/modular_citadel/sound/vox/surround.ogg differ
diff --git a/modular_citadel/sound/vox/surrounded.ogg b/modular_citadel/sound/vox/surrounded.ogg
new file mode 100644
index 0000000000..464ae912f4
Binary files /dev/null and b/modular_citadel/sound/vox/surrounded.ogg differ
diff --git a/modular_citadel/sound/vox/switch.ogg b/modular_citadel/sound/vox/switch.ogg
new file mode 100644
index 0000000000..d007893d35
Binary files /dev/null and b/modular_citadel/sound/vox/switch.ogg differ
diff --git a/modular_citadel/sound/vox/system.ogg b/modular_citadel/sound/vox/system.ogg
new file mode 100644
index 0000000000..fb459b927f
Binary files /dev/null and b/modular_citadel/sound/vox/system.ogg differ
diff --git a/modular_citadel/sound/vox/systems.ogg b/modular_citadel/sound/vox/systems.ogg
new file mode 100644
index 0000000000..37072c97f4
Binary files /dev/null and b/modular_citadel/sound/vox/systems.ogg differ
diff --git a/modular_citadel/sound/vox/tactical.ogg b/modular_citadel/sound/vox/tactical.ogg
new file mode 100644
index 0000000000..ae294b916b
Binary files /dev/null and b/modular_citadel/sound/vox/tactical.ogg differ
diff --git a/modular_citadel/sound/vox/take.ogg b/modular_citadel/sound/vox/take.ogg
new file mode 100644
index 0000000000..83409da4a3
Binary files /dev/null and b/modular_citadel/sound/vox/take.ogg differ
diff --git a/modular_citadel/sound/vox/talk.ogg b/modular_citadel/sound/vox/talk.ogg
new file mode 100644
index 0000000000..043385c389
Binary files /dev/null and b/modular_citadel/sound/vox/talk.ogg differ
diff --git a/modular_citadel/sound/vox/tango.ogg b/modular_citadel/sound/vox/tango.ogg
new file mode 100644
index 0000000000..f852cb0df3
Binary files /dev/null and b/modular_citadel/sound/vox/tango.ogg differ
diff --git a/modular_citadel/sound/vox/tank.ogg b/modular_citadel/sound/vox/tank.ogg
new file mode 100644
index 0000000000..df09c12f98
Binary files /dev/null and b/modular_citadel/sound/vox/tank.ogg differ
diff --git a/modular_citadel/sound/vox/target.ogg b/modular_citadel/sound/vox/target.ogg
new file mode 100644
index 0000000000..0601cac45b
Binary files /dev/null and b/modular_citadel/sound/vox/target.ogg differ
diff --git a/modular_citadel/sound/vox/team.ogg b/modular_citadel/sound/vox/team.ogg
new file mode 100644
index 0000000000..4fc1a7f198
Binary files /dev/null and b/modular_citadel/sound/vox/team.ogg differ
diff --git a/modular_citadel/sound/vox/temperature.ogg b/modular_citadel/sound/vox/temperature.ogg
new file mode 100644
index 0000000000..d7b92a0cdc
Binary files /dev/null and b/modular_citadel/sound/vox/temperature.ogg differ
diff --git a/modular_citadel/sound/vox/temporal.ogg b/modular_citadel/sound/vox/temporal.ogg
new file mode 100644
index 0000000000..c2f9aedb48
Binary files /dev/null and b/modular_citadel/sound/vox/temporal.ogg differ
diff --git a/modular_citadel/sound/vox/ten.ogg b/modular_citadel/sound/vox/ten.ogg
new file mode 100644
index 0000000000..704d38c1ae
Binary files /dev/null and b/modular_citadel/sound/vox/ten.ogg differ
diff --git a/modular_citadel/sound/vox/terminal.ogg b/modular_citadel/sound/vox/terminal.ogg
new file mode 100644
index 0000000000..f756e03064
Binary files /dev/null and b/modular_citadel/sound/vox/terminal.ogg differ
diff --git a/modular_citadel/sound/vox/terminated.ogg b/modular_citadel/sound/vox/terminated.ogg
new file mode 100644
index 0000000000..52d35451b0
Binary files /dev/null and b/modular_citadel/sound/vox/terminated.ogg differ
diff --git a/modular_citadel/sound/vox/termination.ogg b/modular_citadel/sound/vox/termination.ogg
new file mode 100644
index 0000000000..aec4df5b01
Binary files /dev/null and b/modular_citadel/sound/vox/termination.ogg differ
diff --git a/modular_citadel/sound/vox/test.ogg b/modular_citadel/sound/vox/test.ogg
new file mode 100644
index 0000000000..df3ab175c6
Binary files /dev/null and b/modular_citadel/sound/vox/test.ogg differ
diff --git a/modular_citadel/sound/vox/that.ogg b/modular_citadel/sound/vox/that.ogg
new file mode 100644
index 0000000000..442dc3d264
Binary files /dev/null and b/modular_citadel/sound/vox/that.ogg differ
diff --git a/modular_citadel/sound/vox/the.ogg b/modular_citadel/sound/vox/the.ogg
new file mode 100644
index 0000000000..71caecef1f
Binary files /dev/null and b/modular_citadel/sound/vox/the.ogg differ
diff --git a/modular_citadel/sound/vox/then.ogg b/modular_citadel/sound/vox/then.ogg
new file mode 100644
index 0000000000..916d9276af
Binary files /dev/null and b/modular_citadel/sound/vox/then.ogg differ
diff --git a/modular_citadel/sound/vox/there.ogg b/modular_citadel/sound/vox/there.ogg
new file mode 100644
index 0000000000..c3536a2f72
Binary files /dev/null and b/modular_citadel/sound/vox/there.ogg differ
diff --git a/modular_citadel/sound/vox/third.ogg b/modular_citadel/sound/vox/third.ogg
new file mode 100644
index 0000000000..ba1125fe5b
Binary files /dev/null and b/modular_citadel/sound/vox/third.ogg differ
diff --git a/modular_citadel/sound/vox/thirteen.ogg b/modular_citadel/sound/vox/thirteen.ogg
new file mode 100644
index 0000000000..b3585a2d3b
Binary files /dev/null and b/modular_citadel/sound/vox/thirteen.ogg differ
diff --git a/modular_citadel/sound/vox/thirty.ogg b/modular_citadel/sound/vox/thirty.ogg
new file mode 100644
index 0000000000..cac0402265
Binary files /dev/null and b/modular_citadel/sound/vox/thirty.ogg differ
diff --git a/modular_citadel/sound/vox/this.ogg b/modular_citadel/sound/vox/this.ogg
new file mode 100644
index 0000000000..e7acd16108
Binary files /dev/null and b/modular_citadel/sound/vox/this.ogg differ
diff --git a/modular_citadel/sound/vox/those.ogg b/modular_citadel/sound/vox/those.ogg
new file mode 100644
index 0000000000..149a806b23
Binary files /dev/null and b/modular_citadel/sound/vox/those.ogg differ
diff --git a/modular_citadel/sound/vox/thousand.ogg b/modular_citadel/sound/vox/thousand.ogg
new file mode 100644
index 0000000000..fd5d46bf9b
Binary files /dev/null and b/modular_citadel/sound/vox/thousand.ogg differ
diff --git a/modular_citadel/sound/vox/threat.ogg b/modular_citadel/sound/vox/threat.ogg
new file mode 100644
index 0000000000..d4aa8d1d13
Binary files /dev/null and b/modular_citadel/sound/vox/threat.ogg differ
diff --git a/modular_citadel/sound/vox/three.ogg b/modular_citadel/sound/vox/three.ogg
new file mode 100644
index 0000000000..72bab5ff6b
Binary files /dev/null and b/modular_citadel/sound/vox/three.ogg differ
diff --git a/modular_citadel/sound/vox/through.ogg b/modular_citadel/sound/vox/through.ogg
new file mode 100644
index 0000000000..9f527f38c7
Binary files /dev/null and b/modular_citadel/sound/vox/through.ogg differ
diff --git a/modular_citadel/sound/vox/time.ogg b/modular_citadel/sound/vox/time.ogg
new file mode 100644
index 0000000000..ff32baa603
Binary files /dev/null and b/modular_citadel/sound/vox/time.ogg differ
diff --git a/modular_citadel/sound/vox/to.ogg b/modular_citadel/sound/vox/to.ogg
new file mode 100644
index 0000000000..9e7f76c84d
Binary files /dev/null and b/modular_citadel/sound/vox/to.ogg differ
diff --git a/modular_citadel/sound/vox/top.ogg b/modular_citadel/sound/vox/top.ogg
new file mode 100644
index 0000000000..bc6b0bce22
Binary files /dev/null and b/modular_citadel/sound/vox/top.ogg differ
diff --git a/modular_citadel/sound/vox/topside.ogg b/modular_citadel/sound/vox/topside.ogg
new file mode 100644
index 0000000000..34dfaf4405
Binary files /dev/null and b/modular_citadel/sound/vox/topside.ogg differ
diff --git a/modular_citadel/sound/vox/touch.ogg b/modular_citadel/sound/vox/touch.ogg
new file mode 100644
index 0000000000..fe34a1b083
Binary files /dev/null and b/modular_citadel/sound/vox/touch.ogg differ
diff --git a/modular_citadel/sound/vox/towards.ogg b/modular_citadel/sound/vox/towards.ogg
new file mode 100644
index 0000000000..edb2bf04d1
Binary files /dev/null and b/modular_citadel/sound/vox/towards.ogg differ
diff --git a/modular_citadel/sound/vox/track.ogg b/modular_citadel/sound/vox/track.ogg
new file mode 100644
index 0000000000..447d1f6982
Binary files /dev/null and b/modular_citadel/sound/vox/track.ogg differ
diff --git a/modular_citadel/sound/vox/train.ogg b/modular_citadel/sound/vox/train.ogg
new file mode 100644
index 0000000000..e4b78fe638
Binary files /dev/null and b/modular_citadel/sound/vox/train.ogg differ
diff --git a/modular_citadel/sound/vox/transportation.ogg b/modular_citadel/sound/vox/transportation.ogg
new file mode 100644
index 0000000000..78d2122ccb
Binary files /dev/null and b/modular_citadel/sound/vox/transportation.ogg differ
diff --git a/modular_citadel/sound/vox/truck.ogg b/modular_citadel/sound/vox/truck.ogg
new file mode 100644
index 0000000000..5822f17d83
Binary files /dev/null and b/modular_citadel/sound/vox/truck.ogg differ
diff --git a/modular_citadel/sound/vox/tunnel.ogg b/modular_citadel/sound/vox/tunnel.ogg
new file mode 100644
index 0000000000..3264b41496
Binary files /dev/null and b/modular_citadel/sound/vox/tunnel.ogg differ
diff --git a/modular_citadel/sound/vox/turn.ogg b/modular_citadel/sound/vox/turn.ogg
new file mode 100644
index 0000000000..5a8a32cbd4
Binary files /dev/null and b/modular_citadel/sound/vox/turn.ogg differ
diff --git a/modular_citadel/sound/vox/turret.ogg b/modular_citadel/sound/vox/turret.ogg
new file mode 100644
index 0000000000..96d5bf6da9
Binary files /dev/null and b/modular_citadel/sound/vox/turret.ogg differ
diff --git a/modular_citadel/sound/vox/twelve.ogg b/modular_citadel/sound/vox/twelve.ogg
new file mode 100644
index 0000000000..2e45cf797d
Binary files /dev/null and b/modular_citadel/sound/vox/twelve.ogg differ
diff --git a/modular_citadel/sound/vox/twenty.ogg b/modular_citadel/sound/vox/twenty.ogg
new file mode 100644
index 0000000000..c54922a384
Binary files /dev/null and b/modular_citadel/sound/vox/twenty.ogg differ
diff --git a/modular_citadel/sound/vox/two.ogg b/modular_citadel/sound/vox/two.ogg
new file mode 100644
index 0000000000..e1abe93d97
Binary files /dev/null and b/modular_citadel/sound/vox/two.ogg differ
diff --git a/modular_citadel/sound/vox/unauthorized.ogg b/modular_citadel/sound/vox/unauthorized.ogg
new file mode 100644
index 0000000000..2238e09696
Binary files /dev/null and b/modular_citadel/sound/vox/unauthorized.ogg differ
diff --git a/modular_citadel/sound/vox/under.ogg b/modular_citadel/sound/vox/under.ogg
new file mode 100644
index 0000000000..8445ce571a
Binary files /dev/null and b/modular_citadel/sound/vox/under.ogg differ
diff --git a/modular_citadel/sound/vox/uniform.ogg b/modular_citadel/sound/vox/uniform.ogg
new file mode 100644
index 0000000000..6d3029ed7f
Binary files /dev/null and b/modular_citadel/sound/vox/uniform.ogg differ
diff --git a/modular_citadel/sound/vox/unlocked.ogg b/modular_citadel/sound/vox/unlocked.ogg
new file mode 100644
index 0000000000..1f66ba7003
Binary files /dev/null and b/modular_citadel/sound/vox/unlocked.ogg differ
diff --git a/modular_citadel/sound/vox/until.ogg b/modular_citadel/sound/vox/until.ogg
new file mode 100644
index 0000000000..00e1417aaa
Binary files /dev/null and b/modular_citadel/sound/vox/until.ogg differ
diff --git a/modular_citadel/sound/vox/up.ogg b/modular_citadel/sound/vox/up.ogg
new file mode 100644
index 0000000000..31d9dd13cc
Binary files /dev/null and b/modular_citadel/sound/vox/up.ogg differ
diff --git a/modular_citadel/sound/vox/upper.ogg b/modular_citadel/sound/vox/upper.ogg
new file mode 100644
index 0000000000..c26d7450ed
Binary files /dev/null and b/modular_citadel/sound/vox/upper.ogg differ
diff --git a/modular_citadel/sound/vox/uranium.ogg b/modular_citadel/sound/vox/uranium.ogg
new file mode 100644
index 0000000000..8eeed7b34e
Binary files /dev/null and b/modular_citadel/sound/vox/uranium.ogg differ
diff --git a/modular_citadel/sound/vox/us.ogg b/modular_citadel/sound/vox/us.ogg
new file mode 100644
index 0000000000..1d0cc90667
Binary files /dev/null and b/modular_citadel/sound/vox/us.ogg differ
diff --git a/modular_citadel/sound/vox/usa.ogg b/modular_citadel/sound/vox/usa.ogg
new file mode 100644
index 0000000000..2a057059f7
Binary files /dev/null and b/modular_citadel/sound/vox/usa.ogg differ
diff --git a/modular_citadel/sound/vox/use.ogg b/modular_citadel/sound/vox/use.ogg
new file mode 100644
index 0000000000..6fdb0d2f51
Binary files /dev/null and b/modular_citadel/sound/vox/use.ogg differ
diff --git a/modular_citadel/sound/vox/used.ogg b/modular_citadel/sound/vox/used.ogg
new file mode 100644
index 0000000000..126ab4cce3
Binary files /dev/null and b/modular_citadel/sound/vox/used.ogg differ
diff --git a/modular_citadel/sound/vox/user.ogg b/modular_citadel/sound/vox/user.ogg
new file mode 100644
index 0000000000..fa99d50a09
Binary files /dev/null and b/modular_citadel/sound/vox/user.ogg differ
diff --git a/modular_citadel/sound/vox/vacate.ogg b/modular_citadel/sound/vox/vacate.ogg
new file mode 100644
index 0000000000..1eadec9832
Binary files /dev/null and b/modular_citadel/sound/vox/vacate.ogg differ
diff --git a/modular_citadel/sound/vox/valid.ogg b/modular_citadel/sound/vox/valid.ogg
new file mode 100644
index 0000000000..5ec3b93b3b
Binary files /dev/null and b/modular_citadel/sound/vox/valid.ogg differ
diff --git a/modular_citadel/sound/vox/vapor.ogg b/modular_citadel/sound/vox/vapor.ogg
new file mode 100644
index 0000000000..9ceb555e77
Binary files /dev/null and b/modular_citadel/sound/vox/vapor.ogg differ
diff --git a/modular_citadel/sound/vox/vent.ogg b/modular_citadel/sound/vox/vent.ogg
new file mode 100644
index 0000000000..47f37d441f
Binary files /dev/null and b/modular_citadel/sound/vox/vent.ogg differ
diff --git a/modular_citadel/sound/vox/ventillation.ogg b/modular_citadel/sound/vox/ventillation.ogg
new file mode 100644
index 0000000000..a8e9928e7c
Binary files /dev/null and b/modular_citadel/sound/vox/ventillation.ogg differ
diff --git a/modular_citadel/sound/vox/victor.ogg b/modular_citadel/sound/vox/victor.ogg
new file mode 100644
index 0000000000..686b6fd7cd
Binary files /dev/null and b/modular_citadel/sound/vox/victor.ogg differ
diff --git a/modular_citadel/sound/vox/violated.ogg b/modular_citadel/sound/vox/violated.ogg
new file mode 100644
index 0000000000..01ebe6a2de
Binary files /dev/null and b/modular_citadel/sound/vox/violated.ogg differ
diff --git a/modular_citadel/sound/vox/violation.ogg b/modular_citadel/sound/vox/violation.ogg
new file mode 100644
index 0000000000..2d9e1b6fbe
Binary files /dev/null and b/modular_citadel/sound/vox/violation.ogg differ
diff --git a/modular_citadel/sound/vox/voltage.ogg b/modular_citadel/sound/vox/voltage.ogg
new file mode 100644
index 0000000000..64417b2556
Binary files /dev/null and b/modular_citadel/sound/vox/voltage.ogg differ
diff --git a/modular_citadel/sound/vox/vox_login.ogg b/modular_citadel/sound/vox/vox_login.ogg
new file mode 100644
index 0000000000..5c406191a2
Binary files /dev/null and b/modular_citadel/sound/vox/vox_login.ogg differ
diff --git a/modular_citadel/sound/vox/walk.ogg b/modular_citadel/sound/vox/walk.ogg
new file mode 100644
index 0000000000..6d4cebd36c
Binary files /dev/null and b/modular_citadel/sound/vox/walk.ogg differ
diff --git a/modular_citadel/sound/vox/wall.ogg b/modular_citadel/sound/vox/wall.ogg
new file mode 100644
index 0000000000..8f34bb6fdd
Binary files /dev/null and b/modular_citadel/sound/vox/wall.ogg differ
diff --git a/modular_citadel/sound/vox/want.ogg b/modular_citadel/sound/vox/want.ogg
new file mode 100644
index 0000000000..b307dbfdc6
Binary files /dev/null and b/modular_citadel/sound/vox/want.ogg differ
diff --git a/modular_citadel/sound/vox/wanted.ogg b/modular_citadel/sound/vox/wanted.ogg
new file mode 100644
index 0000000000..a783e64ee2
Binary files /dev/null and b/modular_citadel/sound/vox/wanted.ogg differ
diff --git a/modular_citadel/sound/vox/warm.ogg b/modular_citadel/sound/vox/warm.ogg
new file mode 100644
index 0000000000..00fbe521b1
Binary files /dev/null and b/modular_citadel/sound/vox/warm.ogg differ
diff --git a/modular_citadel/sound/vox/warn.ogg b/modular_citadel/sound/vox/warn.ogg
new file mode 100644
index 0000000000..931ae208c6
Binary files /dev/null and b/modular_citadel/sound/vox/warn.ogg differ
diff --git a/modular_citadel/sound/vox/warning.ogg b/modular_citadel/sound/vox/warning.ogg
new file mode 100644
index 0000000000..e237c5e0ae
Binary files /dev/null and b/modular_citadel/sound/vox/warning.ogg differ
diff --git a/modular_citadel/sound/vox/waste.ogg b/modular_citadel/sound/vox/waste.ogg
new file mode 100644
index 0000000000..7152c80fc8
Binary files /dev/null and b/modular_citadel/sound/vox/waste.ogg differ
diff --git a/modular_citadel/sound/vox/water.ogg b/modular_citadel/sound/vox/water.ogg
new file mode 100644
index 0000000000..fdced84c63
Binary files /dev/null and b/modular_citadel/sound/vox/water.ogg differ
diff --git a/modular_citadel/sound/vox/we.ogg b/modular_citadel/sound/vox/we.ogg
new file mode 100644
index 0000000000..f31d0c34d3
Binary files /dev/null and b/modular_citadel/sound/vox/we.ogg differ
diff --git a/modular_citadel/sound/vox/weapon.ogg b/modular_citadel/sound/vox/weapon.ogg
new file mode 100644
index 0000000000..fcf4b8bf07
Binary files /dev/null and b/modular_citadel/sound/vox/weapon.ogg differ
diff --git a/modular_citadel/sound/vox/west.ogg b/modular_citadel/sound/vox/west.ogg
new file mode 100644
index 0000000000..35eb23ac27
Binary files /dev/null and b/modular_citadel/sound/vox/west.ogg differ
diff --git a/modular_citadel/sound/vox/whiskey.ogg b/modular_citadel/sound/vox/whiskey.ogg
new file mode 100644
index 0000000000..53102ef546
Binary files /dev/null and b/modular_citadel/sound/vox/whiskey.ogg differ
diff --git a/modular_citadel/sound/vox/white.ogg b/modular_citadel/sound/vox/white.ogg
new file mode 100644
index 0000000000..b9c2c6e8fb
Binary files /dev/null and b/modular_citadel/sound/vox/white.ogg differ
diff --git a/modular_citadel/sound/vox/wilco.ogg b/modular_citadel/sound/vox/wilco.ogg
new file mode 100644
index 0000000000..08f1b38f60
Binary files /dev/null and b/modular_citadel/sound/vox/wilco.ogg differ
diff --git a/modular_citadel/sound/vox/will.ogg b/modular_citadel/sound/vox/will.ogg
new file mode 100644
index 0000000000..8b11eec8d5
Binary files /dev/null and b/modular_citadel/sound/vox/will.ogg differ
diff --git a/modular_citadel/sound/vox/with.ogg b/modular_citadel/sound/vox/with.ogg
new file mode 100644
index 0000000000..100131ddfd
Binary files /dev/null and b/modular_citadel/sound/vox/with.ogg differ
diff --git a/modular_citadel/sound/vox/without.ogg b/modular_citadel/sound/vox/without.ogg
new file mode 100644
index 0000000000..5e6b99206f
Binary files /dev/null and b/modular_citadel/sound/vox/without.ogg differ
diff --git a/modular_citadel/sound/vox/woop.ogg b/modular_citadel/sound/vox/woop.ogg
new file mode 100644
index 0000000000..c29a975858
Binary files /dev/null and b/modular_citadel/sound/vox/woop.ogg differ
diff --git a/modular_citadel/sound/vox/xeno.ogg b/modular_citadel/sound/vox/xeno.ogg
new file mode 100644
index 0000000000..9230e650c7
Binary files /dev/null and b/modular_citadel/sound/vox/xeno.ogg differ
diff --git a/modular_citadel/sound/vox/yankee.ogg b/modular_citadel/sound/vox/yankee.ogg
new file mode 100644
index 0000000000..ea5578d28f
Binary files /dev/null and b/modular_citadel/sound/vox/yankee.ogg differ
diff --git a/modular_citadel/sound/vox/yards.ogg b/modular_citadel/sound/vox/yards.ogg
new file mode 100644
index 0000000000..7b911ad4bd
Binary files /dev/null and b/modular_citadel/sound/vox/yards.ogg differ
diff --git a/modular_citadel/sound/vox/year.ogg b/modular_citadel/sound/vox/year.ogg
new file mode 100644
index 0000000000..7cd1065af1
Binary files /dev/null and b/modular_citadel/sound/vox/year.ogg differ
diff --git a/modular_citadel/sound/vox/yellow.ogg b/modular_citadel/sound/vox/yellow.ogg
new file mode 100644
index 0000000000..87668cd45f
Binary files /dev/null and b/modular_citadel/sound/vox/yellow.ogg differ
diff --git a/modular_citadel/sound/vox/yes.ogg b/modular_citadel/sound/vox/yes.ogg
new file mode 100644
index 0000000000..24be399de3
Binary files /dev/null and b/modular_citadel/sound/vox/yes.ogg differ
diff --git a/modular_citadel/sound/vox/you.ogg b/modular_citadel/sound/vox/you.ogg
new file mode 100644
index 0000000000..4a30e5c721
Binary files /dev/null and b/modular_citadel/sound/vox/you.ogg differ
diff --git a/modular_citadel/sound/vox/your.ogg b/modular_citadel/sound/vox/your.ogg
new file mode 100644
index 0000000000..12d49c3ded
Binary files /dev/null and b/modular_citadel/sound/vox/your.ogg differ
diff --git a/modular_citadel/sound/vox/yourself.ogg b/modular_citadel/sound/vox/yourself.ogg
new file mode 100644
index 0000000000..03a0af6531
Binary files /dev/null and b/modular_citadel/sound/vox/yourself.ogg differ
diff --git a/modular_citadel/sound/vox/zero.ogg b/modular_citadel/sound/vox/zero.ogg
new file mode 100644
index 0000000000..e14f91344c
Binary files /dev/null and b/modular_citadel/sound/vox/zero.ogg differ
diff --git a/modular_citadel/sound/vox/zone.ogg b/modular_citadel/sound/vox/zone.ogg
new file mode 100644
index 0000000000..3c8834c8f4
Binary files /dev/null and b/modular_citadel/sound/vox/zone.ogg differ
diff --git a/modular_citadel/sound/vox/zulu.ogg b/modular_citadel/sound/vox/zulu.ogg
new file mode 100644
index 0000000000..739cdd2187
Binary files /dev/null and b/modular_citadel/sound/vox/zulu.ogg differ
diff --git a/sound/FermiChem/SoundSources.txt b/sound/FermiChem/SoundSources.txt
new file mode 100644
index 0000000000..1420814d4a
--- /dev/null
+++ b/sound/FermiChem/SoundSources.txt
@@ -0,0 +1,11 @@
+heatmelt.ogg - from https://freesound.org/people/toiletrolltube/sounds/181483/
+ from https://freesound.org/people/MrVasLuk/sounds/304619/
+ from https://freesound.org/people/Benboncan/sounds/74899/
+ from bubbles2.ogg
+heatacid.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/
+ from bubbles2.ogg
+ from fuse.ogg
+bufferadd.ogg- https://freesound.org/people/toiletrolltube/sounds/181483/
+heatdamn.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/
+
+Work is licensed under the Creative Commons and Attribution License.
\ No newline at end of file
diff --git a/sound/FermiChem/acidmelt.ogg b/sound/FermiChem/acidmelt.ogg
new file mode 100644
index 0000000000..bef257be55
Binary files /dev/null and b/sound/FermiChem/acidmelt.ogg differ
diff --git a/sound/FermiChem/bufferadd.ogg b/sound/FermiChem/bufferadd.ogg
new file mode 100644
index 0000000000..31bc440425
Binary files /dev/null and b/sound/FermiChem/bufferadd.ogg differ
diff --git a/sound/FermiChem/heatdam.ogg b/sound/FermiChem/heatdam.ogg
new file mode 100644
index 0000000000..ab8492e966
Binary files /dev/null and b/sound/FermiChem/heatdam.ogg differ
diff --git a/sound/FermiChem/heatmelt.ogg b/sound/FermiChem/heatmelt.ogg
new file mode 100644
index 0000000000..87dab3a18f
Binary files /dev/null and b/sound/FermiChem/heatmelt.ogg differ
diff --git a/sound/creatures/goose1.ogg b/sound/creatures/goose1.ogg
new file mode 100644
index 0000000000..3d605ad622
Binary files /dev/null and b/sound/creatures/goose1.ogg differ
diff --git a/sound/creatures/goose2.ogg b/sound/creatures/goose2.ogg
new file mode 100644
index 0000000000..735faba791
Binary files /dev/null and b/sound/creatures/goose2.ogg differ
diff --git a/sound/creatures/goose3.ogg b/sound/creatures/goose3.ogg
new file mode 100644
index 0000000000..1aeec77369
Binary files /dev/null and b/sound/creatures/goose3.ogg differ
diff --git a/sound/creatures/goose4.ogg b/sound/creatures/goose4.ogg
new file mode 100644
index 0000000000..699f143bd3
Binary files /dev/null and b/sound/creatures/goose4.ogg differ
diff --git a/sound/music/flyinghigh.ogg b/sound/music/flyinghigh.ogg
new file mode 100644
index 0000000000..4f1aa1458a
Binary files /dev/null and b/sound/music/flyinghigh.ogg differ
diff --git a/sound/music/samsara.ogg b/sound/music/samsara.ogg
new file mode 100644
index 0000000000..4842aab3e5
Binary files /dev/null and b/sound/music/samsara.ogg differ
diff --git a/sound/music/theend.ogg b/sound/music/theend.ogg
new file mode 100644
index 0000000000..52255eee2a
Binary files /dev/null and b/sound/music/theend.ogg differ
diff --git a/sound/spookoween/ahaha.ogg b/sound/spookoween/ahaha.ogg
new file mode 100644
index 0000000000..2e830ad6c7
Binary files /dev/null and b/sound/spookoween/ahaha.ogg differ
diff --git a/sound/vore/LICENSE.txt b/sound/vore/LICENSE.txt
index ce95152f5d..a1e539b762 100644
--- a/sound/vore/LICENSE.txt
+++ b/sound/vore/LICENSE.txt
@@ -1 +1,3 @@
-Audio work within these folders are © Poojawa 2017, all rights reserved.
\ No newline at end of file
+Audio work within these folders are © Poojawa 2017, all rights reserved.
+
+Artist work by ChemicalCrux
\ No newline at end of file
diff --git a/sound/vore/pred/death_01.ogg b/sound/vore/pred/death_01.ogg
index 63ace65beb..231884ef54 100644
Binary files a/sound/vore/pred/death_01.ogg and b/sound/vore/pred/death_01.ogg differ
diff --git a/sound/vore/pred/death_02.ogg b/sound/vore/pred/death_02.ogg
index 4185f6fb20..5de3e4148c 100644
Binary files a/sound/vore/pred/death_02.ogg and b/sound/vore/pred/death_02.ogg differ
diff --git a/sound/vore/pred/death_03.ogg b/sound/vore/pred/death_03.ogg
index a9e5d769df..4ffa271af7 100644
Binary files a/sound/vore/pred/death_03.ogg and b/sound/vore/pred/death_03.ogg differ
diff --git a/sound/vore/pred/death_04.ogg b/sound/vore/pred/death_04.ogg
index 4deb6d5ec8..a4c0e91be6 100644
Binary files a/sound/vore/pred/death_04.ogg and b/sound/vore/pred/death_04.ogg differ
diff --git a/sound/vore/pred/death_05.ogg b/sound/vore/pred/death_05.ogg
index 9c359627c3..aeec557758 100644
Binary files a/sound/vore/pred/death_05.ogg and b/sound/vore/pred/death_05.ogg differ
diff --git a/sound/vore/pred/death_06.ogg b/sound/vore/pred/death_06.ogg
index 3d0fd0f58c..f5b077ebd4 100644
Binary files a/sound/vore/pred/death_06.ogg and b/sound/vore/pred/death_06.ogg differ
diff --git a/sound/vore/pred/death_07.ogg b/sound/vore/pred/death_07.ogg
index 98454abac9..afaaab65bb 100644
Binary files a/sound/vore/pred/death_07.ogg and b/sound/vore/pred/death_07.ogg differ
diff --git a/sound/vore/pred/death_08.ogg b/sound/vore/pred/death_08.ogg
index 068d6b8355..b1b8479ea8 100644
Binary files a/sound/vore/pred/death_08.ogg and b/sound/vore/pred/death_08.ogg differ
diff --git a/sound/vore/pred/death_09.ogg b/sound/vore/pred/death_09.ogg
index a4ad821c16..1454deafad 100644
Binary files a/sound/vore/pred/death_09.ogg and b/sound/vore/pred/death_09.ogg differ
diff --git a/sound/vore/pred/death_10.ogg b/sound/vore/pred/death_10.ogg
index b67868442f..f0e23e1d54 100644
Binary files a/sound/vore/pred/death_10.ogg and b/sound/vore/pred/death_10.ogg differ
diff --git a/sound/vore/pred/death_11.ogg b/sound/vore/pred/death_11.ogg
index db125edf80..43e80467e0 100644
Binary files a/sound/vore/pred/death_11.ogg and b/sound/vore/pred/death_11.ogg differ
diff --git a/sound/vore/pred/death_12.ogg b/sound/vore/pred/death_12.ogg
index ab4c548744..5ec6029998 100644
Binary files a/sound/vore/pred/death_12.ogg and b/sound/vore/pred/death_12.ogg differ
diff --git a/sound/vore/pred/death_13.ogg b/sound/vore/pred/death_13.ogg
index 008941942f..9073bac4f2 100644
Binary files a/sound/vore/pred/death_13.ogg and b/sound/vore/pred/death_13.ogg differ
diff --git a/sound/vore/pred/digest_01.ogg b/sound/vore/pred/digest_01.ogg
index 09e6805e90..20b6d1d43a 100644
Binary files a/sound/vore/pred/digest_01.ogg and b/sound/vore/pred/digest_01.ogg differ
diff --git a/sound/vore/pred/digest_02.ogg b/sound/vore/pred/digest_02.ogg
index d6852aeb9a..7fc41e2305 100644
Binary files a/sound/vore/pred/digest_02.ogg and b/sound/vore/pred/digest_02.ogg differ
diff --git a/sound/vore/pred/digest_03.ogg b/sound/vore/pred/digest_03.ogg
index 9e85de831e..98b032c7cb 100644
Binary files a/sound/vore/pred/digest_03.ogg and b/sound/vore/pred/digest_03.ogg differ
diff --git a/sound/vore/pred/digest_04.ogg b/sound/vore/pred/digest_04.ogg
index b35da498d3..ed494e813c 100644
Binary files a/sound/vore/pred/digest_04.ogg and b/sound/vore/pred/digest_04.ogg differ
diff --git a/sound/vore/pred/digest_05.ogg b/sound/vore/pred/digest_05.ogg
index 60ea067a91..53bb4814f7 100644
Binary files a/sound/vore/pred/digest_05.ogg and b/sound/vore/pred/digest_05.ogg differ
diff --git a/sound/vore/pred/digest_06.ogg b/sound/vore/pred/digest_06.ogg
index 4dcf50b699..787c336282 100644
Binary files a/sound/vore/pred/digest_06.ogg and b/sound/vore/pred/digest_06.ogg differ
diff --git a/sound/vore/pred/digest_07.ogg b/sound/vore/pred/digest_07.ogg
index 4d8fefd100..f63d4c633a 100644
Binary files a/sound/vore/pred/digest_07.ogg and b/sound/vore/pred/digest_07.ogg differ
diff --git a/sound/vore/pred/digest_08.ogg b/sound/vore/pred/digest_08.ogg
index da8b3fa963..dbbda3b517 100644
Binary files a/sound/vore/pred/digest_08.ogg and b/sound/vore/pred/digest_08.ogg differ
diff --git a/sound/vore/pred/digest_09.ogg b/sound/vore/pred/digest_09.ogg
index 072efb17fb..1877f1ca05 100644
Binary files a/sound/vore/pred/digest_09.ogg and b/sound/vore/pred/digest_09.ogg differ
diff --git a/sound/vore/pred/digest_10.ogg b/sound/vore/pred/digest_10.ogg
index fb69e4fd1a..3e22b8b2fb 100644
Binary files a/sound/vore/pred/digest_10.ogg and b/sound/vore/pred/digest_10.ogg differ
diff --git a/sound/vore/pred/digest_11.ogg b/sound/vore/pred/digest_11.ogg
index 611882b6d3..089d4ee7e4 100644
Binary files a/sound/vore/pred/digest_11.ogg and b/sound/vore/pred/digest_11.ogg differ
diff --git a/sound/vore/pred/digest_12.ogg b/sound/vore/pred/digest_12.ogg
index c9e004afb7..76a9134646 100644
Binary files a/sound/vore/pred/digest_12.ogg and b/sound/vore/pred/digest_12.ogg differ
diff --git a/sound/vore/pred/digest_13.ogg b/sound/vore/pred/digest_13.ogg
index 45a9d59f52..12b1c6bb18 100644
Binary files a/sound/vore/pred/digest_13.ogg and b/sound/vore/pred/digest_13.ogg differ
diff --git a/sound/vore/pred/digest_14.ogg b/sound/vore/pred/digest_14.ogg
index 9815d172ca..c68231585c 100644
Binary files a/sound/vore/pred/digest_14.ogg and b/sound/vore/pred/digest_14.ogg differ
diff --git a/sound/vore/pred/digest_15.ogg b/sound/vore/pred/digest_15.ogg
index d2e44ecc86..32aecca35b 100644
Binary files a/sound/vore/pred/digest_15.ogg and b/sound/vore/pred/digest_15.ogg differ
diff --git a/sound/vore/pred/digest_16.ogg b/sound/vore/pred/digest_16.ogg
index 84faa4bd99..d112913570 100644
Binary files a/sound/vore/pred/digest_16.ogg and b/sound/vore/pred/digest_16.ogg differ
diff --git a/sound/vore/pred/digest_17.ogg b/sound/vore/pred/digest_17.ogg
index 0dd6fd4989..d23c4c6ddc 100644
Binary files a/sound/vore/pred/digest_17.ogg and b/sound/vore/pred/digest_17.ogg differ
diff --git a/sound/vore/pred/digest_18.ogg b/sound/vore/pred/digest_18.ogg
index a9fa5b51f9..ae8ac9f74f 100644
Binary files a/sound/vore/pred/digest_18.ogg and b/sound/vore/pred/digest_18.ogg differ
diff --git a/sound/vore/pred/escape.ogg b/sound/vore/pred/escape.ogg
index a823fc1284..fc093a5acf 100644
Binary files a/sound/vore/pred/escape.ogg and b/sound/vore/pred/escape.ogg differ
diff --git a/sound/vore/pred/insertion_01.ogg b/sound/vore/pred/insertion_01.ogg
index 6a8e7e3ff0..4ca8b6e425 100644
Binary files a/sound/vore/pred/insertion_01.ogg and b/sound/vore/pred/insertion_01.ogg differ
diff --git a/sound/vore/pred/insertion_02.ogg b/sound/vore/pred/insertion_02.ogg
index c6e4f96d94..a23cfaf201 100644
Binary files a/sound/vore/pred/insertion_02.ogg and b/sound/vore/pred/insertion_02.ogg differ
diff --git a/sound/vore/pred/loop.ogg b/sound/vore/pred/loop.ogg
index afd6e6003d..5f0994251a 100644
Binary files a/sound/vore/pred/loop.ogg and b/sound/vore/pred/loop.ogg differ
diff --git a/sound/vore/pred/schlorp.ogg b/sound/vore/pred/schlorp.ogg
index c9cd5a3413..eefb9dd71e 100644
Binary files a/sound/vore/pred/schlorp.ogg and b/sound/vore/pred/schlorp.ogg differ
diff --git a/sound/vore/pred/squish _02.ogg b/sound/vore/pred/squish _02.ogg
index 2e3effb4d7..846f0a2ece 100644
Binary files a/sound/vore/pred/squish _02.ogg and b/sound/vore/pred/squish _02.ogg differ
diff --git a/sound/vore/pred/squish _03.ogg b/sound/vore/pred/squish _03.ogg
index 24b5f9ce02..568aa81a3d 100644
Binary files a/sound/vore/pred/squish _03.ogg and b/sound/vore/pred/squish _03.ogg differ
diff --git a/sound/vore/pred/squish_01.ogg b/sound/vore/pred/squish_01.ogg
index 17dc83ed98..bc014b811d 100644
Binary files a/sound/vore/pred/squish_01.ogg and b/sound/vore/pred/squish_01.ogg differ
diff --git a/sound/vore/pred/squish_02.ogg b/sound/vore/pred/squish_02.ogg
index febc4c106e..8d92bfd19e 100644
Binary files a/sound/vore/pred/squish_02.ogg and b/sound/vore/pred/squish_02.ogg differ
diff --git a/sound/vore/pred/squish_03.ogg b/sound/vore/pred/squish_03.ogg
index c1b544806b..f62bf7ff60 100644
Binary files a/sound/vore/pred/squish_03.ogg and b/sound/vore/pred/squish_03.ogg differ
diff --git a/sound/vore/pred/squish_04.ogg b/sound/vore/pred/squish_04.ogg
index e764ba051b..47037d9a3a 100644
Binary files a/sound/vore/pred/squish_04.ogg and b/sound/vore/pred/squish_04.ogg differ
diff --git a/sound/vore/pred/stomachmove.ogg b/sound/vore/pred/stomachmove.ogg
index 3a9ed98dae..4e11cc03ed 100644
Binary files a/sound/vore/pred/stomachmove.ogg and b/sound/vore/pred/stomachmove.ogg differ
diff --git a/sound/vore/pred/struggle_01.ogg b/sound/vore/pred/struggle_01.ogg
index aea5581889..96c569b0f9 100644
Binary files a/sound/vore/pred/struggle_01.ogg and b/sound/vore/pred/struggle_01.ogg differ
diff --git a/sound/vore/pred/struggle_02.ogg b/sound/vore/pred/struggle_02.ogg
index 526abd0a9e..2f0d3324f1 100644
Binary files a/sound/vore/pred/struggle_02.ogg and b/sound/vore/pred/struggle_02.ogg differ
diff --git a/sound/vore/pred/struggle_03.ogg b/sound/vore/pred/struggle_03.ogg
index f3300a8bf3..9632817010 100644
Binary files a/sound/vore/pred/struggle_03.ogg and b/sound/vore/pred/struggle_03.ogg differ
diff --git a/sound/vore/pred/struggle_04.ogg b/sound/vore/pred/struggle_04.ogg
index 9efa23eaa9..7a30de3baf 100644
Binary files a/sound/vore/pred/struggle_04.ogg and b/sound/vore/pred/struggle_04.ogg differ
diff --git a/sound/vore/pred/struggle_05.ogg b/sound/vore/pred/struggle_05.ogg
index ec4d006880..0bae93d50f 100644
Binary files a/sound/vore/pred/struggle_05.ogg and b/sound/vore/pred/struggle_05.ogg differ
diff --git a/sound/vore/pred/swallow_01.ogg b/sound/vore/pred/swallow_01.ogg
index 1767daf0e8..45a0008586 100644
Binary files a/sound/vore/pred/swallow_01.ogg and b/sound/vore/pred/swallow_01.ogg differ
diff --git a/sound/vore/pred/swallow_02.ogg b/sound/vore/pred/swallow_02.ogg
index dd906bfad8..8f9bcb2e84 100644
Binary files a/sound/vore/pred/swallow_02.ogg and b/sound/vore/pred/swallow_02.ogg differ
diff --git a/sound/vore/pred/taurswallow.ogg b/sound/vore/pred/taurswallow.ogg
index 697947fb49..c700f71803 100644
Binary files a/sound/vore/pred/taurswallow.ogg and b/sound/vore/pred/taurswallow.ogg differ
diff --git a/sound/vore/prey/death_01.ogg b/sound/vore/prey/death_01.ogg
index fb73f520d8..539a873a7e 100644
Binary files a/sound/vore/prey/death_01.ogg and b/sound/vore/prey/death_01.ogg differ
diff --git a/sound/vore/prey/death_02.ogg b/sound/vore/prey/death_02.ogg
index 96a4004691..4dd1a285ea 100644
Binary files a/sound/vore/prey/death_02.ogg and b/sound/vore/prey/death_02.ogg differ
diff --git a/sound/vore/prey/death_03.ogg b/sound/vore/prey/death_03.ogg
index faae0c0cad..30a3622c86 100644
Binary files a/sound/vore/prey/death_03.ogg and b/sound/vore/prey/death_03.ogg differ
diff --git a/sound/vore/prey/death_04.ogg b/sound/vore/prey/death_04.ogg
index 7a7230e11c..ff983c2c31 100644
Binary files a/sound/vore/prey/death_04.ogg and b/sound/vore/prey/death_04.ogg differ
diff --git a/sound/vore/prey/death_05.ogg b/sound/vore/prey/death_05.ogg
index 91e351a62c..44b8603048 100644
Binary files a/sound/vore/prey/death_05.ogg and b/sound/vore/prey/death_05.ogg differ
diff --git a/sound/vore/prey/death_06.ogg b/sound/vore/prey/death_06.ogg
index 59f5f5cde9..836a4fd18c 100644
Binary files a/sound/vore/prey/death_06.ogg and b/sound/vore/prey/death_06.ogg differ
diff --git a/sound/vore/prey/death_07.ogg b/sound/vore/prey/death_07.ogg
index 6a8ef68561..2406fea727 100644
Binary files a/sound/vore/prey/death_07.ogg and b/sound/vore/prey/death_07.ogg differ
diff --git a/sound/vore/prey/death_08.ogg b/sound/vore/prey/death_08.ogg
index 1991706d94..0d7627dfae 100644
Binary files a/sound/vore/prey/death_08.ogg and b/sound/vore/prey/death_08.ogg differ
diff --git a/sound/vore/prey/death_09.ogg b/sound/vore/prey/death_09.ogg
index c209e5f112..fa00a29d31 100644
Binary files a/sound/vore/prey/death_09.ogg and b/sound/vore/prey/death_09.ogg differ
diff --git a/sound/vore/prey/death_10.ogg b/sound/vore/prey/death_10.ogg
index ccf51389f1..738e7cf909 100644
Binary files a/sound/vore/prey/death_10.ogg and b/sound/vore/prey/death_10.ogg differ
diff --git a/sound/vore/prey/death_11.ogg b/sound/vore/prey/death_11.ogg
index b8089d0d88..bfd47945ae 100644
Binary files a/sound/vore/prey/death_11.ogg and b/sound/vore/prey/death_11.ogg differ
diff --git a/sound/vore/prey/death_12.ogg b/sound/vore/prey/death_12.ogg
index b39a17b9aa..e6e800b2da 100644
Binary files a/sound/vore/prey/death_12.ogg and b/sound/vore/prey/death_12.ogg differ
diff --git a/sound/vore/prey/death_13.ogg b/sound/vore/prey/death_13.ogg
index 375e1ec72f..c9b79887d7 100644
Binary files a/sound/vore/prey/death_13.ogg and b/sound/vore/prey/death_13.ogg differ
diff --git a/sound/vore/prey/digest_01.ogg b/sound/vore/prey/digest_01.ogg
index 0340773865..a1d13f7fb7 100644
Binary files a/sound/vore/prey/digest_01.ogg and b/sound/vore/prey/digest_01.ogg differ
diff --git a/sound/vore/prey/digest_02.ogg b/sound/vore/prey/digest_02.ogg
index 837e894f80..443d23c194 100644
Binary files a/sound/vore/prey/digest_02.ogg and b/sound/vore/prey/digest_02.ogg differ
diff --git a/sound/vore/prey/digest_03.ogg b/sound/vore/prey/digest_03.ogg
index 6f5db33b78..eb798b66ff 100644
Binary files a/sound/vore/prey/digest_03.ogg and b/sound/vore/prey/digest_03.ogg differ
diff --git a/sound/vore/prey/digest_04.ogg b/sound/vore/prey/digest_04.ogg
index b4184cd2a9..a2c2c3e1ac 100644
Binary files a/sound/vore/prey/digest_04.ogg and b/sound/vore/prey/digest_04.ogg differ
diff --git a/sound/vore/prey/digest_05.ogg b/sound/vore/prey/digest_05.ogg
index 79209df1f5..752a6d48f3 100644
Binary files a/sound/vore/prey/digest_05.ogg and b/sound/vore/prey/digest_05.ogg differ
diff --git a/sound/vore/prey/digest_06.ogg b/sound/vore/prey/digest_06.ogg
index 193167c50d..f2e80b919f 100644
Binary files a/sound/vore/prey/digest_06.ogg and b/sound/vore/prey/digest_06.ogg differ
diff --git a/sound/vore/prey/digest_07.ogg b/sound/vore/prey/digest_07.ogg
index 1092c3d5e0..6a2ff70ff8 100644
Binary files a/sound/vore/prey/digest_07.ogg and b/sound/vore/prey/digest_07.ogg differ
diff --git a/sound/vore/prey/digest_08.ogg b/sound/vore/prey/digest_08.ogg
index ef6aa1dcab..4e55f4671d 100644
Binary files a/sound/vore/prey/digest_08.ogg and b/sound/vore/prey/digest_08.ogg differ
diff --git a/sound/vore/prey/digest_09.ogg b/sound/vore/prey/digest_09.ogg
index db0a07d2b8..452e6b4a2e 100644
Binary files a/sound/vore/prey/digest_09.ogg and b/sound/vore/prey/digest_09.ogg differ
diff --git a/sound/vore/prey/digest_10.ogg b/sound/vore/prey/digest_10.ogg
index 788350acc6..4c5dc2e333 100644
Binary files a/sound/vore/prey/digest_10.ogg and b/sound/vore/prey/digest_10.ogg differ
diff --git a/sound/vore/prey/digest_11.ogg b/sound/vore/prey/digest_11.ogg
index 9f00271cd3..e94c0af656 100644
Binary files a/sound/vore/prey/digest_11.ogg and b/sound/vore/prey/digest_11.ogg differ
diff --git a/sound/vore/prey/digest_12.ogg b/sound/vore/prey/digest_12.ogg
index 4a7e360688..cb212fed1c 100644
Binary files a/sound/vore/prey/digest_12.ogg and b/sound/vore/prey/digest_12.ogg differ
diff --git a/sound/vore/prey/digest_13.ogg b/sound/vore/prey/digest_13.ogg
index 890c65ab08..9fd292184e 100644
Binary files a/sound/vore/prey/digest_13.ogg and b/sound/vore/prey/digest_13.ogg differ
diff --git a/sound/vore/prey/digest_14.ogg b/sound/vore/prey/digest_14.ogg
index de54440ea5..24279d4712 100644
Binary files a/sound/vore/prey/digest_14.ogg and b/sound/vore/prey/digest_14.ogg differ
diff --git a/sound/vore/prey/digest_15.ogg b/sound/vore/prey/digest_15.ogg
index 52ad557e84..2bf555ba41 100644
Binary files a/sound/vore/prey/digest_15.ogg and b/sound/vore/prey/digest_15.ogg differ
diff --git a/sound/vore/prey/digest_16.ogg b/sound/vore/prey/digest_16.ogg
index f2ff139651..98edd6fb61 100644
Binary files a/sound/vore/prey/digest_16.ogg and b/sound/vore/prey/digest_16.ogg differ
diff --git a/sound/vore/prey/digest_17.ogg b/sound/vore/prey/digest_17.ogg
index fa8ac42ae4..2ff5c173e1 100644
Binary files a/sound/vore/prey/digest_17.ogg and b/sound/vore/prey/digest_17.ogg differ
diff --git a/sound/vore/prey/digest_18.ogg b/sound/vore/prey/digest_18.ogg
index f6fa631ad3..6a1ae78fb8 100644
Binary files a/sound/vore/prey/digest_18.ogg and b/sound/vore/prey/digest_18.ogg differ
diff --git a/sound/vore/prey/escape.ogg b/sound/vore/prey/escape.ogg
index 9947f53013..621997a56d 100644
Binary files a/sound/vore/prey/escape.ogg and b/sound/vore/prey/escape.ogg differ
diff --git a/sound/vore/prey/insertion_01.ogg b/sound/vore/prey/insertion_01.ogg
index e8ec89cd9e..5a3b942bb3 100644
Binary files a/sound/vore/prey/insertion_01.ogg and b/sound/vore/prey/insertion_01.ogg differ
diff --git a/sound/vore/prey/insertion_02.ogg b/sound/vore/prey/insertion_02.ogg
index e21b6b23e8..2d35094522 100644
Binary files a/sound/vore/prey/insertion_02.ogg and b/sound/vore/prey/insertion_02.ogg differ
diff --git a/sound/vore/prey/loop.ogg b/sound/vore/prey/loop.ogg
index a6a040e501..1584482d92 100644
Binary files a/sound/vore/prey/loop.ogg and b/sound/vore/prey/loop.ogg differ
diff --git a/sound/vore/prey/schlorp.ogg b/sound/vore/prey/schlorp.ogg
index c9cd5a3413..d1895ee26a 100644
Binary files a/sound/vore/prey/schlorp.ogg and b/sound/vore/prey/schlorp.ogg differ
diff --git a/sound/vore/prey/squish_01.ogg b/sound/vore/prey/squish_01.ogg
index d1b3285381..2785a4a080 100644
Binary files a/sound/vore/prey/squish_01.ogg and b/sound/vore/prey/squish_01.ogg differ
diff --git a/sound/vore/prey/squish_02.ogg b/sound/vore/prey/squish_02.ogg
index f754a258f4..f5671f7165 100644
Binary files a/sound/vore/prey/squish_02.ogg and b/sound/vore/prey/squish_02.ogg differ
diff --git a/sound/vore/prey/squish_03.ogg b/sound/vore/prey/squish_03.ogg
index 9a01dcd2e9..1e8f2bb896 100644
Binary files a/sound/vore/prey/squish_03.ogg and b/sound/vore/prey/squish_03.ogg differ
diff --git a/sound/vore/prey/squish_04.ogg b/sound/vore/prey/squish_04.ogg
index d7c96b5bee..2e618890a9 100644
Binary files a/sound/vore/prey/squish_04.ogg and b/sound/vore/prey/squish_04.ogg differ
diff --git a/sound/vore/prey/stomachmove.ogg b/sound/vore/prey/stomachmove.ogg
index 1a32c7a217..e4e004b072 100644
Binary files a/sound/vore/prey/stomachmove.ogg and b/sound/vore/prey/stomachmove.ogg differ
diff --git a/sound/vore/prey/struggle_01.ogg b/sound/vore/prey/struggle_01.ogg
index ca90ed4f19..de0f3ad8bd 100644
Binary files a/sound/vore/prey/struggle_01.ogg and b/sound/vore/prey/struggle_01.ogg differ
diff --git a/sound/vore/prey/struggle_02.ogg b/sound/vore/prey/struggle_02.ogg
index 711c488db2..2695ab0adf 100644
Binary files a/sound/vore/prey/struggle_02.ogg and b/sound/vore/prey/struggle_02.ogg differ
diff --git a/sound/vore/prey/struggle_03.ogg b/sound/vore/prey/struggle_03.ogg
index d7e4e5f0bb..17dd8bec8a 100644
Binary files a/sound/vore/prey/struggle_03.ogg and b/sound/vore/prey/struggle_03.ogg differ
diff --git a/sound/vore/prey/struggle_04.ogg b/sound/vore/prey/struggle_04.ogg
index 4e6532a0fc..8631853509 100644
Binary files a/sound/vore/prey/struggle_04.ogg and b/sound/vore/prey/struggle_04.ogg differ
diff --git a/sound/vore/prey/struggle_05.ogg b/sound/vore/prey/struggle_05.ogg
index 6399d69adc..233addec0b 100644
Binary files a/sound/vore/prey/struggle_05.ogg and b/sound/vore/prey/struggle_05.ogg differ
diff --git a/sound/vore/prey/swallow_01.ogg b/sound/vore/prey/swallow_01.ogg
index 86e14ef7af..3da3fef66a 100644
Binary files a/sound/vore/prey/swallow_01.ogg and b/sound/vore/prey/swallow_01.ogg differ
diff --git a/sound/vore/prey/swallow_02.ogg b/sound/vore/prey/swallow_02.ogg
index dbfad7750a..30d9a4e44d 100644
Binary files a/sound/vore/prey/swallow_02.ogg and b/sound/vore/prey/swallow_02.ogg differ
diff --git a/sound/vore/prey/taurswallow.ogg b/sound/vore/prey/taurswallow.ogg
index 925ac9229c..f5b5706b36 100644
Binary files a/sound/vore/prey/taurswallow.ogg and b/sound/vore/prey/taurswallow.ogg differ
diff --git a/sound/weapons/neovgre_laser.ogg b/sound/weapons/neovgre_laser.ogg
new file mode 100644
index 0000000000..da97117ae8
Binary files /dev/null and b/sound/weapons/neovgre_laser.ogg differ
diff --git a/strings/dwarf_replacement.json b/strings/dwarf_replacement.json
new file mode 100644
index 0000000000..2049c5ab26
--- /dev/null
+++ b/strings/dwarf_replacement.json
@@ -0,0 +1,1461 @@
+{
+
+ "dwarf": {
+ "ability": "abeelitie",
+ "about": "aboot",
+ "above": "abuin",
+ "abroad": "abraid",
+ "absorb": "drack",
+ "absorbing": "drackin'",
+ "absorbs": "dracks",
+ "accuse": "delate",
+ "accused": "delated",
+ "across": "athwart",
+ "act": "ect",
+ "acts": "ects",
+ "add": "eik",
+ "added": "eikit",
+ "adds": "eiks",
+ "admit": "admeet",
+ "admits": "admeets",
+ "afraid": "feart",
+ "africa": "afrikey",
+ "after": "efter",
+ "against": "agin",
+ "alarm": "alairm",
+ "ale": "yill",
+ "all": "a'",
+ "allow": "allou",
+ "almost": "naur",
+ "along": "yont",
+ "aloof": "abeich",
+ "aloud": "lood out",
+ "also": "an a'",
+ "always": "aye",
+ "amazed": "dumfoundert",
+ "america": "amerikie",
+ "amidst": "'midst",
+ "among": [
+ "'mang",
+ "amang"
+ ],
+ "amount": [
+ "amoont",
+ "feck"
+ ],
+ "and": "an'",
+ "animal": "beist",
+ "animals": "beists",
+ "ankle": "cuit",
+ "ankles": "cuits",
+ "announce": "annoonce",
+ "announces": "annoonces",
+ "another": "anither",
+ "answered": "answert",
+ "ant": "eemock",
+ "ants": "eemocks",
+ "anxiety": "anxeeitie",
+ "any": "ony",
+ "anybody": "aebodie",
+ "apprentice": "prentice",
+ "apprentices": "prentices",
+ "are": "ar",
+ "aren't": "arena",
+ "arm": "airm",
+ "arrange": "dispone",
+ "arranged": "dispon'd",
+ "arranges": "dispones",
+ "arrest": "lift",
+ "arrested": "liftit",
+ "arrests": "lifts",
+ "arse": "erse",
+ "arses": "erses",
+ "artificial": "artifeicial",
+ "ash": "ase",
+ "ashes": "ase",
+ "aside": "ascient",
+ "ask": "aks",
+ "asked": "akst",
+ "asks": "aks",
+ "ass": "erse",
+ "asses": "erses",
+ "asshole": "hurdie",
+ "ate": "ett",
+ "aunt": "auntie",
+ "author": "owthor",
+ "awaken": "awauken",
+ "awakens": "awaukens",
+ "away": "awa",
+ "awful": "awfu",
+ "awfully": "awfy",
+ "awkward": "thrawart",
+ "awry": [
+ "aglae",
+ "ajee"
+ ],
+ "axe": "aix",
+ "axle": "aixle",
+ "back": "hint",
+ "bacon": "ham",
+ "bad": "ill",
+ "bags": "begs",
+ "bake": "bak",
+ "baked": "bakken",
+ "bakes": "baks",
+ "bald": "beld",
+ "ball": "baw",
+ "balls": "baws",
+ "bar": "baur",
+ "barber's": "baurber's",
+ "barber": "baurber",
+ "barbers": "baurbers",
+ "bastard": "bas",
+ "bat": "flichtermoose",
+ "baton": "rung",
+ "batons": "rungs",
+ "bats": "flichtermooses",
+ "beach": "foreland",
+ "beard": "bairds",
+ "beards": "bairds",
+ "beautiful": "bonnie",
+ "because": "kis",
+ "become": "set",
+ "becomes": "sets",
+ "bed": "scratcher",
+ "beds": "scratchers",
+ "bee's": "skep-bee's",
+ "bee": "skep-bee",
+ "bees": "skep-bees",
+ "beetle": "clock",
+ "beetles": "clocks",
+ "before": "afore",
+ "began": "begoud",
+ "being": "bein",
+ "belong": "belang",
+ "belonged": "belangit",
+ "belongs": "belangs",
+ "below": "ablo",
+ "beneath": "inunner",
+ "bent": "bowlt",
+ "besides": "forby",
+ "between": "atween",
+ "beware": "bewaur",
+ "bilberry": "blaeberry",
+ "bind": "thirl",
+ "binds": "thirls",
+ "bird": "burd",
+ "birds": "burdies",
+ "biscuit": "bannock",
+ "biscuits": "bannocks",
+ "bitch": "bick",
+ "bitches": "bicks",
+ "bitching": "bickerin'",
+ "bitter": "wersh",
+ "blackbird": "bleckie",
+ "blackbirds": "bleckies",
+ "blame": "wyse",
+ "blamed": "wysed",
+ "blames": "wyses",
+ "blast": "tout",
+ "blind": "blinnd",
+ "blood": "bluid",
+ "bloody": "bluidy",
+ "blue": "blae",
+ "boil": "bile",
+ "boils": "biles",
+ "bold": "bauld",
+ "bolder": "baulder",
+ "boldest": "bauldest",
+ "boldly": "baudly",
+ "bolt": "bowt",
+ "bone": "bane",
+ "bones": "banes",
+ "bony": "bainie",
+ "book": "beuk",
+ "books": "beuks",
+ "boot": "buit",
+ "borrow": "borrae",
+ "borrowed": "borraed",
+ "borrowing": "borrain'",
+ "borrows": "borraes",
+ "both": "baith",
+ "bother": "fash",
+ "box": [
+ "boax",
+ "kist"
+ ],
+ "boy": "laddie",
+ "boys": "laddies",
+ "brawl": "brulyie",
+ "breath": "braith",
+ "brew": "broo",
+ "broad": "braid",
+ "broke": "bruck",
+ "broken": "brustit",
+ "brood": "bairntime",
+ "broom": "besom",
+ "brooms": "besoms",
+ "broth": "brose",
+ "brother's": "brither's",
+ "brother": "brither",
+ "brothers": "brithers",
+ "brown": "broon",
+ "bucket": "backit",
+ "buckets": "backits",
+ "build": "big",
+ "built": "biggit",
+ "bump": "bumfle",
+ "buried": "yirdit",
+ "burnt": "brunt",
+ "bury": "birrie",
+ "busy": "bizzie",
+ "butcher": "flesher",
+ "butt": "dowp",
+ "buttocks": "dowp",
+ "button": "gornal",
+ "buttons": "gornals",
+ "butts": "bahookies",
+ "by": "bi",
+ "call": "ca'",
+ "called": "caad",
+ "calls": "ca'",
+ "came": "cam",
+ "can't": "cannae",
+ "cap": "kaip",
+ "caps": "kaips",
+ "captain's": "chief's",
+ "captain": "chief",
+ "car": "caur",
+ "card": "kerd",
+ "cards": "kerds",
+ "careful": "canny",
+ "careless": "feckless",
+ "carpenter": "jyner",
+ "carpenters": "jyners",
+ "carpet": "cairpet",
+ "carried": "cairiet",
+ "carries": "cairies",
+ "carry": "cairie",
+ "cart": "cairt",
+ "cash": "clink",
+ "cat's": "cheetie's",
+ "cat": "cheetie",
+ "catch": "kep",
+ "catched": "keppit",
+ "cats": "cheeties",
+ "caught": "keppit",
+ "cause": "gar",
+ "caused": "gart",
+ "certainly": "fairly",
+ "chance": "chaunce",
+ "chances": "chaunces",
+ "change": "chynge",
+ "changed": "chynged",
+ "changeling": "chyngelin'",
+ "chatter": "blether",
+ "cheer": "chear",
+ "cheerful": "chearfu'",
+ "cheerless": "chearless",
+ "cheers": "chears",
+ "cheery": "cheary",
+ "chest": "kist",
+ "chests": "kist",
+ "chick": "pout",
+ "chicks": "pouts",
+ "child": "bairn",
+ "chilly": "snell",
+ "chimney": "chimley",
+ "chimneys": "chimleys",
+ "choose": "chuise",
+ "chooses": "chuises",
+ "chosen": "chuist",
+ "christmas": "Yule",
+ "chunk": "dod",
+ "chunks": "dods",
+ "church": "kirk",
+ "cigarette": "baccie",
+ "cigarettes": "baccies",
+ "city": "ceity",
+ "clean": "clane",
+ "cloth": "cloot",
+ "clothes": "claes",
+ "cold": "cauld",
+ "comb": "kaim",
+ "commotion": "stramash",
+ "concerning": "anent",
+ "consider": "see",
+ "conspicuous": "kenspeckle",
+ "cool": "cuil",
+ "corner": "neuk",
+ "correctly": "swash",
+ "cosy": "codgie",
+ "cottage": "but and ben",
+ "cough": "hoast",
+ "could": "coud",
+ "couldn't": "coudnae",
+ "couldnt": "coudnae",
+ "country": "kintra",
+ "cow": "coo",
+ "crate": "kist",
+ "crates": "kists",
+ "creak": "jarg",
+ "creaked": "jarg'd",
+ "creaking": "jargin'",
+ "creaks": "jargs",
+ "creature": "cretter",
+ "creatures": "cretters",
+ "cries": "girns",
+ "critter": "cretter",
+ "critters": "cretters",
+ "crooked": "cruikit",
+ "crow": "corbie",
+ "crowbar": "louder",
+ "crowbars": "louders",
+ "crowd": "byke",
+ "cruel": "fell",
+ "crush": "brousle",
+ "crusher": "brousler",
+ "cry": "greet",
+ "crying": "greetin",
+ "cuff": "shackle",
+ "cuffed": "shackled",
+ "cuffing": "shackling",
+ "cuffs": "shangies",
+ "cup": "tassie",
+ "cut": "sned",
+ "cute": "gainin",
+ "cuts": "sneds",
+ "cutters": "sheers",
+ "daft": "dunderheided",
+ "damage": "skaith",
+ "dare": "daur",
+ "dared": "durst",
+ "daren't": "daurnae",
+ "darent": "daurnae",
+ "dares": "daurs",
+ "dark": "daurk",
+ "darken": "daurken",
+ "dawn": "cockcrow",
+ "dead": "deid",
+ "deaf": "deif",
+ "deafen": "deave",
+ "death": "dead",
+ "deaths": "deads",
+ "delightful": "lichtsome",
+ "delve": "del",
+ "deny": "forsay",
+ "depressed": "dumpie",
+ "describe": "descrive",
+ "devil": "de'il",
+ "didn't": "didnae",
+ "didnt": "didnae",
+ "die": "dee",
+ "died": "dee'd",
+ "dies": "dees",
+ "difficult": "difeecult",
+ "dig": "howk",
+ "directed": "airtit",
+ "directions": "airts",
+ "dirty": "clarty",
+ "discover": "diskiver",
+ "discovered": "diskiver'd",
+ "discovers": "diskivers",
+ "disgust": [
+ "sconner",
+ "scunner"
+ ],
+ "disgusting": "scunnersome",
+ "dishonest": "unhonest",
+ "dive": "dyve",
+ "dives": "dyves",
+ "diving": "dyvin'",
+ "do": "dae",
+ "does": "dis",
+ "dog": [
+ "dug",
+ "tyke"
+ ],
+ "dogs": "tykes",
+ "don't": "dinnae",
+ "done": "duin",
+ "dont": "dinnae",
+ "doom": "deim",
+ "doomed": "deim'd",
+ "door": "dorr",
+ "doors": "dorrs",
+ "doubt": "dout",
+ "doubted": "doutit",
+ "doubting": "doutin'",
+ "doubts": "douts",
+ "dough": "daugh",
+ "dove": "doo",
+ "down": "doun",
+ "downfall": "dounfaa",
+ "downtrodden": "dounhauden",
+ "drain": "stank",
+ "dread": "dreid",
+ "dream": "draim",
+ "dreams": "draims",
+ "drew": "draw",
+ "drink": "beb",
+ "drinks": "bebs",
+ "drip": "dreep",
+ "drive": "caw",
+ "drone": "bum",
+ "drones": "bums",
+ "drop": "drap",
+ "drown": "droun",
+ "drowned": "drount",
+ "drowning": "drounin'",
+ "drowns": "drouns",
+ "drug": "drog",
+ "drugs": "drogs",
+ "drunk": "drunken",
+ "drunkard": "sot",
+ "dry": "freuch",
+ "duck": "dook",
+ "ducked": "douked",
+ "dusk": "gloaming",
+ "dust": "stoor",
+ "dusty": "stourie",
+ "dwell": "wone",
+ "dying": "diein'",
+ "each": "ilk",
+ "eagle": [
+ "aigle",
+ "earn"
+ ],
+ "eagles": "earns",
+ "ear": "lug",
+ "early": "earlie",
+ "earth": "yird",
+ "east": "aist",
+ "eastern": "eastlin",
+ "easternmost": "eastmaist",
+ "eastmost": "eastmaist",
+ "eastward": "aistart",
+ "eat": "aet",
+ "eaten": "etten",
+ "eats": "aets",
+ "eden": "aidin",
+ "edinburgh": "auld reekie",
+ "eight": "eighct",
+ "eighteen": "aughten",
+ "else": "ense",
+ "empty": [
+ "empie",
+ "toom"
+ ],
+ "end": "en",
+ "endure": "thole",
+ "engine's": "ingine's",
+ "engine": "ingine",
+ "engineer's": "ingineer's",
+ "engineer": "ingineer",
+ "engineers'": "ingineers'",
+ "engineers": "ingineers",
+ "engines": "ingines",
+ "english": "soothron",
+ "enough's": "eneuch's",
+ "enough": "eneuch",
+ "equal": "match",
+ "escaped": "gat awa",
+ "eternal": "ayebidin",
+ "even": "e'en",
+ "evening": "e'en",
+ "ever": "iver",
+ "every": "ilka",
+ "everything": "iveriehott",
+ "everywhere": "aa wey",
+ "ewe": "yowe",
+ "example": "ensaumple",
+ "extraordinarily": "unco",
+ "extremely": "unco",
+ "eye": "ee",
+ "eyebrow": "e'ebrie",
+ "eyebrows": "e'ebries",
+ "eyes": "een",
+ "fall": "fa'",
+ "fallen": "fa'n",
+ "falling": "faain",
+ "falls": "fa's",
+ "false": "fause",
+ "family": "faimly",
+ "far": "faur",
+ "fart": "pump",
+ "farther": "faurer",
+ "farts": "pumps",
+ "father": "faither",
+ "fault": [
+ "blame",
+ "faut"
+ ],
+ "faults": "fauts",
+ "feeble": "doweless",
+ "feed": "beet",
+ "fellow": "chiel",
+ "fetch": "fuish",
+ "fetched": "fuishen",
+ "fetches": "fuishes",
+ "few": "puckle",
+ "fight": "fecht",
+ "fill": "ful",
+ "filled": "fult",
+ "find": "fin",
+ "fine": "braw",
+ "finely": "brawlie",
+ "fish": "fush",
+ "flake": "flichan",
+ "flakes": "flichans",
+ "flap": "flaff",
+ "flapped": "flaff'd",
+ "flapping": "flaffin",
+ "flaps": "flaffs",
+ "flea": "flaich",
+ "fleas": "flaich",
+ "flood": "speat",
+ "flour": "floor",
+ "flown": "flewn",
+ "flutter": "flitter",
+ "fluttered": "flittered",
+ "fluttering": "flittering",
+ "flutters": "flitter",
+ "fly": "flee",
+ "foam": "faem",
+ "folk": "fowk",
+ "food": "fuid",
+ "foot": "fuit",
+ "for": "fur",
+ "forget": "forgit",
+ "forgets": "forgits",
+ "forgive": "forgie",
+ "forgives": "forgies",
+ "forgot": "forgat",
+ "forsake": "forhou",
+ "forward": "forrit",
+ "fought": "feuchen",
+ "foul": "fyle",
+ "found": "funnd",
+ "four": "fower",
+ "fox": "tod",
+ "friend": "pal",
+ "friends": "mukkers",
+ "from": "fae",
+ "front": "foreside",
+ "frown": "glunch",
+ "frowned": "glunch'd",
+ "full": "stowed oot",
+ "fumble": "ficher",
+ "fumbled": "ficher'd",
+ "fumbles": "fichers",
+ "further": "farder",
+ "furthest": "benmaist",
+ "fussy": "fykie",
+ "gate": "yett",
+ "get": "git",
+ "gets": "gits",
+ "ghost": "ghaist",
+ "ghostdrone": "ghaistbum",
+ "ghostdrones": "ghaistbums",
+ "ghosts": "ghaists",
+ "gibberish": "blethers",
+ "girl": "lassie",
+ "girls": "lassies ",
+ "give": "gie",
+ "given": "gied",
+ "gives": "gies",
+ "glare": "glower",
+ "glared": "glower'd",
+ "glove": "gluive",
+ "gloves": "gluives",
+ "glow": "glowe",
+ "glows": "glowes",
+ "go": "gae",
+ "goat": "gait",
+ "goats": "gaits",
+ "goes": "gaes",
+ "going": "gaein",
+ "gone": "gaen",
+ "good": [
+ "braw",
+ "guid"
+ ],
+ "goodbye": "fare ye weel",
+ "gosh": "jings",
+ "got": "gat",
+ "grandmother": "aulddame",
+ "great": [
+ "braw",
+ "stoatin"
+ ],
+ "grin": "gandge",
+ "grip": "yoke",
+ "groin": "lisk",
+ "grow": "growe",
+ "grown": "growed",
+ "grows": "growes",
+ "guard": "waird",
+ "guess": "jalouse",
+ "guest": "caa'er",
+ "guests": "caa'ers",
+ "had": "haed",
+ "hadn't": "haednae",
+ "hadnt": "haednae",
+ "haggling": "priggin",
+ "half": "hauf",
+ "halfwit": "haiverel",
+ "halfwits": "haiverel",
+ "hall": "haa",
+ "halt": "stoppit",
+ "hammer": "haimer",
+ "hammers": "haimers",
+ "hand": "haun",
+ "handcuff": "haundshackle",
+ "handcuffed": "haundshackled",
+ "handcuffing": "haundshackling",
+ "handcuffs": "shangies",
+ "handle": "haunnle",
+ "hands": "hauns",
+ "hang": "hing",
+ "happy": "blythe",
+ "hard": "haurd",
+ "hardly": "haurdlie",
+ "harm": "skaith",
+ "harvest": "hairst",
+ "harvests": "hairsts",
+ "have": "hae",
+ "haven't": "hinna",
+ "havent": "hinna",
+ "head": "heid",
+ "healthy": "brosie",
+ "heard": "haurd",
+ "heart": "hert",
+ "hearty": "herty",
+ "hedgehog": "hurchin",
+ "hedgehogs": "hurchins",
+ "hello": "hullo",
+ "helmet": "helm",
+ "helmets": "helms",
+ "help": "hulp",
+ "helped": "helpit",
+ "hen": "chuck",
+ "hens": "chucks",
+ "hid": "dern'd",
+ "hidden": "dern'd",
+ "hide": "dern",
+ "hides": "derns",
+ "high": "hie",
+ "highest": "hiest",
+ "highland": "hielan'",
+ "highlands": "hielands",
+ "hit": "clout",
+ "hits": "clouts",
+ "hoarse": "hersh",
+ "holy": "halie",
+ "home": "hame",
+ "honey": "hinnie",
+ "hope": "houpe",
+ "hopes": "houpes",
+ "horrible": "gruesome",
+ "hot": "het",
+ "house": "hoose",
+ "how": "howfur",
+ "howl": "yowl",
+ "howled": "yowled",
+ "howling": "yowling",
+ "howls": "yowls",
+ "hungry": "hungert",
+ "husband": "guidman",
+ "husbands": "guidmen",
+ "idea": "conceit",
+ "ideas": "conceits",
+ "idiot": "eejit",
+ "idiots": "eejits",
+ "ill": "unweel",
+ "im": "a'm",
+ "i'm": "a'm",
+ "import": "inbring",
+ "incantation": "cantrip",
+ "incantations": "cantrips",
+ "industrious": "eydent",
+ "infinite": "mairchless",
+ "inject": "jag",
+ "injected": "jagit",
+ "injection": "jag",
+ "injections": "jag",
+ "insect": "beastie",
+ "insects": "beasties",
+ "inside": "inby",
+ "into": "intae",
+ "ireland": "airlan",
+ "island": "islan",
+ "islands": "islans",
+ "isn't": "isna",
+ "isnt": "isna",
+ "issue": "aishan",
+ "it's": "hit's",
+ "it": "hit",
+ "its": "hits",
+ "jar": "jaur",
+ "jars": "jaurs",
+ "jig's": "jeeg's",
+ "jig": "jeeg",
+ "jigs": "jeegs",
+ "join": "jine",
+ "jolly": "waulie",
+ "judge": "juidge",
+ "judged": "juidgit",
+ "judges": "juidges",
+ "jump": "loup",
+ "jumped": "lowpen",
+ "jumping": "loupin",
+ "jumpsuit's": "carsakie's",
+ "jumpsuit": "carsackie",
+ "jumpsuits": "carsakies",
+ "just": "jist",
+ "kept": "keepit",
+ "killed": "kilt",
+ "kind": "kin",
+ "kindly": "kin'ly",
+ "kitchen": "keetchin",
+ "know": "ken",
+ "known": "kent",
+ "knows": "ken",
+ "laid": "leen",
+ "lake": "loch",
+ "lakes": "lochs",
+ "land": "lan",
+ "large": "muckle",
+ "last": "lest",
+ "lasted": "lestit",
+ "lasts": "lests",
+ "lawyer": "lawer",
+ "lawyers": "lawers",
+ "lay": "lee",
+ "lazy": "thowless",
+ "leap": "loup",
+ "leaping": "loupin",
+ "leapt": "lowpen",
+ "learn": "lairn",
+ "learned": "lairnt",
+ "learns": "lairns",
+ "leave": "lea'",
+ "lend": "len",
+ "length": "lenth",
+ "lengths": "lenths",
+ "let": "lat",
+ "letter": "screive",
+ "liar": "leear",
+ "liars": "leears",
+ "lie": "lee",
+ "lifted": "liftit",
+ "light": "licht",
+ "lightning": "fire-flaucht",
+ "like": "lik",
+ "liked": "likit",
+ "limp": "hirple",
+ "liquor": "spunkie",
+ "list": "leet",
+ "little": "wee",
+ "live": "bide",
+ "lived": "bade",
+ "lively": "birkie",
+ "lives": "bides",
+ "load": "lade",
+ "loaded": "laden",
+ "loading": "laden'",
+ "loads": "lades",
+ "lobster": "lapster",
+ "lobsters": "lapsters",
+ "long": "lang",
+ "look": "leuk",
+ "looked": "leukit",
+ "looks": "leuks",
+ "lore": "lear",
+ "lose": "tyne",
+ "loses": "tynes",
+ "lost": "tint",
+ "lot": "wheen",
+ "loud": "lood",
+ "louse": "cootie",
+ "love": "loo",
+ "loved": "loo'd",
+ "loves": "loos",
+ "loving": "looin",
+ "low": "wee",
+ "lowest": "blomaist",
+ "lump": "dod",
+ "made": "makkit",
+ "magic": "glammerie",
+ "make": "mak",
+ "man": "jimmy",
+ "manure": "aidle",
+ "many": "mony",
+ "married": "merrit",
+ "may": "can",
+ "maybe": "mibbie",
+ "meat": "flesh",
+ "merchant's": "packman's",
+ "merchant": "packman",
+ "merchants'": "packmens'",
+ "merchants": "packmen",
+ "mess": "fankle",
+ "mice": "myce",
+ "might": "micht",
+ "mightn't": "michtna",
+ "mightnt": "michtna",
+ "milk": "mulk",
+ "min": "min'",
+ "mine": "mines",
+ "mire": "glaur",
+ "mischeivous": "ill-trickit",
+ "miss": "tyne",
+ "misses": "tynes",
+ "missing": "amissin",
+ "mistake": "mistak",
+ "mistaken": "mistaen",
+ "mixture": "mixtur",
+ "mole": "mowdiewarp",
+ "moles": "mowdiewarps",
+ "money": "clink",
+ "monkey": "puggie",
+ "monkeys": "puggies",
+ "monkies": "puggies",
+ "moor": "muir",
+ "more": "mair",
+ "moron": "baw juggler",
+ "morons": "dunderheids",
+ "most": "maist",
+ "moth": "blinnd-bat",
+ "mother": "maw",
+ "moths": "blinnd-bats",
+ "mountain": "ben",
+ "mountains": "bens",
+ "mouse": "moose",
+ "moustache": "mouser",
+ "moustaches": "mousers",
+ "mouth": "gob",
+ "move": "flit",
+ "moved": "flittit",
+ "moves": "flits",
+ "much": "muckle",
+ "muddled": "doited",
+ "music": "muisic",
+ "must": "maun",
+ "mustache": "mouser",
+ "mustaches": "mousers",
+ "mustn't": "maunna",
+ "mustnt": "maunna",
+ "my": "ma",
+ "myself": "masel",
+ "naked": "nakit",
+ "nanotrasen": "nanotraisen",
+ "natural": "naitral",
+ "nature": "naitur",
+ "near": "naur",
+ "nearer": "naurer",
+ "nearest": "naurmaist",
+ "needed": "needit",
+ "needn't": "needna",
+ "neednt": "needna",
+ "neither": "nane",
+ "nestle": "coorie",
+ "never": "ne'er",
+ "news": "bizz",
+ "next": "neist",
+ "nice": "crakin",
+ "night": "nicht",
+ "nights": "nichts",
+ "nit": "cootie",
+ "no": "nae",
+ "none": "nane",
+ "nonsense": [
+ "haivers",
+ "havers",
+ "pish"
+ ],
+ "north": "nor",
+ "northern": "norlins",
+ "northernmost": "normaist",
+ "northmost": "normasit",
+ "not": "no",
+ "nothing": "hee haw",
+ "now": "nou",
+ "number": "hantle",
+ "numbers": "hantles",
+ "oak": "aik",
+ "oat": "aits",
+ "oats": "aits",
+ "obliged": "behauden",
+ "of": "o'",
+ "off": "aff",
+ "officer": "boaby",
+ "officers": "boabies",
+ "often": "aften",
+ "oh": "och",
+ "oil": "ile",
+ "old": "auld",
+ "once": "yinst",
+ "one": "ane",
+ "onion": "ingan",
+ "onions": "ingans",
+ "opened": "opent",
+ "opposite": "forgain",
+ "oppressed": "dounhauden",
+ "other": "ither",
+ "our": "oor",
+ "ourselves": "oorsels",
+ "out": "oot",
+ "outside": "ootside",
+ "oven": "uin",
+ "ovens": "uins",
+ "over": "oot ower",
+ "owe": "awe",
+ "owes": "awes",
+ "owl": "howlet",
+ "owls": "howlets",
+ "own": "ain",
+ "owned": "awned",
+ "owns": "awns",
+ "painting": "pentin",
+ "pale": "peely-wally",
+ "pants": "trews",
+ "parcel": "paircel",
+ "parched": "drouchtit",
+ "park": "pairk",
+ "part": "pairt",
+ "parted": "pairted",
+ "partial": "pairtial",
+ "parts": "pairts",
+ "path": "pad",
+ "pebble": [
+ "chuckie",
+ "chuckie-stane"
+ ],
+ "pebbles": "chuckie-stanes",
+ "pee": "strone",
+ "peed": "stroned",
+ "pees": "strones",
+ "people": "fowk",
+ "person": "chiel",
+ "pet": "daut",
+ "pets": "dauts",
+ "petted": "dautit",
+ "petting": "dautin'",
+ "phantom": "bogle",
+ "phone": "phane",
+ "phones": "phanes",
+ "picture": "pictur",
+ "pictures": "picturs",
+ "pierce": "thirl",
+ "pigeon": "doo",
+ "piss": "pish",
+ "pissed": "pished",
+ "pisses": "pishes",
+ "place": "stell",
+ "placed": "stellt",
+ "places": "airts",
+ "play": "daff",
+ "played": "dafft",
+ "plays": "daffs",
+ "pocket": "pooch",
+ "pockets": "pooches",
+ "point": "pynt",
+ "pointed": "pynted",
+ "points": "pynt",
+ "poison": "pushion",
+ "poisoned": "pushionit",
+ "poisoning": "pushionin'",
+ "poisons": "pushions",
+ "poke": "powk",
+ "poked": "powkit",
+ "pokes": "powks",
+ "poking": "powkin'",
+ "police": "polis",
+ "poo": "keech",
+ "pool": "puil",
+ "poor": "pair",
+ "position": "poseetion",
+ "potato": "tattie",
+ "potatoes": "tatties",
+ "powder": "pouther",
+ "power": "pouer",
+ "present": "praisent",
+ "pretty": "bonny",
+ "prick": "jag",
+ "pricked": "jagit",
+ "pricks": "jags",
+ "probably": "likelie",
+ "proof": "prief",
+ "properly": "swash",
+ "proud": "prood",
+ "prove": "pruve",
+ "proved": "pruved",
+ "proves": "pruves",
+ "pub": "inns",
+ "puddle": "dub",
+ "pull": "pu'",
+ "pulled": "pu'd",
+ "pulls": "pu's",
+ "punch": "batter",
+ "punches": "batters",
+ "push": "pouss",
+ "pushed": "poussit",
+ "pushes": "pouss'",
+ "pushing": "poussin'",
+ "put": "pat",
+ "puts": "pits",
+ "quiet": "weesht",
+ "quit": "quitten",
+ "quite": "fair",
+ "rain": "smirr",
+ "ran": "run",
+ "raspberry": "rasp",
+ "rat": "rottan",
+ "rather": "raither",
+ "raven": "raen",
+ "real": "rael",
+ "reaper": "shearer",
+ "reason": "raison",
+ "reasons": "raisons",
+ "red": "rid",
+ "remember": "mind",
+ "replied": "reponed",
+ "reply": "repone",
+ "resident": "indwaller",
+ "residents": "indwallers",
+ "resign": "demit",
+ "retch": "boak",
+ "retches": "boaks",
+ "ridge": "rig",
+ "ridges": "rigs",
+ "right": "richt",
+ "roar": "rair",
+ "roared": "rair't",
+ "roars": "rairs",
+ "rob": "rab",
+ "room": "chaummer",
+ "root": "ruit",
+ "rope": "raip",
+ "rubber": "cahoutchie",
+ "ruffle": "tousle",
+ "run": "rin",
+ "rural": "landwart",
+ "rush": "breeshle",
+ "rust": "roust",
+ "sad": "dowie",
+ "said": "sayed",
+ "scare": "scaur",
+ "scariest": "skeeriest",
+ "scary": "scaury",
+ "school": "schuil",
+ "scientific": "scienteefic",
+ "scissors": "sheers",
+ "scold": "scaud",
+ "scone": "bannock",
+ "scorch": "birsle",
+ "scowl": "scoul",
+ "scowls": "scouls",
+ "scratch": "scart",
+ "scream": "skriegh",
+ "screaming": "skrieghin'",
+ "screams": "skreighs",
+ "seal": "cowan",
+ "seals": "cowans",
+ "sec": "polis",
+ "second": "saicont",
+ "security": "polis",
+ "seem": "kythe",
+ "seemed": "kythed",
+ "seems": "kythes",
+ "separate": "twyne",
+ "servant": "skivvy",
+ "seven": "sieven",
+ "shake": "shak",
+ "shaken": "shakit",
+ "shakes": "shaks",
+ "shall": "sall",
+ "shell": "sheel",
+ "shelter": "bield",
+ "sherrif": "shirra",
+ "shivering": "ourie",
+ "shoes": "shoon",
+ "shook": [
+ "shakit",
+ "sheuk"
+ ],
+ "shop": "shap",
+ "shopping": "messages",
+ "shops": "shaps",
+ "should": "shoud",
+ "shouldn't": "shoudna",
+ "shouldnt": "shoudna",
+ "shovel": "shool",
+ "shovels": "shools",
+ "shrunken": "cruppen",
+ "shy": "blate",
+ "sicken": "scunner",
+ "sickening": "scunnersome",
+ "sigh": "sech",
+ "sighs": "soughs",
+ "silver": "sillar",
+ "singed": "singet",
+ "skip": "fimmer",
+ "skips": "fimmers",
+ "slap": "clout",
+ "slaps": "clouts",
+ "slept": "sleepit",
+ "slid": "slidden",
+ "slip": "slup",
+ "slippery": "slidie",
+ "slips": "slups",
+ "slope": "brae",
+ "sly": "slee",
+ "smack": "skelp",
+ "smacks": "skelps",
+ "small": "wee",
+ "smart": "snap",
+ "smile": "smirk",
+ "smiles": "smous",
+ "smoke": "reek",
+ "smoked": "reekit",
+ "smokes": "reeks",
+ "smoking": "reekin'",
+ "sneeze": "sneesh",
+ "snow": "snaw",
+ "snowflake": "pyle",
+ "so": "sae",
+ "soap": "saip",
+ "sold": "selt",
+ "some": "som",
+ "someone": "a bodie",
+ "sometimes": "whyles",
+ "somewhat": "fair",
+ "song": "sang",
+ "songs": "sangs",
+ "soothe": "dill",
+ "sore": "sair",
+ "sound": "soond",
+ "sounded": "soonded",
+ "sounds": "soonds",
+ "soup": "broo",
+ "south": "sooth",
+ "southern": "soothron",
+ "southernmost": "soothmaist",
+ "southmost": "soothmaist",
+ "spacemas": "Yule",
+ "sparkle": "glint",
+ "sparkled": "glintit",
+ "sparkles": "glints",
+ "sparkling": "begesserant",
+ "spat": "sputten",
+ "speak": "spaek",
+ "speaks": "spaeks",
+ "spelled": "spellt",
+ "spider": "speeder",
+ "spin": "birl",
+ "spine": "rig",
+ "spines": "rigs",
+ "spinning": "birlin'",
+ "spins": "birls",
+ "spit": "speet",
+ "spoil": "blaud",
+ "spoils": "blauds",
+ "spoke": "spak",
+ "spoon": "spuin",
+ "squeal": "squyle",
+ "squint": "skelly",
+ "stagger": "stoiter",
+ "staggered": "stoiter'd",
+ "staggers": "stoiters",
+ "stand": "staun",
+ "star": "starn",
+ "stare": "gove",
+ "stared": "glourt",
+ "stares": "goves",
+ "stars": "starns",
+ "start": "stert",
+ "started": "stertit",
+ "starts": "sterts",
+ "stay": "bide",
+ "stays": "bides",
+ "stead": "steid",
+ "stench": "bowf",
+ "stiff": "stechie",
+ "still": "yet",
+ "stink": "bowf",
+ "stinks": "bowfs",
+ "stir": "steer",
+ "stirs": "steers",
+ "stole": "stealt",
+ "stolen": "stown",
+ "stomach": "wame",
+ "stone": "stane",
+ "stones": "stanes",
+ "stopped": "stoppit",
+ "stout": "stoot",
+ "stream": "burn",
+ "stretch": "streek",
+ "stretched": "streekit",
+ "stretches": "streeks",
+ "striped": "strippit",
+ "stroll": "daunder",
+ "struck": "strak",
+ "stuck": "stickit",
+ "stuff": "stech",
+ "stumble": "doiter",
+ "stumbled": "stoited",
+ "stumbles": "doiters",
+ "stunned": "donnert",
+ "stupid": "glaikit",
+ "such": "sic",
+ "sunset": "sindoun",
+ "suppose": "daursay",
+ "sure": "shuir",
+ "surely": "shuirlie",
+ "swallow": "swallae",
+ "swallowed": "swallae'd",
+ "swallows": "swallaes",
+ "swarm": "byke",
+ "swear": "sweir",
+ "sweared": "sweired",
+ "swearing": "sweiring",
+ "swears": "sweirs",
+ "swell": "swall",
+ "swelled": "swall'd",
+ "table": "boord",
+ "tables": "boords",
+ "tadpole": "poweheid",
+ "take": "tak",
+ "taken": "taen",
+ "takes": "taks",
+ "talk": "tauk",
+ "tangled": "tousled",
+ "taste": "pree",
+ "tasted": "pree'd",
+ "tasteless": "warsh",
+ "tastes": "prees",
+ "tavern": "inns",
+ "terrible": "tairible",
+ "than": "nor",
+ "thank": "thenk",
+ "that": "thon",
+ "the": "th'",
+ "their": "thair",
+ "theirs": "thairs",
+ "them": "thaim",
+ "themselves": "thairsels",
+ "then": "than",
+ "there's": "thonder's",
+ "there": "thonder",
+ "they": "thay",
+ "thirst": "drouth",
+ "thirsts": "drouths",
+ "thirsty": "drouthy",
+ "those": "they",
+ "thought": "thocht",
+ "thousand": "thoosan",
+ "thousands": "thoosans",
+ "thousandth": "thoosant",
+ "thrashed": "thruishen",
+ "thrilled": "thirl'd",
+ "throat": "thrapple",
+ "through": "throu'",
+ "thundering": "dunderin",
+ "tidy": "doss",
+ "tingle": "fissle",
+ "tiny": [
+ "tottie",
+ "toty"
+ ],
+ "to": "tae",
+ "tobacco": "baccie",
+ "today": "th'day",
+ "together": "thegither",
+ "toilet": "cludgie",
+ "toilets": "cludgies",
+ "token": "taiken",
+ "told": "tellt",
+ "tomorrow": "th' morra",
+ "tonight": "thenicht",
+ "too": "tae",
+ "took": "teuk",
+ "top": "tap",
+ "tore": "tuir",
+ "tortoise": "tortie",
+ "tough": "teugh",
+ "town": "toon",
+ "trader's": "dealer's",
+ "trader": "dealer",
+ "traders'": "dealers'",
+ "traders": "dealers",
+ "translated": "owerset",
+ "treason": "traison",
+ "trick": "brogue",
+ "tried": "ettelt",
+ "tries": "ettles",
+ "trigger": "tricker",
+ "triggered": "tricker'd",
+ "triggering": "trickerin'",
+ "triggers": "trickers",
+ "trouble": "trauchle",
+ "trousers": "breeks",
+ "trurth": "trowth",
+ "try": "huv a go",
+ "tumble": "cowp",
+ "turf": "divot",
+ "turfs": "divots",
+ "turn": "birl",
+ "turned": "birlt",
+ "turning": "birlin'",
+ "turnip": "neep",
+ "turnips": "neeps",
+ "turns": "birls",
+ "twist": "swirl",
+ "twisted": "swirlie",
+ "twists": "skewls",
+ "two": "twa",
+ "unbolt": "unsnib",
+ "uncertain": "unsicker",
+ "under": "unner",
+ "understand": "unnerstaund",
+ "understands": "unnerstaunds",
+ "unhurt": "unskaithed",
+ "uninvited": "unbidden",
+ "unknown": "unkent",
+ "unlucky": "wanchancie",
+ "until": "till",
+ "us": "hus",
+ "usage": "uisage",
+ "use": "uise",
+ "used": "uised",
+ "useless": "uissless",
+ "uses": "uises",
+ "valley": "glen",
+ "valleys": "glens",
+ "value": "feck",
+ "vegetables": "greens",
+ "venture": "anter",
+ "very": "verra",
+ "vessel": "veshel",
+ "vessels": "veshel",
+ "vision": "veesion",
+ "visions": "veesion",
+ "visit": "veesit",
+ "visitor": "caa'er",
+ "visitors": "caa'ers",
+ "vomit": "boak",
+ "vomits": "boaks",
+ "wages": "wauges",
+ "walk": "traivel",
+ "walked": "traivelt",
+ "walks": "traivels",
+ "wall": "dike",
+ "walls": "dikes",
+ "wand": "wannd",
+ "wander": "daunder",
+ "wandered": "daundert",
+ "wanders": "daunders",
+ "want": "waant",
+ "wanted": "wantit",
+ "warm": "beek",
+ "was": "wis",
+ "washed": "washt",
+ "wasn't": "wisna",
+ "wasnt": "wisna",
+ "watched": "watcht",
+ "water": "watter",
+ "way": "gate",
+ "ways": "gates",
+ "weak": "fushionless",
+ "website": "wasteid",
+ "weep": "greet",
+ "welcome": "walcome",
+ "well": "weel",
+ "went": "gaed",
+ "were": "war",
+ "weren't": "warna",
+ "werent": "warna",
+ "west": "wast",
+ "westernmost": "wastmaist",
+ "westmost": "wastmaist",
+ "westward": "wastart",
+ "wet": "drookit",
+ "what": "whit",
+ "whatever": "whitsomiver",
+ "whatsoever": "whitsaeiver",
+ "where's": "whaur's",
+ "where": "whaur",
+ "whiskey": "usquebaugh",
+ "whistle": "wheiple",
+ "whistles": "wheiples",
+ "who": "wha",
+ "whole": "hail",
+ "whom": "wham",
+ "whose": "whase",
+ "wife": "guidwife",
+ "will": "wull",
+ "win": "wun",
+ "wind": "wynd",
+ "window": "winnock",
+ "windows": "winnocks",
+ "wing": "weeng",
+ "wings": "weengs",
+ "wipe": "dight",
+ "wipes": "dights",
+ "wire-cutters": "weir-sheers",
+ "wire": "weir",
+ "wirecutters": "weirsheers",
+ "wisdom": "gumption",
+ "wish": "wiss",
+ "wished": "wisst",
+ "wishes": "wisses",
+ "witch's": "carlin's",
+ "witch": "carlin",
+ "witches": "carlins",
+ "with": "wi",
+ "within": "aithin",
+ "without": "athoot",
+ "witless": "doitert",
+ "wives": "guidwifes",
+ "wizard's": "warlock's",
+ "wizard": "warlock",
+ "wizards": "warlocks",
+ "woman": "hen",
+ "women": "kimmers",
+ "won't": "winna",
+ "won": "wun",
+ "wonder": "wonner",
+ "wont": "winna",
+ "wood": "wid",
+ "wool": "woo'",
+ "word": "wird",
+ "words": "wirds",
+ "work": "wark",
+ "worked": "wrocht",
+ "world": "warld",
+ "worried": "wirried",
+ "worries": "wirries",
+ "worry": "wirrie",
+ "worst": "wast",
+ "worth": "wirth",
+ "would": "wad",
+ "wouldn't": "wadna",
+ "wouldnt": "wadna",
+ "wrench": "wranch",
+ "wrenches": "wranches",
+ "writ": "wrate",
+ "write": "screive",
+ "writes": "scrieves",
+ "wrong": "wrang",
+ "wrote": "wrat",
+ "yes": "aye",
+ "you": "ye",
+ "your": "yer",
+ "yeah": "aye",
+ "yourself": "yersel",
+ "yourselves": "yersels",
+ "youth": "weans",
+ "zero": "hee-haw"
+ }
+}
\ No newline at end of file
diff --git a/strings/names/dwarf_first.txt b/strings/names/dwarf_first.txt
new file mode 100644
index 0000000000..a5de072053
--- /dev/null
+++ b/strings/names/dwarf_first.txt
@@ -0,0 +1,42 @@
+Thizuil
+Dondock
+Nemdout
+Ararhir
+Kadeag
+Elminister
+Nursan
+Grimm
+Matgroir
+Thosotir
+Jatdrouc
+Kaschei
+Khelben
+Kreol
+Dalofrubelyn
+Reirgrebyrn
+Hosdrum
+Mordenkainen
+Sarbarra
+Mystryl
+Nihilus
+Palando
+Prospero
+Radagast
+Burroutalyn
+Vargibela
+Saruman
+Tenser
+Terefi
+Tzeentch
+Gotdrilyn
+Vaarsuvius
+Erisseadrid
+Arazzanelyn
+Zagyg
+Dargroungrid
+Urist
+Durimarlum
+Matgrous
+Kissaet
+Magni
+Muradin
\ No newline at end of file
diff --git a/strings/names/dwarf_last.txt b/strings/names/dwarf_last.txt
new file mode 100644
index 0000000000..17fdb7f4d2
--- /dev/null
+++ b/strings/names/dwarf_last.txt
@@ -0,0 +1,45 @@
+Brightjaw
+Steelbrew
+Grimtank
+Mudback
+Brickbane
+Smeltmaster
+Lavabrow
+Woldtoe
+Deephelm
+Earthpike
+Berylshield
+Asharmour
+Caskspine
+Rubygrip
+Noblemaster
+Flintgrip
+Thunderchest
+Ignotchest
+Cragborg
+Jadearm
+Hornbelt
+Fierygranite
+Twilightbane
+Leadforge
+Kragthane
+Oakenaxe
+Beastback
+Coinbender
+Bronzejaw
+Mithrilrock
+Barrelhood
+Grumblesphere
+Graybane
+Flattoe
+Steelmaker
+Bronzebeard
+Kragcloak
+Magmaborn
+Gravelbasher
+Whitbrew
+McUristurister
+Mountaincoat
+Chaosbane
+Darksunder
+Bronzebeard
\ No newline at end of file
diff --git a/strings/round_start_sounds.txt b/strings/round_start_sounds.txt
index a8409188fc..c67bf6b4a6 100644
--- a/strings/round_start_sounds.txt
+++ b/strings/round_start_sounds.txt
@@ -22,3 +22,6 @@ sound/music/goodbyemoonmen.ogg
sound/music/flytothemoon_otomatone.ogg
sound/music/milkyway.ogg
sound/music/rocketridersprayer.ogg
+sound/music/theend.ogg
+sound/music/flyinghigh.ogg
+sound/music/samsara.ogg
diff --git a/tgstation.dme b/tgstation.dme
index 3e5f86b8b9..612a98974c 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -41,6 +41,7 @@
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\donator_groupings.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\exports.dm"
#include "code\__DEFINES\flags.dm"
@@ -115,6 +116,7 @@
#include "code\__HELPERS\AStar.dm"
#include "code\__HELPERS\cmp.dm"
#include "code\__HELPERS\dates.dm"
+#include "code\__HELPERS\donator_groupings.dm"
#include "code\__HELPERS\files.dm"
#include "code\__HELPERS\game.dm"
#include "code\__HELPERS\global_lists.dm"
@@ -159,6 +161,7 @@
#include "code\_globalvars\lists\maintenance_loot.dm"
#include "code\_globalvars\lists\mapping.dm"
#include "code\_globalvars\lists\medals.dm"
+#include "code\_globalvars\lists\misc.dm"
#include "code\_globalvars\lists\mobs.dm"
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
@@ -218,6 +221,7 @@
#include "code\controllers\configuration\configuration.dm"
#include "code\controllers\configuration\entries\comms.dm"
#include "code\controllers\configuration\entries\dbconfig.dm"
+#include "code\controllers\configuration\entries\donator.dm"
#include "code\controllers\configuration\entries\game_options.dm"
#include "code\controllers\configuration\entries\general.dm"
#include "code\controllers\subsystem\acid.dm"
@@ -227,6 +231,7 @@
#include "code\controllers\subsystem\atoms.dm"
#include "code\controllers\subsystem\augury.dm"
#include "code\controllers\subsystem\blackbox.dm"
+#include "code\controllers\subsystem\chat.dm"
#include "code\controllers\subsystem\communications.dm"
#include "code\controllers\subsystem\dbcore.dm"
#include "code\controllers\subsystem\dcs.dm"
@@ -275,6 +280,7 @@
#include "code\controllers\subsystem\vore.dm"
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
+#include "code\controllers\subsystem\processing\chemistry.dm"
#include "code\controllers\subsystem\processing\circuit.dm"
#include "code\controllers\subsystem\processing\fastprocess.dm"
#include "code\controllers\subsystem\processing\fields.dm"
@@ -328,6 +334,7 @@
#include "code\datums\actions\beam_rifle.dm"
#include "code\datums\actions\ninja.dm"
#include "code\datums\brain_damage\brain_trauma.dm"
+#include "code\datums\brain_damage\hypnosis.dm"
#include "code\datums\brain_damage\imaginary_friend.dm"
#include "code\datums\brain_damage\mild.dm"
#include "code\datums\brain_damage\phobia.dm"
@@ -376,6 +383,7 @@
#include "code\datums\components\swarming.dm"
#include "code\datums\components\thermite.dm"
#include "code\datums\components\uplink.dm"
+#include "code\datums\components\virtual_reality.dm"
#include "code\datums\components\wearertargeting.dm"
#include "code\datums\components\wet_floor.dm"
#include "code\datums\components\decals\blood.dm"
@@ -544,6 +552,11 @@
#include "code\game\gamemodes\devil\game_mode.dm"
#include "code\game\gamemodes\devil\objectives.dm"
#include "code\game\gamemodes\devil\devil agent\devil_agent.dm"
+#include "code\game\gamemodes\dynamic\dynamic.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
#include "code\game\gamemodes\meteor\meteors.dm"
@@ -570,6 +583,7 @@
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\cloning.dm"
#include "code\game\machinery\constructable_frame.dm"
+#include "code\game\machinery\cryopod.dm"
#include "code\game\machinery\dance_machine.dm"
#include "code\game\machinery\defibrillator_mount.dm"
#include "code\game\machinery\deployable.dm"
@@ -609,6 +623,7 @@
#include "code\game\machinery\syndicatebomb.dm"
#include "code\game\machinery\teleporter.dm"
#include "code\game\machinery\transformer.dm"
+#include "code\game\machinery\turnstile.dm"
#include "code\game\machinery\washing_machine.dm"
#include "code\game\machinery\wishgranter.dm"
#include "code\game\machinery\camera\camera.dm"
@@ -636,7 +651,6 @@
#include "code\game\machinery\computer\medical.dm"
#include "code\game\machinery\computer\Operating.dm"
#include "code\game\machinery\computer\pod.dm"
-#include "code\game\machinery\computer\prisoner.dm"
#include "code\game\machinery\computer\robot.dm"
#include "code\game\machinery\computer\security.dm"
#include "code\game\machinery\computer\station_alert.dm"
@@ -646,6 +660,9 @@
#include "code\game\machinery\computer\arcade\minesweeper.dm"
#include "code\game\machinery\computer\arcade\misc_arcade.dm"
#include "code\game\machinery\computer\arcade\orion_trail.dm"
+#include "code\game\machinery\computer\prisoner\_prisoner.dm"
+#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm"
+#include "code\game\machinery\computer\prisoner\management.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
#include "code\game\machinery\doors\airlock_types.dm"
@@ -698,6 +715,7 @@
#include "code\game\mecha\combat\gygax.dm"
#include "code\game\mecha\combat\honker.dm"
#include "code\game\mecha\combat\marauder.dm"
+#include "code\game\mecha\combat\neovgre.dm"
#include "code\game\mecha\combat\phazon.dm"
#include "code\game\mecha\combat\reticence.dm"
#include "code\game\mecha\equipment\mecha_equipment.dm"
@@ -900,15 +918,16 @@
#include "code\game\objects\items\implants\implant_krav_maga.dm"
#include "code\game\objects\items\implants\implant_mindshield.dm"
#include "code\game\objects\items\implants\implant_misc.dm"
+#include "code\game\objects\items\implants\implant_radio.dm"
#include "code\game\objects\items\implants\implant_spell.dm"
#include "code\game\objects\items\implants\implant_stealth.dm"
#include "code\game\objects\items\implants\implant_storage.dm"
#include "code\game\objects\items\implants\implant_track.dm"
+#include "code\game\objects\items\implants\implant_uplink.dm"
#include "code\game\objects\items\implants\implantcase.dm"
#include "code\game\objects\items\implants\implantchair.dm"
#include "code\game\objects\items\implants\implanter.dm"
#include "code\game\objects\items\implants\implantpad.dm"
-#include "code\game\objects\items\implants\implantuplink.dm"
#include "code\game\objects\items\melee\energy.dm"
#include "code\game\objects\items\melee\misc.dm"
#include "code\game\objects\items\melee\transforming.dm"
@@ -989,6 +1008,7 @@
#include "code\game\objects\structures\ladders.dm"
#include "code\game\objects\structures\lattice.dm"
#include "code\game\objects\structures\life_candle.dm"
+#include "code\game\objects\structures\loom.dm"
#include "code\game\objects\structures\manned_turret.dm"
#include "code\game\objects\structures\memorial.dm"
#include "code\game\objects\structures\mineral_doors.dm"
@@ -1020,6 +1040,7 @@
#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm"
#include "code\game\objects\structures\crates_lockers\closets\fitness.dm"
+#include "code\game\objects\structures\crates_lockers\closets\genpop.dm"
#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm"
#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm"
#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm"
@@ -1279,6 +1300,7 @@
#include "code\modules\antagonists\disease\disease_mob.dm"
#include "code\modules\antagonists\ert\ert.dm"
#include "code\modules\antagonists\greentext\greentext.dm"
+#include "code\modules\antagonists\greybois\greybois.dm"
#include "code\modules\antagonists\highlander\highlander.dm"
#include "code\modules\antagonists\monkey\monkey.dm"
#include "code\modules\antagonists\morph\morph.dm"
@@ -1446,11 +1468,25 @@
#include "code\modules\cargo\exports\large_objects.dm"
#include "code\modules\cargo\exports\manifest.dm"
#include "code\modules\cargo\exports\materials.dm"
+#include "code\modules\cargo\exports\orgains_robotics.dm"
#include "code\modules\cargo\exports\parts.dm"
#include "code\modules\cargo\exports\seeds.dm"
#include "code\modules\cargo\exports\sheets.dm"
#include "code\modules\cargo\exports\tools.dm"
#include "code\modules\cargo\exports\weapons.dm"
+#include "code\modules\cargo\packs\armory.dm"
+#include "code\modules\cargo\packs\costumes_toys.dm"
+#include "code\modules\cargo\packs\emergency.dm"
+#include "code\modules\cargo\packs\engine.dm"
+#include "code\modules\cargo\packs\engineering.dm"
+#include "code\modules\cargo\packs\livestock.dm"
+#include "code\modules\cargo\packs\materials.dm"
+#include "code\modules\cargo\packs\medical.dm"
+#include "code\modules\cargo\packs\misc.dm"
+#include "code\modules\cargo\packs\organic.dm"
+#include "code\modules\cargo\packs\science.dm"
+#include "code\modules\cargo\packs\security.dm"
+#include "code\modules\cargo\packs\service.dm"
#include "code\modules\chatter\chatter.dm"
#include "code\modules\client\asset_cache.dm"
#include "code\modules\client\client_colour.dm"
@@ -1503,6 +1539,7 @@
#include "code\modules\clothing\neck\_neck.dm"
#include "code\modules\clothing\outfits\ert.dm"
#include "code\modules\clothing\outfits\event.dm"
+#include "code\modules\clothing\outfits\plasmaman.dm"
#include "code\modules\clothing\outfits\standard.dm"
#include "code\modules\clothing\outfits\vr.dm"
#include "code\modules\clothing\outfits\vv_outfit.dm"
@@ -1545,6 +1582,10 @@
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\security.dm"
#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
#include "code\modules\crafting\recipes.dm"
@@ -1683,6 +1724,9 @@
#include "code\modules\goonchat\jsErrorHandler.dm"
#include "code\modules\holiday\easter.dm"
#include "code\modules\holiday\holidays.dm"
+#include "code\modules\holiday\halloween\bartholomew.dm"
+#include "code\modules\holiday\halloween\halloween.dm"
+#include "code\modules\holiday\halloween\jacqueen.dm"
#include "code\modules\holodeck\area_copy.dm"
#include "code\modules\holodeck\computer.dm"
#include "code\modules\holodeck\holo_effect.dm"
@@ -1715,6 +1759,7 @@
#include "code\modules\hydroponics\grown\citrus.dm"
#include "code\modules\hydroponics\grown\cocoa_vanilla.dm"
#include "code\modules\hydroponics\grown\corn.dm"
+#include "code\modules\hydroponics\grown\cotton.dm"
#include "code\modules\hydroponics\grown\eggplant.dm"
#include "code\modules\hydroponics\grown\flowers.dm"
#include "code\modules\hydroponics\grown\grass_carpet.dm"
@@ -1724,6 +1769,7 @@
#include "code\modules\hydroponics\grown\mushrooms.dm"
#include "code\modules\hydroponics\grown\nettle.dm"
#include "code\modules\hydroponics\grown\onion.dm"
+#include "code\modules\hydroponics\grown\peach.dm"
#include "code\modules\hydroponics\grown\peanuts.dm"
#include "code\modules\hydroponics\grown\pineapple.dm"
#include "code\modules\hydroponics\grown\potato.dm"
@@ -1779,17 +1825,39 @@
#include "code\modules\jobs\access.dm"
#include "code\modules\jobs\job_exp.dm"
#include "code\modules\jobs\jobs.dm"
+#include "code\modules\jobs\job_types\_job.dm"
+#include "code\modules\jobs\job_types\ai.dm"
#include "code\modules\jobs\job_types\assistant.dm"
+#include "code\modules\jobs\job_types\atmospheric_technician.dm"
+#include "code\modules\jobs\job_types\bartender.dm"
+#include "code\modules\jobs\job_types\botanist.dm"
#include "code\modules\jobs\job_types\captain.dm"
-#include "code\modules\jobs\job_types\cargo_service.dm"
-#include "code\modules\jobs\job_types\civilian.dm"
-#include "code\modules\jobs\job_types\civilian_chaplain.dm"
-#include "code\modules\jobs\job_types\engineering.dm"
-#include "code\modules\jobs\job_types\job.dm"
-#include "code\modules\jobs\job_types\medical.dm"
-#include "code\modules\jobs\job_types\science.dm"
-#include "code\modules\jobs\job_types\security.dm"
-#include "code\modules\jobs\job_types\silicon.dm"
+#include "code\modules\jobs\job_types\cargo_technician.dm"
+#include "code\modules\jobs\job_types\chaplain.dm"
+#include "code\modules\jobs\job_types\chemist.dm"
+#include "code\modules\jobs\job_types\chief_engineer.dm"
+#include "code\modules\jobs\job_types\chief_medical_officer.dm"
+#include "code\modules\jobs\job_types\clown.dm"
+#include "code\modules\jobs\job_types\cook.dm"
+#include "code\modules\jobs\job_types\curator.dm"
+#include "code\modules\jobs\job_types\cyborg.dm"
+#include "code\modules\jobs\job_types\detective.dm"
+#include "code\modules\jobs\job_types\geneticist.dm"
+#include "code\modules\jobs\job_types\head_of_personnel.dm"
+#include "code\modules\jobs\job_types\head_of_security.dm"
+#include "code\modules\jobs\job_types\janitor.dm"
+#include "code\modules\jobs\job_types\lawyer.dm"
+#include "code\modules\jobs\job_types\medical_doctor.dm"
+#include "code\modules\jobs\job_types\mime.dm"
+#include "code\modules\jobs\job_types\quartermaster.dm"
+#include "code\modules\jobs\job_types\research_director.dm"
+#include "code\modules\jobs\job_types\roboticist.dm"
+#include "code\modules\jobs\job_types\scientist.dm"
+#include "code\modules\jobs\job_types\security_officer.dm"
+#include "code\modules\jobs\job_types\shaft_miner.dm"
+#include "code\modules\jobs\job_types\station_engineer.dm"
+#include "code\modules\jobs\job_types\virologist.dm"
+#include "code\modules\jobs\job_types\warden.dm"
#include "code\modules\jobs\map_changes\map_changes.dm"
#include "code\modules\keybindings\bindings_admin.dm"
#include "code\modules\keybindings\bindings_atom.dm"
@@ -1900,15 +1968,17 @@
#include "code\modules\mob\dead\new_player\poll.dm"
#include "code\modules\mob\dead\new_player\preferences_setup.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\alienpeople.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\Citadel_Snowflake.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\ipc_synths.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\legs_and_taurs.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm"
#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm"
@@ -2015,15 +2085,18 @@
#include "code\modules\mob\living\carbon\human\species_types\abductors.dm"
#include "code\modules\mob\living\carbon\human\species_types\android.dm"
#include "code\modules\mob\living\carbon\human\species_types\angel.dm"
+#include "code\modules\mob\living\carbon\human\species_types\bugmen.dm"
#include "code\modules\mob\living\carbon\human\species_types\corporate.dm"
#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm"
+#include "code\modules\mob\living\carbon\human\species_types\dwarves.dm"
#include "code\modules\mob\living\carbon\human\species_types\felinid.dm"
#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\furrypeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\golems.dm"
#include "code\modules\mob\living\carbon\human\species_types\humans.dm"
+#include "code\modules\mob\living\carbon\human\species_types\ipc.dm"
#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm"
-#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm"
#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm"
#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm"
#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm"
@@ -2084,6 +2157,7 @@
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\say.dm"
#include "code\modules\mob\living\simple_animal\animal_defense.dm"
+#include "code\modules\mob\living\simple_animal\astral.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
#include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\damage_procs.dm"
@@ -2091,6 +2165,7 @@
#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm"
+#include "code\modules\mob\living\simple_animal\simplemob_vore_values.dm"
#include "code\modules\mob\living\simple_animal\spawner.dm"
#include "code\modules\mob\living\simple_animal\status_procs.dm"
#include "code\modules\mob\living\simple_animal\bot\bot.dm"
@@ -2147,6 +2222,7 @@
#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
+#include "code\modules\mob\living\simple_animal\hostile\goose.dm"
#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
@@ -2276,6 +2352,10 @@
#include "code\modules\NTNet\network.dm"
#include "code\modules\NTNet\relays.dm"
#include "code\modules\NTNet\services\_service.dm"
+#include "code\modules\oracle_ui\assets.dm"
+#include "code\modules\oracle_ui\hookup_procs.dm"
+#include "code\modules\oracle_ui\oracle_ui.dm"
+#include "code\modules\oracle_ui\themed.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\filingcabinet.dm"
@@ -2464,6 +2544,7 @@
#include "code\modules\projectiles\projectile\special\temperature.dm"
#include "code\modules\projectiles\projectile\special\wormhole.dm"
#include "code\modules\reagents\chem_splash.dm"
+#include "code\modules\reagents\chem_wiki_render.dm"
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\reagent_dispenser.dm"
#include "code\modules\reagents\chemistry\colors.dm"
@@ -2482,6 +2563,7 @@
#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\food_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\other_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm"
@@ -2698,12 +2780,18 @@
#include "code\modules\surgery\brain_surgery.dm"
#include "code\modules\surgery\cavity_implant.dm"
#include "code\modules\surgery\core_removal.dm"
+#include "code\modules\surgery\coronary_bypass.dm"
#include "code\modules\surgery\dental_implant.dm"
+#include "code\modules\surgery\embalming.dm"
+#include "code\modules\surgery\experimental_dissection.dm"
#include "code\modules\surgery\eye_surgery.dm"
+#include "code\modules\surgery\graft_synthtissue.dm"
+#include "code\modules\surgery\healing.dm"
#include "code\modules\surgery\helpers.dm"
#include "code\modules\surgery\implant_removal.dm"
#include "code\modules\surgery\limb_augmentation.dm"
#include "code\modules\surgery\lipoplasty.dm"
+#include "code\modules\surgery\lobectomy.dm"
#include "code\modules\surgery\mechanic_steps.dm"
#include "code\modules\surgery\nutcracker.dm"
#include "code\modules\surgery\organ_manipulation.dm"
@@ -2718,11 +2806,14 @@
#include "code\modules\surgery\advanced\lobotomy.dm"
#include "code\modules\surgery\advanced\necrotic_revival.dm"
#include "code\modules\surgery\advanced\pacification.dm"
-#include "code\modules\surgery\advanced\reconstruction.dm"
#include "code\modules\surgery\advanced\revival.dm"
+#include "code\modules\surgery\advanced\toxichealing.dm"
#include "code\modules\surgery\advanced\viral_bonding.dm"
#include "code\modules\surgery\advanced\bioware\bioware.dm"
#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm"
+#include "code\modules\surgery\advanced\bioware\ligament_hook.dm"
+#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm"
+#include "code\modules\surgery\advanced\bioware\muscled_veins.dm"
#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm"
#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm"
#include "code\modules\surgery\advanced\bioware\vein_threading.dm"
@@ -2818,7 +2909,18 @@
#include "code\modules\vending\toys.dm"
#include "code\modules\vending\wardrobes.dm"
#include "code\modules\vending\youtool.dm"
-#include "code\modules\VR\vr_human.dm"
+#include "code\modules\vore\hook-defs.dm"
+#include "code\modules\vore\persistence.dm"
+#include "code\modules\vore\trycatch.dm"
+#include "code\modules\vore\eating\belly_dat_vr.dm"
+#include "code\modules\vore\eating\belly_obj.dm"
+#include "code\modules\vore\eating\bellymodes.dm"
+#include "code\modules\vore\eating\digest_act.dm"
+#include "code\modules\vore\eating\living.dm"
+#include "code\modules\vore\eating\vore.dm"
+#include "code\modules\vore\eating\voreitems.dm"
+#include "code\modules\vore\eating\vorepanel.dm"
+#include "code\modules\VR\vr_mob.dm"
#include "code\modules\VR\vr_sleeper.dm"
#include "code\modules\zombie\items.dm"
#include "code\modules\zombie\organs.dm"
@@ -2842,11 +2944,14 @@
#include "modular_citadel\code\datums\components\material_container.dm"
#include "modular_citadel\code\datums\components\phantomthief.dm"
#include "modular_citadel\code\datums\components\souldeath.dm"
+#include "modular_citadel\code\datums\mood_events\chem_events.dm"
#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm"
#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm"
#include "modular_citadel\code\datums\mood_events\moodular.dm"
#include "modular_citadel\code\datums\mutations\hulk.dm"
+#include "modular_citadel\code\datums\status_effects\chems.dm"
#include "modular_citadel\code\datums\status_effects\debuffs.dm"
+#include "modular_citadel\code\datums\traits\negative.dm"
#include "modular_citadel\code\datums\traits\neutral.dm"
#include "modular_citadel\code\datums\wires\airlock.dm"
#include "modular_citadel\code\datums\wires\autoylathe.dm"
@@ -2864,7 +2969,6 @@
#include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm"
#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm"
-#include "modular_citadel\code\game\machinery\cryopod.dm"
#include "modular_citadel\code\game\machinery\displaycases.dm"
#include "modular_citadel\code\game\machinery\firealarm.dm"
#include "modular_citadel\code\game\machinery\Sleeper.dm"
@@ -2887,7 +2991,6 @@
#include "modular_citadel\code\game\objects\items\boombox.dm"
#include "modular_citadel\code\game\objects\items\holy_weapons.dm"
#include "modular_citadel\code\game\objects\items\honk.dm"
-#include "modular_citadel\code\game\objects\items\meat.dm"
#include "modular_citadel\code\game\objects\items\stunsword.dm"
#include "modular_citadel\code\game\objects\items\vending_items.dm"
#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm"
@@ -2895,15 +2998,10 @@
#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"
-#include "modular_citadel\code\game\objects\items\melee\energy.dm"
#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm"
-#include "modular_citadel\code\game\objects\items\melee\misc.dm"
-#include "modular_citadel\code\game\objects\items\melee\transforming.dm"
-#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm"
#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
#include "modular_citadel\code\game\objects\structures\tables_racks.dm"
#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm"
-#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm"
#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm"
#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm"
#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm"
@@ -2926,13 +3024,13 @@
#include "modular_citadel\code\modules\arousal\toys\dildos.dm"
#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm"
#include "modular_citadel\code\modules\cargo\console.dm"
-#include "modular_citadel\code\modules\cargo\packs.dm"
#include "modular_citadel\code\modules\client\client_defines.dm"
#include "modular_citadel\code\modules\client\client_procs.dm"
#include "modular_citadel\code\modules\client\preferences.dm"
#include "modular_citadel\code\modules\client\preferences_savefile.dm"
#include "modular_citadel\code\modules\client\preferences_toggles.dm"
#include "modular_citadel\code\modules\client\loadout\__donator.dm"
+#include "modular_citadel\code\modules\client\loadout\_loadout.dm"
#include "modular_citadel\code\modules\client\loadout\_medical.dm"
#include "modular_citadel\code\modules\client\loadout\_security.dm"
#include "modular_citadel\code\modules\client\loadout\_service.dm"
@@ -2941,7 +3039,6 @@
#include "modular_citadel\code\modules\client\loadout\gloves.dm"
#include "modular_citadel\code\modules\client\loadout\hands.dm"
#include "modular_citadel\code\modules\client\loadout\head.dm"
-#include "modular_citadel\code\modules\client\loadout\loadout.dm"
#include "modular_citadel\code\modules\client\loadout\mask.dm"
#include "modular_citadel\code\modules\client\loadout\neck.dm"
#include "modular_citadel\code\modules\client\loadout\shoes.dm"
@@ -2960,7 +3057,6 @@
#include "modular_citadel\code\modules\clothing\under\trek_under.dm"
#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm"
#include "modular_citadel\code\modules\clothing\under\under.dm"
-#include "modular_citadel\code\modules\crafting\recipes.dm"
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
@@ -2985,11 +3081,9 @@
#include "modular_citadel\code\modules\mentor\mentorhelp.dm"
#include "modular_citadel\code\modules\mentor\mentorpm.dm"
#include "modular_citadel\code\modules\mentor\mentorsay.dm"
-#include "modular_citadel\code\modules\mining\mine_items.dm"
#include "modular_citadel\code\modules\mining\mining_ruins.dm"
#include "modular_citadel\code\modules\mob\cit_emotes.dm"
#include "modular_citadel\code\modules\mob\mob.dm"
-#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm"
#include "modular_citadel\code\modules\mob\living\damage_procs.dm"
#include "modular_citadel\code\modules\mob\living\living.dm"
#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm"
@@ -2999,18 +3093,13 @@
#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\ai\vox_sounds.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm"
#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm"
-#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm"
#include "modular_citadel\code\modules\power\lighting.dm"
#include "modular_citadel\code\modules\projectiles\gun.dm"
#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm"
@@ -3029,33 +3118,27 @@
#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm"
-#include "modular_citadel\code\modules\projectiles\projectile\energy.dm"
#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm"
#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm"
-#include "modular_citadel\code\modules\reagents\reagent container\cit_kegs.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm"
+#include "modular_citadel\code\modules\reagents\objects\clothes.dm"
+#include "modular_citadel\code\modules\reagents\objects\items.dm"
#include "modular_citadel\code\modules\reagents\reagent container\hypospraymkii.dm"
#include "modular_citadel\code\modules\reagents\reagent container\hypovial.dm"
#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm"
#include "modular_citadel\code\modules\recycling\disposal\bin.dm"
#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
-#include "modular_citadel\code\modules\research\designs\weapon_designs.dm"
#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm"
-#include "modular_citadel\code\modules\research\designs\weapon_designs\weapon_designs.dm"
#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
-#include "modular_citadel\code\modules\research\techweb\all_nodes.dm"
#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm"
#include "modular_citadel\code\modules\vehicles\secway.dm"
-#include "modular_citadel\code\modules\vore\hook-defs_vr.dm"
-#include "modular_citadel\code\modules\vore\persistence.dm"
-#include "modular_citadel\code\modules\vore\trycatch_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\living_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\vore_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\voreitems.dm"
-#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"
#include "modular_citadel\interface\skin.dmf"
// END_INCLUDE
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index 0dae148976..e80e39528f 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -1,21 +1,21 @@
require=function(){function t(e,n,a){function r(o,s){if(!n[o]){if(!e[o]){var p="function"==typeof require&&require;if(!s&&p)return p(o,!0);if(i)return i(o,!0);var u=Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n||t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o |