From 26e2ec92cace66c90cf11d355591e7dd553c80b4 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 21 Mar 2020 02:04:57 +0100 Subject: [PATCH 001/128] Removes species default_features variable. --- code/modules/client/preferences.dm | 69 +++++++++---------- .../food_and_drinks/food/snacks_pie.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 30 ++------ code/modules/mob/living/carbon/human/emote.dm | 10 +-- .../mob/living/carbon/human/species.dm | 61 ++++++++-------- .../carbon/human/species_types/angel.dm | 9 ++- .../carbon/human/species_types/bugmen.dm | 15 ++-- .../carbon/human/species_types/dullahan.dm | 2 +- .../carbon/human/species_types/dwarves.dm | 1 - .../carbon/human/species_types/felinid.dm | 15 ++-- .../carbon/human/species_types/furrypeople.dm | 18 +++-- .../carbon/human/species_types/humans.dm | 15 ++-- .../living/carbon/human/species_types/ipc.dm | 3 +- .../carbon/human/species_types/jellypeople.dm | 19 +++-- .../human/species_types/lizardpeople.dm | 18 ++--- .../carbon/human/species_types/mushpeople.dm | 3 +- .../carbon/human/species_types/podpeople.dm | 17 +++-- .../carbon/human/species_types/synthliz.dm | 17 +++-- .../carbon/human/species_types/synths.dm | 2 - .../carbon/human/species_types/vampire.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 12 ++-- code/modules/mob/living/emote.dm | 2 +- code/modules/surgery/bodyparts/bodyparts.dm | 6 +- code/modules/surgery/organs/ears.dm | 2 +- code/modules/surgery/organs/tails.dm | 12 ++-- 25 files changed, 161 insertions(+), 201 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 17e9720590..904fbb34af 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -429,7 +429,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 - if("tail_lizard" in pref_species.default_features) + if(pref_species.mutant_bodyparts["tail_lizard"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -442,7 +442,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 - if("mam_tail" in pref_species.default_features) + if(pref_species.mutant_bodyparts["mam_tail"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -454,7 +454,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("tail_human" in pref_species.default_features) + if(pref_species.mutant_bodyparts["tail_human"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -467,7 +467,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 - if("meat_type" in pref_species.default_features) + if(pref_species.mutant_bodyparts["meat_type"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -479,7 +479,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("snout" in pref_species.default_features) + if(pref_species.mutant_bodyparts["snout"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -491,7 +491,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("horns" in pref_species.default_features) + if(pref_species.mutant_bodyparts["horns"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -504,7 +504,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) mutant_category++ if(mutant_category >= MAX_MUTANT_ROWS) dat += "" - if("frills" in pref_species.default_features) + if(pref_species.mutant_bodyparts["frills"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -517,7 +517,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 - if("spines" in pref_species.default_features) + if(pref_species.mutant_bodyparts["spines"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -530,7 +530,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 - if("body_markings" in pref_species.default_features) + if(pref_species.mutant_bodyparts["body_markings"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -542,7 +542,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("mam_body_markings" in pref_species.default_features) + if(pref_species.mutant_bodyparts["mam_body_markings"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -554,7 +554,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" - if("mam_ears" in pref_species.default_features) + if(pref_species.mutant_bodyparts["mam_ears"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -567,7 +567,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 - if("ears" in pref_species.default_features) + if(pref_species.mutant_bodyparts["ears"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -580,7 +580,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 - if("mam_snouts" in pref_species.default_features) + if(pref_species.mutant_bodyparts["mam_snouts"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -592,7 +592,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("legs" in pref_species.default_features) + if(pref_species.mutant_bodyparts["legs"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -604,7 +604,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("deco_wings" in pref_species.default_features) + if(pref_species.mutant_bodyparts["deco_wings"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -613,7 +613,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[features["deco_wings"]]" dat += "    Change
" - if("insect_wings" in pref_species.default_features) + if(pref_species.mutant_bodyparts["insect_wings"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -625,7 +625,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("insect_fluff" in pref_species.default_features) + if(pref_species.mutant_bodyparts["insect_fluff"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -636,7 +636,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("taur" in pref_species.default_features) + if(pref_species.mutant_bodyparts["taur"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -644,7 +644,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[features["taur"]]" - if("insect_markings" in pref_species.default_features) + if(pref_species.mutant_bodyparts["insect_markings"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -661,7 +661,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("wings" in pref_species.mutant_bodyparts && GLOB.r_wings_list.len >1) + if(pref_species.mutant_bodyparts["wings"] && GLOB.r_wings_list.len >1) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -673,7 +673,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("xenohead" in pref_species.default_features) + if(pref_species.mutant_bodyparts["xenohead"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -685,7 +685,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("xenotail" in pref_species.default_features) + if(pref_species.mutant_bodyparts["xenotail"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -697,7 +697,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("xenodorsal" in pref_species.default_features) + if(pref_species.mutant_bodyparts["xenodorsal"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -709,7 +709,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("ipc_screen" in pref_species.default_features) + if(pref_species.mutant_bodyparts["ipc_screen"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -721,7 +721,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 - if("ipc_antenna" in pref_species.default_features) + if(pref_species.mutant_bodyparts["ipc_antenna"]) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -1574,14 +1574,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) pref_species = new newtype() //let's ensure that no weird shit happens on species swapping. custom_species = null - if(!("body_markings" in pref_species.default_features)) + if(!pref_species.mutant_bodyparts["body_markings"]) features["body_markings"] = "None" - if(!("mam_body_markings" in pref_species.default_features)) + if(!pref_species.mutant_bodyparts["mam_body_markings"]) features["mam_body_markings"] = "None" - if("mam_body_markings" in pref_species.default_features) + if(pref_species.mutant_bodyparts["mam_body_markings"]) if(features["mam_body_markings"] == "None") features["mam_body_markings"] = "Plain" - if("tail_lizard" in pref_species.default_features) + if(pref_species.mutant_bodyparts["tail_lizard"]) features["tail_lizard"] = "Smooth" if(pref_species.id == "felinid") features["mam_tail"] = "Cat" @@ -2413,17 +2413,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.nameless = character.nameless character.dna.custom_species = character.custom_species - if("tail_lizard" in pref_species.default_features) - character.dna.species.mutant_bodyparts |= "tail_lizard" - if("mam_tail" in pref_species.default_features) - character.dna.species.mutant_bodyparts |= "mam_tail" - if("xenotail" in pref_species.default_features) - character.dna.species.mutant_bodyparts |= "xenotail" - - if("meat_type" in pref_species.default_features) + if(pref_species.mutant_bodyparts["meat_type"]) 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")) + if(character.dna.species.mutant_bodyparts["legs"] && (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/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index dfb62ef59d..03f4640718 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -44,7 +44,7 @@ if(ishuman(hit_atom)) var/mob/living/carbon/human/H = hit_atom var/mutable_appearance/creamoverlay = mutable_appearance('icons/effects/creampie.dmi') - if((("mam_snouts" in H.dna.species.default_features) && H.dna.features["mam_snouts"] != "None") || (("snout" in H.dna.species.default_features) && H.dna.features["snout"] != "None")) + if((H.dna.species.mutant_bodyparts["mam_snouts"] && H.dna.features["mam_snouts"] != "None") || (H.dna.species.mutant_bodyparts["snout"] && H.dna.features["snout"] != "None")) creamoverlay.icon_state = "creampie_snout" else creamoverlay.icon_state = "creampie_human" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8bd1a35e07..aa0812cd01 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -301,30 +301,12 @@ "You give [src] a pat on the head to make [p_them()] feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) friendly_check = TRUE - if(S?.can_wag_tail(src)) - if("tail_human" in S.default_features) - if(dna.features["tail_human"] == "None") - return - else - if(!dna.species.is_wagging_tail()) - emote("wag") - - if("tail_lizard" in S.default_features) - if(dna.features["tail_lizard"] == "None") - return - else - if(!dna.species.is_wagging_tail()) - emote("wag") - - if("mam_tail" in S.default_features) - if(dna.features["mam_tail"] == "None") - return - else - if(!dna.species.is_wagging_tail()) - emote("wag") - - else - return + if(S?.can_wag_tail(src) && !dna.species.is_wagging_tail()) + var/static/list/many_tails = list("tail_human", "tail_lizard", "mam_tail") + for(var/T in many_tails) + if(S.mutant_bodyparts[T] && dna.features[T] != "None") + emote("wag") + break else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM) M.visible_message( \ diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index acaf713e28..cb0dbef332 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -128,7 +128,7 @@ /datum/emote/living/carbon/human/wing/select_message_type(mob/user) . = ..() var/mob/living/carbon/human/H = user - if("wings" in H.dna.species.mutant_bodyparts) + if(H.dna.species.mutant_bodyparts["wings"]) . = "opens " + message else . = "closes " + message @@ -143,17 +143,17 @@ /mob/living/carbon/human/proc/OpenWings() if(!dna || !dna.species) return - if("wings" in dna.species.mutant_bodyparts) + if(dna.species.mutant_bodyparts["wings"]) + dna.species.mutant_bodyparts["wingsopen"] = dna.species.mutant_bodyparts["wings"] dna.species.mutant_bodyparts -= "wings" - dna.species.mutant_bodyparts |= "wingsopen" update_body() /mob/living/carbon/human/proc/CloseWings() if(!dna || !dna.species) return - if("wingsopen" in dna.species.mutant_bodyparts) + if(dna.species.mutant_bodyparts["wingsopen"]) + dna.species.mutant_bodyparts["wings"] = dna.species.mutant_bodyparts["wingsopen"] dna.species.mutant_bodyparts -= "wingsopen" - dna.species.mutant_bodyparts |= "wings" update_body() if(isturf(loc)) var/turf/T = loc diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index fc2817f134..9034ed1203 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -53,8 +53,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/blacklisted = 0 //Flag to exclude from green slime core species. var/dangerous_existence //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!" var/say_mod = "says" // affects the speech message - var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have. - var/list/mutant_bodyparts = list() // Visible CURRENT bodyparts that are unique to a species. DO NOT USE THIS AS A LIST OF ALL POSSIBLE BODYPARTS AS IT WILL FUCK SHIT UP! Changes to this list for non-species specific bodyparts (ie cat ears and tails) should be assigned at organ level if possible. Layer hiding is handled by handle_mutant_bodyparts() below. + var/list/mutant_bodyparts = list() // Visible CURRENT bodyparts that are unique to a species. Changes to this list for non-species specific bodyparts (ie cat ears and tails) should be assigned at organ level if possible. Layer hiding is handled by handle_mutant_bodyparts() below. var/list/mutant_organs = list() //Internal organs that are unique to this race. var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster var/armor = 0 // overall defense for the race... or less defense, if it's negative. @@ -291,7 +290,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) C.hud_used.update_locked_slots() // this needs to be FIRST because qdel calls update_body which checks if we have DIGITIGRADE legs or not and if not then removes DIGITIGRADE from species_traits - if(("legs" in C.dna.species.mutant_bodyparts) && (C.dna.features["legs"] == "Digitigrade" || C.dna.features["legs"] == "Avian")) + if(C.dna.species.mutant_bodyparts["legs"] && (C.dna.features["legs"] == "Digitigrade" || C.dna.features["legs"] == "Avian")) species_traits |= DIGITIGRADE if(DIGITIGRADE in species_traits) C.Digitigrade_Leg_Swap(FALSE) @@ -329,7 +328,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/mob/living/carbon/human/H = C if(NOGENITALS in H.dna.species.species_traits) H.give_genitals(TRUE) //call the clean up proc to delete anything on the mob then return. - if("meat_type" in default_features) //I can't believe it's come to the meat + if(mutant_bodyparts["meat_type"]) //I can't believe it's come to the meat H.type_of_meat = GLOB.meat_types[H.dna.features["meat_type"]] C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING)) @@ -352,7 +351,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) C.remove_movespeed_modifier(MOVESPEED_ID_SPECIES) - if("meat_type" in default_features) + if(mutant_bodyparts["meat_type"]) C.type_of_meat = GLOB.meat_types[C.dna.features["meat_type"]] else C.type_of_meat = initial(meat) @@ -617,99 +616,99 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) var/tauric = H.dna.features["taur"] && H.dna.features["taur"] != "None" - if("tail_lizard" in mutant_bodyparts) + if(mutant_bodyparts["tail_lizard"]) if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) bodyparts_to_add -= "tail_lizard" - if("waggingtail_lizard" in mutant_bodyparts) + if(mutant_bodyparts["waggingtail_lizard"]) if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) bodyparts_to_add -= "waggingtail_lizard" - else if ("tail_lizard" in mutant_bodyparts) + else if (mutant_bodyparts["tail_lizard"]) bodyparts_to_add -= "waggingtail_lizard" - if("tail_human" in mutant_bodyparts) + if(mutant_bodyparts["tail_human"]) if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) bodyparts_to_add -= "tail_human" - if("waggingtail_human" in mutant_bodyparts) + if(mutant_bodyparts["waggingtail_human"]) if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) bodyparts_to_add -= "waggingtail_human" - else if ("tail_human" in mutant_bodyparts) + else if (mutant_bodyparts["tail_human"]) bodyparts_to_add -= "waggingtail_human" - if("spines" in mutant_bodyparts) + if(mutant_bodyparts["spines"]) if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) bodyparts_to_add -= "spines" - if("waggingspines" in mutant_bodyparts) + if(mutant_bodyparts["waggingspines"]) if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) bodyparts_to_add -= "waggingspines" - else if ("tail" in mutant_bodyparts) + else if (mutant_bodyparts["tail"]) bodyparts_to_add -= "waggingspines" - if("snout" in mutant_bodyparts) //Take a closer look at that snout! + if(mutant_bodyparts["snout"]) //Take a closer look at that snout! if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "snout" - if("frills" in mutant_bodyparts) + if(mutant_bodyparts["frills"]) if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "frills" - if("horns" in mutant_bodyparts) + if(mutant_bodyparts["horns"]) if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "horns" - if("ears" in mutant_bodyparts) + if(mutant_bodyparts["ears"]) if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "ears" - if("wings" in mutant_bodyparts) + if(mutant_bodyparts["wings"]) if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) bodyparts_to_add -= "wings" - if("wings_open" in mutant_bodyparts) + if(mutant_bodyparts["wings_open"]) if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))) bodyparts_to_add -= "wings_open" - else if ("wings" in mutant_bodyparts) + else if (mutant_bodyparts["wings"]) bodyparts_to_add -= "wings_open" - if("insect_fluff" in mutant_bodyparts) + if(mutant_bodyparts["insect_fluff"]) if(!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) bodyparts_to_add -= "insect_fluff" //CITADEL EDIT //Race specific bodyparts: //Xenos - if("xenodorsal" in mutant_bodyparts) + if(mutant_bodyparts["xenodorsal"]) if(!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))) bodyparts_to_add -= "xenodorsal" - if("xenohead" in mutant_bodyparts)//This is an overlay for different castes using different head crests + if(mutant_bodyparts["xenohead"])//This is an overlay for different castes using different head crests if(!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "xenohead" - if("xenotail" in mutant_bodyparts) + if(mutant_bodyparts["xenotail"]) if(!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) bodyparts_to_add -= "xenotail" //Other Races - if("mam_tail" in mutant_bodyparts) + if(mutant_bodyparts["mam_tail"]) if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) bodyparts_to_add -= "mam_tail" - if("mam_waggingtail" in mutant_bodyparts) + if(mutant_bodyparts["mam_waggingtail"]) if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) bodyparts_to_add -= "mam_waggingtail" - else if ("mam_tail" in mutant_bodyparts) + else if (mutant_bodyparts["mam_tail"]) bodyparts_to_add -= "mam_waggingtail" - if("mam_ears" in mutant_bodyparts) + if(mutant_bodyparts["mam_ears"]) if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "mam_ears" - if("mam_snouts" in mutant_bodyparts) //Take a closer look at that snout! + if(mutant_bodyparts["mam_snouts"]) //Take a closer look at that snout! if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "mam_snouts" - if("taur" in mutant_bodyparts) + if(mutant_bodyparts["taur"]) if(!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))) bodyparts_to_add -= "taur" diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm index 924f5f9c6a..5474adcf88 100644 --- a/code/modules/mob/living/carbon/human/species_types/angel.dm +++ b/code/modules/mob/living/carbon/human/species_types/angel.dm @@ -3,8 +3,7 @@ id = "angel" default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) - mutant_bodyparts = list("wings") - default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "Angel") + mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "Angel") use_skintones = 1 no_equip = list(SLOT_BACK) blacklisted = 1 @@ -16,8 +15,8 @@ /datum/species/angel/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) ..() if(H.dna && H.dna.species && (H.dna.features["wings"] != "Angel")) - if(!("wings" in H.dna.species.mutant_bodyparts)) - H.dna.species.mutant_bodyparts |= "wings" + if(!H.dna.species.mutant_bodyparts["wings"]) + H.dna.species.mutant_bodyparts["wings"] = "Angel" H.dna.features["wings"] = "Angel" H.update_body() if(ishuman(H) && !fly) @@ -32,7 +31,7 @@ H.setMovetype(H.movement_type & ~FLYING) ToggleFlight(H,0) if(H.dna && H.dna.species && (H.dna.features["wings"] == "Angel")) - if("wings" in H.dna.species.mutant_bodyparts) + if(H.dna.species.mutant_bodyparts["wings"]) H.dna.species.mutant_bodyparts -= "wings" H.dna.features["wings"] = "None" H.update_body() diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 6bd8a44e0a..da53adece3 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -4,8 +4,7 @@ default_color = "00FF00" species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG - mutant_bodyparts = list("mam_ears","mam_tail", "taur", "insect_wings","mam_snout", "mam_snouts", "insect_fluff","insect_markings") - default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", + mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' @@ -25,21 +24,21 @@ . = ..() /datum/species/insect/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"] /datum/species/insect/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_waggingtail"] /datum/species/insect/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) + if(mutant_bodyparts["mam_tail"]) + mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"] 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) + if(mutant_bodyparts["mam_waggingtail"]) + mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"] mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" H.update_body() /datum/species/insect/qualifies_for_rank(rank, list/features) diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 499e3b0276..a41cc8c55a 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -4,7 +4,7 @@ default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) - default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") + mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "deco_wings" = "None") use_skintones = TRUE mutant_brain = /obj/item/organ/brain/dullahan mutanteyes = /obj/item/organ/eyes/dullahan diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index 15422b2cdd..5a9b830bc8 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -8,7 +8,6 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NO_UNDERWEAR) inherent_traits = list() - default_features = list("mcolor" = "FFF", "wings" = "None") limbs_id = "human" use_skintones = 1 say_mod = "bellows" //high energy, EXTRA BIOLOGICAL FUEL diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 5801e163e5..2f0595e2c0 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -4,8 +4,7 @@ id = "felinid" limbs_id = "human" - mutant_bodyparts = list("mam_ears", "mam_tail", "deco_wings") - default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None", "deco_wings" = "None") + mutant_bodyparts = list("mam_tail" = "Cat", "mam_ears" = "Cat", "deco_wings" = "None") mutantears = /obj/item/organ/ears/cat mutanttail = /obj/item/organ/tail/cat @@ -25,21 +24,21 @@ /datum/species/human/felinid/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"] /datum/species/human/felinid/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_waggingtail"] /datum/species/human/felinid/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) + if(mutant_bodyparts["mam_tail"]) + mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"] mutant_bodyparts -= "mam_tail" - mutant_bodyparts |= "mam_waggingtail" H.update_body() /datum/species/human/felinid/stop_wagging_tail(mob/living/carbon/human/H) - if("mam_waggingtail" in mutant_bodyparts) + if(mutant_bodyparts["mam_waggingtail"]) + mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"] mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" H.update_body() /datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 608d71e2c5..d4b8ea7897 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -5,8 +5,7 @@ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST - mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "deco_wings", "taur", "horns", "legs") - default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", + mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' @@ -26,21 +25,21 @@ . = ..() /datum/species/mammal/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"] /datum/species/mammal/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_waggingtail"] /datum/species/mammal/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) + if(mutant_bodyparts["mam_tail"]) + mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"] 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) + if(mutant_bodyparts["mam_waggingtail"]) + mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"] mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" H.update_body() @@ -57,8 +56,7 @@ default_color = "00FF00" icon_limbs = DEFAULT_BODYPART_ICON_CITADEL species_traits = list(MUTCOLORS,EYECOLOR,LIPS) - 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") + mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 3332465c78..02cff6d924 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -4,8 +4,7 @@ default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR) - mutant_bodyparts = list("ears", "tail_human", "wings", "taur", "deco_wings") // CITADEL EDIT gives humans snowflake parts - default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "None", "deco_wings" = "None") + mutant_bodyparts = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None") use_skintones = 1 skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW @@ -24,19 +23,19 @@ . = ..() /datum/species/human/can_wag_tail(mob/living/carbon/human/H) - return ("tail_human" in mutant_bodyparts) || ("waggingtail_human" in mutant_bodyparts) + return mutant_bodyparts["tail_human"] || mutant_bodyparts["waggingtail_human"] /datum/species/human/is_wagging_tail(mob/living/carbon/human/H) - return ("waggingtail_human" in mutant_bodyparts) + return mutant_bodyparts["waggingtail_human"] /datum/species/human/start_wagging_tail(mob/living/carbon/human/H) - if("tail_human" in mutant_bodyparts) + if(mutant_bodyparts["tail_human"]) + mutant_bodyparts["waggingtail_human"] = mutant_bodyparts["tail_human"] mutant_bodyparts -= "tail_human" - mutant_bodyparts |= "waggingtail_human" H.update_body() /datum/species/human/stop_wagging_tail(mob/living/carbon/human/H) - if("waggingtail_human" in mutant_bodyparts) + if(mutant_bodyparts["waggingtail_human"]) + mutant_bodyparts["tail_human"] = mutant_bodyparts["waggingtail_human"] mutant_bodyparts -= "waggingtail_human" - mutant_bodyparts |= "tail_human" H.update_body() diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index b7305a9228..94d5456c3d 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -8,8 +8,7 @@ sexes = 0 species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID - mutant_bodyparts = list("ipc_screen", "ipc_antenna") - default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") + mutant_bodyparts = list("ipc_screen" = "Blank", "ipc_antenna" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless) mutanttongue = /obj/item/organ/tongue/robot/ipc diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index cf2950ff6f..3b91bad01b 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -7,8 +7,7 @@ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR) mutantlungs = /obj/item/organ/lungs/slime mutant_heart = /obj/item/organ/heart/slime - mutant_bodyparts = list("mam_tail", "mam_ears", "mam_snouts", "taur", "deco_wings") //CIT CHANGE - default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") //CIT CHANGE + mutant_bodyparts = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime gib_types = list(/obj/effect/gibspawner/slime, /obj/effect/gibspawner/slime/bodypartless) @@ -127,23 +126,24 @@ . = ..() /datum/species/jelly/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"] /datum/species/jelly/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_waggingtail"] /datum/species/jelly/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) + if(mutant_bodyparts["mam_tail"]) + mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"] mutant_bodyparts -= "mam_tail" - mutant_bodyparts |= "mam_waggingtail" H.update_body() /datum/species/jelly/stop_wagging_tail(mob/living/carbon/human/H) - if("mam_waggingtail" in mutant_bodyparts) + if(mutant_bodyparts["mam_waggingtail"]) + mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"] mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" H.update_body() + ////////////////////////////////////////////////////////SLIMEPEOPLE/////////////////////////////////////////////////////////////////// //Slime people are able to split like slimes, retaining a single mind that can swap between bodies at will, even after death. @@ -431,8 +431,7 @@ default_color = "00FFFF" species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) 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") + mutant_bodyparts = 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. diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 6468bd1544..9a6bc2659d 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -11,7 +11,7 @@ mutanttail = /obj/item/organ/tail/lizard coldmod = 1.5 heatmod = 0.67 - default_features = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", + mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None") attack_verb = "slash" @@ -53,25 +53,25 @@ . = ..() /datum/species/lizard/can_wag_tail(mob/living/carbon/human/H) - return ("tail_lizard" in mutant_bodyparts) || ("waggingtail_lizard" in mutant_bodyparts) + return mutant_bodyparts["tail_lizard"] || mutant_bodyparts["waggingtail_lizard"] /datum/species/lizard/is_wagging_tail(mob/living/carbon/human/H) - return ("waggingtail_lizard" in mutant_bodyparts) + return mutant_bodyparts["waggingtail_lizard"] /datum/species/lizard/start_wagging_tail(mob/living/carbon/human/H) - if("tail_lizard" in mutant_bodyparts) + if(mutant_bodyparts["tail_lizard"]) + mutant_bodyparts["waggingtail_lizard"] = mutant_bodyparts["tail_lizard"] + mutant_bodyparts["waggingspines"] = mutant_bodyparts["spines"] mutant_bodyparts -= "tail_lizard" mutant_bodyparts -= "spines" - mutant_bodyparts |= "waggingtail_lizard" - mutant_bodyparts |= "waggingspines" H.update_body() /datum/species/lizard/stop_wagging_tail(mob/living/carbon/human/H) - if("waggingtail_lizard" in mutant_bodyparts) + if(mutant_bodyparts["waggingtail_lizard"]) + mutant_bodyparts["tail_lizard"] = mutant_bodyparts["waggingtail_lizard"] + mutant_bodyparts["spines"] = mutant_bodyparts["waggingspines"] mutant_bodyparts -= "waggingtail_lizard" mutant_bodyparts -= "waggingspines" - mutant_bodyparts |= "tail_lizard" - mutant_bodyparts |= "spines" H.update_body() /* diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 9d5ca92894..3c17ef9066 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -1,8 +1,7 @@ /datum/species/mush //mush mush codecuck name = "Anthromorphic Mushroom" id = "mush" - mutant_bodyparts = list("caps") - default_features = list("caps" = "Round") + mutant_bodyparts = list("caps" = "Round") fixed_mut_color = "DBBF92" hair_color = "FF4B19" //cap color, spot color uses eye color diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 7ccccd588d..44a794c2ab 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -76,14 +76,13 @@ name = "Anthromorphic Plant" id = "podweak" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS) - 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") + mutant_bodyparts = 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") limbs_id = "pod" light_nutrition_gain_factor = 7.5 light_bruteheal = 0.2 light_burnheal = 0.2 light_toxheal = 0.7 - + /datum/species/pod/pseudo_weak/spec_death(gibbed, mob/living/carbon/human/H) if(H) stop_wagging_tail(H) @@ -94,19 +93,19 @@ . = ..() /datum/species/pod/pseudo_weak/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"] /datum/species/pod/pseudo_weak/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_waggingtail"] /datum/species/pod/pseudo_weak/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) + if(mutant_bodyparts["mam_tail"]) + mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"] mutant_bodyparts -= "mam_tail" - mutant_bodyparts |= "mam_waggingtail" H.update_body() /datum/species/pod/pseudo_weak/stop_wagging_tail(mob/living/carbon/human/H) - if("mam_waggingtail" in mutant_bodyparts) + if(mutant_bodyparts["mam_waggingtail"]) + mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"] mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" H.update_body() diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm index 40441c45fd..408d264546 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -6,8 +6,7 @@ default_color = "00FF00" species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID - mutant_bodyparts = list("ipc_antenna","mam_tail", "mam_snouts","legs", "mam_body_markings", "taur") - default_features = list("ipc_antenna" = "Synthetic Lizard - Antennae","mam_tail" = "Synthetic Lizard", "mam_snouts" = "Synthetic Lizard - Snout", "legs" = "Digitigrade", "mam_body_markings" = "Synthetic Lizard - Plates", "taur" = "None") + mutant_bodyparts = list("ipc_antenna" = "Synthetic Lizard - Antennae","mam_tail" = "Synthetic Lizard", "mam_snouts" = "Synthetic Lizard - Snout", "legs" = "Digitigrade", "mam_body_markings" = "Synthetic Lizard - Plates", "taur" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless) mutanttongue = /obj/item/organ/tongue/robot/ipc @@ -35,19 +34,19 @@ . = ..() /datum/species/synthliz/can_wag_tail(mob/living/carbon/human/H) - return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_tail"] || mutant_bodyparts["mam_waggingtail"] /datum/species/synthliz/is_wagging_tail(mob/living/carbon/human/H) - return ("mam_waggingtail" in mutant_bodyparts) + return mutant_bodyparts["mam_waggingtail"] /datum/species/synthliz/start_wagging_tail(mob/living/carbon/human/H) - if("mam_tail" in mutant_bodyparts) + if(mutant_bodyparts["mam_tail"]) + mutant_bodyparts["mam_waggingtail"] = mutant_bodyparts["mam_tail"] mutant_bodyparts -= "mam_tail" - mutant_bodyparts |= "mam_waggingtail" H.update_body() /datum/species/synthliz/stop_wagging_tail(mob/living/carbon/human/H) - if("mam_waggingtail" in mutant_bodyparts) + if(mutant_bodyparts["mam_waggingtail"]) + mutant_bodyparts["mam_tail"] = mutant_bodyparts["mam_waggingtail"] mutant_bodyparts -= "mam_waggingtail" - mutant_bodyparts |= "mam_tail" - H.update_body() \ No newline at end of file + H.update_body() diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index cb7822ad7e..1700927a24 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -58,7 +58,6 @@ meat = S.meat mutant_bodyparts = S.mutant_bodyparts.Copy() mutant_organs = S.mutant_organs.Copy() - default_features = S.default_features.Copy() nojumpsuit = S.nojumpsuit no_equip = S.no_equip.Copy() limbs_id = S.limbs_id @@ -75,7 +74,6 @@ attack_sound = initial(attack_sound) miss_sound = initial(miss_sound) mutant_bodyparts = list() - default_features = list() nojumpsuit = initial(nojumpsuit) no_equip = list() qdel(fake_species) diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 8bbd870149..803af56dec 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -5,7 +5,7 @@ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD) inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") + mutant_bodyparts = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "deco_wings" = "None") exotic_bloodtype = "U" use_skintones = TRUE mutant_heart = /obj/item/organ/heart/vampire diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index f1b1570e24..87741868cb 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -330,9 +330,9 @@ There are several things that need to be remembered: var/alt_icon = H.alternate_worn_icon || 'icons/mob/head.dmi' var/muzzled = FALSE var/variation_flag = NONE - if(("mam_snouts" in dna.species.default_features) && dna.features["mam_snouts"] != "None") + if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") muzzled = TRUE - if(!muzzled && ("snout" in dna.species.default_features) && dna.features["snout"] != "None") + else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") muzzled = TRUE if(muzzled && H.mutantrace_variation & STYLE_MUZZLE) alt_icon = 'icons/mob/head_muzzled.dmi' @@ -394,7 +394,7 @@ There are several things that need to be remembered: var/dimension_y = 32 var/variation_flag = NONE var/datum/sprite_accessory/taur/T - if("taur" in dna.species.mutant_bodyparts) + if(dna.species.mutant_bodyparts["taur"]) T = GLOB.taur_list[dna.features["taur"]] if(S.mutantrace_variation) @@ -463,9 +463,9 @@ There are several things that need to be remembered: var/variation_flag = NONE if(head && (head.flags_inv & HIDEMASK)) return - if(("mam_snouts" in dna.species.default_features) && dna.features["mam_snouts"] != "None") + if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") muzzled = TRUE - if(!muzzled && ("snout" in dna.species.default_features) && dna.features["snout"] != "None") + else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") muzzled = TRUE if(muzzled && M.mutantrace_variation & STYLE_MUZZLE) alt_icon = 'icons/mob/mask_muzzled.dmi' @@ -653,7 +653,7 @@ generate/load female uniform sprites matching all previously decided variables var/is_taur = FALSE var/mob/living/carbon/human/H = src - if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None")) + if(H.dna.species.mutant_bodyparts["taur"] && H.dna.features["taur"] != "None") is_taur = TRUE diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 3aae3e36ed..111054c383 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -125,7 +125,7 @@ var/mob/living/carbon/human/H = user var/open = FALSE if(H.dna.features["wings"] != "None") - if("wingsopen" in H.dna.species.mutant_bodyparts) + if(H.dna.species.mutant_bodyparts["wingsopen"]) open = TRUE H.CloseWings() else diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 4b56ab6cb8..0572010654 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -358,18 +358,18 @@ base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon else species_color = "" - + if(base_bp_icon != DEFAULT_BODYPART_ICON) color_src = MUTCOLORS //TODO - Add color matrix support to base limbs - if("legs" in S.default_features) + if(S.mutant_bodyparts["legs"]) if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG) if(DIGITIGRADE in S.species_traits) digitigrade_type = lowertext(H.dna.features["legs"]) else digitigrade_type = null - if("mam_body_markings" in S.default_features) + if(S.mutant_bodyparts["mam_body_markings"]) var/datum/sprite_accessory/Smark Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] if(Smark) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 65847042a1..846dd1ecbe 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -100,7 +100,7 @@ ..() if(istype(H)) color = H.hair_color - H.dna.species.mutant_bodyparts |= "ears" + H.dna.species.mutant_bodyparts["ears"] = "Cat" H.dna.features["ears"] = "Cat" H.update_body() diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm index fe881df221..b1b33b314c 100644 --- a/code/modules/surgery/organs/tails.dm +++ b/code/modules/surgery/organs/tails.dm @@ -21,8 +21,8 @@ /obj/item/organ/tail/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE) ..() if(istype(H)) - if(!("tail_human" in H.dna.species.mutant_bodyparts)) - H.dna.species.mutant_bodyparts |= "tail_human" + if(!H.dna.species.mutant_bodyparts["tail_human"]) + H.dna.species.mutant_bodyparts["tail_human"] = tail_type H.dna.features["tail_human"] = tail_type H.update_body() @@ -46,13 +46,13 @@ ..() if(istype(H)) // Checks here are necessary so it wouldn't overwrite the tail of a lizard it spawned in - if(!("tail_lizard" in H.dna.species.mutant_bodyparts)) + if(!H.dna.species.mutant_bodyparts["tail_lizard"]) H.dna.features["tail_lizard"] = tail_type - H.dna.species.mutant_bodyparts |= "tail_lizard" + H.dna.species.mutant_bodyparts["tail_lizard"] = tail_type - if(!("spines" in H.dna.species.mutant_bodyparts)) + if(!H.dna.species.mutant_bodyparts["spines"]) H.dna.features["spines"] = spines - H.dna.species.mutant_bodyparts |= "spines" + H.dna.species.mutant_bodyparts["spines"] = spines H.update_body() /obj/item/organ/tail/lizard/Remove(special = FALSE) From 2103e9975b87c864847dd9a40d815fbc3b48262f Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 21 Mar 2020 02:37:05 +0100 Subject: [PATCH 002/128] Oh yea, also a fix. --- code/modules/surgery/organs/ears.dm | 8 ++++---- code/modules/surgery/organs/tails.dm | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 846dd1ecbe..63febd1a9f 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -100,16 +100,16 @@ ..() if(istype(H)) color = H.hair_color - H.dna.species.mutant_bodyparts["ears"] = "Cat" - H.dna.features["ears"] = "Cat" + H.dna.species.mutant_bodyparts["mam_ears"] = "Cat" + H.dna.features["mam_ears"] = "Cat" H.update_body() /obj/item/organ/ears/cat/Remove(special = FALSE) if(!QDELETED(owner) && ishuman(owner)) var/mob/living/carbon/human/H = owner color = H.hair_color - H.dna.features["ears"] = "None" - H.dna.species.mutant_bodyparts -= "ears" + H.dna.features["mam_ears"] = "None" + H.dna.species.mutant_bodyparts -= "mam_ears" H.update_body() return ..() diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm index b1b33b314c..55a656f42d 100644 --- a/code/modules/surgery/organs/tails.dm +++ b/code/modules/surgery/organs/tails.dm @@ -21,16 +21,16 @@ /obj/item/organ/tail/cat/Insert(mob/living/carbon/human/H, special = 0, drop_if_replaced = TRUE) ..() if(istype(H)) - if(!H.dna.species.mutant_bodyparts["tail_human"]) - H.dna.species.mutant_bodyparts["tail_human"] = tail_type - H.dna.features["tail_human"] = tail_type + if(!H.dna.species.mutant_bodyparts["mam_tail"]) + H.dna.species.mutant_bodyparts["mam_tail"] = tail_type + H.dna.features["mam_tail"] = tail_type H.update_body() /obj/item/organ/tail/cat/Remove(special = FALSE) if(!QDELETED(owner) && ishuman(owner)) var/mob/living/carbon/human/H = owner - H.dna.features["tail_human"] = "None" - H.dna.species.mutant_bodyparts -= "tail_human" + H.dna.features["mam_tail"] = "None" + H.dna.species.mutant_bodyparts -= "mam_tail" color = H.hair_color H.update_body() return ..() From fd9985fb27d42bd24bb12a2e4898772a2c637ab7 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:12:12 +0100 Subject: [PATCH 003/128] Made votes obfuscation settings more robust. --- code/__DEFINES/vote.dm | 12 ++++++++ code/controllers/subsystem/ticker.dm | 14 +++++----- code/controllers/subsystem/vote.dm | 41 +++++++++++++++++++--------- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm index 12e802383e..175cce3dc4 100644 --- a/code/__DEFINES/vote.dm +++ b/code/__DEFINES/vote.dm @@ -5,6 +5,11 @@ #define MAJORITY_JUDGEMENT_VOTING 4 #define INSTANT_RUNOFF_VOTING 5 +#define SHOW_RESULTS (1<<0) +#define SHOW_VOTES (1<<1) +#define SHOW_WINNER (1<<2) +#define SHOW_ABSTENTION (1<<3) + GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great")) GLOBAL_LIST_INIT(vote_type_names,list(\ @@ -15,3 +20,10 @@ GLOBAL_LIST_INIT(vote_type_names,list(\ "Raw Score (returns results from 0 to 1, winner is 1)" = SCORE_VOTING,\ "Majority Judgement (single-winner score voting)" = MAJORITY_JUDGEMENT_VOTING,\ )) + +GLOBAL_LIST_INIT(display_vote_settings, list(\ +"Results" = SHOW_RESULTS, +"Ongoing Votes" = SHOW_VOTES, +"Winner" = SHOW_WINNER, +"Abstainers" = SHOW_ABSTENTION +)) \ No newline at end of file diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 2ef9608a96..a7be36abc2 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -479,15 +479,15 @@ SUBSYSTEM_DEF(ticker) var/vote_type = CONFIG_GET(string/map_vote_type) switch(vote_type) if("PLURALITY") - SSvote.initiate_vote("map","server",hideresults=TRUE) + SSvote.initiate_vote("map","server", display = SHOW_RESULTS) if("APPROVAL") - SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = APPROVAL_VOTING) + SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = APPROVAL_VOTING) if("IRV") - SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = INSTANT_RUNOFF_VOTING) + SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = INSTANT_RUNOFF_VOTING) if("SCORE") - SSvote.initiate_vote("map","server",hideresults=TRUE,votesystem = MAJORITY_JUDGEMENT_VOTING) + SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = MAJORITY_JUDGEMENT_VOTING) else - SSvote.initiate_vote("map","server",hideresults=TRUE) + SSvote.initiate_vote("map","server", display = SHOW_RESULTS) // fallback /datum/controller/subsystem/ticker/proc/HasRoundStarted() @@ -503,9 +503,9 @@ SUBSYSTEM_DEF(ticker) SSticker.modevoted = TRUE var/dynamic = CONFIG_GET(flag/dynamic_voting) if(dynamic) - SSvote.initiate_vote("dynamic","server",hideresults=TRUE,votesystem=SCORE_VOTING,forced=TRUE,vote_time = 20 MINUTES) + SSvote.initiate_vote("dynamic", "server", display = NONE, votesystem = SCORE_VOTING, forced = TRUE,vote_time = 20 MINUTES) else - SSvote.initiate_vote("roundtype","server",hideresults=TRUE,votesystem=PLURALITY_VOTING,forced=TRUE, \ + SSvote.initiate_vote("roundtype", "server", display = NONE, votesystem = PLURALITY_VOTING, forced=TRUE, \ vote_time = (CONFIG_GET(flag/modetier_voting) ? 1 MINUTES : 20 MINUTES)) /datum/controller/subsystem/ticker/Recover() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index e7e5754f6b..514aa2465b 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(vote) var/list/generated_actions = list() var/next_pop = 0 - var/obfuscated = FALSE//CIT CHANGE - adds obfuscated/admin-only votes + var/display_votes = SHOW_RESULTS|SHOW_VOTES|SHOW_WINNER|SHOW_ABSTENTION //CIT CHANGE - adds obfuscated/admin-only votes var/list/stored_gamemode_votes = list() //Basically the last voted gamemode is stored here for end-of-round use. @@ -59,7 +59,7 @@ SUBSYSTEM_DEF(vote) voted.Cut() voting.Cut() scores.Cut() - obfuscated = FALSE //CIT CHANGE - obfuscated votes + display_votes = initial(display_votes) //CIT CHANGE - obfuscated votes remove_action_buttons() /datum/controller/subsystem/vote/proc/get_result() @@ -250,7 +250,7 @@ SUBSYSTEM_DEF(vote) if(winners.len > 0) if(was_roundtype_vote) stored_gamemode_votes = list() - if(!obfuscated) + if(display_votes & SHOW_RESULTS) if(vote_system == SCHULZE_VOTING) text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" if(vote_system == MAJORITY_JUDGEMENT_VOTING) @@ -261,15 +261,15 @@ SUBSYSTEM_DEF(vote) votes = 0 if(was_roundtype_vote) stored_gamemode_votes[choices[i]] = votes - text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes + text += "\n[choices[i]]: [display_votes & SHOW_RESULTS ? votes : "???"]" //CIT CHANGE - adds obfuscated votes if(mode != "custom") - if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes + if(winners.len > 1 && display_votes & SHOW_WINNER) //CIT CHANGE - adds obfuscated votes text = "\nVote Tied Between:" for(var/option in winners) text += "\n\t[option]" . = pick(winners) - text += "\nVote Result: [obfuscated ? "???" : .]" //CIT CHANGE - adds obfuscated votes - else + text += "\nVote Result: [display_votes & SHOW_WINNER ? . : "???"]" //CIT CHANGE - adds obfuscated votes + if(display_votes & SHOW_ABSTENTION) text += "\nDid not vote: [GLOB.clients.len-voted.len]" else if(vote_system == SCORE_VOTING) for(var/score_name in scores) @@ -278,7 +278,7 @@ SUBSYSTEM_DEF(vote) score = 0 if(was_roundtype_vote) stored_gamemode_votes[score_name] = score - text = "\n[score_name]: [obfuscated ? "???" : score]" + text = "\n[score_name]: [display_votes & SHOW_RESULTS ? score : "???"]" . = 1 else text += "Vote Result: Inconclusive - No Votes!" @@ -295,7 +295,7 @@ SUBSYSTEM_DEF(vote) if(islist(myvote)) for(var/j=1,j<=myvote.len,j++) SSblackbox.record_feedback("nested tally","voting",1,list(vote_title_text,"[j]\th",choices[myvote[j]])) - if(obfuscated) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results + if(!(display_votes & SHOW_RESULTS)) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results var/admintext = "Obfuscated results" if(vote_system != SCORE_VOTING) if(vote_system == SCHULZE_VOTING) @@ -327,7 +327,7 @@ SUBSYSTEM_DEF(vote) if(CONFIG_GET(flag/modetier_voting)) reset() started_time = 0 - initiate_vote("mode tiers","server",hideresults=FALSE,votesystem=SCORE_VOTING,forced=TRUE, vote_time = 30 MINUTES) + initiate_vote("mode tiers","server", votesystem=SCORE_VOTING, forced=TRUE, vote_time = 30 MINUTES) to_chat(world,"The vote will end right as the round starts.") return . if("restart") @@ -432,7 +432,7 @@ SUBSYSTEM_DEF(vote) saved -= usr.ckey return 0 -/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, hideresults, votesystem = PLURALITY_VOTING, forced = FALSE,vote_time = -1)//CIT CHANGE - adds hideresults argument to votes to allow for obfuscated votes +/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, display = display_votes, votesystem = PLURALITY_VOTING, forced = FALSE,vote_time = -1)//CIT CHANGE - adds display argument to votes to allow for obfuscated votes vote_system = votesystem if(!mode) if(started_time) @@ -452,7 +452,7 @@ SUBSYSTEM_DEF(vote) SEND_SOUND(world, sound('sound/misc/notice2.ogg')) reset() - obfuscated = hideresults //CIT CHANGE - adds obfuscated votes + display_votes = display //CIT CHANGE - adds obfuscated votes switch(vote_type) if("restart") choices.Add("Restart Round","Continue Playing") @@ -503,6 +503,21 @@ SUBSYSTEM_DEF(vote) if(!option || mode || !usr.client) break choices.Add(option) + var/keep_going = TRUE + var/toggles = SHOW_RESULTS|SHOW_VOTES|SHOW_WINNER + while(keep_going) + var/list/choices = list() + for(var/A in GLOB.display_vote_settings) + var/toggletext + var/bitflag = GLOB.display_vote_settings[A] + toggletext = "[toggles & bitflag ? "Show" : "Hide"] [A]" + choices[toggletext] = bitflag + var/chosen = input(usr, "Toggle vote display settings. Cancel to finalize.", toggles) as null|anything in choices + if(!chosen) + keep_going = FALSE + else + toggles ^= choices[chosen] + display_votes = toggles else return 0 mode = vote_type @@ -573,7 +588,7 @@ SUBSYSTEM_DEF(vote) ivotedforthis = ((C.ckey in voted) && (i in voted[C.ckey])) if(!votes) votes = 0 - . += "
  • [ivotedforthis ? "" : ""][choices[i]] ([obfuscated ? (admin ? "??? ([votes])" : "???") : votes] votes)[ivotedforthis ? "" : ""]
  • " // CIT CHANGE - adds obfuscated votes + . += "
  • [ivotedforthis ? "" : ""][choices[i]] ([display_votes & SHOW_VOTES ? votes : (admin ? "??? ([votes])" : "???")] votes)[ivotedforthis ? "" : ""]
  • " // CIT CHANGE - adds obfuscated votes if(choice_descs.len >= i) . += "
  • [choice_descs[i]]
  • " . += "
    " From 97ad47f3fd402f0bce2f3228b4c6f80ef51c1ff8 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 23 Mar 2020 22:40:02 +0100 Subject: [PATCH 004/128] Fixing an inconsistency with nuclear bombs exploding on station level space. --- code/__DEFINES/misc.dm | 9 +++-- code/game/gamemodes/game_mode.dm | 6 ++-- .../nukeop/equipment/nuclearbomb.dm | 33 ++++++++----------- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 89cacc1c7b..9efffefce5 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -345,11 +345,10 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define COLOUR_PRIORITY_AMOUNT 4 //how many priority levels there are. //Endgame Results -#define NUKE_NEAR_MISS 1 -#define NUKE_MISS_STATION 2 -#define NUKE_SYNDICATE_BASE 3 -#define STATION_DESTROYED_NUKE 4 -#define STATION_EVACUATED 5 +#define NUKE_MISS_STATION 1 +#define NUKE_SYNDICATE_BASE 2 +#define STATION_DESTROYED_NUKE 3 +#define STATION_EVACUATED 4 #define BLOB_WIN 8 #define BLOB_NUKE 9 #define BLOB_DESTROYED 10 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index b98462d4d4..5affeba6d6 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -323,7 +323,7 @@ var/free_tickets = CONFIG_GET(number/default_antag_tickets) //Max extra tickets you can use var/additional_tickets = CONFIG_GET(number/max_tickets_per_roll) - + var/list/ckey_to_mind = list() //this is admittedly shitcode but I'm webediting var/list/prev_tickets = SSpersistence.antag_rep //cache for hyper-speed in theory. how many tickets someone has stored var/list/curr_tickets = list() //how many tickets someone has for *this* antag roll, so with the free tickets @@ -337,7 +337,7 @@ continue curr_tickets[mind_ckey] = amount ckey_to_mind[mind_ckey] = M //make sure we can look them up after picking - + if(!return_list) //return a single guy var/ckey if(length(curr_tickets)) @@ -584,7 +584,7 @@ //By default nuke just ends the round /datum/game_mode/proc/OnNukeExplosion(off_station) nuke_off_station = off_station - if(off_station < 2) + if(!off_station) station_was_nuked = TRUE //Will end the round on next check. //Additional report section in roundend report diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 1963bf16e3..2c91e18bd8 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -74,16 +74,15 @@ /obj/machinery/nuclearbomb/syndicate/get_cinematic_type(off_station) var/datum/game_mode/nuclear/NM = SSticker.mode switch(off_station) - if(0) + if(FALSE) if(istype(NM) && !NM.nuke_team.syndies_escaped()) return CINEMATIC_ANNIHILATION else return CINEMATIC_NUKE_WIN - if(1) + if(NUKE_MISS_STATION) return CINEMATIC_NUKE_MISS - if(2) + else return CINEMATIC_NUKE_FAR - return CINEMATIC_NUKE_FAR /obj/machinery/nuclearbomb/proc/disk_check(obj/item/disk/nuclear/D) if(D.fake) @@ -387,14 +386,14 @@ if("anchor") if(auth && yes_code) playsound(src, 'sound/machines/nuke/general_beep.ogg', 50, FALSE) - set_anchor() + set_anchor(usr) else playsound(src, 'sound/machines/nuke/angry_beep.ogg', 50, FALSE) -/obj/machinery/nuclearbomb/proc/set_anchor() - if(isinspace() && !anchored) - to_chat(usr, "There is nothing to anchor to!") +/obj/machinery/nuclearbomb/proc/set_anchor(mob/user) + if((istype(get_area(src), /area/space) || isinspace()) && !anchored) + to_chat(user, "This is not a suitable platform for anchoring [src]!") else anchored = !anchored @@ -480,20 +479,14 @@ GLOB.enter_allowed = FALSE - var/off_station = 0 + var/off_station = FALSE var/turf/bomb_location = get_turf(src) - var/area/A = get_area(bomb_location) - if(bomb_location && is_station_level(bomb_location.z)) - if(istype(A, /area/space)) - off_station = NUKE_NEAR_MISS - if((bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE))) - off_station = NUKE_NEAR_MISS + if(!bomb_location || !is_station_level(bomb_location.z)) + off_station = NUKE_MISS_STATION else if(bomb_location.onSyndieBase()) off_station = NUKE_SYNDICATE_BASE - else - off_station = NUKE_MISS_STATION - if(off_station < 2) + if(!off_station) SSshuttle.registerHostileEnvironment(src) SSshuttle.lockdown = TRUE @@ -507,7 +500,7 @@ INVOKE_ASYNC(GLOBAL_PROC,.proc/KillEveryoneOnZLevel, z) /obj/machinery/nuclearbomb/proc/get_cinematic_type(off_station) - if(off_station < 2) + if(!off_station) return CINEMATIC_SELFDESTRUCT else return CINEMATIC_SELFDESTRUCT_MISS @@ -588,7 +581,7 @@ This is here to make the tiles around the station mininuke change when it's armed. */ -/obj/machinery/nuclearbomb/selfdestruct/set_anchor() +/obj/machinery/nuclearbomb/selfdestruct/set_anchor(mob/user) return /obj/machinery/nuclearbomb/selfdestruct/set_active() From a2b2e08e31413b43db4f8f936b1639f9cb2d5433 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 24 Mar 2020 17:53:53 +0100 Subject: [PATCH 005/128] Fixes crafting hud icon overlapping the second pocket on 1:1 screen mode. --- code/__DEFINES/citadel_defines.dm | 12 ------------ code/_onclick/hud/_defines.dm | 11 +++++++++++ code/datums/components/crafting/craft.dm | 2 ++ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 01355173d2..85ffe0b5ce 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -2,18 +2,6 @@ //Be sure to update the min/max of these if you do change them. //Measurements are in imperial units. Inches, feet, yards, miles. Tsp, tbsp, cups, quarts, gallons, etc -//HUD stuff -#define ui_arousal "EAST-1:28,CENTER-4:8"//Below the health doll -#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button -#define ui_overridden_resist "EAST-3:24,SOUTH+1:7" -#define ui_combat_toggle "EAST-4:22,SOUTH:5" - -//1:1 HUD layout stuff -#define ui_boxcraft "EAST-4:22,SOUTH+1:6" -#define ui_boxarea "EAST-4:6,SOUTH+1:6" -#define ui_boxlang "EAST-5:22,SOUTH+1:6" -#define ui_boxvore "EAST-5:22,SOUTH+1:6" - //Filters #define CIT_FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, color="#04080F") diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 12f7986357..28fd7397b0 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -163,3 +163,14 @@ #define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24" #define ui_ghost_teleport "SOUTH:6,CENTER+1:24" #define ui_ghost_pai "SOUTH: 6, CENTER+2:24" + + +//UI position overrides for 1:1 screen layout. (default is 7:5) +#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button +#define ui_overridden_resist "EAST-3:24,SOUTH+1:7" +#define ui_combat_toggle "EAST-4:22,SOUTH:5" + +#define ui_boxcraft "EAST-4:22,SOUTH+1:6" +#define ui_boxarea "EAST-4:6,SOUTH+1:6" +#define ui_boxlang "EAST-5:22,SOUTH+1:6" +#define ui_boxvore "EAST-5:22,SOUTH+1:6" diff --git a/code/datums/components/crafting/craft.dm b/code/datums/components/crafting/craft.dm index cd3f05b326..9b19cd0106 100644 --- a/code/datums/components/crafting/craft.dm +++ b/code/datums/components/crafting/craft.dm @@ -8,6 +8,8 @@ var/obj/screen/craft/C = new() C.icon = H.ui_style H.static_inventory += C + if(!CL.prefs.widescreenpref) + C.screen_loc = ui_boxcraft CL.screen += C RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact) From b789cd246ad65f9ecc315c9d1824eda659f93b53 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 24 Mar 2020 19:03:49 +0000 Subject: [PATCH 006/128] frying changes with bad chems (#11580) * Update toxin_reagents.dm * Update snacks_bread.dm * Update toxin_reagents.dm --- .../food_and_drinks/food/snacks_bread.dm | 13 +++++++------ .../chemistry/reagents/toxin_reagents.dm | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index b18dfc7968..204e5ce455 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -189,12 +189,11 @@ GLOBAL_VAR_INIT(frying_hardmode, TRUE) GLOBAL_VAR_INIT(frying_bad_chem_add_volume, TRUE) GLOBAL_LIST_INIT(frying_bad_chems, list( -/datum/reagent/toxin/bad_food = 10, -/datum/reagent/clf3 = 2, +/datum/reagent/toxin/bad_food = 3, /datum/reagent/drug/aranesp = 2, -/datum/reagent/blackpowder = 10, -/datum/reagent/phlogiston = 3, -/datum/reagent/toxin/cyanide = 3, +/datum/reagent/toxin = 2, +/datum/reagent/lithium = 2, +/datum/reagent/mercury = 2, )) /obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried) @@ -227,8 +226,10 @@ GLOBAL_LIST_INIT(frying_bad_chems, list( var/bad_chem = GLOB.frying_bad_chems[R] var/bad_chem_amount = GLOB.frying_bad_chems[bad_chem] if(GLOB.frying_bad_chem_add_volume) - reagents.maximum_volume += bad_chem_amount + reagents.maximum_volume += bad_chem_amount + 2 //Added room for condensed cooking oil reagents.add_reagent(bad_chem, bad_chem_amount) + //All fried inedible items also get condensed cooking oil added, which induces minor vomiting and heart damage + reagents.add_reagent(/datum/reagent/toxin/condensed_cooking_oil, 2) /obj/item/reagent_containers/food/snacks/deepfryholder/Destroy() if(trash) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index cfb0588f8f..305d12b3c5 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -495,6 +495,24 @@ toxpwr = 0.5 taste_description = "bad cooking" +/datum/reagent/toxin/condensed_cooking_oil + name = "Condensed Cooking Oil" + description = "Taste the consequences of your mistakes." + reagent_state = LIQUID + color = "#d6d6d8" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + toxpwr = 0 + taste_mult = -2 + taste_description = "awful cooking" + +/datum/reagent/toxin/condensed_cooking_oil/on_mob_life(mob/living/carbon/M) + if(prob(15)) + M.vomit() + else + if(prob(40)) + M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5) //For reference, bungotoxin does 3 + ..() + /datum/reagent/toxin/itching_powder name = "Itching Powder" description = "A powder that induces itching upon contact with the skin. Causes the victim to scratch at their itches and has a very low chance to decay into Histamine." From 5089190c837780728d3315fb8c1c052dfca6a3d3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 24 Mar 2020 14:03:52 -0500 Subject: [PATCH 007/128] Automatic changelog generation for PR #11580 [ci skip] --- html/changelogs/AutoChangeLog-pr-11580.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11580.yml diff --git a/html/changelogs/AutoChangeLog-pr-11580.yml b/html/changelogs/AutoChangeLog-pr-11580.yml new file mode 100644 index 0000000000..4dd8e6daf3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11580.yml @@ -0,0 +1,5 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "new reagent 'Condensed Cooking Oil'" + - tweak: "list of chems that can go into fried non-food items was changed" From 54cdae148de5569ac626dff08f862fd8cce6a317 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 24 Mar 2020 20:28:13 +0100 Subject: [PATCH 008/128] Removes uncompiled flightsuit code leftovers and bad hooks. --- code/__DEFINES/dcs/signals.dm | 1 + code/game/objects/objs.dm | 3 - .../modules/clothing/spacesuits/flightsuit.dm | 1120 ----------------- code/modules/mob/mob_defines.dm | 2 - code/modules/mob/mob_movement.dm | 5 +- .../modules/clothing/spacesuits/flightsuit.dm | 9 - 6 files changed, 3 insertions(+), 1137 deletions(-) delete mode 100644 code/modules/clothing/spacesuits/flightsuit.dm delete mode 100644 modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 3d76390ce1..0805a10869 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -185,6 +185,7 @@ #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () #define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) #define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) +#define COMSIG_MOB_CLIENT_MOVE "comsig_mob_client_move" //sent when client/Move() finishes with no early returns: (client, direction, n, oldloc) #define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) #define COMSIG_LIVING_COMBAT_ENABLED "combatmode_enabled" //from base of mob/living/enable_combat_mode() (was_forced) #define COMSIG_LIVING_COMBAT_DISABLED "combatmode_disabled" //from base of mob/living/disable_combat_mode() (was_forced) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index c92bbdc996..4eaa0b4e0a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -211,9 +211,6 @@ /obj/proc/check_uplink_validity() return 1 -/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc) - return - /obj/vv_get_dropdown() . = ..() .["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]" diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm deleted file mode 100644 index 89644667d0..0000000000 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ /dev/null @@ -1,1120 +0,0 @@ - -#define FLIGHTPACK_SPRITE_ON_APPEND "_on" -#define FLIGHTPACK_SPRITE_BOOST_APPEND "_boost" -#define FLIGHTPACK_SPRITE_OFF_APPEND "_off" -#define FLIGHTPACK_SPRITE_BASE "flightpack" - -//So how this is planned to work is it is an item that allows you to fly with some interesting movement mechanics. -//You will still move instantly like usual, but when you move in a direction you gain "momentum" towards that direction -//Momentum will have a maximum value that it will be capped to, and will go down over time -//There is toggleable "stabilizers" that will make momentum go down FAST instead of its normal slow rate -//The suit is heavy and will slow you down on the ground but is a bit faster then usual in air -//The speed at which you drift is determined by your current momentum -//Also, I should probably add in some kind of limiting mechanic but I really don't like having to refill this all the time, expecially as it will be NODROP_1. -//Apparently due to code limitations you have to detect mob movement with.. shoes. -//The object that handles the flying itself - FLIGHT PACK -------------------------------------------------------------------------------------- -/obj/item/flightpack - name = "flight pack" - desc = "An advanced back-worn system that has dual ion engines powerful enough to grant a humanoid flight. Contains an internal self-recharging high-current capacitor for short, powerful boosts." - icon = 'icons/obj/device.dmi' - icon_state = FLIGHTPACK_SPRITE_BASE - item_state = FLIGHTPACK_SPRITE_BASE - actions_types = list(/datum/action/item_action/flightpack/toggle_flight, /datum/action/item_action/flightpack/engage_boosters, /datum/action/item_action/flightpack/toggle_stabilizers, /datum/action/item_action/flightpack/change_power, /datum/action/item_action/flightpack/toggle_airbrake) - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 75) - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - resistance_flags = FIRE_PROOF - - var/processing_mode = FLIGHTSUIT_PROCESSING_FULL - var/obj/item/clothing/suit/space/hardsuit/flightsuit/suit = null - var/mob/living/carbon/human/wearer = null - var/slowdown_ground = 1 - var/slowdown_air = 0 - var/slowdown_brake = TRUE - var/flight = FALSE - var/flight_passflags = PASSTABLE - var/powersetting = 1 - var/powersetting_high = 3 - var/powersetting_low = 1 - var/override_safe = FALSE - - var/boost = FALSE - var/boost_maxcharge = 30 //Vroom! If you hit someone while boosting they'll likely be knocked flying. Fun. - var/boost_charge = 30 - var/boost_speed = 2 - var/boost_power = 50 - var/boost_chargerate = 0.3 - var/boost_drain = 6 //Keep in mind it charges and drains at the same time, so drain realistically is drain-charge=change - - var/momentum_x = 0 //Realistic physics. No more "Instant stopping while barreling down a hallway at Mach 1". - var/momentum_y = 0 - var/momentum_max = 500 - var/momentum_impact_coeff = 0.5 //At this speed you'll start coliding with people resulting in momentum loss and them being knocked back, but no injuries or knockdowns - var/momentum_impact_loss = 50 - var/momentum_crash_coeff = 0.8 //At this speed if you hit a dense object, you will careen out of control, while that object will be knocked flying. - var/momentum_drift_coeff = 0.04 - var/momentum_speed = 0 //How fast we are drifting around - var/momentum_speed_x = 0 - var/momentum_speed_y = 0 - var/momentum_passive_loss = 4 - var/momentum_gain = 20 - var/drift_tolerance = 2 - - var/stabilizer = TRUE - var/stabilizer_decay_amount = 11 - var/gravity = TRUE - var/gravity_decay_amount = 3 - var/pressure = TRUE - var/pressure_decay_amount = 3 - var/pressure_threshold = 30 - var/brake = FALSE - var/airbrake_decay_amount = 30 - - var/resync = FALSE //Used to resync the flight-suit every 30 seconds or so. - - var/disabled = FALSE //Whether it is disabled from crashes/emps/whatever - var/emp_disable_message = FALSE - - //This is probably too much code just for EMP damage. - var/emp_damage = 0 //One hit should make it hard to control, continuous hits will cripple it and then simply shut it off/make it crash. Direct hits count more. - var/emp_strong_damage = 4 - var/emp_weak_damage = 2.5 - var/emp_heal_amount = 0.06 //How much emp damage to heal per process. - var/emp_disable_threshold = 3 //3 weak ion, 2 strong ion hits. - var/emp_disabled = FALSE - - var/requires_suit = TRUE - - var/datum/effect_system/trail_follow/ion/flight/ion_trail - - var/assembled = FALSE - var/obj/item/stock_parts/manipulator/part_manip = null - var/obj/item/stock_parts/scanning_module/part_scan = null - var/obj/item/stock_parts/capacitor/part_cap = null - var/obj/item/stock_parts/micro_laser/part_laser = null - var/obj/item/stock_parts/matter_bin/part_bin = null - - var/crashing = FALSE //Are we currently getting wrecked? - - var/atom/movable/cached_pull //recipe for disaster again. - var/afterForceMove = FALSE - var/datum/component/mobhook - -/obj/item/flightpack/proc/changeWearer(mob/changeto) - if(wearer) - LAZYREMOVE(wearer.user_movement_hooks, src) - wearer = null - QDEL_NULL(mobhook) - cached_pull = null - if(istype(changeto)) - wearer = changeto - LAZYADD(wearer.user_movement_hooks, src) - cached_pull = changeto.pulling - mobhook = changeto.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED), CALLBACK(src, .proc/on_mob_move, changeto)) - -/obj/item/flightpack/Initialize() - ion_trail = new - ion_trail.set_up(src) - START_PROCESSING(SSflightpacks, src) - update_parts() - sync_processing(SSflightpacks) - update_icon() - ..() - -/obj/item/flightpack/full/Initialize() - part_manip = new /obj/item/stock_parts/manipulator/pico(src) - part_scan = new /obj/item/stock_parts/scanning_module/phasic(src) - part_cap = new /obj/item/stock_parts/capacitor/super(src) - part_laser = new /obj/item/stock_parts/micro_laser/ultra(src) - part_bin = new /obj/item/stock_parts/matter_bin/super(src) - ..() - -/obj/item/flightpack/proc/usermessage(message, span = "boldnotice", mob/mob_override = null) - var/mob/targ = wearer - if(ismob(loc)) - targ = loc - if(istype(mob_override)) - targ = mob_override - if(!istype(targ)) - return - to_chat(targ, "[icon2html(src, targ)]|[message]") - -/obj/item/flightpack/proc/sync_processing(datum/controller/subsystem/processing/flightpacks/FPS) - processing_mode = FPS.flightsuit_processing - if(processing_mode == FLIGHTSUIT_PROCESSING_NONE) - momentum_x = 0 - momentum_y = 0 - momentum_speed_x = 0 - momentum_speed_y = 0 - momentum_speed = 0 - boost_charge = 0 - boost = FALSE - update_slowdown() - -/obj/item/flightpack/proc/update_parts() - boost_chargerate = initial(boost_chargerate) - boost_drain = initial(boost_drain) - powersetting_high = initial(powersetting_high) - emp_disable_threshold = initial(emp_disable_threshold) - stabilizer_decay_amount = initial(stabilizer_decay_amount) - airbrake_decay_amount = initial(airbrake_decay_amount) - assembled = FALSE //Ready? - if(part_manip && part_scan && part_cap && part_laser && part_bin) - var/manip = part_manip.rating - var/scan = part_scan.rating - var/cap = part_cap.rating - var/laser = part_laser.rating - var/bin = part_bin.rating - assembled = TRUE - boost_chargerate *= cap - boost_drain -= manip - powersetting_high = CLAMP(laser, 0, 3) - emp_disable_threshold = bin*1.25 - stabilizer_decay_amount = scan*3.5 - airbrake_decay_amount = manip*8 - -/obj/item/flightpack/Destroy() - if(suit) - delink_suit() - changeWearer() - disable_flight(TRUE) - QDEL_NULL(part_manip) - QDEL_NULL(part_scan) - QDEL_NULL(part_cap) - QDEL_NULL(part_laser) - QDEL_NULL(part_bin) - QDEL_NULL(ion_trail) - QDEL_NULL(mobhook) - STOP_PROCESSING(SSflightpacks, src) - . = ..() - -/obj/item/flightpack/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - var/damage = severity == 1 ? emp_strong_damage : emp_weak_damage - if(emp_damage <= (emp_disable_threshold * 1.5)) - emp_damage += damage - usermessage("WARNING: Class [severity] EMP detected! Circuit damage at [(emp_damage/emp_disable_threshold)*100]%!", "boldwarning") - -//Proc to change amount of momentum the wearer has, or dampen all momentum by a certain amount. -/obj/item/flightpack/proc/adjust_momentum(amountx, amounty, reduce_amount_total = 0) - if(reduce_amount_total != 0) - if(momentum_x > 0) - momentum_x = CLAMP(momentum_x - reduce_amount_total, 0, momentum_max) - else if(momentum_x < 0) - momentum_x = CLAMP(momentum_x + reduce_amount_total, -momentum_max, 0) - if(momentum_y > 0) - momentum_y = CLAMP(momentum_y - reduce_amount_total, 0, momentum_max) - else if(momentum_y < 0) - momentum_y = CLAMP(momentum_y + reduce_amount_total, -momentum_max, 0) - momentum_x = CLAMP(momentum_x + amountx, -momentum_max, momentum_max) - momentum_y = CLAMP(momentum_y + amounty, -momentum_max, momentum_max) - calculate_momentum_speed() - -//The wearer has momentum left. Move them and take some away, while negating the momentum that moving the wearer would gain. Or force the wearer to lose control if they are incapacitated. -/obj/item/flightpack/proc/momentum_drift() - if(!flight || !wearer || (momentum_speed == 0)) - return FALSE - else if(!wearer.canmove) - losecontrol() - var/drift_dir_x = 0 - var/drift_dir_y = 0 - if(momentum_x > 0) - drift_dir_x = EAST - else if(momentum_x < 0) - drift_dir_x = WEST - if(momentum_y > 0) - drift_dir_y = NORTH - else if(momentum_y < 0) - drift_dir_y = SOUTH - momentum_decay() - for(var/i in 1 to momentum_speed) - if(momentum_speed_x >= i) - step(wearer, drift_dir_x) - if(momentum_speed_y >= i) - step(wearer, drift_dir_y) - sleep(1) - if(prob(emp_damage * 15)) - step(wearer, pick(GLOB.alldirs)) - -/obj/item/flightpack/proc/on_mob_move(mob/mob, turf/oldLoc, dir, forced) - if(forced) - if(cached_pull && istype(oldLoc) && (get_dist(oldLoc, loc) <= 1) && !oldLoc.density) - cached_pull.forceMove(oldLoc) - mob.start_pulling(cached_pull, TRUE) - afterForceMove = TRUE - else - cached_pull = null - else - if(afterForceMove && !oldLoc.density) - cached_pull.forceMove(oldLoc) - wearer.start_pulling(cached_pull, TRUE) - cached_pull = null - else - cached_pull = wearer.pulling - afterForceMove = FALSE - if(flight) - ion_trail.generate_effect() - -/obj/item/flightpack/intercept_user_move(dir, mob, newLoc, oldLoc) - if(!flight) - return - var/momentum_increment = momentum_gain - if(boost) - momentum_increment = boost_power - if(brake) - momentum_increment = 0 - if(!gravity && !pressure) - momentum_increment -= 10 - switch(dir) - if(NORTH) - adjust_momentum(0, momentum_increment) - if(SOUTH) - adjust_momentum(0, -momentum_increment) - if(EAST) - adjust_momentum(momentum_increment, 0) - if(WEST) - adjust_momentum(-momentum_increment, 0) - -//Make the wearer lose some momentum. -/obj/item/flightpack/proc/momentum_decay() - var/amt = momentum_passive_loss - brake? (amt += airbrake_decay_amount) : 0 - gravity? (amt += gravity_decay_amount) : 0 - stabilizer? (amt += stabilizer_decay_amount) : 0 - pressure? (amt += pressure_decay_amount) : 0 - adjust_momentum(0, 0, amt) - -//Check for gravity, air pressure, and whether this is still linked to a suit. Also, resync the flightpack/flight suit every minute. -/obj/item/flightpack/proc/check_conditions() - if(flight && (!assembled || !wearer || (!suit && requires_suit))) - disable_flight(TRUE) - var/turf/T = get_turf(src) - if(T) - gravity = has_gravity() - var/datum/gas_mixture/gas = T.return_air() - var/envpressure = gas.return_pressure() - pressure = envpressure >= pressure_threshold - if(!pressure && brake) - brake = FALSE - usermessage("Airbrakes deactivated due to lack of pressure!", "boldwarning") - if(suit && !suit.deployedshoes && (brake || stabilizer)) - brake = FALSE - stabilizer = FALSE - usermessage("Warning: Sensor data is not being received from flight shoes. Stabilizers and airbrake modules deactivated!", "boldwarning") - - -/obj/item/flightpack/process() - if(processing_mode == FLIGHTSUIT_PROCESSING_NONE) - return FALSE - check_conditions() - calculate_momentum_speed() - momentum_drift() - handle_boost() - handle_damage() - -/obj/item/flightpack/proc/update_slowdown() - flight? (slowdown = slowdown_air) : (slowdown = slowdown_ground) - -/obj/item/flightpack/proc/handle_damage() - if(emp_damage) - emp_damage = CLAMP(emp_damage-emp_heal_amount, 0, emp_disable_threshold * 10) - if(emp_damage >= emp_disable_threshold) - emp_disabled = TRUE - if(emp_disabled && (emp_damage <= 0.5)) - emp_disabled = FALSE - emp_disable_message = FALSE - usermessage("Electromagnetic deflection system re-activated. Flight systems re-enabled.") - disabled = emp_disabled - if(disabled) - if(emp_disabled && (!emp_disable_message)) - usermessage("Electromagnetic deflectors overloaded. Short circuit detected in internal systems!", "boldwarning") - usermessage("Deactivating to prevent fatal power overload!", "boldwarning") - emp_disable_message = TRUE - if(flight) - disable_flight(TRUE) - -/obj/item/flightpack/update_icon() - if(!flight) - icon_state = "[FLIGHTPACK_SPRITE_BASE][FLIGHTPACK_SPRITE_OFF_APPEND]" - item_state = "[FLIGHTPACK_SPRITE_BASE][FLIGHTPACK_SPRITE_OFF_APPEND]" - if(flight) - if(!boost) - icon_state = "[FLIGHTPACK_SPRITE_BASE][FLIGHTPACK_SPRITE_ON_APPEND]" - item_state = "[FLIGHTPACK_SPRITE_BASE][FLIGHTPACK_SPRITE_ON_APPEND]" - else - icon_state = "[FLIGHTPACK_SPRITE_BASE][FLIGHTPACK_SPRITE_BOOST_APPEND]" - item_state = "[FLIGHTPACK_SPRITE_BASE][FLIGHTPACK_SPRITE_BOOST_APPEND]" - if(wearer) - wearer.update_inv_wear_suit() - wearer.update_inv_back() - -/obj/item/flightpack/proc/handle_boost() - if(boost) - boost_charge = CLAMP(boost_charge-boost_drain, 0, boost_maxcharge) - if(boost_charge < 1) - deactivate_booster() - if(boost_charge < boost_maxcharge) - boost_charge = CLAMP(boost_charge+boost_chargerate, 0, boost_maxcharge) - -/obj/item/flightpack/proc/cycle_power() - powersetting < powersetting_high? (powersetting++) : (powersetting = 1) - momentum_gain = powersetting * 10 - usermessage("Engine output set to [momentum_gain].") - momentum_drift_coeff = ((momentum_gain)*(drift_tolerance*1.1))/momentum_max - -/obj/item/flightpack/proc/crash_damage(density, anchored, speed, victim_name) - var/crashmessagesrc = "[wearer] violently crashes into [victim_name], " - var/userdamage = 10 - stabilizer * 3 - part_bin.rating - part_scan.rating * part_manip.rating + anchored * 2 + boost * 2 + speed * 2 - if(userdamage > 0) - crashmessagesrc += "that really must have hurt!" - wearer.adjustBruteLoss(userdamage) - else - crashmessagesrc += "but luckily [wearer]'s impact was absorbed by [wearer.p_their()] suit's stabilizers!" - wearer.visible_message(crashmessagesrc) - -/obj/item/flightpack/proc/userknockback(density, anchored, speed, dir) - dir = turn(dir, 180) - var/turf/target = get_edge_target_turf(get_turf(wearer), dir) - wearer.visible_message("[wearer] is knocked flying by the impact!") - wearer.throw_at(target, speed * 2 + density * 2 + anchored * 2, 2, wearer) - -/obj/item/flightpack/proc/flight_impact(atom/impacted_atom, crashdir) //Yes, victim. - if(!flight || (impacted_atom == wearer) || crashing || (processing_mode == FLIGHTSUIT_PROCESSING_NONE)) - return FALSE - crashing = TRUE - var/crashpower = 0 - if(crashdir == NORTH || crashdir == SOUTH) - crashpower = momentum_speed_y - else if(crashdir == EAST || crashdir == WEST) - crashpower = momentum_speed_x - if(boost) - crashpower = 3 - if(!crashpower) - crashing = FALSE - return FALSE - var/density = FALSE - var/anchored = TRUE //Just in case... - var/damage = FALSE - if(istype(impacted_atom, /obj/structure/grille) && (crashpower > 1)) - crash_grille(impacted_atom) - else if((istype(impacted_atom, /obj/machinery/door)) && (!istype(impacted_atom, /obj/machinery/door/poddoor))) - var/obj/machinery/door/D = impacted_atom - if(!airlock_pass(D) && (momentum_speed >= 3)) - damage = TRUE - anchored = TRUE - density = FALSE - else if(istype(impacted_atom, /obj/structure/mineral_door)) - door_pass(impacted_atom) - else if(isclosedturf(impacted_atom) && (crashpower >= 3)) - damage = TRUE - density = TRUE - anchored = TRUE - else if(ismovableatom(impacted_atom)) - var/atom/movable/impacted_AM = impacted_atom - if(!impacted_AM.throwing && (crashpower >= 3)) - density = impacted_AM.density - anchored = impacted_AM.anchored - damage = anchored - atom_impact(impacted_AM, crashpower, crashdir) - if(damage) - crash_damage(density, anchored, momentum_speed, impacted_atom.name) - userknockback(density, anchored, momentum_speed, crashdir) - losecontrol(knockdown = FALSE, move = FALSE) - crashing = FALSE - -/obj/item/flightpack/proc/door_pass(obj/structure/mineral_door/door) - INVOKE_ASYNC(door, /obj/structure/mineral_door.proc/Open) - var/turf/T = get_turf(door) - wearer.forceMove(T) - wearer.visible_message("[wearer] rolls to [wearer.p_their()] sides and slips past [door]!") - -/obj/item/flightpack/proc/crash_grille(obj/structure/grille/target) - target.hitby(wearer) - target.take_damage(60, BRUTE, "melee", 1) - if(wearer.Move(target.loc)) - wearer.visible_message("[wearer] smashes straight past [target]!") - -/obj/item/flightpack/proc/airlock_pass(obj/machinery/door/A) - var/nopass = FALSE - if(!A.density) - return TRUE - nopass = (A.locked || A.stat || (A.obj_flags & EMAGGED) || A.welded) - if(A.requiresID()) - if((!A.allowed(wearer)) && !A.emergency) - nopass = TRUE - if(!nopass) - INVOKE_ASYNC(A, /obj/machinery/door.proc/open) - wearer.visible_message("[wearer] rolls sideways and slips past [A]") - var/turf/target = get_turf(A) - if(istype(A, /obj/machinery/door/window) && (get_turf(wearer) == get_turf(A))) - target = get_step(A, A.dir) - wearer.forceMove(target) - return !nopass - -/obj/item/flightpack/proc/atom_impact(atom/movable/victim, power, direction) - if(!victim) - return FALSE - if(!victim.anchored) - var/knockback = (power + ((part_manip.rating + part_bin.rating) / 2) - (victim.density * 2)) * 2 - victim.visible_message("[victim.name] is sent flying by the impact!") - var/turf/target = get_turf(victim) - for(var/i in 1 to knockback) - target = get_step(target, direction) - for(var/i in 1 to knockback/3) - target = get_step(target, pick(GLOB.alldirs)) - victim.throw_at(target, knockback, part_manip.rating) - if(isobj(victim)) - var/obj/O = victim - O.take_damage(power * 14) - -/obj/item/flightpack/proc/losecontrol(knockdown = FALSE, move = TRUE) - usermessage("Warning: Control system not responding. Deactivating!", "boldwarning") - if(wearer) - wearer.visible_message("[wearer]'s flight suit abruptly shuts off and [wearer.p_they()] lose[wearer.p_s()] control!") - if(move) - while(momentum_x != 0 || momentum_y != 0) - sleep(2) - step(wearer, pick(GLOB.cardinals)) - momentum_decay() - adjust_momentum(0, 0, 10) - wearer.visible_message("[wearer]'s flight suit crashes into the ground!") - if(knockdown) - wearer.DefaultCombatKnockdown(80) - momentum_x = 0 - momentum_y = 0 - calculate_momentum_speed() - if(flight) - disable_flight(FALSE) - -/obj/item/flightpack/proc/enable_flight(forced = FALSE) - if(!forced) - if(disabled) - usermessage("Internal systems recalibrating. Unable to safely proceed.", "boldwarning") - return FALSE - if(suit) - if(suit.shoes) - suit.shoes.toggle(TRUE) - else if(!requires_suit) - usermessage("Warning: Flightpack not linked to compatible flight-suit mount!", "boldwarning") - return FALSE - wearer.movement_type |= FLYING - wearer.pass_flags |= flight_passflags - usermessage("ENGAGING FLIGHT ENGINES.") - wearer.visible_message("[wearer]'s flight engines activate as [wearer.p_they()] lift[wearer.p_s()] into the air!") - flight = TRUE - update_slowdown() - update_icon() - ion_trail.start() - -/obj/item/flightpack/proc/disable_flight(forced = FALSE) - if(forced) - losecontrol(knockdown = TRUE) - return TRUE - calculate_momentum_speed() - if(momentum_speed == 0) - momentum_x = 0 - momentum_y = 0 - calculate_momentum_speed() - usermessage("DISENGAGING FLIGHT ENGINES.") - wearer.visible_message("[wearer] drops to the ground as [wearer.p_their()] flight engines cut out!") - wearer.movement_type &= ~FLYING - wearer.pass_flags &= ~flight_passflags - flight = FALSE - update_slowdown() - update_icon() - ion_trail.stop() - if(suit && suit.shoes) - suit.shoes.toggle(FALSE) - if(isturf(wearer.loc)) - var/turf/T = wearer.loc - T.Entered(src) - else - if(override_safe) - disable_flight(TRUE) - return TRUE - usermessage("Warning: Velocity too high to safely disengage. Retry to confirm emergency shutoff.", "boldwarning") - override_safe = TRUE - addtimer(CALLBACK(src, .proc/enable_safe), 50) - return FALSE - -/obj/item/flightpack/proc/enable_safe() - if(override_safe) - override_safe = FALSE - -/obj/item/flightpack/dropped(mob/wearer) - changeWearer() - ..() - -/obj/item/flightpack/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == ITEM_SLOT_BACK) - return TRUE - -/obj/item/flightpack/equipped(mob/user, slot) - changeWearer(user) - ..() - -/obj/item/flightpack/proc/calculate_momentum_speed() - if(abs(momentum_x) >= (momentum_crash_coeff*momentum_max)) //Calculate X - momentum_speed_x = 3 - else if(abs(momentum_x) >= (momentum_impact_coeff*momentum_max)) - momentum_speed_x = 2 - else if(abs(momentum_x) >= (momentum_drift_coeff*momentum_max)) - momentum_speed_x = 1 - else - momentum_speed_x = 0 - if(abs(momentum_y) >= (momentum_crash_coeff*momentum_max)) //Calculate Y - momentum_speed_y = 3 - else if(abs(momentum_y) >= (momentum_impact_coeff*momentum_max)) - momentum_speed_y = 2 - else if(abs(momentum_y) >= (momentum_drift_coeff*momentum_max)) - momentum_speed_y = 1 - else - momentum_speed_y = 0 - momentum_speed = max(momentum_speed_x, momentum_speed_y) - -/obj/item/flightpack/item_action_slot_check(slot, mob/user, datum/action/A) - return slot == SLOT_BACK - -/obj/item/flightpack/proc/enable_stabilizers() - if(requires_suit && suit && !suit.deployedshoes) - usermessage("Stabilizers requires flight shoes to be attached and deployed!", "boldwarning") - return FALSE - usermessage("Activating automatic stabilization controller and enabling maneuvering assistance.") - stabilizer = TRUE - return TRUE - -/obj/item/flightpack/proc/disable_stabilizers() - if(wearer) - if(brake) - disable_airbrake() - usermessage("Deactivating stabilization controllers!", "boldwarning") - stabilizer = FALSE - -/obj/item/flightpack/proc/activate_booster() - if(!flight) - usermessage("Error: Engines offline!", "boldwarning") - return FALSE - if(boost_charge < 5) - usermessage("Insufficient charge in boost capacitors to engage.", "boldwarning") - return FALSE - usermessage("Boosters engaged!") - boost = TRUE - update_slowdown() - update_icon() - -/obj/item/flightpack/proc/deactivate_booster() - usermessage("Boosters disengaged!") - boost = FALSE - update_slowdown() - update_icon() - -/obj/item/flightpack/proc/enable_airbrake() - if(wearer) - if(!stabilizer && !enable_stabilizers()) - usermessage("Airbrake deployment: Stabilizer Errored.", "boldwarning") - return FALSE - usermessage("Airbrakes extended!") - brake = TRUE - update_slowdown() - -/obj/item/flightpack/proc/disable_airbrake() - if(wearer) - usermessage("Airbrakes retracted!", "boldwarning") - brake = FALSE - update_slowdown() - -/obj/item/flightpack/proc/relink_suit(obj/item/clothing/suit/space/hardsuit/flightsuit/F) - if(suit && suit == F) - return FALSE - else - delink_suit() - if(istype(F)) - suit = F - suit.pack = src - else - suit = null - -/obj/item/flightpack/proc/delink_suit() - if(suit) - if(suit.pack && suit.pack == src) - suit.pack = null - suit = null - -/obj/item/flightpack/attackby(obj/item/I, mob/user, params) - var/const/SuccessMessage = " has been successfully installed into systems." - var/changed = FALSE - if(istype(I, /obj/item/stock_parts)) - var/obj/item/stock_parts/S = I - if(istype(S, /obj/item/stock_parts/manipulator)) - usermessage("[I][SuccessMessage]", mob_override = user) - if(user.transferItemToLoc(I, src)) - if(part_manip) - part_manip.forceMove(get_turf(src)) - part_manip = I - changed = TRUE - if(istype(S, /obj/item/stock_parts/scanning_module)) - usermessage("[I][SuccessMessage]", mob_override = user) - if(user.transferItemToLoc(I, src)) - if(part_scan) - part_scan.forceMove(get_turf(src)) - part_scan = I - changed = TRUE - if(istype(S, /obj/item/stock_parts/micro_laser)) - usermessage("[I][SuccessMessage]", mob_override = user) - if(user.transferItemToLoc(I, src)) - if(part_laser) - part_laser.forceMove(get_turf(src)) - part_laser = I - changed = TRUE - if(istype(S, /obj/item/stock_parts/matter_bin)) - usermessage("[I][SuccessMessage]", mob_override = user) - if(user.transferItemToLoc(I, src)) - if(part_bin) - part_bin.forceMove(get_turf(src)) - part_bin = I - changed = TRUE - if(istype(S, /obj/item/stock_parts/capacitor)) - usermessage("[I][SuccessMessage]", mob_override = user) - if(user.transferItemToLoc(I, src)) - if(part_cap) - part_cap.forceMove(get_turf(src)) - part_cap = I - changed = TRUE - if(changed) - update_parts() - ..() - -//MOB MOVEMENT STUFF---------------------------------------------------------------------------------------------------------------------------------------------- - -/mob/proc/get_flightpack() - return - -/mob/living/carbon/get_flightpack() - var/obj/item/flightpack/F = back - if(istype(F)) - return F - else - return FALSE - -/obj/item/flightpack/proc/allow_thrust(amount) - if(flight) - return TRUE - -//FLIGHT SHOES----------------------------------------------------------------------------------------------------------------------------------------------------- - -/obj/item/clothing/shoes/flightshoes - name = "flight shoes" - desc = "A pair of specialized boots that contain stabilizers and sensors necessary for flight gear to work." //Apparently you need these to detect mob movement. - icon_state = "flightshoes" - item_state = "flightshoes_mob" - var/obj/item/clothing/suit/space/hardsuit/flightsuit/suit = null - var/obj/item/flightpack/pack = null - var/mob/living/carbon/human/wearer = null - var/active = FALSE - permeability_coefficient = 0.01 - resistance_flags = FIRE_PROOF | ACID_PROOF - -/obj/item/clothing/shoes/flightshoes/Destroy() - pack = null - wearer = null - suit = null - . = ..() - -/obj/item/clothing/shoes/flightshoes/proc/toggle(toggle) - if(suit) - active = toggle - if(active) - clothing_flags |= NOSLIP - if(!active) - clothing_flags &= ~NOSLIP - -/obj/item/clothing/shoes/flightshoes/item_action_slot_check(slot, mob/user, datum/action/A) - return slot == SLOT_SHOES - -/obj/item/clothing/shoes/flightshoes/proc/delink_suit() - if(suit) - if(suit.shoes && suit.shoes == src) - suit.shoes = null - suit = null - -/obj/item/clothing/shoes/flightshoes/proc/relink_suit(obj/item/clothing/suit/space/hardsuit/flightsuit/F) - if(suit && suit == F) - return FALSE - else - delink_suit() - if(istype(F)) - suit = F - suit.shoes = src - else - suit = null - -//FLIGHT SUIT------------------------------------------------------------------------------------------------------------------------------------------------------ -//Flight pack and flight shoes/helmet are stored in here. This has to be locked to someone to use either. For both balance reasons and practical codewise reasons. - -/obj/item/clothing/suit/space/hardsuit/flightsuit - name = "flight suit" - desc = "An advanced suit that allows the wearer flight via two high powered miniature jet engines on a deployable back-mounted unit." - icon_state = "flightsuit" - item_state = "flightsuit" - strip_delay = 30 - w_class = WEIGHT_CLASS_BULKY - resistance_flags = FIRE_PROOF | ACID_PROOF - helmettype = /obj/item/clothing/head/helmet/space/hardsuit/flightsuit - jetpack = null - actions_types = list(/datum/action/item_action/flightsuit/toggle_helmet, /datum/action/item_action/flightsuit/toggle_boots, /datum/action/item_action/flightsuit/toggle_flightpack, /datum/action/item_action/flightsuit/lock_suit) - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 100) - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - var/locked_strip_delay = 80 - var/obj/item/flightpack/pack = null - var/obj/item/clothing/shoes/flightshoes/shoes = null - var/mob/living/carbon/human/user = null - var/deployedpack = FALSE - var/deployedshoes = FALSE - var/locked = FALSE - var/flightpack - var/flight = FALSE - var/maint_panel = FALSE - -/obj/item/clothing/suit/space/hardsuit/flightsuit/Initialize() - . = ..() - allowed = GLOB.advanced_hardsuit_allowed - -/obj/item/clothing/suit/space/hardsuit/flightsuit/full/Initialize() - makepack() - makeshoes() - resync() - return ..() - -/obj/item/clothing/suit/space/hardsuit/flightsuit/ui_action_click() - return //Handled in action datums. - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/usermessage(message, span = "boldnotice") - var/mob/targ = user - if(ismob(loc)) - targ = loc - if(!istype(targ)) - return - to_chat(targ, "[icon2html(src, targ)]|[message]") - -/obj/item/clothing/suit/space/hardsuit/flightsuit/examine(mob/user) - . = ..() - . += "SUIT: [locked ? "LOCKED" : "UNLOCKED"]" - . += "FLIGHTPACK: [deployedpack ? "ENGAGED" : "DISENGAGED"] FLIGHTSHOES : [deployedshoes ? "ENGAGED" : "DISENGAGED"] HELMET : [suittoggled ? "ENGAGED" : "DISENGAGED"]" - . += "Its maintainence panel is [maint_panel ? "OPEN" : "CLOSED"]" - -/obj/item/clothing/suit/space/hardsuit/flightsuit/Destroy() - if(ismob(loc)) - dropped(loc) - QDEL_NULL(pack) - QDEL_NULL(shoes) - return ..() - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/resync() - if(pack) - pack.relink_suit(src) - if(user) - if(pack) - pack.changeWearer(user) - if(shoes) - shoes.wearer = user - else - if(pack) - pack.changeWearer(null) - if(shoes) - shoes.wearer = null - if(shoes) - shoes.relink_suit(src) - -/obj/item/clothing/suit/space/hardsuit/flightsuit/allow_attack_hand_drop(user) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(src == H.wear_suit && locked) - usermessage("You can not take a locked hardsuit off! Unlock it first!", "boldwarning") - return FALSE - return ..() - -/obj/item/clothing/suit/space/hardsuit/flightsuit/dropped(mob/the_user) - if(deployedpack) - retract_flightpack(TRUE) - if(deployedshoes) - retract_flightshoes(TRUE) - if(locked) - unlock_suit(null) - if(user) - user = null - ..() - -/obj/item/clothing/suit/space/hardsuit/flightsuit/ToggleHelmet() - if(!suittoggled) - if(!locked) - usermessage("You must lock your suit before engaging the helmet!", "boldwarning") - return FALSE - ..() - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/lock_suit(mob/wearer) - user = wearer - user.visible_message("[wearer]'s flight suit locks around [wearer.p_them()], powered buckles and straps automatically adjusting to [wearer.p_their()] body!") - playsound(src.loc, 'sound/items/rped.ogg', 65, 1) - resync() - strip_delay = locked_strip_delay - locked = TRUE - return TRUE - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/unlock_suit(mob/wearer) - if(user) - if(suittoggled) - usermessage("You must retract the helmet before unlocking your suit!", "boldwarning") - return FALSE - if(pack && pack.flight) - usermessage("You must shut off the flight-pack before unlocking your suit!", "boldwarning") - return FALSE - if(deployedpack) - usermessage("Your flightpack must be fully retracted first!", "boldwarning") - return FALSE - if(deployedshoes) - usermessage("Your flight shoes must be fully retracted first!", "boldwarning") - return FALSE - if(wearer) - user.visible_message("[wearer]'s flight suit detaches from [wearer.p_their()] body, becoming nothing more then a bulky metal skeleton.") - playsound(src, 'sound/items/rped.ogg', 65, 1) - resync() - strip_delay = initial(strip_delay) - locked = FALSE - return TRUE - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/extend_flightpack(forced = FALSE) - if(!pack) - usermessage("There is no attached flightpack!", "boldwarning") - return FALSE - if(deployedpack) - retract_flightpack() - if(!locked) - usermessage("You must lock your flight suit first before deploying anything!", "boldwarning") - return FALSE - if(ishuman(user)) - if(user.back) - usermessage("You're already wearing something on your back!", "boldwarning") - return FALSE - user.equip_to_slot_if_possible(pack,SLOT_BACK,0,0,1) - ADD_TRAIT(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT) - resync() - user.visible_message("A [pack.name] extends from [user]'s [name] and clamps to [user.p_their()] back!") - user.update_inv_wear_suit() - playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) - deployedpack = TRUE - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightpack(forced = FALSE) - if(ishuman(user)) - if(pack.flight && !forced) - usermessage("You must disable the engines before retracting the flightpack!", "boldwarning") - return FALSE - if(pack.flight && forced) - pack.disable_flight(1) - REMOVE_TRAIT_FROM(pack, TRAIT_NODROP, FLIGHTSUIT_TRAIT) - resync() - if(user) - user.transferItemToLoc(pack, src, TRUE) - user.update_inv_wear_suit() - user.visible_message("[user]'s [pack.name] detaches from [user.p_their()] back and retracts into [user.p_their()] [src]!") - pack.forceMove(src) - playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) - deployedpack = FALSE - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/extend_flightshoes(forced = FALSE) - if(!shoes) - usermessage("Flight shoes are not installed", "boldwarning") - return FALSE - if(deployedshoes) - retract_flightshoes() - if(!locked) - usermessage("You must lock your flight suit first before deploying anything!", "boldwarning") - return FALSE - if(ishuman(user)) - if(user.shoes) - usermessage("You're already wearing something on your feet!", "boldwarning") - return FALSE - user.equip_to_slot_if_possible(shoes,SLOT_SHOES,0,0,1) - ADD_TRAIT(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT) - user.visible_message("[user]'s [name] extends a pair of [shoes.name] over [user.p_their()] feet!") - user.update_inv_wear_suit() - playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) - deployedshoes = TRUE - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/retract_flightshoes(forced = FALSE) - REMOVE_TRAIT_FROM(shoes, TRAIT_NODROP, FLIGHTSUIT_TRAIT) - playsound(src, 'sound/mecha/mechmove03.ogg', 50, 1) - if(user) - user.transferItemToLoc(shoes, src, TRUE) - user.update_inv_wear_suit() - user.visible_message("[user]'s [shoes.name] retracts back into [user.p_their()] [name]!") - shoes.forceMove(src) - deployedshoes = FALSE - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/makepack() - if(!pack) - pack = new /obj/item/flightpack/full(src) - pack.relink_suit(src) - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/makeshoes() - if(!shoes) - shoes = new /obj/item/clothing/shoes/flightshoes(src) - shoes.pack = pack - shoes.suit = src - -/obj/item/clothing/suit/space/hardsuit/flightsuit/equipped(mob/M, slot) - if(ishuman(M)) - user = M - if(slot != SLOT_WEAR_SUIT) - if(deployedpack) - retract_flightpack(TRUE) - if(deployedshoes) - retract_flightshoes(TRUE) - if(locked) - unlock_suit(user) - ..() - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/detach_pack() - pack.delink_suit() - pack.forceMove(get_turf(src)) - pack = null - usermessage("You detach the flightpack.") - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/attach_pack(obj/item/flightpack/F) - F.forceMove(src) - pack = F - pack.relink_suit(src) - usermessage("You attach and fasten the flightpack.") - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/detach_shoes() - shoes.delink_suit() - shoes.forceMove(get_turf(src)) - shoes = null - usermessage("You detach the flight shoes.") - -/obj/item/clothing/suit/space/hardsuit/flightsuit/proc/attach_shoes(obj/item/clothing/shoes/flightshoes/S) - S.forceMove(src) - shoes = S - shoes.relink_suit(src) - usermessage("You attach and fasten a pair of flight shoes.") - -/obj/item/clothing/suit/space/hardsuit/flightsuit/attackby(obj/item/I, mob/wearer, params) - user = wearer - if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) - usermessage("You can not perform any service without taking the suit off!", "boldwarning") - return FALSE - else if(locked) - usermessage("You can not perform any service while the suit is locked!", "boldwarning") - return FALSE - else if(istype(I, /obj/item/screwdriver)) - if(!maint_panel) - maint_panel = TRUE - else - maint_panel = FALSE - usermessage("You [maint_panel? "open" : "close"] the maintenance panel.") - return FALSE - else if(!maint_panel) - usermessage("The maintenance panel is closed!", "boldwarning") - return FALSE - else if(istype(I, /obj/item/crowbar)) - var/list/inputlist = list() - if(pack) - inputlist += "Pack" - if(shoes) - inputlist += "Shoes" - if(!inputlist.len) - usermessage("There is nothing inside the flightsuit to remove!", "boldwarning") - return FALSE - var/input = input(user, "What to remove?", "Removing module") as null|anything in list("Pack", "Shoes") - if(pack && input == "Pack") - if(pack.flight) - usermessage("You can not pry off an active flightpack!", "boldwarning") - return FALSE - if(deployedpack) - usermessage("Disengage the flightpack first!", "boldwarning") - return FALSE - detach_pack() - if(shoes && input == "Shoes") - if(deployedshoes) - usermessage("Disengage the shoes first!", "boldwarning") - return FALSE - detach_shoes() - return TRUE - else if(istype(I, /obj/item/flightpack)) - var/obj/item/flightpack/F = I - if(pack) - usermessage("[src] already has a flightpack installed!", "boldwarning") - return FALSE - if(!F.assembled) - var/addmsg = " It is missing a " - var/list/addmsglist = list() - if(!F.part_manip) - addmsglist += "manipulator" - if(!F.part_cap) - addmsglist += "capacitor" - if(!F.part_scan) - addmsglist += "scanning module" - if(!F.part_laser) - addmsglist += "micro-laser" - if(!F.part_bin) - addmsglist += "matter bin" - addmsg += english_list(addmsglist) - usermessage("The flightpack you are trying to install is not fully assembled and operational![addmsg].", "boldwarning") - return FALSE - if(user.temporarilyRemoveItemFromInventory(F)) - attach_pack(F) - return TRUE - else if(istype(I, /obj/item/clothing/shoes/flightshoes)) - var/obj/item/clothing/shoes/flightshoes/S = I - if(shoes) - usermessage("There are already shoes installed!", "boldwarning") - return FALSE - if(user.temporarilyRemoveItemFromInventory(S)) - attach_shoes(S) - return TRUE - . = ..() - -//FLIGHT HELMET---------------------------------------------------------------------------------------------------------------------------------------------------- -/obj/item/clothing/head/helmet/space/hardsuit/flightsuit - name = "flight helmet" - desc = "A sealed helmet attached to a flight suit for EVA usage scenarios. Its visor contains an information uplink HUD." - icon_state = "flighthelmet" - item_state = "flighthelmet" - item_color = "flight" - resistance_flags = FIRE_PROOF | ACID_PROOF - brightness_on = 7 - light_color = "#30ffff" - armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 10, "bomb" = 30, "bio" = 100, "rad" = 75, "fire" = 100, "acid" = 100) - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - var/list/datahuds = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_BASIC) - var/zoom_range = 12 - var/zoom = FALSE - actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/flightpack/zoom) - -/obj/item/clothing/head/helmet/space/hardsuit/flightsuit/equipped(mob/living/carbon/human/wearer, slot) - ..() - for(var/hudtype in datahuds) - var/datum/atom_hud/H = GLOB.huds[hudtype] - H.add_hud_to(wearer) - -/obj/item/clothing/head/helmet/space/hardsuit/flightsuit/dropped(mob/living/carbon/human/wearer) - ..() - if(wearer) - for(var/hudtype in datahuds) - var/datum/atom_hud/H = GLOB.huds[hudtype] - H.remove_hud_from(wearer) - if(zoom) - toggle_zoom(wearer, TRUE) - -/obj/item/clothing/head/helmet/space/hardsuit/flightsuit/proc/toggle_zoom(mob/living/user, force_off = FALSE) - if(zoom || force_off) - user.client.change_view(CONFIG_GET(string/default_view)) - to_chat(user, "Disabling smart zooming image enhancement...") - zoom = FALSE - return FALSE - else - user.client.change_view(zoom_range) - to_chat(user, "Enabling smart zooming image enhancement!") - zoom = TRUE - return TRUE diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index f638281f27..fc202b29ad 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -84,8 +84,6 @@ /// The last mob/living/carbon to push/drag/grab this mob (mostly used by slimes friend recognition) var/datum/weakref/LAssailant - var/list/obj/user_movement_hooks //Passes movement in client/Move() to these! - var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap. diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index bac8053c9a..4d9d15ae5c 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -100,13 +100,12 @@ if(mob.throwing) mob.throwing.finalize(FALSE) - for(var/obj/O in mob.user_movement_hooks) - O.intercept_user_move(direction, mob, n, oldloc) - var/atom/movable/P = mob.pulling if(P && !ismob(P) && P.density) mob.setDir(turn(mob.dir, 180)) + SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVE, src, direction, n, oldloc) + /// Process_Grab(): checks for grab, attempts to break if so. Return TRUE to prevent movement. /client/proc/Process_Grab() if(mob.pulledby) diff --git a/modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm b/modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm deleted file mode 100644 index 44bb1f3473..0000000000 --- a/modular_citadel/code/modules/clothing/spacesuits/flightsuit.dm +++ /dev/null @@ -1,9 +0,0 @@ - -/obj/item/flightpack - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 20, "acid" = 20) - -/obj/item/clothing/suit/space/hardsuit/flightsuit - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 20, "acid" = 20) - -/obj/item/clothing/head/helmet/space/hardsuit/flightsuit - armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 20, "fire" = 20, "acid" = 20) \ No newline at end of file From 82396c33cf68dbd300e357fb5f3666f65ac2e715 Mon Sep 17 00:00:00 2001 From: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com> Date: Tue, 24 Mar 2020 15:34:01 -0400 Subject: [PATCH 009/128] i made an oops (#11591) --- code/modules/clothing/masks/boxing.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index bfbd1d519b..f11c89d00c 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -24,6 +24,7 @@ w_class = WEIGHT_CLASS_SMALL armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 10, "fire" = 30, "acid" = 30) resistance_flags = FIRE_PROOF | ACID_PROOF + mutantrace_variation = STYLE_MUZZLE var/voice_unknown = TRUE ///This makes it so that your name shows up as unknown when wearing the mask. /obj/item/clothing/mask/luchador From 3fd418295e4a82741250c1373451057af33db473 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 24 Mar 2020 14:34:04 -0500 Subject: [PATCH 010/128] Automatic changelog generation for PR #11591 [ci skip] --- html/changelogs/AutoChangeLog-pr-11591.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11591.yml diff --git a/html/changelogs/AutoChangeLog-pr-11591.yml b/html/changelogs/AutoChangeLog-pr-11591.yml new file mode 100644 index 0000000000..f2c06035f1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11591.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - bugfix: "insidious balaclava muzzlepsprite works" From 62d1a1f734c021de21f7abc162e0e920bdfa8bf7 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 24 Mar 2020 19:39:46 +0000 Subject: [PATCH 011/128] cook now gets to choose their ingredient box + sushi ingredient box (#11590) * Update miscellaneous.dm * Update cook.dm * fixes some bugs * i broke something again and now fix it * fixes remote, edits ingredient box contents * even more wildcard items who doesn't love eggs, grapes and various kinds of human meat? (skeleton meat is a thing for some reason, and thus it goes. IN THE LIST.) * removes a random newline * adds a newline to the end of the file i accidentally removed * why was there a newline here too --- code/game/objects/items/miscellaneous.dm | 19 ++++++++-- code/game/objects/items/storage/boxes.dm | 46 +++++++++++++++++++++++- code/modules/jobs/job_types/cook.dm | 6 +--- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index a2145e67ee..c6bb350929 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -58,6 +58,21 @@ new /obj/effect/abstract/DPtarget(get_turf(src), pod) +/obj/item/choice_beacon/ingredients + name = "ingredient box delivery beacon" + desc = "Summon a box of ingredients from a wide selection!" + icon_state = "gangtool-red" + +/obj/item/choice_beacon/ingredients/generate_display_names() + var/static/list/ingredientboxes + if(!ingredientboxes) + ingredientboxes = list() + var/list/templist = typesof(/obj/item/storage/box/ingredients) + for(var/V in templist) + var/obj/item/storage/box/ingredients/A = V + ingredientboxes[initial(A.theme_name)] = A + return ingredientboxes + /obj/item/choice_beacon/hero name = "heroic beacon" desc = "To summon heroes from the past to protect the future." @@ -72,7 +87,6 @@ hero_item_list[initial(A.name)] = A return hero_item_list - /obj/item/storage/box/hero name = "Courageous Tomb Raider - 1940's." @@ -115,4 +129,5 @@ icon = 'icons/obj/supermatter.dmi' icon_state = "supermatterspray" w_class = WEIGHT_CLASS_SMALL - var/usesleft = 2 \ No newline at end of file + var/usesleft = 2 + diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 489704dbd5..a67757a535 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -946,12 +946,47 @@ /obj/item/reagent_containers/food/snacks/grown/apple, /obj/item/reagent_containers/food/snacks/chocolatebar, /obj/item/reagent_containers/food/snacks/grown/cherries, + /obj/item/reagent_containers/food/snacks/grown/berries, /obj/item/reagent_containers/food/snacks/grown/banana, /obj/item/reagent_containers/food/snacks/grown/cabbage, /obj/item/reagent_containers/food/snacks/grown/soybeans, /obj/item/reagent_containers/food/snacks/grown/corn, /obj/item/reagent_containers/food/snacks/grown/mushroom/plumphelmet, - /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle) + /obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle, + /obj/item/reagent_containers/food/snacks/faggot, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange, + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, + /obj/item/reagent_containers/food/snacks/grown/citrus/lime, + /obj/item/reagent_containers/food/snacks/grown/bluecherries, + /obj/item/reagent_containers/food/snacks/grown/cocoapod, + /obj/item/reagent_containers/food/snacks/grown/vanillapod, + /obj/item/reagent_containers/food/snacks/grown/grapes, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/whitebeet, + /obj/item/reagent_containers/food/snacks/meat/slab/bear, + /obj/item/reagent_containers/food/snacks/meat/slab/spider, + /obj/item/reagent_containers/food/snacks/spidereggs, + /obj/item/reagent_containers/food/snacks/carpmeat, + /obj/item/reagent_containers/food/snacks/meat/slab/xeno, + /obj/item/reagent_containers/food/snacks/meat/slab/corgi, + /obj/item/reagent_containers/food/snacks/grown/oat, + /obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/honeycomb, + /obj/item/reagent_containers/food/snacks/grown/watermelon, + /obj/item/reagent_containers/food/snacks/grown/onion, + /obj/item/reagent_containers/food/snacks/grown/peach, + /obj/item/reagent_containers/food/snacks/grown/peanut, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pumpkin, + /obj/item/reagent_containers/food/snacks/meat/rawcrab, + /obj/item/reagent_containers/food/snacks/meat/slab/goliath, + /obj/item/reagent_containers/food/snacks/meat/slab/chicken, + /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime, + /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/golem, + /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard, + /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton, + /obj/item/reagent_containers/food/snacks/egg, + /obj/item/reagent_containers/food/snacks/grown/eggplant) new randomFood(src) /obj/item/storage/box/ingredients/fiesta @@ -1061,6 +1096,15 @@ new /obj/item/reagent_containers/food/snacks/grown/cabbage(src) new /obj/item/reagent_containers/food/snacks/grown/chili(src) +/obj/item/storage/box/ingredients/sushi + theme_name = "sushi" + +/obj/item/storage/box/ingredients/sushi/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/reagent_containers/food/snacks/sea_weed(src) + new /obj/item/reagent_containers/food/snacks/carpmeat(src) + new /obj/item/reagent_containers/food/snacks/meat/rawcrab(src) + /obj/item/storage/box/emptysandbags name = "box of empty sandbags" diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index db76af4d32..b41c0d8505 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -27,7 +27,7 @@ suit = /obj/item/clothing/suit/toggle/chef head = /obj/item/clothing/head/chefhat mask = /obj/item/clothing/mask/fakemoustache/italian - backpack_contents = list(/obj/item/sharpener = 1) + backpack_contents = list(/obj/item/sharpener = 1, /obj/item/choice_beacon/ingredients = 1) /datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) ..() @@ -43,10 +43,6 @@ ..() if(visualsOnly) return - var/list/possible_boxes = subtypesof(/obj/item/storage/box/ingredients) - var/chosen_box = pick(possible_boxes) - var/obj/item/storage/box/I = new chosen_box(src) - H.equip_to_slot_or_del(I,SLOT_IN_BACKPACK) var/datum/martial_art/cqc/under_siege/justacook = new justacook.teach(H) From 60a88beb70e4ad09c647172abbad5fc9e0853200 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 24 Mar 2020 14:39:49 -0500 Subject: [PATCH 012/128] Automatic changelog generation for PR #11590 [ci skip] --- html/changelogs/AutoChangeLog-pr-11590.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11590.yml diff --git a/html/changelogs/AutoChangeLog-pr-11590.yml b/html/changelogs/AutoChangeLog-pr-11590.yml new file mode 100644 index 0000000000..e8241cb0ec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11590.yml @@ -0,0 +1,6 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "added beacon for cooks to choose an ingredient box, which replaces the random box they used to receive" + - rscadd: "added a new sushi ingredients box" + - rscadd: "added more items to the wildcard box's possible contents" From ed5a4a0528b83122587a4706eae7e7ddd72f2921 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 24 Mar 2020 20:46:30 +0100 Subject: [PATCH 013/128] damnit. --- tgstation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index ee01a18d6a..fb82a38385 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3257,7 +3257,6 @@ #include "modular_citadel\code\modules\client\verbs\who.dm" #include "modular_citadel\code\modules\clothing\neck.dm" #include "modular_citadel\code\modules\clothing\trek.dm" -#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" #include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" #include "modular_citadel\code\modules\clothing\suits\suits.dm" #include "modular_citadel\code\modules\custom_loadout\custom_items.dm" From 0efa6fd065b0367816fce73e3cbb21d5dbedbb7a Mon Sep 17 00:00:00 2001 From: Kraseo Date: Tue, 24 Mar 2020 20:58:41 +0100 Subject: [PATCH 014/128] gimme chokies uwu (#11601) --- code/modules/mob/living/living.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1309fae60c..103e8164f9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -702,8 +702,8 @@ /mob/living/do_resist_grab(moving_resist, forced, silent = FALSE) . = ..() - if(pulledby.grab_state) - if(CHECK_MOBILITY(src, MOBILITY_STAND) && prob(30/pulledby.grab_state)) + if(pulledby.grab_state > GRAB_PASSIVE) + if(CHECK_MOBILITY(src, MOBILITY_RESIST) && prob(30/pulledby.grab_state)) visible_message("[src] has broken free of [pulledby]'s grip!") pulledby.stop_pulling() return TRUE From 8434670d2124f66fd098fadddfa2269cbf608821 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 24 Mar 2020 14:58:44 -0500 Subject: [PATCH 015/128] Automatic changelog generation for PR #11601 [ci skip] --- html/changelogs/AutoChangeLog-pr-11601.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11601.yml diff --git a/html/changelogs/AutoChangeLog-pr-11601.yml b/html/changelogs/AutoChangeLog-pr-11601.yml new file mode 100644 index 0000000000..d327045d12 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11601.yml @@ -0,0 +1,4 @@ +author: "Kraseo" +delete-after: True +changes: + - bugfix: "You can break out of neckgrabs once more." From 134d861fd7c9b077ff5962de7627880da06bbe31 Mon Sep 17 00:00:00 2001 From: KathrinBailey Date: Tue, 24 Mar 2020 20:13:48 +0000 Subject: [PATCH 016/128] KAT SHUTTERS ALL OF THE STUFF Checked: Animations timings, the buttons in-game (they open and close), the radiation insulation (rad shutters don't block rads once open but do once closed, 0.2x multiplier to rads). Animations all play and the shutters actually open and close. --- code/game/machinery/doors/shutters.dm | 56 ++++++++++++++++++++++++- icons/obj/doors/shutters.dmi | Bin 2616 -> 1660 bytes icons/obj/doors/shutters_old.dmi | Bin 0 -> 1224 bytes icons/obj/doors/shutters_radiation.dmi | Bin 0 -> 1477 bytes icons/obj/doors/shutters_window.dmi | Bin 0 -> 4957 bytes 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 icons/obj/doors/shutters_old.dmi create mode 100644 icons/obj/doors/shutters_radiation.dmi create mode 100644 icons/obj/doors/shutters_window.dmi diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index bd58649b97..9df7bffafd 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -1,13 +1,67 @@ /obj/machinery/door/poddoor/shutters gender = PLURAL name = "shutters" - desc = "Heavy duty metal shutters that open mechanically." + desc = "Mechanical metal shutters operated by a button with a magnetic seal, keeping them airtight." icon = 'icons/obj/doors/shutters.dmi' layer = SHUTTER_LAYER closingLayer = SHUTTER_LAYER + armor = list("melee" = 20, "bullet" = 20, "laser" = 20, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) damage_deflection = 20 + max_integrity = 100 /obj/machinery/door/poddoor/shutters/preopen icon_state = "open" density = FALSE opacity = 0 + +// The below shutters are the original ones from the TG codebase. They are remaining as "secure" shutters. If anyone wants to improve their animation, feel free. +// The original shutters are now shutters_old.dmi; copy the naming format of the files into new a new .dmi to add new shutters that work with the poddoor code for animating the doors. +// Originally, the shutters were reskins of blast doors. Eighty hits with the Cap's sabre to destroy one shutter is far too powerful considering shutters cannot be deconstructed (yet). +// If you're a mapper and want super strong shutter, use the 'old' ones. + +/obj/machinery/door/poddoor/shutters/old + name = "strong shutters" + desc = "These shutters have an armoured frame; it looks like plasteel. These shutters look robust enough to survive explosions." + icon = 'icons/obj/doors/shutters_old.dmi' + icon_state = "closed" + armor = list("melee" = 30, "bullet" = 30, "laser" = 30, "energy" = 75, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) + max_integrity = 300 + +/obj/machinery/door/poddoor/shutters/old/preopen + icon_state = "open" + density = FALSE + opacity = 0 + +// End of old shutter stuff. Credit for the old shutter sprites to TG. + +/obj/machinery/door/poddoor/shutters/radiation + name = "radiation shutters" + desc = "Lead-lined shutters painted yellow with a radioactive hazard symbol on it. Blocks out most radiation" + icon = 'icons/obj/doors/shutters_radiation.dmi' + icon_state = "closed" + rad_insulation = 0.2 + +/obj/machinery/door/poddoor/shutters/radiation/preopen + icon_state = "open" + density = FALSE + opacity = 0 + rad_insulation = 1 + +/obj/machinery/door/poddoor/shutters/radiation/do_animate(animation) + ..() + switch(animation) + if("opening") + rad_insulation = 1 + if("closing") + rad_insulation = 0.2 + +/obj/machinery/door/poddoor/shutters/window + name = "windowed shutters" + desc = "Mechanical shutters that have some form of plastic window in them, allowing you to see through the shutters at all times." + icon = 'icons/obj/doors/shutters_window.dmi' + icon_state = "closed" + opacity = 0 + +/obj/machinery/door/poddoor/shutters/window/preopen + icon_state = "open" + density = FALSE diff --git a/icons/obj/doors/shutters.dmi b/icons/obj/doors/shutters.dmi index a79e9889c9a540fab92220ea8809eb460ee18958..6f10860cfaff5b70830abe603b8df46c0b40dde1 100644 GIT binary patch literal 1660 zcmZ`(dr;C@6#jvb4>B+lZ7W49v4`e{66q>G5?||!(y|u`m6}4=4oT6=0r zE4FSKl~!t$U}l-4`6y+}O3E}FB{eaXhb-nFJG(PG^Ub;Uesj-vzH{%)$)*JRnwtD% z0sw%izaM!E06_FxKyGB9k3A)Rd-V&R5*X$!l}ayPzMPqv85{X7y-ufdo4zB`Uxp-Y2@VCofxn{khcnEu?MdXw z#C-`djHH+&aR8876uOO(kUXgjWsFUHS{>lH`bA4y=NwQYf`o&yQ|oEidd z3+^TES4`2zvro>3VM14J#7YRR-r1*dE33+_9B56Am$nsLEHt4voa?s~4nz)=?F*0I zzhF^ttA7Qo(p1S0OrBTZOiFeo-QsMbHKhjasPAfnFYN&6YZ6qgc=jm(fQS2&Nnxo) z3Tn>IQfJisnMDQ6LA7KU5@Va6k^Qu0zkA~3C3Rc_9=Dw{{L0m9Ty!n=f2 zk5!wE96|T|oT|B8p4dknTJ9*Jo)M>EC0`2dg9R~6D;DzM==wUO_Uou=eabH$tus0* zf2>cVO-(DJ$@pW}ChP)K*EZyX_4qS*(fEEm z_pm2PiN@zkpSQ`8={`BfWD|uMxG>jxYfZjuJ{ZpxyVk;b(zv0-^wxQse~M(a|3^g?p@o%Wpe^Lj1Xw@8)She1d73rZQR{>0M(N0dFK zh~{!!d<;EhTOY4|4}ZIZ#fgUG(O%RvR*#(enWY-PF6 zi(0c&W`t>dVRhd`TN^YBb`Z;}YnX3GDaN1(zsVCUhM?p3^BT;cSmH?@ji@vq4nMMV zc$fSl_zt%2LS9}T>q5XGa$W-q94&Tn8L>371EJBxleJRVYAg>9=;e&`@j8~rHVO+t z(Few+r>DzH&xqOro^gnPOm;%Y0P^gGd397A`qTkA7E- zE*+anf2>HA6M4j3@wC^jl&`7<-7KZ50&xJ_^Z*!wK3n2hftXYIA6>n)9@fI4@y_L1 zNV3`>L2Z-P^%dEqV2!$}4L&AA+!0+Ped1=kb#IdP3W2F@m^dwiC-_dqvKL-&@HR$E zPDPps>zn{tggc3gG5R+;ZK)*}tiK?^iSf#@x2p7bmejK1*5}5=AvLQH36|*cy1GM& zI;7UnUyEGOE%7)|Xrnfe8m@`IA*%7b*%RvW?RDhThqzZxC=HXH;S=xx{y67+0ir;0 zyPS$iD;4e*XxyJS!<*596wWCGBZVWJ_F6P)+?{)dVZ zX(;TT?A3HU9jVg3JGvoPWnOVi_WpB^W>TSuEId9GQZvFl>Y!7(d2M1rUR_*#R5b7A zqs=3UM4f1(CXOQl6Y2X+Q=zSrJvQGh+Z|EE>jYHH+X%20ye(m;a2PB|KeT=Z`UcL` z!tWx;C4#%YzB@50Seb`gC-j4#Q!}TNqDi~zYe8ub& z+L_FmmF`m;?6H1lGrCs`k&jQ~hdlywb@V>Yqx;|q;#VZ^;narlTUm}-Sz3b^LOLV% zWG6&BJ6Hp?bSqvV(M~cAo=%+wU#B*DS1@zMHEN=z$QYX5g z3b9`}>uhmMUhZA+YBl>teogkDcR`;wrOO>rC%B!~%VIc#<^|se{r=lb2i8H+aR$xv zB>l*(Vf?QDkmfD@&`1PD3^u|EVz5(VJ7^9QgrI=QWuE?5_8in8TghGr-pf(z_46O_ M_YNkDHqp3$18}ee0ssI2 literal 2616 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 I6U3yy0gJp5rvLx| diff --git a/icons/obj/doors/shutters_old.dmi b/icons/obj/doors/shutters_old.dmi new file mode 100644 index 0000000000000000000000000000000000000000..57ac75d2513787c280c993b140bf3ed13c61db59 GIT binary patch literal 1224 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgBeKf-aAPXNSOurgt#6!aA4M~S*@+D+1c5f zHf=h=z>t=f*3;8dUtcdREq&>#?be;z+qZA`_4RFUZ&y=O1FB~@!|+aHW;xIV#*!ev zU)e_1!5cyi zE*d|0q;uX!^CUx2Pwx&3;~?Y9#$F0@9!)wjDMTSy(^7rEg|U8YXScEH<`oheNhglZ z44X1zHdj(KgKKcHkhbF?s}mPk5*_Lsv*eDlC0x(#cy;EANX)4zqA`DC4%}mB$P{+l z6{O!9!@$72%G1R$q+-t7Io#!|3z&-+s^IJ(8W2@I{lS>jW_j=FPwF@mu03*JC-4FP=+k zdBQ5phGQbiEsUcG!?=;tpERh{qsTD{|EV}*egS)SzJFC z^V#NU`wV`u6!X;ZGo7nvHih2J<<^kwSbs_^CeU8<&D8Gs-QsKhJmz{hOSRC{IbF)M zKX!fE2cOSu{cB71E`MsMvf}MVNv>BFJzjT{JpyhgvvR$v0teQOb#Ru z!XdBZZfC7tTUVX=y#CeC1rY~p?7p-9lzsTyl;hc_o%$!K=Y8tB znO^-r=aqHtzZ*68L3h*k>vyg0pPeFh&v9jJ1^d#nhq6;{wU!5Di6aZB{__{U%IP%S zVYYl3=a!#;4-|ha58m*rewKi6i(aFd{Trc-&xf%x_OJC;Q2+6KH_O$}wuyh)BLy|| UR|{>=0hT2Up00i_>zopr04QrzCjbBd literal 0 HcmV?d00001 diff --git a/icons/obj/doors/shutters_radiation.dmi b/icons/obj/doors/shutters_radiation.dmi new file mode 100644 index 0000000000000000000000000000000000000000..36d232b197bc08aeef6656a6756f8d71da787e91 GIT binary patch literal 1477 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 P%K(C*xk0&}OU(ZO7Z&LB literal 0 HcmV?d00001 From 3c548a3819f665db692f4ac2844568755e20e7bd Mon Sep 17 00:00:00 2001 From: necromanceranne Date: Wed, 25 Mar 2020 08:33:23 +1100 Subject: [PATCH 017/128] YES OFFICER I DO HAVE A DEADLY WEAPON THESE HANDS --- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/species.dm | 56 +++++++++++++------ .../chemistry/reagents/drug_reagents.dm | 8 ++- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 938f6531f1..b9ff07fe46 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -580,7 +580,7 @@ /mob/living/carbon/update_stamina() var/stam = getStaminaLoss() if(stam > DAMAGE_PRECISION) - var/total_health = (health - stam) + var/total_health = (maxHealth - stam) if(total_health <= crit_threshold && !stat) if(CHECK_MOBILITY(src, MOBILITY_STAND)) to_chat(src, "You're too exhausted to keep going...") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 57667293e7..f12ac14ece 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -769,7 +769,7 @@ return else if(hud_used.healths) - var/health_amount = health - CLAMP(getStaminaLoss()-50, 0, 80)//CIT CHANGE - makes staminaloss have less of an impact on the health hud + var/health_amount = min(health, maxHealth - CLAMP(getStaminaLoss()-50, 0, 80))//CIT CHANGE - makes staminaloss have less of an impact on the health hud if(..(health_amount)) //not dead switch(hal_screwyhud) if(SCREWYHUD_CRIT) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d464419b73..4c0be681b7 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -63,9 +63,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/coldmod = 1 // multiplier for cold damage var/heatmod = 1 // multiplier for heat damage var/stunmod = 1 // multiplier for stun duration - var/punchdamagelow = 0 //lowest possible punch damage - var/punchdamagehigh = 9 //highest possible punch damage - var/punchstunthreshold = 9//damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical + var/punchdamagelow = 1 //lowest possible punch damage. if this is set to 0, punches will always miss + var/punchdamagehigh = 10 //highest possible punch damage + var/punchstunthreshold = 10//damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical var/siemens_coeff = 1 //base electrocution coefficient var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] @@ -1465,15 +1465,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else var/atk_verb = user.dna.species.attack_verb - if(target.lying) - atk_verb = "kick" + if(!(target.mobility_flags & MOBILITY_STAND)) + atk_verb = ATTACK_EFFECT_KICK switch(atk_verb) - if("kick") + if(ATTACK_EFFECT_KICK) user.do_attack_animation(target, ATTACK_EFFECT_KICK) - if("slash") + if(ATTACK_EFFECT_CLAW) user.do_attack_animation(target, ATTACK_EFFECT_CLAW) - if("smash") + if(ATTACK_EFFECT_SMASH) user.do_attack_animation(target, ATTACK_EFFECT_SMASH) else user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) @@ -1493,10 +1493,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected)) - if(!damage || !affecting) - playsound(target.loc, user.dna.species.miss_sound, 25, 1, -1) - target.visible_message("[user] has attempted to [atk_verb] [target]!",\ - "[user] has attempted to [atk_verb] [target]!", null, COMBAT_MESSAGE_RANGE) + var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases + if(user.dna.species.punchdamagelow) + if(atk_verb == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage) + miss_chance = 0 + else + miss_chance = min((user.dna.species.punchdamagehigh/user.dna.species.punchdamagelow) + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 100) //old base chance for a miss + various damage. capped at 100 to prevent weirdness in prob() + + if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted + playsound(target.loc, user.dna.species.miss_sound, 25, TRUE, -1) + target.visible_message("[user]'s [atk_verb] misses [target]!", \ + "You avoid [user]'s [atk_verb]!", "You hear a swoosh!", COMBAT_MESSAGE_RANGE, user) + to_chat(user, "Your [atk_verb] misses [target]!") + log_combat(user, target, "attempted to punch") return FALSE @@ -1513,14 +1522,25 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(user.limb_destroyer) target.dismembering_strike(user, affecting.body_zone) - target.apply_damage(damage, BRUTE, affecting, armor_block) - log_combat(user, target, "punched") + + if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + 0.5x stamina damage + target.apply_damage(damage*1.5, BRUTE, affecting, armor_block) + target.apply_damage(damage*0.5, STAMINA, affecting, armor_block) + log_combat(user, target, "kicked") + else//other attacks deal full raw damage + 2x in stamina damage + target.apply_damage(damage, BRUTE, affecting, armor_block) + target.apply_damage(damage*2, STAMINA, affecting, armor_block) + log_combat(user, target, "punched") + if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold) - target.visible_message("[user] has knocked [target] down!", \ - "[user] has knocked [target] down!", null, COMBAT_MESSAGE_RANGE) - target.apply_effect(80, EFFECT_KNOCKDOWN, armor_block) + target.visible_message("[user] knocks [target] down!", \ + "You're knocked down by [user]!", "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, user) + to_chat(user, "You knock [target] down!") + var/knockdown_duration = 40 + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 - armor_block + target.DefaultCombatKnockdown(knockdown_duration) target.forcesay(GLOB.hit_appends) - else if(target.lying) + log_combat(user, target, "got a stun punch with their previous punch") + else if(!(target.mobility_flags & MOBILITY_STAND)) target.forcesay(GLOB.hit_appends) /datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 0b634ba2d8..7bcd8922a2 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -467,7 +467,9 @@ if(H.physiology) H.physiology.stamina_mod *= 0.5 if(H.dna && H.dna.species) - H.dna.species.punchdamagehigh *= 5 + H.dna.species.punchdamagehigh *= 4 + H.dna.species.punchdamagelow *= 10 + H.dna.species.punchstunthreshold *= 2 /datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L) . = ..() @@ -478,7 +480,9 @@ if(H.physiology) H.physiology.stamina_mod *= 2 if(H.dna && H.dna.species) - H.dna.species.punchdamagehigh *= 0.2 + H.dna.species.punchdamagehigh *= 0.25 + H.dna.species.punchdamagelow *= 0.1 + H.dna.species.punchstunthreshold *= 0.5 /datum/reagent/drug/skooma/on_mob_life(mob/living/carbon/M) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM) From c0029612a3133d8e6a7b5f18b7468d21f33e55ca Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Wed, 25 Mar 2020 08:53:30 +1100 Subject: [PATCH 018/128] SO YOU DON'T HAVE HORRIBLE MATH PROBLEMS --- code/modules/reagents/chemistry/reagents/drug_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 7bcd8922a2..bf090302c8 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -468,7 +468,7 @@ H.physiology.stamina_mod *= 0.5 if(H.dna && H.dna.species) H.dna.species.punchdamagehigh *= 4 - H.dna.species.punchdamagelow *= 10 + H.dna.species.punchdamagelow *= 4 H.dna.species.punchstunthreshold *= 2 /datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L) @@ -481,7 +481,7 @@ H.physiology.stamina_mod *= 2 if(H.dna && H.dna.species) H.dna.species.punchdamagehigh *= 0.25 - H.dna.species.punchdamagelow *= 0.1 + H.dna.species.punchdamagelow *= 0.25 H.dna.species.punchstunthreshold *= 0.5 /datum/reagent/drug/skooma/on_mob_life(mob/living/carbon/M) From 5341bdf008b88e03ac414486bc4b4b6c8fc459d9 Mon Sep 17 00:00:00 2001 From: necromanceranne Date: Wed, 25 Mar 2020 09:08:15 +1100 Subject: [PATCH 019/128] BOXERS CAN ONLY KNOCK OUT OTHER BOXERS --- code/datums/martial/boxing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index ea883c5637..16d61c29f9 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -37,7 +37,7 @@ D.apply_damage(damage, STAMINA, affecting, armor_block) log_combat(A, D, "punched (boxing) ") - if(D.getStaminaLoss() > 100) + if(D.getStaminaLoss() > 100 && istype(D.mind?.martial_art, /datum/martial_art/boxing)) var/knockout_prob = (D.getStaminaLoss() + rand(-15,15))*0.75 if((D.stat != DEAD) && prob(knockout_prob)) D.visible_message("[A] has knocked [D] out with a haymaker!", \ From 2b66eadc5e2a08e30e33a92a1cfb8cf12daa3ccc Mon Sep 17 00:00:00 2001 From: necromanceranne Date: Wed, 25 Mar 2020 09:54:46 +1100 Subject: [PATCH 020/128] OW MY LIMBS HURT MORE FROM STAMINA DAMAGE --- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 210a5e349d..c7ea35e866 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -23,7 +23,7 @@ var/disabled = BODYPART_NOT_DISABLED //If disabled, limb is as good as missing var/body_damage_coeff = 1 //Multiplier of the limb's damage that gets applied to the mob - var/stam_damage_coeff = 0.5 + var/stam_damage_coeff = 0.75 var/brutestate = 0 var/burnstate = 0 var/brute_dam = 0 From c9f02d97a195e3eb1699cf5489b8517ffea8139a Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 02:47:16 +0100 Subject: [PATCH 021/128] Privates Visibility Preferences. Also Undergarments having a purpose. --- code/__DEFINES/citadel_defines.dm | 8 +++ code/__DEFINES/misc.dm | 19 ++--- code/__HELPERS/_cit_helpers.dm | 9 ++- code/__HELPERS/global_lists.dm | 5 -- code/__HELPERS/mobs.dm | 11 ++- .../configuration/entries/game_options.dm | 5 ++ code/game/gamemodes/changeling/changeling.dm | 4 +- code/game/objects/structures/dresser.dm | 2 +- .../objects/structures/ghost_role_spawners.dm | 2 +- code/modules/admin/create_mob.dm | 2 +- .../antagonists/bloodsucker/powers/veil.dm | 4 +- code/modules/antagonists/devil/devil.dm | 4 +- code/modules/awaymissions/corpse.dm | 2 +- code/modules/client/preferences.dm | 47 ++++++++----- .../sprite_accessories/_sprite_accessories.dm | 6 +- .../sprite_accessories/undershirt.dm | 4 ++ .../sprite_accessories/underwear.dm | 7 ++ code/modules/mob/living/carbon/human/human.dm | 3 +- .../mob/living/carbon/human/update_icons.dm | 6 +- .../code/modules/arousal/arousal.dm | 2 +- .../code/modules/arousal/genitals.dm | 70 ++++++++++++------- .../arousal/genitals_sprite_accessories.dm | 6 +- .../code/modules/arousal/organs/breasts.dm | 6 +- .../code/modules/arousal/organs/penis.dm | 10 ++- .../code/modules/arousal/organs/testicles.dm | 8 +-- .../code/modules/arousal/organs/vagina.dm | 3 +- .../code/modules/client/preferences.dm | 6 -- 27 files changed, 148 insertions(+), 113 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 01355173d2..8b4ef2aca4 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -35,6 +35,8 @@ #define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ #define CAN_CLIMAX_WITH (1<<7) #define GENITAL_CAN_AROUSE (1<<8) +#define GENITAL_UNDIES_HIDDEN (1<<9) +#define UPDATE_OWNER_APPEARANCE (1<<10) #define DEF_VAGINA_SHAPE "Human" @@ -71,6 +73,12 @@ #define MILK_RATE_MULT 1 #define MILK_EFFICIENCY 1 +//visibility toggles defines to avoid errors typos code errors. +#define GEN_VISIBLE_ALWAYS "Always visible" +#define GEN_VISIBLE_NO_CLOTHES "Hidden by clothes" +#define GEN_VISIBLE_NO_UNDIES "Hidden by underwear" +#define GEN_VISIBLE_NEVER "Always hidden" + //Individual logging define #define INDIVIDUAL_LOOC_LOG "LOOC log" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 89cacc1c7b..3a1e44f053 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -27,14 +27,15 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS -#define MUTATIONS_LAYER 32 //mutations. Tk headglows, cold resistance glow, etc -#define GENITALS_BEHIND_LAYER 31 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer -#define BODY_BEHIND_LAYER 30 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define BODYPARTS_LAYER 29 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag -#define MARKING_LAYER 28 //Matrixed body markings because clashing with snouts? -#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts -#define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be. -#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) +#define MUTATIONS_LAYER 33 //mutations. Tk headglows, cold resistance glow, etc +#define GENITALS_BEHIND_LAYER 32 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer +#define BODY_BEHIND_LAYER 31 //certain mutantrace features (tail when looking south) that must appear behind the body parts +#define BODYPARTS_LAYER 30 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag +#define MARKING_LAYER 29 //Matrixed body markings because clashing with snouts? +#define BODY_ADJ_LAYER 28 //certain mutantrace features (snout, body markings) that must appear above the body parts +#define GENITALS_FRONT_LAYER 27 //Draws some genitalia above clothes and the TAUR body if need be. +#define BODY_LAYER 26 //underwear, undershirts, socks, eyes, lips(makeup) +#define GENITALS_NO_UNDIE_LAYER 25 //found above undergarments. #define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) #define DAMAGE_LAYER 23 //damage indicators (cuts and burns) #define UNIFORM_LAYER 22 @@ -59,7 +60,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 32 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 33 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index cc8ab0d250..9afae12c30 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -58,14 +58,13 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list) //Genitals and Arousal Lists GLOBAL_LIST_EMPTY(genitals_list) GLOBAL_LIST_EMPTY(cock_shapes_list) -GLOBAL_LIST_EMPTY(gentlemans_organ_names) GLOBAL_LIST_EMPTY(balls_shapes_list) GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(vagina_shapes_list) -GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc -GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft")) -GLOBAL_LIST_INIT(cum_id_list,"semen") -GLOBAL_LIST_INIT(milk_id_list,"milk") +//longcat memes. +GLOBAL_LIST_INIT(dick_nouns, list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett", "Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior")) + +GLOBAL_LIST_INIT(genitals_visibility_toggles, list(GEN_VISIBLE_ALWAYS, GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER)) GLOBAL_LIST_INIT(dildo_shapes, list( "Human" = "human", diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ff2559b661..38e25b04c5 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -54,11 +54,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list) - GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", - "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", - "baloney pony", "schlanger", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket", - "One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett", - "Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior") for(var/gpath in subtypesof(/obj/item/organ/genital)) var/obj/item/organ/genital/G = gpath diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index b8edf3b0f4..f7546193aa 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -185,7 +185,6 @@ "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_balls" = FALSE, - "balls_internal" = FALSE, "balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "balls_size" = BALLS_SIZE_DEF, "balls_shape" = DEF_BALLS_SHAPE, @@ -200,13 +199,11 @@ "has_vag" = FALSE, "vag_shape" = pick(GLOB.vagina_shapes_list), "vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), - "vag_clits" = 1, - "vag_clit_diam" = 0.25, - "vag_clit_len" = 0.25, "has_womb" = FALSE, - "womb_cum_rate" = CUM_RATE, - "womb_cum_mult" = CUM_RATE_MULT, - "womb_efficiency" = CUM_EFFICIENCY, + "balls_visibility" = GEN_VISIBLE_NO_UNDIES, + "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, + "cock_visibility" = GEN_VISIBLE_NO_UNDIES, + "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", "ipc_antenna" = "None", "flavor_text" = "", diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index bc290bedb9..b233e92007 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -436,3 +436,8 @@ /datum/config_entry/number/penis_max_inches_prefs config_entry_value = 20 min_val = 0 + +/datum/config_entry/keyed_list/safe_visibility_toggles + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles. diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 14fe960422..4db8f4129a 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -88,13 +88,13 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th user.underwear = chosen_prof.underwear user.undie_color = chosen_prof.undie_color user.undershirt = chosen_prof.undershirt - user.shirt_color =chosen_prof.shirt_color + user.shirt_color = chosen_prof.shirt_color user.socks = chosen_prof.socks user.socks_color =chosen_prof.socks_color chosen_dna.transfer_identity(user, 1) user.updateappearance(mutcolor_update=1) - user.update_body() + user.update_body(TRUE) user.domutcheck() //vars hackery. not pretty, but better than the alternative. diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index ecacf49fc2..528153324d 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -73,7 +73,7 @@ H.socks_color = recolor_undergarment(H, "socks", H.socks_color) add_fingerprint(H) - H.update_body() + H.update_body(TRUE) /obj/structure/dresser/proc/recolor_undergarment(mob/living/carbon/human/H, garment_type = "underwear", default_color) var/n_color = input(H, "Choose your [garment_type]'\s color.", "Character Preference", default_color) as color|null diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 7469bd2e72..65145c0eed 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -31,7 +31,7 @@ new_spawn.underwear = "Nude" //You're a plant, partner new_spawn.undershirt = "Nude" //changing underwear/shirt/socks doesn't seem to function correctly right now because of some bug elsewhere? new_spawn.socks = "Nude" - new_spawn.update_body() + new_spawn.update_body(TRUE) //Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 3336da7267..3e604856c5 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -45,6 +45,6 @@ SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE) - H.update_body() + H.update_body(TRUE) H.update_hair() H.update_body_parts() diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm index 0b3cded832..ecb0611940 100644 --- a/code/modules/antagonists/bloodsucker/powers/veil.dm +++ b/code/modules/antagonists/bloodsucker/powers/veil.dm @@ -95,7 +95,7 @@ H.dna.features = random_features(H.dna.species?.id) // Apply Appearance - H.update_body() // Outfit and underware, also body. + H.update_body(TRUE) // Outfit and underwear, also body and privates. //H.update_mutant_bodyparts() // Lizard tails etc H.update_hair() H.update_body_parts() @@ -140,7 +140,7 @@ ADD_TRAIT(H, TRAIT_DISFIGURED, "husk") // NOTE: We are ASSUMING husk. // H.status_flags |= DISFIGURED // Restore "Unknown" disfigurement H.dna.features = prev_features // Apply Appearance - H.update_body() // Outfit and underware, also body. + H.update_body(TRUE) // Outfit and underwear, also body and privates. H.update_hair() H.update_body_parts() // Body itself, maybe skin color? cast_effect() // POOF diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 1d0bfde322..26e6283f09 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -244,7 +244,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", H.undershirt = "Nude" H.socks = "Nude" H.dna.features["mcolor"] = "511" //A deep red - H.regenerate_icons() + H.update_body(TRUE) else //Did the devil get hit by a staff of transmutation? owner.current.color = "#501010" give_appropriate_spells() @@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", H.undershirt = "Nude" H.socks = "Nude" H.dna.features["mcolor"] = "511" - H.regenerate_icons() + H.update_body(TRUE) if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough. var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf) A.faction |= "hell" diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index f740ed27dd..50dd1e5608 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -208,7 +208,7 @@ else H.skin_tone = random_skin_tone() H.update_hair() - H.update_body() + H.update_body() //update_genitals arg FALSE because these don't quite require/have them most times. if(outfit) var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store") for(var/slot in slots) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 87330ce42c..1b280baa56 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -126,7 +126,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "fff", "has_balls" = FALSE, - "balls_internal" = FALSE, "balls_color" = "fff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, @@ -141,12 +140,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "fff", - "vag_clits" = 1, - "vag_clit_diam" = 0.25, "has_womb" = FALSE, - "womb_cum_rate" = CUM_RATE, - "womb_cum_mult" = CUM_RATE_MULT, - "womb_efficiency" = CUM_EFFICIENCY, + "balls_visibility" = GEN_VISIBLE_NO_UNDIES, + "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, + "cock_visibility" = GEN_VISIBLE_NO_UNDIES, + "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", @@ -763,6 +761,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "    Change
    " dat += "Penis Shape: [features["cock_shape"]]" dat += "Penis Length: [features["cock_length"]] inch(es)" + dat += "Penis Visibility:[features["cock_visibility"]]" dat += "Has Testicles:[features["has_balls"] == TRUE ? "Yes" : "No"]" if(features["has_balls"]) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) @@ -771,7 +770,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Testicles Color:
    " dat += "    Change
    " - dat += "Testicles showing:[features["balls_shape"]]" + dat += "Testicles Visibility:[features["balls_visibility"]]" dat += APPEARANCE_CATEGORY_COLUMN dat += "

    Vagina

    " dat += "[features["has_vag"] == TRUE ? "Yes" : "No"]" @@ -783,6 +782,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Vagina Color:
    " dat += "    Change
    " + dat += "Vagina Visibility:[features["vag_visibility"]]" dat += "Has Womb:[features["has_womb"] == TRUE ? "Yes" : "No"]" dat += "" dat += APPEARANCE_CATEGORY_COLUMN @@ -796,7 +796,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Color:
    " dat += "    Change
    " dat += "Cup Size:[features["breasts_size"]]" - dat += "Breast Shape:[features["breasts_shape"]]" + dat += "Breasts Shape:[features["breasts_shape"]]" + dat += "Breasts Visibility:[features["breasts_visibility"]]" dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]" dat += "" dat += "" @@ -1939,8 +1940,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_shape) features["cock_shape"] = new_shape + if("cock_visibility") + var/n_vis = input(user, "Penis Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles) + if(n_vis) + features["cock_visibility"] = n_vis + if("balls_color") - var/new_ballscolor = input(user, "Testicle Color:", "Character Preference") as color|null + var/new_ballscolor = input(user, "Testicles Color:", "Character Preference") as color|null if(new_ballscolor) var/temp_hsv = RGBtoHSV(new_ballscolor) if(new_ballscolor == "#000000") @@ -1950,11 +1956,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") - if("balls_shape") - var/new_shape - new_shape = input(user, "Testicle Type:", "Character Preference") as null|anything in GLOB.balls_shapes_list - if(new_shape) - features["balls_shape"] = new_shape + if("balls_visibility") + var/n_vis = input(user, "Testicles Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles) + if(n_vis) + features["balls_visibility"] = n_vis if("breasts_size") var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in CONFIG_GET(keyed_list/breasts_cups_prefs) @@ -1978,6 +1983,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + if("breasts_visibility") + var/n_vis = input(user, "Breasts Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles) + if(n_vis) + features["breasts_visibility"] = n_vis + if("vag_shape") var/new_shape new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list @@ -1995,6 +2005,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + if("vag_visibility") + var/n_vis = input(user, "Vagina Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles) + if(n_vis) + features["vag_visibility"] = n_vis + if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null if(new_ooccolor) @@ -2088,8 +2103,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["has_balls"] = FALSE if("has_balls") features["has_balls"] = !features["has_balls"] - if("balls_internal") - features["balls_internal"] = !features["balls_internal"] if("has_breasts") features["has_breasts"] = !features["has_breasts"] if(features["has_breasts"] == FALSE) @@ -2409,6 +2422,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) else character.Digitigrade_Leg_Swap(TRUE) + character.give_genitals(TRUE) //character.update_genitals() is already called on genital.update_appearance() + SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks) //let's be sure the character updates diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index abe51bf486..4365e59a7a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -71,11 +71,13 @@ //for snowflake/donor specific sprites var/list/ckeys_allowed - + //For soft-restricting markings to species IDs var/list/recommended_species /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' var/has_color = FALSE - var/has_digitigrade = FALSE \ No newline at end of file + var/has_digitigrade = FALSE + var/covers_groin = FALSE + var/covers_chest = FALSE \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm index 58c64dc7d0..73233f3e09 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm @@ -2,9 +2,13 @@ // Undershirt Definitions // //////////////////////////// +/datum/sprite_accessory/underwear/top + covers_chest = TRUE + /datum/sprite_accessory/underwear/top/nude name = "Nude" icon_state = null + covers_chest = FALSE // please make sure they're sorted alphabetically and categorized diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm index 9441b5120a..58d5e1ba88 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm @@ -2,9 +2,13 @@ // Underwear Definitions // /////////////////////////// +/datum/sprite_accessory/underwear/bottom + covers_groin = TRUE + /datum/sprite_accessory/underwear/bottom/nude name = "Nude" icon_state = null + covers_groin = FALSE /datum/sprite_accessory/underwear/bottom/mankini name = "Mankini" @@ -155,16 +159,19 @@ name = "Swimsuit, One Piece - Red" icon_state = "swimming_red" gender = FEMALE + covers_chest = TRUE /datum/sprite_accessory/underwear/bottom/swimsuit name = "Swimsuit, One Piece - Black" icon_state = "swimming_black" gender = FEMALE + covers_chest = TRUE /datum/sprite_accessory/underwear/bottom/swimsuit_blue name = "Swimsuit, One Piece - Striped Blue" icon_state = "swimming_blue" gender = FEMALE + covers_chest = TRUE /datum/sprite_accessory/underwear/bottom/thong name = "Thong" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 57667293e7..bbc109ab38 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -629,9 +629,8 @@ underwear = "Nude" undershirt = "Nude" socks = "Nude" - update_body() + update_body(TRUE) update_hair() - update_genitals() /mob/living/carbon/human/singularity_pull(S, current_size) ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 66233f7243..bb80f7555c 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -57,10 +57,12 @@ There are several things that need to be remembered: dna.species.handle_mutant_bodyparts(src) -/mob/living/carbon/human/update_body() +/mob/living/carbon/human/update_body(update_genitals = FALSE) remove_overlay(BODY_LAYER) dna.species.handle_body(src) ..() + if(update_genitals) + update_genitals() /mob/living/carbon/human/update_fire() ..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning") @@ -72,7 +74,7 @@ There are several things that need to be remembered: if(!..()) icon_render_key = null //invalidate bodyparts cache - update_body() + update_body(TRUE) update_hair() update_inv_w_uniform() update_inv_wear_id() diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 5c7d5a39e9..843672877e 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -33,7 +33,7 @@ hidden_underwear = on_off hidden_socks = on_off - update_body() + update_body(TRUE) /mob/living/carbon/human/proc/adjust_arousal(strength,aphro = FALSE,maso = FALSE) // returns all genitals that were adjust diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index 6f0588f76e..87379274b6 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -41,6 +41,9 @@ return update_size() update_appearance() + if(genital_flags & UPDATE_OWNER_APPEARANCE && owner && ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.update_genitals() if(linked_organ_slot || (linked_organ && !owner)) update_link() @@ -49,9 +52,16 @@ var/list/exposed_genitals = list() //Keeping track of them so we don't have to iterate through every genitalia and see if exposed /obj/item/organ/genital/proc/is_exposed() - if(!owner || CHECK_BITFIELD(genital_flags, GENITAL_INTERNAL) || CHECK_BITFIELD(genital_flags, GENITAL_HIDDEN)) + if(!owner || genital_flags & (GENITAL_INTERNAL|GENITAL_HIDDEN)) return FALSE - if(CHECK_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES)) + if(genital_flags & GENITAL_UNDIES_HIDDEN && ishuman(owner)) + var/mob/living/carbon/human/H = owner + if(!(NO_UNDERWEAR in H.dna.species.species_traits)) + var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] + var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] + if(zone == BODY_ZONE_CHEST ? (H.hidden_undershirt || T?.covers_chest || B?.covers_chest) : (H.hidden_underwear || T?.covers_groin || B?.covers_groin)) + return FALSE + if(genital_flags & GENITAL_THROUGH_CLOTHES) return TRUE switch(zone) //update as more genitals are added @@ -60,25 +70,19 @@ if(BODY_ZONE_PRECISE_GROIN) return owner.is_groin_exposed() -/obj/item/organ/genital/proc/toggle_visibility(visibility) +/obj/item/organ/genital/proc/toggle_visibility(visibility, update = TRUE) + genital_flags &= ~(GENITAL_THROUGH_CLOTHES|GENITAL_HIDDEN|GENITAL_UNDIES_HIDDEN) + owner.exposed_genitals -= src switch(visibility) - if("Always visible") - ENABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES) - DISABLE_BITFIELD(genital_flags, GENITAL_HIDDEN) - if(!(src in owner.exposed_genitals)) - owner.exposed_genitals += src - if("Hidden by clothes") - DISABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES) - DISABLE_BITFIELD(genital_flags, GENITAL_HIDDEN) - if(src in owner.exposed_genitals) - owner.exposed_genitals -= src - if("Always hidden") - DISABLE_BITFIELD(genital_flags, GENITAL_THROUGH_CLOTHES) - ENABLE_BITFIELD(genital_flags, GENITAL_HIDDEN) - if(src in owner.exposed_genitals) - owner.exposed_genitals -= src + if(GEN_VISIBLE_ALWAYS) + genital_flags |= GENITAL_THROUGH_CLOTHES + owner.exposed_genitals += src + if(GEN_VISIBLE_NO_UNDIES) + genital_flags |= GENITAL_UNDIES_HIDDEN + if(GEN_VISIBLE_NEVER) + genital_flags |= GENITAL_HIDDEN - if(ishuman(owner)) //recast to use update genitals proc + if(update && ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner H.update_genitals() @@ -87,6 +91,10 @@ set name = "Expose/Hide genitals" set desc = "Allows you to toggle which genitals should show through clothes or not." + if(stat != CONSCIOUS) + to_chat(usr, "You can toggle genitals visibility right now...") + return + var/list/genital_list = list() for(var/obj/item/organ/genital/G in internal_organs) if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL)) @@ -95,10 +103,11 @@ return //Full list of exposable genitals created var/obj/item/organ/genital/picked_organ - picked_organ = input(src, "Choose which genitalia to expose/hide", "Expose/Hide genitals", null) in genital_list - if(picked_organ) - var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden") - picked_organ.toggle_visibility(picked_visibility) + picked_organ = input(src, "Choose which genitalia to expose/hide", "Expose/Hide genitals") as null|anything in genital_list + if(picked_organ && (picked_organ in internal_organs)) + var/picked_visibility = input(src, "Choose visibility setting", "Expose/Hide genitals") as null|anything in GLOB.genitals_visibility_toggles + if(picked_visibility && picked_organ && (picked_organ in internal_organs)) + picked_organ.toggle_visibility(picked_visibility) return /mob/living/carbon/verb/toggle_arousal_state() @@ -256,6 +265,7 @@ var/list/gen_index[GENITAL_LAYER_INDEX_LENGTH] var/list/genitals_to_add var/list/fully_exposed + var/list/somewhat_exposed for(var/obj/item/organ/genital/G in internal_organs) if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes LAZYADD(gen_index[G.layer_index], G) @@ -306,9 +316,13 @@ genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][dna.species.use_skintones ? "_s" : ""]_[aroused_state]_[layertext]" - if(layers_num[layer] == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES)) - genital_overlay.layer = -GENITALS_EXPOSED_LAYER - LAZYADD(fully_exposed, genital_overlay) // to be added to a layer with higher priority than clothes, hence the name of the bitflag. + if(layers_num[layer] == GENITALS_FRONT_LAYER) + if(G.genital_flags & GENITAL_THROUGH_CLOTHES) + genital_overlay.layer = -GENITALS_EXPOSED_LAYER + LAZYADD(fully_exposed, genital_overlay) + else if(!(G.genital_flags & GENITAL_UNDIES_HIDDEN)) + genital_overlay.layer = -GENITALS_NO_UNDIE_LAYER + LAZYADD(somewhat_exposed, genital_overlay) else genital_overlay.layer = -layers_num[layer] standing += genital_overlay @@ -320,6 +334,10 @@ overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed apply_overlay(GENITALS_EXPOSED_LAYER) + if(LAZYLEN(somewhat_exposed)) + overlays_standing[GENITALS_NO_UNDIE_LAYER] = somewhat_exposed + apply_overlay(GENITALS_NO_UNDIE_LAYER) + for(var/L in relevant_layers) apply_overlay(layers_num[L]) diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm index 07453facdf..92c643c4bd 100644 --- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm @@ -74,13 +74,9 @@ name = "testicle" //the preview name of the accessory color_src = "balls_color" -/datum/sprite_accessory/testicles/hidden - icon_state = "none" - name = "Hidden" - /datum/sprite_accessory/testicles/single icon_state = "single" - name = "Single" + name = "Single" //Single as "single pair", for clarity. //Vaginas /datum/sprite_accessory/vagina diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index bfa506da6d..8183ba92bc 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -12,7 +12,7 @@ fluid_id = /datum/reagent/consumable/milk fluid_rate = MILK_RATE shape = DEF_BREASTS_SHAPE - genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE + genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN masturbation_verb = "massage" arousal_verb = "Your breasts start feeling sensitive" unarousal_verb = "Your breasts no longer feel sensitive" @@ -64,9 +64,6 @@ icon_state += "_s" else color = "#[owner.dna.features["breasts_color"]]" - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.update_genitals() //Allows breasts to grow and change size, with sprite changes too. //maximum wah @@ -133,6 +130,7 @@ cached_size = size size = breast_values[size] prev_size = cached_size + toggle_visibility(D.features["breasts_visibility"], FALSE) #undef BREASTS_ICON_MIN_SIZE #undef BREASTS_ICON_MAX_SIZE \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index 294ac6c877..ded05134a9 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -8,7 +8,7 @@ masturbation_verb = "stroke" arousal_verb = "You pop a boner" unarousal_verb = "Your boner goes down" - genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE + genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN linked_organ_slot = ORGAN_SLOT_TESTICLES fluid_transfer_factor = 0.5 shape = DEF_COCK_SHAPE @@ -66,9 +66,9 @@ if(owner) if (round(length) > round(prev_length)) - to_chat(owner, "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.") + to_chat(owner, "Your [pick(GLOB.dick_nouns)] [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(owner, "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.") + to_chat(owner, "Your [pick(GLOB.dick_nouns)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.") icon_state = sanitize_text("penis_[shape]_[size]") diameter = (length * diameter_ratio)//Is it just me or is this ludicous, why not make it exponentially decay? @@ -89,9 +89,6 @@ icon_state += "_s" else color = "#[owner.dna.features["cock_color"]]" - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.update_genitals() /obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna @@ -103,3 +100,4 @@ diameter_ratio = D.features["cock_diameter_ratio"] shape = D.features["cock_shape"] prev_length = length + toggle_visibility(D.features["cock_visibility"], FALSE) \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm index cf4480ff1f..4264cf5e48 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -9,7 +9,7 @@ arousal_verb = "Your balls ache a little" unarousal_verb = "Your balls finally stop aching, again" linked_organ_slot = ORGAN_SLOT_PENIS - genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION + genital_flags = CAN_MASTURBATE_WITH|MASTURBATE_LINKED_ORGAN|GENITAL_FUID_PRODUCTION|UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN var/size_name = "average" shape = DEF_BALLS_SHAPE fluid_id = /datum/reagent/consumable/semen @@ -53,9 +53,6 @@ icon_state += "_s" else color = "#[owner.dna.features["balls_color"]]" - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.update_genitals() /obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna @@ -64,8 +61,7 @@ else color = "#[D.features["balls_color"]]" shape = D.features["balls_shape"] - if(D.features["balls_shape"] == "Hidden") - ENABLE_BITFIELD(genital_flags, GENITAL_INTERNAL) fluid_rate = D.features["balls_cum_rate"] fluid_mult = D.features["balls_cum_mult"] fluid_efficiency = D.features["balls_efficiency"] + toggle_visibility(D.features["balls_visibility"], FALSE) \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index 91c3b8b8e9..f7e8eddcbd 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -7,7 +7,7 @@ slot = "vagina" size = 1 //There is only 1 size right now shape = DEF_VAGINA_SHAPE - genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE + genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE|GENITAL_UNDIES_HIDDEN masturbation_verb = "finger" arousal_verb = "You feel wetness on your crotch" unarousal_verb = "You no longer feel wet" @@ -70,3 +70,4 @@ else color = "[D.features["vag_color"]]" shape = "[D.features["vag_shape"]]" + toggle_visibility(D.features["vag_visibility"], FALSE) diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index f1dbe31d02..8c55f2d9a8 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -45,9 +45,3 @@ else if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT) return TRUE - -/datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1) - ..() - character.give_genitals(TRUE) - if(icon_updates) - character.update_genitals() From c1e13a83fbba9c814e863ff754e9bb3dab92ccaa Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 03:35:29 +0100 Subject: [PATCH 022/128] Boom. --- code/__DEFINES/misc.dm | 19 ++++--- code/modules/client/preferences_savefile.dm | 51 +++++++++++++++++-- .../code/modules/arousal/genitals.dm | 15 ++---- .../modules/client/preferences_savefile.dm | 23 --------- 4 files changed, 58 insertions(+), 50 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 3a1e44f053..89cacc1c7b 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -27,15 +27,14 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS -#define MUTATIONS_LAYER 33 //mutations. Tk headglows, cold resistance glow, etc -#define GENITALS_BEHIND_LAYER 32 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer -#define BODY_BEHIND_LAYER 31 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define BODYPARTS_LAYER 30 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag -#define MARKING_LAYER 29 //Matrixed body markings because clashing with snouts? -#define BODY_ADJ_LAYER 28 //certain mutantrace features (snout, body markings) that must appear above the body parts -#define GENITALS_FRONT_LAYER 27 //Draws some genitalia above clothes and the TAUR body if need be. -#define BODY_LAYER 26 //underwear, undershirts, socks, eyes, lips(makeup) -#define GENITALS_NO_UNDIE_LAYER 25 //found above undergarments. +#define MUTATIONS_LAYER 32 //mutations. Tk headglows, cold resistance glow, etc +#define GENITALS_BEHIND_LAYER 31 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer +#define BODY_BEHIND_LAYER 30 //certain mutantrace features (tail when looking south) that must appear behind the body parts +#define BODYPARTS_LAYER 29 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag +#define MARKING_LAYER 28 //Matrixed body markings because clashing with snouts? +#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts +#define GENITALS_FRONT_LAYER 26 //Draws some genitalia above clothes and the TAUR body if need be. +#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) #define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) #define DAMAGE_LAYER 23 //damage indicators (cuts and burns) #define UNIFORM_LAYER 22 @@ -60,7 +59,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 33 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 32 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 69b8b5685f..76fc40b115 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 26 +#define SAVEFILE_VERSION_MAX 27 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -145,6 +145,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(features["meat_type"] == "Inesct") features["meat_type"] = "Insect" + if(current_version < 27) + var/tennis + S["feature_balls_shape"] >> tennis + if(tennis == "Hidden") + features["balls_visibility"] = GEN_VISIBLE_NEVER + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -447,22 +453,24 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_cock_color"] >> features["cock_color"] S["feature_cock_length"] >> features["cock_length"] S["feature_cock_diameter"] >> features["cock_diameter"] - S["feature_has_sheath"] >> features["sheath_color"] + S["feature_cock_visibility"] >> features["cock_visibility"] //balls features S["feature_has_balls"] >> features["has_balls"] S["feature_balls_color"] >> features["balls_color"] S["feature_balls_size"] >> features["balls_size"] - S["feature_balls_shape"] >> features["balls_shape"] + S["feature_balls_visibility"] >> features["balls_visibility"] //breasts features S["feature_has_breasts"] >> features["has_breasts"] S["feature_breasts_size"] >> features["breasts_size"] S["feature_breasts_shape"] >> features["breasts_shape"] S["feature_breasts_color"] >> features["breasts_color"] S["feature_breasts_producing"] >> features["breasts_producing"] + S["feature_breasts_visibility"] >> features["breasts_visibility"] //vagina features S["feature_has_vag"] >> features["has_vag"] S["feature_vag_shape"] >> features["vag_shape"] S["feature_vag_color"] >> features["vag_color"] + S["feature_vag_visibility"] >> features["vag_visibility"] //womb features S["feature_has_womb"] >> features["has_womb"] //flavor text @@ -549,14 +557,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/static/list/B_sizes if(!B_sizes) - B_sizes = CONFIG_GET(keyed_list/breasts_cups_prefs) - B_sizes = B_sizes.Copy() + var/list/L = CONFIG_GET(keyed_list/breasts_cups_prefs) + B_sizes = L.Copy() var/static/min_D if(!min_D) min_D = CONFIG_GET(number/penis_min_inches_prefs) var/static/max_D if(!max_D) max_D = CONFIG_GET(number/penis_max_inches_prefs) + var/static/safe_visibilities + if(!safe_visibilities) + var/list/L = CONFIG_GET(keyed_list/safe_visibility_toggles) + safe_visibilities = L.Copy() features["breasts_size"] = sanitize_inlist(features["breasts_size"], B_sizes, BREASTS_SIZE_DEF) features["cock_length"] = sanitize_integer(features["cock_length"], min_D, max_D, COCK_SIZE_DEF) @@ -568,6 +580,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF") features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF") features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF") + features["breasts_visibility"] = sanitize_inlist(features["breasts_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["cock_visibility"] = sanitize_inlist(features["cock_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["balls_visibility"] = sanitize_inlist(features["balls_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["vag_visibility"] = sanitize_inlist(features["vag_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN) @@ -648,6 +665,30 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_insect_markings"] , features["insect_markings"]) WRITE_FILE(S["feature_meat"] , features["meat_type"]) + WRITE_FILE(S["feature_has_cock"], features["has_cock"]) + WRITE_FILE(S["feature_cock_shape"], features["cock_shape"]) + WRITE_FILE(S["feature_cock_color"], features["cock_color"]) + WRITE_FILE(S["feature_cock_length"], features["cock_length"]) + WRITE_FILE(S["feature_cock_visibility"], features["cock_visibility"]) + + WRITE_FILE(S["feature_has_balls"], features["has_balls"]) + WRITE_FILE(S["feature_balls_color"], features["balls_color"]) + WRITE_FILE(S["feature_balls_size"], features["balls_size"]) + WRITE_FILE(S["feature_balls_visibility"], features["balls_visibility"]) + + WRITE_FILE(S["feature_has_breasts"], features["has_breasts"]) + WRITE_FILE(S["feature_breasts_size"], features["breasts_size"]) + WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"]) + WRITE_FILE(S["feature_breasts_color"], features["breasts_color"]) + WRITE_FILE(S["feature_breasts_producing"], features["breasts_producing"]) + WRITE_FILE(S["feature_breasts_visibility"], features["breasts_visibility"]) + + WRITE_FILE(S["feature_has_vag"], features["has_vag"]) + WRITE_FILE(S["feature_vag_shape"], features["vag_shape"]) + WRITE_FILE(S["feature_vag_color"], features["vag_color"]) + WRITE_FILE(S["feature_vag_visibility"], features["vag_visibility"]) + + WRITE_FILE(S["feature_has_womb"], features["has_womb"]) //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index 87379274b6..74a05488fa 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -265,7 +265,6 @@ var/list/gen_index[GENITAL_LAYER_INDEX_LENGTH] var/list/genitals_to_add var/list/fully_exposed - var/list/somewhat_exposed for(var/obj/item/organ/genital/G in internal_organs) if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes LAZYADD(gen_index[G.layer_index], G) @@ -316,13 +315,9 @@ genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][dna.species.use_skintones ? "_s" : ""]_[aroused_state]_[layertext]" - if(layers_num[layer] == GENITALS_FRONT_LAYER) - if(G.genital_flags & GENITAL_THROUGH_CLOTHES) - genital_overlay.layer = -GENITALS_EXPOSED_LAYER - LAZYADD(fully_exposed, genital_overlay) - else if(!(G.genital_flags & GENITAL_UNDIES_HIDDEN)) - genital_overlay.layer = -GENITALS_NO_UNDIE_LAYER - LAZYADD(somewhat_exposed, genital_overlay) + if(layers_num[layer] == GENITALS_FRONT_LAYER && G.genital_flags & GENITAL_THROUGH_CLOTHES) + genital_overlay.layer = -GENITALS_EXPOSED_LAYER + LAZYADD(fully_exposed, genital_overlay) else genital_overlay.layer = -layers_num[layer] standing += genital_overlay @@ -334,10 +329,6 @@ overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed apply_overlay(GENITALS_EXPOSED_LAYER) - if(LAZYLEN(somewhat_exposed)) - overlays_standing[GENITALS_NO_UNDIE_LAYER] = somewhat_exposed - apply_overlay(GENITALS_NO_UNDIE_LAYER) - for(var/L in relevant_layers) apply_overlay(layers_num[L]) diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 80e20c9f48..d9b902656f 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -44,29 +44,6 @@ WRITE_FILE(S["feature_xeno_tail"], features["xenotail"]) WRITE_FILE(S["feature_xeno_dors"], features["xenodorsal"]) WRITE_FILE(S["feature_xeno_head"], features["xenohead"]) - //cock features - WRITE_FILE(S["feature_has_cock"], features["has_cock"]) - WRITE_FILE(S["feature_cock_shape"], features["cock_shape"]) - WRITE_FILE(S["feature_cock_color"], features["cock_color"]) - WRITE_FILE(S["feature_cock_length"], features["cock_length"]) - WRITE_FILE(S["feature_cock_girth"], features["cock_girth"]) - //balls features - WRITE_FILE(S["feature_has_balls"], features["has_balls"]) - WRITE_FILE(S["feature_balls_color"], features["balls_color"]) - WRITE_FILE(S["feature_balls_size"], features["balls_size"]) - WRITE_FILE(S["feature_balls_shape"], features["balls_shape"]) - //breasts features - WRITE_FILE(S["feature_has_breasts"], features["has_breasts"]) - WRITE_FILE(S["feature_breasts_size"], features["breasts_size"]) - WRITE_FILE(S["feature_breasts_shape"], features["breasts_shape"]) - WRITE_FILE(S["feature_breasts_color"], features["breasts_color"]) - 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"]) - WRITE_FILE(S["feature_vag_color"], features["vag_color"]) - //womb features - WRITE_FILE(S["feature_has_womb"], features["has_womb"]) //flavor text WRITE_FILE(S["feature_flavor_text"], features["flavor_text"]) From 8d6f2fbab537e8522c052dbd081bd8a15b4b3e13 Mon Sep 17 00:00:00 2001 From: Kraseo Date: Wed, 25 Mar 2020 04:05:14 +0100 Subject: [PATCH 023/128] this was a bad idea (#11594) --- code/modules/uplink/uplink_items/uplink_bundles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm index 2fc996c1ed..a748f49322 100644 --- a/code/modules/uplink/uplink_items/uplink_bundles.dm +++ b/code/modules/uplink/uplink_items/uplink_bundles.dm @@ -47,7 +47,7 @@ this suit proves to be cheaper than your standard issue hardsuit, with none of the movement restrictions (or the space proofing) of the outdated spacesuits employed by the company. \ Comes with an armored vest, helmet, blood-red sneaksuit, sneakboots, specialized combat gloves and a high-tech balaclava which obfuscates both your voice and your face. The case is also rather useful as a storage container and bludgeoning implement." item = /obj/item/storage/toolbox/infiltrator - cost = 3 + cost = 5 limited_stock = 1 //you only get one so you don't end up with too many gun cases exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) From b8ef114bcc83835bc98a8e7f06dc5c5d4d66f8a3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 24 Mar 2020 22:05:16 -0500 Subject: [PATCH 024/128] Automatic changelog generation for PR #11594 [ci skip] --- html/changelogs/AutoChangeLog-pr-11594.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11594.yml diff --git a/html/changelogs/AutoChangeLog-pr-11594.yml b/html/changelogs/AutoChangeLog-pr-11594.yml new file mode 100644 index 0000000000..f6de9ad977 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11594.yml @@ -0,0 +1,4 @@ +author: "Kraseo" +delete-after: True +changes: + - balance: "Sneaksuit now costs 5 TC rather than 3." From edfc77fc2a58d723db8f89a9b46d219a6bd6412c Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 04:18:01 +0100 Subject: [PATCH 025/128] Fixes cold movespeed slowdown affecting floating mobs (no gravity). --- code/modules/mob/living/carbon/human/species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d464419b73..a4d0c36ddc 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -2050,7 +2050,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold) //Sorry for the nasty oneline but I don't want to assign a variable on something run pretty frequently - H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR)) + H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR), blacklisted_movetypes = FLOATING) switch(H.bodytemperature) if(200 to BODYTEMP_COLD_DAMAGE_LIMIT) H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN) From c6b4b5f68626f7bc3db9f44fcb824fb3f9410cde Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 05:17:09 +0100 Subject: [PATCH 026/128] lazy fix before I go to sleep. --- .../mob/living/carbon/human/species.dm | 71 +++++++++---------- .../code/modules/arousal/genitals.dm | 2 +- 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d464419b73..c566e16ad9 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -550,48 +550,45 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //Underwear, Undershirts & Socks if(!(NO_UNDERWEAR in species_traits)) - if(H.socks && H.get_num_legs(FALSE) >= 2) - if(H.hidden_socks) - H.socks = "Nude" - else + if(H.socks && !H.hidden_socks && H.get_num_legs(FALSE) >= 2) + if(H.saved_socks) H.socks = H.saved_socks - var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[H.socks] - if(S) - var/digilegs = ((DIGITIGRADE in species_traits) && S.has_digitigrade) ? "_d" : "" - var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER) - if(S.has_color) - MA.color = "#[H.socks_color]" - standing += MA + H.saved_socks = "" + var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[H.socks] + if(S) + var/digilegs = ((DIGITIGRADE in species_traits) && S.has_digitigrade) ? "_d" : "" + var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER) + if(S.has_color) + MA.color = "#[H.socks_color]" + standing += MA - if(H.underwear) - if(H.hidden_underwear) - H.underwear = "Nude" - else + if(H.underwear && !H.hidden_underwear) + if(H.saved_underwear) H.underwear = H.saved_underwear - var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] - if(B) - var/digilegs = ((DIGITIGRADE in species_traits) && B.has_digitigrade) ? "_d" : "" - var/mutable_appearance/MA = mutable_appearance(B.icon, "[B.icon_state][digilegs]", -BODY_LAYER) - if(B.has_color) - MA.color = "#[H.undie_color]" - standing += MA + H.saved_underwear = "" + var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] + if(B) + var/digilegs = ((DIGITIGRADE in species_traits) && B.has_digitigrade) ? "_d" : "" + var/mutable_appearance/MA = mutable_appearance(B.icon, "[B.icon_state][digilegs]", -BODY_LAYER) + if(B.has_color) + MA.color = "#[H.undie_color]" + standing += MA - if(H.undershirt) - if(H.hidden_undershirt) - H.undershirt = "Nude" - else + if(H.undershirt && !H.hidden_undershirt) + if(H.saved_undershirt) H.undershirt = H.saved_undershirt - var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] - if(T) - var/state = "[T.icon_state][((DIGITIGRADE in species_traits) && T.has_digitigrade) ? "_d" : ""]" - var/mutable_appearance/MA - if(H.dna.species.sexes && H.dna.features["body_model"] == FEMALE) - MA = wear_female_version(state, T.icon, BODY_LAYER) - else - MA = mutable_appearance(T.icon, state, -BODY_LAYER) - if(T.has_color) - MA.color = "#[H.shirt_color]" - standing += MA + H.saved_undershirt = "" + var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] + if(T) + var/state = "[T.icon_state][((DIGITIGRADE in species_traits) && T.has_digitigrade) ? "_d" : ""]" + var/mutable_appearance/MA + if(H.dna.species.sexes && H.dna.features["body_model"] == FEMALE) + MA = wear_female_version(state, T.icon, BODY_LAYER) + else + MA = mutable_appearance(T.icon, state, -BODY_LAYER) + if(T.has_color) + MA.color = "#[H.shirt_color]" + standing += MA if(standing.len) H.overlays_standing[BODY_LAYER] = standing diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index 74a05488fa..f65267aa39 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -59,7 +59,7 @@ if(!(NO_UNDERWEAR in H.dna.species.species_traits)) var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] - if(zone == BODY_ZONE_CHEST ? (H.hidden_undershirt || T?.covers_chest || B?.covers_chest) : (H.hidden_underwear || T?.covers_groin || B?.covers_groin)) + if(zone == BODY_ZONE_CHEST ? (!H.hidden_undershirt && (T?.covers_chest || B?.covers_chest)) : (!H.hidden_underwear && (T?.covers_groin || B?.covers_groin))) return FALSE if(genital_flags & GENITAL_THROUGH_CLOTHES) return TRUE From 927852a93a05382cd18433c44afe94a8fedb58c7 Mon Sep 17 00:00:00 2001 From: monster860 Date: Wed, 25 Mar 2020 07:56:57 -0400 Subject: [PATCH 027/128] Make the no-ass-slap message actually display (#11612) --- code/modules/mob/living/carbon/human/species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d464419b73..98a4e279e9 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1556,7 +1556,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if (!HAS_TRAIT(target, TRAIT_PERMABONER)) stop_wagging_tail(target) return FALSE - else if(!(user.client?.prefs.cit_toggles & NO_ASS_SLAP) && aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin)) + else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin)) if(target.client?.prefs.cit_toggles & NO_ASS_SLAP) to_chat(user,"A force stays your hand, preventing you from slapping \the [target]'s ass!") return FALSE From 91aad127dd3045436fdf99cd015f7ef8f6f53826 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 13:54:41 +0100 Subject: [PATCH 028/128] Quick webedit fixing an issue with the split personality. --- code/datums/brain_damage/split_personality.dm | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 6586a065d0..1115a878f8 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -20,6 +20,7 @@ ..() make_backseats() get_ghost() + RegisterSignal(M, COMSIG_MOB_DEATH, .proc/revert_to_normal) /datum/brain_trauma/severe/split_personality/proc/make_backseats() stranger_backseat = new(owner, src) @@ -37,23 +38,23 @@ qdel(src) /datum/brain_trauma/severe/split_personality/on_life() - if(owner.stat == DEAD) - if(current_controller != OWNER) - switch_personalities() - qdel(src) - else if(prob(3)) + if(prob(3)) switch_personalities() ..() /datum/brain_trauma/severe/split_personality/on_lose() if(current_controller != OWNER) //it would be funny to cure a guy only to be left with the other personality, but it seems too cruel - switch_personalities() + switch_personalities(TRUE) QDEL_NULL(stranger_backseat) QDEL_NULL(owner_backseat) + UnregisterSignal(M, COMSIG_MOB_DEATH) ..() -/datum/brain_trauma/severe/split_personality/proc/switch_personalities() - if(QDELETED(owner) || owner.stat == DEAD || QDELETED(stranger_backseat) || QDELETED(owner_backseat)) +/datum/brain_trauma/severe/split_personality/proc/revert_to_normal() + qdel(src) + +/datum/brain_trauma/severe/split_personality/proc/switch_personalities(forced = FALSE) + if(QDELETED(owner) || (owner.stat == DEAD && !forced) || QDELETED(stranger_backseat) || QDELETED(owner_backseat)) return var/mob/living/split_personality/current_backseat @@ -126,10 +127,6 @@ if(QDELETED(body)) qdel(src) //in case trauma deletion doesn't already do it - if((body.stat == DEAD && trauma.owner_backseat == src)) - trauma.switch_personalities() - qdel(trauma) - //if one of the two ghosts, the other one stays permanently if(!body.client && trauma.initialized) trauma.switch_personalities() From 912ec5806d81e12ec40beb5a3235e81d26589899 Mon Sep 17 00:00:00 2001 From: Detective-Google <48196179+Detective-Google@users.noreply.github.com> Date: Wed, 25 Mar 2020 08:17:43 -0500 Subject: [PATCH 029/128] Bringing Our shotguns up to (TG)snuff (#11595) * Makes Citadel shotguns match TG shotgun fire delay * Makes Riot + Combat shotguns require two hands to fire * also makes the 2handed change apply to double barrels and improvs. --- code/modules/projectiles/guns/ballistic/revolver.dm | 2 +- code/modules/projectiles/guns/ballistic/shotgun.dm | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 17dd1341b9..4c9642df51 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -264,7 +264,7 @@ icon_state = "dshotgun" item_state = "shotgun" w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_MEDIUM + weapon_weight = WEAPON_HEAVY force = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 56aebc891d..612896ffb8 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -10,7 +10,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot casing_ejector = FALSE var/recentpump = 0 // to prevent spammage - weapon_weight = WEAPON_MEDIUM + weapon_weight = WEAPON_HEAVY /obj/item/gun/ballistic/shotgun/attackby(obj/item/A, mob/user, params) . = ..() @@ -87,6 +87,7 @@ name = "riot shotgun" desc = "A sturdy shotgun with a longer magazine and a fixed tactical stock designed for non-lethal riot control." icon_state = "riotshotgun" + fire_delay = 7 mag_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." unique_reskin = list("Tatical" = "riotshotgun", @@ -207,7 +208,7 @@ name = "combat shotgun" desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." icon_state = "cshotgun" - fire_delay = 3 + fire_delay = 5 mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE unique_reskin = list("Tatical" = "cshotgun", From 79b408c3892cb754737f13aef35d38f384d0a9cb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 08:17:46 -0500 Subject: [PATCH 030/128] Automatic changelog generation for PR #11595 [ci skip] --- html/changelogs/AutoChangeLog-pr-11595.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11595.yml diff --git a/html/changelogs/AutoChangeLog-pr-11595.yml b/html/changelogs/AutoChangeLog-pr-11595.yml new file mode 100644 index 0000000000..c604c1ac97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11595.yml @@ -0,0 +1,4 @@ +author: "Detective-Google" +delete-after: True +changes: + - balance: "Shotguns are now slower and require two hands to fire." From 84f37092fec9215c0bb13d74346a726f4142c7bf Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Thu, 26 Mar 2020 00:29:32 +1100 Subject: [PATCH 031/128] Prevents being able to fire a russian revolver in your off-hand while dual-wielding. (#11610) --- code/modules/projectiles/guns/ballistic/revolver.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 4c9642df51..7d2910fad3 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -176,6 +176,10 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 var/spun = FALSE +/obj/item/gun/ballistic/revolver/russian/do_spin() + . = ..() + spun = TRUE + /obj/item/gun/ballistic/revolver/russian/Initialize() . = ..() do_spin() @@ -192,7 +196,7 @@ return /obj/item/gun/ballistic/revolver/russian/attack_self(mob/user) - if(!spun && can_shoot()) + if(!spun) spin() spun = TRUE return @@ -217,7 +221,7 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user if(!spun) - to_chat(user, "You need to spin the revolver's chamber first!") + to_chat(user, "You need to spin \the [src]'s chamber first!") return spun = FALSE @@ -238,6 +242,11 @@ user.visible_message("*click*") playsound(src, "gun_dry_fire", 30, 1) +/obj/item/gun/ballistic/revolver/russian/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + add_fingerprint(user) + playsound(src, "gun_dry_fire", 30, TRUE) + user.visible_message("[user.name] tries to fire \the [src] at the same time, but only succeeds at looking like an idiot.", "\The [src]'s anti-combat mechanism prevents you from firing it at the same time!") + /obj/item/gun/ballistic/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = BODY_ZONE_HEAD) user.apply_damage(300, BRUTE, affecting) user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!") From 6f9e9d0be77fdd45758f5ec048121df4ba4996e8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 08:29:35 -0500 Subject: [PATCH 032/128] Automatic changelog generation for PR #11610 [ci skip] --- html/changelogs/AutoChangeLog-pr-11610.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11610.yml diff --git a/html/changelogs/AutoChangeLog-pr-11610.yml b/html/changelogs/AutoChangeLog-pr-11610.yml new file mode 100644 index 0000000000..a3a7714f8f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11610.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - bugfix: "Russian Revolver can no longer be exploited for a free 357." From c05d2c1572d6ba83f4fe402dcf8790313cfd9f8a Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 17:08:09 +0100 Subject: [PATCH 033/128] Making it actually work. --- code/modules/client/preferences.dm | 8 +++--- .../code/modules/arousal/genitals.dm | 27 ++++++++++++------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1b280baa56..424b913ece 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -761,7 +761,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "    Change
    " dat += "Penis Shape: [features["cock_shape"]]" dat += "Penis Length: [features["cock_length"]] inch(es)" - dat += "Penis Visibility:[features["cock_visibility"]]" + dat += "Penis Visibility:[features["cock_visibility"]]" dat += "Has Testicles:[features["has_balls"] == TRUE ? "Yes" : "No"]" if(features["has_balls"]) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) @@ -770,7 +770,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Testicles Color:
    " dat += "    Change
    " - dat += "Testicles Visibility:[features["balls_visibility"]]" + dat += "Testicles Visibility:[features["balls_visibility"]]" dat += APPEARANCE_CATEGORY_COLUMN dat += "

    Vagina

    " dat += "[features["has_vag"] == TRUE ? "Yes" : "No"]" @@ -782,7 +782,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Vagina Color:
    " dat += "    Change
    " - dat += "Vagina Visibility:[features["vag_visibility"]]" + dat += "Vagina Visibility:[features["vag_visibility"]]" dat += "Has Womb:[features["has_womb"] == TRUE ? "Yes" : "No"]" dat += "" dat += APPEARANCE_CATEGORY_COLUMN @@ -797,7 +797,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "    Change
    " dat += "Cup Size:[features["breasts_size"]]" dat += "Breasts Shape:[features["breasts_shape"]]" - dat += "Breasts Visibility:[features["breasts_visibility"]]" + dat += "Breasts Visibility:[features["breasts_visibility"]]" dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]" dat += "" dat += "" diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index f65267aa39..8d505fd06c 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -57,9 +57,9 @@ if(genital_flags & GENITAL_UNDIES_HIDDEN && ishuman(owner)) var/mob/living/carbon/human/H = owner if(!(NO_UNDERWEAR in H.dna.species.species_traits)) - var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] - var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] - if(zone == BODY_ZONE_CHEST ? (!H.hidden_undershirt && (T?.covers_chest || B?.covers_chest)) : (!H.hidden_underwear && (T?.covers_groin || B?.covers_groin))) + var/datum/sprite_accessory/underwear/top/T = H.hidden_undershirt ? null : GLOB.undershirt_list[H.undershirt] + var/datum/sprite_accessory/underwear/bottom/B = H.hidden_underwear ? null : GLOB.underwear_list[H.underwear] + if(zone == BODY_ZONE_CHEST ? (T?.covers_chest || B?.covers_chest) : (!T?.covers_groin || B?.covers_groin)) return FALSE if(genital_flags & GENITAL_THROUGH_CLOTHES) return TRUE @@ -72,17 +72,19 @@ /obj/item/organ/genital/proc/toggle_visibility(visibility, update = TRUE) genital_flags &= ~(GENITAL_THROUGH_CLOTHES|GENITAL_HIDDEN|GENITAL_UNDIES_HIDDEN) - owner.exposed_genitals -= src + if(owner) + owner.exposed_genitals -= src switch(visibility) if(GEN_VISIBLE_ALWAYS) genital_flags |= GENITAL_THROUGH_CLOTHES - owner.exposed_genitals += src + if(owner) + owner.exposed_genitals += src if(GEN_VISIBLE_NO_UNDIES) genital_flags |= GENITAL_UNDIES_HIDDEN if(GEN_VISIBLE_NEVER) genital_flags |= GENITAL_HIDDEN - if(update && ishuman(owner)) //recast to use update genitals proc + if(update && owner && ishuman(owner)) //recast to use update genitals proc var/mob/living/carbon/human/H = owner H.update_genitals() @@ -191,14 +193,19 @@ if(.) update() RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance) + if(genital_flags & GENITAL_THROUGH_CLOTHES) + owner.exposed_genitals += src /obj/item/organ/genital/Remove(special = FALSE) . = ..() - var/mob/living/carbon/human/H = . + var/mob/living/carbon/C = . update() - if(!QDELETED(H)) - UnregisterSignal(H, COMSIG_MOB_DEATH) - H.update_genitals() + if(!QDELETED(C)) + if(genital_flags & UPDATE_OWNER_APPEARANCE && ishuman(C)) + var/mob/living/carbon/human/H = . + H.update_genitals() + C.exposed_genitals -= src + UnregisterSignal(C, COMSIG_MOB_DEATH) //proc to give a player their genitals and stuff when they log in /mob/living/carbon/human/proc/give_genitals(clean = FALSE)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA From ddf4d759bdc5dbda4ef6f290ca6060dd2d5887f7 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 17:25:23 +0100 Subject: [PATCH 034/128] Now locally tested too and it works fine. --- modular_citadel/code/modules/arousal/genitals.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index 8d505fd06c..7705dcafd1 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -59,7 +59,7 @@ if(!(NO_UNDERWEAR in H.dna.species.species_traits)) var/datum/sprite_accessory/underwear/top/T = H.hidden_undershirt ? null : GLOB.undershirt_list[H.undershirt] var/datum/sprite_accessory/underwear/bottom/B = H.hidden_underwear ? null : GLOB.underwear_list[H.underwear] - if(zone == BODY_ZONE_CHEST ? (T?.covers_chest || B?.covers_chest) : (!T?.covers_groin || B?.covers_groin)) + if(zone == BODY_ZONE_CHEST ? (T?.covers_chest || B?.covers_chest) : (T?.covers_groin || B?.covers_groin)) return FALSE if(genital_flags & GENITAL_THROUGH_CLOTHES) return TRUE From 3d8084709bda910d548eb221a4a18b30fbd2750a Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Wed, 25 Mar 2020 09:40:37 -0700 Subject: [PATCH 035/128] A dynamic rework: target threat levels (#11515) * Starting a replacement of how threat works. * no, we do it this way * Added threat levels to jobs * Added threat to... a lot. * Updated for traitor classes. * Fixed errors, except for one. It's consistently giving me "maximum number of internal arrays exceeded (65535)". I have no idea what could be causing this. * Added type annotation to GetJob. * This one I should change though * wow how'd that happen * spammable means low threat * Made story threat have initial threat level on average * Made somet rulesets force if they won the vote * ) * Gave EVERY job threat, added a config for it. * Rebalanced some numbers * Update code/game/gamemodes/dynamic/dynamic_storytellers.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * Removes mush threat * Makes devil threat scale with form * reviewing reviewer's review of reviewer * Gutlunches can be friendly spawned, so no * Also made forced-friendly mobs not count Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/dynamic.dm | 1 + code/__DEFINES/maths.dm | 2 + .../configuration/entries/game_options.dm | 4 + code/controllers/subsystem/job.dm | 3 +- code/controllers/subsystem/vote.dm | 8 +- code/game/gamemodes/dynamic/dynamic.dm | 53 ++--- .../gamemodes/dynamic/dynamic_rulesets.dm | 7 +- .../dynamic/dynamic_rulesets_midround.dm | 5 - .../dynamic/dynamic_rulesets_roundstart.dm | 1 - .../gamemodes/dynamic/dynamic_storytellers.dm | 202 ++++++++++++------ code/game/gamemodes/gangs/gang.dm | 4 +- .../antagonists/_common/antag_datum.dm | 5 + code/modules/antagonists/abductor/abductor.dm | 1 + code/modules/antagonists/blob/blob.dm | 4 +- .../antagonists/blob/blob/blobs/blob_mobs.dm | 1 + .../bloodsucker/datum_bloodsucker.dm | 8 +- .../antagonists/bloodsucker/datum_hunter.dm | 3 + .../antagonists/bloodsucker/datum_vassal.dm | 1 + code/modules/antagonists/brother/brother.dm | 1 + .../antagonists/changeling/changeling.dm | 1 + .../antagonists/clockcult/clock_mobs.dm | 1 + .../clock_mobs/clockwork_marauder.dm | 1 + .../antagonists/clockcult/clockcult.dm | 1 + code/modules/antagonists/cult/cult.dm | 1 + code/modules/antagonists/devil/devil.dm | 5 +- code/modules/antagonists/devil/imp/imp.dm | 3 +- .../devil/sintouched/sintouched.dm | 9 +- .../antagonists/disease/disease_abilities.dm | 25 ++- .../antagonists/disease/disease_datum.dm | 8 + code/modules/antagonists/ert/ert.dm | 1 + code/modules/antagonists/greybois/greybois.dm | 1 + .../antagonists/highlander/highlander.dm | 2 +- code/modules/antagonists/monkey/monkey.dm | 2 + code/modules/antagonists/morph/morph_antag.dm | 3 +- .../antagonists/nightmare/nightmare.dm | 3 +- code/modules/antagonists/ninja/ninja.dm | 3 + code/modules/antagonists/nukeop/clownop.dm | 1 + code/modules/antagonists/nukeop/nukeop.dm | 1 + .../antagonists/overthrow/overthrow.dm | 1 + code/modules/antagonists/pirate/pirate.dm | 3 +- .../antagonists/revenant/revenant_antag.dm | 1 + .../antagonists/revolution/revolution.dm | 2 + .../antagonists/slaughter/slaughter_antag.dm | 3 +- .../antagonists/survivalist/survivalist.dm | 1 + code/modules/antagonists/swarmer/swarmer.dm | 1 + .../modules/antagonists/traitor/classes/ai.dm | 1 + .../antagonists/traitor/classes/assassin.dm | 2 +- .../antagonists/traitor/classes/hijack.dm | 2 +- .../antagonists/traitor/classes/martyr.dm | 2 +- .../traitor/classes/traitor_class.dm | 2 +- .../antagonists/traitor/datum_traitor.dm | 11 +- .../antagonists/wishgranter/wishgranter.dm | 3 +- .../antagonists/wizard/equipment/spellbook.dm | 42 ---- code/modules/antagonists/wizard/wizard.dm | 1 + code/modules/antagonists/xeno/xeno.dm | 3 +- code/modules/events/_event.dm | 7 +- code/modules/events/brand_intelligence.dm | 1 + code/modules/events/meteor_wave.dm | 4 + code/modules/events/pirates.dm | 16 +- code/modules/events/wizard/magicarp.dm | 2 + code/modules/events/wizard/race.dm | 3 +- code/modules/holiday/halloween/halloween.dm | 1 + code/modules/jobs/job_types/_job.dm | 7 + code/modules/jobs/job_types/ai.dm | 1 + code/modules/jobs/job_types/assistant.dm | 1 + .../jobs/job_types/atmospheric_technician.dm | 1 + code/modules/jobs/job_types/bartender.dm | 1 + code/modules/jobs/job_types/botanist.dm | 1 + code/modules/jobs/job_types/captain.dm | 3 +- .../jobs/job_types/cargo_technician.dm | 1 + code/modules/jobs/job_types/chaplain.dm | 1 + code/modules/jobs/job_types/chemist.dm | 1 + code/modules/jobs/job_types/chief_engineer.dm | 1 + .../jobs/job_types/chief_medical_officer.dm | 1 + code/modules/jobs/job_types/clown.dm | 1 + code/modules/jobs/job_types/cook.dm | 1 + code/modules/jobs/job_types/curator.dm | 1 + code/modules/jobs/job_types/detective.dm | 1 + code/modules/jobs/job_types/geneticist.dm | 1 + .../jobs/job_types/head_of_personnel.dm | 2 + .../jobs/job_types/head_of_security.dm | 1 + code/modules/jobs/job_types/janitor.dm | 1 + code/modules/jobs/job_types/lawyer.dm | 1 + code/modules/jobs/job_types/medical_doctor.dm | 1 + code/modules/jobs/job_types/mime.dm | 2 + code/modules/jobs/job_types/paramedic.dm | 2 + code/modules/jobs/job_types/quartermaster.dm | 1 + .../jobs/job_types/research_director.dm | 1 + code/modules/jobs/job_types/roboticist.dm | 1 + code/modules/jobs/job_types/scientist.dm | 1 + .../jobs/job_types/security_officer.dm | 1 + code/modules/jobs/job_types/shaft_miner.dm | 2 + .../jobs/job_types/station_engineer.dm | 2 + code/modules/jobs/job_types/virologist.dm | 2 + code/modules/jobs/job_types/warden.dm | 1 + .../mob/living/simple_animal/constructs.dm | 3 + .../living/simple_animal/guardian/guardian.dm | 1 + .../mob/living/simple_animal/hostile/alien.dm | 4 + .../mob/living/simple_animal/hostile/bear.dm | 1 + .../mob/living/simple_animal/hostile/bees.dm | 1 + .../simple_animal/hostile/bosses/boss.dm | 3 +- .../mob/living/simple_animal/hostile/carp.dm | 5 +- .../simple_animal/hostile/dark_wizard.dm | 3 +- .../living/simple_animal/hostile/eyeballs.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 1 + .../simple_animal/hostile/giant_spider.dm | 1 + .../simple_animal/hostile/gorilla/gorilla.dm | 3 +- .../living/simple_animal/hostile/headcrab.dm | 1 + .../living/simple_animal/hostile/hostile.dm | 4 + .../simple_animal/hostile/jungle/leaper.dm | 1 + .../hostile/jungle/mega_arachnid.dm | 1 + .../simple_animal/hostile/jungle/mook.dm | 1 + .../simple_animal/hostile/jungle/seedling.dm | 1 + .../simple_animal/hostile/killertomato.dm | 1 + .../hostile/megafauna/blood_drunk_miner.dm | 1 + .../hostile/megafauna/bubblegum.dm | 1 + .../hostile/megafauna/colossus.dm | 2 + .../simple_animal/hostile/megafauna/drake.dm | 1 + .../hostile/megafauna/hierophant.dm | 1 + .../simple_animal/hostile/megafauna/legion.dm | 1 + .../hostile/mining_mobs/basilisk.dm | 1 + .../hostile/mining_mobs/curse_blob.dm | 1 + .../hostile/mining_mobs/elites/elite.dm | 1 + .../mining_mobs/elites/goliath_broodmother.dm | 1 + .../hostile/mining_mobs/elites/herald.dm | 1 + .../hostile/mining_mobs/elites/legionnaire.dm | 1 + .../hostile/mining_mobs/elites/pandora.dm | 1 + .../hostile/mining_mobs/goldgrub.dm | 1 + .../hostile/mining_mobs/goliath.dm | 1 + .../hostile/mining_mobs/hivelord.dm | 2 + .../simple_animal/hostile/netherworld.dm | 1 + .../living/simple_animal/hostile/pirate.dm | 1 + .../living/simple_animal/hostile/russian.dm | 1 + .../living/simple_animal/hostile/sharks.dm | 1 + .../living/simple_animal/hostile/skeleton.dm | 4 + .../living/simple_animal/hostile/statue.dm | 2 +- .../living/simple_animal/hostile/stickman.dm | 1 + .../living/simple_animal/hostile/syndicate.dm | 1 + .../mob/living/simple_animal/hostile/tree.dm | 1 + .../simple_animal/hostile/venus_human_trap.dm | 1 + .../living/simple_animal/hostile/wizard.dm | 1 + .../simple_animal/hostile/wumborian_fugu.dm | 1 + .../living/simple_animal/hostile/zombie.dm | 1 + .../ruins/spaceruin_code/clericsden.dm | 1 + config/config.txt | 1 + config/job_threats.txt | 5 + 146 files changed, 434 insertions(+), 194 deletions(-) create mode 100644 config/job_threats.txt diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index 0d57961f48..ae5b031c8b 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -6,6 +6,7 @@ #define NO_ASSASSIN (1<<0) #define WAROPS_ALWAYS_ALLOWED (1<<1) #define USE_PREF_WEIGHTS (1<<2) +#define FORCE_IF_WON (1<<3) #define ONLY_RULESET (1<<0) #define HIGHLANDER_RULESET (1<<1) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 6d263473b0..29f26e4500 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -203,5 +203,7 @@ #define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y)) +#define LOGISTIC_FUNCTION(L,k,x,x_0) (L/(1+(NUM_E**(-k*(x-x_0))))) + /// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. #define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index bc290bedb9..2b4822a013 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -396,6 +396,10 @@ key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_NUM +/datum/config_entry/keyed_list/job_threat + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + /datum/config_entry/number/monkeycap config_entry_value = 64 min_val = 0 diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 31e436f206..91d0db85d1 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -66,6 +66,7 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/GetJob(rank) + RETURN_TYPE(/datum/job) if(!occupations.len) SetupOccupations() return name_occupations[rank] @@ -738,4 +739,4 @@ SUBSYSTEM_DEF(job) . |= player.mind /datum/controller/subsystem/job/proc/JobDebug(message) - log_job_debug(message) \ No newline at end of file + log_job_debug(message) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index e7e5754f6b..e16c6d5fb3 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -354,11 +354,15 @@ SUBSYSTEM_DEF(vote) return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") GLOB.master_mode = "dynamic" var/list/runnable_storytellers = config.get_runnable_storytellers() + var/datum/dynamic_storyteller/picked for(var/T in runnable_storytellers) var/datum/dynamic_storyteller/S = T + if(stored_gamemode_votes[initial(S.name)] == 1 && CHECK_BITFIELD(initial(S.flags), FORCE_IF_WON)) + picked = S runnable_storytellers[S] *= round(stored_gamemode_votes[initial(S.name)]*100000,1) - var/datum/dynamic_storyteller/S = pickweightAllowZero(runnable_storytellers) - GLOB.dynamic_storyteller_type = S + if(!picked) + picked = pickweightAllowZero(runnable_storytellers) + GLOB.dynamic_storyteller_type = picked if("map") var/datum/map_config/VM = config.maplist[.] message_admins("The map has been voted for and will change to: [VM.map_name]") diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 4c3ef824b9..58dfd6d814 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -54,9 +54,9 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) // Current storyteller var/datum/dynamic_storyteller/storyteller = null // Threat logging vars - /// The "threat cap", threat shouldn't normally go above this and is used in ruleset calculations + /// Target threat level right now. Events and antags will try to keep the round at this level. var/threat_level = 0 - /// Set at the beginning of the round. Spent by the mode to "purchase" rules. + /// The current antag threat. Recalculated every time a ruletype starts or ends. var/threat = 0 /// Starting threat level, for things that increase it but can bring it back down. var/initial_threat_level = 0 @@ -261,11 +261,11 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) . += "Uncharted Space
    " . += "Congratulations and thank you for participating in the NT 'Frontier' space program! Your station is actively orbiting a high value system far from the nearest support stations. Little is known about your region of space, and the opportunity to encounter the unknown invites greater glory. You are encouraged to elevate security as necessary to protect Nanotrasen assets." set_security_level(SEC_LEVEL_BLUE) - if(80 to 99) + if(80 to 95) . += "Black Orbit
    " . += "As part of a mandatory security protocol, we are required to inform you that as a result of your orbital pattern directly behind an astrological body (oriented from our nearest observatory), your station will be under decreased monitoring and support. It is anticipated that your extreme location and decreased surveillance could pose security risks. Avoid unnecessary risks and attempt to keep your station in one piece." set_security_level(SEC_LEVEL_AMBER) - if(100) + if(96 to 100) . += "Impending Doom
    " . += "Your station is somehow in the middle of hostile territory, in clear view of any enemy of the corporation. Your likelihood to survive is low, and station destruction is expected and almost inevitable. Secure any sensitive material and neutralize any enemy you will come across. It is important that you at least try to maintain the station.
    " . += "Good luck." @@ -330,7 +330,6 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, GLOB.dynamic_curve_centre, GLOB.dynamic_curve_width), 0.01)*100 - threat = threat_level SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Initial threat level") SSblackbox.record_feedback("tally","dynamic_threat",GLOB.dynamic_curve_centre,"Curve centre") SSblackbox.record_feedback("tally","dynamic_threat",GLOB.dynamic_curve_width,"Curve width") @@ -463,7 +462,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) log_game("DYNAMIC: Additional ruleset picked successfully, now [executed_rules.len] picked. [extra_rulesets_amount] remaining.") else - if(threat >= 50) + if(threat_level >= 50) message_admins("DYNAMIC: Picking first roundstart ruleset failed. You should report this.") log_game("DYNAMIC: Picking first roundstart ruleset failed. drafted_rules.len = [drafted_rules.len] and threat = [threat]/[threat_level]") return FALSE @@ -509,9 +508,8 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) drafted_rules -= starting_rule starting_rule.trim_candidates() - var/added_threat = starting_rule.scale_up(extra_rulesets_amount, threat) + starting_rule.scale_up(extra_rulesets_amount, threat) if (starting_rule.pre_execute()) - spend_threat(starting_rule.cost + added_threat) log_threat("[starting_rule.ruletype] - [starting_rule.name] -[starting_rule.cost + starting_rule.scaled_times * starting_rule.scaling_cost] threat", verbose = TRUE) if(starting_rule.flags & HIGHLANDER_RULESET) highlander_executed = TRUE @@ -534,8 +532,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) /datum/game_mode/dynamic/proc/execute_roundstart_rule(sent_rule) var/datum/dynamic_ruleset/rule = sent_rule if(rule.execute()) - if(rule.persistent) - current_rules += rule + current_rules += rule SSblackbox.record_feedback("associative","dynamic_rulesets",1,rule.get_blackbox_info()) return TRUE rule.clean_up() // Refund threat, delete teams and so on. @@ -607,7 +604,6 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) if ((forced || (new_rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && new_rule.cost <= threat))) new_rule.trim_candidates() if (new_rule.ready(forced)) - spend_threat(new_rule.cost) log_threat("[new_rule.ruletype] - [new_rule.name] -[new_rule.cost] threat", verbose = TRUE) if (new_rule.execute()) // This should never fail since ready() returned 1 if(new_rule.flags & HIGHLANDER_RULESET) @@ -617,8 +613,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) log_game("DYNAMIC: Making a call to a specific ruleset...[new_rule.name]!") SSblackbox.record_feedback("associative","dynamic_rulesets",1,new_rule.get_blackbox_info()) executed_rules += new_rule - if (new_rule.persistent) - current_rules += new_rule + current_rules += new_rule return TRUE else if (forced) log_game("DYNAMIC: The ruleset [new_rule.name] couldn't be executed due to lack of eligible players.") @@ -629,7 +624,6 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) var/datum/dynamic_ruleset/rule = sent_rule if (rule.execute()) log_game("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].") - spend_threat(rule.cost) log_threat("[rule.ruletype] [rule.name] spent [rule.cost]", verbose = TRUE) if(rule.flags & HIGHLANDER_RULESET) highlander_executed = TRUE @@ -647,9 +641,9 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) return TRUE stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.") return FALSE - + /datum/game_mode/dynamic/process() - if (pop_last_updated < world.time - (60 SECONDS)) + if (pop_last_updated < world.time - (120 SECONDS)) pop_last_updated = world.time update_playercounts() @@ -658,7 +652,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) current_rules -= rule SSblackbox.record_feedback("tally","dynamic",1,"Rulesets finished") SSblackbox.record_feedback("associative","dynamic_rulesets_finished",1,rule.get_blackbox_info()) - + storyteller.do_process() if (midround_injection_cooldown < world.time) @@ -717,6 +711,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) current_players[CURRENT_OBSERVERS].Add(M) continue current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow) + threat = storyteller.calculate_threat() + 50 // 50 is the centerpoint, so we want it to be around 50 /// Removes type from the list /datum/game_mode/dynamic/proc/remove_from_list(list/type_list, type) @@ -767,23 +762,21 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) SSblackbox.record_feedback("tally","dynamic",1,"Successful latejoin injections") latejoin_injection_cooldown = storyteller.get_latejoin_cooldown() + world.time -/// Refund threat, but no more than threat_level. -/datum/game_mode/dynamic/proc/refund_threat(regain) - threat = min(threat_level,threat+regain) - SSblackbox.record_feedback("tally","dynamic_threat",regain,"Refunded threat") - log_threat("[regain] refunded. Threat is now [threat].", verbose = TRUE) - -/// Generate threat and increase the threat_level if it goes beyond, capped at 100 +/// Increase the threat level. /datum/game_mode/dynamic/proc/create_threat(gain) - threat = min(100, threat+gain) - if(threat > threat_level) - threat_level = threat + threat_level += gain SSblackbox.record_feedback("tally","dynamic_threat",gain,"Created threat") - log_threat("[gain] created. Threat is now [threat] and threat level is now [threat_level].", verbose = TRUE) + log_threat("[gain] created. Threat level is now [threat_level].", verbose = TRUE) -/// Expend threat, can't fall under 0. +/// Decrease the threat level. +/datum/game_mode/dynamic/proc/remove_threat(loss) + threat_level -= loss + SSblackbox.record_feedback("tally","dynamic_threat",loss,"Removed threat") + log_threat("[loss] removed. Threat level is now [threat_level].", verbose = TRUE) + +/// Fill up more of the threat level. /datum/game_mode/dynamic/proc/spend_threat(cost) - threat = max(threat-cost,0) + threat += cost SSblackbox.record_feedback("tally","dynamic_threat",cost,"Threat spent") log_threat("[cost] spent. Threat is now [threat].", verbose = TRUE) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 2f143f7233..eb7da2144f 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -174,8 +174,8 @@ /// This is called if persistent variable is true everytime SSTicker ticks. /datum/dynamic_ruleset/proc/rule_process() - return - + return TRUE + /// Called on game mode pre_setup for roundstart rulesets. /// Do everything you need to do before job is assigned here. /// IMPORTANT: ASSIGN special_role HERE @@ -201,8 +201,7 @@ /// Runs from gamemode process() if ruleset fails to start, like delayed rulesets not getting valid candidates. /// This one only handles refunding the threat, override in ruleset to clean up the rest. /datum/dynamic_ruleset/proc/clean_up() - mode.refund_threat(cost + (scaled_times * scaling_cost)) - mode.log_threat("[ruletype] [name] refunded [cost + (scaled_times * scaling_cost)]",verbose=TRUE) + return /// Gets weight of the ruleset /// Note that this decreases weight if repeatable is TRUE and repeatable_weight_decrease is higher than 0 diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 638d8b53b6..15c531b15d 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -315,7 +315,6 @@ /datum/dynamic_ruleset/midround/from_ghosts/wizard name = "Wizard" config_tag = "midround_wizard" - persistent = TRUE antag_datum = /datum/antagonist/wizard antag_flag = ROLE_WIZARD enemy_roles = list("Security Officer","Detective","Head of Security", "Captain") @@ -344,7 +343,6 @@ /datum/dynamic_ruleset/midround/from_ghosts/wizard/rule_process() // i can literally copy this from are_special_antags_dead it's great if(isliving(wizard.current) && wizard.current.stat!=DEAD) return FALSE - for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead() if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard)) return FALSE @@ -666,9 +664,6 @@ Mind.transfer_to(Ninja) var/datum/antagonist/ninja/ninjadatum = new ninjadatum.helping_station = pick(TRUE,FALSE) - if(ninjadatum.helping_station) - mode.refund_threat(cost+5) - mode.log_threat("Ninja was helping station; [cost+5] cost refunded.") Mind.add_antag_datum(ninjadatum) if(Ninja.mind != Mind) //something has gone wrong! diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 2527c83077..8b44abbe03 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -802,7 +802,6 @@ /datum/dynamic_ruleset/roundstart/bloodsucker name = "Bloodsuckers" config_tag = "bloodsucker" - persistent = TRUE antag_flag = ROLE_BLOODSUCKER antag_datum = ANTAG_DATUM_BLOODSUCKER minimum_required_age = 0 diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index d25416a4d1..63fd12f47a 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -5,17 +5,18 @@ var/list/property_weights = list() // See below. var/curve_centre = 0 // As GLOB.dynamic_curve_centre. var/curve_width = 1.8 // As GLOB.dynamic_curve_width. - var/forced_threat_level = -1 + var/forced_threat_level = -1 // As GLOB.dynamic_forced_threat_level /* NO_ASSASSIN: Will not have permanent assassination targets. WAROPS_ALWAYS_ALLOWED: Can always do warops, regardless of threat level. USE_PREF_WEIGHTS: Will use peoples' preferences to change the threat centre. + FORCE_IF_WON: If this mode won the vote, forces it */ var/flags = 0 + var/dead_player_weight = 1 // How much dead players matter for threat calculation var/weight = 3 // Weights for randomly picking storyteller. Multiplied by score after voting. var/event_frequency_lower = 6 MINUTES // How rare events will be, at least. var/event_frequency_upper = 20 MINUTES // How rare events will be, at most. - var/pop_antag_ratio = 5 // How many non-antags there should be vs antags. var/datum/game_mode/dynamic/mode = null // Cached as soon as it's made, by dynamic. /** @@ -39,6 +40,27 @@ Property weights are: var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) mode.event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) +/datum/dynamic_storyteller/proc/calculate_threat() + var/threat = 0 + for(var/datum/antagonist/A in GLOB.antagonists) + if(A?.owner?.current && A.owner.current.stat != DEAD) + threat += A.threat() + for(var/r in SSevents.running) + var/datum/round_event/R = r + threat += R.threat() + for(var/mob/living/simple_animal/hostile/H in GLOB.mob_living_list) + var/turf/T = get_turf(H) + if(H.stat != DEAD && is_station_level(T.z) && !("Station" in H.faction)) + threat += H.threat() + for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS]) + if (M.stat != DEAD && M.mind && M.mind.assigned_role) + if(length(M.mind.antag_datums)) + threat += SSjob.GetJob(M.mind.assigned_role).GetThreat() + else + threat -= SSjob.GetJob(M.mind.assigned_role).GetThreat() + threat += (mode.current_players[CURRENT_DEAD_PLAYERS].len)*dead_player_weight + return round(threat,0.1) + /datum/dynamic_storyteller/proc/do_process() return @@ -83,25 +105,9 @@ Property weights are: if(mode.forced_injection) mode.forced_injection = !dry_run return 100 - var/chance = 0 - // If the high pop override is in effect, we reduce the impact of population on the antag injection chance - var/high_pop_factor = (mode.current_players[CURRENT_LIVING_PLAYERS].len >= GLOB.dynamic_high_pop_limit) - var/max_pop_per_antag = max(pop_antag_ratio,15 - round(mode.threat_level/10) - round(mode.current_players[CURRENT_LIVING_PLAYERS].len/(high_pop_factor ? 10 : 5))) - if (!mode.current_players[CURRENT_LIVING_ANTAGS].len) - chance += 80 // No antags at all? let's boost those odds! - else - var/current_pop_per_antag = mode.current_players[CURRENT_LIVING_PLAYERS].len / mode.current_players[CURRENT_LIVING_ANTAGS].len - if (current_pop_per_antag > max_pop_per_antag) - chance += min(50, 25+10*(current_pop_per_antag-max_pop_per_antag)) - else - chance += 25-10*(max_pop_per_antag-current_pop_per_antag) - if (mode.current_players[CURRENT_DEAD_PLAYERS].len > mode.current_players[CURRENT_LIVING_PLAYERS].len) - chance -= 30 // More than half the crew died? ew, let's calm down on antags - if (mode.threat > 70) - chance += 15 - if (mode.threat < 30) - chance -= 15 - return round(max(0,chance)) + var/threat_perc = mode.threat/mode.threat_level + + return round(max(0,100*(1-(threat_perc*threat_perc*threat_perc)))) /datum/dynamic_storyteller/proc/roundstart_draft() var/list/drafted_rules = list() @@ -114,32 +120,41 @@ Property weights are: for(var/property in property_weights) if(property in rule.property_weights) // just treat it as 0 if it's not in there property_weight += rule.property_weights[property] * property_weights[property] - drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult + drafted_rules[rule] = (rule.get_weight() * property_weight)*rule.weight_mult return drafted_rules /datum/dynamic_storyteller/proc/midround_draft() var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/midround/rule in mode.midround_rules) // if there are antags OR the rule is an antag rule, antag_acceptable will be true. - if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && mode.threat >= rule.cost) + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) // Classic secret : only autotraitor/minor roles if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) continue rule.trim_candidates() + var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat)) + /* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to + pick this particular ruleset. + Let's use a toy example: there's 60 threat level and 10 threat spent. + We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets. + Ruleset 1 has 30 cost, ruleset 2 has 5 cost. + When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1 + is 2.26 times as likely to be picked, all other things considered. + Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight. + */ + var/threat_weight = 1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0)) if (rule.ready()) var/property_weight = 0 for(var/property in property_weights) if(property in rule.property_weights) property_weight += rule.property_weights[property] * property_weights[property] - drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult - else if(mode.threat < rule.cost) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") + drafted_rules[rule] = round(((rule.get_weight() * property_weight)*rule.weight_mult*threat_weight)*1000,1) return drafted_rules /datum/dynamic_storyteller/proc/latejoin_draft(mob/living/carbon/human/newPlayer) var/list/drafted_rules = list() for (var/datum/dynamic_ruleset/latejoin/rule in mode.latejoin_rules) - if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && mode.threat >= rule.cost) + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level - mode.threat)) // Classic secret : only autotraitor/minor roles if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) continue @@ -150,56 +165,53 @@ Property weights are: rule.candidates = list(newPlayer) rule.trim_candidates() + var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat)) + var/threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,cost_difference,0))) if (rule.ready()) var/property_weight = 0 for(var/property in property_weights) if(property in rule.property_weights) property_weight += rule.property_weights[property] * property_weights[property] - drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult - else if(mode.threat < rule.cost) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") + drafted_rules[rule] = round(((rule.get_weight() * property_weight)*rule.weight_mult*threat_weight)*1000,1) return drafted_rules /datum/dynamic_storyteller/proc/event_draft() var/list/drafted_rules = list() for(var/datum/dynamic_ruleset/event/rule in mode.events) - if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && mode.threat >= rule.cost) + if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && (mode.threat_level - mode.threat) >= rule.cost) if(rule.ready()) var/property_weight = 0 for(var/property in property_weights) if(property in rule.property_weights) property_weight += rule.property_weights[property] * property_weights[property] drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult - else if(mode.threat < rule.cost) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") return drafted_rules -/datum/dynamic_storyteller/cowabunga +/datum/dynamic_storyteller/chaotic name = "Chaotic" config_tag = "chaotic" curve_centre = 10 desc = "High chaos modes. Revs, wizard, clock cult. Multiple antags at once. Chaos is kept up all round." - property_weights = list("extended" = -1, "chaos" = 10) + property_weights = list("extended" = -1, "chaos" = 2) weight = 1 event_frequency_lower = 2 MINUTES event_frequency_upper = 10 MINUTES - flags = WAROPS_ALWAYS_ALLOWED - pop_antag_ratio = 4 + flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON var/refund_cooldown = 0 -/datum/dynamic_storyteller/cowabunga/get_midround_cooldown() +/datum/dynamic_storyteller/chaotic/do_process() + if(refund_cooldown < world.time) + mode.create_threat(20) + mode.log_threat("Chaotic storyteller ramped up the chaos. Threat level is now [mode.threat_level].") + refund_cooldown = world.time + 20 MINUTES + +/datum/dynamic_storyteller/chaotic/get_midround_cooldown() return ..() / 4 -/datum/dynamic_storyteller/cowabunga/get_latejoin_cooldown() +/datum/dynamic_storyteller/chaotic/get_latejoin_cooldown() return ..() / 4 -/datum/dynamic_storyteller/cowabunga/do_process() - if(refund_cooldown < world.time) - mode.refund_threat(40) - mode.log_threat("Chaotic storyteller refunded 40 threat. Threat is now [mode.threat].") - refund_cooldown = world.time + 1200 SECONDS - /datum/dynamic_storyteller/team name = "Teamwork" config_tag = "teamwork" @@ -223,23 +235,93 @@ Property weights are: flags = WAROPS_ALWAYS_ALLOWED property_weights = list("valid" = 1, "conversion" = 20) -/datum/dynamic_storyteller/classic +/datum/dynamic_storyteller/random name = "Random" config_tag = "random" - desc = "No special weights attached. Anything goes." - weight = 4 - curve_width = 4 - pop_antag_ratio = 7 - flags = USE_PREF_WEIGHTS + weight = 1 + desc = "No weighting at all; every ruleset has the same chance of happening. Cooldowns vary wildly. As random as it gets." + forced_threat_level = 100 + +/datum/dynamic_storyteller/random/get_midround_cooldown() + return rand(GLOB.dynamic_midround_delay_min/2, GLOB.dynamic_midround_delay_max*2) + +/datum/dynamic_storyteller/random/get_event_cooldown() + return rand(GLOB.dynamic_event_delay_min/2, GLOB.dynamic_event_delay_max*2) + +/datum/dynamic_storyteller/random/get_latejoin_cooldown() + return rand(GLOB.dynamic_latejoin_delay_min/2, GLOB.dynamic_latejoin_delay_max*2) + +/datum/dynamic_storyteller/random/get_injection_chance() + return 50 // i would do rand(0,100) but it's actually the same thing when you do the math + +/datum/dynamic_storyteller/random/calculate_threat() + return 0 // what IS threat + +/datum/dynamic_storyteller/random/roundstart_draft() + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/roundstart/rule in mode.roundstart_rules) + if (rule.acceptable(mode.roundstart_pop_ready, mode.threat_level)) // If we got the population and threat required + rule.candidates = mode.candidates.Copy() + rule.trim_candidates() + if (rule.ready() && rule.candidates.len > 0) + drafted_rules[rule] = 1 + return drafted_rules + +/datum/dynamic_storyteller/random/midround_draft() + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/midround/rule in mode.midround_rules) + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) + // Classic secret : only autotraitor/minor roles + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + continue + rule.trim_candidates() + if (rule.ready()) + drafted_rules[rule] = 1 + return drafted_rules + +/datum/dynamic_storyteller/random/latejoin_draft(mob/living/carbon/human/newPlayer) + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/latejoin/rule in mode.latejoin_rules) + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) + // Classic secret : only autotraitor/minor roles + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + continue + // No stacking : only one round-ender, unless threat level > stacking_limit. + if (mode.threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(rule.flags & HIGHLANDER_RULESET && mode.highlander_executed) + continue + rule.candidates = list(newPlayer) + rule.trim_candidates() + if (rule.ready()) + drafted_rules[rule] = 1 + return drafted_rules + +/datum/dynamic_storyteller/random/event_draft() + var/list/drafted_rules = list() + for(var/datum/dynamic_ruleset/event/rule in mode.events) + if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) + if(rule.ready()) + drafted_rules[rule] = 1 + return drafted_rules /datum/dynamic_storyteller/story name = "Story" config_tag = "story" - desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies." + desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies. Has a buildup-climax-falling action threat curve." weight = 2 curve_width = 2 - pop_antag_ratio = 7 - property_weights = list("story_potential" = 10) + property_weights = list("story_potential" = 2) + + +/datum/dynamic_storyteller/story/do_process() + var/current_time = (world.time / SSautotransfer.targettime)*180 + mode.threat_level = round(mode.initial_threat_level*(sin(current_time)+0.5),0.1) + +/datum/dynamic_storyteller/classic + name = "Classic" + config_tag = "classic" + desc = "No special antagonist weights. Good variety, but not like random. Uses your chaos preference to weight." + flags = USE_PREF_WEIGHTS /datum/dynamic_storyteller/suspicion name = "Intrigue" @@ -247,8 +329,8 @@ Property weights are: desc = "Antags that instill distrust in the crew. Traitors, bloodsuckers." weight = 2 curve_width = 2 - pop_antag_ratio = 7 - property_weights = list("trust" = -5) + dead_player_weight = 2 + property_weights = list("trust" = -3) /datum/dynamic_storyteller/liteextended name = "Calm" @@ -256,10 +338,10 @@ Property weights are: desc = "Low-chaos round. Few antags. No conversion." curve_centre = -3 curve_width = 0.5 - flags = NO_ASSASSIN + flags = NO_ASSASSIN | FORCE_IF_WON weight = 1 - pop_antag_ratio = 10 - property_weights = list("extended" = 1, "chaos" = -1, "valid" = -1, "story_potential" = 1, "conversion" = -10) + dead_player_weight = 5 + property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "story_potential" = 1, "conversion" = -10) /datum/dynamic_storyteller/no_antag name = "Extended" @@ -267,7 +349,7 @@ Property weights are: desc = "No standard antags. Threatening events may still spawn." curve_centre = -5 curve_width = 0.5 - flags = NO_ASSASSIN + flags = NO_ASSASSIN | FORCE_IF_WON weight = 1 property_weights = list("extended" = 2) diff --git a/code/game/gamemodes/gangs/gang.dm b/code/game/gamemodes/gangs/gang.dm index fa25701ac4..df94d68688 100644 --- a/code/game/gamemodes/gangs/gang.dm +++ b/code/game/gamemodes/gangs/gang.dm @@ -4,6 +4,7 @@ can_coexist_with_others = FALSE job_rank = ROLE_GANG antagpanel_category = "Gang" + threat = 2 var/hud_type = "gangster" var/message_name = "Gangster" var/datum/team/gang/gang @@ -167,6 +168,7 @@ name = "Gang boss" hud_type = "gang_boss" message_name = "Leader" + threat = 10 /datum/antagonist/gang/boss/on_gain() ..() @@ -474,4 +476,4 @@ #undef MAXIMUM_RECALLS -#undef INFLUENCE_INTERVAL \ No newline at end of file +#undef INFLUENCE_INTERVAL diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 2e3626dd4c..30ca8955d2 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type var/list/blacklisted_quirks = list(/datum/quirk/nonviolent,/datum/quirk/mute) // Quirks that will be removed upon gaining this antag. Pacifist and mute are default. + var/threat = 0 // Amount of threat this antag poses, for dynamic mode /datum/antagonist/New() GLOB.antagonists += src @@ -237,6 +238,10 @@ GLOBAL_LIST_EMPTY(antagonists) return H.hijack_speed_override return hijack_speed +/// Gets our threat level. Defaults to threat var, override for custom stuff like different traitor goals having different threats. +/datum/antagonist/proc/threat() + return threat + //This one is created by admin tools for custom objectives /datum/antagonist/custom antagpanel_category = "Custom" diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 564e9a8617..44116dbe36 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -6,6 +6,7 @@ antagpanel_category = "Abductor" job_rank = ROLE_ABDUCTOR show_in_antagpanel = FALSE //should only show subtypes + threat = 5 var/datum/team/abductor_team/team var/sub_role var/outfit diff --git a/code/modules/antagonists/blob/blob.dm b/code/modules/antagonists/blob/blob.dm index 3d6db983dc..1b076c9302 100644 --- a/code/modules/antagonists/blob/blob.dm +++ b/code/modules/antagonists/blob/blob.dm @@ -3,7 +3,7 @@ roundend_category = "blobs" antagpanel_category = "Blob" job_rank = ROLE_BLOB - + threat = 20 var/datum/action/innate/blobpop/pop_action var/starting_points_human_blob = 60 var/point_rate_human_blob = 2 @@ -63,4 +63,4 @@ if(owner && owner.current) var/mob/camera/blob/B = owner.current if(istype(B)) - . += "(Progress: [B.blobs_legit.len]/[B.blobwincount])" \ No newline at end of file + . += "(Progress: [B.blobs_legit.len]/[B.blobwincount])" diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm index b720d3590e..3757aecd02 100644 --- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm @@ -75,6 +75,7 @@ desc = "A floating, fragile spore." icon_state = "blobpod" icon_living = "blobpod" + threat = 0.2 health = 30 maxHealth = 30 verb_say = "psychically pulses" diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 755d12ae09..d40942f43d 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -6,7 +6,7 @@ roundend_category = "bloodsuckers" antagpanel_category = "Bloodsucker" job_rank = ROLE_BLOODSUCKER - + threat = 5 // NAME var/vampname // My Dracula name var/vamptitle // My Dracula title @@ -91,10 +91,8 @@ // Refill with Blood owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE) - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/datum/antagonist/bloodsucker/threat() + return threat+3*vamplevel /datum/antagonist/bloodsucker/proc/SelectFirstName() diff --git a/code/modules/antagonists/bloodsucker/datum_hunter.dm b/code/modules/antagonists/bloodsucker/datum_hunter.dm index 5fc6716a7d..84b9d4e828 100644 --- a/code/modules/antagonists/bloodsucker/datum_hunter.dm +++ b/code/modules/antagonists/bloodsucker/datum_hunter.dm @@ -13,7 +13,10 @@ var/list/datum/objective/objectives_given = list() // For removal if needed. var/datum/martial_art/my_kungfu // Hunters know a lil kung fu. var/bad_dude = FALSE // Every first hunter spawned is a SHIT LORD. + threat = -3 +/datum/antagonist/vamphunter/threat() + return bad_dude ? -threat : threat /datum/antagonist/vamphunter/on_gain() diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm index 345c6f3c10..3d5ed1369b 100644 --- a/code/modules/antagonists/bloodsucker/datum_vassal.dm +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -19,6 +19,7 @@ var/datum/antagonist/bloodsucker/master // Who made me? var/list/datum/action/powers = list()// Purchased powers var/list/datum/objective/objectives_given = list() // For removal if needed. + threat = 1 /datum/antagonist/vassal/can_be_owned(datum/mind/new_owner) // If we weren't created by a bloodsucker, then we cannot be a vassal (assigned from antag panel) diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index efe21f38fa..a48e080a89 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -5,6 +5,7 @@ var/special_role = ROLE_BROTHER var/datum/team/brother_team/team antag_moodlet = /datum/mood_event/focused + threat = 3 /datum/antagonist/brother/create_team(datum/team/brother_team/new_team) if(!new_team) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index a81c409233..cc15147312 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -8,6 +8,7 @@ antagpanel_category = "Changeling" job_rank = ROLE_CHANGELING antag_moodlet = /datum/mood_event/focused + threat = 10 var/you_are_greet = TRUE var/give_objectives = TRUE diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm index 2f00fd4e4a..87466d65f2 100644 --- a/code/modules/antagonists/clockcult/clock_mobs.dm +++ b/code/modules/antagonists/clockcult/clock_mobs.dm @@ -6,6 +6,7 @@ unique_name = 1 minbodytemp = 0 unsuitable_atmos_damage = 0 + threat = 1 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Robotic damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) healable = FALSE diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm index 897bff779d..f43f2814d8 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm @@ -9,6 +9,7 @@ desc = "The stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield." icon_state = "clockwork_marauder" mob_biotypes = MOB_HUMANOID + threat = 3 health = 120 maxHealth = 120 force_threshold = 8 diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index 1869414ab6..cf3d88983c 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -5,6 +5,7 @@ antagpanel_category = "Clockcult" job_rank = ROLE_SERVANT_OF_RATVAR antag_moodlet = /datum/mood_event/cult + threat = 3 var/datum/action/innate/hierophant/hierophant_network = new() var/datum/team/clockcult/clock_team var/make_team = TRUE //This should be only false for tutorial scarabs diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 4bab621674..1746fd135c 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -5,6 +5,7 @@ roundend_category = "cultists" antagpanel_category = "Cult" antag_moodlet = /datum/mood_event/cult + threat = 3 var/datum/action/innate/cult/comm/communion = new var/datum/action/innate/cult/mastervote/vote = new var/datum/action/innate/cult/blood_magic/magic = new diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 1d0bfde322..5d9ced0aae 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -91,6 +91,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", job_rank = ROLE_DEVIL //Don't delete upon mind destruction, otherwise soul re-selling will break. delete_on_mind_deletion = FALSE + threat = 5 var/obligation var/ban var/bane @@ -112,6 +113,9 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", /obj/effect/proc_holder/spell/targeted/summon_dancefloor)) var/ascendable = FALSE +/datum/antagonist/devil/threat() + return threat + form * 10 + /datum/antagonist/devil/can_be_owned(datum/mind/new_owner) . = ..() return . && (ishuman(new_owner.current) || iscyborg(new_owner.current)) @@ -120,7 +124,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", . = ..() .["Toggle ascendable"] = CALLBACK(src,.proc/admin_toggle_ascendable) - /datum/antagonist/devil/proc/admin_toggle_ascendable(mob/admin) ascendable = !ascendable message_admins("[key_name_admin(admin)] set [owner.current] devil ascendable to [ascendable]") diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm index c2f636959b..1539bc384b 100644 --- a/code/modules/antagonists/devil/imp/imp.dm +++ b/code/modules/antagonists/devil/imp/imp.dm @@ -62,6 +62,7 @@ name = "Imp" antagpanel_category = "Devil" show_in_roundend = FALSE + threat = 10 /datum/antagonist/imp/on_gain() . = ..() @@ -71,4 +72,4 @@ var/datum/objective/newobjective = new newobjective.explanation_text = "Try to get a promotion to a higher devilic rank." newobjective.owner = owner - objectives += newobjective \ No newline at end of file + objectives += newobjective diff --git a/code/modules/antagonists/devil/sintouched/sintouched.dm b/code/modules/antagonists/devil/sintouched/sintouched.dm index 9983e5f599..c9bf474567 100644 --- a/code/modules/antagonists/devil/sintouched/sintouched.dm +++ b/code/modules/antagonists/devil/sintouched/sintouched.dm @@ -14,6 +14,13 @@ var/static/list/sins = list(SIN_ACEDIA,SIN_GLUTTONY,SIN_GREED,SIN_SLOTH,SIN_WRATH,SIN_ENVY,SIN_PRIDE) +/datum/antagonist/sintouched/threat() + switch(sin) + if(SIN_GLUTTONY,SIN_ENVY) + return 1 + else + return 0 + /datum/antagonist/sintouched/New() . = ..() sin = pick(sins) @@ -80,4 +87,4 @@ #undef SIN_GREED #undef SIN_PRIDE #undef SIN_SLOTH -#undef SIN_WRATH \ No newline at end of file +#undef SIN_WRATH diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index e8dcaf9cc7..496d11bcbc 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -59,7 +59,7 @@ new /datum/disease_ability/symptom/powerful/youth var/stat_block = "" var/threshold_block = "" var/category = "" - + var/malefit = 0 // used for threat calculation var/list/symptoms var/list/actions @@ -282,6 +282,7 @@ new /datum/disease_ability/symptom/powerful/youth /datum/disease_ability/symptom/medium/heal cost = 5 + malefit = -1 category = "Symptom (+)" /datum/disease_ability/symptom/powerful @@ -291,6 +292,7 @@ new /datum/disease_ability/symptom/powerful/youth /datum/disease_ability/symptom/powerful/heal cost = 8 + malefit = -1 category = "Symptom (Strong+)" /******MILD******/ @@ -319,50 +321,61 @@ new /datum/disease_ability/symptom/powerful/youth /datum/disease_ability/symptom/medium/hallucigen symptoms = list(/datum/symptom/hallucigen) + malefit = 1 short_desc = "Cause victims to hallucinate." long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance." /datum/disease_ability/symptom/medium/choking symptoms = list(/datum/symptom/choking) + malefit = 1 short_desc = "Cause victims to choke." long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility." /datum/disease_ability/symptom/medium/confusion symptoms = list(/datum/symptom/confusion) + malefit = 1 short_desc = "Cause victims to become confused." long_desc = "Cause victims to become confused intermittently." /datum/disease_ability/symptom/medium/vomit symptoms = list(/datum/symptom/vomit) + malefit = 1 short_desc = "Cause victims to vomit." long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage." /datum/disease_ability/symptom/medium/voice_change symptoms = list(/datum/symptom/voice_change) + malefit = 1 short_desc = "Change the voice of victims." long_desc = "Change the voice of victims, causing confusion in communications." /datum/disease_ability/symptom/medium/visionloss symptoms = list(/datum/symptom/visionloss) + malefit = 1 short_desc = "Damage the eyes of victims, eventually causing blindness." long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats." /datum/disease_ability/symptom/medium/deafness + malefit = 1 symptoms = list(/datum/symptom/deafness) /datum/disease_ability/symptom/medium/fever + malefit = 1 symptoms = list(/datum/symptom/fever) /datum/disease_ability/symptom/medium/shivering + malefit = 1 symptoms = list(/datum/symptom/shivering) /datum/disease_ability/symptom/medium/headache symptoms = list(/datum/symptom/headache) /datum/disease_ability/symptom/medium/nano_boost + malefit = -1 symptoms = list(/datum/symptom/nano_boost) /datum/disease_ability/symptom/medium/nano_destroy + malefit = 1 symptoms = list(/datum/symptom/nano_destroy) /datum/disease_ability/symptom/medium/viraladaptation @@ -374,18 +387,22 @@ new /datum/disease_ability/symptom/powerful/youth symptoms = list(/datum/symptom/viralevolution) /datum/disease_ability/symptom/medium/polyvitiligo + malefit = 1 symptoms = list(/datum/symptom/polyvitiligo) /datum/disease_ability/symptom/medium/disfiguration + malefit = 1 symptoms = list(/datum/symptom/disfiguration) /datum/disease_ability/symptom/medium/itching symptoms = list(/datum/symptom/itching) + malefit = 1 short_desc = "Cause victims to itch." long_desc = "Cause victims to itch, increasing all stats except stealth." /datum/disease_ability/symptom/medium/heal/weight_loss symptoms = list(/datum/symptom/weight_loss) + malefit = 1 short_desc = "Cause victims to lose weight." long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing." @@ -400,12 +417,15 @@ new /datum/disease_ability/symptom/powerful/youth /******POWERFUL******/ /datum/disease_ability/symptom/powerful/fire + malefit = 1 symptoms = list(/datum/symptom/fire) /datum/disease_ability/symptom/powerful/flesh_eating + malefit = 1 symptoms = list(/datum/symptom/flesh_eating) /datum/disease_ability/symptom/powerful/genetic_mutation + malefit = 1 symptoms = list(/datum/symptom/genetic_mutation) cost = 8 @@ -413,6 +433,7 @@ new /datum/disease_ability/symptom/powerful/youth symptoms = list(/datum/symptom/inorganic_adaptation) /datum/disease_ability/symptom/powerful/narcolepsy + malefit = 1 symptoms = list(/datum/symptom/narcolepsy) /datum/disease_ability/symptom/powerful/youth @@ -451,4 +472,4 @@ new /datum/disease_ability/symptom/powerful/youth /datum/disease_ability/symptom/powerful/heal/coma symptoms = list(/datum/symptom/heal/coma) short_desc = "Cause victims to fall into a healing coma when hurt." - long_desc = "Cause victims to fall into a healing coma when hurt." \ No newline at end of file + long_desc = "Cause victims to fall into a healing coma when hurt." diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index 3c7de589d9..c827179006 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -17,6 +17,14 @@ . = ..() +/datum/antagonist/disease/threat() + var/mob/camera/disease/D = owner.current + var/final_threat = 0 + for(var/V in D.purchased_abilities) + var/datum/disease_ability/A = V + final_threat += (A.cost/8)*A.malefit + return final_threat*D.hosts + /datum/antagonist/disease/greet() to_chat(owner.current, "You are the [owner.special_role]!") to_chat(owner.current, "Infect members of the crew to gain adaptation points, and spread your infection further.") diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 5c878bcc55..bda1fbabe6 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -10,6 +10,7 @@ var/datum/outfit/outfit = /datum/outfit/ert/security var/role = "Security Officer" var/list/name_source + threat = -5 show_in_antagpanel = FALSE antag_moodlet = /datum/mood_event/focused diff --git a/code/modules/antagonists/greybois/greybois.dm b/code/modules/antagonists/greybois/greybois.dm index b5e18045e8..458ebad9cd 100644 --- a/code/modules/antagonists/greybois/greybois.dm +++ b/code/modules/antagonists/greybois/greybois.dm @@ -2,6 +2,7 @@ name = "Emergency Assistant" show_name_in_check_antagonists = TRUE show_in_antagpanel = FALSE + threat = -1 var/mission = "Assist the station." var/datum/outfit/outfit = /datum/outfit/ert/greybois diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index bfd7b50cf8..ffca67b882 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -73,4 +73,4 @@ antiwelder.name = "compulsion of honor" antiwelder.desc = "You are unable to hold anything in this hand until you're the last one left!" antiwelder.icon_state = "bloodhand_right" - H.put_in_hands(antiwelder) \ No newline at end of file + H.put_in_hands(antiwelder) diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm index e480eb8674..ebb39c814e 100644 --- a/code/modules/antagonists/monkey/monkey.dm +++ b/code/modules/antagonists/monkey/monkey.dm @@ -8,6 +8,7 @@ job_rank = ROLE_MONKEY roundend_category = "monkeys" antagpanel_category = "Monkey" + threat = 3 var/datum/team/monkey/monkey_team var/monkey_only = TRUE @@ -81,6 +82,7 @@ /datum/antagonist/monkey/leader name = "Monkey Leader" + threat = 5 monkey_only = FALSE /datum/antagonist/monkey/leader/admin_add(datum/mind/new_owner,mob/admin) diff --git a/code/modules/antagonists/morph/morph_antag.dm b/code/modules/antagonists/morph/morph_antag.dm index e01751946d..07781ce60a 100644 --- a/code/modules/antagonists/morph/morph_antag.dm +++ b/code/modules/antagonists/morph/morph_antag.dm @@ -2,5 +2,6 @@ name = "Morph" show_name_in_check_antagonists = TRUE show_in_antagpanel = FALSE + threat = 2 -//It does nothing! (Besides tracking) \ No newline at end of file +//It does nothing! (Besides tracking) diff --git a/code/modules/antagonists/nightmare/nightmare.dm b/code/modules/antagonists/nightmare/nightmare.dm index 41a3f181d0..837b6e4216 100644 --- a/code/modules/antagonists/nightmare/nightmare.dm +++ b/code/modules/antagonists/nightmare/nightmare.dm @@ -1,4 +1,5 @@ /datum/antagonist/nightmare name = "Nightmare" show_in_antagpanel = FALSE - show_name_in_check_antagonists = TRUE \ No newline at end of file + show_name_in_check_antagonists = TRUE + threat = 5 diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index 133bd5ab6a..bfd028aec2 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -8,6 +8,9 @@ var/give_objectives = TRUE var/give_equipment = TRUE +/datum/antagonist/ninja/threat() + return helping_station ? -8 : 8 + /datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current update_ninja_icons_added(M) diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm index a3ccdee2b5..0ff2980939 100644 --- a/code/modules/antagonists/nukeop/clownop.dm +++ b/code/modules/antagonists/nukeop/clownop.dm @@ -3,6 +3,7 @@ name = "Clown Operative" roundend_category = "clown operatives" antagpanel_category = "ClownOp" + threat = 7 nukeop_outfit = /datum/outfit/syndicate/clownop /datum/antagonist/nukeop/clownop/on_gain() diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 4a63ba65bd..7510ad6997 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -4,6 +4,7 @@ antagpanel_category = "NukeOp" job_rank = ROLE_OPERATIVE antag_moodlet = /datum/mood_event/focused + threat = 10 var/datum/team/nuclear/nuke_team var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm index c8b253793e..0e8c4a35e0 100644 --- a/code/modules/antagonists/overthrow/overthrow.dm +++ b/code/modules/antagonists/overthrow/overthrow.dm @@ -10,6 +10,7 @@ roundend_category = "syndicate mutineers" antagpanel_category = "Syndicate Mutineers" job_rank = ROLE_TRAITOR // simply use the traitor preference & jobban settings + threat = 5 var/datum/team/overthrow/team var/static/list/possible_useful_items diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm index ff33477909..01f3c6068e 100644 --- a/code/modules/antagonists/pirate/pirate.dm +++ b/code/modules/antagonists/pirate/pirate.dm @@ -3,6 +3,7 @@ job_rank = ROLE_TRAITOR roundend_category = "space pirates" antagpanel_category = "Pirate" + threat = 5 var/datum/team/pirate/crew /datum/antagonist/pirate/greet() @@ -104,4 +105,4 @@ else parts += "The pirate crew has failed." - return "
    [parts.Join("
    ")]
    " \ No newline at end of file + return "
    [parts.Join("
    ")]
    " diff --git a/code/modules/antagonists/revenant/revenant_antag.dm b/code/modules/antagonists/revenant/revenant_antag.dm index 8d99edf26e..46c1176533 100644 --- a/code/modules/antagonists/revenant/revenant_antag.dm +++ b/code/modules/antagonists/revenant/revenant_antag.dm @@ -2,6 +2,7 @@ name = "Revenant" show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE + threat = 5 /datum/antagonist/revenant/greet() owner.announce_objectives() diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index c4190d8cd9..4f308cc4c0 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -7,6 +7,7 @@ antagpanel_category = "Revolution" job_rank = ROLE_REV antag_moodlet = /datum/mood_event/revolution + threat = 2 var/hud_type = "rev" var/datum/team/revolution/rev_team @@ -148,6 +149,7 @@ /datum/antagonist/rev/head name = "Head Revolutionary" hud_type = "rev_head" + threat = 8 var/remove_clumsy = FALSE var/give_flash = FALSE var/give_hud = TRUE diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm index a018603cf1..04f7167fa5 100644 --- a/code/modules/antagonists/slaughter/slaughter_antag.dm +++ b/code/modules/antagonists/slaughter/slaughter_antag.dm @@ -3,6 +3,7 @@ show_name_in_check_antagonists = TRUE var/objective_verb = "Kill" var/datum/mind/summoner + threat = 10 job_rank = ROLE_ALIEN show_in_antagpanel = FALSE @@ -28,4 +29,4 @@ /datum/antagonist/slaughter/laughter name = "Laughter demon" - objective_verb = "Hug and Tickle" \ No newline at end of file + objective_verb = "Hug and Tickle" diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 0b66e8cb23..04ad53f65b 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -3,6 +3,7 @@ show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE blacklisted_quirks = list(/datum/quirk/nonviolent) // mutes are allowed + threat = 1 var/greet_message = "" /datum/antagonist/survivalist/proc/forge_objectives() diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 292fb10202..724c4e6f76 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -70,6 +70,7 @@ icon_living = "swarmer" icon_dead = "swarmer_unactivated" icon_gib = null + threat = 0.5 wander = 0 harm_intent_damage = 5 minbodytemp = 0 diff --git a/code/modules/antagonists/traitor/classes/ai.dm b/code/modules/antagonists/traitor/classes/ai.dm index fac1efeb49..eaa1137d51 100644 --- a/code/modules/antagonists/traitor/classes/ai.dm +++ b/code/modules/antagonists/traitor/classes/ai.dm @@ -1,5 +1,6 @@ /datum/traitor_class/ai // this one is special, so has no weight name = "Malfunctioning AI" + threat = 20 /datum/traitor_class/ai/forge_objectives(datum/antagonist/traitor/T) var/objective_count = 0 diff --git a/code/modules/antagonists/traitor/classes/assassin.dm b/code/modules/antagonists/traitor/classes/assassin.dm index 0c1d950f57..6b709aac59 100644 --- a/code/modules/antagonists/traitor/classes/assassin.dm +++ b/code/modules/antagonists/traitor/classes/assassin.dm @@ -3,7 +3,7 @@ employer = "Donk Corporation" weight = 0 chaos = 1 - cost = 2 + threat = 2 /datum/traitor_class/human/assassin/forge_single_objective(datum/antagonist/traitor/T) .=1 diff --git a/code/modules/antagonists/traitor/classes/hijack.dm b/code/modules/antagonists/traitor/classes/hijack.dm index e89eda1dcf..59e0591600 100644 --- a/code/modules/antagonists/traitor/classes/hijack.dm +++ b/code/modules/antagonists/traitor/classes/hijack.dm @@ -3,7 +3,7 @@ employer = "The Gorlex Marauders" weight = 3 chaos = 5 - cost = 5 + threat = 3 uplink_filters = list(/datum/uplink_item/stealthy_weapons/romerol_kit) /datum/traitor_class/human/hijack/forge_objectives(datum/antagonist/traitor/T) diff --git a/code/modules/antagonists/traitor/classes/martyr.dm b/code/modules/antagonists/traitor/classes/martyr.dm index 78f8bf9b0c..72f9ac86fc 100644 --- a/code/modules/antagonists/traitor/classes/martyr.dm +++ b/code/modules/antagonists/traitor/classes/martyr.dm @@ -3,7 +3,7 @@ employer = "The Tiger Cooperative" weight = 2 chaos = 5 - cost = 5 + threat = 5 uplink_filters = list(/datum/uplink_item/stealthy_weapons/romerol_kit,/datum/uplink_item/bundles_TC/contract_kit) /datum/traitor_class/human/martyr/forge_objectives(datum/antagonist/traitor/T) diff --git a/code/modules/antagonists/traitor/classes/traitor_class.dm b/code/modules/antagonists/traitor/classes/traitor_class.dm index 3df9dec929..012a269572 100644 --- a/code/modules/antagonists/traitor/classes/traitor_class.dm +++ b/code/modules/antagonists/traitor/classes/traitor_class.dm @@ -5,7 +5,7 @@ GLOBAL_LIST_EMPTY(traitor_classes) var/employer = "The Syndicate" var/weight = 0 var/chaos = 0 - var/cost = 0 + var/threat = 0 var/TC = 20 var/list/uplink_filters diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index a9dee81a6c..d3aae4b75a 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -12,6 +12,7 @@ var/datum/traitor_class/traitor_kind var/datum/contractor_hub/contractor_hub hijack_speed = 0.5 //10 seconds per hijack stage by default + threat = 5 /datum/antagonist/traitor/New() ..() @@ -21,11 +22,6 @@ /datum/antagonist/traitor/proc/set_traitor_kind(var/kind) traitor_kind = GLOB.traitor_classes[kind] - if(istype(SSticker.mode, /datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - if(traitor_kind.cost) - mode.spend_threat(traitor_kind.cost) - mode.log_threat("[traitor_kind.cost] was spent due to [owner.name] being a [traitor_kind.name].") /datum/antagonist/traitor/on_gain() if(owner.current && isAI(owner.current)) @@ -38,7 +34,7 @@ var/list/weights = list() for(var/C in GLOB.traitor_classes) var/datum/traitor_class/class = GLOB.traitor_classes[C] - var/weight = (1.5*class.weight)/(0.5+NUM_E**(-chaos_weight*class.chaos)) // just a logistic function + var/weight = LOGISTIC_FUNCTION(1.5*class.weight,chaos_weight,class.chaos,0) weights[C] = weight var/choice = pickweightAllowZero(weights) if(!choice) @@ -294,3 +290,6 @@ /datum/antagonist/traitor/is_gamemode_hero() return SSticker.mode.name == "traitor" + +/datum/antagonist/traitor/threat() + return threat+traitor_kind.threat diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm index 15ec78692f..46b5edffd3 100644 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -2,6 +2,7 @@ name = "Wishgranter Avatar" show_in_antagpanel = FALSE show_name_in_check_antagonists = TRUE + threat = 20 /datum/antagonist/wishgranter/proc/forge_objectives() var/datum/objective/hijack/hijack = new @@ -25,4 +26,4 @@ H.dna.add_mutation(HULK) H.dna.add_mutation(XRAY) H.dna.add_mutation(SPACEMUT) - H.dna.add_mutation(TK) \ No newline at end of file + H.dna.add_mutation(TK) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 5ef3f24bd6..0e4e26e3f8 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -11,7 +11,6 @@ var/buy_word = "Learn" var/limit //used to prevent a spellbook_entry from being bought more than X times with one wizard spellbook var/list/no_coexistance_typecache //Used so you can't have specific spells together - var/dynamic_cost = 0 // How much threat the spell costs to purchase for dynamic. var/dynamic_requirement = 0 // How high the threat level needs to be for purchasing in dynamic. /datum/spellbook_entry/New() @@ -31,10 +30,6 @@ for(var/spell in user.mind.spell_list) if(is_type_in_typecache(spell, no_coexistance_typecache)) return 0 - if(dynamic_cost>0 && istype(SSticker.mode,/datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - if(mode.threat < dynamic_cost) - return 0 return 1 /datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success @@ -70,10 +65,6 @@ SSblackbox.record_feedback("nested tally", "wizard_spell_improved", 1, list("[name]", "[aspell.spell_level]")) return 1 //No same spell found - just learn it - if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - mode.spend_threat(dynamic_cost) - mode.log_threat("Wizard spent [dynamic_cost] on [name].") SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) user.mind.AddSpell(S) to_chat(user, "You have learned [S.name].") @@ -97,10 +88,6 @@ if(!S) S = new spell_type() var/spell_levels = 0 - if(dynamic_cost > 0 && istype(SSticker.mode,/datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - mode.refund_threat(dynamic_cost) - mode.log_threat("Wizard refunded [dynamic_cost] on [name].") for(var/obj/effect/proc_holder/spell/aspell in user.mind.spell_list) if(initial(S.name) == initial(aspell.name)) spell_levels = aspell.spell_level @@ -308,7 +295,6 @@ desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself." item_path = /obj/item/gun/magic/staff/change dynamic_requirement = 60 - dynamic_cost = 20 /datum/spellbook_entry/item/staffanimation name = "Staff of Animation" @@ -376,7 +362,6 @@ item_path = /obj/item/storage/belt/wands/full category = "Defensive" dynamic_requirement = 60 - dynamic_cost = 10 /datum/spellbook_entry/item/armor name = "Mastercrafted Armor Set" @@ -396,7 +381,6 @@ item_path = /obj/item/antag_spawner/contract category = "Assistance" dynamic_requirement = 50 - dynamic_cost = 10 /datum/spellbook_entry/item/plasmafist name = "Plasma Fist" @@ -424,10 +408,6 @@ category = "Assistance" dynamic_requirement = 60 -/datum/spellbook_entry/item/bloodbottle/New() - ..() - dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"] - /datum/spellbook_entry/item/hugbottle name = "Bottle of Tickles" desc = "A bottle of magically infused fun, the smell of which will \ @@ -443,10 +423,6 @@ category = "Assistance" dynamic_requirement = 40 -/datum/spellbook_entry/item/hugbottle/New() - ..() - dynamic_cost = CONFIG_GET(keyed_list/dynamic_cost)["slaughter_demon"]/3 - /datum/spellbook_entry/item/mjolnir name = "Mjolnir" desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power." @@ -522,7 +498,6 @@ /datum/spellbook_entry/summon/guns name = "Summon Guns" desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" - dynamic_cost = 10 dynamic_requirement = 60 /datum/spellbook_entry/summon/guns/IsAvailible() @@ -536,17 +511,11 @@ active = 1 playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon guns!") - if(istype(SSticker.mode,/datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - var/threat_spent = dynamic_cost - mode.spend_threat(threat_spent) - mode.log_threat("Wizard spent [threat_spent] on summon guns.") return 1 /datum/spellbook_entry/summon/magic name = "Summon Magic" desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." - dynamic_cost = 10 dynamic_requirement = 60 /datum/spellbook_entry/summon/magic/IsAvailible() @@ -560,17 +529,11 @@ active = 1 playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon magic!") - if(istype(SSticker.mode,/datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - var/threat_spent = dynamic_cost - mode.spend_threat(threat_spent) - mode.log_threat("Wizard spent [threat_spent] on summon magic.") return 1 /datum/spellbook_entry/summon/events name = "Summon Events" desc = "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events." - dynamic_cost = 20 dynamic_requirement = 60 var/times = 0 @@ -582,11 +545,6 @@ /datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) summonevents() - if(istype(SSticker.mode,/datum/game_mode/dynamic) && times == 0) - var/datum/game_mode/dynamic/mode = SSticker.mode - var/threat_spent = dynamic_cost - mode.spend_threat(threat_spent) - mode.log_threat("Wizard spent [threat_spent] on summon events.") times++ playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, 1) to_chat(user, "You have cast summon events.") diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 234bb3d1a1..2d32f8f00a 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -4,6 +4,7 @@ antagpanel_category = "Wizard" job_rank = ROLE_WIZARD antag_moodlet = /datum/mood_event/focused + threat = 30 var/give_objectives = TRUE var/strip = TRUE //strip before equipping var/allow_rename = TRUE diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm index b8f9927bc4..7c4c5351df 100644 --- a/code/modules/antagonists/xeno/xeno.dm +++ b/code/modules/antagonists/xeno/xeno.dm @@ -13,6 +13,7 @@ job_rank = ROLE_ALIEN show_in_antagpanel = FALSE var/datum/team/xeno/xeno_team + threat = 3 /datum/antagonist/xeno/create_team(datum/team/xeno/new_team) if(!new_team) @@ -34,4 +35,4 @@ /mob/living/carbon/alien/mind_initialize() ..() if(!mind.has_antag_datum(/datum/antagonist/xeno)) - mind.add_antag_datum(/datum/antagonist/xeno) \ No newline at end of file + mind.add_antag_datum(/datum/antagonist/xeno) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index e2125964e4..a8ab470d5d 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -121,7 +121,8 @@ var/activeFor = 0 //How long the event has existed. You don't need to change this. var/current_players = 0 //Amount of of alive, non-AFK human players on server at the time of event start - var/fakeable = TRUE //Can be faked by fake news event. + var/threat = 0 + var/fakeable = TRUE //Can be faked by fake news event. //Called first before processing. //Allows you to setup your event, such as randomly @@ -161,7 +162,9 @@ /datum/round_event/proc/end() return - +// Returns threat; used for dynamic. Used for custom stuff, just returns the threat var by default. +/datum/round_event/proc/threat() + return threat //Do not override this proc, instead use the appropiate procs. //This proc will handle the calls to the appropiate procs. diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 75114af902..e61af1368d 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -27,6 +27,7 @@ "How do I vore people?", "ERP?", "Not epic bros...") + threat = 5 /datum/round_event/brand_intelligence/announce(fake) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index e24ce13034..7763f9950d 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -16,6 +16,7 @@ startWhen = 6 endWhen = 66 announceWhen = 1 + threat = 15 var/list/wave_type var/wave_name = "normal" var/direction @@ -88,8 +89,10 @@ max_occurrences = 3 earliest_start = 35 MINUTES + /datum/round_event/meteor_wave/threatening wave_name = "threatening" + threat = 25 /datum/round_event_control/meteor_wave/catastrophic name = "Meteor Wave: Catastrophic" @@ -101,6 +104,7 @@ /datum/round_event/meteor_wave/catastrophic wave_name = "catastrophic" + threat = 35 #undef SINGULO_BEACON_DISTURBANCE #undef SINGULO_BEACON_MAX_DISTURBANCE diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 47cde0899b..86ff1ed0da 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -15,7 +15,7 @@ /datum/round_event/pirates startWhen = 60 //2 minutes to answer - var/datum/comm_message/threat + var/datum/comm_message/threat_message var/payoff = 0 var/paid_off = FALSE var/ship_name = "Space Privateers Association" @@ -28,16 +28,16 @@ priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak if(fake) return - threat = new + threat_message = new payoff = round(SSshuttle.points * 0.80) - threat.title = "Business proposition" - threat.content = "This is [ship_name]. Pay up [payoff] credits or you'll walk the plank." - threat.possible_answers = list("We'll pay.","No way.") - threat.answer_callback = CALLBACK(src,.proc/answered) - SScommunications.send_message(threat,unique = TRUE) + threat_message.title = "Business proposition" + threat_message.content = "This is [ship_name]. Pay up [payoff] credits or you'll walk the plank." + threat_message.possible_answers = list("We'll pay.","No way.") + threat_message.answer_callback = CALLBACK(src,.proc/answered) + SScommunications.send_message(threat_message,unique = TRUE) /datum/round_event/pirates/proc/answered() - if(threat && threat.answered == 1) + if(threat_message && threat_message.answered == 1) if(SSshuttle.points >= payoff) SSshuttle.points -= payoff priority_announce("Thanks for the credits, landlubbers.",sender_override = ship_name) diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 57e2a2a051..4d2e8e624c 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -30,6 +30,7 @@ icon_dead = "magicarp_dead" icon_gib = "magicarp_gib" ranged = 1 + threat = 4 retreat_distance = 2 minimum_distance = 0 //Between shots they can and will close in to nash projectiletype = /obj/item/projectile/magic @@ -51,6 +52,7 @@ color = "#00FFFF" maxHealth = 75 health = 75 + threat = 7 /mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot() projectiletype = pick(allowed_projectile_types) diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm index 2aeb200c88..5c3b8432c1 100644 --- a/code/modules/events/wizard/race.dm +++ b/code/modules/events/wizard/race.dm @@ -10,6 +10,7 @@ var/list/stored_name var/list/stored_species var/list/stored_dna + threat = 10 /datum/round_event/wizard/race/setup() stored_name = list() @@ -56,4 +57,4 @@ H.set_species(stored_species[H]) H.real_name = stored_name[H] H.dna.unique_enzymes = stored_dna[H] - to_chat(H, "You feel back to your normal self again.") \ No newline at end of file + to_chat(H, "You feel back to your normal self again.") diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index d3b9b92b4f..6c9e527f38 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -190,6 +190,7 @@ icon_dead = "scary_clown" icon_gib = "scary_clown" speak = list("...", ". . .") + threat = 3 maxHealth = 120 health = 120 emote_see = list("silently stares") diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 507c8a5026..ee441c21f7 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -63,6 +63,8 @@ //If a job complies with dresscodes, loadout items will not be equipped instead of the job's outfit, instead placing the items into the player's backpack. var/dresscodecompliant = TRUE + // How much threat this job is worth in dynamic. Is subtracted if the player's not an antag, added if they are. + var/threat = 0 //Only override this proc //H is usually a human unless an /equip override transformed it @@ -88,6 +90,11 @@ if(. == null) return antag_rep +/datum/job/proc/GetThreat() + . = CONFIG_GET(keyed_list/job_threat)[lowertext(title)] + if(. == null) + return threat + //Don't override this unless the job transforms into a non-human (Silicons do this for example) /datum/job/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, announce = TRUE, latejoin = FALSE, datum/outfit/outfit_override = null, client/preference_source) if(!H) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index 4bcfab5836..efe574ab66 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -15,6 +15,7 @@ exp_type_department = EXP_TYPE_SILICON display_order = JOB_DISPLAY_ORDER_AI var/do_special_check = TRUE + threat = 5 /datum/job/ai/equip(mob/living/carbon/human/H, visualsOnly, announce, latejoin, datum/outfit/outfit_override, client/preference_source = null) if(visualsOnly) diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index eec6e77578..c4fa213b61 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -16,6 +16,7 @@ Assistant antag_rep = 7 display_order = JOB_DISPLAY_ORDER_ASSISTANT dresscodecompliant = FALSE + threat = 0.2 /datum/job/assistant/get_access() if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 97d73db5ce..019e50799e 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -18,6 +18,7 @@ minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN + threat = 0.5 /datum/outfit/job/atmos name = "Atmospheric Technician" diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index f542e96d50..709c53d51d 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -15,6 +15,7 @@ access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_BARTENDER + threat = 0.5 /datum/outfit/job/bartender name = "Bartender" diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 916783fe60..4cf106ea99 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -14,6 +14,7 @@ access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_BOTANIST + threat = 1.5 // lol powergame /datum/outfit/job/botanist name = "Botanist" diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 40bfa0bbfa..d38a2a3ddf 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -25,6 +25,7 @@ display_order = JOB_DISPLAY_ORDER_CAPTAIN blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) + threat = 5 /datum/job/captain/get_access() return get_all_accesses() @@ -62,4 +63,4 @@ mask = /obj/item/clothing/mask/gas/sechailer suit = /obj/item/clothing/suit/space/hardsuit/captain - suit_store = /obj/item/tank/internals/oxygen \ No newline at end of file + suit_store = /obj/item/tank/internals/oxygen diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 74b06adff7..d574482444 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -16,6 +16,7 @@ minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN + threat = 0.2 /datum/outfit/job/cargo_tech name = "Cargo Technician" diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 70d8af317e..4aed218cf9 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -15,6 +15,7 @@ minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) display_order = JOB_DISPLAY_ORDER_CHAPLAIN + threat = 0.5 /datum/job/chaplain/after_spawn(mob/living/H, mob/M) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 66167a3827..44b0e90ec8 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -17,6 +17,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_CHEMIST + threat = 1.5 /datum/outfit/job/chemist name = "Chemist" diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index d031653a31..c5065cd169 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -29,6 +29,7 @@ display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) + threat = 2 /datum/outfit/job/ce name = "Chief Engineer" diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 4a80975bb9..8dd7fafab3 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -27,6 +27,7 @@ display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) + threat = 2 /datum/outfit/job/cmo name = "Chief Medical Officer" diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index a18aee474c..c65c062bce 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -17,6 +17,7 @@ mind_traits = list(TRAIT_CLOWN_MENTALITY) display_order = JOB_DISPLAY_ORDER_CLOWN + threat = 0 // honk /datum/outfit/job/clown name = "Clown" diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index b41c0d8505..20969bf1d9 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -16,6 +16,7 @@ minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_COOK + threat = 0.2 /datum/outfit/job/cook name = "Cook" diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 9e0a91e6aa..d73d909f4f 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -15,6 +15,7 @@ minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) display_order = JOB_DISPLAY_ORDER_CURATOR + threat = 0.3 /datum/outfit/job/curator name = "Curator" diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 0c586d47a6..55c13df7a2 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -22,6 +22,7 @@ display_order = JOB_DISPLAY_ORDER_DETECTIVE blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) + threat = 1 /datum/outfit/job/detective name = "Detective" diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 35586c0bc8..2e8b18d772 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -17,6 +17,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_GENETICIST + threat = 1.5 /datum/outfit/job/geneticist name = "Geneticist" diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index cf8310504d..b1fe3471f1 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -34,6 +34,8 @@ display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity) + threat = 2 + /datum/outfit/job/hop name = "Head of Personnel" diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 926eb0b068..811dff87e7 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -30,6 +30,7 @@ display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity) + threat = 3 /datum/outfit/job/hos name = "Head of Security" diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index bc3d2b8abd..73028255be 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -15,6 +15,7 @@ minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_JANITOR + threat = 0.2 /datum/outfit/job/janitor name = "Janitor" diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 7bf9c39d45..3f80e44492 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -18,6 +18,7 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) display_order = JOB_DISPLAY_ORDER_LAWYER + threat = 0.3 /datum/outfit/job/lawyer name = "Lawyer" diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 605727cf80..3eaa2ae10a 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -15,6 +15,7 @@ minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR + threat = 0.5 /datum/outfit/job/doctor name = "Medical Doctor" diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index f38b4edf52..72a6ac8e13 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -16,6 +16,8 @@ display_order = JOB_DISPLAY_ORDER_MIME + threat = 0 + /datum/job/mime/after_spawn(mob/living/carbon/human/H, mob/M) . = ..() H.apply_pref_name("mime", M.client) diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index b74f1a1c18..df6e1431ae 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -17,6 +17,8 @@ display_order = JOB_DISPLAY_ORDER_PARAMEDIC + threat = 0.5 + /datum/outfit/job/paramedic name = "Paramedic" jobtype = /datum/job/paramedic diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 04460936af..897defb0ea 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -27,6 +27,7 @@ display_order = JOB_DISPLAY_ORDER_QUARTERMASTER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) + threat = 0.5 /datum/outfit/job/quartermaster name = "Quartermaster" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 9cc2f4b8bf..15e5c64654 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -31,6 +31,7 @@ display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) + threat = 5 /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 345b1ac3d3..f9f1d20d3b 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -17,6 +17,7 @@ minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_ROBOTICIST + threat = 1 /datum/outfit/job/roboticist name = "Roboticist" diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index ce9a628ae0..9809e7b4dc 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -17,6 +17,7 @@ minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_SCIENTIST + threat = 1.2 /datum/outfit/job/scientist name = "Scientist" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 92cc15673f..decb334423 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -22,6 +22,7 @@ display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) + threat = 2 /datum/job/officer/get_access() var/list/L = list() diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 4ba1fc9ac1..9eb268895e 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -19,6 +19,8 @@ display_order = JOB_DISPLAY_ORDER_SHAFT_MINER + threat = 1.5 + /datum/outfit/job/miner name = "Shaft Miner (Lavaland)" jobtype = /datum/job/mining diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 144693aba1..66ddc90e9b 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -20,6 +20,8 @@ display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER + threat = 1 + /datum/outfit/job/engineer name = "Station Engineer" jobtype = /datum/job/engineer diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index c5a9c9e9fb..4ba65dff59 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -18,6 +18,8 @@ display_order = JOB_DISPLAY_ORDER_VIROLOGIST + threat = 1.5 + /datum/outfit/job/virologist name = "Virologist" jobtype = /datum/job/virologist diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 8ddcf1ad91..15d839ac48 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -22,6 +22,7 @@ display_order = JOB_DISPLAY_ORDER_WARDEN blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/nonviolent, /datum/quirk/paraplegic) + threat = 2 /datum/job/warden/get_access() var/list/L = list() diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 708c9ea2cd..a6366c03fe 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -8,6 +8,7 @@ response_help = "thinks better of touching" response_disarm = "flails at" response_harm = "punches" + threat = 1 speak_chance = 1 icon = 'icons/mob/mob.dmi' speed = 0 @@ -118,6 +119,7 @@ desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire." icon_state = "behemoth" icon_living = "behemoth" + threat = 3 maxHealth = 150 health = 150 response_harm = "harmlessly punches" @@ -180,6 +182,7 @@ desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines." icon_state = "floating" icon_living = "floating" + threat = 3 maxHealth = 65 health = 65 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index ff42512666..f7ebde4758 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians name = "Guardian Spirit" real_name = "Guardian Spirit" desc = "A mysterious being that stands by its charge, ever vigilant." + threat = 5 speak_emote = list("hisses") gender = NEUTER mob_biotypes = NONE diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index bb51358192..3b9700bb58 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -7,6 +7,7 @@ icon_dead = "alienh_dead" icon_gib = "syndicate_gib" gender = FEMALE + threat = 1 response_help = "pokes" response_disarm = "shoves" response_harm = "hits" @@ -62,6 +63,7 @@ icon_state = "aliens" icon_living = "aliens" icon_dead = "aliens_dead" + threat = 3 health = 150 maxHealth = 150 melee_damage_lower = 15 @@ -78,6 +80,7 @@ icon_state = "alienq" icon_living = "alienq" icon_dead = "alienq_dead" + threat = 8 health = 250 maxHealth = 250 melee_damage_lower = 15 @@ -157,6 +160,7 @@ name = "lusty xenomorph maid" melee_damage_lower = 0 melee_damage_upper = 0 + threat = -1 a_intent = INTENT_HELP friendly = "caresses" obj_damage = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index dca7bc7006..a77098cb80 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -2,6 +2,7 @@ /mob/living/simple_animal/hostile/bear name = "space bear" desc = "You don't need to be faster than a space bear, you just need to outrun your crewmates." + threat = 1 icon_state = "bear" icon_living = "bear" icon_dead = "bear_dead" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 524c220fa4..ce7ab92e0c 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -16,6 +16,7 @@ icon_state = "" icon_living = "" icon = 'icons/mob/bees.dmi' + threat = 0.3 gender = FEMALE speak_emote = list("buzzes") emote_hear = list("buzzes") diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index be88394692..dbb957a96b 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -1,6 +1,7 @@ /mob/living/simple_animal/hostile/boss name = "A Perfectly Generic Boss Placeholder" desc = "" + threat = 10 robust_searching = 1 stat_attack = UNCONSCIOUS status_flags = 0 @@ -134,4 +135,4 @@ /datum/boss_active_timed_battle/Destroy() abilities = null SSobj.processing.Remove(src) - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 36968a1ab0..9c89ff4a4f 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -7,6 +7,7 @@ icon_living = "carp" icon_dead = "carp_dead" icon_gib = "carp_gib" + threat = 0.2 mob_biotypes = MOB_ORGANIC|MOB_BEAST speak_chance = 0 turns_per_move = 5 @@ -70,7 +71,7 @@ icon_living = "megacarp" icon_dead = "megacarp_dead" icon_gib = "megacarp_gib" - + threat = 3 regen_amount = 6 maxHealth = 30 @@ -94,7 +95,7 @@ name = "Cayenne" desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot." gender = FEMALE - + threat = 5 regen_amount = 8 speak_emote = list("squeaks") diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm index aec136af7d..6ca6eac0cc 100644 --- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm @@ -1,6 +1,7 @@ /mob/living/simple_animal/hostile/dark_wizard name = "Dark Wizard" desc = "Killing amateurs since the dawn of times." + threat = 3 icon = 'icons/mob/simple_human.dmi' icon_state = "dark_wizard" icon_living = "dark_wizard" @@ -36,4 +37,4 @@ icon_state = "declone" damage = 4 damage_type = BURN - flag = "energy" \ No newline at end of file + flag = "energy" diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index 2d438dbf1c..dbb9048ca4 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -26,4 +26,4 @@ movement_type = FLYING faction = list("spooky") - del_on_death = 1 \ No newline at end of file + del_on_death = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 69956c5d0d..7ac0ea2b44 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -4,6 +4,7 @@ icon_state = "faithless" icon_living = "faithless" icon_dead = "faithless_dead" + threat = 1 mob_biotypes = MOB_ORGANIC|MOB_HUMANOID gender = MALE speak_chance = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index cc7b1e19d1..3c3612f434 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -17,6 +17,7 @@ //basic spider mob, these generally guard nests /mob/living/simple_animal/hostile/poison/giant_spider + threat = 1 name = "giant spider" desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." icon_state = "guard" diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index 9b5b428f44..7c6f9e9c7b 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -9,6 +9,7 @@ icon_state = "crawling" icon_living = "crawling" icon_dead = "dead" + threat = 0.5 mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 80 maxHealth = 220 @@ -114,4 +115,4 @@ unique_name = FALSE AIStatus = AI_OFF atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 \ No newline at end of file + minbodytemp = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index cc225f4bac..9d64b76198 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -6,6 +6,7 @@ icon_state = "headcrab" icon_living = "headcrab" icon_dead = "headcrab_dead" + threat = 1 gender = NEUTER health = 50 maxHealth = 50 diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index bd4f334476..e496d007a2 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -3,6 +3,7 @@ stop_automated_movement_when_pulled = 0 obj_damage = 40 environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls + var/threat = 0 // for dynamic var/atom/target var/ranged = FALSE var/rapid = 0 //How many shots per volley. @@ -594,3 +595,6 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega . += M else if (M.loc.type in hostile_machines) . += M.loc + +/mob/living/simple_animal/hostile/proc/threat() + return threat diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index e558982fbb..05c4007b6f 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -11,6 +11,7 @@ icon_living = "leaper" icon_dead = "leaper_dead" mob_biotypes = MOB_ORGANIC|MOB_BEAST + threat = 2 maxHealth = 300 health = 300 ranged = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm index 91e17e8e57..ae161d596d 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm @@ -8,6 +8,7 @@ icon_living = "arachnid" icon_dead = "arachnid_dead" mob_biotypes = MOB_ORGANIC|MOB_BUG + threat = 2 melee_damage_lower = 30 melee_damage_upper = 30 maxHealth = 300 diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index b2e6fa9704..c05d14965e 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -14,6 +14,7 @@ icon_living = "mook" icon_dead = "mook_dead" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + threat = 0.5 pixel_x = -16 maxHealth = 45 health = 45 diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 7565a686bf..0521afa9e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -13,6 +13,7 @@ icon_state = "seedling" icon_living = "seedling" icon_dead = "seedling_dead" + threat = 0.5 maxHealth = 100 health = 100 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 17658cc7c1..e418cc4ab0 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -5,6 +5,7 @@ icon_living = "tomato" icon_dead = "tomato_dead" gender = NEUTER + threat = 0.3 speak_chance = 0 turns_per_move = 5 maxHealth = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index a0e6561c68..c90ebe8a5c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -23,6 +23,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner name = "blood-drunk miner" desc = "A miner destined to wander forever, engaged in an endless hunt." + threat = 15 health = 900 maxHealth = 900 icon_state = "miner" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index b50ebfe160..0d4b7d1b1f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -26,6 +26,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum name = "bubblegum" desc = "In what passes for a hierarchy among slaughter demons, this one is king." + threat = 35 health = 2500 maxHealth = 2500 attacktext = "rends" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index f8ba050864..08bd1cedbc 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -24,6 +24,7 @@ Difficulty: Very Hard /mob/living/simple_animal/hostile/megafauna/colossus name = "colossus" desc = "A monstrous creature protected by heavy shielding." + threat = 40 health = 2500 maxHealth = 2500 attacktext = "judges" @@ -603,6 +604,7 @@ Difficulty: Very Hard icon_state = "lightgeist" icon_living = "lightgeist" icon_dead = "butterfly_dead" + threat = -0.7 turns_per_move = 1 response_help = "waves away" response_disarm = "brushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 0e3cde5628..4644992ad0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -33,6 +33,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon name = "ash drake" desc = "Guardians of the necropolis." + threat = 30 health = 2500 maxHealth = 2500 spacewalk = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 7cfae9310a..a9d42373a2 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -37,6 +37,7 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant name = "hierophant" desc = "A massive metal club that hangs in the air as though waiting. It'll make you dance to its beat." + threat = 30 health = 2500 maxHealth = 2500 attacktext = "clubs" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 43ce940d57..62a09dff65 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -18,6 +18,7 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/legion name = "Legion" + threat = 30 health = 800 maxHealth = 800 spacewalk = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 1cbabd41dd..4d20d4c7fb 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -8,6 +8,7 @@ icon_aggro = "Basilisk_alert" icon_dead = "Basilisk_dead" icon_gib = "syndicate_gib" + threat = 4 mob_biotypes = MOB_ORGANIC|MOB_BEAST move_to_delay = 20 projectiletype = /obj/item/projectile/temp/basilisk diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index 8687b2d14c..652840f7e3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -10,6 +10,7 @@ move_to_delay = 5 vision_range = 20 aggro_vision_range = 20 + threat = 1 maxHealth = 40 //easy to kill, but oh, will you be seeing a lot of them. health = 40 melee_damage_lower = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 1156b11db3..2114612fce 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -11,6 +11,7 @@ robust_searching = TRUE ranged_ignores_vision = TRUE ranged = TRUE + threat = 5 obj_damage = 5 vision_range = 6 aggro_vision_range = 18 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index fdc3e2e9b7..68a0e81cc7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -25,6 +25,7 @@ icon_aggro = "broodmother" icon_dead = "egg_sac" icon_gib = "syndicate_gib" + threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 0d62eb260d..95fafbabfd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -24,6 +24,7 @@ icon_aggro = "herald" icon_dead = "herald_dying" icon_gib = "syndicate_gib" + threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 1bc9ea1e4e..d83a38ae24 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -24,6 +24,7 @@ icon_aggro = "legionnaire" icon_dead = "legionnaire_dead" icon_gib = "syndicate_gib" + threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index e65c4f5b20..3276965fa2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -24,6 +24,7 @@ icon_aggro = "pandora" icon_dead = "pandora_dead" icon_gib = "syndicate_gib" + threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index 25e38652e1..c43e9a7461 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -8,6 +8,7 @@ icon_aggro = "Goldgrub_alert" icon_dead = "Goldgrub_dead" icon_gib = "syndicate_gib" + threat = 0.2 mob_biotypes = MOB_ORGANIC|MOB_BEAST vision_range = 2 aggro_vision_range = 9 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 87abc1ea14..3c8cf9025f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -10,6 +10,7 @@ icon_gib = "syndicate_gib" mob_biotypes = MOB_ORGANIC|MOB_BEAST mouse_opacity = MOUSE_OPACITY_OPAQUE + threat = 2 move_to_delay = 10 ranged = 1 ranged_cooldown_time = 60 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 800c35493b..b41ca15948 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -9,6 +9,7 @@ icon_gib = "syndicate_gib" mob_biotypes = MOB_ORGANIC mouse_opacity = MOUSE_OPACITY_OPAQUE + threat = 4 move_to_delay = 14 ranged = 1 vision_range = 4 @@ -233,6 +234,7 @@ icon_state = "legion" icon_living = "legion" icon_dead = "legion" + threat = 5 health = 450 maxHealth = 450 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 363e3ec573..1c8b171738 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -10,6 +10,7 @@ obj_damage = 100 melee_damage_lower = 25 melee_damage_upper = 50 + threat = 2 attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' faction = list("creature") diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 1b2212bf55..d8737d1edc 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -11,6 +11,7 @@ response_help = "pushes" response_disarm = "shoves" response_harm = "hits" + threat = 3 speed = 0 maxHealth = 115 health = 115 diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index c99c7a04b5..9c3e3e0b92 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -13,6 +13,7 @@ response_disarm = "shoves" response_harm = "hits" speed = 0 + threat = 1 maxHealth = 100 health = 100 harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/sharks.dm b/code/modules/mob/living/simple_animal/hostile/sharks.dm index 4e16a1f7bd..4008334a57 100644 --- a/code/modules/mob/living/simple_animal/hostile/sharks.dm +++ b/code/modules/mob/living/simple_animal/hostile/sharks.dm @@ -16,6 +16,7 @@ response_disarm = "gently pushes aside" response_harm = "hits" speed = 0 + threat = 1 maxHealth = 75 health = 75 harm_intent_damage = 18 diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index 51c55cbf65..df71701bb7 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -11,6 +11,7 @@ speak_emote = list("rattles") emote_see = list("rattles") a_intent = INTENT_HARM + threat = 0.5 maxHealth = 40 blood_volume = 0 health = 40 @@ -62,6 +63,7 @@ icon_state = "templar" icon_living = "templar" icon_dead = "templar_dead" + threat = 1.5 maxHealth = 150 health = 150 weather_immunities = list("snow") @@ -95,6 +97,7 @@ icon_state = "plasma_miner" icon_living = "plasma_miner" icon_dead = "plasma_miner" + threat = 2 maxHealth = 150 health = 150 harm_intent_damage = 10 @@ -111,6 +114,7 @@ icon_state = "plasma_miner_tool" icon_living = "plasma_miner_tool" icon_dead = "plasma_miner_tool" + threat = 3 maxHealth = 185 health = 185 harm_intent_damage = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 2bab332cd0..fb31e48d90 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -10,7 +10,7 @@ gender = NEUTER a_intent = INTENT_HARM mob_biotypes = MOB_HUMANOID - + threat = 3 response_help = "touches" response_disarm = "pushes" diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 855d55938d..24bf5e9ea9 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -5,6 +5,7 @@ icon_living = "stickman" icon_dead = "stickman_dead" icon_gib = "syndicate_gib" + threat = 0.5 mob_biotypes = MOB_HUMANOID gender = MALE speak_chance = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 22bc968f84..8c4e19774d 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -28,6 +28,7 @@ response_help = "pokes" response_disarm = "shoves" response_harm = "hits" + threat = 1 speed = 0 stat_attack = UNCONSCIOUS robust_searching = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index a915ede835..bc932666f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -7,6 +7,7 @@ icon_dead = "pine_1" icon_gib = "pine_1" gender = NEUTER + threat = 1 speak_chance = 0 turns_per_move = 5 response_help = "brushes" diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 976f8df229..13a4d1793e 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -50,6 +50,7 @@ name = "venus human trap" desc = "Now you know how the fly feels." icon_state = "venus_human_trap" + threat = 1 layer = SPACEVINE_MOB_LAYER health = 50 maxHealth = 50 diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index f97613fe8f..7265540679 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -11,6 +11,7 @@ response_help = "pokes" response_disarm = "shoves" response_harm = "hits" + threat = 3 speed = 0 maxHealth = 100 health = 100 diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index 88b5bcc373..8878f17893 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -11,6 +11,7 @@ mob_biotypes = MOB_ORGANIC|MOB_BEAST mouse_opacity = MOUSE_OPACITY_ICON move_to_delay = 5 + threat = 1 friendly = "floats near" speak_emote = list("puffs") vision_range = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index e926a5d332..503f5c121e 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -7,6 +7,7 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 stat_attack = UNCONSCIOUS //braains + threat = 1 maxHealth = 100 health = 100 harm_intent_damage = 5 diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm index 46f8f806e4..67e071b274 100644 --- a/code/modules/ruins/spaceruin_code/clericsden.dm +++ b/code/modules/ruins/spaceruin_code/clericsden.dm @@ -21,6 +21,7 @@ desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke." icon_state = "proteon" icon_living = "proteon" + threat = 0.4 maxHealth = 35 health = 35 melee_damage_lower = 8 diff --git a/config/config.txt b/config/config.txt index 306d1d9a6d..fd5dc968fb 100644 --- a/config/config.txt +++ b/config/config.txt @@ -7,6 +7,7 @@ $include antag_rep.txt $include donator_groupings.txt $include dynamic_config.txt $include plushies/defines.txt +$include job_threats.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: diff --git a/config/job_threats.txt b/config/job_threats.txt new file mode 100644 index 0000000000..b3f0e2162d --- /dev/null +++ b/config/job_threats.txt @@ -0,0 +1,5 @@ +## Custom job threat values +## List of job titles followed by dynamic threat value, all prefixed with JOB_THREAT. See code/modules/jobs/job_types for titles +## e.g. +## JOB_THREAT Captain 5 +## JOB_THREAT Assistant 0.2 \ No newline at end of file From 66c3f6e1be63a675f3be8fa1bf3ee4c6cb99b422 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 11:40:41 -0500 Subject: [PATCH 036/128] Automatic changelog generation for PR #11515 [ci skip] --- html/changelogs/AutoChangeLog-pr-11515.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11515.yml diff --git a/html/changelogs/AutoChangeLog-pr-11515.yml b/html/changelogs/AutoChangeLog-pr-11515.yml new file mode 100644 index 0000000000..63e6de4526 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11515.yml @@ -0,0 +1,8 @@ +author: "Putnam3145" +delete-after: True +changes: + - tweak: "Dynamic reworked to be more \"storyteller-like\": threat is now how threatened the station is right now and threat level is how much the mode wants the station to be threatened." + - tweak: "Random storyteller is now truly random." + - tweak: "Story storyteller now gives a nice rising-action-climax-falling action curve for threat level." + - tweak: "\"Chaotic\" storyteller now simply ramps up threat level as round goes on." + - rscadd: "\"Classic\" storyteller, basically doing what \"random\" did before." From e4550efb39b2b9f55e94a2a34c718641469e9495 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 17:45:11 +0100 Subject: [PATCH 037/128] Fixing creamed snout overlay a second time. --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 57667293e7..097788dd7b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -708,7 +708,7 @@ /mob/living/carbon/human/wash_cream() if(creamed) //clean both to prevent a rare bug - cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_lizard")) + cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_snout")) cut_overlay(mutable_appearance('icons/effects/creampie.dmi', "creampie_human")) creamed = FALSE From cbb5d52ca1f5e7702bc105d2a588e9c4845c4591 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 25 Mar 2020 10:37:39 -0700 Subject: [PATCH 038/128] Melee Stagger (#11443) * combat refactoring * i hate this * mobility flags part 2 time xd * whew * stuff * a * ok * changes * Wew * k * add flags * FUCKYOUVORE * fixes * typo * no using this in hard stamcrit * update icon * woopsy * . = ..() * sigh * Update living_combat.dm * wew * wups * fix * wack * animation is now shorter * linter save me * i hate you * k * k * k * i hate you * wrong button * k * ok * bet * bet * bet * Update item_attack.dm * k * Update code/modules/mob/living/living_combat.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * Update code/modules/mob/living/living_combat.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * Update code/modules/mob/living/living_combat.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * early returns * skreee * agony * k * k * k * k * wack * compile * wack * fix Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/__DEFINES/combat.dm | 1 + code/_onclick/item_attack.dm | 30 ++++++++++++++++++- code/datums/status_effects/debuffs.dm | 1 + code/game/objects/items.dm | 5 ++++ .../mob/living/carbon/carbon_defense.dm | 1 + .../mob/living/carbon/human/human_defense.dm | 1 - .../mob/living/carbon/human/human_defines.dm | 1 + .../mob/living/carbon/human/species.dm | 2 ++ 8 files changed, 40 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index c750119701..be0a4d0f59 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -82,6 +82,7 @@ #define CANUNCONSCIOUS (1<<2) #define CANPUSH (1<<3) #define GODMODE (1<<4) +#define CANSTAGGER (1<<5) //Health Defines #define HEALTH_THRESHOLD_CRIT 0 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index fe407509fe..13940e94e7 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -50,7 +50,6 @@ user.changeNext_move(CLICK_CD_MELEE) return I.attack(src, user) - /obj/item/proc/attack(mob/living/M, mob/living/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK) return @@ -117,6 +116,7 @@ if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) return FALSE send_item_attack_message(I, user) + I.do_stagger_action(src, user) if(I.force) apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW)) @@ -166,5 +166,33 @@ playsound(src, 'sound/weapons/dink.ogg', 30, 1) return 1 +/// How much stamina this takes to swing this is not for realism purposes hecc off. /obj/item/proc/getweight() return total_mass || w_class * 1.25 + +/// How long this staggers for. 0 and negatives supported. +/obj/item/proc/melee_stagger_duration() + if(!isnull(stagger_force)) + return stagger_force + /// totally not an untested, arbitrary equation. + return clamp((1.5 + (w_class/7.5)) * (force / 2), 0, 10 SECONDS) + +/obj/item/proc/do_stagger_action(mob/living/target, mob/living/user) + if(!CHECK_BITFIELD(target.status_flags, CANSTAGGER)) + return FALSE + if(target.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) + target.do_staggered_animation() + var/duration = melee_stagger_duration() + if(!duration) //0 + return FALSE + else if(duration > 0) + target.Stagger(duration) + else //negative + target.AdjustStaggered(duration) + return TRUE + +/mob/proc/do_staggered_animation() + set waitfor = FALSE + animate(src, pixel_x = -2, pixel_y = -2, time = 1, flags = ANIMATION_RELATIVE | ANIMATION_PARALLEL) + animate(pixel_x = 4, pixel_y = 4, time = 1, flags = ANIMATION_RELATIVE) + animate(pixel_x = -2, pixel_y = -2, time = 0.5, flags = ANIMATION_RELATIVE) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index cf10244890..5a69ebe427 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -90,6 +90,7 @@ /datum/status_effect/staggered id = "staggered" blocks_sprint = TRUE + alert_type = null /datum/status_effect/staggered/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5a215f0396..e1d6101aa5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -34,7 +34,12 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/usesound = null var/throwhitsound = null var/w_class = WEIGHT_CLASS_NORMAL + + /// The amount of stamina it takes to swing an item in a normal melee attack do not lie to me and say it's for realism because it ain't. If null it will autocalculate from w_class. 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. + /// How long, in deciseconds, this staggers for, if null it will autocalculate from w_class and force. Unlike total mass this supports 0 and negatives. + var/stagger_force + var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE pressure_resistance = 4 diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 32d8d7e605..1e87a1b88b 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -97,6 +97,7 @@ affecting = bodyparts[1] SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) send_item_attack_message(I, user, affecting.name) + I.do_stagger_action(src, user) if(I.force) apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1fc43f0d41..f4227e390e 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -121,7 +121,6 @@ // the attacked_by code varies among species return dna.species.spec_attacked_by(I, user, affecting, a_intent, src) - /mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) if(user.a_intent == INTENT_HARM) . = ..(user, TRUE) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 2e5efa3105..d20c556c6c 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -8,6 +8,7 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID /// Enable stamina combat combat_flags = COMBAT_FLAGS_DEFAULT + status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH|CANSTAGGER //Hair colour and style var/hair_color = "000" diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 98a4e279e9..375050f964 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1695,6 +1695,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.send_item_attack_message(I, user, hit_area) + I.do_stagger_action(H, user) + if(!I.force) return 0 //item force is zero From bae145b39258625455d951865dbae0aeb82b1f0d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 12:37:45 -0500 Subject: [PATCH 039/128] Automatic changelog generation for PR #11443 [ci skip] --- html/changelogs/AutoChangeLog-pr-11443.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11443.yml diff --git a/html/changelogs/AutoChangeLog-pr-11443.yml b/html/changelogs/AutoChangeLog-pr-11443.yml new file mode 100644 index 0000000000..d4b32df2eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11443.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - rscadd: "Melee attacks now stagger people, preventing them from sprinting until the (relatively short lived) effect runs out. Duration equation is [(1.5 + (w_class/7.5)) * force]." From 866d80eb3dbe8e1d7fc90ce5562e970b827185d5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 14:18:52 -0500 Subject: [PATCH 040/128] Automatic changelog generation for PR #11589 [ci skip] --- html/changelogs/AutoChangeLog-pr-11589.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11589.yml diff --git a/html/changelogs/AutoChangeLog-pr-11589.yml b/html/changelogs/AutoChangeLog-pr-11589.yml new file mode 100644 index 0000000000..526d95b927 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11589.yml @@ -0,0 +1,6 @@ +author: "Ghommie" +delete-after: True +changes: + - refactor: "Made votes obfuscation settings more robust." + - admin: "Also included them in custom votes." + - tweak: "The map rotation vote will only hide ongoing votes now, not the results." From ea0bf97a810c6da723c1a6f389463a38a1c064a9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 14:19:17 -0500 Subject: [PATCH 041/128] Automatic changelog generation for PR #11592 [ci skip] --- html/changelogs/AutoChangeLog-pr-11592.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11592.yml diff --git a/html/changelogs/AutoChangeLog-pr-11592.yml b/html/changelogs/AutoChangeLog-pr-11592.yml new file mode 100644 index 0000000000..a1667601eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11592.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Near-station nuclear explosions now display the on-station nuke explosion cinematic, consistently with its clearance of the station level and its nuclear victory / total annihilation ending status." + - balance: "Nuclear bombs can't be anchored in space areas (not just turfs) anymore, as a quick effortless way to discourage players from anchoring the device on the edge of the map." From 8d0d70b92c3f8ef640b88009218aec8893b080c2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 14:19:40 -0500 Subject: [PATCH 042/128] Automatic changelog generation for PR #11598 [ci skip] --- html/changelogs/AutoChangeLog-pr-11598.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11598.yml diff --git a/html/changelogs/AutoChangeLog-pr-11598.yml b/html/changelogs/AutoChangeLog-pr-11598.yml new file mode 100644 index 0000000000..46d0d73d6c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11598.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed crafting hud icon overlapping the second pocket on 1:1 screen mode." From 96e197f086e1f773c7d24e49af4f04585b212a0b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 14:20:20 -0500 Subject: [PATCH 043/128] Automatic changelog generation for PR #11600 [ci skip] --- html/changelogs/AutoChangeLog-pr-11600.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11600.yml diff --git a/html/changelogs/AutoChangeLog-pr-11600.yml b/html/changelogs/AutoChangeLog-pr-11600.yml new file mode 100644 index 0000000000..2c0c5e5a4f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11600.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - code_imp: "Removed some dead flightsuit code leftovers." From c3194d0238a024d3cc40244ac3b927e1f22bc4c7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 14:22:44 -0500 Subject: [PATCH 044/128] Automatic changelog generation for PR #11603 [ci skip] --- html/changelogs/AutoChangeLog-pr-11603.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11603.yml diff --git a/html/changelogs/AutoChangeLog-pr-11603.yml b/html/changelogs/AutoChangeLog-pr-11603.yml new file mode 100644 index 0000000000..56bf29fd55 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11603.yml @@ -0,0 +1,9 @@ +author: "KathrinBailey" +delete-after: True +changes: + - rscadd: "New shutter sprites" + - rscadd: "Reinforced Shutter" + - rscadd: "Radiation Shutter" + - rscadd: "Window Shutter" + - tweak: "Shutters not being blast doors functionally." + - balance: "Shutter armour block and health." From bfe6199d3c38e1ced4676457e68b47881b2c4efc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 14:23:10 -0500 Subject: [PATCH 045/128] Automatic changelog generation for PR #11605 [ci skip] --- html/changelogs/AutoChangeLog-pr-11605.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11605.yml diff --git a/html/changelogs/AutoChangeLog-pr-11605.yml b/html/changelogs/AutoChangeLog-pr-11605.yml new file mode 100644 index 0000000000..caa3cf5c92 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11605.yml @@ -0,0 +1,8 @@ +author: "necromanceranne" +delete-after: True +changes: + - balance: "HEALTH AND STAMINA DON'T STACK FOR PUTTING YOU INTO STAMINA CRIT." + - balance: "YOUR FISTS ARE HELLA GODDAMN STRONG." + - balance: "ACCEPT THE FELINIDS WARES, FOR SKOOMA HAS INCREDIBLE LETHAL PROPERTIES: YOUR HANDS BECOME LIKE SWORDS." + - balance: "BOXERS CAN ONLY KNOCK OUT OTHER BOXERS BECAUSE THEY HAVE HONOR OR SOME SHIT" + - balance: "INCREASED STAMINA DAMAGE TO LIMBS FROM 50% TO 75%." From 0f4444b567affdcc651352d9f7fec18478a02c0d Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 25 Mar 2020 13:16:35 -0700 Subject: [PATCH 046/128] Nerfs piggyback and fireman carrying (#11555) * ok * daze duration increased, MOBILITY_USE now has.. a use. * k * @ghommie --- code/__DEFINES/mobs.dm | 3 ++- code/_onclick/click.dm | 4 ++-- code/_onclick/item_attack.dm | 18 +++++++++++++++--- code/datums/components/riding.dm | 16 ++++++++++++---- code/modules/mob/living/carbon/human/human.dm | 7 ++++--- 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 69e7ac99fc..b4735cd0d8 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -289,4 +289,5 @@ #define HUMAN_FIRE_STACK_ICON_NUM 3 #define PULL_PRONE_SLOWDOWN 0.6 -#define HUMAN_CARRY_SLOWDOWN 0 +#define FIREMAN_CARRY_SLOWDOWN 0 +#define PIGGYBACK_CARRY_SLOWDOWN 1 diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index e8a57bb257..46c2c919f4 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -152,10 +152,10 @@ else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A,1) + UnarmedAttack(A, 1) else if(W) - W.afterattack(A,src,0,params) + W.ranged_attack_chain(src, A, params) else RangedAttack(A,params) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 13940e94e7..f422e073b2 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -8,12 +8,15 @@ *afterattack. The return value does not matter. */ /obj/item/proc/melee_attack_chain(mob/user, atom/target, params) - if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT) - if(isliving(user)) - var/mob/living/L = user + if(isliving(user)) + var/mob/living/L = user + if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT) if(IS_STAMCRIT(L)) to_chat(L, "You are too exhausted to swing [src]!") return + if(!CHECK_MOBILITY(L, MOBILITY_USE)) + to_chat(L, "You are unable to swing [src] right now!") + return if(tool_behaviour && target.tool_act(user, src, tool_behaviour)) return if(pre_attack(target, user, params)) @@ -24,6 +27,15 @@ return afterattack(target, user, TRUE, params) +/// Like melee_attack_chain but for ranged. +/obj/item/proc/ranged_attack_chain(mob/user, atom/target, params) + if(isliving(user)) + var/mob/living/L = user + if(!CHECK_MOBILITY(L, MOBILITY_USE)) + to_chat(L, "You are unable to raise [src] right now!") + return + afterattack(target, user, FALSE, params) + // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. /obj/item/proc/attack_self(mob/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_NO_INTERACT) diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index e7f25a7724..b22d2e09a2 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -191,20 +191,28 @@ ///////Yes, I said humans. No, this won't end well...////////// /datum/component/riding/human + var/fireman_carrying = FALSE /datum/component/riding/human/Initialize() . = ..() RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee) /datum/component/riding/human/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE) - var/mob/living/carbon/human/H = parent - H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING) . = ..() + var/mob/living/carbon/human/H = parent + if(!length(H.buckled_mobs)) + H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING) + if(!fireman_carrying) + M.Daze(25) + REMOVE_TRAIT(M, TRAIT_MOBILITY_NOUSE, src) /datum/component/riding/human/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE) . = ..() var/mob/living/carbon/human/H = parent - H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN) + if(length(H.buckled_mobs)) + H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = fireman_carrying? FIREMAN_CARRY_SLOWDOWN : PIGGYBACK_CARRY_SLOWDOWN) + if(fireman_carrying) + ADD_TRAIT(M, TRAIT_MOBILITY_NOUSE, src) /datum/component/riding/human/proc/on_host_unarmed_melee(atom/target) var/mob/living/carbon/human/H = parent @@ -236,11 +244,11 @@ else return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4)) - /datum/component/riding/human/force_dismount(mob/living/user) var/atom/movable/AM = parent AM.unbuckle_mob(user) user.DefaultCombatKnockdown(60) + user.Daze(50) user.visible_message("[AM] pushes [user] off of [AM.p_them()]!") /datum/component/riding/cyborg diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f12ac14ece..90a3d628dc 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -898,7 +898,7 @@ //Second check to make sure they're still valid to be carried if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) target.set_resting(FALSE, TRUE) - buckle_mob(target, TRUE, TRUE, 90, 1, 0) + buckle_mob(target, TRUE, TRUE, 90, 1, 0, TRUE) return visible_message("[src] fails to fireman carry [target]!") else @@ -915,13 +915,13 @@ if(target.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE)) target.visible_message("[target] can't hang onto [src]!") return - buckle_mob(target, TRUE, TRUE, FALSE, 0, 2) + buckle_mob(target, TRUE, TRUE, FALSE, 0, 2, FALSE) else visible_message("[target] fails to climb onto [src]!") else to_chat(target, "You can't piggyback ride [src] right now!") -/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0) +/mob/living/carbon/human/buckle_mob(mob/living/target, force = FALSE, check_loc = TRUE, lying_buckle = FALSE, hands_needed = 0, target_hands_needed = 0, fireman = FALSE) if(!force)//humans are only meant to be ridden through piggybacking and special cases return if(!is_type_in_typecache(target, can_ride_typecache)) @@ -952,6 +952,7 @@ stop_pulling() riding_datum.handle_vehicle_layer() + riding_datum.fireman_carrying = fireman . = ..(target, force, check_loc) /mob/living/carbon/human/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this From f7fe29474291f21983a9d3634a7f70b80e53210b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 15:16:38 -0500 Subject: [PATCH 047/128] Automatic changelog generation for PR #11555 [ci skip] --- html/changelogs/AutoChangeLog-pr-11555.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11555.yml diff --git a/html/changelogs/AutoChangeLog-pr-11555.yml b/html/changelogs/AutoChangeLog-pr-11555.yml new file mode 100644 index 0000000000..8eca88fa7b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11555.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "Fireman carrying now makes the person being carried unable to use items. Piggybacking now slows down the person being ridden. In both cases, the person riding will be dazed when forcefully dismounted, and dazed for a second if dismounting from piggybacking" From 26ec48f1749e97960d9ab2e7a22037a1194d2f38 Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Thu, 26 Mar 2020 07:18:02 +1100 Subject: [PATCH 048/128] straight shooting guns (#11602) --- code/modules/projectiles/guns/ballistic/automatic.dm | 1 + code/modules/projectiles/guns/ballistic/bow.dm | 3 +-- code/modules/projectiles/guns/ballistic/launchers.dm | 3 ++- code/modules/projectiles/guns/ballistic/magweapon.dm | 2 +- code/modules/projectiles/guns/ballistic/shotgun.dm | 1 + code/modules/projectiles/guns/energy/special.dm | 4 ++++ code/modules/projectiles/guns/misc/chem_gun.dm | 1 + code/modules/projectiles/guns/misc/syringe_gun.dm | 1 + 8 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 39428275c8..31823dccf6 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -365,6 +365,7 @@ can_unsuppress = TRUE can_suppress = TRUE w_class = WEIGHT_CLASS_NORMAL + inaccuracy_modifier = 0 zoomable = TRUE zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. zoom_out_amt = 13 diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm index 83f95c2c54..3f3d2c6f47 100644 --- a/code/modules/projectiles/guns/ballistic/bow.dm +++ b/code/modules/projectiles/guns/ballistic/bow.dm @@ -11,7 +11,7 @@ slot_flags = ITEM_SLOT_BACK item_flags = NONE casing_ejector = FALSE - inaccuracy_modifier = 0.33 //to counteract the innaccuracy from WEAPON_HEAVY, bows are supposed to be accurate but only able to be fired with both hands + inaccuracy_modifier = 0 //to counteract the innaccuracy from WEAPON_HEAVY, bows are supposed to be accurate but only able to be fired with both hands pin = null no_pin_required = TRUE trigger_guard = TRIGGER_GUARD_NONE //so ashwalkers can use it @@ -62,5 +62,4 @@ desc = "Some sort of pipe made projectile weapon made of a silk string and lots of bending. Used to fire arrows." icon_state = "pipebow" item_state = "pipebow" - inaccuracy_modifier = 1.1 //Made of pipe and in a rush force = 0 diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 12006440d2..db614b97d3 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -6,6 +6,7 @@ name = "grenade launcher" icon_state = "dshotgun-sawn" item_state = "gun" + inaccuracy_modifier = 0 mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher fire_sound = 'sound/weapons/grenadelaunch.ogg' w_class = WEIGHT_CLASS_NORMAL @@ -86,7 +87,7 @@ pin = /obj/item/firing_pin/implant/pindicate burst_size = 1 fire_delay = 0 - inaccuracy_modifier = 0.7 + inaccuracy_modifier = 0 casing_ejector = FALSE weapon_weight = WEAPON_HEAVY magazine_wording = "rocket" diff --git a/code/modules/projectiles/guns/ballistic/magweapon.dm b/code/modules/projectiles/guns/ballistic/magweapon.dm index 4e37017b79..f1d02e5cc2 100644 --- a/code/modules/projectiles/guns/ballistic/magweapon.dm +++ b/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -14,7 +14,7 @@ spread = 0 recoil = 0.1 casing_ejector = FALSE - inaccuracy_modifier = 0.5 + inaccuracy_modifier = 0 dualwield_spread_mult = 1.4 weapon_weight = WEAPON_MEDIUM var/obj/item/stock_parts/cell/cell diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 612896ffb8..7fb17ced57 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -113,6 +113,7 @@ icon_state = "moistnugget" item_state = "moistnugget" slot_flags = 0 //no ITEM_SLOT_BACK sprite, alas + inaccuracy_modifier = 0 mag_type = /obj/item/ammo_box/magazine/internal/boltaction var/bolt_open = FALSE can_bayonet = TRUE diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 42de0dcae8..807b414ce4 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -89,6 +89,7 @@ suppressed = TRUE ammo_type = list(/obj/item/ammo_casing/energy/bolt) weapon_weight = WEAPON_LIGHT + inaccuracy_modifier = 0 obj_flags = 0 overheat_time = 20 holds_charge = TRUE @@ -125,6 +126,7 @@ attack_verb = list("attacked", "slashed", "cut", "sliced") force = 12 sharpness = IS_SHARP + inaccuracy_modifier = 0 can_charge = 0 heat = 3800 @@ -180,6 +182,7 @@ item_state = null icon_state = "wormhole_projector" pin = null + inaccuracy_modifier = 0 var/obj/effect/portal/p_blue var/obj/effect/portal/p_orange var/atmos_link = FALSE @@ -315,6 +318,7 @@ icon_state = "emitter_carbine" force = 12 w_class = WEIGHT_CLASS_SMALL + inaccuracy_modifier = 0 cell_type = /obj/item/stock_parts/cell/super ammo_type = list(/obj/item/ammo_casing/energy/emitter) diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/misc/chem_gun.dm index 3d400f0e16..c05ec1c4be 100644 --- a/code/modules/projectiles/guns/misc/chem_gun.dm +++ b/code/modules/projectiles/guns/misc/chem_gun.dm @@ -9,6 +9,7 @@ throw_speed = 3 throw_range = 7 force = 4 + inaccuracy_modifier = 0 custom_materials = list(/datum/material/iron=2000) clumsy_check = FALSE fire_sound = 'sound/items/syringeproj.ogg' diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index b3838751eb..a5f871bdf0 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -7,6 +7,7 @@ throw_speed = 3 throw_range = 7 force = 4 + inaccuracy_modifier = 0 custom_materials = list(/datum/material/iron=2000) clumsy_check = 0 fire_sound = 'sound/items/syringeproj.ogg' From c986d440b67ec991bcaebde23593671d43a3a052 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 15:18:05 -0500 Subject: [PATCH 049/128] Automatic changelog generation for PR #11602 [ci skip] --- html/changelogs/AutoChangeLog-pr-11602.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11602.yml diff --git a/html/changelogs/AutoChangeLog-pr-11602.yml b/html/changelogs/AutoChangeLog-pr-11602.yml new file mode 100644 index 0000000000..a2e3a1f8f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11602.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - balance: "Several guns now shoot exactly where you click regardless of movement or turning." From 36d5d5e14170439d2e9fbbe37c675ed6ce2b28da Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 23:33:50 +0100 Subject: [PATCH 050/128] Antagonists such as wizard and nuke ops are now more anonymous. --- code/__DEFINES/dcs/signals.dm | 1 + code/datums/elements/flavor_text.dm | 9 +++++++++ code/game/objects/structures/crates_lockers/closets.dm | 6 +++--- code/modules/antagonists/_common/antag_datum.dm | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 3d76390ce1..0593a3c8f8 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -175,6 +175,7 @@ #define SPEECH_LANGUAGE 5 // #define SPEECH_IGNORE_SPAM 6 // #define SPEECH_FORCED 7 +#define COMSIG_MOB_ANTAG_ON_GAIN "mob_antag_on_gain" //from base of /datum/antagonist/on_gain(): (antag_datum) // /mob/living signals #define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index 373647d6f5..5e0c581ec9 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -114,6 +114,9 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code //subtypes with additional hooks for DNA and preferences. /datum/element/flavor_text/carbon + //list of antagonists etcetera that should have nothing to do with people's snowflakes. + var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert, + /datum/antagonist/nukeop, /datum/antagonist/official, /datum/antagonist/wizard)) /datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE) if(!iscarbon(target)) @@ -144,3 +147,9 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code /datum/element/flavor_text/carbon/proc/unset_flavor(mob/living/carbon/user) texts_by_atom[user] = "" + +/datum/element/flavor_text/carbon/proc/on_antag_gain(mob/living/carbon/user, datum/antagonist/antag) + if(is_type_in_typecache(antag, i_dont_even_know_who_you_are)) + texts_by_atom[user] = "" + if(user.dna) + user.dna.features["flavor_text"] = "" \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index e19feea582..11db7f37c8 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -121,7 +121,7 @@ return FALSE var/turf/T = get_turf(src) for(var/mob/living/L in T) - if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density) + if(L.move_resist >= MOVE_FORCE_VERY_STRONG || (horizontal && L.mob_size > MOB_SIZE_TINY && L.density)) if(user) to_chat(user, "There's something large on top of [src], preventing it from opening." ) return FALSE @@ -133,7 +133,7 @@ if(closet != src && !closet.wall_mounted) return FALSE for(var/mob/living/L in T) - if(L.anchored || horizontal && L.mob_size > MOB_SIZE_TINY && L.density) + if(L.move_resist >= MOVE_FORCE_VERY_STRONG || horizontal && L.mob_size > MOB_SIZE_TINY && L.density) if(user) to_chat(user, "There's something too large in [src], preventing it from closing.") return FALSE @@ -216,7 +216,7 @@ if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets... return FALSE var/mob/living/L = AM - if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs()) + if(L.move_resist >= MOVE_FORCE_VERY_STRONG || L.buckled || L.incorporeal_move || L.has_buckled_mobs()) return FALSE if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. if(horizontal && L.density) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 2e3626dd4c..19845be315 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -75,6 +75,7 @@ GLOBAL_LIST_EMPTY(antagonists) remove_blacklisted_quirks() if(is_banned(owner.current) && replace_banned) replace_banned_player() + SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src) /datum/antagonist/proc/is_banned(mob/M) if(!M) From 4a01e59623a987f86b2814303a8aa05eacc9dcf7 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 23:36:31 +0100 Subject: [PATCH 051/128] Signals things. --- code/datums/elements/flavor_text.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index 5e0c581ec9..d34d6946ae 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -125,6 +125,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code if(. == ELEMENT_INCOMPATIBLE) return RegisterSignal(target, COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, .proc/update_dna_flavor_text) + RegisterSignal(target, COMSIG_MOB_ANTAG_ON_GAIN, .proc/on_antag_gain) if(ishuman(target)) RegisterSignal(target, COMSIG_HUMAN_PREFS_COPIED_TO, .proc/update_prefs_flavor_text) RegisterSignal(target, COMSIG_HUMAN_HARDSET_DNA, .proc/update_dna_flavor_text) @@ -132,7 +133,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code /datum/element/flavor_text/carbon/Detach(mob/living/carbon/C) . = ..() - UnregisterSignal(C, list(COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, COMSIG_HUMAN_PREFS_COPIED_TO, COMSIG_HUMAN_HARDSET_DNA, COMSIG_HUMAN_ON_RANDOMIZE)) + UnregisterSignal(C, list(COMSIG_CARBON_IDENTITY_TRANSFERRED_TO, COMSIG_MOB_ANTAG_ON_GAIN, COMSIG_HUMAN_PREFS_COPIED_TO, COMSIG_HUMAN_HARDSET_DNA, COMSIG_HUMAN_ON_RANDOMIZE)) /datum/element/flavor_text/carbon/proc/update_dna_flavor_text(mob/living/carbon/C) texts_by_atom[C] = C.dna.features["flavor_text"] From 1642903ab3c62777fc3236c81d80ed22aa042bf0 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 25 Mar 2020 23:46:27 +0100 Subject: [PATCH 052/128] Spares the official because they don't have their name replaced. --- code/datums/elements/flavor_text.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index d34d6946ae..ea8e361694 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -116,7 +116,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code /datum/element/flavor_text/carbon //list of antagonists etcetera that should have nothing to do with people's snowflakes. var/static/list/i_dont_even_know_who_you_are = typecacheof(list(/datum/antagonist/abductor, /datum/antagonist/ert, - /datum/antagonist/nukeop, /datum/antagonist/official, /datum/antagonist/wizard)) + /datum/antagonist/nukeop, /datum/antagonist/wizard)) /datum/element/flavor_text/carbon/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE) if(!iscarbon(target)) From b57ce2d7ff26b861e0b513042056d8f6797f331c Mon Sep 17 00:00:00 2001 From: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Date: Thu, 26 Mar 2020 11:01:34 +1100 Subject: [PATCH 053/128] missed this with my last pr (#11619) --- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 8e79771b62..4b169173ed 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -220,7 +220,7 @@ /obj/item/bodypart/proc/get_damage(include_stamina = FALSE) var/total = brute_dam + burn_dam if(include_stamina) - total += stamina_dam + total = max(total, stamina_dam) return total //Checks disabled status thresholds From 005d7ace3155a63d12d52f95443e539a6c4903d4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 25 Mar 2020 19:01:36 -0500 Subject: [PATCH 054/128] Automatic changelog generation for PR #11619 [ci skip] --- html/changelogs/AutoChangeLog-pr-11619.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11619.yml diff --git a/html/changelogs/AutoChangeLog-pr-11619.yml b/html/changelogs/AutoChangeLog-pr-11619.yml new file mode 100644 index 0000000000..4fe72246c3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11619.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - bugfix: "Fixed limb damage calc" From 17f4b0f34fa5b26846e0d246a3daa5fea47750a2 Mon Sep 17 00:00:00 2001 From: Seris02 Date: Thu, 26 Mar 2020 17:46:41 +0800 Subject: [PATCH 055/128] I assume this works --- code/game/machinery/computer/robot.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 9356a8e933..2621616759 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -11,16 +11,19 @@ /obj/machinery/computer/robotics/proc/can_control(mob/user, mob/living/silicon/robot/R) if(!istype(R)) - return 0 + return FALSE if(isAI(user)) if (R.connected_ai != user) - return 0 + return FALSE if(iscyborg(user)) if (R != user) - return 0 + return FALSE if(R.scrambledcodes) - return 0 - return 1 + return FALSE + if (hasSiliconAccessInArea(user) && !issilicon(user)) + if (!Adjacent(user)) + return FALSE + return TRUE /obj/machinery/computer/robotics/ui_interact(mob/user) . = ..() From 52138696d0a4f5999fccee9fc0a7efb341800d59 Mon Sep 17 00:00:00 2001 From: KathrinBailey Date: Thu, 26 Mar 2020 13:08:37 +0000 Subject: [PATCH 056/128] PROTO KINETIC dream CRUSHER oh yeah give me all the shutters daddy --- .../StationRuins/Box/Engine/engine_am.dmm | 89 ++- .../Box/Engine/engine_singulo.dmm | 135 ++-- .../StationRuins/Box/Engine/engine_sm.dmm | 180 ++--- .../StationRuins/Box/Engine/engine_sm_1x3.dmm | 26 +- .../StationRuins/Box/Engine/engine_sm_3x.dmm | 180 ++--- .../StationRuins/Box/Engine/engine_sm_5x5.dmm | 190 +++--- .../StationRuins/Box/Engine/engine_tesla.dmm | 150 ++--- _maps/map_files/BoxStation/BoxStation.dmm | 493 +++++++------- .../map_files/Deltastation/DeltaStation2.dmm | 615 ++++++++++-------- _maps/map_files/KiloStation/KiloStation.dmm | 34 +- _maps/map_files/MetaStation/MetaStation.dmm | 511 ++++++++------- _maps/map_files/OmegaStation/OmegaStation.dmm | 214 +++--- _maps/map_files/PubbyStation/PubbyStation.dmm | 507 +++++++++------ 13 files changed, 1789 insertions(+), 1535 deletions(-) diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm index 0c83691bd7..c341464197 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm @@ -1,4 +1,35 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ab" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ac" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ad" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen, +/turf/open/floor/plating, +/area/engine/engineering) "aT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/button/door{ @@ -166,13 +197,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"wt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) "xx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -320,16 +344,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"HW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "In" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -366,13 +380,6 @@ /obj/machinery/power/am_control_unit, /turf/open/floor/plating, /area/engine/engineering) -"JC" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "JZ" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -525,16 +532,6 @@ /obj/effect/turf_decal/box/red, /turf/open/floor/engine, /area/engine/engineering) -"YY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "Zb" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -862,7 +859,7 @@ xJ gf fh dN -YY +aa MD Ch dz @@ -890,7 +887,7 @@ LO Eu Pg cP -JC +ab WI rj dz @@ -918,7 +915,7 @@ NS xx fh zW -JC +ab WI rj dz @@ -946,7 +943,7 @@ yo me aT Aw -JC +ab WI rj dz @@ -973,7 +970,7 @@ MJ jH FK Ch -wt +ad Ch rj rj @@ -1026,7 +1023,7 @@ MJ MJ "} (17,1,1) = {" -wt +ad Zz Wf Ox @@ -1082,7 +1079,7 @@ MJ MJ "} (19,1,1) = {" -wt +ad eJ Zx nW @@ -1141,7 +1138,7 @@ MJ jH Nz Ch -wt +ad Ch rj rj @@ -1170,7 +1167,7 @@ fh WX HQ Aw -JC +ab WI rj dz @@ -1198,7 +1195,7 @@ fh kh fh fh -JC +ab WI rj dz @@ -1226,7 +1223,7 @@ fh kh uG cP -JC +ab WI rj dz @@ -1254,7 +1251,7 @@ eA FY mB Rp -HW +ac Mi Ch dz diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm index 402cfc73cf..da0a0036c5 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_singulo.dmm @@ -1,4 +1,52 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ab" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ac" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ad" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ae" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"af" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/button/door{ @@ -35,16 +83,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"dW" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "ea" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, @@ -299,23 +337,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"wt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"xg" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "xx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -542,16 +563,6 @@ /obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/engineering) -"HW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "In" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -582,19 +593,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"JC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "Kg" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -825,19 +823,6 @@ }, /turf/closed/wall, /area/engine/engineering) -"YY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "Zb" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -1169,7 +1154,7 @@ xJ gf fh dN -YY +aa MD Ch Pt @@ -1197,7 +1182,7 @@ LO Eu Pg cP -JC +ab tv rj Pt @@ -1225,7 +1210,7 @@ NS xx fh zW -dW +ac ea rj Pt @@ -1253,7 +1238,7 @@ yo me aT Aw -JC +ab tv rj Og @@ -1280,7 +1265,7 @@ MJ jH FK Ch -wt +af tE rj rj @@ -1333,7 +1318,7 @@ dz MJ "} (17,1,1) = {" -wt +af Zz Wf Ox @@ -1389,7 +1374,7 @@ MJ MJ "} (19,1,1) = {" -wt +af eJ Zx nW @@ -1448,7 +1433,7 @@ MJ jH Nz Ch -wt +af tE rj rj @@ -1477,7 +1462,7 @@ AF WX HQ Aw -JC +ab tv rj Og @@ -1505,7 +1490,7 @@ fh kh fh fh -dW +ac ea rj Pt @@ -1533,7 +1518,7 @@ fh kh uG cP -xg +ad tv rj Pt @@ -1561,7 +1546,7 @@ eA FY mB Rp -HW +ae Mi Ch Pt diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm index 6462cef211..e15eda336c 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm.dmm @@ -1,4 +1,18 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "ab" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -13,6 +27,76 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"ad" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ae" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/tank/internals/plasma, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"af" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ag" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ah" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "at" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/stripes/line{ @@ -178,21 +262,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"df" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "dl" = ( /obj/structure/cable{ icon_state = "1-4" @@ -600,21 +669,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"nW" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) "ou" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -636,20 +690,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"px" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "pA" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -737,19 +777,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/engine/supermatter) -"re" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "rt" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 4 @@ -1091,19 +1118,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"Cn" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "CH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -1571,20 +1585,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"Nw" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "Nx" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -2385,9 +2385,9 @@ VP EX Vg KX -px -nW -Cn +aa +ae +ag fj xB WI @@ -2609,9 +2609,9 @@ Ws Pa wz fj -Nw -df -re +ad +af +ah KX ni lw diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_1x3.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_1x3.dmm index 05e6e4b63f..99c5ca9f76 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_1x3.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_1x3.dmm @@ -1,4 +1,11 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/engine, +/area/engine/supermatter) "ab" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -1805,13 +1812,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"Vz" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/engine, -/area/engine/supermatter) "VP" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/simple/green/visible{ @@ -2320,7 +2320,7 @@ Vg KX px nW -Vz +aa cN xB WI @@ -2348,7 +2348,7 @@ lQ KX RA tE -Vz +aa cN Xy Ml @@ -2376,7 +2376,7 @@ uz RA ti YY -Vz +aa cN JK WT @@ -2488,7 +2488,7 @@ RA Wf mW bq -Vz +aa cN JK WT @@ -2516,7 +2516,7 @@ wz fj RA cY -Vz +aa cN vO Np @@ -2544,7 +2544,7 @@ Ey fj Cn df -Vz +aa cN JK lw diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_3x.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_3x.dmm index 3356ebaa77..ef18ab99d1 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_3x.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_3x.dmm @@ -1,4 +1,18 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "ab" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -13,6 +27,76 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"ad" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ae" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/tank/internals/plasma, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"af" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ag" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ah" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "at" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/stripes/line{ @@ -178,21 +262,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"df" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "dl" = ( /obj/structure/cable{ icon_state = "1-4" @@ -591,21 +660,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"nW" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) "ou" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -627,20 +681,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"px" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "pA" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -728,19 +768,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/engine/supermatter) -"re" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "rt" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ dir = 4 @@ -1065,19 +1092,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"Cn" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "CH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -1546,20 +1560,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"Nw" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "Nx" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -2335,9 +2335,9 @@ VP EX Vg KX -px -nW -Cn +aa +ae +ag fj xB WI @@ -2559,9 +2559,9 @@ Ws Pa wz fj -Nw -df -re +ad +af +ah KX ni lw diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm index 3b3328a8f0..1c36e99ed6 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm @@ -1,4 +1,18 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "ab" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -13,6 +27,76 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"ad" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ae" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/tank/internals/plasma, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"af" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ag" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ah" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "at" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/stripes/line{ @@ -190,21 +274,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"df" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "dl" = ( /obj/structure/cable{ icon_state = "1-4" @@ -619,21 +688,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"nW" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) "ou" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -655,20 +709,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"px" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "pA" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -770,19 +810,6 @@ }, /turf/open/floor/engine, /area/engine/supermatter) -"re" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "rt" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -1127,19 +1154,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"Cn" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "CH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -1605,20 +1619,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"Nw" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "Nx" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -2384,11 +2384,11 @@ bW VP rt Vg -px -px -nW -Cn -Cn +aa +aa +ae +ag +ag xB WI IE @@ -2608,12 +2608,12 @@ hy js Pa xB -Nw -Nw -df -re -re -Vg +ad +ad +af +ah +ah +vO lw bH JV diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_tesla.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_tesla.dmm index af2ba1ffd7..0d52d2b3b8 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_tesla.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_tesla.dmm @@ -1,4 +1,67 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ab" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ac" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ad" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ae" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"af" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "aT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/button/door{ @@ -348,23 +411,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"wt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"xg" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "xx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -478,19 +524,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"Bh" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "Bj" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -605,16 +638,6 @@ /obj/item/clothing/gloves/color/yellow, /turf/open/floor/plasteel, /area/engine/engineering) -"HW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "In" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -645,16 +668,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"JC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "JZ" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -968,19 +981,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"YY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "Zb" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -1318,7 +1318,7 @@ xJ gf fh dN -YY +ab MD Ch Pt @@ -1346,7 +1346,7 @@ LO Eu Pg cP -Bh +ac tv rj Pt @@ -1374,7 +1374,7 @@ NS xx fh zW -Bh +ac tv rj Pt @@ -1402,7 +1402,7 @@ yo me aT Aw -JC +ad WI rj Og @@ -1429,7 +1429,7 @@ MJ jH FK Ch -wt +aa tE rj rj @@ -1482,7 +1482,7 @@ dz MJ "} (17,1,1) = {" -wt +aa Zz Wf Ox @@ -1538,7 +1538,7 @@ MJ MJ "} (19,1,1) = {" -wt +aa eJ Zx nW @@ -1597,7 +1597,7 @@ MJ jH Nz Ch -wt +aa tE rj rj @@ -1626,7 +1626,7 @@ AF WX HQ Aw -JC +ad WI rj Og @@ -1654,7 +1654,7 @@ fh kh fh fh -Bh +ac tv rj Pt @@ -1682,7 +1682,7 @@ fh kh uG cP -xg +ae tv rj Pt @@ -1710,7 +1710,7 @@ eA FY mB Rp -HW +af Mi Ch Pt diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 68e9ee8ec0..2a8b33c46b 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -53,6 +53,29 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) +"aah" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/firingpins{ + pixel_x = 6 + }, +/obj/item/storage/box/firingpins{ + pixel_x = -3 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/poster/official/nt_storm{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "aai" = ( /turf/closed/wall/r_wall, /area/security/prison) @@ -1541,6 +1564,32 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/fore) +"adB" = ( +/obj/structure/rack, +/obj/item/gun/energy/ionrifle, +/obj/item/gun/energy/temperature/security, +/obj/item/clothing/suit/armor/laserproof, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/poster/official/ion_rifle{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "adC" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -2193,23 +2242,44 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "aeF" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/firingpins{ - pixel_x = 6 +/obj/structure/rack, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 }, -/obj/item/storage/box/firingpins{ - pixel_x = -3 +/obj/item/storage/box/handcuffs{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/storage/box/handcuffs{ + pixel_x = 1; + pixel_y = -1 }, -/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ - dir = 4 + dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, /obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/camera/motion{ + c_tag = "Armory Motion Sensor"; + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "aeG" = ( @@ -2470,31 +2540,19 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "aeZ" = ( -/obj/structure/rack, -/obj/item/gun/energy/ionrifle, -/obj/item/gun/energy/temperature/security, -/obj/item/clothing/suit/armor/laserproof, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/wardrobe/mixed, +/obj/item/clothing/under/costume/kilt, +/obj/item/clothing/under/costume/kilt, +/obj/item/clothing/under/dress/skirt/purple, +/obj/item/clothing/head/beret, +/obj/item/clothing/head/beret, +/obj/item/clothing/head/beret, +/obj/structure/sign/poster/official/fashion{ + pixel_x = -32 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "afa" = ( /obj/docking_port/stationary{ dir = 4; @@ -2665,6 +2723,18 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/brig) +"afo" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/maintenance/fore) "afp" = ( /obj/docking_port/stationary{ dir = 4; @@ -3143,6 +3213,14 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"agl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/secure_closet/hydroponics, +/obj/structure/sign/poster/official/hydro_ad{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "agm" = ( /obj/machinery/light{ dir = 8 @@ -3181,11 +3259,11 @@ /turf/open/floor/plasteel, /area/security/brig) "agq" = ( -/obj/machinery/door/poddoor/shutters{ - id = "armory1"; - name = "Armoury Shutter" - }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory"; + name = "Armoury Shutters" + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "agr" = ( @@ -3321,6 +3399,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/main) +"agD" = ( +/obj/machinery/vending/kink, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/official/fashion{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "agE" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box{ @@ -3332,6 +3420,13 @@ }, /turf/open/floor/plasteel, /area/security/main) +"agF" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/sign/poster/official/hydro_ad{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "agG" = ( /obj/machinery/airalarm{ dir = 8; @@ -3436,6 +3531,14 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"agN" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "agO" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Infirmary"; @@ -3467,6 +3570,17 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"agQ" = ( +/obj/structure/table, +/obj/item/folder/white, +/obj/item/reagent_containers/dropper, +/obj/item/soap/nanotrasen, +/obj/item/gun/syringe/dart, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "agR" = ( /obj/effect/turf_decal/loading_area{ dir = 4; @@ -3498,30 +3612,31 @@ /area/ai_monitored/security/armory) "agV" = ( /obj/machinery/button/door{ - id = "armory1"; + id = "armory"; name = "Armory Shutters"; pixel_y = -26; req_access_txt = "3" }, -/obj/machinery/door/poddoor/shutters{ - id = "armory1"; - name = "Armoury Shutter" - }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory"; + name = "Armoury Shutters" + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"agW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "agX" = ( -/obj/machinery/door/poddoor/shutters{ - id = "armory2"; - name = "Armoury Shutter" - }, -/obj/machinery/button/door{ - id = "armory2"; - name = "Armory Shutters"; - pixel_y = -26; - req_access_txt = "3" - }, /obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory2"; + name = "Armoury Shutters" + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "agY" = ( @@ -3674,42 +3789,15 @@ /turf/open/floor/plasteel, /area/security/main) "ahm" = ( -/obj/structure/rack, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 +/obj/effect/spawner/lootdrop/keg, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = -32 }, -/obj/item/storage/box/handcuffs{ - pixel_x = -1; - pixel_y = 1 +/obj/structure/sign/poster/contraband/scum{ + pixel_x = -32 }, -/obj/item/storage/box/handcuffs{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/camera/motion{ - c_tag = "Armory Motion Sensor"; - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) +/turf/open/floor/plating, +/area/maintenance/port/aft) "ahn" = ( /turf/closed/wall, /area/maintenance/fore/secondary) @@ -3741,6 +3829,19 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"ahs" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/enzyme, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "aht" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -4027,6 +4128,34 @@ }, /turf/open/floor/plasteel, /area/security/main) +"ahO" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = 32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ahP" = ( +/obj/machinery/button/door{ + id = "armory2"; + name = "Armory Shutters"; + pixel_y = -26; + req_access_txt = "3" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory2"; + name = "Armoury Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "ahQ" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -4295,11 +4424,15 @@ /turf/open/floor/plasteel, /area/security/brig) "aih" = ( -/obj/machinery/door/poddoor/shutters{ - id = "armory2"; - name = "Armoury Shutter" - }, /obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory3"; + name = "Armoury Shutters" + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "aii" = ( @@ -4677,6 +4810,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/security/brig) +"aiJ" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory3"; + name = "Armoury Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "aiK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -4756,6 +4900,18 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/processing) +"aiV" = ( +/obj/structure/closet/secure_closet/bar{ + req_access_txt = "25" + }, +/obj/item/clothing/under/suit/waiter, +/obj/item/clothing/under/suit/waiter, +/obj/item/clothing/under/suit/waiter, +/obj/item/gun/ballistic/revolver/doublebarrel, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/wood, +/area/crew_quarters/bar) "aiW" = ( /obj/structure/closet/bombcloset/security, /obj/effect/turf_decal/bot, @@ -4776,28 +4932,11 @@ /turf/open/floor/plating, /area/ai_monitored/security/armory) "aja" = ( -/obj/machinery/door/poddoor/shutters{ - id = "armory3"; - name = "Armoury Shutter" +/obj/machinery/chem_master/condimaster{ + name = "HoochMaster 2000" }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) -"ajb" = ( -/obj/machinery/door/poddoor/shutters{ - id = "armory3"; - name = "Armoury Shutter" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) +/turf/open/floor/wood, +/area/crew_quarters/bar) "ajc" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -9196,17 +9335,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"aua" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/wardrobe/mixed, -/obj/item/clothing/under/costume/kilt, -/obj/item/clothing/under/costume/kilt, -/obj/item/clothing/under/dress/skirt/purple, -/obj/item/clothing/head/beret, -/obj/item/clothing/head/beret, -/obj/item/clothing/head/beret, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) "aub" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/yellow, @@ -15255,16 +15383,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aJE" = ( -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" - }, -/obj/item/clothing/under/suit/waiter, -/obj/item/clothing/under/suit/waiter, -/obj/item/clothing/under/suit/waiter, -/obj/item/gun/ballistic/revolver/doublebarrel, -/turf/open/floor/wood, -/area/crew_quarters/bar) "aJF" = ( /obj/machinery/newscaster{ pixel_x = 30 @@ -15659,11 +15777,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) -"aKK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/secure_closet/hydroponics, -/turf/open/floor/plasteel, -/area/hydroponics) "aKL" = ( /obj/machinery/airalarm{ pixel_y = 24 @@ -16622,15 +16735,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aND" = ( -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/cable_coil, -/obj/item/flashlight/lamp, -/obj/item/flashlight/lamp/green, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/crew_quarters/bar) "aNE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -17820,13 +17924,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aQU" = ( -/obj/machinery/vending/kink, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aQV" = ( /obj/machinery/vending/autodrobe/all_access, /obj/structure/disposalpipe/segment{ @@ -21129,19 +21226,6 @@ /obj/item/reagent_containers/glass/bucket, /turf/open/floor/plasteel, /area/hydroponics) -"aYP" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/hydroponics) "aYQ" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/green{ @@ -24267,11 +24351,6 @@ /obj/structure/chair, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bhf" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bhg" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -33764,14 +33843,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"bCG" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/reagent_containers/dropper, -/obj/item/soap/nanotrasen, -/obj/item/gun/syringe/dart, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "bCH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -44817,13 +44888,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/aft) -"ccY" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/obj/item/reagent_containers/food/condiment/enzyme, -/obj/item/reagent_containers/food/condiment/sugar, -/turf/open/floor/plating, -/area/maintenance/port/aft) "ccZ" = ( /obj/structure/chair/stool, /turf/open/floor/plating, @@ -59386,12 +59450,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) -"uUi" = ( -/obj/effect/decal/cleanable/vomit, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) "uVS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -59713,21 +59771,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"vEp" = ( -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "vFr" = ( /obj/structure/cable{ icon_state = "4-8" @@ -79820,7 +79863,7 @@ aLH aLE aOl aPA -aQU +agD aQN nLw sLa @@ -79859,7 +79902,7 @@ aaa aaa aaa bCq -bJP +ahm bCq bSn bCq @@ -79872,7 +79915,7 @@ aaf bCq cAy cAB -ccY +ahs cAD cAH cfw @@ -81602,7 +81645,7 @@ arP aqR wje rQJ -uUi +afo avZ xtP ayA @@ -89028,7 +89071,7 @@ aaT aaf abx aaZ -aeF +aah ack agJ acT @@ -89802,7 +89845,7 @@ aaZ aeY acn agR -ahm +aeF ahA aeE agz @@ -90056,7 +90099,7 @@ aaT gXs abG aaZ -aeZ +adB aco agS aho @@ -90065,7 +90108,7 @@ afb agH agH aip -aja +aih xTe akz alg @@ -90322,7 +90365,7 @@ afd afd ahB aiq -ajb +aiJ mml ajF akN @@ -91089,8 +91132,8 @@ agq agV aaZ aaZ -aih agX +ahP aaZ aaZ aaZ @@ -96023,7 +96066,7 @@ aYV aYV bet bfH -bhf +agN wbE bhh wbE @@ -96039,7 +96082,7 @@ bxN bze bAp bvh -bCG +agQ bBd bFw bDD @@ -96507,7 +96550,7 @@ str rrM clO asZ -aua +aeZ oZl awB att @@ -97290,7 +97333,7 @@ sEi alP aGJ aIe -aJE +aiV aLU aKQ aNu @@ -97807,7 +97850,7 @@ aHM aJm aKz mjr -aND +aja aJC aab aRg @@ -100413,7 +100456,7 @@ bBw bJG bDI bFL -bli +agW bKO bHY bNf @@ -100642,7 +100685,7 @@ aSR aUi aVJ aOX -aYP +agF bal bam aYV @@ -101146,7 +101189,7 @@ wBd aGC aIl aIq -aKK +agl aMy aIp nGf @@ -101398,7 +101441,7 @@ alP nhY aBE aCz -vEp +asw aCJ aGT aIn @@ -108923,7 +108966,7 @@ aaa cNW clt cQw -bNB +ahO cOe cOe cNW diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 73fe2cb8c1..54b5a9c221 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -124,6 +124,33 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"aaq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aar" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "aas" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland1"; @@ -143,10 +170,265 @@ /obj/effect/landmark/xeno_spawn, /turf/open/space, /area/solar/starboard/fore) +"aav" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aaw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aax" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aay" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aaz" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aaA" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aaB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aaC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aaD" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engpa"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aaE" = ( /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) +"aaF" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"aaG" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"aaH" = ( +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/atmospherics_engine) +"aaI" = ( +/obj/structure/dresser, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/cafeteria, +/area/maintenance/port/fore) +"aaJ" = ( +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/sign/poster/official/nt_storm_officer{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/security/main) +"aaK" = ( +/obj/machinery/flasher/portable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/nt_storm{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaL" = ( +/obj/structure/rack, +/obj/item/gun/energy/ionrifle, +/obj/item/clothing/suit/armor/laserproof, +/obj/item/gun/energy/temperature/security, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/ion_rifle{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaM" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/medical/storage) +"aaN" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "aaO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -154,6 +436,30 @@ "aaP" = ( /turf/closed/wall/mineral/plastitanium, /area/hallway/secondary/entry) +"aaQ" = ( +/obj/structure/sign/poster/official/medical_green_cross, +/turf/closed/wall, +/area/medical/medbay/central) +"aaR" = ( +/obj/structure/table/wood, +/obj/item/assembly/igniter, +/obj/item/assembly/igniter, +/obj/item/assembly/timer{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) "aaS" = ( /turf/closed/wall/mineral/plastitanium, /area/construction/mining/aux_base) @@ -9068,13 +9374,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) -"avk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/atmospherics_engine) "avl" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ @@ -10232,20 +10531,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) -"axv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/supermatter) "axw" = ( /obj/structure/cable{ icon_state = "4-8" @@ -10303,19 +10588,6 @@ }, /turf/open/floor/engine, /area/engine/supermatter) -"axD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/supermatter) "axE" = ( /obj/structure/cable{ icon_state = "2-8" @@ -10427,12 +10699,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/fore) -"axN" = ( -/obj/structure/dresser, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/cafeteria, -/area/maintenance/port/fore) "axO" = ( /obj/structure/table/wood, /obj/item/camera, @@ -10979,20 +11245,6 @@ }, /turf/open/floor/circuit/green, /area/engine/supermatter) -"ayM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/supermatter) "ayN" = ( /obj/structure/cable{ icon_state = "2-8" @@ -11587,19 +11839,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) -"azS" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/supermatter) "azT" = ( /obj/machinery/power/rad_collector/anchored, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -16677,20 +16916,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/engine/atmospherics_engine) -"aID" = ( -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/atmospherics_engine) "aIE" = ( /obj/machinery/door/firedoor, /obj/structure/cable/white{ @@ -16710,14 +16935,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmospherics_engine) -"aIF" = ( -/obj/structure/cable/white{ - icon_state = "0-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/atmospherics_engine) "aIG" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/effect/turf_decal/bot, @@ -41291,14 +41508,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"bwj" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/main) "bwk" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -60266,23 +60475,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) -"bXR" = ( -/obj/structure/rack, -/obj/item/gun/energy/ionrifle, -/obj/item/clothing/suit/armor/laserproof, -/obj/item/gun/energy/temperature/security, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) "bXS" = ( /obj/structure/window/reinforced{ dir = 8 @@ -66492,16 +66684,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/engine/engineering) -"chv" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "chw" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -67523,19 +67705,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"cjf" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "cjg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -68306,26 +68475,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ckA" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "ckB" = ( /obj/structure/cable{ icon_state = "4-8" @@ -69094,19 +69243,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"clV" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "clW" = ( /obj/structure/rack, /obj/item/crowbar, @@ -70125,20 +70261,6 @@ /obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/engine/engineering) -"cnE" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cnF" = ( /obj/machinery/requests_console{ department = "Chapel Office"; @@ -71572,22 +71694,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"cqw" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cqx" = ( /obj/structure/cable{ icon_state = "4-8" @@ -76839,25 +76945,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/airless, /area/space/nearstation) -"czs" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engpa"; - name = "Engineering Chamber Shutters" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "czt" = ( /obj/structure/cable{ icon_state = "1-8" @@ -85482,14 +85569,6 @@ }, /turf/open/floor/plasteel, /area/medical/storage) -"cNO" = ( -/obj/machinery/vending/wardrobe/medi_wardrobe, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/storage) "cNP" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -87271,17 +87350,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"cRa" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "cRb" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -103990,17 +104058,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/crew_quarters/abandoned_gambling_den) -"duk" = ( -/obj/structure/table/wood, -/obj/item/assembly/igniter, -/obj/item/assembly/igniter, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) "dul" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -151484,10 +151541,10 @@ car cbV cdJ car -chv -cjf -ckA -clV +aax +aay +aaz +aaA cnC cpa cqs @@ -151495,10 +151552,10 @@ cqr ctq cuR cnC -cjf -czs -clV -chv +aay +aaD +aaA +aax car cFO cbV @@ -152002,13 +152059,13 @@ chx cjh ckC clX -cnE +aaB cpc cqu cqr cts cuT -cnE +aaB clX czt cAL @@ -152040,7 +152097,7 @@ dof dmi dry dta -duk +aaR dvY dod dmi @@ -152458,9 +152515,9 @@ asq atO auX awf -axv -axv -azS +aaq +aaq +aaw awi aCk aDn @@ -152518,9 +152575,9 @@ cjn clZ cnF car -cqw +aaC car -cqw +aaC car car cxF @@ -154514,16 +154571,16 @@ asy atW avf awi -axD -ayM -axD +aar +aav +aar awf aCp aDs aEv aFE aHh -aID +aaG aKb aLv aMG @@ -155037,7 +155094,7 @@ aDt aEx aFG aHj -aIF +aaH aKd aLx aMG @@ -155797,8 +155854,8 @@ aad alT alT alT -avk -avk +aaF +aaF alT alT azZ @@ -159140,7 +159197,7 @@ asL aue avt aws -axN +aaI ayY aAc aBo @@ -170534,7 +170591,7 @@ cNz dbm dcX dev -cPy +aaQ dhe diz dkp @@ -171296,7 +171353,7 @@ cKE bsE cNE cPy -cRa +aaN cSK cUE cQX @@ -174892,7 +174949,7 @@ cIc cAm cKO cMm -cNO +aaM vEq cRi cSV @@ -180771,7 +180828,7 @@ bFP bHI bJC bLs -bNp +aaK bNp bNp bTi @@ -181018,7 +181075,7 @@ bpp bru btt buQ -bwj +aaJ bhd byO bAs @@ -181804,7 +181861,7 @@ bPA bRw bTk bVr -bXR +aaL bZY cbL bLs diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 376046512f..446fe3e519 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -53,6 +53,17 @@ "aaf" = ( /turf/closed/wall/r_wall, /area/security/brig) +"aag" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/engine/supermatter) "aah" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -72321,17 +72332,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/ai_monitored/security/armory) -"cin" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/plasteel/dark, -/area/engine/supermatter) "cio" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -122951,9 +122951,9 @@ coc azE brn aLF -cin -cin -cin +aag +aag +aag aLF cut cuO @@ -125007,9 +125007,9 @@ cos aAd bFh aLF -cin -cin -cin +aag +aag +aag aLF cuA cuW diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index e69b4b67ce..db9a620ad6 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2,10 +2,77 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = 24 + }, +/obj/structure/rack, +/obj/item/grenade/barrier{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/grenade/barrier, +/obj/item/grenade/barrier{ + pixel_x = 3; + pixel_y = -1 + }, +/obj/item/grenade/barrier{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/nt_storm_officer{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "aac" = ( /obj/effect/landmark/carpspawn, /turf/open/space, /area/space) +"aad" = ( +/obj/structure/rack, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/head/helmet/alt, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/head/helmet/alt, +/obj/item/clothing/suit/armor/bulletproof, +/obj/item/clothing/head/helmet/alt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/nt_storm{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aae" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "aaf" = ( /obj/structure/lattice, /turf/open/space, @@ -246,6 +313,19 @@ }, /turf/open/floor/plating, /area/security/prison) +"aaM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "aaN" = ( /obj/structure/cable{ icon_state = "0-2" @@ -288,6 +368,58 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"aaU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/crowbar, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aaV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aaW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory"; + name = "Armoury Shutters" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) +"aaX" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/plasteel, +/area/engine/engineering) "aaY" = ( /obj/structure/cable{ icon_state = "1-2" @@ -322,6 +454,20 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/security/prison) +"abd" = ( +/obj/machinery/vending/cola/random, +/obj/structure/sign/poster/official/pda_ad600{ + pixel_x = -32 + }, +/obj/structure/sign/poster/official/pda_ad800{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/secondary/command) "abe" = ( /turf/closed/wall, /area/security/prison) @@ -376,6 +522,14 @@ /obj/item/canvas/twentythreeXtwentythree, /turf/open/floor/plasteel, /area/security/prison) +"abk" = ( +/obj/structure/kitchenspike_frame, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "abl" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -445,6 +599,25 @@ }, /turf/open/floor/plasteel/cafeteria, /area/security/prison) +"abt" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/hydro_ad{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "abu" = ( /obj/docking_port/stationary{ dwidth = 1; @@ -521,6 +694,16 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel, /area/security/prison) +"abE" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/hydro_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "abF" = ( /obj/structure/table, /obj/structure/cable/yellow{ @@ -542,6 +725,30 @@ /obj/item/toy/cards/deck, /turf/open/floor/plasteel, /area/security/prison) +"abH" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "abI" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -723,6 +930,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/prison) +"acd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "ace" = ( /obj/machinery/vending/sustenance{ desc = "A vending machine normally reserved for work camps."; @@ -1388,6 +1605,22 @@ }, /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) +"adk" = ( +/obj/structure/sign/poster/contraband/scum{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"adl" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/storage/box/donkpockets, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/fore) "adm" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -1568,6 +1801,35 @@ }, /turf/open/space, /area/space/nearstation) +"adH" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/fashion{ + pixel_y = -32 + }, +/obj/structure/sign/poster/official/fashion{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/locker) +"adI" = ( +/obj/structure/rack, +/obj/item/hatchet, +/obj/item/reagent_containers/blood/random, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "adJ" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -2918,37 +3180,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"afZ" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = 24 - }, -/obj/structure/rack, -/obj/item/grenade/barrier{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/grenade/barrier, -/obj/item/grenade/barrier{ - pixel_x = 3; - pixel_y = -1 - }, -/obj/item/grenade/barrier{ - pixel_x = 6; - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) "aga" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -3427,26 +3658,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"agQ" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/head/helmet/alt, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/head/helmet/alt, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/head/helmet/alt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) "agR" = ( /obj/machinery/airalarm{ dir = 4; @@ -4781,23 +4992,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/warden) -"ajs" = ( -/obj/machinery/door/poddoor/shutters{ - id = "armory"; - name = "armory shutters" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) "ajt" = ( /obj/structure/closet{ name = "Evidence Closet 5" @@ -11663,13 +11857,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) -"awA" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/storage/box/donkpockets, -/turf/open/floor/plating, -/area/maintenance/fore) "awB" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/storage/box/lights/mixed, @@ -16876,11 +17063,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aGW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/plasteel, -/area/engine/engineering) "aGX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -21786,20 +21968,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aRq" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/start/station_engineer, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aRr" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -22834,15 +23002,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"aTF" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aTG" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -23483,20 +23642,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) -"aUO" = ( -/obj/structure/closet/wardrobe/grey, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/locker) "aUP" = ( /obj/structure/closet/wardrobe/white, /obj/effect/turf_decal/tile/neutral{ @@ -26034,19 +26179,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aZJ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "aZK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/shower{ @@ -39514,10 +39646,6 @@ "bzJ" = ( /turf/closed/wall, /area/hallway/secondary/command) -"bzK" = ( -/obj/machinery/vending/cola/random, -/turf/open/floor/plasteel/dark, -/area/hallway/secondary/command) "bzL" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, @@ -53582,22 +53710,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"ccp" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) "ccq" = ( /obj/structure/table, /obj/item/book/manual/hydroponics_pod_people, @@ -56716,27 +56828,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"cik" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "cil" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -61846,12 +61937,6 @@ /obj/item/gun/syringe/dart, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"csb" = ( -/obj/structure/rack, -/obj/item/hatchet, -/obj/item/reagent_containers/blood/random, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "csc" = ( /obj/machinery/iv_drip, /obj/item/roller, @@ -80107,27 +80192,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/science/xenobiology) -"djt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"djx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/crowbar, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "djz" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -81817,11 +81881,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/security/vacantoffice) -"hvt" = ( -/obj/structure/kitchenspike_frame, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/plating, -/area/maintenance/port/aft) "hyP" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two" @@ -99850,7 +99909,7 @@ dux iLj dvt bXE -hvt +abk dux dux dux @@ -105768,7 +105827,7 @@ cdr cew cfL bXK -cik +abH cjK clj cmr @@ -106515,7 +106574,7 @@ bsM bun bwi bkz -bzK +abd bBz bDa bEE @@ -110319,7 +110378,7 @@ aaa aaf aeq aeq -afZ +aab agR ahE aiA @@ -110394,7 +110453,7 @@ cdG caq cgb chg -chg +acd chg clx cmD @@ -111607,7 +111666,7 @@ afX agc dBX agc -ajs +aaW ajz akI amc @@ -111861,7 +111920,7 @@ aaa aaf aeq aeq -agQ +aad ahC ahI aeq @@ -115529,7 +115588,7 @@ bWH bYc bZq caG -ccp +abt bSS ceZ cgo @@ -116750,7 +116809,7 @@ agq agq aje alb -aje +adk agq aur aqb @@ -117034,7 +117093,7 @@ aOt aQU aSg aTt -aUO +adH aUM boW aZt @@ -117272,7 +117331,7 @@ ary asR aje auc -awA +adl axC ayK aAa @@ -117842,7 +117901,7 @@ bWQ soe bWQ caL -ccv +abE bST csg cgq @@ -121195,7 +121254,7 @@ dwX ciL ciL cou -csb +adI dvY mjJ krD @@ -123201,7 +123260,7 @@ axY aPY aRn aSt -aTF +aaV aUY aWA aYp @@ -123962,7 +124021,7 @@ aBK aCS aEo aFw -aGW +aHY aHY aHY aKB @@ -123970,7 +124029,7 @@ aMd aNr aOP dCw -aRq +aaM aSw aTI aVb @@ -124233,7 +124292,7 @@ aTJ dfX aWD aVc -aZJ +aaX bbz bcK bel @@ -126275,7 +126334,7 @@ ddZ ded del des -djt +aae daY daZ dbb @@ -126283,7 +126342,7 @@ aMk aNv dfk dfq -djt +aae dfG dfQ dfZ @@ -126532,7 +126591,7 @@ aBQ dee aEr des -djt +aae daY daZ dbb @@ -126540,7 +126599,7 @@ dfa aNv dfk daY -djx +aaU dfG cXz aVe @@ -126789,7 +126848,7 @@ aBQ dee aEr aKL -djt +aae daY deS dbb @@ -126797,7 +126856,7 @@ aMk aNv dfm daY -djt +aae dbg dfR dga diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 9031e9964b..2ca3c3deee 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -950,6 +950,23 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"abn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "abo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -1257,6 +1274,20 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"abQ" = ( +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/gravity_generator) "abR" = ( /obj/structure/lattice, /turf/open/space, @@ -1638,6 +1669,54 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard) +"acz" = ( +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"acA" = ( +/obj/structure/cable/white, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"acB" = ( +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"acC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "acD" = ( /obj/item/pickaxe/emergency, /turf/open/floor/plating/asteroid, @@ -2076,6 +2155,33 @@ /obj/structure/sign/warning/vacuum, /turf/open/floor/plating, /area/quartermaster/storage) +"adr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"ads" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) "adv" = ( /obj/structure/closet/crate{ icon_state = "crateopen" @@ -18300,19 +18406,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"aGl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable/white{ - icon_state = "0-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) "aGm" = ( /obj/structure/sign/warning/radiation, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -20085,16 +20178,6 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"aJo" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/gravity_generator) "aJp" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -20171,16 +20254,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"aJA" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "aJB" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/metal/fifty, @@ -21472,14 +21545,6 @@ /obj/item/clothing/glasses/meson/engine, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"aLL" = ( -/obj/structure/cable/white, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/gravity_generator) "aLM" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -21574,11 +21639,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"aLX" = ( -/obj/structure/cable/white, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "aLY" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -22553,20 +22613,6 @@ /obj/machinery/power/supermatter_crystal/shard/engine, /turf/open/floor/engine, /area/engine/supermatter) -"aOb" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/supermatter) "aOd" = ( /obj/machinery/power/apc{ areastring = "/area/engine/engineering"; @@ -22788,19 +22834,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"aOB" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/supermatter) "aOC" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 @@ -22827,19 +22860,6 @@ }, /turf/open/floor/circuit/green, /area/engine/supermatter) -"aOE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/supermatter) "aOF" = ( /obj/structure/cable{ icon_state = "1-8" @@ -72989,9 +73009,9 @@ aFq aGf sIA aIe -aJo +abQ aKx -aLL +acA aMN aMN sJD @@ -73763,9 +73783,9 @@ aIh aJr aKz aLO -aOB -aOB -aOB +acC +acC +acC aLU aQK aRH @@ -75042,7 +75062,7 @@ kaA aDr aEv aFx -aGl +abn aHp aIm bxa @@ -75819,9 +75839,9 @@ aIp aJw aKE aLU -aOE -aOb -aOE +adr +ads +adr aLO blK aRP @@ -76587,9 +76607,9 @@ aDv aDv aHv sHV -aJA +acz aKH -aLX +acB aEt aEt aOH diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 637913adf1..fc5f6e9778 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2,12 +2,267 @@ "aaa" = ( /turf/open/space/basic, /area/space) +"aab" = ( +/obj/machinery/holopad, +/obj/effect/landmark/start/cyborg, +/mob/living/simple_animal/bot/secbot/pingsky, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"aac" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) "aad" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"aae" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aaf" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aag" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aah" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aai" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aaj" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aak" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aal" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aam" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aan" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aao" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aap" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aaq" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"aar" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/tank/internals/plasma, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aas" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/oil, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"aat" = ( +/obj/structure/closet/wardrobe/green, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/official/fashion{ + pixel_y = -32 + }, +/obj/structure/sign/poster/official/fashion{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/white/corner, +/area/crew_quarters/fitness/recreation) +"aau" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/structure/sign/poster/official/hydro_ad{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"aav" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) +"aaw" = ( +/obj/structure/sign/poster/official/hydro_ad, +/turf/closed/wall, +/area/hydroponics) +"aax" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) +"aay" = ( +/obj/structure/sign/poster/official/medical_green_cross, +/turf/closed/wall, +/area/medical/medbay/central) +"aaz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_x = 32; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"aaA" = ( +/obj/structure/sign/poster/contraband/scum{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/department/science) +"aaB" = ( +/obj/structure/closet/masks, +/obj/item/reagent_containers/food/snacks/deadmouse, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = 32 + }, +/obj/structure/sign/poster/contraband/scum{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/department/engine) +"aaC" = ( +/obj/structure/sign/poster/contraband/scum{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/engine) "abf" = ( /obj/structure/bed, /turf/open/floor/plating, @@ -1589,12 +1844,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"afP" = ( -/obj/machinery/holopad, -/mob/living/simple_animal/bot/secbot/pingsky, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "afQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -11506,13 +11755,6 @@ }, /turf/open/floor/plasteel/white/corner, /area/crew_quarters/fitness/recreation) -"aBV" = ( -/obj/structure/closet/wardrobe/green, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/crew_quarters/fitness/recreation) "aBW" = ( /obj/structure/closet/wardrobe/grey, /obj/machinery/light, @@ -15182,13 +15424,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) -"aKm" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) "aKn" = ( /obj/structure/cable{ icon_state = "1-2" @@ -18463,10 +18698,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"aSD" = ( -/obj/structure/closet/secure_closet/hydroponics, -/turf/open/floor/plasteel, -/area/hydroponics) "aSE" = ( /obj/machinery/airalarm{ pixel_y = 24 @@ -19833,11 +20064,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) -"aVF" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/department/cargo) "aVG" = ( /obj/structure/easel, /turf/open/floor/plating, @@ -27844,14 +28070,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) -"boB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone3) "boC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, @@ -31673,13 +31891,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bwM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bwN" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -36749,11 +36960,6 @@ icon_state = "platingdmg3" }, /area/maintenance/department/engine) -"bGL" = ( -/obj/structure/closet/masks, -/obj/item/reagent_containers/food/snacks/deadmouse, -/turf/open/floor/plating, -/area/maintenance/department/engine) "bGM" = ( /obj/machinery/vending/cigarette, /turf/open/floor/plating, @@ -46083,13 +46289,6 @@ /obj/structure/sign/warning/nosmoking, /turf/closed/wall/r_wall, /area/engine/engineering) -"ccd" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) "cci" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/light{ @@ -47013,17 +47212,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"cfV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/engine/engineering) "cfX" = ( /obj/machinery/atmospherics/pipe/manifold/orange/visible{ dir = 1 @@ -47378,23 +47566,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"chw" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"chA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "chB" = ( /obj/item/seeds/banana, /obj/item/seeds/grass, @@ -54807,17 +54978,6 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) -"hQy" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) "hQz" = ( /obj/structure/closet/emcloset/anchored, /obj/structure/cable/yellow{ @@ -55157,11 +55317,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"izm" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/engine/engineering) "izB" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod" @@ -56542,13 +56697,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"lRX" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/turf/open/floor/plating, -/area/engine/engineering) "lTC" = ( /obj/item/shard, /obj/effect/turf_decal/stripes/line{ @@ -57810,13 +57958,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"oJr" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/engine/engineering) "oKa" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -58798,11 +58939,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"qOS" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/engine/engineering) "qPB" = ( /obj/structure/chair/stool, /obj/machinery/light/small{ @@ -59976,13 +60112,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"tQT" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) "tRc" = ( /obj/structure/ore_box, /turf/open/floor/plating{ @@ -60180,17 +60309,6 @@ luminosity = 2 }, /area/maintenance/department/science) -"uoq" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/engine/supermatter) "uos" = ( /obj/machinery/computer/camera_advanced/base_construction, /obj/effect/turf_decal/stripes/line{ @@ -60626,13 +60744,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"vor" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) "vpz" = ( /obj/structure/girder, /turf/open/floor/plating{ @@ -61074,17 +61185,6 @@ /obj/structure/sign/warning, /turf/closed/wall, /area/science/mixing) -"woh" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/engine/supermatter) "woq" = ( /obj/structure/chair, /turf/open/floor/plating, @@ -61228,13 +61328,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) -"wHI" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 - }, -/turf/open/floor/plating, -/area/engine/engineering) "wIo" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice, @@ -83932,7 +84025,7 @@ bBX bva bEm bva -bGL +aaB bHQ bJe bKj @@ -85497,7 +85590,7 @@ bSw bva bOB bva -kRq +aaC kRq kRq bva @@ -87507,7 +87600,7 @@ aVS aVS aVS aVS -aRL +aaw aJI aDZ aHN @@ -88030,7 +88123,7 @@ bjR blc biX bny -boB +aax bpF brd bsz @@ -88522,7 +88615,7 @@ aKP aPz aQJ aRL -aSD +aau aTT aXS aRL @@ -90606,7 +90699,7 @@ brg bsG brf bvn -bwM +aaz byt bzX bpP @@ -90905,9 +90998,9 @@ svA mjK mjK mjK -wHI -eyj -eyj +aap +aac +aac bXk shH shH @@ -91157,7 +91250,7 @@ cah cdO ioF ceX -qOS +aah cfS fFv fmL @@ -91631,7 +91724,7 @@ bnD boJ bpS bjd -bjc +aay cqm bvl bwP @@ -91671,7 +91764,7 @@ cbh cbh cbh hjD -vor +aai cfU tIS iCs @@ -91929,12 +92022,12 @@ irM qFu cet ulY -cfV +aak cgu cgU -izm -chw -eyj +aam +aaq +aac jzE bXk bXk @@ -92181,9 +92274,9 @@ bZA can cbi ccc -eyj +aac cdR -tQT +aaf bXk bXk sWW @@ -92437,12 +92530,12 @@ bYR bZA can cbj -eyj +aac cbX wcs iyJ cfa -eyj +aac twv hoS sWj @@ -92694,7 +92787,7 @@ bYS bZA can qpS -ccd +aae ccX ccX ceu @@ -92703,9 +92796,9 @@ cfu tlN ncm cCI -uoq -hQy -chA +aan +aar +aao meF oKv wbB @@ -92951,12 +93044,12 @@ bYT bZB caq cbk -eyj +aac ccY cdT ccY cbX -eyj +aac vlC iej qeY @@ -93208,7 +93301,7 @@ bYU bZE car mgz -eyj +aac cbX wcs wcs @@ -94236,7 +94329,7 @@ bYQ bZA cam mgz -eyj +aac cbX wcs wcs @@ -94493,12 +94586,12 @@ wjm bZF cbm mgz -eyj +aac oHa oHa eWi cbX -eyj +aac vlC cgx qeY @@ -94750,7 +94843,7 @@ bYO bZA cam lrM -ccd +aae cAQ cAQ cLw @@ -94759,9 +94852,9 @@ cfu jBn oxw meF -chA -chA -woh +aao +aao +aas cCI cBS iLh @@ -94900,7 +94993,7 @@ aey aeO aff afy -afP +aab bIK agt agD @@ -95007,12 +95100,12 @@ bYY bZA cam cbn -eyj +aac cbX wcs cfP cff -eyj +aac cfX vVO iop @@ -95265,9 +95358,9 @@ bZG cax cbo ccc -eyj +aac cdR -oJr +aag bXq bXq cfY @@ -95527,7 +95620,7 @@ kTj qhE loz frj -lRX +aal eyj uIB eyj @@ -95783,7 +95876,7 @@ cam cam cam haA -aKm +aaj upc wIo hyh @@ -96040,7 +96133,7 @@ cCV ceb epV qLI -aKm +aaj eiV upc dsz @@ -103154,7 +103247,7 @@ axx ayv azD aAS -aBV +aat atn aEh aFe @@ -107799,7 +107892,7 @@ sZh aLm aTx aEj -aVF +aav aFi aFi aFi @@ -109372,7 +109465,7 @@ blX blX blX bkF -lWy +aaA lWy fKj lWy From 4199792576905b34feae5537c8a75904b8933d3d Mon Sep 17 00:00:00 2001 From: bunny232 Date: Thu, 26 Mar 2020 10:45:30 -0400 Subject: [PATCH 057/128] Boxstation secmos is no longer connected to the scrubber loop (#11630) * Update BoxStation.dmm * Update BoxStation.dmm --- _maps/map_files/BoxStation/BoxStation.dmm | 178 +++++++++++----------- 1 file changed, 93 insertions(+), 85 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 68e9ee8ec0..82bfb49e38 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -53,6 +53,16 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) +"aah" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/main) "aai" = ( /turf/closed/wall/r_wall, /area/security/prison) @@ -1541,6 +1551,18 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/fore) +"adB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/main) "adC" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -2665,6 +2687,20 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/brig) +"afo" = ( +/obj/structure/noticeboard{ + dir = 1; + pixel_y = -27 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/main) "afp" = ( /obj/docking_port/stationary{ dir = 4; @@ -3143,6 +3179,20 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"agl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/main) "agm" = ( /obj/machinery/light{ dir = 8 @@ -3321,6 +3371,15 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/main) +"agD" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/brig) "agE" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box{ @@ -3332,6 +3391,13 @@ }, /turf/open/floor/plasteel, /area/security/main) +"agF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/brig) "agG" = ( /obj/machinery/airalarm{ dir = 8; @@ -3436,6 +3502,10 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"agN" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/courtroom) "agO" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Infirmary"; @@ -3467,6 +3537,19 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"agQ" = ( +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/structure/closet/secure_closet/courtroom, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/obj/item/gavelhammer, +/obj/machinery/atmospherics/pipe/simple/scrubbers, +/turf/open/floor/plasteel, +/area/security/courtroom) "agR" = ( /obj/effect/turf_decal/loading_area{ dir = 4; @@ -3888,16 +3971,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"ahC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/main) "ahD" = ( /obj/structure/chair, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -4202,21 +4275,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/plasteel/showroomfloor, /area/security/brig) -"aia" = ( -/obj/structure/noticeboard{ - dir = 1; - pixel_y = -27 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/main) "aib" = ( /obj/structure/cable{ icon_state = "2-8" @@ -4556,19 +4614,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"aiB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/chair/sofa/right{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/main) "aiC" = ( /obj/structure/cable{ icon_state = "1-4" @@ -4729,10 +4774,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/plasteel/dark, /area/security/brig) -"aiP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/security/main) "aiQ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -4847,18 +4888,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/security/brig) -"ajh" = ( -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/structure/closet/secure_closet/courtroom, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/sign/warning/securearea{ - pixel_x = -32 - }, -/obj/item/gavelhammer, -/turf/open/floor/plasteel, -/area/security/courtroom) "aji" = ( /obj/structure/chair{ name = "Judge" @@ -5126,12 +5155,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, /area/security/brig) -"ajM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/courtroom) "ajN" = ( /obj/structure/cable{ icon_state = "4-8" @@ -5286,16 +5309,6 @@ }, /turf/open/floor/plating, /area/construction/mining/aux_base) -"aka" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/brig) "akb" = ( /obj/machinery/light{ dir = 8 @@ -5609,11 +5622,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) -"akE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/brig) "akF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/red, @@ -91862,11 +91870,11 @@ adl aet agy aha -ahC -aia -aiP -aka -akE +aah +afo +adR +agD +agF gyr alq amd @@ -92633,11 +92641,11 @@ aff aeU ajA akd -ahF -aiB -abp -ajh -ajM +adB +agl +uHp +agQ +agN akw alb alG From 02f7aff68061fd943d9bebade2fa9ea3e72a3ac6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 26 Mar 2020 09:45:33 -0500 Subject: [PATCH 058/128] Automatic changelog generation for PR #11630 [ci skip] --- html/changelogs/AutoChangeLog-pr-11630.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11630.yml diff --git a/html/changelogs/AutoChangeLog-pr-11630.yml b/html/changelogs/AutoChangeLog-pr-11630.yml new file mode 100644 index 0000000000..c65ecfe3bd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11630.yml @@ -0,0 +1,4 @@ +author: "bunny232" +delete-after: True +changes: + - bugfix: "Box secmos now is now longer connected to the scrubber loop" From 75a9bc0b80b7c7716a0daf30e131484c442eb328 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 15:54:02 +0100 Subject: [PATCH 059/128] Update bloodsucker.dm --- code/game/gamemodes/bloodsucker/bloodsucker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index a45e989318..9515d6063c 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -19,7 +19,7 @@ antag_flag = ROLE_BLOODSUCKER false_report_weight = 1 restricted_jobs = list("AI","Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + protected_jobs = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 20 required_enemies = 2 recommended_enemies = 4 From 8e54cbe364b45ea5b76b87264d41a00b179b1496 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 15:54:38 +0100 Subject: [PATCH 060/128] Update dynamic_rulesets_roundstart.dm --- code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 8b44abbe03..a7fc9b86ce 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -805,7 +805,7 @@ antag_flag = ROLE_BLOODSUCKER antag_datum = ANTAG_DATUM_BLOODSUCKER minimum_required_age = 0 - protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + protected_roles = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") restricted_roles = list("Cyborg", "AI") required_candidates = 1 weight = 2 From 8bd238c87c38af065e0dfb13cd7ded852540652f Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 26 Mar 2020 11:49:49 -0400 Subject: [PATCH 061/128] Reblances flares, flashlights and eye-lights (#11404) * Update flashlight.dm * makes the torch be enlightend * Update flashlight.dm * Update code/game/objects/items/devices/flashlight.dm Co-Authored-By: Ghom <42542238+Ghommie@users.noreply.github.com> * >makes atmo pipes small items >makes heavy duty flashlight lightweight > muh realism Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/game/objects/items/devices/flashlight.dm | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index bf023c2c07..29a31122bf 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -170,7 +170,7 @@ flags_1 = CONDUCT_1 brightness_on = 2 light_color = "#FFDDCC" - flashlight_power = 0.3 + flashlight_power = 0.5 var/holo_cooldown = 0 /obj/item/flashlight/pen/afterattack(atom/target, mob/user, proximity_flag) @@ -227,15 +227,12 @@ custom_materials = null on = TRUE - // green-shaded desk lamp /obj/item/flashlight/lamp/green desc = "A classic green-shaded desk lamp." icon_state = "lampgreen" item_state = "lampgreen" - - /obj/item/flashlight/lamp/verb/toggle_light() set name = "Toggle light" set category = "Object" @@ -258,12 +255,13 @@ desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'." w_class = WEIGHT_CLASS_SMALL brightness_on = 7 // Pretty bright. + total_mass = 0.8 light_color = "#FA421A" icon_state = "flare" item_state = "flare" actions_types = list() var/fuel = 0 - var/on_damage = 7 + var/on_damage = 9 var/produce_heat = 1500 heat = 1000 light_color = LIGHT_COLOR_FLARE @@ -331,14 +329,15 @@ name = "torch" desc = "A torch fashioned from some leaves and a log." w_class = WEIGHT_CLASS_BULKY - brightness_on = 4 + brightness_on = 6 //When on were like a lantern light_color = "#FAA44B" icon_state = "torch" item_state = "torch" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' light_color = LIGHT_COLOR_ORANGE - on_damage = 10 + total_mass = TOTAL_MASS_NORMAL_ITEM + on_damage = 12 //Its a log thats on fire slot_flags = null /obj/item/flashlight/lantern @@ -348,10 +347,9 @@ lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' desc = "A mining lantern." - brightness_on = 6 // luminosity when on + brightness_on = 6 // luminosity when on light_color = "#FFAA44" - flashlight_power = 0.75 - + flashlight_power = 0.8 /obj/item/flashlight/slime gender = PLURAL @@ -372,7 +370,6 @@ var/emp_cur_charges = 4 var/charge_tick = 0 - /obj/item/flashlight/emp/New() ..() START_PROCESSING(SSobj, src) @@ -435,7 +432,7 @@ var/fuel = 0 /obj/item/flashlight/glowstick/Initialize() - fuel = rand(1600, 2000) + fuel = rand(1000, 1500) light_color = color . = ..() @@ -540,7 +537,7 @@ /obj/item/flashlight/eyelight name = "eyelight" desc = "This shouldn't exist outside of someone's head, how are you seeing this?" - brightness_on = 15 + brightness_on = 10 flags_1 = CONDUCT_1 item_flags = DROPDEL actions_types = list() From 9ab89ddcea7605ae8326e3d44e1321888f384f67 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 26 Mar 2020 10:49:52 -0500 Subject: [PATCH 062/128] Automatic changelog generation for PR #11404 [ci skip] --- html/changelogs/AutoChangeLog-pr-11404.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11404.yml diff --git a/html/changelogs/AutoChangeLog-pr-11404.yml b/html/changelogs/AutoChangeLog-pr-11404.yml new file mode 100644 index 0000000000..18e0145b34 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11404.yml @@ -0,0 +1,8 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - balance: "torches take less staminda to use." + - balance: "Glowsticks dont last as long" + - balance: "Penlights are better at being lights" + - balance: "Torches are brighter then before - Indian Johns want to be on lava land rejoy!" + - balance: "Eye lights have 30% less light coming out of them." From 0bf2cf04848aeae7a2288d7ff408eeefe251e6a5 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Thu, 26 Mar 2020 11:51:48 -0400 Subject: [PATCH 063/128] Adds a lfwb-inspired orbiting pixel + flashing outline animation to the sprint and combat buttons (toggleable via prefs) (#11623) * Adds a flashing effect to the sprint and combat mode toggles (toggleable via prefs) * Adds the ability to change the color of the hud toggle flash as well --- code/modules/client/preferences.dm | 14 ++++++++++++++ code/modules/client/preferences_savefile.dm | 7 ++++++- code/modules/mob/living/living_combat.dm | 2 +- code/modules/mob/living/living_sprint.dm | 2 +- icons/mob/screen_gen.dmi | Bin 116168 -> 118425 bytes .../code/_onclick/hud/screen_objects.dm | 14 ++++++++++++++ modular_citadel/code/_onclick/hud/sprint.dm | 14 ++++++++++++++ 7 files changed, 50 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ecff37c1f3..e1ecb81ab6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -187,6 +187,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/sprint_spacebar = FALSE var/sprint_toggle = FALSE + var/hud_toggle_flash = TRUE + var/hud_toggle_color = "#ffffff" + var/list/exp = list() var/list/menuoptions @@ -902,6 +905,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"]
    " dat += "Sprint Key: [sprint_spacebar ? "Space" : "Shift"]
    " dat += "Toggle Sprint: [sprint_toggle ? "Enabled" : "Disabled"]
    " + dat += "HUD Button Flashes: [hud_toggle_flash ? "Enabled" : "Disabled"]
    " + dat += "HUD Button Flash Color:     Change
    " if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation)) var/p_map = preferred_map @@ -2075,6 +2080,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(pickedPDASkin) pda_skin = pickedPDASkin + if("hud_toggle_color") + var/new_toggle_color = input(user, "Choose your HUD toggle flash color:", "Game Preference",hud_toggle_color) as color|null + if(new_toggle_color) + hud_toggle_color = new_toggle_color + else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj @@ -2278,6 +2288,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("sprint_toggle") sprint_toggle = !sprint_toggle + + if("hud_toggle_flash") + hud_toggle_flash = !hud_toggle_flash + if("save") save_preferences() save_character() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 69b8b5685f..731b6b7725 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -200,6 +200,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["auto_fit_viewport"] >> auto_fit_viewport S["sprint_spacebar"] >> sprint_spacebar S["sprint_toggle"] >> sprint_toggle + S["hud_toggle_flash"] >> hud_toggle_flash + S["hud_toggle_color"] >> hud_toggle_color S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay @@ -239,6 +241,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) sprint_spacebar = sanitize_integer(sprint_spacebar, 0, 1, initial(sprint_spacebar)) sprint_toggle = sanitize_integer(sprint_toggle, 0, 1, initial(sprint_toggle)) + hud_toggle_flash = sanitize_integer(hud_toggle_flash, 0, 1, initial(hud_toggle_flash)) + hud_toggle_color = sanitize_hexcolor(hud_toggle_color, 6, 1, initial(hud_toggle_color)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) @@ -248,7 +252,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pda_style = sanitize_inlist(pda_style, GLOB.pda_styles, initial(pda_style)) pda_color = sanitize_hexcolor(pda_color, 6, 1, initial(pda_color)) pda_skin = sanitize_inlist(pda_skin, GLOB.pda_reskins, PDA_SKIN_ALT) - screenshake = sanitize_integer(screenshake, 0, 800, initial(screenshake)) damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref)) @@ -301,6 +304,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport) WRITE_FILE(S["sprint_spacebar"], sprint_spacebar) WRITE_FILE(S["sprint_toggle"], sprint_toggle) + WRITE_FILE(S["hud_toggle_flash"], hud_toggle_flash) + WRITE_FILE(S["hud_toggle_color"], hud_toggle_color) WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) diff --git a/code/modules/mob/living/living_combat.dm b/code/modules/mob/living/living_combat.dm index 4cd2def5a8..493f2ffdff 100644 --- a/code/modules/mob/living/living_combat.dm +++ b/code/modules/mob/living/living_combat.dm @@ -43,7 +43,7 @@ /// Updates the combat mode HUD icon. /mob/living/proc/update_combat_mode_icon() var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory - T?.update_icon_state() + T?.update_icon() /// Enables intentionally being in combat mode. Please try not to use this proc for feedback whenever possible. /mob/living/proc/enable_intentional_combat_mode(silent = TRUE, visible = FALSE) diff --git a/code/modules/mob/living/living_sprint.dm b/code/modules/mob/living/living_sprint.dm index 66aa3ebc6f..55d5f3320c 100644 --- a/code/modules/mob/living/living_sprint.dm +++ b/code/modules/mob/living/living_sprint.dm @@ -4,7 +4,7 @@ /mob/living/proc/update_sprint_icon() var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory - S?.update_icon_state() + S?.update_icon() /mob/living/proc/update_hud_sprint_bar() hud_used?.sprint_buffer?.update_to_mob(src) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index f1fafb8946acb62a2f2a071315c35b0058f589ee..ea946f60d9c31139c6e5d3e8aed79794e0294ff0 100644 GIT binary patch literal 118425 zcmeFZc{G-N+cs<}8YM|&retWKLC8=fR8)jymLZbNGAk8AQIX6fb3*1>WGYf-LZ)P% zXU=as?)!b#dcU=v|G$5}YptvM63+8Dj^Dm-`!?+7?Q>1((yr~y+sVktb}7iq-XJ5R z#D7wf(QL*4yz(Rqz!w`%sv5SkMmC1lcOTf^wY*P8<{17x^s?nakv$%bKhxU}tDnwp zwP#_smFJ8*@#DSp?k!GS#vyTsGQO~SzULb2UHT+{RB9yD?wz!TAP0HxIr-hszI5ca zOo_O6yM1hpy8l;K=y0PxOmRTukEe|E4MCT*w2clkc8fGW=EOQ#Ncr^5U zGij|>O-mkf$?@6qV12_&E4g;{VP<5b;9i#Gn|AqmMU3V&ojR&+y!2ZNt84PTrTvQB zBMXYy%dCYY7hLvRO;N91Q;<1PBV)#yyF0GNf+mPQ$;->a_?GtNqAY5<=OfQ{Rqwy} zbCpVHz12CE?;dA#!<0$BPIEj{&Ym@+jq^Fw8Sd^e6%9kn8CGp}Pm)s7BcE2kH<7dn z{}pVLogBOn`;qZdF!f^6r@f3Oy?2+lgluN9b1W9}C|#qzIxo*d?Jv{GA9pc_IVNzI z*{ST^Dr)V9QZ)x_Oa+5{eV=|(8Ton5QTib#e1c<`Zj4Cg0J z6Xw~+_F_5X^!3g)v5nMOL&g1XSvq#n&#=X@^m9w~MR28CIH)R?E<9VCcV3*do}urh zJ{XuOu+N5fQ2)<2DNfqURb&4gH4^oeYrb44w!6Tl6It|ZO1bBYK*yJ3%Pqgst4>bmW!Y~eW}Wfff6l4XZ{KN#h6Hs} zey=p+vrn=H7?k$iXyCcZlqiz?v{xi(P)A|w=+(MZ)lQbdBX!cncSVoXj_ZvK^_<^2 zx@&6i@YSuO{vSj`Je^J+Nidz-GgRW@G4Zu`i+6GCuf1;>4%z6bHHUfLx}Lhl_+mW$ z+sj53+{t;_Y}cMpEqez^U7#{{PK)(p-@Eh4a-n3&s`gQ@rIo3}o*m3A)?VkE&hPrx zdba)kh6i70z^%zCiJ-gtSo^6SH&Q>mDyO9LC-BvP(cr#fodYhCHFUimPhMZ?to8r? zP5V+_2VE$mF)QgzonT;`ElMPA?B#4626Ea zcOj*+MnAr-gQ5N#&X#MA$B0%+bz_7rpGutJ^t6-%pd^eNlbMaowJiYY)YF60XQz z^w6Q9oQ_OuihFk%|JKP>D_^cQo@_7Rwqt4gImt0%%DCV=t=^dxb5bn&?18#`{@mMs zc8n1fn|(P_*XHZU<*z7?3kzS%Na@d!w6)B2y|^w=LGrJxJT_H&?RwK@kA*eG*4544 zWBXzvjd!R->xO$sW+&0u{TvbDji$BWzYuXMy2zc%**)j3#AxqEUg=D~1;Zd01?Qf5 z+SY!OS^`yVjkThpZ#I22js3;Xxpv`Z5zO)44~_2hcJiIDW3h~rV5kxEC5s589BCFe zPBG*sZBCVzCYg^Nohp?|s~(`VAo&CbcNvgQ-oC9*GO0MtN_NpP;Gjsr*ROJ9JGWBu zWRqU~HsciAvzS&@%C%nD>XK{?I#{4jfp)#eY`*QWN= zi%d|>$6Pg!(NPk;d-tx$(RRy=VPp=HZz?*K?Gw|p2EMZtO1LI?OVd#0dUpx2OJ4}O zb0@z(M(MR}#Qp*?GT*+CfBTk$T10)LE#q7(bww{tIx1W36;zwhNNrHrHqCDRSiMzz zG$1N(c#YD+ee2!a=1tYQCmT_8>ULy%U+o=QUw0u(PD!4gnNwMMGr+^y%TI^vFMLiK z>u`T;E>13Sm18muvlo~DQ#(57{v8aVpoQ!DN>Zx}vHorA&>tjz*Mu8UB$K_;Y;m_ZUZl(>|cTOp! z_WHS2g^rYHrzKxg-Z{Tfs{QSr?7I%Cp`+66qS4{@<&&+E1q0p3Mx48JUi3#<(}-Vs zxZ~SBv)m*%=}5lvZ;Li{;@@+h+h6>o{BMIQKeDp)=dq!(E2*r$_MAQU#nZGi9Oxz| zR@RD3HzO_czp7x!KdCA(V;yazD|Mc~TO}2td9QV6I z4oHVloR|7V6;9nizKeBDF`M1!Gn<%-*K1qOLw1SIE$l-sMuQ~9OSePrI-GeYe(#K3 z5$~RznohR=ISZ?SuR;@*OYIU;!54Q|-^#hiR3CiQFz}1jcqDuMXZl|BZ(h`3!V)#5 zQLoc{Y3^dL{FU`u9{n--3rlGtN@dc$B+uwlbj5S`C!5w3t4B5&R_nLrz3JC2@7$Ib z(eIwDb?oRy=^XjiQxr|wj<<2i@f$rZjGleEep{mh?Wv=E>;ro)tc?^2(`nRhwB4Q% zh}AXE=1Whj_kDNw1=*2+GKNmpokM?>9T#aEuNSSX9b0SM{3B|o(nC+P*^+NYB~2Gq zP%yVFAr}7IXK`HVbM;iypOMjq6s~#Ak;z+!ZdSm`*aDBuPKWQYzbp+X%CxxPNV3pgWcRfp}$Ug=)T5r)E-d8aK&T zo6ghpk}L;RDOqY&{*90RD579=C-C@PX z6<*Y19BGe zMFx{Hv70qwcJeDO>9;= zIpd=L#A#iq+R^verrYXL)=DXZRB&(WrLVejMg zF{*Aq*Ng49pOYd#mWl*=c$SbTuj)p4xY3igyV_B#Dy$34w`@B=Gb8oGn?{!R@o5Uq z<%@mNYu?3?4L+sQziv9;9`V~LuNIXt)t<^qE-uDRapv<5*RX&&i&V*9ywrMl!pm#o zmVr{IUX+&31s80iA|y*u%t$Tj%ZE_oD9$vcZ;usVANMtYl zzvml3Ru6mLXh6*GHutP0(%*`2ay&b0R6IU^vUwnHMNyzO>uLWiy0^0Q(K!{f^fM>p zkyLC(@QchEod1wfKeZ91uV=rktC6nh{PEM2R-c1^>#0s9} zCozJ}@vld{?Ef5Z%GXS{V|9=BN)UdO?l&s1+v{F-cGE33RT&epz#AKvdVevl;_he0 z*(1k<`;YHg-%A``M#_cck4Z5F$=Z6suU|h{9KY2NDUq_hX*8KX+1#wayHTO^9gh@! zwi-he9UCj3y>%hYmQNZVNiKOzYsw#8s|L~OrBdT0t&y8NeQMtBPkLl2?t3n)k6h)^`{YaVl#}HU%a5R=DL=mZ zkgl#3)xN-V)tT#uCv)uX`BFx|r@ZxIS|D!S_oSX-OU?od#le&)2?L3Wbid`lwBN_t zc1-PZCQY+6uIuZBY!tgYD*b-lRww#f$|mbde0b>Z#e^Fl@1HD;__c9Tr2ZS*qKT%( z@5X=svinB0>{vZ~wHfv*)R;6z42*YVnd!J#S!M9c7rr>>Zuqw$+>iU-cF{V+%UWF* zO{z5lOBVJ84;xCPmbOVPN~nzu?jkMhnqm*FuZ#;@rfsWE%uf54%4x6o;@{h$FypHuRcbf$dAvRZl#`4sTLYzCbhPBq^i^8^z5UK@oz}<5a!dkt0F_Y!*fHc zW9`}Bx96FsO6E>voa-Js?Vh*r{PNZK@KZlKxu@RSJ(O4ozHQ04pdz-IVC#G|&+23T zZfTUe0$r3M>+1UYI$IU5hfBQYrN3g7C;pcBMtLi*C{hL+#W`=h97%IMl-~Q3WA5`D zH(8Oo&|ltud}VWAb?RA}E^f<=n8Q6fr17CRXLGl*DN^GT^NSSsla|%<)Oh;#`??cf zdM&eu?;IxX=m}Tfo7()k==a(5da+qtFRi=9_Wp2H`J^MNF}YY0oU-%Tg6iy?nUS=! zP0x3w1Cfdk6WZCy>I%I{T`%^mH9cvMr$Df5o3EqwUQu!+Dybfg6k_}`` zB}In%rQVI^9qN@N;U$CM{9I-4Vi9iYmv3{X>m_~M4>6cVeSP-4_%qQp6>8(mf;_uX18+wxj~jhaejNB5DotJ@HlU$ira|H>m>9>uzVppv+=5 zXH1MtQPRoHO>$*rMSHg4&9;OpcWYjfQA%yR^)s3+Zc{VESACQZ9z6KbST}UK@LTa) zt6eLt!}+}22R)wkuDhmR+I+*jc|KU>EX50*suJN<(w%CrUfjwqANOr5nr-gllcmxe zdu&ajx%NELWfAKXSR6@n;}7uI%j)rwd$Z2mDCoiM+^eBd(Pwwtj?1*&h!)Y>+Ptb^ zDYux$>Qy2f$366+bar)3k@@cHB|{x|-Rn2ps5TmJ{w33h8;na?v-KrPW97JmMCl;u zwa_^G`E!{ZUTg8`_cdHTn7nuB95+V42X76v8gy9c{+YRVl9u`FFU}X&mRmMN1UG;E z`bFNnLRKef>q|U;e_!{iP3hmHD0=my3)|*ZSrdEX$kYWEI`r8_G+7g){_{mr`;-o= zyev6YE;HxmmJJWeiC7)F`MMf{0FVsKDvhT)yv?b5Ea|>);3N>$8DGg+JyjGJvy53vkTTbCAJ$XQ{yOx)NXn@Ik{$OTq1W$-aI)cmcB*eR|<`E2(7K(Im`dt z8(l=5c}HuU?oXwCGv@xnv$~asPfuK;+c0B(`K$5;NY zouNCs7?JCk+vO%0@ygSAZq@j0jAV1_(yxLDyW%#HhSzM1g~~J~J?7;t|FS5_J|90) z)fB}Nd@jhc-b>|b<8afV%Oa{1361mptCni(y{Q}J9GfO*?82*$T2nY>Riw}Ey6;K< zBaFd~;daHgJv3CLM@NiA-<;ww*Z(;3>P*T~^hxcSg29A4EnC&5_~>2JdQUny|9%oF zx0%LEDKMowrJ+3GvyTH^d(ei=l-*VBr}C`s{k(~O8!efVcbg|aa*~35NC)cqMhztyz zOUyfa>y*j_VcO_I*ZS);0z0q&a=ZU#ndE$l&CPE}wUE1PA-z{~y;o4ZaI?#fMC}XI zbILb(pgT-8e{o%AN^R%lmvD~~Z+GHc4U{|})R}CyFFTJDu# zALT=&-e_tt!1xDoXCkK-#`BNHu?RU4U>C_N?#tDOb3sRK86(@`tEF z`b7J_8OuuvGJW!G3dN8x=G4-6bF;gQwT5ev>ta--$>aF*AM6T4gSCg*s@xU+(OTo*;{E4ZpL>)mN03#~<#jGNFp>sx z1dY0bZ75SJ+OkE%OyS$)rc9wg(J0;y4*3Kgan zb)Cz$AL;a1w_W3+tP?W&`6<)!?E*7->%?=^Q}l;68?ti}5~4Q4JA-(xJMpvECl@;H z+YvFo-md zzn_$3w@+;rl#c7Z=%LXalP|ldr&FC{*22GU?M0f-cS-+7<(#o5^FNmUeqMfeEJ$iP zBz6L zXVWdSW-$ZIGm7%)c;%ZOY9BQo%23RjUH2>ja+#H;9|NF-hT$=>E(`0rS|rQCY&wJ<5VaS_f<%joZukBX(dR?|#X zQ0l^gfkxZ@1uyOrwsvUx?Mi;aNVg-EmrCH(qqN?sNXhs2T03^N-j&*)GUqP5%`tjx zp7yh=(HmWT_Xj`HcYD~4Hm2=gX^ShIzNxcxaZd_Y=@+`?+L_3PDQ^~A#?87hqx_}r zp9|#sRtHusMOq(i7*~;YW#5IX0}Pc8YkgE)`ac(9Eq_(vP0m#Nv4r>U=XrjtMX-w7 zzkC;zJTFt1T%umT5i;^_)G#*XW$t9-zCXRLY#upX4;AgAkG=Bfb$9RFrK{q8;>V&? zRyM;THPZ$gd0vkxNm_iX$OYZX0=vOzsm_D=b|$)pZ~b|W(Tb&cv1)^H$z9s2=F7D#(fd_|Ml{>HhyO{y%yKH>!e}O4(|T_c>Z|q|p|+ zCJcLKOZ{kTe9cEosUf)k6!We^hpDe!T?g6O*>&7jjM&`QtsXskbRzW1h^?69av!DJ zT30W{wVO9D-n%DwymVc-wzk%f>EzQalg9pmfw(iJ&P(@QTwKmR=p#FS{ydA6Tlo0+ zJ=h_l)`K)JBv+3x9@FX@cp)|XFCof!VYJ2Xpvdm$RgZWSQZ=)EGYqRUofga*BE+j7 z(@NGPsU$qGw>KWDdvm~FZZADOd3%-#ZBtW|X}0DWi%!`aH}=l`Z8WKS&G+`oVdHOa z&+F@R#>dBpOS-;up3HyN-mcN(IIwGTt(0_-EUUwhM}hdxV`^IKKNVXh^9FX$J4u+g zrv7OVpOOvYA!`U1l~GZl$2F7T^^a*6cy-+S+R?#uD>x}7g`0!JqfOU6f>Fnj-2cPx zzn13ahGVU1j!sTDR8_q&4uW_BBO^cdxIeF|z)dVK54>0z(R-Z7XR ztR0=2_%6~rxVbh}U0qFWVq&t8Cs;q;p7FT3SyfY0({UoZZFw$=^zCQ-<@~>q&W>~6 zMOGR~>&iG3T&aF@;`MK#C!bZbIq$^%sHJR){`~oMUfx+2R@Ois9|i%n2W{F8O`V;- zN(pf>G2{*o4oXpy{&I2UzkaPnNZ`FhIo(e+&I0vDE!#{@<^a0d`Ui@rqHK^SpO%8FzlZ>&GG*Wb?Oy zZtvcTND1cyr_J{5fBwXEZIOZ*P1}?Z8S93NW0068zZlx3;zB4 zhhs+7DqOiDo6?f(ehJMmJX6hXf*MKHE(|8Erjrc1axA=_Joz&=R{#0#ud@!5ETlOp z(wE#`w|d;hwlWCk15$29tGRg=U1x-ag;fvM&Cv5I_2K8yUdy@eYa(Xm=G(SyyG~M< zT%VS4TPp0;7YO-XkgiFx+YC^X;ZuYsjyW2Fy0-_fIo1O%QF&z7E^vaI6C4pG-Y z$Mf^%$xppvWsB6yt0XPe*Xa8yoK9^`O<7wTBdRbh?P%B;3xjWOg-lN|Yu>)yG`6rl z{e||9krAiD-uw6O%Li3{(*H8OwDcEE{~_n1v4PTwYz>%fytl`AZ>4*3t275D(q{{a=YI`1Y-` zw$>*(ng7aRdX#I?%5WHqxV_(>FV9p|RK7gjb&zJ~&OsCkx2S07%a?mTYaZoQ3fHT7 z$r&zYx82#fLGcya#_MaDMVZUUG4N)}~5%&zuQ<`gH5;?Cg(!wq#yUpC;2j z867pFprq_5bU6O;<43K0>n-Bq;&{FE;zedOQ+rp}+!tCYy%PtH2nfXC4#65um^859 z6289Vl$l;!RC^)~tU^s3mXczRP^tzXTt!)`f7H^S?9O*|cFqE3$_230#>hOQ*|9?= zy>0H#Gxpi}U&<=CZ(qK4Z4WYs0rV8rmMt0jU$!Qvq$tSC{|7|T43r$g!a-Yh>_1^t zx9`ra;k4YI{)}q2xcK-d0LLt&`u#ycK^n*{{`~o~6X`i}vGDNlPa1-c zcqe4|RnO4y3vl5Az&blS`;>^t9DX~t#f<69y#t3|`5e8Sa{`qKE<&??dqr(+QvGSZ zUULizvMb?d196b{lidnhS}dAr!D+X1acOA9=%l1=08=wFGkGPY!#Hn?t{fq^b;n1K z9}{5qvc9pgZRgI)duL9% zZ@NS}_HR3;l~;yi)X00l+3UK*D)Vgj5HMTy=1n||C*^u&jg7PlLCq6r!sWF!LqkIu zQ_~};R-8Hgo;_s%eg#EEuA@i&>A2;le>?OBzI*4ZlTOWX?AUJn8tEUW%+m*x-J&SR zo1TUl8fPEQ^5Br}+_^)B`ZK+I_k3Jabdzb#w{LfPiXP%!1H-~DyShpoJaezFoSK~n zFLNsxPpl7R5{vV|Xy#Gi!f;z&cKo0m)qr~S_VwjDb}Zn@4#wFsO4{sue$4-~3ozaP z{5aQtaYA|CowA9vjan~yg4UW^Z+Whf7uT@o;KApwUeS|@J51iG4q&|!D*WVl$?~K3 z?|Bv{f7h$)x>ilOEr}a9gezRQKym2Mq4Dl~dTMIwqT*svz#$zS-8zOJ4;R;?A3v_4 zNZUW@Qu;Br$UfMq5V-iJG=4Ug^aYcw6SqoQ$0-3RNd0ZgebRncn{<6?=G5|@q;tC ztWD&eoBMW>z{ct62V7iSHMO;W;$BE{@$o5a@LHIeah*N;Hn+#=c~Q~1*3?^HfY!vb zPf&^=hG&}EyBhFifM zMGsFB^$=)r zxbM%O@=NTl@3+SwrqFMeG%Ve1H3Rkbj=i~&>&)X7{+sCI|@5Cp&F*QIEfq1yd=no&B z;yUr0_4Paa8DR8Zm6i-Dsd6Ldi5#}hC^YmaaL$>@P6DoUjEOfS3*fG)eXLVe`1QLq~z~CqF9aFN!d0=v~0YmETsk?i- zaxHmzd8x_3;oiM_cR<4F)Ujj703XC){-6}$tCnK4JpIRe6MY{`qTlG1o_DVxKVZ7{ zxSL$#hI+^zI=b^lMu*7B$?Qn{K^rseg+37Lc-0Vu=Nppf2Ne`t)fK%o{guRHWX@T3$$ZzbY?JgPWk%1D@^M zzhBsTP#!N1HG)F~)=EoDlcDbjT8wkX!Uwbe)?yuHoHJC+ut@33u7?jF3ThX;Mzb)Q z((Z_qa*rIU524?;ud=7u`5}nY5k9^c4DFT_bsOjc14Bddvo6agP$ladQ|`RSkJDn< zlYtHp6=nFrI5?SG1y==H zn_)eq$mTMA9v31MdL>zJZFMZ2;0eje+X2@A^SrqR@lZ)uvA>N`yeCi616x32_yh&t z$HaJIK={dVqdEoDKPGaE)qVMtkwJ%|2lz4jKgG>M+?89puiYm2D#Q*DM7;`J^B|@J z*wd@GZ{=-lPNHSwN=n!wl%7RIumn-0LX{B`66{nwFLq!x17N$FesdJ^i?kj}JiAX5E%@%Q4>Nsypm)H60GZ_AREr?#)9Dq_` zqm^9d06$urETk>gX~e7p)8^sjRe^WvO~(yFH{Mem28a?qdGc1i^`ZRy{87?tC{xgx zn#?O;83f&g25D|-xqj`Mhf)GJ@a8IGsD$$w&}Vd$TDs2FhYv+ThKk;~W!$OV`~Ok} zf5>)z-Z(!=c7WaG#Q7ker#qQq1M0@Ra$lfIaRAu@qOAV( z_s0&4si~^!Sz0OsVKN16R_E^$lBI;S=}drrKmeSu2>*j3vthmKPl3&QSy`_F34yNJ z=54}O{j$4R&U)}DTzPwfTvu0DaQ_ZeU_x4&KQ)`9M`Gd;egT1**;#_|ER40C#E%o& z3SL9gKieYG<{HNECpZ#BQz$BK$5skK9wE(@CQcmPzav38%6Mt=Hy$%Rx>B${RVzOT zg9@qATO4mMduOM?i39Rzbc2k(fq}>V z{=4wpZl;Q?(|O z(1Phjv)c!%U;OPWfBZfnfu5P!x42jWW&7w61yH2@^Idwva!E>vG-!;JzzxsgC2c@x zZN*p*irlY+D}w&T>(~r`60#Z{22{|J#uLlbOzx*mRR6$!if$@F%3{?yP?nBQ@fZp!{J9L33aK3+V(5v>&g&>~InHTPf zd~CX|3k(Ba{keI0pEXLZ`59IRKxNCRs_r9(ebfj^mL#%gBkBR!*3L~12eM;Tl|1bo z9U0&rc3v{IbAm^XaGW}|48h?D=Sl96HloRIsU7) z_388HJD^$M({y)tpS2y?g9gaU&lhrCwT0FyU+Q&lgaNZM68GX$cJ`r@CtrbEqHUiu z9v}9kW-Ei}$MeQ$fEwtws%ABd{1|jRrNzw0+nYmDG7^du4A#fbuM#5=jke%9GBJ@B zu$4{H!6~VrnYJ z8##KVWM%juiZ>A(Bxv+25n^vvSDp6m-Agn&o)XJB$Ct6OT$?EFpRKK534Z{#614f> zrc3NbP!EIvz;Cd*E$a_AMkyN_as$?ZzO<%MG$=^x(?t(KUI1G@0RhI~C0cn8JTVKP z?arP(pb$iuT2OpkKn6mP5lDBh{RAGrDqY#Es1q=lFD)%MzlXiy z@wt^{OiZbcd&VO_VsIwY3vIf;e*Ex&Wz^HtlUGnM3puNIin$}#l3gw?5cisMucKn5 zDee|X?~8M@G`((XM=@AHKmYvuS4;3+y57&9PXWcO?Cj$6^O->FU<6)*rvw$kN%)vB z?5GI}2EqZqaTzWxlkgoHlrk4T|91R%$;RSs;&vde;YSP(4on8CDK?xk#xwXe_ z%>p#B9Zu=xkYhuzCsn7YJt86^R@Y92UU6BUsV1HXlqhkCvvYGTul))q3!W2x2c`~4 zypoMg);q(LCR3c2`la$i3bCoFel<1nZp(kDU0hwkrpgR52*M9rg8(qpKc2(S=H^Pc zsd={l_Cm-|>ES`YfB!zQp}Z;Xk`S~1w@3*Bp8wZTK9ZTamkjI%%>Xj;XMFry?JHg! zf=m!xSN^vrO#+zNerFo(z+6w&$an-z1AkWrJq~6Fq&74+e-6(KyzF41{RH7ztjzsY z(a@-Y0Z!m3rjm$=2xg&1shb3(+&buZ`5j^X69*0m8Bkrneto@^v_v}VIL(0*^n3;4*~x0;=B5xyLCf$)*t0o^8$uM}h!G(nc?72m=Tzf+DU-{>~j93kwTk zg74YmQLcCG66bN<62B%>JVY-z-gG~&cgWV>bb&LEIb2y;IStN62n7&yAKX23n@M+` z6ReS=#t(r86K(>IA?sd;u(gd1+CVMkA;ATI{UeMg(^GpH7^+a2 z@DL$fUj_!A$HiEdZk&O1A@~mlNG9yQ!&lyxK@1V14C)95=>yoOZVM^888G*d%sBpw z4@pc*gP-yQ1&(3%7-7TwNYmTz#^Vzc1Q&!N9DU!2vIc5m%7W8)!Hju>b4pIy!mAv4 zr^0Jn(ahI_-R`7~&pA0aG&L2it%YIUc02UC!UDYk8~xtBR3}=Q3l|`cE5U8q*aBb} zVzBFfd71(D57Wh2(>?7AkDy%YPPly0EYS6$?unTHp`n!Ki!;kHX;4P|^jF6DM8* z9{vmue+5eCgAk(uV_*ZoA?brv0p!HmKB)bzv@KNlhf`j_RP(A%Qt;v+gvKE}M zk^l-+4slK^wf?fMPEqZnR_$v(mA9wO_k%sdH`340$a9>D6=PaLqZyFFe zd$XO|$jAtHG7Cd~7W3sg?DDxrDP=pm(~w{QoXy#g(&_cNM#@C`CEz9D7jd#4s)7Pl zJ~u;!vH%@bxp_0*z7p!}dzc7Ps$Rqtm*MDQSngwB5OSI~1vfXfu!x7QB;qOn0lco7 z`g)m^mP}$m0`5TK0MLlgGTktGd6de3PjRH4Y{pAZK5=7`cPS%!FU_b;|96fpzgtS~wI;Ew5WTa+hpjs5F z9tOp|j?9a!`a5^*7{DmxICN+W#8j7M>DBx9kHM>jYOdJud%V)FG4^ z$j6W7W?9%EQ$=$G?e$|74@Qgz3D70LZklb@uz=)=2`LpY7KBCx-3zx4qzYz%kVWSy zyql=o`dI{JNLrGTw!oQ0)=CUC(8g+DHn~RToo$(d0}udk0%Bt??3%Ld{Jagi-G03N zyqw(DAfB1Y!m0j=iSI~~2y+pDf_F-x=h(4*dvo$`_%oM+cnHh|lOkJNoKU$uP*q)> z@`{I&f&$SGToh$jJwG-H=D4OrrDM*2BOIEyrQq-}*dO$jk;8H#E&<6fq(vZbytA_t z?u6QwE^xGJ&=C~V_AOhsptP>vx|O6BN#+Rq3kER8R?&xWbO#mzmlurO4`sLKOS zQ@hYUiTf_{;NW067ngG=1(Z%G!Svs}c>>IYO<@Qx3uJLWEVrEdzmo%66@w}tZP@{* z7*;Adk;DDRXFCYL?JOBSBJ@(6%-Sq@l#I-bfrjkTrAtAtUJ(S~@T+Z7Qc|!{R?w`_ z+G=yAQV_4WAH;JUJUmp0=U%)Z0&}D~$s}7M#XKNHfhvY~0_fBK+YoUj@*ESI6Z0P7 z<2fSE2M+{J5`+Uv1hQ~+v~KcuA^c(JhS(<4=77&YsJKfngke1~A3O;EWGku^Ueq4M zbV`w3n6xo5F@zh6z$*y;1)Oo{M7RPw$t*1`(H$Tz%gf7fKnacp3i&NUJOtzd#?CEN z0U$(Bw}(5u;Q&J3ZZpX}gZx z9Z~|ZXtPT@a%2pl=0JKpW(2k0xnG?78Gof4Mc*=Q2uMXrQHddhhg7ad)(7fX1nd0D zyHh?e62XeZ?Z*i+b#AfU&}_AWu-)zLzcw||fsmYDxDeOWH#jJZc?}3GMGmo(T{0X5 z9iZWeD1iw%xFMeD{SCVE4U6U!0AatDt>Kb9@Zs;Zt~ zEE8lI3M^eIC?zTB`dDr0Vy8IK>%7rW%7vcZ%92m5XXqX({EKF3d? z8N>rSPfkyd1BSI(trD>~5q`G3c&VozXV5HJjqm`+4#5L4u3{5-@&As?|Hl~nmY$@5 z`F;IT3s@+MC%T}38M6hxDJZpJZP1}nnFsLDktz@p9*_-o4lgcg#U4}l(B)u=8A5KL zsS!?tF5=TT<))`@XleNs7K+1W)K*Nmi-cWM69`w1&=PtP<=tNFECMkNWVgcH0x+OT z)fi&{aPPs0pa=+B>Et9v#0CyM4-+(RKLjd*?h>X8sPh-XR^?H+!TT}(!-u`h%*hR# z$FV$sr3x5zNv!WvQc?=Ye5wpML7xf=#9(w!&&+`H?IP?`*j+awapW0;i4 zY|46jqu_(ib@guUS5{U=a_|tfCTcgj51EA7GCq;#k0e$_UA-EX?j`s<0&1yxy(O*$ zl%c2Qor?K`dR&*Zp(6_XKA{wmI6p4e(`!k-xxU&~Y77xWWR*w&5VH{p070NZ?g=dq zKmkAv4Gp0b6JISyOOVt;{T2~aG+_k8yhBoV<8miXBg4Gy7*Lc5ph`-hzZRzf|5&hz z3mDzMZy&+(h!h*_Nhs_)&=*6a9-AJQWo5nIEmAV#9^Q!IKA3pJN7 z@4!L?m?uGQp_SjBwc<)kO9LktwjH_Fny%Z3jI3pBDW>r8dfHEy)fjNY+Ms6S|7Pq2YfyFaNsU`@mP_K z9yxNP4>&+<`~Ze=gqR;dm!vqey515V1%ilhm(*1#_`aP3J%C4ngNCfd$oT^-BBDu7 zaq%$hD&RI-NC_A>Kaspcu$;9X^wu<+i6X7@qPPcGQn5y+tsR`Vywam7#$75NQ3f42@*~n$`5w* zBg{4>1B2Z$|Fa7ad9D^@i`d5l7RUq}VfU(eo5M-tZyY!d>{4KWLWCtpAj1%{AJ;&U zb$}R%MeGK)0{aq%RlZhL5tbi}(|pqAT1UPOFCGHaF-E3!c6d~fyEe2NPQ0e3Mh|KV z6O-tHQ_TLF>`nx+o2jJ7t_h6!?~vFn!uFUSUeBIoK}!(P0KCt;W@fQyjm%8pii(Pw z@81u>PloP-PA4o}&|$$_nO=yV>@M8G;u(AcLS1qP;O^CR9zN;o(?h^abW~<$5JFyp zLA+OZMIar)Qh=qz_1-ZyCgcS&V$fW0;G42{vo&qSB32)yef;<#JNpe@24prdo!GKT zG#D%Mq{KNVr~Je-2<3}A+Ra-1;$#uMffR@k@?AC_}{0On&o(|^(K zMm+p^(1Un5$FS-^CYnr7nFSPKXuTWzxb9E*kJ?)tpfut6Lh*#c!71Rkc<|r^3h`cd zULb&h&9RR>d(jPxj+mJMnn3IX+Sz5lOa23%2Rv-)twwU(%%T^s<^&-PF3)}F&_#wn zC z)&+d}3n>E3dMF93_kozxv#@-F`l^AfZ<%@(5pfmkAiy1kplMk6|EqMh(bs<@>^b&I zS(4agL~Mgk@f|sS98df-mA0ztdo|u=%zC)KJc5FRX9gZ-YHC^rPLII@ig+H5De%t) zn@Gf%h)_y+`sFn9F89s3C?;|H)Kxtw0J*p(!q&huMz+e0Fc8cTsTQ#zWqK+T=K|S( z1&s+w=(5nFZYF7n(6QHL&c9%ooyDVUTd7c81u~^JNeqb{fahON~J*&XLyVAopPjJ;9qIg@J2_#DvJA0i1_Uoq7$B z`_fX8RBu_L zj&gF3TBm#=Mdd#4*g(Casy(&j+S|5Kkesqb`-`9OK_(`B1UTIVcF*A-op6}cf|;C{ zl=KGz5kp1~gQS2qBO`;W;2aE9n0iFnVMa+7WhHyH^Jg`k&4icCP zia8Y?3QCOd*T8M?bgB>^;skm2ZUYsM1EW!Rb=b#rH714=4Sw<2m)>6XVx1SN{6i>R zB5ud(0ch&QkmmJ|c4DlwZ09(D(7y{Eh)@+x`W4PMHdBn&muIkmKvXN1>##9kZf=h6 zK1G{2wh^lkh}?4)A+Wc~uV1Yp zH6cv5Jc&(Dr^PNVCLUE&g^PFCFU{{eC(!hS!44x~CB%J&(euD5`ioF#*N^PeDs_vP zoV@>sWMOI={r)}FfHDFMJZ6GKVALZCm5aNsWd<7-VNxG>*5};ZIE2yIivwbE(b-q| zGJyHe`p6PXxv*R~j~!E5z60U@>C-0;DXFNBACF;Us}?+V1=zP`a~dlEU`L1xzhF9E z=YK;;Js6J|NW?gRS*)R{NhIV@9VZU#L~^k!Tk|_OFFrv}7Z(=??sZL9SJ~EfKD{Co z2kYwU3R^bILT@>yVyjVbLB@{P2vORQNn0*AbBP_S^aX-X?$P17cb;&Omv>tVI$7 z&PN0YGvF|NQ&Y+?c!Wd!kXRAi)opXdgs|cE95?_Twp&e2jo5v`hUfj?1y8cFvX)6e z1LgOum@Qmy6rUt4kl4sa7n~3oVv$PvSjb6X;fmm+w@1du?_k5UyXfI7kN{Zj=P?Wb z{IE-4PkcolN94u-UARLnbM1czvna6k4y=xA*RDz9lAMZl9=ueJ5PJd<0(RyX5Ri!g z%<5X$MwD5$=CTkitU5xGfg@u0N5dLGt9fS><>rdOBLn;S1hOwDCkInC_`uw|OSKad z6Yw61U=*w78JU?BdZwoGf>%OAJ`h&+!YBi5G6U>P?A*P3`<W4`$^np)k(0Ck`E%HW#O|KHKD-EW{0shVfaQZ!N<73N zOm5^|`dFI*PQ!VIo9-Q71xDwyBtA;_hK_&>Uh|&P}>BkOr1@_@={(`s}cx`;CsG!K#3IL^p z496zSAE;$i1I!pe1sx+}HJ$~rKFi0qO+Y~4=g*&HUfN&7sSaW*74#Qo9bw;V$YTfn z;`M7cZd}mSW&f{(N4&$=dCM!L|NPPObkm=K%yMm|bcTXsc;H3$u!Y-PNF{bO0t4xY zCc=bxIMe@xW)=?LVR$&uPM@%B5`aV1)@DUCh-vX!@euk7i`u@J4*0(>5u2%ctr!o} z=;fO?hx#*=AeCP&_53!PCR3H3j zU|>!lXls$aAPkaUzkmDV>7a`YSfuWEpA8)552;T|OeA(x;VnSvLu*o-WxsP?nxtc5 zA|lik?4SG_AAb-32tNTG{rJjZ89ZLf40uo2aLn*CVRI;TS=oynO#r~sRPUvPU)!3s zu3Yic;6Ftwj*mYCwm?ucL^T{C^-rj~)>nkt*J15eR#jcUeOo}I1Vc1+zaQM47}OJ;rxCI|Io*eeXdtA7JOh)N*l7m6#U~8#ksMXqn{N~k zAx7l+?j4lFZYx8KP1l1J;^=pt10W7P(N3RjO z7UB(aoDf|oC~UA`0u!+}3Yz#V16+@pLz5E|Ltr4pZZong&Nqtabr9+}wUj2a?3z2m zV&dZXumU}620k4S^!9BH*4e(n&A4`CAB5NT?T;VcvxFAtsf7%|OJi^4HQ*&REp5wF zbb>$3rEM=hX&r+zE{;kdq#5)K_NtI~&-Im45_k>Jgr5zu72MOK1J)y}NsM-wd{Ap! z|C1=cKT!4VxIC;Z4n95~7$x41JI;*?LauNHKEOD`u2K?^qyBj5zEXDl0=A^_4{@jy z6IUTHU_TXMTM~N7dT#hC)^GU}xlm1a{{4){%I`HDod7II!3)Eu-Vmx09P;M>L)V#y z^}Me8KSQJ}8mP=9Ns=-PNh%>lrp(H?OhqB2NKrC{& znS-~{ssUgDb_@8PnyMJ-&`q;;)t4835cG+OVH_zU*W-A^>;qOgIzeC>)RO{8F{cT+ z$X90rLnJrjm8U&@x*yyFokqjSgHQ%g2ccbI<8^?WkPcBNz(9DGCW8kX_IU?58d?&w zfB*i#lo=tmw>Wegrq$3`ifIv$h^Id`dII#0P$(c1MPvW6)dT(I7)Z_@`ftxVr|M_F za+gyI9xpTNwreTuuJAa$X2RkfhTb(*7fM-TI~~oKRglcisebNsaDS)JoZ}ex!qRL%<1b z2e@uPu}WK=LOn&{)`)fMIAw}p{I_o_F&7*&GFw~jkGK!{-HQ0Ow9%rS+P?iAj8FaH zs|)Y9V%4CwWdL3Qyv);S)~wly$BSq?U>s^&raM=ae<=U)W9tFfh0$P|KoN4*uyxtT zBKQ`y6Us|^A9f0xkPZwq@Wa=y$FE*(L!YrxzxPhRz^z*?6?US{W5v+J1UB1SncHf+ zb-wrd(gMXjdSejKH|p85r^4EG>p0BlLs~{pFc`a)@9HtU^fHG8wH-ad4hA8*SPOUe z^8=dZ{bBHxU(QJ0Aiz>kuodwK(N;{Few%Kn=I65A<@qOT+LCo_zISY;U zXFqzRYq8nX)Km;Wa^z6H8A!5oa(3X1L4qrEh9_bms?k|mW6W97+0jQ9tl@yr4;B?d zfJ5|K+N5L0j~|_2APhIGG|e6#+=CH^^1v{lY#BcFv>v2CZ7##z%u5aSrT+A!o^p^8wHfvCgT=$g4XIPElY!;51PRJIgtJ za&pXZ{6WBDB0uS$>)F}5wlMP?(-V-;@Y9p#{Q2id@FBo5U|3_+H~@Y4P(hDf}q6d-)8kzdGXSsT*rDP7sKk>^i;4u8gW6sIQ0qCP!Ncw zOD^yvTNMXlCPoQEtqk-7x4-}ue-`XG; z)PFSm1VS41}lN@>L+bA z=PX^CPO%cp0yQ6&DF~ILm)G@*^+VQtvve=gRS&SyyXIYI#^XJ`+)aI`;O&HeDfCKo7`^uH`SQh*dR!tGL zFhB_~L3bhI6dL0?l#Mo{M|bYqcjB?`NF^UWcyNO;rBWof%a@18#;R_&?p*W-y(H~C z2o8gxMWh2#F&H(N07#PCH*P3Ue88eDwyo>kyEkYNyvoCuFYf`-NOfnkS@F_)^|F97 z?$@v1;5FZTLE?vh5%nv0+@7?>GTJz`(Y?8`+n2jZ`N==QHUwoYpN?uM(;EHN7PpI;e*=# z`==?yf-%#JAO)a)n@-aUW)br)XTb>+%;NGv-s7W!ETIm1k5qpO~k z-fzofP7mbO_6$SxzOq)310e$+KzxccQk>P)O~e)fQ%}!_(~`4VJjRSP?7^Wmm{(Z#LPt0Qf$3~nR5b%OAi+|xjf0yy46gxsOn$Eskd+YJ1!b+XQ%05RJLFG zB4%o}+h<*J%{ZZ^Tv*f+O@D#PTL2geCJ&siDMFa3rwfr8Img?uBzqnJU<8AZd6Y85 z*_g)Wda&riL9_LL@iF;9z+h}~upN(@s=g(9$Gzz9WmtG~>koR31NdG_5s>Tjb_BHU(1kWnuxY74qSP7I&{85nrkTQd$kpC3L}pN%Vr z83UC`pFX}8;YZlT@zaeo`;?WHt>H09g9w(mYZ#~pNF_Mkzt%`v69yfAQhTN>kTI)h z#D5MJ2us1i=Kvw=l&(PYd}4xuQxrxiLCE!J&-m2p+S>X)vyVOO->E+Y=37*2wA8!U zQh>(vrferm_s$G?EPWN=AO(KJHtUFvyMUx0Jbvs4q300YV%juhq0cRVNk!$icI|Fp z#{~i4!5db?aaW25Wh^Osp|#T*=fes)oB03MOn zw&53XDv9%sb;8ii#3U;g;W?ug0_Gc7C3UM`QiSzeC_`}a9E79-T!h$M^ZjG+?6clj zW?*<8zItWouq0;2RqOTZui04jo#hOe(c{WS`!F-BNQdQ2U^Gxv!|-d@+Ci2!Yd_cq z(n!R~P@N2^Y`-`L)*m70k7&>{Ime{c1~SKx0(g?=|Er?H-ztGlQ82UosMT(6oqP3C z-*d;8arA#b5B&qP>(}>-%>LlNeLL_$4+=b}sdnqu>K;8WOeI(%KM_ZX^h+hjvpKO- zV6;|?i+b_mlSP*g_$9qk>|Muq7nl1{2MVGdt?DeVN?D=WLt@+|cm(2=z7-=GT4NOa4ea}&dGQYomYsL(K^B=7a}Q$%C}=q>dU z^i#A3Qob)Od#!^Cg3}RPm$e`mc|?|ev*%!dSnzH#u6j`Z`F)(tBlF4`SZ>U!{iY@J z>+03-0S9=|8ua9*lc5?34e;aq7J>f?x@yqyEex475XckAJJ>+|TIB~ED+f1wDh}u! zt3A^RFTLpF$D_xOH{yXarpwOfW1&_>-mq&_Bx=bsvl4fJwlKbmLX<7cuHx0FVU)Z)0%06sWXEy8bBZZAn;x$-~`0%4Mt|(rI@oOP7FShcHo09U!oqX}iK~B?D@8LPv>b-%YpuLry?)l)_wQC&m z>Hs@=c^!AQAHvbvfI*eh5a_-uyc)lJEb`T$&LfIGed>%?Bq?dwvfS%q7?*%OkjEc= z`U$+RNAm53Cynl35xIY|cxYr-R-&$om-qF<1W?c?LfNkZ`uKQ@y@+2`lI6_iy} zm{vORXw9Fs2l)(~8KY%m*L&SnfIw16WN@Ww2XOcU8>x1S{9kB}xccVnzP%mE`7J-6 zffnJ8bQB_nojh5KAMboM7r6{?;~RbmDgB%dbYHKot=o@|(&R4ic{gylGyt6jjho@q z-AHqf3s5p9z%xYB^fYDxN3sOt)=PUSU}mA;92S5p3kx#xVBs$#YA|? z;LX0iM&q|d{FfF0vWqd8T`QOoq&ZNC#^~`NlX|%7AT(qeLAuM!Z!GEx>Myz&E1&Q+ zpIw}sHgeK3E?}bUfB=Q@iZ;t!CrIhyxk)Em20GA%IZs(m#1FF?&c1Yn@F_))=_x<~ zN!PrIV?j_!X#nAtp;V0L+-kbfc@Pp{M&n3Em{z^#m$1l|fB!g9cnAuI`khesyW&N9 z_|O7)mElipQAmFPP+3Md)6%w(9S{VilXQCDow))n^4xg!j1nz#W|#GPi=&Ey6doC= z2)2ldYB)cJKkNds$u4i9tY~It#-s~je4n`^q~FrkFnC=!d1*d|?L-Zr<@r%qNwnl5 zG=UZK*v|(_gU$pqX7FIFQN3TrYjwa+!NHgEtM|@>mzF&D0kM@KxlyBUghRwZN&|L? z#GjT(4p_z(N(s!2Vf+xUYHcLE%Xa}2F*wJs`)LH2E5NElG|KFj8|_Or=Q$TTb#I}Z zwEEK7vjz0g2)i}dc!s*vR)G|>v_{OGd(5W$_Q1f-d^Z$yyO^@DT=VDPYtrqb_@z3s zV;|<`?u0uRJjfQxpH>ERUzwH{Dj!db-h+gOyZZbk5d69Dyv6|(G2k1ia znNT3;%XyJbUyP$_8YwCU_&zYHX_KA!`yX{rtNKq;Nci%;?v{$eo|!S%+&}DAx&!BU zBRgAz^Mx{uJ9Rz~=c}u$ccSJxOUF}N{eEa!b)_4)3Qo#Amaq6LX3P+xS(X&C38rE; ze8b-HoZb96(1Ja4?b>VY(PeFH&{(@|+heCrHDzpof65FSnudXaQ3^A^9kV9mrDRz^ zFKGl=TJW`LMMNA3YRwO2?3YLz!RYkt58tPWL1ezqrZ@Pf*vvttOOZvp@|P)TDcV12 zdg&;YoO=J-*kyPBCO$B4wNFyj8EcDJny#BVBhDz+nAK0=;St3jq3W()tyMdm zPKDF@GHZ`g&ag#Dg)olB#$$aIS~YFNI1T-k_wn&bn7g0>ruasL@A@?zS1_BRI={L1 zY_KrC-X3I(%+`E8A4^dtZP~KLW_@*TUCk`S7!(|!YZhR z<(yKGb-QEj5lfGqGDXb5=$fUm0N@)jqA}`7sOSfbp!Dz5Hvuc*2(cUl+2|fsxy;c% zGr=S2!Gm41U)+Pqyzbegqv?DCHfV3fg)n9e+vbn*@8828FN!;VzD4mG4-dy)od-Xxw#x!F%Z@(^Pu*^Z*>#MV(;9yJuG!QWEH3Cn~|k8E2d+P{1N3_Mw| zbg9L8OfmrLz5Db@p@0Z7jC$=@?I>NBht{Eg{Z&*{r26_37yye^yIni+9|DkjdM4a( zXJ&F}SZx#OAoZ3JzyGpVsvi>PPfBccZQ%b7wRQ~~oMi-#AsRFgDunVPsbcSo?vL-; zsBz=eq`6-mm|#i~_A8rxqsxGI6canAIw3HEs&T4Idr4LXx<(L8p%3A@OtwB*bb%F@ z_vK5EzkxtksSPT|!9MBaJMY@}-mz!TCWCx2I!PoNdmA_`nIgkSfr*yp6beN2<{WFi zKq!X&g*QfHd0yf2`Dn@oeqh-EEQfF^lrcI})%@1!>3OgceZVCwCNpU%gXXE zsz5vs33t`HPaOiL!D5JBn2aC{=++yYi=Z-D=4;0t}IlI(j<)+5&26!P(%D zkZz{iIDqg3iwOh9#gjv>sG!Ith&rTX#T*4(OZd5R*(Vek9U`| z^BYFcI^vvW*l&zPXywZ9p$FVUw$bF_>-s&(w+Ob;6^Rwyo895TBiScXl7N1Jns$eU z?SvQ+ZiZHbY$l!wp0qg>5E&g+RZC7P+MgRSJ|fFM%bj7LhMD=0UhoE3t6%fJrlwOH z4w*rt&f{GEVOwBe#Oc$2T$|a`vk+QXTuo%5fWG&4$stB*2Le14IPqX;iN9VK(-%Xt zAPVT&tVYDDJa~%MxRa036somoA^kU~N`Af*UmbJ6VD^`w36y#O_f~D&3O^2Wv3c|6 zhVKVq&tqjYr%z(TLHy7>E5bgIq=k=KD`EKt`gXd1-&wB*Yvx{F9-+N+=eBJ!1;b3> zbbEuWP7+T*CTM6#DLPit-afS7A0Bi3T4`&eiQ9}YaI4}IcrU(=pxN~t=Eu}ALi5(e zB%U1Ta{UC7do}QGxH8EKB1cU_WoxgHrXJ^7n4+apPVIT8#@el-`?lUL zYnKL!ARjpcY4|-$Q?(SR0#pm3b*Wmmd?t=bw%GveNvsakWGYNKoD|P8aEgF>i!+wD zC?OHxx^vO$2>kf?aVjT<*l-bC!5swxiyek0Qmc2EHO?rcK-ZYyQR;K}upkU6K8Hg? zLkE=Kym^!Hn~#7>26Jn(p|uqej^(56?V|w8VB&Efc6Ge#UHzs5<(9uj%iFC-51~S& zAkYTyUXXcM;``7^AV0l$9-SaKz%)ZW_zFhwR_)roV}47X9CGMTI)C;&(K}JK z1j>}pVfobFXun9vSU2d#Q}5hq0#80OChf(Gzp$K0!Ve5wihf`4P9{H|OUlDTYeLSF zX##R-G=xGVSPN8r={bPl12j0G@OOxi5UB0RlP3^{0)nHxa_nJE3d`2Qie&+7zQ(;xOoYI@S4Ikqmbb2#Gyv%xIrV8s^q~B zCh}(2zI~z=o-tzvY+$%U^jL#np_K{?^=fO8w7>b8ST}^e1C#DSem07mRN78Z!?{3> zluC8vpHMT%*Hf_WnY*TQn1fxQVD1Qj#=ycUj{=D!Z99qw07ZG1NL-YieOpao#@)&Z z&x(38tM2=()YPO`seyz?F+%`WWpj8kLqMl+A}z10U4I5Z#ooR-U{fKj$>8->6Lh2Y z?cWd3jao4&D=P@jh#`n36nFNU-%iT+0JFrXDYbQ`6r+0;vgP1x{DJsJC>XbPc7W=M zfPJK=U(VGbAUUinramI1h9NDI@!|n0LaEzL8*S3wgIs0YY(-8wC3m*5|Ar{)2+k{1 z+j{!?{sb(V;^I9AeIy%zL3%q-7s@Nxc2Ej)L|(wHl5qyG04xHS2I=r<(FMmH zqwp|u;6ag4vw#eEngV|KOuoNxpr1t&#Ra59?e$67s%y#$112P5VKhNEpY@zCAAwwe z^2Y{J+^EBMVkUK?3B7XVio!EwIm|8KqXb0i?kk{W6hkUwxzaeM2QW`jw=v|+1`PHc ztgo*G7t6`c&KpXV1%!2G?x0_Qs-hwy1*Zw--1aa1Vn4Jdh2OLW0-b`v*P6M_cs+Hs zu|}R`9U_E++JPRXr8|1!gc2MkzypLjaXq<6z2?Ks^)XG9kO;W*-vb80WJ`!g4dx2Q5=F+O<*yY@{}aG zWQh3@!l4N;Fh!vHTH)&Bj~Bsxuz#7(y4tiXTv$bUVGSZtab`X$a63!KN;{jztngrA zpC!*?H}Z=BmpNFW_hvJ4+eO`EYic4!Hx zlN;&>Y6Py>3xVpQt_n+b1Ovfo z(xk4GC4l5Q#PQ(S3l~KHO&*WmffQB5F`FAeF#>yEW zsal{t#AX_pw(utEhi>@|3R^M@VsR_7Pmw4CDLU0B1SqeVglqsVaP(-AN-e)*e5wBYbN4_>{pWnv?-FS^L)ui=YdynI=Sebwso zwSm_zoIUGcd}8#dQEXt8M{n};JDFv+-d;F4!sA@eb+9DDTXI-|l+YE3E;1}EldS@f z*pXaPIy-1OFeHiPVFc$OM-k45jeO~j=+)UA@r*W5Um!_aM}Olq4jL6H5tTRR_A-Gc zm%J-xTZB)X1Cq)^F2XLGoRU05C{~lTkFW#4M<^fs$GP5Qqy3U(3g{}xB0B(2H^4H( z5>jyGj~U<$sWzU-6NH}PYja4Vs^u(YdCPpri{sS?yv<}N<5*$l(VFSbhGy-Og_1^L zVJEvWj4luP{^N({p(nHx6bF%@(!NH;#*Ur-S72Zu!etT7f`ReNVViG)PSeXLy*KLK zeGaY|9srxT)xYqKNzJ-8{{e6|6ui&8z-Qq@;B5|nEWUP zWR%%CIfbi!1Iv`)AjTY64FEQZI-|Fg4=~h6i~2IxiyZ+59Y9su+eZ9zY6&803AQc99pJuc5Mslc3@NLeiBwZ@~1BUW9%-bTbhZ>cn7>+H#LH7hG zIf?Y8-;+s!evh6s^@QY8vB_Qe2s}Z{6M+N2lP3NbEfS~<2rT;z8Ong4>RytwujoB_Qac@-xc&q&_Gfy08eCk=O_SVhxRmg7dv)W zqlqGs##fhD+kU9mHd;$4P@dn|*=np{suV`gQ#`KY`kZ zIg6bET9N->JOl6;M5ySIHpj`wYzZbOCwksa?`jFVnV#SwZsOh4h$~Adr0~_8M=0SI zNUG}P<(n86`NOT2I%?qqX(j0zTd>;sjhv0l0qRf?oTmt;q9@$tiQ?ad`qS(=^F9NZ z_qz@m_wLR4_$XQ&$shvY?X-Hoeinn!i2+D~0kQ>G6!+{2+XO6dl*j`#f)BtR!FweK zm3|LPyp{s!Edv?{G)2dDx&^H$x_A{n17zgx!7g-X^!3c$?0@lLGVI9WMhyf+Omjfq3~Hk17ng=AeWo9hiIV}X7DuddeW@J`1;AvCXQ`>AKm18U&%37q zom@cpZrxzygmK$*P6Qpj@l`(d%Vn5KSbtk$6y$k)bD}6ufEfUC{t2 zT;e7gH*PFNyST2_g$D`qDjGUU`(L4<{2;>OD;m=wZ~IrpdZ6~&A2n^dE9Cqr^M0ea zq43(z^SFFFvPAs7=t9935T*Q>JYm!CWObIM*xO(qFkTwj)RQyt(xv^3e_osbbNaM~ zJD2YZGIE1VM&LPy+|HdkDoK$9q)%pTTAQh3x zlXpaM!Yif+md}re$54E&kmFk-(w|--NI=4Ii%@fTZy*wc0kucD!nlpE1~d0rwm$V> zp^M9VAfZ=@-W@OqfhvJv-vq;86Ob7>nywbw1IdIiyZ4m|7ScKT>?OFoGfvOhC zIH*n|5Iw4u+Ax<|z|kZK#}M4Yl1!(kXKmO9uQ=1>Wm*m}V#%SG6I^G5#N~1z2W;x! zr_Y26&3kw6#-2Y<48jgU9IyvigySB8F-*Zda$u;p8REATE;ghXEj=$dH z->4w87+J_W_>6h8XDhHIO4n^gg2=eWp&%YC3XSkPocsVENp}5vpG9sjqq#U77WNUa zg-2(>e!q+()}FGB@O~mLKPnhRtCpLRthCR0{l8$<4olTMex( zZ7!%dLiaW0MQVa{78X8apaeq(ng#GhZ8Vx52|w{ItTX5} z1~j5TlJV}N#qOL}*Kk6}9*6M`4#;Yp|4*p^W6vC8?S_Shn3OqggpgD+T21k9v`O@z zGB;BT>9`79`^+gJ&T>ec;{|j$95t+mE(Qjp{P#{bN<-|;kk}r;OTu5MJFdvVnYIPP zYtcgY;m~=#T0z;+W(1-2kr|G^vk>b8r-M%W^^_gvGv($-EWhcEMOjk6cpTEa3UvVw~S0~-Px#?d&76~&WaVmlibw;4XiGr%#$m=UGi{pb9 zG%S@^bED6kvBqRY#Jn(>9{%J*f=Ef$8iNLFdNbQ7dIH@-274bRXn4_OiAsg>(qes^ zSg)cU(GB3f=LdfH@`YAFjtX>zjMOM;;UG|ffjI{3*vCtjpvN9PzD(ZYJ?eKp$UOMa z=~q{6$7+R@PL2(+C3Ap{(A$H)e$(uf;}5FP?H)20paZ zd;_`Ji(d$17nm8um}#>}k*d(Q zsx;_$!I3n^5!(g=k#afl{}Q z`ekBG8(BdtR1sWBzseD-)R~T38VusgOmOJ&;&6DFBNRmvOE1p|M7OC_{{er%+mKlX zdS+vqAtF~E_Vw##$H#=~?ek18PJ8udpVgXa|EudNFErWW3l9vDv)qLM!3Fceqzi|N z_Z?Sf9wwnq^48<&Vwidbr$gr=dFu29ckYaIKP+w7q?4)qQreRm+ z`%%J^QCb)tms6%kzu7&a{!0tcgW?!Y=sHk~+DD$FU=55E>=d>hog1^igoV4h#;V=~ zChnW;+M|W;^B?NH(arAVcKqP3 z6x%Cy>U~ZA(jIO2OlRwfjy?{SEykLwj{bV9Oh$mMuG@>Qt}bXaC;4Z?f1+4B^4_ zZxqux%e2RYp^|0Ku_kHsty;-ANcTJir`hr2$Fa_tn3>sGSt(MUG>i8GQxz5#`aJy` zV^2w5J?1BxGY<9cSN1}g0|doV@Q&MtSj?PxI4_dBhY3x(!(?m;r!F!i^q|Dw=g(L+ zZ=Th(X`!)C7B5>ipR_1iRy9@_Ayru9rImqMqT#gVXcB}{OG{#;kt7)#8{?L#&y)su zmrkY>>gl6s_zoUyo1b-h))5X4iK#vLSb~|xkKg0(`84pn-62yeOgU`5g7q9QDX(6& z}oV2QjXt5KOxIxK)kqV^O@Fb)1F-lJ59dDJJOorXr| zw)4t6yCWN>rNXNs0qvaL?56{$A&j$zJ^bMA6WSh~E3!YpTv291-($g)ZjkT-=`qLZ zOPVIl9#g7Z+QcB*sXFoH%a?$qItz=ySDgEtem`)*ym@ME+Zuj-Op}eib`%FL8hM`) z(}{@TY~X-Ml^0=kcX@JM0*-Lrbcq0aV;R-s~YSY2*{f=$ii7>n{bFTmX;MGw6LzlvU- zbm5+sQ&@wjfaoh__#^eMrH&ayi`wFt4))9uTThfQu&O0Qyf+)AtC8QzyDB>@_Tt4x zdYY4%R^pzK_bx(TrhXJ31x|y|1HqIh+v8xnNdeW_b4Pp?;7YQ|;iH+`=-EKYK`OVP zQOD$k{zX8* z!F2@9ouptAo3lh=BToEzhP{zG8*Cdviu&0TOfc_ z=?O4b;~`QxX-DNjgZSa&#{$}OAU~-f`QIY!k3JrhfDE()Nd0y06YwH%9y&;<{+>jW zB9oNpP}jrg3;eOWNbiM;`SMeGBl5A}IhwHg394w#8?CCUq8`g-Au{43$r%+Xx9VW4 z*#&I;@BUj5e0)|0zr}gcqPrqt zZ`Mq+emH~*ZyB_w#r4Fhua*FYY*dZ@mARWd_;Nxo`d@ikHjYWFRfi6OU!c`2LD=_p z#Xv?kEOCLH{|r8&dt)wR_s3#r=3lk45z2^f%jhbJoHN&b>1)!A+ebVpUF19X52yg7 zCJ-e9gr@S2y_XME5ZNQixz8Rw+Dm^1Wk^`7GT(Z78Svb{$@(d+OXUuXnOw~Pl+g*7B^oPg0^wIm zOrj!UqG5y^W&D(!Q4S-fZJ>0S@i{`QOT2gT-6)I+q56z5~dEVn)64@5@HT?O3o1DM5Y6Gf{ygYYBG7QBgR-{Octkd1<6*B?w= zKD~>1B+2pEZl&Qtyea)}K`oYmw>(c#^HY1xQ1;PVQ+QZeDDhLPE6eJo-0C-Afa5C{ zej~CcgoVhg8i0YMPz~@;tDAqXURiU?q36s;AKcmK;CMmz-hqa94jv_GQ3~vD-VW4) zzUD%z4g4rV7YQR7Ssj{^`1>E;inU`j73w~g)rD#)L?>2F^grD7@5Xb$IWU`+#Bg_l z6CJumx>1mgT*${1J#Wd9rrh4*c@%a7>{(Wm0FfIKax@%sgR&Ws`uEQU!iMJn!xEXT zz@3~7;s9sN!Z;kkxIig@>i~(7NuNRi{?YK#_@2|VueOt5i$SJCem+-HHyn5P|-6TR9OFjDo<9$HPBrr}r}^Ok^T9Ku*E(g+l)uSNs=&+QeWbUka` zqRF_iUcXK!^@X+(Wm!1Z#ke@`rkL!00v3KVN;Z%W5xC{#*pY*$y0*2pHe8cX3Ed%s9M01BFCHp#{c4q@%wWb`!4z zmr?Z8JV!T)HiHY=!ZFcsKKM6$NI^s8rjU~PsYjD8>P?uNIr=0@NibP(r%vkquO%c5 z00CrnpGRpI6Ch9K@cJK9;#$E!roDP~FtPS~496X?W;b7#FwbvISUapRspxRa4ciSX zHel-#WiZdvb9zD@@Sx_`K~-~K(|5H{_A6@rN%1HG3kHa?Jz>?BV>g51#*>al5r(>v z+a&pV^6S;>^h#aiAH}madaEC@n@p-5IA$6=GOFMb?zB0GkRhJZ84ARrz%&!DNX zAe%c*#lhHym7>{WswHp`9W6Rzm8ea;E79^GLNM;v@A#QBJ0#`^Ni+O%_rZ(4n`Cgp zOD)RFyCJt(p@63mqu6t{K}t(ta(&gT&p?~PpW_F0sCfLb`8BKkGm9cSBp&3VCtjL7 zEKX_Bw5@p;JQ*j*Ue#qIbu~)!smyO-vAL?Ngii0l^XCEa@dMe@*qcp8o#9q9#MppP z^gf{KG8`n7B&+b-#XE%ah6w|Vz=YSuU{J~ZO#+iQ?`UDbh;w;OnVuxLAaFwa0CQ_~ zYGB8T06x8f&JerI=8w1R0T=xSkW|L!3T&44?3p&<$2Xol*@uh?27Q-}-tKqh#fg(n zM#2k8-U|-g@vn|CB8oD_b8;xPEz1|(2X|9_#$zWBu-1S{B8wDwj@MQ$#CUR^(hQu zJK+^;a4`tGO2FsGi%K7SxY`W@m^8dCTC+TZVAhE{@0oGBxEy2vKq20%##Fj0F#@7y zZI1JXfg}HxF}c)+J$jfJ8%xHn1OUS!m!=J^4U!)vha!8n-?CS?c|#xy!y+BVG0bru zqfn8>Q(GvR-Rv}wRSF9t%gzt2YpSa)9gc(6|Ng?2=`IprLS>ba1X@d4GRffNax2GI z<#U$SRP^uEiL3kW@${uUxSN8Gas3~6~J)li|Wsk@D???-o2v6hjYGGI&XuRRt01HAwJ$Imwfx!>m9iz;#P z(!Lh(HEhl6H~n`h=pM7Li<&uWlE+jXZhcXt1Tg^R6BAN9E-D+eNuHCjnob-8FA^P8 zk~D!5{SN=o(An8ZYWzklZ10Os+)tOJYy)ZlH~x69q7a(VPtiG`6w@oyav z<^SV3P^z9|Qd|3!UoC<1%-{9Rx6Nb%yeqN+dPccYgGN-8xL^$^sl^uFxijAWWbqL& zEr>u6sV5VN8hZEb1T+>AHVpGTj**kM^gO2LO<%_-xgBThr;Xa~*KsF3p!EKw8 z6-x6n7aY2p9}-D=BnCXXK{|bljX4h=Cc~-0!nNTMAHAF?`b3>8D7)psuy-w(FZfxK zbHl73So(?QpOV~E$s~hgQWQ6@U(a~8Wo?_Y6mZs68rT5-E!n7$l8A=rS+s`6ym$Y2 zNLxhtwOlbgesJ^L#ICdJx1hU|10L{LTU&c9Vl`Azd^2g8XamSv;k;HeYFzc};;B=% z4V7x1*3Cjt_m6Lqf3c8xPQH?2N5ack915Zg8> z9`iUnb*#p@sOj&yBc5dDYko;ED+(GS8Pe6e;${aK2IwBico;rlxTklYD$r6+ZNQD2 z^xV~<+*(+ibB$+dv1AuX^2fb8Ae7x@a`dTp`~SYL-h^#T&da@`V7yl2b#4D< z)#GDkR24ewWZ1ng8xvMDKE}H;_`+>ylCXOj8G2w7#6ekmye@qIeh>N!W*)^6#=rG_ zM$_xT0@3b@q!pkU=x0iThY6TI!=8eMrag16#Wq@z8??}CP{tx%;6F-TE}DIoYjSzH zGd=PZIS5As%uykQsTW*A;>0Osa<4V80R1KBBQ~f_%mTO_#dZWu#h7Ky+{C8S$mF=u%=8d^YkbTS%6b{nBE>SC_t`_0DR)p zasVsmev%$+$PlXq$hIJZYm*f)(|7RNawUcVFr0?F zu5bY+>3_m+A_}om6{#ywZd)@?Z8tYJdH}i6hr*g{(jX5l2oG1Od*2Y-&43^@P|hac zScB2YzPi3X6fykWyLX8gllUD#4rW2zBgkTQarp$Kq3_KAKpxOi9vOj2Bu;fAl0tF= zxQMEypG7C!%|YUF8*P)s9I$kCMsi%M@)2P1(6=yqInj7r zvB3i=kz{S!$lbK^S8`tAnj#uXWk*>>#Q?Bq1Qy5+lejyb8xazU>_$gA@a}0Jqqw*k zmJ~dlwl!Y@5qhogd40m(0&?Gw16Q2DN*Y~u2joTmXQ&%l{cCw?@tB-frS@ND)_JeE z9e8{CL9=lWGQ5Ab`q8q(+$ndD)}4IX-q3VI_EML^`-i{V9~$)D(&(&YA7_5JHun3X zI@k^_osr8m;hI2gXFCrQ4j#1)sx=x2Oa+CkCsOi)_U+U29b2{h1I5K&OPe-J%jyKF{>pJSwt)LVLqEYzbW^Jw<9}roI0AUsY9PMnI5nfGq}& z_Hl@|GzdmwCGj`($r2yS0koWw%o=ZOyG^mfkhPZVC7Mp53Nhh=W5C|D7I|JwjJ^A7 zQC?v4aN+(YrWvB8$#US#DI=3Z`DdeRp~K-kfTsoES6BbGsrlsMy6!uFzr@hpnQ^5OW|B8;g$kcBM}wjG7-H;ibq^kbu9XCliqtwr+ZVNn!*} zp*Ii~1tN$E5!npqhS2-Kk_oW-gn>5T$l#<&8L$$3Rt!`8zD|?wk_7~qf^3Qvj}DM- zovj2&0IpBwrtfU{z%WEpao%-a0+lK&tG{^#$pDhTZ5g-ziOFNaW-7~vAkbOVM$h`| z+O*Adbo?^kh)pbXbjC}b$u*(@0Z0P>kTm)E^KWU`4^D!L6Ev4I6EKT=!Nrb`B8gWY zKItSMVle(oKa0{$S*{F#RBD|{S1?Q&mL87oDYYoy?nth*PDDa%1d8KHu_>@|jKT_r zwupTLWk$T6*i6|ZJU@j4L)Kj^+WdmM_lT&IBtZ;*Tr$IPt4Ui8$N;;idN3Je7cNp* zPZ4`LbMA8(%bjH`RZ(N8?K;mRff&6-@6>gAUol@25fH1&XC44WiOCAc*l&2C*+S7g z@@C@zmeKTZUJEhG^pKQq)T4()-y^!=VO8M4T|=b>n-(W8QxC!eILH666ri9xcY5zp zyfIXH!}<$d^7`KHRp)(O!Gja^?ZMmgGCoi7ZTzeBVdm5NC8_<_RWACpe`v+?gBtO- zc_@ePL91fYfx!g)LCd5APlmmbaUCCtNK7#I=C1;Mmyr}P3w8=kqv^Lf*Nh=y_Dz&K zB6=p2)Hi)?`68E=N$ypIbP^#qx3U8cvU-33vVtLK7I1`6>77x!0?EqFh?HeaUv2SD z5KW{cVcz6g>;PVI>O!I1jGV~ywQtN)x+%nfI!(TC9TL{U!%+YH^e(;z=);&ooR=)I zUApwN_6Q?LMffC2HhW3T9{?(cy=&KS=L1n&;%bNe;p}xJFBcFRGqk8pnH89QC^`Os zhljnY{v?xwAX$mMA_YN!c>X#~XJ;gz@zXP;)^aq;W`~WX1BDh5kpNSXSJ@`DS-8ik z8dA&n9=urwUyc~LDdC@R3k0eqDH`_vcK&9Md!aaCZxI>Bs3(D(_!clV>00|^sgam0 zA`L@AS^ zDKl8Dpbi{t(tpoMYbKGdlmphH%(>OIKNID-Kp?Wl#g4{aOa+-B4$e9e*)IL8|B-g! zcA9Oe6qFM{Sh-)8G68h8iS#duGLy1W-$ee)*t$=}8vKz2uSw`H69*SC-NLm?H;n$2 zqQ^-o-G*J589v6va>qFt1uSXlwHSbK1E6OEhhT2Rj-~}ejx z*uwl3y6_h2ZHy#S?>mDte}?t(~w-iD#|3v;)fIwA6$`Z zQL25F_F`lVsM^VsQ1AZ%81=Hr(j`j}T&dSU^ONh;`Zd05_Eqw-Y`xT4BjxE z`JAp~9hIS)Q}%-r83ddmP8tqBNhwi28N>bIlob!!MAlUU4Q<2+{8|thP5v8r)VrvKY zSiThyl!OLSvL@-yW&BfCxyFyAzIkx(wWRzbZ!AK)bMNGSZ;~RlelQ2_v$2YCO*p@Ygow;HN>? zXee!}boHqHwIIQ|;AE^CJyE>wX^e&3i9)pVa#q7&NQfKocOZoGC#6(1fIIiObTV`j}{t%(M~-<~Gcvi;AfB0I;+1{)Iv zERiyL+LS3|&q&px*^)jP5SLXq{-RcuUL7Al;kmNDxh!1152%NUTqa6B13~ zAo$G2ef!R%H9*U@RdGsK;e3LfnF&&FpG!y(xeVt9vjCkFVg+hy1P>qXmJW{0M>UHm zxnhzuI#(JM>;dc@4yol(;`o7iy+@Thv~O>HdeV5B<^>D7{+-zU*Z1kE|44G}c$SQp zB9NhJChfiQ^SMm%ufi7dP2j@qVLFfK77aP@>ElO9`DFO(3fKQ^?nqsAcG0eT?-<5l znj{!DK0f4k9+YrQB6$B(B^_OJjo9W16BL>~!GKx_MeHTe4~8p1zQQZpV*kN(Kg4nW#cb z9*ws*A)FB|K(1Y$GDS31jNyb&lX^5ZVGCJWXsCHd%;^XI`iooVgk2>A34tqm3y!+? zpmy`H19L(do0;vPB2ai4G_tsT8(!yG^)=)q5`sY&O)D%lPg1tqM4`(-z_2FYPb+0J z(bYn;Sk9ty@bT>3l_}PYLiLMYzj`GeeJT|tQc_wl0Lh>Q--^jyjZl8RJ+Vc}OOI1m z(fcs^%aJ0J`S~8fqhLM=5I`I1xAZleUjqMmG+Hw~HcFWxAb}(@ATlI$MDG2*%#eYE z5T+nbEeQg<0_k=UUKv&uFiRus3vXV+92qtcGC;9u(q?fGiqIj@^1!nJ|Fh37*3YTD z)Kg*A{&t6-RbLupk=V-PkF7ehYqREk9<*ZD`qx`(+w?8^^?SR&`_ScH{BzIH!)(hX zE|Ki_sQrfTCyj1XZ&;_c882>TkKPxkW8OkxZ5-QY`w4@I1}#~>Y=duHizV;{d(N^; zw;&t;ty?Aef_+S&1VvObwZ@Mhk6s7pvbhM!@81{il>ah6OPx;LyN|9&`Z!`M?=5+E zcfLB%UKxN07j31`15KmpV2EOglIYj1ZIANgmU7f)PJ;%ZMss6RTi%Y?s2)7%xWUmN zn2XZxGtF!PAAvBqeDx~#%A~W3xei?t04V=LcpSY-d4wjGk$Bs-rf|lT?<9B^q%~s4 zK$$|b3%HE{gDg(#@2fNOND`n+-0)9uJ~Ot=UXlaN@}=JMAe2ik#>H`=hmi6pc?_z> zya(WJ7o`#R9Fd@~#N2`Wr< zecZ4Brt^6Sp+Hvbhs+9w2=suPvA6Q5pf+`U=9dTfRNbz^u7Ghmh2u=dV+EcC;2Kwv zY?xpgH1|Y@;;=!hn}Jm$vEb1U(+Mg;a7TbxCTYbsmBXBUw12=)*}g#~I`vgS=e0ZTa<6(l1eE5w8QZKuS} zt_Ms#xTZW?G#0!v!8HYvFE5vi_Q3a4#=T)-(#rsR&IYHk)XC?8i6$JoHjpJxkiGj2 zh#CPM&6bXhP3HH*{|Xg;qgx$1)aCT|s;kpbGZ}ib)!u&U9Z}s=SUv@X}_M_X! zW_JyFRz39NhF|7+DZ1u$eV@A5Ej1{qsoxQFi_KbIUDN7*b@nG|uXmbND>Tq>Q!cYp z)!gHMA^2VMxicj^G04dO{&MyJS^w323Zm;T4?WraNu;!r@c55IO~wv(p*d2j0nn*usU+1JA)?*N@ieD zU-xrkbfr3qz6|8Yd@62s3a1A+I$HYQadR|)oV2Kd{5-zGw*ZQxG|r?@Ba-h*S`WJQ zsne#_v(&dGGl|2VpC*GM=ZF}`uyIqkSUg*4v+21}17i3#=fiQYqud!x$L^%{1DO@` zhzy7H5uk`z&pP=!@@fZrR_vmjiPzS!5uB_{G!ji|cmMwVXGmADGO40>_@HlKp#CO} z`a;h@!EpBUY#Zs&lX;z)eFh`l26Grl*g&tS6u?cb+qwSP!ySr}Z&cnwxDS!I+>R$jC?{OkBQ6Cwr&+Fu{%YWdC zL6hnsX=k*vz(8Rrw+>1zq^}YaMMXXuMlz-d8!%_MXUz62Nop+0IaoYeFy8GEA}mq3 z5c}+Fb0#`^WW}9Cx*!@y5&dJu%L}K~3j8$#Mw3&SwO9GBr}s!;XpGht&*(W)IbcNu zjk^LAg(4-lCRn#=DErcOt9>X=bp=A4$Ezv+9@L@?tPm>| zM)}`Y0`-`hLS3@j8g4dmd~QwacI{GuJsCdsF~3vKP5SnI2aUxm!pd6@BCe3D2>{iD z(Qy8&m-t6Ck(QQNcggBTmPyu?A6hSRt81TT8m_ZmP=0+};m<_x=z`sIi@t~3=3cuV z61`x2@5Ne=YxVtZG*{m6#7kjEZQAvKbnhc`k1E9OsowcwL)}yb?E?oIxJDjrF}!#8 zgo(>!!xxpP0(GZGew=F3PE}E8rLeM+5)=iROtbXW&&W&=YJ=w_2^@sHRc|aNO^xXZ zcuQixPsR!9OQUg?#C)a>{P~o6E7zKG^ONsCR{r{hCJbSzCdAFrzaNplJaHoX+yA#4 zyg5f2+r>bWVEU%?w}M)7{VBF;MC^Gl?_i=~GyT3Mf}E61JUq_5y}`jCr32wHuxxRz z*4!{1V-PGHD7YT#b4>FZ>gpCq9-)G$Cd)}JBMio*e}An`eJC43eW385pb#-r2<sh0}0{=eGM?wlr4o`x_b!@0H*n;u|(Ws4G@Yw{wkgSRa3!8810)FD0uzsB)PJL4uteL z!pi28Kkf4pg)1?mE$RE8nCEPT3f8c+lY9 zOZ&f=Z|br#9TyK+v6@_BQp#Q40rqbZTY~2Z#R7Xrnz4e;;-EPeEWWO zl-=m*ucxnEdU~n)hnElUKiutb=hYgwmBVA2&-;7TiC(X-ue#@+^YP$^OPM{h-L@<^ zzG73a-p1XH%YL|Bs(WhXqpxu5;Ely&mz3|1G^`q-rcf8r&wQ4``Pap%S*d@x*thgs z(^bK8f8DP%D#w`#d+S$6D6p_H(|I-SM+DOpWTlh!OT@Jd^dd_@K?(>47sfRH8)Z2hGiRKQc*c`6#N33FO7>SaTwAH zOD-^CTuzh50Nnp(S5$!Ga*i=k2QipXt+>}gEA$UKZVoA{E60%FGU-uPDAwpCBClOL zgb-O;9D+w_{^=c$62wfjiqBO@Bz!|7aS0;n##6uiFlm+uP#IrTfE$Jp$3V|!Z@)8d zJfW3w7~6QlYd%Ito#0Z^qetuG#zc^U$n0}|`+(;F&naA4epIDLFQ*zabYXl}@3?~Bk9iX?) z1|*}BR~hF@1;KNxZy8Jzg|q;g*P3|_01E^sNv$s|_H_H2A=0e})#q+83xFKC%>yZh zPVf`VqI_aZaO4-h`4APRnUgJZ)%NWO*GF)8F(>={?F0(Q>q~tf#4RENZmf+d=VV}p zVe(K7e1K@0Mpx3P{~NJg3bB1>=+JupI|80mekr?$@>;8~(b~nY@$=Ac#5uYIt%)ez zY+2cV-tqFKe-`5Jk;*W+|K!(^TSu!${M_Cv(q(k-ms4NrDy&cZx-R>1`o#Bd-=^^E z1mBH!+ro}zTMVFaPOWJ0#`aRo>lEGmuz_!_<}R|BtMS@<$oKbE4RdF;s5i%MwpmH; zRzUp+&vQlr;BPtiLxE|+rZ8+~UDBGr7quP`wBE7$+83{$hrXP)VQ-QbFPd+hxusi% zR&PWP!!?9D0~U*%kAXn2c+3bAlnpozQz&^O5tvHp>;Xw`aS$jlhD31+CZdNE2_CbF z*Y}gN&>*GKAA)h_p@ZQ>1Zxti*H4Ks%hs@6z@8YjRD+(;ZAPLgKyo7qGhlKYy@P*! zK1X|zg*cf34dsKthv>=^B|otA}Pdm;+|mvWJTV)dsqEcJTMMY$5cmetgdo{Desx);U>6<$N`wjDU8q) z8v-)!fg_S=-*Qon(9-Z+$enQkiQk)Vgnv)sgc8XU6tD?GSRy3ox+t%h!VF<#s<{)A zK713)VS+($(OWnSq2g@5F40)$P~%GAy+wH5g{L#;@U7$qU8uU2&bDAwifJUGZU9I{sX z`4YXLq4*tE;GRTKh@FAw+^n5x3TxuoC6^BLn-ryQWMa)u?mrcU3%xsxSxTd?D3uz` zM&NbB_r@Ypc2CW?DlE9%kcnQCtfokE{2l94+XCG)fseT$X(ZU0edWn+^H5Q6>R=AUrZJN&eo<=;Wl+WGrb=0`nKVCT9SBgaC5wU#;CSpF0C= zW)P`$45(L@xFj4_m+thoJo%WU>K<2~u=ao?MOQR$US!c(WE#r}Wa2jjYW65#$Vfi@ z4#0~`=#;x(WgsPUZywbMwcD=CjZqzm8JF8DK#s?HqUJ-RQI_7mlYO{s`-B5vSp$-guVo!b;@_T;$5Xx zZ%0O$$4o{Qv&+XrE6QqaR_6GcR}`mJuMVs1P#0DgWtsQw-o&95t!i}59XKQMP{%OA zLK#aT?$gH-Z6;VSus|6XrUoi`tbcpHmWL-dVc|&xJ^^|M$7{i%o7F^gU5 z3Fe#3(_~+YQUvUdUEM|fJI9dG<#jNqZ<*juO^;Wnu>(|;*fFkt;sD;lI>S^0j4GLT zOviF5PYHarE6lG9ve<7V;SIG4U4SdE4&fYwf?W3swj{Q6MAn_o%0laQm@(7SaTCqyL#akV><F*fg0f8yXuC#LTnHNkwvinAWeUVpy|Fa!)u z+XAczVJ4?t!4(>537h#XV}^C5wqlbNB?+@!&e~5sL>ny4IahdaqWVOA=JpK0Bl%09 zBWT=Vjh_P6>M5~NPV=3AWhItAd{@7AzNLVJ(Hp}@Pea36= zkURgS1vq0JJ%R5?13JHH-K`RrfB)g-Rh_-3XiQ$$W)n}0`t(nP`Q(`C!PPZShfnA< z6(pG1QLI^fp%z*#>#i36im{$M;n+o*1d_I3c+E$TR(Ut?UESA#&dzhr!zM6dkDE00 z#~!c78$NeF-?(;#&61D3b6(b!*K9lQJxH}-b|0~ps^Zf2nzNU3tXsCs zY!h>A$oF;ou6_TJ_{&Uz7~M|=`~vKW12g z6GyPFa4)%}o-y`Hly=GDC)wF^TwPT`t8{mdn|7Y50lA&ufH6^piC7{)s3Gg+o4g8ecqttfhD86c{-AgW(iFUvVkw=A2Aye%Q*zg8 zjye=}ZkWU9V)Q)I@NkqxYe?Bjv~p{KzT7&5YUgc&>e z*!1pWYV>;)5>Z5t99|R~9i5&iKY*PH*eP%EeYn;Wxf+8Zn`Rh>RUty95)ed^?fdo( z27ea)DPU~L4^r%)jSlmrMHGTmUG5_qIB?3?23S{geU}4Ri3gabQZ89yeR7`a1mk>@ zyl!IDMz39K$`H<$6?F~rrB*i+O{&}c`;V{=b!NS*K6f3z;dB2N-X68D*4%mh^lR;w zN1;FFed*9DrcW*8pIqF{1YH^3r(IMJyAIZtmeu=1y*FHqd0lg2`M5VDezf^AbjhqI zwR@t?ue4QYSKPs)sy6q8`JW@*Mike5xmZ`=RQ`Bs+feJWG43A{r*u8{r^~hBqZh;| z)l~gTA6jkGAePAXR3>2{ZhCkQmpNb(jF6lT9Xv}m=DC3XZA}@;NDF4?yR(#KC7Jl7 zfZ$aD9T%N8YEG1Dryjd^t)ZDo`t$LH92NnJqXKfZJ98-`lm5S=Fg7{*p@55lh*ZRM z1xJ-I33?Ck4e>taQv??cCx88i8syaRYh%T|e*R6jcn^BrylGPmiCY<~fyk1bKOwcH zRhJZKMpa3ULX5@%`Aq;wuzqSk;YV_NBCrMCTS3ajK?o;=F!C&|KZz4uf}?}^8jgaW z0SiA5W{rNvO)fFY4C`r@!WtLNIvaVP;S`-0>C7CIN^#hLXhcLb;Ho|z6)Y&00l5iM zw5E6ocAy{zUA}BAJ;2$7pY zj;gDiqsm|pq}9<0vT67({Ma#H3}_>!ci`VaFan>?*(`TNV{u@rki%87NNTE9N)pd> zD*_a5<9Eh2hTLA24ijy$SkxXpDginGBasC|x#V9$BQ9Jdy%ZO&nDCsD(DaTOqBp2duY2EXehy?S+b)EsxFO)~e zertie^+@tZqS+yMlpp3nN*2{#Qa|yQ`Na%2cXK=UY%ii<8Yr~>0_A|7l8h_7Ekj&WmXpsTZmq;A?t`vlmXFEpE?BuMEbs+Qmx!a2 zH#Gyhijp21Z^3#@SSS~Lg*PD%01X;B_FbtPG{2JY&S@ki73w5;vLrJBnz7YLM(W7# z`A<18ss2@2>JoY9ZkVS+#s6dL&Eu(T-}T|!P)KEHB0?yYqLEUDXcii2GBs&3lZS3+>zOHjP&f_@F zy()F7I&|y~Lj2~GmQ3IHuKHcGVv!Cz@dwAiU5`^XZY$bvAdYK(YqnY2ZAb0??e2BQ zTBf5VQuEjz=fjHjfK@VRzL5XU?b}3Fk20N5Ua^mWx;q*OL=OyAObtK6Hjb=pu}Ae! zR>NYFMx4i!88hq1i~}Iuzfu6%qeeyw-g0<+9Z;o4!G`MKC1YO$c$7d8_OErSycbP? zkmuOdoJmty|Ifh)d?3Z@ta18{!!?F~>e9(DZ}2k+$w*}wj-enRJa^nKYfUItxdjAT|CrVwj%`N)a5(lIoIRP_ic#(VnOB+`-0PU=Bq9rb$ zk*RwS+NBLxH-Sq+R)Boz2w?(NCQSzN*>J%sCU8($8du91mk3~G_o%#dceOZ$~`VN z?oZu!O{;|N-Z9J?F%CJEfb&emoQ3PfW|iaF`Q{p;_=J^+9}CsfnnMLyiq&0l58a=9~P!$M1==V4GN#$rVL%oYOhwk%W7x{C4y4G zqu{q+`rP%~2)zvg99m0Tgs_$Rp{wFTQ#CbuCy;wOYM4!NuP}}N-i1u!reL&*owkA)n}TgY*6<*{65c&-j>g2V1q8R>u*6}=lBgxH02wiO zgOP)!9fBGvpi9ltSPV_dNXXZ2TZB8$M%@L4+EYk{q5B4dPh(^ne*`2R_?;K_jfT_` zLv|Ek11|qh>He+1uOnAe;%Z35L9WTYcl_rJ1ETTx&S_C7v;Srw7QaPBg{>UR;T+W& z72&L#m&Ljh&H487AlrJT$t&@T=pQW03(mz>OlI1c7`3 z{QprHBA21L!C(QKBHM9d2?$TtBEjJleH>wXV$UWHKB5uXGX$v^x?1qGzoOg4YI*q` zJI=TrLgPOxzPP;n=-urOlDiu7Poi!H+JjDbmqV(4$^~=togf0Bl}25Um0Or<3NslH zt(Z3l!JQh}0`UP%cdUHA2T=%Ex!Fe51qE~HXyFJ)8~_38Y4CG=b1_?o=-U%|De9W> zdcU|iFUu}rLXNLso@|I2GxX#D0wUkM@j<xW#b7lek$0lV# zOhEAkiRc4OK5nQ_?!oA?2O%N8N8ZTeDB_006P6&Ri@nwQ%)~zPe*&oWUKcS5pxYk! zh9GF*KO^>eX#KDT6KkYVY)pVG3@}fInDQvX!|)KqKOm71g)Bz6B&wmzX^;R~gEEGQ zzRsV=UQk#yEr4+jn7^>#$2H%C4HlU4?n+bLwoM$%%AsLFm?PsLd|(@xjR7Gu2;Z?B znH$*;m${I*5)nU`GQBJ)e?jYR?W?MdM=dF!yA!i9TiYy1xN&Q-iGXz}8JGq)+knUi%6IpqMxb5TX!vsPW zCiU;%x1#|U_RazW_8_#6ebG#-=&EKSgZflG!42i}&-Dzi?#H}p0l3uKTRF)<;& zW2n=R;K>F8#B^eLg_Mq{2l=Zf$~34#eiOI{ZIgCQGFo%&+SbAw1{D*O*O52(LNhYd z0gI8%y~h-=`ccXI@_#6ZK2@3EssP>rkCTuF;Y>u9Zi6)c4Qc%U%9(u;PkGE3`D`5o zDwtBuJX)F)E^oV2?|Ec@0PsMZ4F0o)5L`*0HFV6c zkhd`Hw}rzA3|7~Uzd%Kan*+cC7!_z45F3%;gN%w@&ms5&w4^{8zu`CaPk|c)3n{|M zK^ctG6kACa8~}{`a{cd8{9uGB7{%Ry(W~$%LcttYrN%oT%NiWJLfF!P#(|>}?Gt1| z_k?f!m}RV*d3<_zCErvp$6i@kpUZ|2gFewu?b=JAy_LYhQUQ3 zZ71J6vHNd0gjNc>I-rjPx5g5R4-o%DQ3jhIk9+fpc7h0dh^HCSGDesk2wVX6pc9e( zxe;XaJ*Q8#x08ikN8Uhxcn%&PxHYWqZeOq%L4pNc3OMBMc3lhOWNg1{F;7Q1f{Y-B z4MGs3;bf8gM^ZPObBOjwR@Muj)DFgBIFTiwrx6u}FL6C61XSsX?1Hj}3>9E^OF)5+ zFekFv8ss3%&d&W)SY3AyS{Z~RgiuntkU;@lu!HpBJ{)=kV_!1CT=~cr5Ii!ZxBYHl zMu=NPMuZ{+Uj(%;#xq!j@C07OC;-4tLb(SHzXe)R)Dm~^9mZ}zV9rEz4)?Xd8(;91 zmcIt{Mz(+w`a1R){fAe#aOZj#m+0lH*kUirord`#VQAr%5t_9;cF0JcNV~oc@^4HB zxcRwW7q12h`3{QF!+Q8>gaw8#itga2VOH{kpK5k~?I7G1pf8zw&93R7TE!zk{i|A*fkvC7VG|{N9PavlqJm=^q`l6@Bxn0 z&_uVix078;s3$G}lmr!<>~WxA2$>7ebGKkBM*Qe?2}lKzC*T+aKhql}sDf^Rc>_O} z9JITbLlEtHjG)%I1b_$}e^MPGOChi#l99QSY#<)8=aDzRu!-Rp0Ditbih3ZR6AAKK zlk_L}S%+=QxV|>WR+HV)gq*$q3kHKk@c<4W28qOH8sVCdieTA*-U~%3yt)>_WrZ-y zL|0;QGEvTARs+$l2=?vI>0FVm0=YhdNQK>Qvp@5xZ*oOm2?h9%NjO;N4 zApL1_lZ)=!2LKTX(1vjwSyP|sK810zhbR6aKC<@um+|o>n6F`s%f!I|WAv4N*a7Gg zz#{^n23DmHz9+&Cv2e#y`^B|{FOTqy#7|s95Pir35O6|?H4U*ik!JVvL5)nrUl7?q z-$Pb#t}((fCzA#M(M=vxmVjPKh(wow??=4Hu*5!65mg1*A4)pqO+zpSg`^eF46JcN z-U62e^&kQWF_}+E5d%)xGMlsrz#cB4-va~(MH~3gUSKzn=5tvWA~$Ls{5aC$BZ_3X zqpHd&D-#hjE+V-JwF=-G+;H%|^>8AP4#}4x8(3x?Gtx_hm?pdkk1xB|7XA&0bQpju zsAz&Y0%#HYrU=Oymkt&jcbSjTc>*ro9rPW1D^w&nD&8UA0P#V;#mvd^#^eU|Lk>tm zdCIg2T|9u3pfr;@1ETP)C&=%GI=bc0pVhAgP(L6M!NUspnhXez@H7@c?EuyTwuH&U z!x*g2BPUPh{iGf@F(!;Wm_E1pWk&%NeEgH+)Siw z6yu28yTy)R8>;YCe+*r_tLp0&-&P?x6Ap;U`(iza^c6775)ir;#;inb2r%G(7t47J znjxReu0>Jz{r%D0cohaKan8>%C~tig;HR-=ay<@Xpk}~yGH)j5`=M8g8ljV_OFl8A zt(8xIqm6E%_qXkbNBn?acs#vU}#wNI{4~7emqv<3POlD)uyyCj42>uCAJr!U*mD$ zSKPrU7D!7gf)7#C!-5B>Fa_KLA$)o2Nig7XAy8{^_op?__#^N`;EUCqBuHQzZUh-5 z0Q{8;+(#w{m_L&%L7awyO{G3tKGSedy=$k5xru20>!3QkdsOh*g(qYK0o4=Y=E+RA zFRvqa@7;@Gw zX08>O^hEdra;(TGpmMa)<_JBQmw*$`1ihJ<6rnH%FbJFs4@SFm7U<(z5a^cd7@7-v z#iDg#)k7#Tu&1Yeq}ntFydj{CU=Pp_Q$K&K2JIJWO#}u~VFAu3J(R{ci)SDMe}-0r zXij(e!WoeuE}&enkw^ee&U3U3A!YJbChA`uq*&G>d>)cyjqZ| zQJ6lG{JHi8u=eu^vLH<+pbf{7AbbHd9b9G@W&oOiJP8zRG#>##49c#kfT5?UDNP4J zjPVElW|4ykcHZF$F60B%2{6PH!0W;s0QX$c8hxo9NV1X0kW6Ulht;ycfGomPfo#)2!yBsZx|mJ`+IZ@~{4hL0SWHAUj`|drfRJVYD&S$l z-4?s#0#ISyD@X>D4bmr+0a>S||KFfBht}Umb2%8Ma$G`E@}Rr>j6o7-dSI2(n#aWG z2%GOJE+6Ftq_a6?1EU`=q-R_cr@B?F76#1BRI{Dh?$b{0`@jfJ;Y7^)gR_>L0(b|M zL$t5EyFzwte3n#QTB_yhn)bR06&j?EC3qHac#sv=u{cVAk=C}hTX#vVg`&s~;?F=f z)`cMkF04WY6Gmp-fSL*2-^NA@Pyi-eU|SMu+UwV^&3?Yv-_w*4LTH!>zN8EVIttcP zE}XkiiV`ncoHXbb;cn3`Zv zM~8y~YSgbFdg2>lYC`sQ6F?2DO3*@3O%awBf)k2!)I?llSt2JqyhSx9YaN%$UaciTKKncC&kEzKMVF!5-5JN32ZTfq)r3@#Q3g+ z#!kFZf*OvjFocT_U>)#U@Fh2*AKP?{)P8=X~2y{f>AH(-W37q3aJSs41#Bss1 z_BkX8kN^-gc$6sW(cCaGZ@%m2Cy&&L>ql0XlNChn*nD>vu?hVaj?sA#ezdE z8yW)W4&j`0763sUF+GJ^8ZK3L|36LiPOgn6m#5A5?#-h;5$Qj=mn3d^>HQi|K2OCQ z@?>Z79CH4!95exXH-|Fe+A=%plU((XtccPt9u5;DfwG5L`b zJ)gdL!v@=g;-_Zl;Q$&S@Wl~HmibJ!|(mQrn2`Ihoz4_MnZybo> zZQt&v4}6o*j*Q-J4tVtuHZV{Runq&hsG7+TxLM4R$n-th6jd1|MYavMy02W5n#QF_z3_VlOeAKgw=sCajmyLA ziv$9YN+^8fT{)iJbx%?FLK$)oPzoyC642tw9z0OW0Og|fBy4#IVqpkzIPj;y&rfw_ z=XV)9xS>DClng(E7mx*Z@OcB;)eH>^!r)hW!ODZ!v;b+^E?i;|wlOu~pZ_|pm2}Ib zXTf8G;}BF0fuW&A_*BG}YxnrSi%JIv0qIA80tIA?L=aLiXioR@fEM%%{h)RZK$%=1 zXS_8Kh7DoxgG-EFA*-lpF0ve%c%ewz`yV;KZ0=y5zJeNr!{7H|LQl4_Ajbi0L)Afq zX~fZ>re=KggUXZZ)wXUWgI~#g&?`VXNF2w3`2|+JU2p)>UW{BYbLR)5MywTqzrdMh z57=GUWeU-(D6}x3E`rEFoO*z%;DV4|AJ^YNV27imo^ez=S`w53k#KzjPae5(A2fG6 zD)2oqejy%~#IX=UV!G9T)(jx93x-di%K9%p5IQkrN;E=|k&zUr8jva7fX62AITZNB zlydP5S@(&?iFlp#_mkck3ln@!I2oUxM5hJ|S+YMD*#!F`6(6cRdh`gs9Rv^Vs7EW0 zuEHGSOjuW;Y)2938~GA|P>bq(7;5<^CML3CyX#sBIPiA>;{o_il2d~DU<)z<=_>J^ zA!My8Kffvp?`$=Mm>)K*faFSzDWrOn{NyMdHi}Pkp$( zV4Wf%O(8&lZI1Sl0<;>54O@WhiNBZ@790ES?*r59;7Xl0$4I9I9u=`AxK*kQfD&{S zAbPlA@%=|UKx9OM12BZ1mz)4xwY4WddZRSA1NMMfAR)~@TB#?>VgU0Zc?UWGAP`Zr zVy>#f(S*1TX2pWwaDmh-^~na*4NSoIrEkK8!=g?+U?L5LH7HtILY|S5@&{W4mx8DY zQS^)SKb%b7T!06&JQX%AnChWnY1L`2t2+Ry8={18{0LbWfw>8SNG2@n5j%;v9c?6- zZ-66_FPPwdV3vlBPKt4!ATr|9FZN#!$PO%8d{tOYW#h9Tw6<(8fzdMHIb1)&_C||D zMhS2RN2P>H2OfZ0h(`z@DQRiM*%}+HK>5IXT@RQXNgsppozD;PZ{G>tyA;d|N}T_G zu3is!ZL~M&d5KnH=LUj=AAi^M8K16HKUGN4mUB>Eqyoq8|-hR;8VqXqEF3KaY zOIuKhdu=2ZH@Kn1G75{w(cfSoPRJw>RACn>QV_;KFnve64;{dAcmZK%iQkJ@gP!~F zi4)&n?0*E5&m06O+yPkVljT^b*%4fp2kwJm#uhvazm{e(_Wl3*pOOF?=irh^j>PR= zDl)deZ^sQ`U3>dyeT~s$WpXak>ayDveRso%rT6#kHR~T#y;>QnzJvXhhxxW77$d&T z`oBZlNwt37``&kcJdlO!Es8(I%;&0ANPNJ?pzc&C7%!M9;r+o?>%dN!bh!x^XGW{ZAe z(Hjq93;NU|TtuNB;ejwj^z~n*q@37#2yvc3O~k<#dhqI1HR`Y4wZJSQ@X+ns_%g_Os70V^6avLS zp)MJO%1C5q+(1&q0@dCvh!}SA?o;aDy65a!gvl3R=z;45W)?Vei-w|JzPyF{ncX-3RLnu^9VRSyO!s1-OnQ zn2=QvP{pF+A&+v5AIT9-2vPV7>VQy(`V|z4CGfRR`I%a!rMeLGNw&36~Sl+1bMt>v-`~aCs0>ze0wA=aCDR95lC}LhqWY z2jLu@JM0ODRvE=s0;ECdK{m>P-H%&)7A$9AW8-g$TnD%eFl;P&(M7!p%HlVS`%&VT!qh`! z$^XxN7dIC_$4CEDo?l#`y+~|dNwasAV&*t^V;fsaD)fuPk^FtFC2LE&P%n|ZuaaMEg=@vw2P(;V<3+6+9K>=3Q zhyqMPNt*|3g!jqzZQFbfd_@i>YAKYgcxps_oNx&xA2H*^N+F`{2CRyh4>vDNs}{09 z0a9tfy;_dMkJo{-MP?DGsELInDgh9SVDxf(oQYV+eK+Yj%5vdpJR1S)HV{#L@*FJ> z828NJUD~LW)>bwGjl;Qlo+&LUNyyCSFI-5#5|F@(*M_m=*FDFk=}>b3wg^OlNbr!& zpgzVihAH}fTs?HWFF=dH^pJcjxQ`&cMI|N@i)R7&Qejq&DJUu2KP|&d>qLspa+E!8 z$nz+s2eJi~fg}_n5D{}GEF{Im7nEIeNl|bQ1W($`((*ns4?^%j#|Vq}3_ ziozUGU1YiqTy4UUKy&WBoepjsT1%+%iCYb%BD>J6;})a4B=miLQ;V<in`OiWW?iIuPq8c%K{XA|f4MF7Bv>;iS* zW)+o<(78!v7I@F3M8~&Y(Yl z9fHEDRs3-8LccE@f_@68|fB zINOxv{SR-PkWca$3G*9ChoVpDbCrL4Mo7_pZnnHoha;l9Dn7pG!5 zz^%Xa$(zixc~P+vmL2GpL}!n#ZNZWy3O}V`IfVazNz=E~X3L8gXKNik9JqCPbyd|* zXwgv~z`#*d%L7y;5H`pR9#m4)4H)DCKp`3yRHVRg3C{(22{0OJU$QX*oh&)`xaFDC zgSst>FdxBKl2BJc--RjsUR*(Z0c~%4(5=X93I2m0itOQ&jGh4~66t}%)m?!K3QI9i z_5(GE!)P;#=! z7EuKd4^eso$|o8o?$wPuP^QSKshxUZc;$2ShTjOI1T}zsA2W6@@DK3^1k(fx0=Wzk z5id#>Sg?}+&^ENfD9y5a`@m%&_Z$#4SxCRG6$4x1Ew7-!_aBdYUQ-8nmZNqCJdcl* z{jCp@9Q65^Nk9UlNhHf+Vh;iXccSG0ok@1{=6`VQAO?jZorU|``Zu|mEVn>o0)x5H ze`1Mh1Q8wo6$>^zC|C%Q0Sy>2;6ZV#ZBL>RP=J3muf*z{SSRJ=@P0mZAHzU&4@mA& zN8S+DB3ZWs$j4yd4)*CiF}vvGnvVth|Z352wx*R(NQ{;z%0+4r&Nc`gQ8=%*q4{*CsCaAgE9 zW3s3%8%StA0C(ZxhRX^(`Fnmowp4%uxYxxcmA{90YXbBI)=Zd`sGTJb?<9sv7z$%} zr{aN5H4mu@LtrAQx*DHBV0zwW=l`V>F`3>TW;4l|;L&RTeD%b$khb36-zH*>xKa)u zUop*g9F}QpG3y%s(^Jo&4GXZZQ>B(&OBf&Ts)NFekax5`D16zkE+!V-iZeTMA&K5)!0ka>hngibjl@sO!0ry1JDi=YEHvEv(4V5)(7Pn2?)7We&xz2I938l1w#YA z4Y>apd}L(~D1Ssv0CnE;~r!U&&mNWoRaT$C7xVEYFqQ$SgeL@+R60*NPEz+i`f zyA8Dr(iXwYp(4RB038R|H1lw9P+3FT)H=cqWIO@%9bj`g_-e3mU369sO$f3qej8+$ zbi8{)Q1_w8vS%>EY9Yqp)0L;xcSU2rJdO^*BD}*HR6*FVv{R5g>Hs-F7 z+;IK7sv2YdbSK~__`0{j!6dZ;@ReGO+tA~@h>0PSZ{&H*GeEq6ZVp#=9`S$x`hqbT z3VdE>JE-Px_(lGz3`QO!$|<}$Qe%^96X^6A(7x9b(gw!n_<|51-UNva?DvDt&R_cV ztDVnd_(7CX@wAz%A|sh_ZX-X0u%!{MM+)cjXWHrY{I?hx(N6P z)c|tLQ44|HQNSp*U9fZXDI zaQUtLq2V$81QU9E>U@MFRQZ@S+k*p7NJi-CKouOdr3pE!@(%I4NW~-@8{r3 zfOUew&Pxou@hR;A@dSRnim!I&IyittwfcX9a%^!~7ANHPM&kkVzUaM0p=v>4d_vr; z-<{v@DQ8l`Asp}qx_TS9g!yhVs;N#D4tj5!=(qF59NBN;zj!8Q`xhD&=A7$K=3&C( zEMpwS5oQ5o7!ggq#>=A*_zdxTC(VeMK!{LJT6JmvuCs_-<99)0xT4#eHr zh)Xz{&?_kILib_SknVgm^pm5)RZuiRHvF(nP(XmlGN)UYFo?PiF4-W`0#Cwk+z4hn z1}(UZi+!VuXIlfN*FNzXeLVVnkjCVY?dbm?pd%F!3nV}u*jPY3yD_K0A4BDfjfTPd z7})hg*2Q321J@KZyDWSm#PFl1POWJLVYD0&iio6^&-u-V-~~M&`x5SDA0x1rhkz?L>5Hc_e{EqU2^urj8qpCwi0?R^J_B?`N{u(97+b_T@AK=qH zm5-nR5FrsfwL!B*^211wY%#;bhvjl$8%kT0#CPvK2K9{i&@Ery@+Makqe`+wyurT2 z7LMfzQJ`XyLj*cEA3iWb4IBqZ-3+%;z|)AHtw6*O^EN?G4ya^zWh=rt)Ju0iRdj^A z`eO!93d(mQP-tNKfF}r#j32k>NsxKm`}gxu`{HV2PL%NaSQQ>Gwu~UQMGR`G0Ih*n zDF7OL2&4yMo>e4=Ocz)&2NRH0**CBltOx*%AHFBVK={ru3u7XN5+DUji*cu|!djc*)e@WFBUpP?;L9_;Q(_BI2beT&ED0_&} z4>A`@aG7_*4qoZVrOUOCf^iJTUxXAghX*+b!2l{t?&zSu0BsP>$fk0ifPg%pB|zti z!GPco6d=d%PPG1xSAj0nB{4|IJ)$ZO)?K(s$lMD2Mf}Sju;KZmz&cA-~T3x!YvZ4EK_aE~P|FzCE&VAER*y=QY{wEC0x4BT{ zATQ~5a{y0n0tVm+Z7n!}=rFOIK(;3v)!nVvYawvLqdEL10j|x+nZ&079p(qCMl~>e z5kGM}z#{mH#vC#39IU-bDTOV=nEjv%i2-1VLJ^=VJf^Tpy#;=bhOtC62=2gRD2L2{ zyflo(-*w=mA^$xL4#p<+&4fBN=m6mzG*p20qM#wd^GAh%9I*$x_plQsXAcT5RGIqx z<2)3~{Y-w9|A`Fo_Wy&?e6*``29&6Qq@oi2MVe zfrulpXA!3!PX?1&vS^{zCI9?J)IGD}D7Is8pivu(gYqwI2L$X zf+k&H$YFqP0bgTOH-s;SCqQ(C8B${x( zjV_!c{56Vq=Y>78k#h^S>J-^8;t$T+I`;PK)}eE0L+cMeEo=BLY?dyo#xJX;MP-@$ z9N0J4d_S-Do)tacWw*<(ebX%67?YZMq|vz1xH71;xnyX#{IsLHzN128pKGzJ{<5uf z5xG4qtQ6S^1l1PF%HhvXvS6K*&6uy=)Nr3<{kylgJKh#1a?T_U+#v*n9{6 zJThz6%n4I-%*LOWrP!V$5;@W;o!LGO*HmJ(17FgwuMbD}gK-oEV|=^)*zJ11;gxIe z7d|2yAwxp~sl=6G*814!n6OSK*#!VbvfA|?vbUJ16ZwGt?m^)FfSCgrLF8N2 zq}WEMe>~{m@M&68e9@v?1mD4b27|V52vnuX`sN#q^`2Vq9}diwf6?q+il@rKTyLwK8WcC$77V z&6uY%E^S~>l$7*0j@=pf^;+St028jU;b1(81LnSkmU_CHHnT*2e>P^g8*o8CT`J?I zP1QI5dd48R2q5n_JZ(r~W#gN$)5Qnl5{$MNfuN@Y{?e&rtNR!eM?xNa1ME5Mpz}wS z2O`dVJh<#~1I_!0C52x0}Gn%1>9T=cAVT2IA?j{U`4)-I9&JfG*n~ZRK>E zH0Oarf?pM1g8{~< z#&6FR_X6)&5=(H|7N;R(0t74<4^>f2ge+Q5@{8bL?~PHSppg2o@Z{)UU+6={P*IZj zh&dlAg(07g{P;W9GTmLBFFE6~5=-ZPCXdi}of<#^I?;RXe>k5n+S8b}1S>m&($xr^1#6(_ zs90c~)ryBc7;J;2i*Zx}{^7xAn+4#i{T0;?@y8;HD+Gs2P3hYRch33sFy!Jv!5_LS z-YftH`2nB~GM_m{q++U8p>Dsw!LjB!ij^9e9boL;U#cVY9QltNSMtW;ZnXfdgbv=Z z4gRda;#>nzwp52dUchUd|7h%g_-iaODQPi!kHM2$5#T+DK}oaQ(0#Y6f<5<_nxkPH zteuNPaTk^8Kf%Fmurty@>>U7s8tc~tah!6=-F2HD$QvvW$7?To4ah79tU$78d#>1e ztzHq7ckEjbs!I@6FQ%>So3=d;3TpA>lhOjL^zR;M36+B;0crT;IL40))p}FAm57-j z$ur0|WzTi^h^Gn)_uxWxz!Kz9f#k@%nAn0dj}WE<`473tccfhS*PZ%A+UwGHCpW=~ zMZ~GmaR~~O0UBqFRs;ML2dFgB!hoovladU3k1w{oQuR(8;O8B*P*DGf;BoE-fx~6A z#|Pml%9PVP$!sciUR*2Ea;{biY=zB@jdQNF4TY z?91JN+39dk?NO7rN`T|h#bEn`JU+~ZOQkZHBId`Q!P{(MW!)T{qx?UiBd?FaqH$&n zqB-W=l9bYJ!JR=Tr2>QyRbI;gvBJ8A|ceZSJz%sA*#P@v{UU{f(i=@17RMHR&0VV7F=uW z=J|>NF6i!Z@i8c=eH+vMI_g0=#BFAJFAg9#o_oNVJbnrYK4HC(>MkbS<$%VPQEX

    j3)*X1YSBlCJr{FsVh8Go*?8P1d-b8}2NFj3d}pcGqnhdZ~0I z0wO~pN+8^Y7Tm8Vs@78BZiD+#lz(^pOhIa+82^~uoXwYi@}geD>kD+%qQ2`CpVj+= zm`IFtagKK*S-AZ!MNQU9D9fbpL7)QxpBoe!swbwWx9YtF>?C|p5$8{(<57{lEz_gP z49AH!v`j0>34yW*B@@?&h-V%+nPhT=fDHyR9?eZ0nF7t?IzS^EY!=K?B#BI%40VXt3>wZ>OucikIPxY0(2G$NJY-N#5P)HJ zC{5YmS;B}{4&}m~`OCBsG};-*6B_X}N|6Ey)m_8Y0+Jc%Anxsza^^*1c-(x|Q_N6l z%^Gb41fpUk)2B-fDH}*O3^pU_gFtGiS$I zS3I85B+JtX85FSLTxh?4N&m(e2ID^2?b{`g_;(}Hr(XX{jK0r;*?p zO}OFj^iUqdu}965*Pga3-GFea0H)jrm8zhxg~T$T?h_7!#4CwMXa^mM1so(fd@3TP z0|Gq|%$S}sHXeZSDkknYQKfH> zE0Q;YfnFA1({{BoM7xQ?9V#k@CX7_nUE?@%ziN9_Lgo<%6pV`eh@AnF+v924`y?Ou7&ECxZoiL z!D;B<1@3V25Jy-04K=k7!Ub_L5>sa-lF9gSIUirl0yc-Z5LeN+MoTHnHq}*6%7UYH%Nqj z)e)gk6yockk9E$oI#Obh0*45X$zvf2?&Aerpysmyf7%IEqEdz!!4nD^;tGm;(per8 zu%m1>ZacnO4Mynrr9Ar|egJ@pddJWtF%8q!!PRBk9lN}V7M{eF$+5lwWPpF)U?G1_ z&X$lLw{Zbe{_E&{eHz>ymX6&_G=l1u$3qX!{tTveD?0@J@+-#6JQcysl zv-8As(+rPdD;yw*ln@jm>1ApTOa^Dhn*11qNIcFQ)JY`mlW-C4Hrg2-(2CrKl^sFV z0s8nD(1nQWXxgEpA=>tiO_Io_G$jl zMHXa_HTQf=)N$cuO?3nmy>q)V=I3~|idkKFJKHj;uN;3QndZ9Z{4QQuIoS_Zf0w>H zoi@8QbJDhbNP_+O$HkkxbH%Dm2V(|qbtl(yT=Odt*D0C3EE|oIGT>|quY89=P1wnI_O+J<1+Ka z^TF)RrU6>hNAwo{{_$g^Z{%jozNGKIk0+n<3TtaG5}Dq+H`%nu^0XZG0Nrp&+pae4 zAZ793u}VYxmqm(oXNNn>Z%=+2eHy{|cIb|R$-WR-F6QmlN~`4BL+PiQlxlpmLR6B2 z`O2Ms7a3%9#%NZ|v=s0uaH=#GIQO3J<4s&Qyg+;3U0E;A(HQ?2*ZQherVb8Mxd$Tn zzg@i&&a<9N(QvKS`4<~11x`&JTe&POHTS??kFDn!a#+Ij&-0pGVrRUCqxkY~e{D_D%MLS4%H`j+zUgzfaedM7bpKbU z8F)m6$8Bkq;dYb}VDeT}P|6I+MGvftLwy}b-vphQd*ht`o^Sq( zZqap3f!oDVXy&_T$-XX2m1AnIQ^wr1kUcx%ZybEePsQcawZax&vXrwvoiexeNlt>) znp&gedGoO$;^3coumLMwbf(OJ_Ilh{l>V$s@%5Wb(I*$QR=PN5=wxoc`17D^sp%8G zx!;G!kH}4DJmQNy9lUjd{UZP9dTT4C>%j}7oCfJGe-*rit+#q{o)%0cYm1hqI)+$c zFgVYv?I3NWO(}~eN4Nh*Kj;=xiLR0YOv|M_!ciUN?^t_#PV?^UdgyyPpW&f*((s@{ zq*Gsxq~dfh|KsM_=STXgg>LQM{aBI_#P-mOx#*Y{tH?gAv3&1L=wnlTY9(h>^^*Nw ziHRi53+vCV{ILtpLQYNW5br^u_U6^YT`qSvEk9)b?>oQI^~a*U-n!V>+d$JqR->!H( z-!qzzll1C`ZF|>>iBleRcM4>KEmyoL*7*F8yXKl*{jQ(3oeql(txnx}%fpv&!8&0_ zfk^#|`HNh;{i#(qBT{PgQ|n{TUu4(4o1**UotmNjXH!*49u--D4U)5>MhMF^e&4reMh=I zuR!yYrpi^to|0|7v5zRZY1wf$TPtX~CPrF0>!^VycD^OGyorej>WjT;L+;YdU6~Wk zjionD)n9vY{`l9ore-mOE{?I&Q1_RgNI1(y7x1T+ajoEbmPLEh=5>S;T<Z*~>oApiA+TFq;R+&mjH12LnR+w*`@uKBjE=wx^ z#P#zpmEsv$MtE3jshakS5wiRn3mI>}K3hxqmuyR6AD_6IsK2Nt_>bQgF2B&$XVk2= zaV}P^X^aIIX)wEb%6r=Q=yArqS-HMjI-RYPBc*Wa$baSGxs4gd962XiJj~u3)Dc~U=bpbD zb+`NHtiM*teDwvasnRz*ss0;OQhg=gNgwg!9rxN;+n+C3Q}2>`K;!mXp5p4*fGvj% z+v9&sYUcfIqXv&+>f)jW1vSaoROA)sWm2=$hfa zvv)?h=#7%LXPD>C7|WeP?A`H0k;TklzP|yxW2ELiZhE=wrW()b zrifc8D`&48uU2E5oqcIqI3r*(>a01)&wM##WbBgKkvZb8Yn=XZ?VcY`ggpLH;M{x0 z85FYM=GkI6y}GFU+CCXJl1Tm|>)k(Q$X$qj@>qJ5;V^REsZybyBH@P<}FgkB@ zM$}67zI=wr%$+2y_ulNW5wI#W)AO2jJ~O07t2Jw8%#T&N^<7WXy{{}2=d9|MVQsIa zv0|pL+t)HJiN{<;a`l8Nb*YLoRq%HD^GUg%QY9i>rFaZ9N=&3bd}b`VV)hGlsTYf> z1rI4n(~!?yk(-3)UhhksR40C2dwBn-f0!J9KP=HcpD%QUQq=GT1c;(%YDedL%OV-TWJryrFQeyFP}F{kyG-{#yWXL#wu=(j}`aygg>uY+PXixX%DH`-&Dl~ z&$c>uQA#U(L8R(n z`r5-$3gb&kemGt0HV{1|jZjb)t?V+M@k7AoTAM+CpVqtSO~0BJ=IFZ#$laNi)MBY~ zPW9wT{RpI|>^tYm{`_QWY+~y%N8ymstwy|qcW#SLKfU$w_nC4AGeC$C2o@@ zSn+;zf#tBDTZO_C-Up{e46+!VGfVcrr8e>XYG{ zuR18FFOKRkHG5^xX;B|cn8(#$7FaS}XP`5OU1Srm&vl1F;`Rs0C5Nx`?(Gk|nAG@r znPEELzaMgFiL%8^YlwA!Zs{F+wu$T42h3)_bHNL!3js-kNog;YE4e-t{tUn6EXHFY z{$Q|&$?YgA{Mz)(r{BE~wSRHhiTe-sq;oq8TYZkW6n$dy!}9x9o5xp(3vh*IaGJbm zB2(PO^33YP^vR9fkvUVL6tCnok5)&Vu}q~}Fne?Km}yh;m4z~58Jq)ZPJdg6t`75R z@toE#taI^ryn5&B$}9ylr+eW}W%CuUutzfa_+}qCX`EE|Yjg|SwfkMSa_C4}23wLw zl1+O~|5#zc$0M?`(`&X5<#K$jGqbGYOmde{eqvnfyA$IR=e{=iojEdprQTECNGr4W zJ>3afhbJpNKQG->)sS3gz`xuudM;aig@DUzWjU&NP}*#`Gp2v^G*6=fS8LLmalXZ1 zeEluFwPtK=u#huv%dNsHxk;hKb{|Go=Zw*UxiNOyAL83Jo46xA*Tr1$xq3nL!$z9r z}k|J+Gd+_VvkrkGkaI4~w|@i-Z`i zKa(wM&2-fJ7g*vy`}CZ7n6lG7cfMb!B3^`^dUeM2nV6rN!h}ob&Z!;T2|@{)BWtt* zUd;Q-7_5$_ofSp7Jj=|gk0F!lx;=O*%Z8izBqsb}Fy$_9DVEv5a{sl{fci8t{Z8^d z%k&JNsAShXW`!ps(1+IGEY&p? zW1OPjpG>o!U&KWZyd2Q+uE;cGi{*J;)+^56(ceov*>@|y+8e4TtQ341mqnBDVUh@* ztsJ-a#Wsb8SNFw&+MR{;|8)Xt%BYXOe#1p*G|nWXvQ416q^DCKB_!aMEnEn^$U-ZZ?Xx@L)oje^5=995;A+ zcR^kN4@1mzwEWzeQCl}-4NB&fyX(86u!vby#**Uq<%7RzrcSw?Qd`jYmS?G;Yf3)D4$;J~J#P8R5*W;4i(msHB|UpB(hiW>C(Qh(;-z?a{WV- zP-|V6!@ScjMzgNG?%<+&R%{>rxJ*@@WA{TdeXU4Ws^9T zx^afw6$cV?0>`J8+AoRizaW0d)Jxg1zt1XUjYDy*`j@qecK61p(j|y7D@!gI3Y`n1W*3*AP7l>Su3Cp~v-cA{8E`>*~(o7vkw?!dRc$GLMpn@eVv>S4b< zN&!ABnhQW!<<(`MrD*}p5{9F6*H}wc=bu+~_}N@zD^7WDzVy$2dW_|CBh6i$%O;$M zIVJA#_lCyFCpFS^wG~?2BO4>LUgsM{2-NfpQT#jB@pP@Gj(oHmse2dbpK9;euh|wr zdzc(D5TmJmEz$L(y70UF43!sO=U$pU%Vp-`Aw$E*L7@Cb57V55nLGOycmR?QXp7og z^TRSjOoTqQiBIN1TXlBzHp+AI^qwt+6TNrVIBO3gg0HX4<7GZ_{WTf1O)(F!D^B2R3F^_WPt3JdBw^Er>kXKfoSCM1wHC)JAns6862Lt z;0x`mr(JkVFFfe$O;Yun%bW@0Vf77MZ7GpNWIoFqIb`f)-aj$KoEXvw;&j>uoMCLV zAUW`Rn6d&_o<;bFU@kqI;K#bF!%N z+=$zHPu~AG7r-mNU|P-K;mRqYKHF{K=$?Xtx8LHGkWDyzEmn1W=|oQ3wk{DW@94?T zN0hx+7;q&SFdO#^_V@i1cpVgKtJU|#XB+*xz+KI(h}2?J9~TdL@_y!7%bB8H{|hSW z!>LnhTql%Wnt9#_(LPCyU6@Z-&g&C&>7aPKmdH^w&zW6jL#Yls3twNHtbbF!&T!=9 z)9sqN|BOl+1@Y!*u)hqc$8*2%h_rW|O4q$G<36Tj{EI0`&6m>j7d^hZD74ywT;k5k z8Kqx{f0>K#O4(Wy;Ja7MEtTg+mxpV9K+58~B3#xlwpIy-WV)@UTxU3K)WygD$mAyI zZJ_5ZlH;Y@<~0kyHpsHLd&K%7rR2O+?JmsrG1-5=ygt6er0Rx~VXNcV&J;Y% zhVnjs_UFf3i{yBYn~biQcAlbo1bfvubnA$n0SZzjhxw*X?e|o+r;5}(GVCe8{^rUp z`bs>5U&1s}+nJf=%T7$>uc;oQ98%@@y1V^{-;|x1)yW!Ys~OE@lyb`UQWR&RD|V3g z3{xspQP+Wr#B;PONm}Ll2M;rSI_>hH`-at366|r!#+Ebf9p%eLS<`Q(Jk3kC8*zy~ z^2$Jj9It&R$@H+>DX(nm|M?!BHaXa?v_hMnkcWzWBuIw2csQUD!x|%;zsoqb~NV(-! z%jkkL;cBj;i|#N+CR53IuID)p>t z`Frx!WX8GX-tlK^nc=*UFOkN$aZp4uO+5uXmQKz|7>M)nWpb-r4-1Ihv*!} zG7)SaHHtIgW}TUc>0)vPpL<`ER?_}ic6@LJb*i0TW4CDkuOi275qccw$NZDC42sVL zZ;F~xd#9GUQgOhgFLaJ7myHaU*rDXA=ITeZu&Yly?S&P%IV+@VyaH98sXE zmJ0MQq4}E%e}5W&zh6<{{6d);Z=O-JQx(lTqZ=hR3>fk@gL0#^GuiH>zGoUM*=Q`S zbfEb9xSP)MPwNZf=d))SGzv8Y&pGI-JEga3_If0iO}ahG2eR~>TjTlJx{`PhU)ElV zB*Vvr{e77;1(murC*SmXa6ePAyd7(# zT$tq)#*`MlMqNu^Ouz^@(#GsIv_d1&wRA0`toes<9GaJL?-ofURL)d887u@B(qM(n}Vw#I^I3v zOVw1jRnK8>U*p2zVvd#_Zp?Cw>|Xu`SoKaP0S@cMhu(h zJ>wabt}H zgdBHwTmInRFZlb8bY^#Rs-whFg#%&guCEwXZGnM(+Yi|9Vp<7Rn0jn0_**yAbYr4@ zRngPvgWNq+etvG!Oq=BR1&ZA2HH|aYt<|ooX*nZ8qc=`8UJlTSna{d1vM4xbr;KU9 z=J8Orf8Y363Mp$PTgX}xSwdp$Yqn&U38m~MOJQb&EXh`uWEr7sS+YxJ6j3BQAtq$s zm$8glo@3N?eXs9x-@oU+U%%&m{+T(K<2=q|Igj`I{rMc5X08J(?6wOBV`ICrZ z_`;faf+%5_pD2!OXbo#LlXQ{FLXk|?MounZVe6v#2N%_pJZZeKsiLJmIra=XS@wJO zOu?l)9DR)BVEYj%<&nCcIB)4PHrz1To4TwKlXbF8^vENPJvtu(rSliXYQv^pYwg;* z%3ivw0r%uCAXnDsG#Ll)W&Jn{7CX&kf`E-ET{4oVhq*D1TDDJ4!fiHuN!eAM1cF?C zK?y_KHb(cLW`T)Ev`s$XtIrQHnORtRN?$Max07Ah!5|#tb85$ln-SUAgADh9)m_u% zpZVS7HnTlnU~}i7QV3R+C?hhET9F&gxv?~rAmffekD1zY&aSafF!(o+aRQ%9fFM0W zlR!(G_6&Nm9^TkUb;ZS{;8*~J-iDh0epzc%&r35pS@z)Xv**+p2?tJ5@rTj!*=mMW zk%I?aOO90a07wdBQP&j{=%gwOpa+MPb4Qi&V7FB-zw77hJcfVRdz!PwV?AQdQ3H0Zw3Jt=X{#CD1VhZVTncvqQSMy);*`J1fN% z!1noBJyvqd-T*Wz;B+(<)@jS~2Tx>PkbCqe!uaq7Y#$%Od^|V^8 zW-e||e06RUQkC@j_Mq3Jb4x`bbPPIHgpKf-tn0$bee zbUEmU8OZtuagB8(2de4^d0~t#kJKJSw`FaExq7`gJQ&|l|6^N@pUD?05Y~5V>=SiS znkv1(kr%;i!Iac$=PGB)N`Om17~zr$skhA z;Yq|cNjwzR&@ei7;)45$cm6A}m2+FY4H!kg*wZAiumfdXFi0?1#rPP6GCs(mDg4Vr z%zaXlrG58h>aUj&f;v8M*K z1p$RcLMX4=M)s4mF?ra0_-+OyUA%^l6s*ju&`nxPXN@gr(8;^@ZC;@$)i?@N_cbu3 za(T?ti!$Q3?h!eRmSz&En|k-iL*4|%k4a?0A*&kF)Dw@8DO8-5q436fCbh0re-wRt|w!dwyEx8@9rs1`q}Prx?330 z=7I&h=4#qd(GM<&i&76(hD{;BzwHtxnK~_r{h`+-I`DV5cneFYz)|jSPi>#3Vo^gl z`}2FD8W!p9Y?72NzKAobPZuu1#ZrrjHgNTC98q1~#p3%hR6jgkK;`6)f#Ioz?P86S zaoBNhTOq3822I_fZ7d8U+V(Al^Br`*&GnS6ou)d`H)M?$d>X78NIamujfl=97sH6$ z28cj;w$kl`QX@-S4|l*kG%2b^|5Ehh7045xL_)r`;tv&O2kKxj3m`?PF>wsps6q`s z!h>%oD>7=C;cq;{r!K`YeExK)C{2xC0P#|Z$|RY1c>XZY!q)w7k)ACVTJpzMetaZ< zs?@?#&z^=_4BVIRc}>%JXZI~3wdCPD45?iDmSo^X$YH+NV#vXZ`oY!1`0Q7cb)Qad zIW@1%WOm|q2;x(v3M+{kyMFgI57z{8`N`kY%|zgfH=})Lir1sPnTrS+-S!tFC#z3C z|K&%7%Mi1FG?@)Wry@+3U!GN}BY#mj$DR;69w!!lb@KJ1kQKsoOZw%MPzvqm%NVik z)vJC^({%!2Fl)c;l2G{yA%ny~F`~oq9p$8q=hjbOwR$=0S!k^8nX$c6qIw=rdsfUh znRvUO5WUVf1&4{y09v0N?UT3}M3#CW2^_ezoW2Iu^U17TTpBDyfXPtmsvIhVIJjxt{EF3K{WxKIiqG zKGJ3ABt(ijM|Q-a8uqh<_rtpQNS1pm9ECgI!Kc!XC|>R`Lvu{f^w#{a#1di+IzK1hL67m))aKkNQaW_0O3(x|@Hu`Rd9}_a z#X^aCO+4^d(!-h^KGPN3O06NL96}6&S&xuW$nI;rbSDiWX1p#Of}FYmlbatyPE7{r zP(7KYGS(b@7M~O;4L83^Ux_IU`5CvrzIe6HQZR z(s(rNF1E~Xc1@hDlZ3@;S8BvzN6C?;Z^OG0#eVmBs1z*G7Z}S@h~EQA@Y@A^CmN`k zuA`Xw1IVJ=xS&%~NP_P?x#6eF$zax2)S*Fm{tT^HCruaFcs*BOmASudYG)P<@dilu zZNYpWa;R*sHAsZV%Jv<*< zuZGzPvB-i>K?+ep=x`ao7J|H~Y?61zqKR$orQe%vcAV4cu6x6-w*_-h9hUil0&|sq z*ab?~XR<;dRzGXMb$04-^;}j$@GHzvm6dNtf#l~wuM#_*sJ)>TCEJ``mdE|X_lg(c zrOXKNKcc{b$RIHPg#ui*)&VqDd_lHLH5YfPhdY1PJM1k8K_2Wa zitb(<=-4htB?}iQpzQduTL-!s(O{-8SRjKNjMd#XEKxgS@AHEz9KP&|JiHk_7HC_t zWkXn|M&=M+c&MKVKeByW9)hO_hP-_Dz~#Fzo2{=Rzi4 zDhS2QVf*GLHyD1VhP7%nWO+2h4Yx3NjN@SioBs!YFqbpo!ljOz^um3=Ro$-v?d{ay z&`;u$7{_+lGfAqgMsv>ht_NydsU>_FDDnopwyvuCG6Y0_KIo|GCTT&y-$g!2H$>X zRc)XB6HvvQx{ER*1zEIli<)eR! zOwl$I*xj=cJh$2FRX{%AMs&z|v(XyYo-B3f3Zd5BU|1FC&xmTIrEkJ3(%1RRKup~` zjwD&^MXUe7d_Doyfl%JsbNzGEDIgqmLnHpY(&dDZ)o8FS4TddP8xwKEM`Jb*^I@me zc7Zvt=OQvFp!({AyM^Wflm^jE)HrS-;N_nA3Q-hk+?jmlo&<>?8c~a!EuNgA-_JoL z(|TdCo(lbWE)08c8Zx}2Ez=4>K_7SsDCm}fB{i=Ps>yRt`e)cSO@Mv0MiEum{t(uRD9ugYtnv z3H8axt>>9M7{gCEn=KSCax+Ozp(~iORgcOOWVX#W2&cB075aDL z_wpR+rIo$h!m+GA^VaaztC-k+FHb#;;4H2hZ+PliH}4eb_JuP_ zTr13j>{p|L^?Adh_S)Pa^hm5P%Arus)+2TgDBzD+1hmsl5RQxXa6eOOq2$?TC~{<@ zD9*BoSDx&G#+oUG%niCmTxAWyFy{I0@KQBgWMJ7&8VvRlq9&P*9;T`KQbt9Q{M*gcXQ{MiX>FLjNG zMwa(VB2PZt>0ha9xpln|8)~USia7+mx`J`Nq3fmdP;%+c8Z&N@E;x>ZX$zk=ZJ;y} z7odRn^!aGZ2o|}o9}HQR-Mk7im%J|Jd7Qykttv9Nm!p%e#$2yqK3c6bm zqQAMh%&kIQcE8Zjt`&R>6X<#m_}s$>0fgfnPs6W+rr>Ya1XudH>GU{T!gHAQET-O% zb_CFU0jVw%HAed^4jT%4NnhhB330G1y3agjqjTxFjf!4IjCa6y;KbtON`u0O+%%YyDcucuIxB$(@`VqzYP~uD}aq>DS9X&x`zE zlLF2j$`zroRYj_O%#SdV%aOnnc_p@B`vxtuGO}%9?aEzKVM@L+!Xy>RBWh#cFBuRm z64nFWUrl%UvA2SySAFDw_?@$PL&GD#UdRYZ zh@ig=E)$-G{)#KiLp;;Z_SsYF@hZUPK4rmcj7W-*z6=s4lsz?|#F`gKl0mctZr{$N zgT3Rgahe#JQ`_daWzj~;@bWr@M&5Zht0j8@&fd^wxFjrRk%h_qd~FzoIc?CLHrmDkj- zf=HCxw&nE2xYHGS&W%f}vmAng8hNJ>P8Z6$Gif3DGCHc2p9cNzZ$@W+h-HEvMW_WY zbuIZn`PyeKVxeq#>cbF|a{Ghb#g%*_$!)B2wQz6-lRv)w>sa5?R~(jas%52s*Lg?s z-2-yf@R~6@G4nk&ulNhj=|R_MbHu}~+i1qq#0gVEy?&ZEgX$FAw=-9=op#yA<`+)s z^JV1pl@;tGXZ%}WYO>KlPCPPwu_QGjd1o;8`fiekNj0T1rguMK9?#dS?bS`tU|v;lkA#LE+Bb?Ua<%h@;JElm5N2 zi4uokuRowL$*_JV4)XOp80nII1eSECc>IQ3Qgq&MvoBCaLd*4|7X36;47Rcn#kh$g z*bvQYp0n#UybpJh+@F@h-6C|5)WJD;0;yW?=OlI(&HEZ3SD4x7s*`95|Je%4;lpa6 zE8x2-<04**lgKinjmO)z71crd#+5T36Bj|7*8AaKQ!J@$!j3f>JnKTA3`=Cc+$>T9 zEJ9{2a;uShk2@I3zdX$9j(G^n1T>4CMTXknmaqf^Bi0%-u}RJJCeIu zwspFJqt9YjD@NfrD1H!R=cK~Z@PwB+&Zbfz2!&W6S{#P|p@drC!~Tu)@hlJT?F&{4 z>V1S{?W26_KTux&H^|z84iFZ$fG}{U9eS!?uK&u!PR;l-nzM`Ij_m~?4TSb>wy}MX z7yK0^l3?g=wMcM~cAR4PjhDr1K-qhmi#q=`7J$J}f$lF|{&9x3aehqncgUeV;OK5f zD*UbA$IYm-7UAWN#}54?s=B23U@+tQG$7EcU)sF_V z*Y1m4{|oEC{SCAKXX_vg%b*I-Hra^p^*+#npU}?ln-m(rJlrGdL$27zr974qm)K*| zf1qrC<|NMq={d_bDrX-=Kf@f}V)`zU!2<>Jjs-W>SSUsG1SPEcyU@c}j>uE#mc66; zeJXn?$Oxjj8*Sdlh&)V8#&=RGbJO-$Y1wy}YX&Tlk5a}*u-H2~kVxOFR(~v<2}x2Z zbs`6|0mZe6WuyF~A|qZ=9Gf+Tbil89ss}tau**K-FsJ!5_r8@PtHQZ63>HRV6gr{V zzW29Lr0!3hm6!M7>lpp-;su1YgHTqEao!52MB%3bv$^pcW=Wl8w~fAkNBBy0GYv#K z?Z!J#vm4*ybG=6&yn;1!5K@k(t;7{*wlPFNKlr8rays9MEXmyIG(Yt!X=~5RLND19 zqbF>Aq{ZusULxg?6O>6E(D!C`rcsHs@_-FO5*J7uDHf-Mzr+AW;GcRoY0hE5%8~Tz zE;oKoei&7Ar{oohlku4Z?$)_WXKDoR5pFaQ#skn&nq9@WaJ({LsLp19EnI{-`Yet{ z6_pYW0WA_UsZ+XRC(PpX7CTZcB1EOKYe@gmcTfE67R~Fg(W_s))LFElpwxNQFq!?x zue#KlU8T2he6VN1=K`}S+;CF4DDF8cZ8zWWzFmMikEWG5E+XjkX6C~4@lLz@M;}Zo zIktSfQ96R3XD;1%RrnT-XiL6-lw8sy5}-(xwd0?3;XRWcZTcszB;C1NE2(1V)*Vu% zjTd&6G7S`8t~P-Vxr^HmTXm@AAaPU9AbuSz-*rEwQR|J!|IQh=F{4I znA%`jY8=^G+Iufc3yF_9yt1^~k2LZn975{bzmJCfe9QX~FQ*;;SSAC7@lMpQ0H^(e zGNL~(Cz|ga_qgj4VM@A}r2BAkr$6dlp5ND1l7HdI%4}-!GqIw$^B;y{-*Y}_+3R${ zkY8+9G|UsX1J@6cIB79?ezd)%{Y<>#k2#kuz11V2YB*xirrVRlJC&DbZ}O6a9$~Id z4W8g!y_sq<;=3}^tR?I)H*p0Ji#ml^@+I4kBG8re(2aHOo3D}cr@&CDz*3vT+5!hT zeTSX?;lb3I-ud!+x7DZ$)>?p0OI-Q%WKH<>-T|AX=jX?kH7@3MrX25o0DZDqG}2wD zcX++UKaqHfL8^_<{+5FIB;#93QQyq~YDj2Ve5k6D9-w(jP4_6ZaeCK^Wp)4R$rF4; zc9?OBru2xB&|=bwki zf{l9i^)PL?5JU+(Mr+*k)Y%DGQj#i_L|gSA$d8UlaexU}X=KPJl8_rQTRVdi(QOhW zLg3AbfPGy`p{in>ttp-&$hjwL)Tn=ZScEihul_|X0(ghN!TkTr8MB{||4NPjOD6xH z@tfk^`415yL?KSS&x8cI)&DXHD1881nB*6#WQm{K;#4QnGKHoj(%pvm#sPG@fHrMF zbh>AtF^u){zP;xZ9$wAIyRZEiv`X<+h;*6SNIehMz@(MCG1H>FoH~EKQ-~~eitPs(~{EI z7S(8wCuF@`13dEmr0hDqGVfEXQ8ARil70kF)tJ|mrYfjTs1LE&Q{)2(-aSsac_%KC z7O+Dy!ijLi`wuIyOz^#9hbX7MP94f0Ks&`d6kt&vznOL4_<0O7Hm*o*7~f2r90XtW zUax zwLjxI`^Su3&Xvk{1xxZpLbu)D-5VvF$?LQ7mQc=h>y`;)ZpUU>P5l{EWd>XFu$Pdv zC0~13eMT%XYwxM!IMwp$FXG;yonFH_=jCg%VYCfn7AVDsz(}LI4(gqsw}r(1n2(pY z$k=L$FU|JQ38LW7Pz?6Q0>S*)0G{f(jO0f;%xMa-N0h<95OfRjc|iu2eF_OOq<(ku z{h}}TzI&+U3IB7%24TD{OW)07yOwq@tn*d0frqZ~)0XLJsxmCVe#>iTwd@j=Ws2YB zBU1|zIh7gukEhQNx8P}WmNgo49BQ>h6(QEu-33cNwIn71eTrst%E+KXq=UFS$4js&QZQ`}p{jslx#&BQ)OXjfYW~VKdqP#cVsx$^4 zJ0ILjN>>_(r&-8nAQEWBR*G~E23d=22E=T8WH@e=f!uL)8a?v(C%xa#!vW3k4w|Pl zTJYP7{c#6IN)g{KLt_imbrw9cTgkgUr*6cec* z(%O$W6vBSKSoMlg&BlKf2&Oc^Vg<7gU>!U~s%)l_7!U|lYG@h@K z1CfV2p1#Q16?MP+V|b#P*BS5e@ThoXrhg;)Yhq;LwtC zl)(Iod|jV!;#X>D)(PQ5-Z$)p6rwtr0}U3=`11sMB$Sb4pUL%K1uQWeuzH7!+MZ6v&0ff(uo^Z2!h2X zVo(%wtYHQB#Y<}?5Wa5Py|)r_pdpSDH*po5l{P;fLkfd%y%s=;{O9!Q{2xKdHhdb%>Nbo|7Q^b=gxb8-<(4% ze<@#ze$T@OVPFi6ZUqcI07Q}-7=Tc%LJk*d4d6KrSNDj-j0|Jpw{CLYWpV1eW4S;J$!to z$QF3#j_?8J|4CK`fZ-wlh{}-zVGK z%8-XYroo84elRQhL&d+j8H^+7dgk&x^+>ldrnX^oE;;g61IvuOgU`fb^fXESo5Mg+an>yyw+!LbY;`GOvhIj8n3GjNu_6GNW9p6(PtD@q z;lDPh z@SYai^+aUf&v!`m^yUANu-B@?_B%kuhz+>c%u zyj7J-C=jlhMQ8uPApuH^_MU8tFWY_)kdW>Tz|W#D$=g=xVWHheS+u=)D`d8To;(txqnm zAoBu<*|#h*#On8AUD#5hIAz|K=1&*F+$WdnB?Op0+y63Oslh(8Taft1F;{C7Z^2<)Ynm`}_#-|T| zf8KV%bkL6$yE4oqLo7;GC{eByIDyzjr@`9>3pif`^*%ly@siZ0zBJP2SBsBg9YD4Bp$+Ux#t6fZH zgtks(^o-y0+0wmhXf1T|hy#8t&{OBcdveA>JUNdPd#}3H4uh}1T*MpTT1KOSU|ymR z|Ep)`7(&=XVrzt&^NsnIZnS*>c^lZIoAR<4h0`yR5Rh-Ch5UQ_-_nG%#sGkcLxZN$ zjD%pvM6u5Rg0?1W+F&CemO1tr;FjcRiZAIBW_F1qhZemY+8)fN9*L?=yl)kjBpTjp zrVd~zm*k*JeO+sX4+MoV6V7uc^8vWW{sZpqQGf+V;%~FJp8-s)neqfmMdj%cNx8p z$oNi;e`#3cP*f~&Bd$W}hmSv>12UjRB}WOLp^RP@ykBV^wz;c4>04xLlV%aS9e$)b zU#~{{t$B&|BUQ+eFi7^-4V_|Zw-Ouks=|T7_O`+qdF_}gi_uK$6muN<9(p4qEdGSr zUyiH);wYhtrpzJW?P>*oU!DrCz!*MnhQd=0o4Pp0@{X8)ns^}{3I5bGQaaH2l-rp4 zIX-N;unqAMqhLRot2>jNkE?06LmGa?t>miU7*(+;ELlf-qd&n%lms^(?>_?uP{_Gu z_giKm-qzmUb?cr-5qouUoufQUyDJ7nU7Wwp8!{WN{*}re=v$$m8xv!)K5?1JJcdP` z&{{#m?-rOHvY)7&KFsVQYNBPvQmc^fSb4RgJ`sI>5NimcfMtVsYeHv^2M663*v|vP zZZob_|03VrONa^;Ug?XPeQ`#Z_`?&mbGMct1V_j7*+Hv+0^(|db`-K@FJX($#M(ji zn=Jb+dCSWb?9HEu9a(v6{wcC&^@$C+tYY-uJhA6(F3T=z69W}>R(U>SaFs2l+|1Dx(CYG%Lanx#luwSbP z#s6d>A!P-QkespBqFV%;V;2vOG*Z{fEMnVjkyYIN%u02@n_OP2A;3Jyjb}}ky!)AH9F(DO#6)q z2II=GIKSdBZ~G~IL{almu4K#@cv0^Yy9y1FQY{m_^VNvlm5+~9C+v0#Bx7PPmqb2xMPS&EE3wdn$aeN#gq64;PzeT|C)83mB;!Vj>8R2Lj zYC;c2ySv7<2X$B(Z8M)y?|RH62?52w^sy9J zNH@FIF@XQ{arev8HEiM8LQ*RzZj0{DK2}8z_?M)|B+uTpTl4fh1*8{p=mpG;9&l$T zy8=1C<9S32=4cvghm-N8HDBpOGxmDKWa0K~6gpfLxz4q1GJi9~wzwK`VR=PLz9}PJ!jX@D(_phz zyM$Mp$H=on*yOt-;%t)z@57^f6+iY`wq+%P!kc6uZucY$b!wf!vlV&g&UeyZg*Naw z6I+RJk{G_#qm6ZTqjO@XV~XAuYZsfp*$+3v#*ikpi~X;*dNC!nTZISXs1(q)!~tW* zely#=H*Ku(X!lgT2bs1R%qU#3`c%)@X??{XVHNkgYYv&qK#gP8gHEKQ%{$(kE0%oC zUq+$L6$5ORz8X46AN%YIhi3i8rG};Xoy1egYJ`n${)G&GP!&6xtM=Q)!otS>{lAIM|6LUCmYJufNcX#{swXtO zT)SlVQ9Mo`B>@2vU$^mdO6hC4Ji=>AT8Ltsa}<;n5a5TQ*Ps2y)tgbp|1762wr{Qak1=Nl;(CyP+NjE&)QpAz0N^~G6Wsw%^N7tjjTkryJOzh8O< zDo%I3Y1477XZqVwLD|cpiTF-FHX72cn$k2{!y`) zU*yLDc_pDfW=rfMOWmW4UWAxK+TyrpE-I+eA5nDz3q>wtq*t?2h!OLN03}L3 z>i)qul4qpb-XaIybm49;&6lNlegqjjd<`~mE}2K=Ns};s7qj*vT73|kGt2$`#!m)) zWUe*VK?$>oy_4hR{W+uyIl1aUkP4ZE&8cJES?FG3q$eg}4|b%EbHpQz<+ZbA1BxBT zmJT~Y?@hK|gK-fp&XfI^9*(@FYN@%gMKxuBJu}_^jo&2Z^%H8!2kDWZ?Ujp{p8nA{ zBz=^aeQI%KzWfgpS)8A7m^H|eaRu~sPbnfle)CoLUdwosi+0J7z@CIYb-#ShMIkuH zx#scax>Ym4SgD)lPm_*U1ohTDeo%8y7aSXFzh1G_O@4;X(8#*jVYIhA_gZiv$^29P zP+vg-r`K1^l1WM$`O-70ODNM(D7?tK)sX~N!nfIZL1UdU`1<9*k zU+UdtnF!w*NDpFUTt}ylABPG+7__{oRK=BA=OYV>DkOB`@ovMx=$lb#KVP_=ZD*}S zH<$1@%;hDjoo@BI)p6)D`CAxzcPKwInrN)TxldVoMA1)XrS2aP(Hr9_fPmobZDp9E z_O2A8U>JT-3~ynGfA+G~(m?r*&4I*RY#dn5I>{+FTQnn>AJ;Kug4@oWg{GdTF%ltu z;arBQ#(7l_NV39t!4BX1e8nBX3__y{1ijDUpMDa7i{Vo*QtK3AoMTq-;)awH=K492 zR)04!JX^H)uR;*AEC9K6?YXDhrVsnKD-@PSalhtZ+#PuzJ7|(R2?5A{GF=7oB*qGR z#D23O{7{_>)rrx&R?kqyuY}b}7fPRb0Yo0ZZc8771N(z?Y1+cfh! zMWtgwM)JA+f5?ES-c#fEc_N1ow+lYOd)*u)L+--IpE81L*;&BBBh=n&v=Y&l>aLq6 zzF1h8BA@{^*%;{WOJRz-M(E;OInF(~N_JD_fz?V~A(pa^u6cc-AxfP5k2F+4p`p}N z?zia0O1;13xkh%$xhq68BL~;tB-CZ`?4agLW+A1edfSm1=SVSi<9rkpZz>B1l64=` zDe@gl#BtFkM?;5Fhsj)KJM6Gr(Gke;31 z%IQQbNXT!mSwxpcaPFEY6tF8GBhYn!@}&|){c3K|6%>BoFC}zIHjF2X)%UOhZnAiP zVi}u%xhK_a35hRlzFk=^-fb3upF1tEk`pDA+wsc=7S_QwfM(j7BD!sCPHFq|4E(yZ zt9(13BAUq;4-@NyW^;)}JUq(tX3!S=M9GhlnJU;rN{w7-p4b(9Z%nB#Bh|{}MEWAE zn(?)3*SG%~3jo6Wz;UE)a_kjj`DwF^)pHT@WQ&=ic8EY1f4Mk2u7J-8-VG7ZbPSoR z->ta_yC%Y~NkggfzznV)^5lA;fHG2n<%B@7FI0FM>z#?GR4A5Cc2?5O7xVW8 z=&fuLnXY&Rkk&XeAg%e%sX zkjQjglOO#XSANQyBf`v&h*2otBoa?v$wLenx&$8k ziW8Kp1?BX7L5E0Y*2mVUK%x!wSG7;cM8Wnp3o*bRh$}$*&=Uqys*c#F@el*9gRkoD zfV`_x!*Zu&XcV~r7STs0XW_0f(~9&SZi}aLS#QX z&Z+S!I&k3$?w+(gC5toKhcltdqhW{h<%8K<=y1!o{!cDqRMY5XAEk{W#6@z5f|J=E58h`{^#bU{)+s8E3vjd_EQ=UOG%@Hb!YIwVbUyq>HPZ~Z=6Pt%R5I&#A8 zJhYfcQf_uCzo^3Mh4P?S>q;Sy3M|F#@(gs*`?3mx=NX1H?44@ER46&`>CV&W;3JB!7|ys{rv7uMC=sfJ07FfmDh*sk~Q2UzSwCLgtO*5 z9B|bQlhwTe4OXTwLA%KTD6WIZn%%R_c19gOf2*jpg=mXo{!D8Np^sv!p~y{g6r3@5 z@Pvae+{H&>scD5Nfr356zC0>*-K(|pVLJ2-k@qoVZzCGlo7dkbtW|gzn zbu&wIAI24+^sw9R`vXxH zqU64B4d?Qt-@vz+e`7ZBeILgKvrv{`6@~=-D8V+P^c+o?YA8!Jmk~S8saTSWKTP+s z6#O?B(T3fIP#XN%*TcgL&903*u+oF>$PtO6;)dAY9Ds_zb7};KL1YcdiO-Sk59ae= zCeSf_R~GioJfZ_LbqPl?3D91$u3Ym;P`J}XoV{e&RC&M#&2JY>0m>3zvIofz&yYRT z6oy|LFh1`tOY1xfAf>PK306{JU;5@DYVp>-)YXMlOziWmw%GE6iIkcVI@;DAzn_lD z+?8Rf$ej}feD{c-kDLS`@C`4*l_b*G(v?O-F}NtgbN-eOJ_)2( zFR7ds=B0Lb?v}2jlPBBapxcfN=Hz8%Az)z(*HfokwbqsIPbDQJ{%-SN!F(zR zjbZ1@vNi#nutN&i_Vlcw%vbNkBw>kcv9_1H zUh0DwPnE+&=%tV@9K#xo!~^dAsW;!vREq7u-Z@`(8azg-O)`RIN*gqe#t<^s>fJi? zUS6ac?1-p!_gmja4fZndkFtmFPsa8;Yo5lzE=Qw)-D9GYre*LI9ga@PQ4i zj;McRbs?Yz{2^#1gpd#1g}{9B5RW_awM-V+9UqA6jJ>FHF_C8e5$UjN-{!5Tey{qQ z&jT|)ZwYArjtzig)1YYB(F-LS!CZ13_iI06RoBOz>|c|%XnwaP3gx5GsbD`EF0-RS z{)EW$S|2`a{nFI+7hX_-s6ns)OIVU-Yu;nCL8%-8dmPBUmQtdklw)OyGHPO^q^aeo zv*=IgCF-Tlg@?>(&)Aiyo-IF?bWxqeO99XAe)gbD`0||67gV3GzZhexwS5aLUZUzpaQwGPkP=F@FA-3rcLV#kTE0wGuQ?@q( zyCE2-{VLBYr~0x8)e^)+^x~Ox!G*GNDy>g9D{!%`(_h+7M`pXL-P9<*7o_W1>j&wJ z)m{e;n;85Xu|RYYMP5nx-plc))rzkmUqqb}zJ2ubqK4;8gdvL&B!>L+vjU4%pUdZe zmBS8xS`7nn6K(v#`MnfD_4kRw;)f3(Cm!Yrym>+lU261@*W^CA(b%i!)>9fURI$c~ zJAa&uhv7NJJ#sp~g$%aafHcxmNrP?Wx)XhWU8qx_0v}P;j2T2qJ@_lA3f;Dg-f8Oh zsMmp3lOy+B@9bwVi6KKv2cbiBjj#awz|krnDvCCJzV?GJv;DS-p2nErZR7Sm39i=y z#r^yoxdJO9l{zK2Jmth_OVXIBB21p=D}CV_R*6{rr9n5N{%QtGCize5fTay2EV&f! zTyJ?`34A7yEU=9MfRPf$>s2dK?G9C)QtjipeAOp38M2lyCqm4@f=u0JpYlE?6V1eYf3zeN=8lbFuV7Ds;BHiZpdeI9Ew( zMS6-vmRUivNlqJ@ER%WPll9&|A2g^V8;2vw@?yK(+_Yq*kW#rfWV&DdEBbP(DWjTb zaPy-FDQaI;j8pG&(q=%|IHnDQpDSNUJx>*41c_qY2mtpCQ@a^YfmQg`LTmLhUaEC5 z@DKe|q}7!pMKBFOZ^4p>PpRs@1i-36H;bz1G@t;hiD?Y^Wdp8rNYKodmj3kBtCPsv z6R{|`jcc@Oe0~dtCv8_Gx0;@1A{i`VuR94tu(65eu1P`}qS$+OQcz*d3;<$dJ}+k8 zzzYd+fB)TBL6290ujtRMP{i@j_+_oVgnR>4U7t!MyDtNMRP0uy;Bt+YxbdN|H>X-b z4iEDs5*k)mWT+B$K+!~w3xC1xG0CvAL@{rOs2*N<25!>s-z?>5zB9G05|+l0uNInb zitvJf%Zsyq*K~TMS%j^~GqV}-52$Ww910){k@ebD6R#7o+5YO&2hxw6o+Umbh)U3y zhTsDKb&36HROMk^h5;l;EPG-y)#(q1zqXWq$<>`6AUlpd(J?<-{fseao1E+ppqp;HJ@8BLEjKO^pPQJ%~;6KI$~Xz z+mr&S$fuIuZz>-W=YD!^ASdWcc;9GxFy&!im2Y`QUl1254?n&(GZ{3WxR}STI*H2v z=Pf-IhrwONH%8rl8K{i{Gar9%>hf>YnmyL!Tf}=?H>2Wnd7QS)Ct=InHPaT_>LHFq z>}KcCjIjDs?0U8h#pjMlx6Fz(y+U8O&Zyo%*H+zt3g1PA zXS1pDRMbpWO`w&uj$3xPn>Gz z#5}ZW7^zNywg?*J4Q5^lis6(q^z)*6*p42{`8_pfj#JIXA(2DO()BC?&Ctc3-0(-& zUR+grXHFk4gt|yzW4o~1H=Yt-_9c%A6V`krHpEWBM~NTN*9`KU8dx+)eqX#=4*n?f%m~QL#4a{)WtjwV4*FvXPvim!?(W`Np zVd0twv&0S_aAWEEwTkw{YxvYB1e<3DuuQbr?p}ZLH1Fi)F*P-RiwhB!pNPXyU!~@l z?Up?r%?`5~@oi*dMpDPP`CZJGv0+5*U9a0jWw)e+b!uhize35MoIUB8I&x82Sh(7rS+tg&8$Y#6Q)~Wu|R*BMUL4iN7u6=L? zAg}#zM`*Ub;F~=3F+Ox5TxCyaUM4K7n$RTQ<(E|_ExILsZA+16uO~+{*!c;IS-j1&ZDA}IA{rskfMpTJU#@?uY*W@|b-IS$COIH!_`dQLdn9CP9M1 z9#H~sUhwztNJ>Z?pv=<`mQw>vau(=rEhhs;$n~lB4|WEtD3SRarAOMPy)dz{c|3SV z{B8sbNZ^|+8dcrn6f_QxktI!u0?z+gmsfqfv*a2hKVVfY--!q0?^7w0$%8QY^k7#s zo$m2JHTI=(DQcL!yD>eUpu=|{ONrJS(dE84+xX&~ z2q-m;j)RWcj0)VkFZuWcnp5Stno+K9R1or+3VwkfGh|-%pH*%85K1oJTUdXYfd&U0 z$?nd9FJ7d*4c;=8_dqfcCVQJjUQ5)N{$b`?KBy&^XGvx(v|zykuxXZI8o>231{v<6aiLvhzRV*r5)uh2WU`HQ zR6yK$WiWVviyX$%sIp*cH59*Cesap-Law?G^=$&XI)tcL>KB}hZ3-aS`UWEw*V{L; z`I?ohsz$#te4d4L?TCiyE?!iQ=;s_R>Ak1o8-7kmG`Iz9e^dVb#!mYRs6vpdR7Y?q zEhOfe?L(c*{_7J1uy+8P6aDc=MGF5HVec8%RMfPMh7L*8I*;w&NIuid=?O~73?)&{0q3X7o%SzhN}D4Jl-<|!=rc1N zn{t9&FKp*;+!wYmqOgRfk6T!`Oc9)g7ea#5unx4YBtz0KQh8oozN7L`PgQZ%t_z%< zvcs*3JY1o2Z2KLNw7=~fgjE#!JBOlIq(0strBo}ydovQpRhXHM<5aH!0*(Y$KufLq zi>iV+1umTd>mmYwc__H`YBCg2x{+!WfBN$jPkCpGL}#N%)f6*lq|O!CsVRZr$gM zOOU#?717xyr|0oxa%bpnc-(Y-jpcTgBTplF{F?s9T<;Vgy6CR_G-F3uL>n8;i=2Jj zlZT*9`mArk*#bBLf8%ykFJ}O=&=AO3>)?m9{BoYiC9kITzb^6k$_vK4U<>Y>4vP+?zmC2?z9J7a!v1d{ zh5zjyq7mdgxdz|p5~$WuA6~VJLV{?%=;e1RtEFzRdJpkgzM`%*Iiv}@e@0yK(FZg?L#G0+^-@23o*Jwo9JtAK?MS0 zG16cyFtco|Ytx>}Jlk*VL$!q;t(X2!X8k{q@`m-~ZcON(;yMI6T~RSHM}}LJvai#c z0+a_{a7m}+zI0?1yCe5)>-a8cNIz7S-4rdrTuIB1K*UhUt?y@1yQ_$jBM6E7jXhN= z;xn)HFX3V4e*86KwVlrO5x=k(-E&j1dHm+Hg)+uy`;6gMS68&mfP>BiRf-8U6)Zej z|jv+-aC=L2Sc)r%k38EB?6pEuN8D7bWD|QMxzK z*_G3@@OgzO^m~$#v@%$9Gm(+#ymdc$dCIxKL;&RYL~C>n-B+8`A2cifsOpzjUxa;? z$pk^d{_fh~K32j$*;hsy5*$7GjcqePlkfN!)o#PUh!zw#4pyEc^OVLP{&2NHJfG67 z%YQ<>0sly%DpNVv8T5^lWf&z|l<0OlK%xVTxw`bk>|m3qPc*PerHWZ_K!a8djCOt{ z;;q8c)z*62@KI&@{QO2(LU9kTpxo66o9F&?0;aftnwubFU?}3d99!ev@^~Z2c z?HKiK6!g4&dfaEPG$b(QiV8A~dtL=ydRxM3yXrp477fEpfWdo6aQ;q6cnzxWcukHP zuR(4O_7b%M>@f6D;MaQP4cvaIVQB{J;)|;!Ub9dGbkrV-8wc=(d!(NNHdRrnN0^v> zV8;b(-(Tf`(_ims#vheQI3ZR(1#KVIt&=>P$LCRTw{uRh{jJ}!x{&t}TFyN?zwN}n4o-Rf z*MVQ%KKCoVfxR6Cqyi7Z9&1|6dO~gJnZXLmW|Dt#I4|a=PBi|3KoL(G0 ztF!yI`_(m921DVCe>bY1)_NxjP6H$QT=C~2Hqr9sSp6i%4IpX#UFfj~6>!xU`P`Au zuF4fT0TVc^8T;z8V8t?wNE7Oh*_+LLSNlrqC8!Y|Kb;X`2GyG3sq5;{>SWw8iLRGL5tZcGdYKd8%lOjOT}l zwlnWd1mhUa}nG;Ia5|4h>rulK4aKqoaB+vDc+ec%E zr`&F=gWTrKZ|Uz^k2rOZAz2w=l9(c~+LsUeKeha+ttq)&;%qAER^2A(Ai}V^XUw`B zv?(Fu!qgN<{hyle%Y?!UU zcSs=1H!!W;aw#Mtd64V+)&yOhC+8BrjEnQD6v8C0{_)fG_;7OhS0aQl%~pqgU}T{1 z3k?JwFx*5aDx(b@DI~dIhKhxTcrrbl?%5QA%ij z_u)j&z#!`;pNSZ=gbv$U>~Q|;86nBvOLYyr??%04kY+#Nz%>uyItU1hF@r`Y1PL1( z$Leqi*vW}j+!N~A+qu`*txMHSH#&W09L3r8$9rzi235!?^m0{0_StAu3FMLo;k#za zL8s^RMgJ!w#cejP3V|frSH%~=WxfthwQ*LQ1TlAmjcxsDN72BtN{1gemxazf9(*^ zGT!bdide+;o@?3BpLyYTTztqpACw}}Ix#!zkUz#|E-VC3Vj~cw&SJaHE+f5Lm3tes z+pXI4;f{-OnF|m1(_wu{BoG55qhwE(!44Ysnw*@R{L%s@c5xTc)sa&zn||no{l&Ap z$aztN?+)hNI$j_nsRNc7il@#HTxeVz3B9?doJzLdcY^l3)^-p68Js4Qh~?hu#Ax$mZh92c!PhHF&!=tK)awaF;yLT+?R{+Tk;{=AUL*v9FQ{dz;{}cXdGGl6 z{0Du3qB2T9AB_)|o$ql}eEr6QDHgq$Wy-1);!b}kpDM76c;up$`B}1u5XKWi-^g;G zeR$)9+>5=P{rZV+h2Ia*Ldcq~CClCsbf_FT0&<`eh%x^120|ol z>-Li^#MQeBISXhh_Zzy%&n`j5S-{qqzR*dU_bYH^!c$(zmU$ma4*bSSjDwY8m4D19 zSSPn7iApC?9{3hc8BGjs6Dh>k!-Nd9;T8O97rmnH21?fG>|r@W;nz~Dlb^4jDhp!G zcA^BM(D&}&ro@Nip>ZoQroe}zm4GV=EnBBl+2e#FED)A{S3Whq#iRw&O8rU5EKvZV zeegL&{=ph7qCM>J1)?V4xFQaNxMz4?wh4Qeo-ctxH(n`hF)^bn!oZ_e_*S#u2ii~* zVL^}~O^@m-D=`?qvgjGTt0dogAth5@YH7lrAHN?>3gPVgIlzr>y57Jn7`tFSdF58rsYxp0H>7Q=Kt{$Cx|83Wo@n$>tYPr_`?XEyp^2QoV%@cOU_flL7 zka}}$>;9DjATb51GQkLIyQOvi)hKE?OxXZ3|CyIb>Uw&7!nME*L>aBmprF;WDMg(RmNcQ}l)g%LjG=(EWHZuy0#|#k*UdR$2|tq^Ro053DKqa_K^u7QA~=++~}p)E?u^O4-bbs{US+6$aUD*SQ3wVbb)?Ei%~FK)hJ zA^+)MPUxe{yWgt}l!oYsCpxHH8MAA_G)fUvC`%qov<6Jnh3(b0c?U#st7)eq-jOYA z8jt-h0#K~$8%FTbqRk=zCM6lKd+FKeIRfVb01pC<<(pFLd_GS-jG9k4dbHp^=e;Y}fS6 zj2!zesJKVLzuYkuRt7^u3~x%_ct3op>fq{1H+GsRq!1`YbQj!JWw^-(Y*5N7$I z+kjX!fT}ghHesZ&o!!Cgyt!#^*#`n0KH?0wJzaf$Z`$~P`|}C$1V6hw#cK`1Z!y6k z&i{jp#U&&x*2r=)E`BS4+Ve?EKhrgh5E8Ln9VLdW)3#SJo6P$;^m2XZ(e};E&oCIu zn#i=C*_aNWVF;X!WZ6;?$xtEIixFTJFcibar?n>KELAebZN%e7y#?>-*oA0cUMp(( z#O79VJ=r4rykv*y+wD;S{FB5EIC0gt&s8nVYrSs;4?mHoR)=%CHlE7AmfI7Vz~&6h z2C=T&`{7L^o;YI5PThg}7Q%jueh)qNfET%>O73xM1tb?fhk^^a(4a>bg3szcM@K%BrfG{1CCR zu?u|(4(z*og=MmSKghnE_sg`fE+k#(7!R~B#ekVxkoNhG>i0O~C3xvhB4hM0ai)g0 zw)aR|vVT~Y?8qwfhcU`Tzed`H-^1=KC-_^*R{25K_LY+;NqUqKTXDC(+qQjbAgXPB z$kA|xJg$mxVs>baWUE0J1)ZhIZ%m{dZ+||sUCBq+ke(F#48`uzwYnwXh6lt+biQCs zRo`TRcAe*^!f?OmG$i|9>00-JI;W`@>FK>vP!taE&0S&r2T)J{ z0zk(RT+$TbE1DZZl(WIhkt4R_@&wI#WdhM-c^|%~WU0xMz;BvpqIiE0A`OwMx~a_< zsO4O;C#NCq^?LpSSZ$&BCqT1rh&e7YBVY8YCWpPuwmCHkJ4X)FNQKkNAW|JT2POQoLKY((=tf*VgFB4sB^ip86U{R9dL^)k84Ye|ezgBsT zi#H%j47fWD0sE$bntM|KPWXCTSG3SXpk?f%3xSjH>Y%Okh{%8dSf7T*>bg`D?jvC* z88ZnIFW|ZQB!abk6ajR=`PG2OWP)C?blA(n09``a7pv@b(Vz5~AdLGJ`w5T+-m^Dl zhFC$ldg3=A%UuswRzehU&mPq*M!n}C7Ddc8sda=zb1Uro$&aK_d!tV6FsjML@97$r zDo3M}1Ghv#A^BXy812dr`RtB{e=V32{GET$f1fiH@!hUILH#uB%tp$q=ZeozM&RD7 z=2cDkE2eCyVFfJ_C6{g;xcG{n=p#|0J~xhguOtaie8h2mD}$ufPGt!3kUB$|djU1n zW&;4sq}n7UaBsi(utfOq;_V1t{<^Qdjj3RsJc3tAl=|s z`y==hk{x`nEAI6@Pz2hUmo8s}=#h*Fn1NgYD_6tMxER6Q=IqwEhF3jCXdf!Shm3>O zV^k0GuYZ~AeMi^~CO8DlI5{r9_}M}@%Pym`Gdrr1LsLY0%_n;IJ@JzVpVu=7K~Oy* zQG*d0lwT-uI*T*jEpgusB;*jKZ2J!C@$oZ67_Rd=v^0k_=d6>cWN>L=!-TDB)bWob zX`{arX!LI;-by!}Sjrj&5K$Y^D^*Q|y89tUVcK=OLZkft_qVZmQA~=m71=ptuIYZI z*NLmW_^&7HJ@~1S)KKw_1cktR${HAkMR0QFO9f<7-f$ddqgkBWf0VbT3jI|b%?T+9 zyu?ZySXx>ji}nd?59c6${OJ7b!cSkECVVW@%UT*=w{9B zJ&X4)hZ4O3w^NaHd>^&T#HbGB53*{}VIu0C3nR611_#SGf;J#b8)BCsVW-py^S_7B zJ@GTl-_}?8TYqk>H#>+ts1MM_9!cEeWCQUf_JE1|7A63hl6g&sJS1@UnXeQRXepZ& zlz=fJ_4RMJd+9U5-7a5)0ixs)3Tz=9I%M;aw}hW<(~MM2DuN$Un>!fCn0~0V-0P zjCi7KhK!t+JvrkzCen#D_&84DEaj(6I0kBq2Z5kb5T3Q1*adjM@rDp*i9R99cCs=lr4ssETqPjuU#VV$o8P9D9s4 zx44*>(7p1ZG*Dl=^+ATH+Pa-I3P@gt{3*ZZd0C6Jj}WBG^LS?__ME;^svNUJ7Y44Z z7NBw3(X_X8&ORlKqs2pXROx5&Ll3*M%Sv}bh2}whlzZ!LM~eXV@*xv4|M11v?*#YJ zL<@yg#lzoNME#is?y$tB77OZ|b`X1;c(-SB1GKtd2RPR}dl;lsimILVA#7pSjjchg zi}kz=eb{rP?*I^i$SA!f7mXJz9068tqJ==zcw568WF06VgYdWPz%e(t@Y8W6y%K~T zz9(m}rZK;b7t9Ql{nwR6Mt(0)+l%LJ;GCY>1VFg&r@#{W3G~jN188Aj4!zy*aB5u~ zCPQ$`JK&K2ei_R0RNeN*3RZxgI3nV104?N47$dJ{>hklb+YIAicd`50O_s-m=4zIF zAF%(7Q4VlfuEu-|4IcBpptup9f>4`Hy=%c4^_xpF_=fi{g5vqWM|>VotT_{f!MIkG zq+kY^K;BGPv_+e01DmBV)Bylf3$BvyxkEIB^gho8yjeqNK2}mw-0ur>eGsJsS9pXa zAIz+Gkp|}4JxC$`4S14cJa=&L6K;7#@dz?`F(!e(@rgCZaI+4jDDToIjyfUFM_s`y zEyc%KEN7)X#ezP&T%W8ff4J|?XL=s+v>bg_}y=L~){T262`8TEFAfDjY zbeHzdzR5sVlRfMwKam-M*6K!^Dtib*?r<-CWC>$D(;%3QD5xoXD%&z9eT)rTm=ZPk z+p7aN=6|N`x&i5${+?+@c!eIO6b$9Kp!r6X1Gz@y1GH83pS+#P}ig2bx2!0qZ5tjynIm34?&?5?sNpwseGBZg?esfQ5mHYe{Oz57 zg^z*C%`Jgd0lh)keW(nUdgiFo!W+XJ5@Pz43uHgyPdC>XU$&VN#MzGuJu*wJYNAYH z#N5763b`*XkG^MQctRm}wwUI=|9tapJ1&!x$o_Ny`iIX`(K2u_5-Ex+OPA#O@4_+dGVmLfzgc&x%!4f63Y^DD4-0E;HgcU(Vy98m%ptxo0Z;2 z-K4?T^p;*xw&7)b$i}C()N);owREs@ASj|mboo|aWz*vb5TX5{gPM}1d@B}+!mY^X zFev;ZpuSfc3_(3A3m6e}U$oXp@+vrb!pQyh4HdBT`ykkVZ%(j5YxCzgBX;fg!J}uI ztu$4ET-ggSe3NB1wfFIarUFSd-@QlAR8GP11vd+V8;SK)AFAVdz`dqGR<2qbLg(yz zoXt#}=i67rfeoiOxM_gP0%~HdXuWZ&9;z?(|5^$!WApCM6c;nbF$%uv{-wl5$azsv zvCAphYrva7jufghy8-@B^W*n-dn0ekcg~SB#4$emFp%+_LV<0)ueCBqf2mblF5&v% zLkG}=4z1v+gFrs^Vl5vHam}N0{_c+T?JTqo(S~1tX8qf^_BAJ{7T;y>xxO)C=y$X-=Eck(ft400#LqnC%$xaHqs{h&1K>Bed9MZ zdyO?Ey&v*23_Tx!&qa)M@i!K%+BC6h1VdWk_EW>2-FWFk^w`k^S)Krs-Qe(&A?j>3 z1)988;%9*$*j9IVDn1kKQ|0YCGw|<3Z8hkx=H#rbVayCN#0xOYn{wlzKJ+!wzFrpV zm1RbuAc31@1BjKn2Dw-4|D30JC8SbqWO}-5%Hife4BXxZUjrY{Bv^Vfu|_p#gig=#i+{^R$I=A z*uov~Gt^%KxT_C%&kNyQ0~uFADVU?U;(qe2_jAqqaCt(=2^h-w!H0OI?Ahb$3F{>{ zp^>5Ex{9~ar>Y{%H9NzYm9km5z()r>xP$W&{l#aN8DEl!7QT{XMJZZ{x3&$&H8j*O z%XSNs1w_@mE4)=mr>J72UqSRdZfpc5n!mCgt?s2kkwUCssC3WGlxL*w}8~S=oT@5Z$R?pqJFby_8zc2>Lix(m|km7N)b^h+br?L8z1OLgf-8C6^;X@)!Ih21pa&*Go;npsXzuI^U z4X0Gck@!Q^$RDH`4hz=XGr`<>NePoXZ+=FP_&btC*8uNSuH^_+OErS;7IX7vEu%ks zr-20?3Trc|AGKiib%-OLCH0RaY7WE4d)w+U-{Yr|8trr#8_3J}()kvO?RA(e6CZYu#nZ=%- z``&IFXev!~=0DV3Et)CwvuMWP&w`AY$~u?GHcllu{RYEXw7q~I??U^NWPSH33S&54 zvTpUiyE);QIhWY%cM{mvB)dR~A6zxlY-ApD-tMussRnQF_W-3Kwss7x=Q_2^X}Su9 z+I>NGe=235U4DUQ+6(L3;UF^~qMCdeSeh#Bd8u$?s={z*D`lK&(xHV8!NC2f$0f3O zqR}`HOrA;Fp?HtOZBVV(>cu0f@Tv~t982RSK9*IhGgX} z=}w|cZ4Huzw}%zrT{5)(p}D0y!^u-A4K2zx+FGBIr4dtyb()YTdGG`ODJ`zds@>I> zax+o&FyyR1?937n;&5~%F^?h3w_%3J;X2hFgP2=z`=l+WI-p1 z*2{h;oJwP4f z^B1aZCg)|fl=+jUensQq7fn^&Z5ajETAimpc!%7wbf{|qa`$Fk(xT=Nj2COC#lwNt z$ZhEPR{?mf7O&2>;jc+OrlUu?6LoeDcqWPPzwdg!ru+1z7Rjhvl*Hg~J1A$ohjjFA^>4IaJ)dnpCo&4VIe z;DDJO4pE156mCCw#b3djslUJCU-PPWB-?^KI0-6K=}t%J%t7^cX&a|_Hw4kSS{3e= z!C3N+e~qMpCo>IpCr{Gf6!Gdw1R>_gm3=`T?KErq@Ae8DV16uwr9e0*sOja{ZL9YZ zXautsP$nS4q$dp)KWz=z$!1-+GDc4Uu`5z;An@PCdP_7dK7p5dV}{X!$CkhBZ3Bps;TLPGrCAz1I5OHr0sb&m0gaskV=xucQ5Oh9oyXUEh;*v!k;f zJ1KBQkz}f{uA`6Z5DNuu>BhIIrTF(gk6l6eW#5k#^$cJ)V2KvR@jtdEn{F6DZSlR# zUdX^mPkm)OtuKz{FAU1){m;P?lgDl7SZiHdQ>0`({(J`a7gkAdK4cXc7wV1LBt2E; zh9Pv6ki`zaI<=CK>;wq|X(A9Zo(fs6zK@r4$T*ky_A;=q@M(u6w<#)J{!cT5WMg;BjULd{ z&z8Wymj(@7eUcSoEy?=n>}By;JXNRF9gQB(=h8Srxl9PR4L0LuxF=kxwSlB9Bt z!TJ8%?ztPUsYt&ET<9I5{JoQc8UWv;X%5=a;b0&WSUS*phCkD@nwl$pnBVA~qunbX zI818gd$eXO)OO>?;Qlp%Z1%HhhnTNGX$?VSJxTaOIT$iDqnlhGsGz~e#3d%mjI%U4 z-|8awxTnVVR@AN+^E}=4fIw=L<+LPs?+MvcdF~Tdxp}q7CdeWzC*N+M@y3~%fDV` zv0_EWC3=+R3z+6H7dQO=tDHttI0UnMu07nPZ^n4{Al@1GUH`>5#Hku4E_3zFD^f{3 zKTBTG#VV9-lW|$x>wgY%Rq196o<9uubE9tPjWxWJYg_Vi=B5AT0&t0qc1D60NgfN} zQtPg20Yij)1;?@N1>b7+Skpe_lLyA|{sNj_F-flvlcISG9m)y%*)_#*PufS>sGbt$(iTB!YrVz78gy`kTaES{a?v`|hOJaaAdhpvExZ3%GZ zff`Dc-oNhX=plL-RTBWZY3EPJu~B7zzShXRUdAu>YN|d&HJ=Gyhu7b7#Ov$33~9DF zLv^Z`s^lX>2;Fsbi(?#z-mu-=+jBK&U~il|vOmb@gx(9b`!W)H%xSOXUpq52$h;Gn z8XI`AxDlD3?K9VasPkPto7s+d1Knm8q*;ntq4n5Q`34C{86$iSGZ!CYZ0x{Y;vQveTBxz6#-()pxP##4-E%-e49u4jr9zU={^HyK-`?pyb+36 z!HOs3zSxGX;&bx%^)_6IZd@W^F>Y0xahsKluWx2aZq`iCVwJBdt0}(BVwLq7q@bX? zzMmR#n|(C;%U_d&vc=oy&*>Yy7L+aQX0&xaCnwoVlycT$BB8LM)493p1~LB1J0^J& z6^?3s&CMvh2hXZrw$lswl{;-d2(5a1z)MpAxJ4TV=L732)_@ z@xES5vt41lY70kNIXl-*A+{2_UuOmG{z^>y??E}(yDS!rQ1rQR1~F!A|GS;nV%4maqxz+@vu~ZR>?%!Q9o=( zzq4afGrmaNO?u<8T?0f;uMuc$YZ$jY}QGwtKCd%;nojHO@os6F{EuVJJ1f9EZ*p$dw}%K9 za8F-$kRbnqfcJBnfQmcaB&T8f?2aN6^h z`J*5#?%jDD$*7KopHl}u~G1U>c1qAsOModhkSi6#+!al-WJ_NbfHKX;{)_ zqjQ0~hig#`cP<7+g-%V@oXsMbsK(SEda)usvFIs)TQs)~ul;QecSO7cDI#t!HzXkl ztGr{M`zxo|TJ@HNnUJP9j~kbx zOLTdnX6*xWg$qiUU8vzO>bs4OIh#d1gUJ(B4Xc$LW*o#6OM-5^3Sxvl-{YLxCc>*g zb#?XWz~7Mx-9+lW*yTsLL9NRz&Wl+70l(byE4%4I-K88}y-heMPKh!I%y|cYn>Kn$ zvH_5C1aO_2UHr;Yr&hZ@T*~&oyW`fm#k!vb<~&8nX+7!g#wln&MBW`KRAL3ZI)ilY z7MwyL6mPd7PA+7Uhc=1Yy|8Nq{XfR>c^v04Ht$|MMd=nH(FS9OGc>0ww%e#jB^!wI zw08+4LEXNA;{^55WCG~B{UZIvJ=wTJ@8v(<=|+hw#3zE8!6co=u^S58l|+w2=Y25r zc5<(F-f<0y_OZZwM^33LvEpBm6%4{k3KKUjyro&&P+-YM>lB?=@(&A1mHp-%}@QpY2+M7HJ zKYY3Z{&K^Cc2*R@ul0s{f++Gi$&c;JX8mc84dreGlyT0JjSc0b`Vj0aPxx6By z+q1rv*p$@G1}^(o@x1JaI`5MeNTC-L*no?aKuIgfS{+fDWhjDl=9ROk;`fcGi>wz` zcCKd86T=HVObucPUE_P>#${(Z=eJ{O+<;D^q{toXugCm%xlmrao&asPU~*obJk3w1?`xICiYKd{3M%x{<~bi$ zTM6+iRg|K=hoyU!Y{&ZhBx~zSigw5CudxgEHO?)aNQ(G6bT{PnE94)xZ%Ki@7|iGe zxT%@!;+V5N9^cV2tJdTaIaZuh5Wad;=}g2^K*4mg6Wf~KM9*qA~54w_ZE=VpTXS9bbl)QH`1v%9KT+RJ@d1Qc3 zJdmXIP`mqTR$vDqB}VMLO_f%VIxs%KFOpQ6wzZ;G+@ENcs{F}$0XsmLAh4fnvEW`k zGWSr6-n>d0WLAZsdCy(!+zr@I+eO)TB?iZ31Y9!fPi`5R({tF$QbeB4glH>hQeQLKt+xw(*?je!N5 z=H%Y~tbt{)67Oh|geFmINew)ukqt|CO4BH^@xn~A&R<|7#x)RM{-`n8F{1sO3QpjR ztrUl|ov&(zfprrtf+0`8_%QuumCC&%=Dxqu2%1b^1o!Tn-+1(_#trnR{ zfqyeW8LPZzF8^kO8)kde0!#NXV&%UbQL2d(4+TKXcn6eOCo+h+B+QduDq5z@DiCv|dhB!G0G-TMN&Ly0%5Lms^j*$OFa9%ev6krj(AcjMb zj=dtIiy@#u1|q)%Bs zd3oZg73#3>JX{IR1}LukxeG47ArzqTht1{_#OCjRLzZifVX=Eqm9=@TIz*X4v%>{R1{1si$rRchoC-Qw76}K-i7>NCEOF{8Qk-Rb%YJv z&TGf@?h(HgBn15oAlRwYtvul#%(ho+Ulf1~@p?Y3P?$M732k5FY%B-8obWqr!I6%L zZ|$ojV{2&4_A70d>)1UAD$lZAEU7b7FK~_(n7eRr0Kbi?XOTq7}S4g(r0r?k3+*sR$ zPz$i%BB$jDj)INr);(!M_Yet=%(c|bNI~u$xSpZkb7b@WW)=Wr$3G8vS&6MbenOq= zm)%sQNa(E|v-}g6K6x}Gxz!%Z0&9VN9MsjSw`Z9v(ye6$2^uk${xYn&zMGvptx)+mB z%h+0qg5B&0K!hD%kV}9e{F^-ESVrxO{D2Vr7bEsmN+Xna##|XmK@HNvyuTH!^`#37 z#MXyGBCb3PHH!L>92UofyhB+r76c}`-5aM>2#=-(OZfypEv1EIo{)6CY{Z`*8>}AD zF<#IRuFzC?gK1|MIn-f{_WzPAALm)kk)b`R%r?I5__GBQVu17gJ(qFzT{Ilc8cZk! zzWY|E9ChHA!^XJ|Rcj+Wb3oU^n+tooYOlWrZFZ$x#!-M3KGx654@K=Jk`Do?y`y`O z3CO8oD;6kw3{d302+WMjxdFkW8cZeJT}p}Fo{sXrysvH%|Nf#(*&?!g7j?I7Q>#ZH zP>T3=8(=hZ%`-g~j(bI_5dy@s>LDHn?)5SVvJy&<0z61{Xb|A$m5q|b#EVi~vv=s! zwZO36H(3SzRXKZ{pHPp-DBX)FdYOw79Uo{u?v=3-#>9(UpSQrMmj9C8=|DN8nmScs zjeAbkkblx3zfSdOTpQW6ZPt}%=`U)=gagHg9$v(sI}mznC>cp2;>G&%a0K5|qP+nN zaIgumB3gyX4xg*Z!C$(kiN0Hm)9KVwJKj|4{ufmb6}ytP3|1Ra8=|{t(_)5OukVm3 zu~R)0)*VtM#ePdPN&O1#Pz%0yF&Q9OwPFj}M>p!T7J(;tKn%#p+C(1<)a9(hc4sIq zX`+9gN>BsCs_6RP)qgYMGlm(ux~a+q2{dgUtq4Rwsr{@i*ht^^pGLnwTImMnM&331 zx@?P5QbbH0s4Q@(PKZYuYO#hgL>nE5;oY5pHWTo84Teqwxs9(OYO;G<5HL7Qm^Zt7 z0F^og>bzAeUYOVtccR=MI`JypOkttWeR!pip5cY?9Z9N8hngq4w|wvD+)8#CqYQJ% zxw-qL<*-6vR@LrC$@A_fqgzb&w|uyU#9vewSSC+W-p^6YqM>)ICuf{_f;5-8lOFK> zgnb}Y#$)GqnurMVDiHf@x7l{p#D(v)WygQ*H$OwSJi}lsaQ3u_xC~k(mmrIIq(B1v zC3F&(VXV5VG)YBwQHYt%Rt(l)zZm+sGzj>(FxQHy>nI$^8IZpCs7#w9aT!8JoF`K9 z)n1Jgi8~EWrWVHL0~UnRb?4x%QjOuG!A*EN(>BT1JPWw`W;_f@J_p9*Xqx1Og>T%L z;w64L?^-E_c)sgOPT-!fzY%?p>cb^MUn^``n&y%2Eh6n7DAvNVi+UwA#+DPrfGj(qO?x5VwDoAYY|atjXguqHVcWYk%Q zbv&soeweY8oFG$&X7_O&y|~7FcZJuK2DdYFcGBtx@8+5NQmjWJ-n1WA6a*C7hLY@< zmf^jZ0^O^g5Fb08M}V!4BciL(yPPsGiZ7M$pT z#ASk~20vA~5TX+N`14o@I~oSDzI}WNNe-CJ?>rGC%0Dw-3~3Vb=*2z(+m3<|gL^|C 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 literal 116168 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%0Ag7&Z!vKsx%XFx+tCJ6{ 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¦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 diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm index bcb44af84b..2101a6045f 100644 --- a/modular_citadel/code/_onclick/hud/screen_objects.dm +++ b/modular_citadel/code/_onclick/hud/screen_objects.dm @@ -12,6 +12,7 @@ name = "toggle combat mode" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "combat_off" + var/mutable_appearance/flashy /obj/screen/combattoggle/Click() if(iscarbon(usr)) @@ -29,6 +30,19 @@ else icon_state = "combat_off" +/obj/screen/combattoggle/update_overlays() + . = ..() + var/mob/living/carbon/user = hud?.mymob + if(!istype(user) || !user.client) + return + + if((user.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE) && user.client.prefs.hud_toggle_flash) + if(!flashy) + flashy = mutable_appearance('icons/mob/screen_gen.dmi', "togglefull_flash") + if(flashy.color != user.client.prefs.hud_toggle_color) + flashy.color = user.client.prefs.hud_toggle_color + . += flashy //TODO - beg lummox jr for the ability to force mutable appearances or images to be created rendering from their first frame of animation rather than being based entirely around the client's frame count + /obj/screen/voretoggle name = "toggle vore mode" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm index 7199f0286e..89547c0feb 100644 --- a/modular_citadel/code/_onclick/hud/sprint.dm +++ b/modular_citadel/code/_onclick/hud/sprint.dm @@ -6,6 +6,7 @@ icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "act_sprint" layer = ABOVE_HUD_LAYER - 0.1 + var/mutable_appearance/flashy /obj/screen/sprintbutton/Click() if(ishuman(usr)) @@ -23,6 +24,19 @@ else icon_state = "act_sprint" +/obj/screen/sprintbutton/update_overlays() + . = ..() + var/mob/living/carbon/user = hud?.mymob + if(!istype(user) || !user.client) + return + + if((user.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) && user.client.prefs.hud_toggle_flash) + if(!flashy) + flashy = mutable_appearance('icons/mob/screen_gen.dmi', "togglehalf_flash") + if(flashy.color != user.client.prefs.hud_toggle_color) + flashy.color = user.client.prefs.hud_toggle_color + . += flashy + //Sprint buffer onscreen code. /datum/hud/var/obj/screen/sprint_buffer/sprint_buffer From ae2facc017c58b4397878b574072d8a4e146a6cf Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 26 Mar 2020 10:51:50 -0500 Subject: [PATCH 064/128] Automatic changelog generation for PR #11623 [ci skip] --- html/changelogs/AutoChangeLog-pr-11623.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11623.yml diff --git a/html/changelogs/AutoChangeLog-pr-11623.yml b/html/changelogs/AutoChangeLog-pr-11623.yml new file mode 100644 index 0000000000..69fe5dbc6e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11623.yml @@ -0,0 +1,4 @@ +author: "Bhijn" +delete-after: True +changes: + - rscadd: "Added a lfwb-inspired orbiting pixel + flashing outline animation to the sprint and combat mode buttons. This can be toggled via the preferences menu, and is completely independent from all HUD themes." From 38c37d75a3c787d4eca1593b2dbcb4a7c3bde971 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 17:15:45 +0100 Subject: [PATCH 065/128] Update bees.dm --- code/modules/mob/living/simple_animal/hostile/bees.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index ce7ab92e0c..75b2e90eff 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -268,11 +268,14 @@ to_chat(user, "You don't have enough royal bee jelly to split a bee in two!") else var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()] - if(R && S.reagents.has_reagent(R.type, 5)) + else if(R && S.reagents.has_reagent(R.type, 5)) S.reagents.remove_reagent(R.type,5) - queen.assign_reagent(R) - user.visible_message("[user] injects [src]'s genome with [R.name], mutating it's DNA!","You inject [src]'s genome with [R.name], mutating it's DNA!") - name = queen.name + if(R.can_synth) + queen.assign_reagent(R) + user.visible_message("[user] injects [src]'s genome with [R.name], mutating it's DNA!","You inject [src]'s genome with [R.name], mutating it's DNA!") + name = queen.name + else + user.visible_message("[user] injects [src]'s genome with [R.name]... but nothing happens.","You inject [src]'s genome with [R.name]... but nothing happens.") else to_chat(user, "You don't have enough units of that chemical to modify the bee's DNA!") ..() From 4e531518c3b240d9e023995a2022fba5515be878 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 17:20:57 +0100 Subject: [PATCH 066/128] Update bees.dm --- code/modules/mob/living/simple_animal/hostile/bees.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 75b2e90eff..f5454933c8 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -268,7 +268,7 @@ to_chat(user, "You don't have enough royal bee jelly to split a bee in two!") else var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()] - else if(R && S.reagents.has_reagent(R.type, 5)) + if(R && S.reagents.has_reagent(R.type, 5)) S.reagents.remove_reagent(R.type,5) if(R.can_synth) queen.assign_reagent(R) From ef3106aab6a4ddf58317d7c1d964c738de8f4925 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 19:24:56 +0100 Subject: [PATCH 067/128] Fixing a couple issues with sofas again. --- .../objects/structures/beds_chairs/sofa.dm | 1 + icons/obj/sofa.dmi | Bin 15709 -> 15681 bytes 2 files changed, 1 insertion(+) diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index e138e4d314..ea7875b6ba 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -3,6 +3,7 @@ icon_state = "sofamiddle" icon = 'icons/obj/sofa.dmi' buildstackamount = 1 + var/item_chair = null var/mutable_appearance/armrest /obj/structure/chair/sofa/Initialize() diff --git a/icons/obj/sofa.dmi b/icons/obj/sofa.dmi index 1d6510981b076c2a057988c8d43ef8f017842152..3f4d8349dc303c458e6cb96622661916adaa25e6 100644 GIT binary patch delta 15115 zcmZ9TWk4LkvbJ||hv4oZxI+l;gy8P(4he39y9Br38X&m4yGw8h1b271n{&SV{kZ#c zx2vbSrt7J*Jb0Il3^4MN3Or zOX<-<=cC$-uY`3yVZ=x+di1Q$fL}H0=^a@c`1mJO#-m?<(bI5DX8T{?7(2%|1KXC3 zVxq20gP(E7GGy5nWQ4_DrKfMl`VUVq>Ssyw!_Lt6*OQf`UN^QLXMn-%6TSx?Ig)Qr zsE_^OXtAwT*GAcKR@(Wr~3GX+ZzrB&Ft7&@d@p>J`Ok$ie5_t&E@fP0) zAruCVV^VR7QRMg0MdgWK5#XHBrSUCTez{KR*COrc(Q4sl!3 z>@Cm|vRa)*Uw0JJT1#@FFkU~&hShjuf0!UEdeI`W@Gob?{SIWI`UCEHmxoJg;O`;T zE?!+uzVBTL3!D_nJGOrNyc=qLnJq#%$u35nhVr9gBb!T;>Dq_8!}@$H$JGLMx1nf0 z3J>xCEoB6+9a%!5rtG#~*eR<=%)MGE2HnQ4yloqTg>MMo2&i@+H(~iYJ>@RBkzMV~ zO;OXAF6kN0SO6UO-ALTV3EYg+UZwV;E4TGYreiKG!dG51JYfl&w*orRr%0D_QAJO6 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 MkQc8IH3SFz4>9kc>i_@% delta 15115 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 From 759182ed9090b8170b5f1694af38046a00c481af Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 21:04:58 +0100 Subject: [PATCH 068/128] Update sofa.dm --- code/game/objects/structures/beds_chairs/sofa.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/beds_chairs/sofa.dm b/code/game/objects/structures/beds_chairs/sofa.dm index ea7875b6ba..48352814b5 100644 --- a/code/game/objects/structures/beds_chairs/sofa.dm +++ b/code/game/objects/structures/beds_chairs/sofa.dm @@ -3,7 +3,7 @@ icon_state = "sofamiddle" icon = 'icons/obj/sofa.dmi' buildstackamount = 1 - var/item_chair = null + item_chair = null var/mutable_appearance/armrest /obj/structure/chair/sofa/Initialize() From 265f67a8256ce319babb6bb795378de2b56d02c4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 26 Mar 2020 15:24:29 -0500 Subject: [PATCH 069/128] Automatic changelog generation for PR #11607 [ci skip] --- html/changelogs/AutoChangeLog-pr-11607.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11607.yml diff --git a/html/changelogs/AutoChangeLog-pr-11607.yml b/html/changelogs/AutoChangeLog-pr-11607.yml new file mode 100644 index 0000000000..46dac6a318 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11607.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Underwear now fulfills its purpose." + - rscadd: "Privates visibility preferences." From e368a7d8e39629c356c59d244e7b4456726e208e Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Thu, 26 Mar 2020 17:21:10 -0400 Subject: [PATCH 070/128] Update medical_tools.dm --- code/game/mecha/equipment/tools/medical_tools.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 7d44e7611c..1740ae560e 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -259,7 +259,8 @@ . = ..() create_reagents(max_volume, NO_REACT) syringes = new - known_reagents = list(/datum/reagent/medicine/epinephrine = "Epinephrine", /datum/reagent/medicine/charcoal = "Charcoal") + known_reagents = list(/datum/reagent/medicine/epinephrine = "Epinephrine", /datum/reagent/medicine/charcoal = "Charcoal", /datum/reagent/medicine/prussian_blue = "Prussian Blue", \ + /datum/reagent/medicine/dexalin = "Dexalin", /datum/reagent/medicine/insulin = "Insulin", /datum/reagent/medicine/kelotane = "Kelotane", /datum/reagent/medicine/bicaridine = "Bicaridine") processed_reagents = new /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() From 3c42e9eefd14f0944d2a9c46a3de4f33ba95826a Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 23:22:51 +0100 Subject: [PATCH 071/128] Moderately unoriginal PR title about runtime errors. --- code/modules/client/preferences.dm | 2 ++ code/modules/mob/living/brain/brain_item.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 ++ code/modules/mob/living/living.dm | 2 +- code/modules/projectiles/guns/energy.dm | 8 ++++---- .../code/datums/status_effects/chems.dm | 20 +++++++++---------- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 87330ce42c..23f45de99b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2131,6 +2131,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) toggles ^= MEMBER_PUBLIC if("gender") var/chosengender = input(user, "Select your character's gender.", "Gender Selection", gender) as null|anything in list(MALE,FEMALE,"nonbinary","object") + if(!chosengender) + return switch(chosengender) if("nonbinary") chosengender = PLURAL diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 3b64c35969..f32d84ae73 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -88,7 +88,7 @@ brainmob.stored_dna = new /datum/dna/stored(brainmob) C.dna.copy_dna(brainmob.stored_dna) if(HAS_TRAIT(L, TRAIT_NOCLONE)) - brainmob.status_traits[TRAIT_NOCLONE] = L.status_traits[TRAIT_NOCLONE] + LAZYSET(brainmob.status_traits, TRAIT_NOCLONE, L.status_traits[TRAIT_NOCLONE]) var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE) if(ZI) brainmob.set_species(ZI.old_species) //For if the brain is cloned diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 938f6531f1..8270bc7156 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -283,6 +283,8 @@ /mob/living/carbon/resist_buckle() . = FALSE + if(!buckled) + return if(restrained()) // too soon. if(last_special > world.time) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1309fae60c..2002fa638b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -715,7 +715,7 @@ return TRUE /mob/living/proc/resist_buckle() - buckled.user_unbuckle_mob(src,src) + buckled?.user_unbuckle_mob(src,src) /mob/living/proc/resist_fire() return diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index be43bc48fd..36a9bba295 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -65,10 +65,10 @@ update_icon() /obj/item/gun/energy/Destroy() - if(flags_1 & INITIALIZED_1) - QDEL_NULL(cell) - QDEL_LIST(ammo_type) - STOP_PROCESSING(SSobj, src) + //no need to delete them, since contents are already deleted in atom/movable/Destroy(). + cell = null + ammo_type = null + STOP_PROCESSING(SSobj, src) return ..() /obj/item/gun/energy/examine(mob/user) diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 82b3c39bb6..369fb377a5 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -23,11 +23,10 @@ owner.remove_status_effect(src) ..() -/datum/status_effect/chem/SGDF/on_remove(mob/living/carbon/M) +/datum/status_effect/chem/SGDF/on_remove() 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 synthetic 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 synthetic serum, leaving you to wonder where the other you is.") fermi_Clone = null return ..() @@ -193,15 +192,14 @@ log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!") originalmind.transfer_to(original) -/datum/status_effect/chem/astral_insurance/on_remove(mob/living/carbon/M) //God damnit get them home! - if(owner.mind == originalmind) //If they're home, HOORAY - return ..() - if(owner.mind) - var/mob/living/simple_animal/astral/G = new(get_turf(M.loc)) - owner.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(original) +/datum/status_effect/chem/astral_insurance/on_remove() //God damnit get them home! + if(owner.mind != originalmind) //If they're home, HOORAY + if(owner.mind) + var/mob/living/simple_animal/astral/G = new(get_turf(owner)) + owner.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, "[owner]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'") + log_game("FERMICHEM: [owner]'s possesser has been booted out into a astral ghost!") + originalmind.transfer_to(original) return ..() /*////////////////////////////////////////// From 1eb25e4880e0b25229707cb0ec16750fdc89f31f Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Thu, 26 Mar 2020 23:56:01 +0100 Subject: [PATCH 072/128] Update dna.dm --- code/datums/dna.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 4ddf74fc0a..95b45b6bc2 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -412,13 +412,13 @@ switch(deconstruct_block(getblock(dna.uni_identity, DNA_GENDER_BLOCK), 4)) if(G_MALE) - set_gender(MALE, TRUE) + set_gender(MALE, TRUE, forced = TRUE) if(G_FEMALE) - set_gender(FEMALE, TRUE) + set_gender(FEMALE, TRUE, forced = TRUE) if(G_PLURAL) - set_gender(PLURAL, TRUE) + set_gender(PLURAL, TRUE, forced = TRUE) else - set_gender(NEUTER, TRUE) + set_gender(NEUTER, TRUE, forced = TRUE) /mob/living/carbon/human/updateappearance(icon_update=1, mutcolor_update=0, mutations_overlay_update=0) ..() From b7c801a1730ef763484b44bf4aee2703f4921389 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 26 Mar 2020 18:06:53 -0500 Subject: [PATCH 073/128] Automatic changelog generation for PR #11622 [ci skip] --- html/changelogs/AutoChangeLog-pr-11622.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11622.yml diff --git a/html/changelogs/AutoChangeLog-pr-11622.yml b/html/changelogs/AutoChangeLog-pr-11622.yml new file mode 100644 index 0000000000..f1976ce8ea --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11622.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "mobs with antag statuses such as wizard, ert and nuke ops get their flavor text removed now." + - bugfix: "Fixed megafauna mobs, goliaths and \"anchored\" AIs being stuffable into closets." From a157a933c709c9cafa215cdcd77dd8a2476fec10 Mon Sep 17 00:00:00 2001 From: Ghom <42542238+Ghommie@users.noreply.github.com> Date: Fri, 27 Mar 2020 00:18:43 +0100 Subject: [PATCH 074/128] | --- code/modules/admin/admin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7be6269589..1df424815b 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -194,7 +194,7 @@ body += "Thunderdome Admin | " body += "Thunderdome Observer | " body += "Make mentor | " - body += "Remove mentor" + body += "Remove mentor | " body += "Allow reentering round" body += "
    " body += "" From 0c60294c0f6ba73cbc37b2ed15a18bf9f9970170 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 26 Mar 2020 16:21:10 -0700 Subject: [PATCH 075/128] does the quirky thing where a beam with origin/target in a container doesn't cut the map in half because byond is quirky and things inside things are x/y/z=0 (#11585) * Update beam.dm * god i hate this * Update beam.dm * ok * touching kevinz PR in an inappropriate way. Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> --- code/datums/beam.dm | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 2622b6ae39..6a9878e086 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -9,8 +9,8 @@ var/max_distance = 0 var/sleep_time = 3 var/finished = 0 - var/target_oldloc = null - var/origin_oldloc = null + var/turf/target_oldloc + var/turf/origin_oldloc var/static_beam = 0 var/beam_type = /obj/effect/ebeam //must be subtype var/timing_id = null @@ -23,13 +23,13 @@ target_oldloc = get_turf(target) sleep_time = beam_sleep_time if(origin_oldloc == origin && target_oldloc == target) - static_beam = 1 + static_beam = TRUE max_distance = maxdistance base_icon = new(beam_icon,beam_icon_state) icon = beam_icon icon_state = beam_icon_state beam_type = btype - if(time < INFINITY) + if(time < INFINITY) addtimer(CALLBACK(src,.proc/End), time) /datum/beam/proc/Start() @@ -42,10 +42,14 @@ return recalculating = TRUE timing_id = null - if(origin && target && get_dist(origin,target) Date: Thu, 26 Mar 2020 18:21:12 -0500 Subject: [PATCH 076/128] Automatic changelog generation for PR #11585 [ci skip] --- html/changelogs/AutoChangeLog-pr-11585.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11585.yml diff --git a/html/changelogs/AutoChangeLog-pr-11585.yml b/html/changelogs/AutoChangeLog-pr-11585.yml new file mode 100644 index 0000000000..78390b808e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11585.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - bugfix: "beams should no longer go across the map and mess everything up if their source or target isn't on a turf." From 9c1d6b46b420d9e983be9ffd8ac8fb483934c4c7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 26 Mar 2020 20:53:46 -0500 Subject: [PATCH 077/128] Automatic changelog generation for PR #11633 [ci skip] --- html/changelogs/AutoChangeLog-pr-11633.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11633.yml diff --git a/html/changelogs/AutoChangeLog-pr-11633.yml b/html/changelogs/AutoChangeLog-pr-11633.yml new file mode 100644 index 0000000000..87ba396950 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11633.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Blacklists unsynthetizable reagents from botany bees honey production." From dab993a6a790e555d64cf0cec70803b9fa1762b2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 26 Mar 2020 20:56:28 -0500 Subject: [PATCH 078/128] Automatic changelog generation for PR #11632 [ci skip] --- html/changelogs/AutoChangeLog-pr-11632.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11632.yml diff --git a/html/changelogs/AutoChangeLog-pr-11632.yml b/html/changelogs/AutoChangeLog-pr-11632.yml new file mode 100644 index 0000000000..01114f0772 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11632.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Chaplains are now inelegible for bloodsuckers." From 3a494e3a851d2e60400ae3cdc09b813ce7e72ea4 Mon Sep 17 00:00:00 2001 From: Putnam Date: Thu, 26 Mar 2020 19:50:13 -0700 Subject: [PATCH 079/128] Fixes an exploit involving WRAP. --- code/__DEFINES/maths.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 939f6698cb..b8a6ae1419 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -30,7 +30,7 @@ #define FLOOR(x, y) ( round((x) / (y)) * (y) ) // Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive -#define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ) +#define WRAP(val, min, max) CLAMP(( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ),min,max-1) // Real modulus that handles decimals #define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) ) @@ -201,4 +201,4 @@ #define RULE_OF_THREE(a, b, x) ((a*x)/b) // ) -#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y)) \ No newline at end of file +#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y)) From 879b626cd1cdd23bd431a9a4465dad7839ef986b Mon Sep 17 00:00:00 2001 From: TrilbySpaceClone Date: Fri, 27 Mar 2020 03:12:04 -0400 Subject: [PATCH 080/128] Et tu --- .../food_and_drinks/food/snacks_salad.dm | 9 +++++++++ .../recipes/tablecraft/recipes_salad.dm | 10 ++++++++++ code/modules/hydroponics/grown/misc.dm | 2 -- icons/obj/food/soupsalad.dmi | Bin 20805 -> 21242 bytes 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm index e272733235..a977eac3c2 100644 --- a/code/modules/food_and_drinks/food/snacks_salad.dm +++ b/code/modules/food_and_drinks/food/snacks_salad.dm @@ -116,3 +116,12 @@ bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 4) tastes = list("rice" = 1, "egg" = 1) foodtype = GRAIN | MEAT //EGG = MEAT -NinjaNomNom 2017 + +/obj/item/reagent_containers/food/snacks/salad/caesar + name = "caesar salad" + desc = "You too?" + icon_state = "ceasar_salad" + trash = /obj/item/kitchen/knife + bonus_reagents = list(/datum/reagent/medicine/earthsblood = 1, /datum/reagent/iron = 4) + tastes = list("iron" = 1, "conspiracy" = 1) + foodtype = VEGETABLES \ No newline at end of file diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm index 0a44c4590e..4c942a0c2d 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm @@ -84,3 +84,13 @@ ) result = /obj/item/reagent_containers/food/snacks/salad/validsalad subcategory = CAT_SALAD + +/datum/crafting_recipe/food/caesarsalad + name = "Caesar salad" + reqs = list( + /obj/item/kitchen/knife = 1, + /obj/item/reagent_containers/food/snacks/grown/ambrosia/gaia = 1, + /obj/item/reagent_containers/food/snacks/grown/cabbage = 1 + ) + result = /obj/item/reagent_containers/food/snacks/salad/caesar + subcategory = CAT_SALAD \ No newline at end of file diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 6ebfd3254f..aed6cbf93f 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -98,8 +98,6 @@ wine_power = 35 tastes = list("thistle" = 2, "artichoke" = 1) - - // Cabbage /obj/item/seeds/cabbage name = "pack of cabbage seeds" diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi index a6e492608f4ca5efa46619f8df2ddb799a2fddba..fd47e89aa8f90bd1c257301fc25ad84105d3da83 100644 GIT binary patch delta 3375 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 From aa07bf262a3191c96ed383b2fa4da6896cf81056 Mon Sep 17 00:00:00 2001 From: BlackMajor Date: Fri, 27 Mar 2020 20:32:53 +1300 Subject: [PATCH 081/128] lmao one line fix --- code/game/objects/structures/crates_lockers/closets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 71fcef753c..a9e7347657 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -441,7 +441,7 @@ /obj/structure/closet/relaymove(mob/user) if(user.stat || !isturf(loc) || !isliving(user)) return - if(locked) + if(locked || welded) if(message_cooldown <= world.time) message_cooldown = world.time + 50 to_chat(user, "[src]'s door won't budge!") From 593356348517677c9a900329a89c75d0b7bd9019 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Fri, 27 Mar 2020 13:43:28 +0100 Subject: [PATCH 082/128] one line fix to a box mapping issue --- _maps/map_files/BoxStation/BoxStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 82bfb49e38..d09ac36997 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -5903,7 +5903,7 @@ "alq" = ( /obj/machinery/door/airlock/security/glass{ name = "Evidence Storage"; - req_access_txt = "1" + req_access_txt = "4" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, From 1a6107a51846085dcc24fca70d3acf82049699c7 Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Fri, 27 Mar 2020 06:03:05 -0700 Subject: [PATCH 083/128] Removed nymphomania, plus code cleanup (#11641) --- code/controllers/subsystem/processing/quirks.dm | 6 +++--- code/datums/traits/neutral.dm | 8 -------- code/modules/client/preferences_savefile.dm | 1 - 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 5aeaf43bab..c57bac5526 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -37,11 +37,11 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(job?.blacklisted_quirks) cut = filter_quirks(my_quirks, job.blacklisted_quirks) for(var/V in my_quirks) - var/datum/quirk/Q = quirks[V] - if(Q) + if(V in quirks) + var/datum/quirk/Q = quirks[V] user.add_quirk(Q, spawn_effects) else - stack_trace("Invalid quirk \"[V]\" in client [cli.ckey] preferences") + log_admin("Invalid quirk \"[V]\" in client [cli.ckey] preferences") cli.prefs.all_quirks -= V badquirk = TRUE if(badquirk) diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index ab2a69e7e9..d1b5240798 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -88,14 +88,6 @@ if(quirk_holder) quirk_holder.remove_client_colour(/datum/client_colour/monochrome) -/datum/quirk/libido - name = "Nymphomania" - desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual." - value = 0 - mob_trait = TRAIT_PERMABONER - gain_text = "You are feeling extra wild." - lose_text = "You don't feel that burning sensation anymore." - /datum/quirk/maso name = "Masochism" desc = "You are aroused by pain." diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 749ac8c6db..7858bc099b 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -438,7 +438,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Citadel code S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"] - S["feature_exhibitionist"] >> features["exhibitionist"] S["feature_mcolor2"] >> features["mcolor2"] S["feature_mcolor3"] >> features["mcolor3"] S["feature_mam_body_markings"] >> features["mam_body_markings"] From bff77480d1d34172e3356ff938fb69c2c977ae78 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 27 Mar 2020 08:03:08 -0500 Subject: [PATCH 084/128] Automatic changelog generation for PR #11641 [ci skip] --- html/changelogs/AutoChangeLog-pr-11641.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11641.yml diff --git a/html/changelogs/AutoChangeLog-pr-11641.yml b/html/changelogs/AutoChangeLog-pr-11641.yml new file mode 100644 index 0000000000..27729e62e6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11641.yml @@ -0,0 +1,6 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscdel: "Nymphomania removed" + - code_imp: "Exhibitionism ignored by preferences now, since it was also removed" + - code_imp: "Quirk migration now does an admin log instead of a stack trace" From f7ce5e5de320f8dba8c84b6a48063ff28d968d09 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Fri, 27 Mar 2020 14:42:23 +0100 Subject: [PATCH 085/128] infiltrator sneaky shoes fix. --- code/__DEFINES/traits.dm | 1 + code/modules/clothing/shoes/miscellaneous.dm | 10 +++++++++- code/modules/ninja/suit/shoes.dm | 4 ++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 4f4b7c6baa..7bcdded17b 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -236,6 +236,7 @@ #define APHRO_TRAIT "aphro" #define BLOODSUCKER_TRAIT "bloodsucker" #define CLOTHING_TRAIT "clothing" //used for quirky carrygloves +#define SHOES_TRAIT "shoes" //inherited from your sweet kicks // unique trait sources, still defines #define STATUE_MUTE "statue" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 519e4e7fcd..32d9dd4483 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -25,7 +25,15 @@ icon_state = "sneakboots" item_state = "sneakboots" resistance_flags = FIRE_PROOF | ACID_PROOF - clothing_flags = TRAIT_SILENT_STEP + +/obj/item/clothing/shoes/combat/sneakboots/equipped(mob/user, slot) + . = ..() + if(slot == SLOT_SHOES) + ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) + +/obj/item/clothing/shoes/combat/sneakboots/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) /obj/item/clothing/shoes/combat/swat //overpowered boots for death squads name = "\improper SWAT boots" diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 1bda62e064..f2227b5f9f 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -15,8 +15,8 @@ /obj/item/clothing/shoes/space_ninja/equipped(mob/user, slot) . = ..() if(slot == SLOT_SHOES) - ADD_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]") + ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) /obj/item/clothing/shoes/space_ninja/dropped(mob/user) . = ..() - REMOVE_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]") + REMOVE_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) From 9ab0cccdec391240764b6e2fff718ab4eda41bd1 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Fri, 27 Mar 2020 19:52:33 +0100 Subject: [PATCH 086/128] porting stuff --- code/modules/client/client_defines.dm | 4 +++ code/modules/client/client_procs.dm | 36 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 2bdb743fc7..1deb702de4 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -14,6 +14,10 @@ var/jobbancache = null //Used to cache this client's jobbans to save on DB queries var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming. var/last_message_count = 0 //contins a number of how many times a message identical to last_message was sent. + ///How many messages sent in the last 10 seconds + var/total_message_count = 0 + ///Next tick to reset the total message counter + var/total_count_reset = 0 var/ircreplyamount = 0 ///////// diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 84096b1367..74885d0ac0 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -141,7 +141,43 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( return 0 return 1 +/* + * Call back proc that should be checked in all paths where a client can send messages + * + * Handles checking for duplicate messages and people sending messages too fast + * + * The first checks are if you're sending too fast, this is defined as sending + * SPAM_TRIGGER_AUTOMUTE messages in + * 5 seconds, this will start supressing your messages, + * if you send 2* that limit, you also get muted + * + * The second checks for the same duplicate message too many times and mutes + * you for it + */ /client/proc/handle_spam_prevention(message, mute_type) + + //Increment message count + total_message_count += 1 + + //store the total to act on even after a reset + var/cache = total_message_count + + if(total_count_reset <= world.time) + total_message_count = 0 + total_count_reset = world.time + (5 SECONDS) + + //If they're really going crazy, mute them + if(cache >= SPAM_TRIGGER_AUTOMUTE * 2) + total_message_count = 0 + total_count_reset = 0 + cmd_admin_mute(src, mute_type, 1) + return 1 + + //Otherwise just supress the message + else if(cache >= SPAM_TRIGGER_AUTOMUTE) + return 1 + + if(CONFIG_GET(flag/automute_on) && !holder && last_message == message) src.last_message_count++ if(src.last_message_count >= SPAM_TRIGGER_AUTOMUTE) From 7b34ebc9b50c63d38bf4cdce5f1ed456670cbe3b Mon Sep 17 00:00:00 2001 From: ZeroMan Date: Fri, 27 Mar 2020 17:13:45 -0400 Subject: [PATCH 087/128] commit not alive immediately --- code/modules/mob/dead/observer/observer.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index fb478355e8..5f6a716051 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -380,6 +380,23 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp transfer_ckey(mind.current, FALSE) return 1 +/mob/dead/observer/verb/stay_dead() + set category = "Ghost" + set name = "Do Not Resuscitate" + if(!client) + return + if(!can_reenter_corpse) + to_chat(usr, "You're already stuck out of your body!") + return FALSE + + var/response = alert(src, "Are you sure you want to prevent (almost) all means of resuscitation? This cannot be undone. ","Are you sure you want to stay dead?","DNR","Save Me") + if(response != "DNR") + return + + can_reenter_corpse = FALSE + to_chat(src, "You can no longer be brought back into your body.") + return TRUE + /mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source, flashwindow = TRUE) if(flashwindow) window_flash(client) From 41e2c60d4a4835e06be2739ed9a1a9c4d3b59c49 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Fri, 27 Mar 2020 22:52:43 +0100 Subject: [PATCH 088/128] Ports "Makes raw HTML and browser datum popups UTF-8 aware" --- code/datums/browser.dm | 4 ++-- code/datums/datumvars.dm | 1 + code/datums/elements/flavor_text.dm | 2 +- code/game/gamemodes/clock_cult/clock_cult.dm | 2 +- code/game/gamemodes/dynamic/dynamic.dm | 12 ++++++------ code/game/machinery/camera/camera.dm | 4 ++-- .../machinery/telecomms/machines/message_server.dm | 2 +- code/game/mecha/combat/honker.dm | 4 +++- code/game/mecha/equipment/tools/medical_tools.dm | 2 ++ code/game/mecha/mech_fabricator.dm | 3 ++- code/game/mecha/mecha_control_console.dm | 2 +- code/game/mecha/mecha_topic.dm | 11 ++++++++--- code/game/objects/items/blueprints.dm | 3 ++- code/game/objects/items/devices/PDA/PDA.dm | 4 ++-- code/game/objects/items/manuals.dm | 10 ++++++++++ code/game/objects/items/storage/book.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- code/modules/admin/admin.dm | 2 +- code/modules/admin/check_antagonists.dm | 2 +- code/modules/admin/permissionedit.dm | 4 +++- code/modules/admin/player_panel.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 4 ++-- code/modules/admin/verbs/randomverbs.dm | 6 +++--- .../antagonists/wizard/equipment/spellbook.dm | 2 +- code/modules/client/verbs/ooc.dm | 2 +- code/modules/events/holiday/vday.dm | 4 ++-- .../integrated_electronics/core/assemblies.dm | 2 +- .../core/integrated_circuit.dm | 2 +- code/modules/mapping/minimaps.dm | 3 ++- code/modules/mob/dead/new_player/new_player.dm | 2 +- code/modules/mob/dead/new_player/poll.dm | 3 ++- code/modules/mob/living/silicon/pai/software.dm | 3 ++- code/modules/mob/living/silicon/silicon.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 2 +- code/modules/paperwork/paper.dm | 8 ++++---- code/modules/photography/photos/photo.dm | 2 +- 36 files changed, 77 insertions(+), 50 deletions(-) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 0b784328ab..8b82c1812e 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -72,9 +72,9 @@ return {" - - + + [head_content] diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index a9830e58dc..81db7deb68 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -175,6 +175,7 @@ var/html = {" + [title] " + var/dat = "[src.name]" if(screen == 0) dat += "

    Tracking beacons data

    " var/list/trackerlist = list() diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 774e30fa5d..8d6328cf08 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -5,7 +5,9 @@ /obj/mecha/proc/get_stats_html() . = {" - [src.name] data + + + [name] data " + var/dat = "Personal Data Assistant" dat += assets.css_tag() dat += emoji_s.css_tag() @@ -1192,7 +1192,7 @@ GLOBAL_LIST_EMPTY(PDAs) if(incapacitated()) return if(!isnull(aiPDA)) - var/HTML = "AI PDA Message Log[aiPDA.tnote]" + var/HTML = "AI PDA Message Log[aiPDA.tnote]" user << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0") else to_chat(user, "You do not have a PDA. You should make an issue report about this.") diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 9631488397..210c3d0da0 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -14,6 +14,7 @@ //book contents below dat = {" +