From ccad1678ea9d1b12abd97c6aa3f5e0a628db0127 Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 04:20:41 +0100 Subject: [PATCH 01/16] New gential; Anus Ass cheeks next. and works with fleshlights and vibrators. --- _maps/_basemap.dm | 2 +- code/__HELPERS/mobs.dm | 1 + code/modules/client/preferences.dm | 9 ++ code/modules/client/preferences_savefile.dm | 6 +- .../code/modules/arousal/arousalhud.dm | 5 +- hyperstation/code/obj/fleshlight.dm | 85 ++++++++++-------- hyperstation/code/obj/vibrator.dm | 6 +- hyperstation/icons/obj/fleshlight.dmi | Bin 4186 -> 4369 bytes hyperstation/icons/obj/genitals/butt.dmi | Bin 0 -> 182 bytes .../code/modules/arousal/arousal.dm | 9 +- .../code/modules/arousal/organs/anus.dm | 25 ++++++ .../code/modules/arousal/organs/genitals.dm | 17 ++++ .../modules/client/preferences_savefile.dm | 2 + tgstation.dme | 1 + 14 files changed, 115 insertions(+), 53 deletions(-) create mode 100644 hyperstation/icons/obj/genitals/butt.dmi create mode 100644 modular_citadel/code/modules/arousal/organs/anus.dm diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 06d39087..34c6dc44 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ce17243b..5f6d0248 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -192,6 +192,7 @@ "inflatable_belly" = FALSE, "belly_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_balls" = FALSE, + "has_anus" = FALSE, "balls_internal" = FALSE, "balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "balls_amount" = 2, diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ab40a77c..9bc42104 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -142,6 +142,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "hide_belly" = FALSE, "inflatable_belly" = FALSE, "belly_color" = "fff", + "has_anus" = FALSE, "has_balls" = FALSE, "balls_internal" = FALSE, "balls_color" = "fff", @@ -920,6 +921,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Inflation (Climax With):[features["inflatable_belly"] == 1 ? "Yes" : "No"]" dat += "" + + dat += APPEARANCE_CATEGORY_COLUMN + dat += "

Anus

" + dat += "[features["has_anus"] == TRUE ? "Yes" : "No"]" + dat += "" + dat += "" dat += "" @@ -2502,6 +2509,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(features["has_vag"] == FALSE) features["has_womb"] = FALSE features["can_get_preg"] = FALSE + if("has_anus") + features["has_anus"] = !features["has_anus"] if("has_womb") features["has_womb"] = !features["has_womb"] if("can_get_preg") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ebd93b81..32c0f9e3 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 23 +#define SAVEFILE_VERSION_MAX 24 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -423,11 +423,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //womb features S["feature_has_womb"] >> features["has_womb"] S["feature_can_get_preg"] >> features["can_get_preg"] //hyperstation 13 - //balls features + //belly features S["feature_has_belly"] >> features["has_belly"] S["feature_belly_color"] >> features["belly_color"] S["feature_hide_belly"] >> features["hide_belly"] S["feature_inflatable_belly"] >> features["inflatable_belly"] + //anus features + S["feature_has_anus"] >> features["has_anus"] //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 92850f06..8f5b61f5 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -9,8 +9,9 @@ var/mob/living/carbon/U = user for(var/obj/item/organ/genital/G in U.internal_organs) - if(!G.dontlist) - dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visable" ? "[G.name] (Visable)" : "[G.name] (Visable)"))]
" + if(!G.nochange) + if(!G.dontlist) + dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visable" ? "[G.name] (Visable)" : "[G.name] (Visable)"))]
" dat += {"
Contexual Options

"} var/obj/item/organ/genital/penis/P = user.getorganslot("penis") diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm index 19aff71e..0befcc44 100644 --- a/hyperstation/code/obj/fleshlight.dm +++ b/hyperstation/code/obj/fleshlight.dm @@ -100,7 +100,7 @@ /obj/item/portallight/examine(mob/user) . = ..() if(!portalunderwear) - . += "The device is unpaired, to pair, swipe against a pair of portal panties(TM). " + . += "The device is unpaired, to pair, swipe against a pair of portal panties. " else . += "The device is paired, and awaiting input. " @@ -117,12 +117,12 @@ else option = "Fuck" - var/obj/item/organ/genital/vagina/V - if(istype(portalunderwear.loc, /obj/item/organ/genital/vagina)) //Sanity check. Without this it will runtime. - V = portalunderwear.loc - if(!V) + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime error. + G = portalunderwear.loc + if(!G) return - var/mob/living/carbon/human/M = V.owner + var/mob/living/carbon/human/M = G.owner if(option == "Fuck"&&!P.is_exposed()) //we are trying to fuck with no penis! to_chat(user, "You don't see anywhere to use this on.") @@ -156,7 +156,7 @@ M.emote("moan") if(option == "Fuck")// normal fuck - to_chat(M, "You feel a [P.shape] shaped penis pumping through the portal into your vagina.")//message your partner and kinky! + to_chat(M, "You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [G.name].")//message your partner, and kinky! if(prob(30)) //30% chance to make them moan. C.emote("moan") if(prob(30)) //30% chance to make your partner moan. @@ -166,10 +166,10 @@ M.do_jitter_animation() //make your partner shake too! if (M.getArousalLoss() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~ - if(V.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill - M.mob_climax_outside(V, spillage = TRUE) + if(G.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill + M.mob_climax_outside(G, spillage = TRUE) else - M.mob_climax_outside(V, spillage = FALSE) + M.mob_climax_outside(G, spillage = FALSE) if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna()) var/mob/living/carbon/human/O = C @@ -180,10 +180,10 @@ O.mob_climax_partner(P, M, FALSE, TRUE, FALSE, TRUE) //climax with their partner remotely, and impreg because people keep asking! if(option == "Lick") - to_chat(M, "You feel a tongue lick you through the portal against your vagina.") + to_chat(M, "You feel a tongue lick you through the portal against your [G.name].") M.adjustArousalLoss(10) if(option == "Touch") - to_chat(M, "You feel someone touching your vagina through the portal.") + to_chat(M, "You feel someone touching your [G.name] through the portal.") M.adjustArousalLoss(5) return @@ -193,13 +193,14 @@ //get their looks and vagina colour! cut_overlays()//remove current overlays - var/obj/item/organ/genital/vagina/V - if(istype(portalunderwear.loc, /obj/item/organ/genital/vagina)) //Sanity check. Without this it will runtime. - V = portalunderwear.loc - if(!V) + var/obj/item/organ/genital/G + if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime. + G = portalunderwear.loc + if(!G) useable = FALSE return - var/mob/living/carbon/human/H = V.owner + + var/mob/living/carbon/human/H = G.owner if(H) //if the portal panties are on someone. sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal") @@ -215,8 +216,12 @@ sleeve.color = "#" + H.dna.features["mcolor"] add_overlay(sleeve) - organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") - organ.color = portalunderwear.loc.color + if(G.name == "vagina") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") + organ.color = portalunderwear.loc.color + if(G.name == "anus") + organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus") + organ.color = "#" + H.dna.features["mcolor"] useable = TRUE add_overlay(organ) @@ -224,7 +229,7 @@ useable = FALSE //Hyperstation 13 portal underwear -//can be attached to vagina, just like the vibrator, still requires pairing with the portallight +//can be attached to vagina or anus, just like the vibrator, still requires pairing with the portallight /obj/item/portalpanties name = "portal panties" @@ -235,6 +240,7 @@ w_class = WEIGHT_CLASS_SMALL var/obj/item/portallight var/attached = FALSE + var/shapetype = "vagina" /obj/item/portalpanties/examine(mob/user) . = ..() @@ -267,33 +273,34 @@ var/obj/item/organ/genital/picked_organ var/mob/living/carbon/human/S = user var/mob/living/carbon/human/T = C - picked_organ = S.target_genitals(T) //allowing to pick organ for anus down the line + picked_organ = S.target_genitals(T) if(picked_organ) C.visible_message("[user] is trying to attach [src] to [T]!",\ "[user] is trying to put [src] on you!") - if(!do_mob(user, C, 5 SECONDS))//warn them and have a delay of 5 seconds to apply. + if(!do_mob(user, C, 3 SECONDS))//warn them and have a delay of 5 seconds to apply. return - if(!(picked_organ.name == "vagina")) //only fits on a vagina - to_chat(user, "[src] can only be attached to a vagina.") - return + if((picked_organ.name == "vagina")||(picked_organ.name == "anus")) //only fits on a vagina or anus - if(!picked_organ.equipment) - to_chat(user, "You wrap [src] around [T]'s [picked_organ.name].") + src.shapetype = picked_organ.name + if(!picked_organ.equipment) + to_chat(user, "You wrap [src] around [T]'s [picked_organ.name].") + else + to_chat(user, "They already have [picked_organ.equipment.name] there.") + return + + if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in + return + src.attached = TRUE + picked_organ.equipment = src + + var/obj/item/portallight/P = portallight + //now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh. + if(P) //just to make sure + P.updatesleeve() else - to_chat(user, "They already have a [picked_organ.equipment.name] there.") + to_chat(user, "[src] can only be attached to a vagina or anus.") return - - if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in - return - src.attached = TRUE - picked_organ.equipment = src - - var/obj/item/portallight/P = portallight - //now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh. - if(P) //just to make sure - P.updatesleeve() - else to_chat(user, "You don't see anywhere to attach this.") diff --git a/hyperstation/code/obj/vibrator.dm b/hyperstation/code/obj/vibrator.dm index b6655af9..51f49594 100644 --- a/hyperstation/code/obj/vibrator.dm +++ b/hyperstation/code/obj/vibrator.dm @@ -115,12 +115,10 @@ Code: if(G) switch(G.name) //just being fancy - if("penis") - to_chat(U, "[src] vibrates against your [G.name]!") if("breasts") to_chat(U, "[src] vibrates against your nipples!") - if("vagina") - to_chat(U, "[src] vibrates inside you!") + else + to_chat(U, "[src] vibrates against your [G.name]!") var/intencity = 6*mode U.adjustArousalLoss(intencity) //give pleasure diff --git a/hyperstation/icons/obj/fleshlight.dmi b/hyperstation/icons/obj/fleshlight.dmi index e40a8dd67fb7a9af8ef72213d33602e8ec50ab04..fe41d26e27b4b53357c57fe74f8b288cf5d15920 100644 GIT binary patch literal 4369 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 YviWJV+O++V^0NS-uVbv;sO230AG7@$l>h($ diff --git a/hyperstation/icons/obj/genitals/butt.dmi b/hyperstation/icons/obj/genitals/butt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf literal 0 HcmV?d00001 diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index beb5f8b9..4a9ff931 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -321,7 +321,7 @@ src.visible_message("[src] orgasms with [p_their()] [G.name]!", \ "You climax with your [G.name].", \ "You climax using your [G.name].") - + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) if(G.can_climax) setArousalLoss(min_arousal) @@ -522,10 +522,9 @@ var/list/worn_stuff = get_equipped_items() for(var/obj/item/organ/genital/G in T.internal_organs) - if(G.can_climax) //filter out what you can't masturbate with - if(G.is_exposed(worn_stuff)) //Nude or through_clothing - if(!G.dontlist) - genitals_list += G + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G if(genitals_list.len) ret_organ = input(src, "", "Genitals", null) as null|obj in genitals_list return ret_organ diff --git a/modular_citadel/code/modules/arousal/organs/anus.dm b/modular_citadel/code/modules/arousal/organs/anus.dm new file mode 100644 index 00000000..2652d361 --- /dev/null +++ b/modular_citadel/code/modules/arousal/organs/anus.dm @@ -0,0 +1,25 @@ +/obj/item/organ/genital/anus + name = "anus" + desc = "" + zone = "groin" + slot = "anus" + w_class = 3 + size = 0 + var/statuscheck = FALSE + masturbation_verb = "massage" + can_climax = FALSE //no poo poo 4 u + nochange = TRUE + + +/obj/item/organ/genital/anus/Initialize() + . = ..() + +/obj/item/organ/genital/anus/on_life() + if(QDELETED(src)) + return + if(!owner) + return + + + + diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 83bb73e8..9cba98e8 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -25,6 +25,7 @@ var/mode = "clothes" var/obj/item/equipment //for fun stuff that goes on the gentials/maybe rings down the line var/dontlist = FALSE + var/nochange = FALSE //stops people changing visablity. /obj/item/organ/genital/Initialize() . = ..() @@ -67,6 +68,8 @@ return owner.is_chest_exposed() if("groin") return owner.is_groin_exposed() + if("anus") + return owner.is_groin_exposed() return FALSE @@ -150,6 +153,8 @@ if (NOGENITALS in dna.species.species_traits) return //Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in. + if(dna.features["has_anus"]) + give_anus() if(dna.features["has_vag"]) give_vagina() if(dna.features["has_womb"]) @@ -239,6 +244,18 @@ if(dna.features["inflatable_belly"]) //autohide bellies if they have the option ticked. B.inflatable = TRUE +/mob/living/carbon/human/proc/give_anus() + if(!dna) + return FALSE + if(NOGENITALS in dna.species.species_traits) + return FALSE + if(!getorganslot("anus")) + var/obj/item/organ/genital/anus/A = new + A.Insert(src) + if(A) + A.color = "#[skintone2hex(skin_tone)]" + A.update() + /mob/living/carbon/human/proc/give_breasts() diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index 7b09b997..e2a7383d 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -96,6 +96,8 @@ WRITE_FILE(S["feature_belly_color"], features["belly_color"]) WRITE_FILE(S["feature_hide_belly"], features["hide_belly"]) WRITE_FILE(S["feature_inflatable_belly"], features["inflatable_belly"]) + //anus + WRITE_FILE(S["feature_has_anus"], features["has_anus"]) //gear loadout if(islist(chosen_gear)) diff --git a/tgstation.dme b/tgstation.dme index 0bca9ad0..cb439391 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3240,6 +3240,7 @@ #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" #include "modular_citadel\code\modules\arousal\arousal.dm" +#include "modular_citadel\code\modules\arousal\organs\anus.dm" #include "modular_citadel\code\modules\arousal\organs\belly.dm" #include "modular_citadel\code\modules\arousal\organs\breasts.dm" #include "modular_citadel\code\modules\arousal\organs\eggsack.dm" From 318ddee354da52c8d8d872f96f8ef17c47cd9bf0 Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 04:21:45 +0100 Subject: [PATCH 02/16] remove lowmem mode. remove lowmem mode. --- _maps/_basemap.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 34c6dc44..06d39087 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" From ad51c98d66c9cc31aaad88975141e6e05c8f49ca Mon Sep 17 00:00:00 2001 From: Archie Date: Tue, 20 Jul 2021 02:22:38 -0300 Subject: [PATCH 03/16] Removes the tania plush --- hyperstation/icons/obj/plushes.dmi | Bin 8627 -> 8333 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/hyperstation/icons/obj/plushes.dmi b/hyperstation/icons/obj/plushes.dmi index 55bd43a5c479fafb423ec173dd11403a19066f20..1f67aedf6285bc3a1aea942dcfb3bed93ecbae9f 100644 GIT binary patch literal 8333 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 aJYl_o&g(fFXH2310zN6KDpbmuhWsB-gctn) From f7cc8e0d76e400ec13dd277e56845050e81fb901 Mon Sep 17 00:00:00 2001 From: Archie Date: Tue, 20 Jul 2021 02:47:58 -0300 Subject: [PATCH 04/16] We don't even use this file. --- icons/mob/suit_digi.dmi | Bin 420250 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/mob/suit_digi.dmi diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi deleted file mode 100644 index 88c30722398dd18aa2cfbdb764efe96ecd142454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420250 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%0A$k+ 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

Anus

" + dat += "

Butt

" dat += "
[features["has_anus"] == TRUE ? "Yes" : "No"]" + if(features["has_anus"]) + dat += "Butt Size: [features["butt_size"]]" dat += "" dat += "" @@ -2347,6 +2350,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_bellysize) features["belly_size"] = clamp(new_bellysize, 1, 3) + if("butt_size") + var/new_buttsize = input(user, "Butt size :\n(0-4)", "Character Preference") as num|null + features["butt_size"] = clamp(new_buttsize, 0, 4) + if("vag_shape") var/new_shape new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list @@ -2511,6 +2518,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["can_get_preg"] = FALSE if("has_anus") features["has_anus"] = !features["has_anus"] + if(features["has_anus"] == FALSE) + features["butt_size"] = 0 if("has_womb") features["has_womb"] = !features["has_womb"] if("can_get_preg") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 32c0f9e3..71379b48 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -402,6 +402,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_has_sheath"] >> features["sheath_color"] //belly size S["feature_belly_size"] >> features["belly_size"] + //belly size + S["feature_butt_size"] >> features["butt_size"] //balls features S["feature_has_balls"] >> features["has_balls"] S["feature_balls_color"] >> features["balls_color"] diff --git a/hyperstation/icons/obj/genitals/butt.dmi b/hyperstation/icons/obj/genitals/butt.dmi index cf74d73796c8c6121c0818fdac74e4a7f0ab9a5f..08e60ea537a81387adc836fd9f84b79de9058520 100644 GIT binary patch literal 2528 zcmZ8gc{JOJ7XBrq6ve1+Xi-B;Rbxug4oOji)>3<|Lxjc>`!*U0)!ON3Q^rnsTh`^Ww6z2|=C+;i{!(rm4NIV2`01^~bz3v*LD z008ZWz`Ur?zMn2N_t^($+Zzto_EF$>ajLbM&*$@aJSvq+tEw0t9`^S3-rCw)Utedj zSPKga6B85rokK%I8yg!$BJsg= z?0o_#($3l*fHU6v?I)$bIk-fcA|nvtsL)7M2pRxli?XQCC6l1ieQODNk)aA;ARkk8a%&(Z@j#kA?~Uh8gJ9quK|5o3ePRC1>B&KKnz>M7aOUa2K2R4&;B z8`GL&ZsRjB7C>4&A z7R~)OVIl+bU<*qX;r??x( z*otks!qLYzseZrYNaeKFZ_k~csSiOyxNaE&kK~v5Ed18_A6|UGCc1g09BtEp#K3NP zOt_;1q*)DE=Sz+HvoNd_NNfwMtAdVZuND`1xOdEF6Or zyp$z-(2%m82a4ZN#B>x$XG2rK`UMHv@zs?Z%*DP}dd6Ct0)9l!Tt-t$&84}je%bNC zAGzLvU);R&4#4PNX6HSI6Klb#Oqm0i_pUqMXDPrEsz78_s>9q-1{;_Kgt?pbq|{d` zri|%6fF1m_dabwOp*v%T1*mryXmT3QZTei1u&#p4 z#(G0}3N~0|IZ7%uU@S2rdOWf$q=s!J;>%7vGE2W5FA_ z@SoVZK<8fTwvPwUCDIHyj5Y)4o46{aglyXw?ej{ZDCK*G!YB>8N^F3o@NF9Cv9SL1 z1SFq5%_LWcwg~Nf^sov3I{i2kq}1}%h&b1C<@m$T0V1s}d-9d-$Rqed%dTRZt8-dk zRUoaED&-SGk8l^V8rOeS8!FQJ<(o63L- ztO2V;9pFue>aM}tdQs@?jL{@1nmlyw%2&zltAzjQ`}*k16dM&&|httQD6NN z$k&F>FWfsPlKXu#$m`_YpF71loGGI~%CT<-+SrB$DW!*n$?d+~&vJo5-?#*FMycXP z#UHR~z2U?v^&yJhvTW1(9Z*^ho@4cluB&5#Lvj}2ja}~O6>JNZjZ-LEJi2S=Hk3cO z&glc+!!yNWeLfMl++Cfotdt+ z1-EzZ#j|c}clLcb_$RI6q^^#!2TY4YOo7=AOc-V0&RcP?{;#O8TD7GkpMKEfruGZ9Twwb@B0 zW{EbLi8M@h*ikq;NhL*b(kL&->DZAsA*(v36_1KPS!RUB#>IIsrLq6MGYI{>P^TgjOOMF3Etl=h%x)n>*w z#PZ~mNfPxHH-s+mQO0(v%z{y&lBDW{2F4BP7qefiGJ z`O(ExC$U}q>gp_-q9RE}od#76bC8yE8;!VLJr*R0wDa7adeaYc?_)R`M&_+oedWas z*gPv4UBZN7jP&dJV4UByMFAN|C9fl&k9hk%w86zysblCSv2<*}Gr zcAnVuvG>E=#TP(_cLV)%=O)V5FU`6bY_=AxU}iwf#VJx>C0qL$Bia-@t>tHqagnEP z`i*;YRgAVgzqCl^d1`oYf`bpmTWjRaZY4;AT zElftK&3P>Yysjut?C!Qiz7betFXjs$&w?CBNk}*eumumz$zb#CW#j|@)jMLQofdqQ zoIbE!2c`zw1bae?I*>YvF&6^es#OXaWK@!x|rhUGJ`Ghr&pq9A^8q z=9NlbobFY@ti_&dQR!R-uoknG~(UiVXCly^cx#@f&_j>;!KH~w2k ba~W7*Ej}-pi6l1vyI^t6+O)y=*QCDy)#%nh literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?im@cfFPOpM z*^M-ilB$r15|`BC)e_1!5cyiE*d|0 zq;uX!^CUx2Pwx&3;~?Y9#$F0CsjT7l;v3i)KHlcf^{%~V4K$R;)5S4_V`g%K#2p}S W0R!VxY5#RV7K5j&pUXO@geCygCOLEf diff --git a/modular_citadel/code/modules/arousal/organs/anus.dm b/modular_citadel/code/modules/arousal/organs/anus.dm index 2652d361..5652aa84 100644 --- a/modular_citadel/code/modules/arousal/organs/anus.dm +++ b/modular_citadel/code/modules/arousal/organs/anus.dm @@ -1,18 +1,19 @@ /obj/item/organ/genital/anus name = "anus" - desc = "" + desc = "You see a butt." + icon_state = "butt" + icon = 'modular_citadel/icons/obj/genitals/breasts.dmi' zone = "groin" slot = "anus" w_class = 3 size = 0 var/statuscheck = FALSE + shape = "Pair" masturbation_verb = "massage" - can_climax = FALSE //no poo poo 4 u - nochange = TRUE + can_climax = FALSE + -/obj/item/organ/genital/anus/Initialize() - . = ..() /obj/item/organ/genital/anus/on_life() if(QDELETED(src)) @@ -21,5 +22,15 @@ return +/obj/item/organ/genital/anus/update_appearance() + var/string + if(owner) + var/mob/living/carbon/human/H = owner + color = "#[skintone2hex(H.skin_tone)]" + if(ishuman(owner)) + icon_state = sanitize_text(string) + H.update_genitals() + + icon_state = sanitize_text(string) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 9cba98e8..35564daa 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -251,6 +251,8 @@ return FALSE if(!getorganslot("anus")) var/obj/item/organ/genital/anus/A = new + if(dna.features["butt_size"]) + A.size = dna.features["butt_size"] A.Insert(src) if(A) A.color = "#[skintone2hex(skin_tone)]" @@ -443,6 +445,8 @@ S = GLOB.breasts_shapes_list[G.shape] if(/obj/item/organ/genital/belly) S = GLOB.breasts_shapes_list[G.shape] + if(/obj/item/organ/genital/anus) + S = GLOB.breasts_shapes_list[G.shape] if(!S || S.icon_state == "none") continue @@ -461,11 +465,24 @@ //Get the icon genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]" colourcode = S.color_src + if(G.slot == "belly") //we have a different size system genital_overlay.icon = 'hyperstation/icons/obj/genitals/belly.dmi' genital_overlay.icon_state = "belly_[size]" colourcode = "belly_color" + if(G.slot == "anus") //we have a different size system + genital_overlay.icon = 'hyperstation/icons/obj/genitals/butt.dmi' + genital_overlay.icon_state = "butt_[size]" + genital_overlay.layer = -FRONT_MUTATIONS_LAYER + colourcode = "butt_color" + if(use_skintones) //butts are forced a colour, either skin tones, or main colour. how ever, mutants use a darker version, because of their body tone. + genital_overlay.color = "#[skintone2hex(H.skin_tone)]" + genital_overlay.icon_state = "butt_[size]" + else + genital_overlay.color = "#[H.dna.features["mcolor"]]" + genital_overlay.icon_state = "butt_[size]_m" + if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) @@ -488,6 +505,7 @@ if("belly_color") genital_overlay.color = "#[H.dna.features["belly_color"]]" + standing += genital_overlay if(LAZYLEN(standing)) diff --git a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm index ae86c097..8fe929e8 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals_sprite_accessories.dm @@ -136,7 +136,7 @@ icon_state = "gaping" name = "Gaping" -//BREASTS BE HERE +//BELLY BE HERE /datum/sprite_accessory/belly icon = 'hyperstation/icons/obj/genitals/belly.dmi' icon_state = "belly" @@ -145,6 +145,15 @@ color_src = "belly_color" locked = 0 +//BUTT BE HERE +/datum/sprite_accessory/anus + icon = 'hyperstation/icons/obj/genitals/butt.dmi' + icon_state = "butt" + name = "butt" + gender_specific = 0 + color_src = "butt_color" + locked = 0 + //BREASTS BE HERE /datum/sprite_accessory/breasts icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi' diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index e2a7383d..1b1a2997 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -63,6 +63,8 @@ WRITE_FILE(S["feature_has_sheath"], features["sheath_color"]) //belly feature WRITE_FILE(S["feature_belly_size"], features["belly_size"]) + //butt feature + WRITE_FILE(S["feature_butt_size"], features["butt_size"]) //balls features WRITE_FILE(S["feature_has_balls"], features["has_balls"]) WRITE_FILE(S["feature_balls_color"], features["balls_color"]) From e661136269589ebda8ff4ccb86388b5a9a7e9e8b Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 12:16:56 +0100 Subject: [PATCH 09/16] do_not_cover_butt = true new thing. --- code/__HELPERS/_cit_helpers.dm | 8 ++++++++ code/game/objects/items.dm | 2 ++ hyperstation/code/obj/kinkyclothes.dm | 1 + .../code/modules/clothing/under/polychromic_clothes.dm | 7 ++++++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index 952f4021..ae8dd0fe 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -158,6 +158,14 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) return FALSE return TRUE +/mob/living/carbon/proc/is_butt_exposed(var/list/L) + if(!L) + L = get_equipped_items() + for(var/obj/item/I in L) + if(I.body_parts_covered & GROIN & !do_not_cover_butt) + return FALSE + return TRUE + /mob/living/carbon/proc/is_chest_exposed(var/list/L) if(!L) L = get_equipped_items() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index a11eae78..d0253d00 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -124,6 +124,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) //Hyper economy var/price = 0 + //Hyper, for clothes that reveal your behind! butt stuff, you know how it is. + var/do_not_cover_butt = false /obj/item/Initialize() diff --git a/hyperstation/code/obj/kinkyclothes.dm b/hyperstation/code/obj/kinkyclothes.dm index 06d65362..7231091f 100644 --- a/hyperstation/code/obj/kinkyclothes.dm +++ b/hyperstation/code/obj/kinkyclothes.dm @@ -86,6 +86,7 @@ obj/item/clothing/neck/stole/black item_state = "r_suit" can_adjust = FALSE mutantrace_variation = NO_MUTANTRACE_VARIATION + do_not_cover_butt = true /obj/item/clothing/under/sexynursesuit name = "Sexy nurse outfit" diff --git a/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm b/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm index a5514898..acfa4704 100644 --- a/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm +++ b/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm @@ -144,6 +144,7 @@ primary_color = "#FFFFFF" //RGB in hexcode secondary_color = "#8CC6FF" body_parts_covered = GROIN + do_not_cover_butt = true /obj/item/clothing/under/polychromic/bottomless name = "polychromic bottomless shirt" @@ -177,6 +178,7 @@ primary_color = "#808080" //RGB in hexcode secondary_color = "#FFFFFF" body_parts_covered = CHEST|GROIN + do_not_cover_butt = true /obj/item/clothing/under/polychromic/stripper name = "polychromic stripper outfit" @@ -188,6 +190,7 @@ primary_color = "#808080" //RGB in hexcode secondary_color = "#FFFFFF" body_parts_covered = CHEST|GROIN + do_not_cover_butt = true /obj/item/clothing/under/polychromic/bulge name = "polychromic voluminous thong" @@ -199,6 +202,7 @@ primary_color = "#808080" //RGB in hexcode secondary_color = "#FF3535" body_parts_covered = GROIN + do_not_cover_butt = true /obj/item/clothing/under/polychromic/shortsbra name = "Kromatic Shorts and Top" @@ -231,4 +235,5 @@ primary_color = "#010052" //RGB in hexcode secondary_color = "#eb7a7a" tertiary_color = "#ffffff" - body_parts_covered = CHEST|GROIN \ No newline at end of file + body_parts_covered = CHEST|GROIN + do_not_cover_butt = true \ No newline at end of file From 4e09683c2874dd529a5633f8dc2bd7e682042540 Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 12:19:41 +0100 Subject: [PATCH 10/16] Dont rush these things... --- code/__HELPERS/_cit_helpers.dm | 2 +- code/game/objects/items.dm | 2 +- hyperstation/code/obj/kinkyclothes.dm | 2 +- .../code/modules/clothing/under/polychromic_clothes.dm | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index ae8dd0fe..89486c36 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -162,7 +162,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) if(!L) L = get_equipped_items() for(var/obj/item/I in L) - if(I.body_parts_covered & GROIN & !do_not_cover_butt) + if(I.body_parts_covered & GROIN & !I.do_not_cover_butt) return FALSE return TRUE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d0253d00..43ac13fb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -125,7 +125,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/price = 0 //Hyper, for clothes that reveal your behind! butt stuff, you know how it is. - var/do_not_cover_butt = false + var/do_not_cover_butt = FALSE /obj/item/Initialize() diff --git a/hyperstation/code/obj/kinkyclothes.dm b/hyperstation/code/obj/kinkyclothes.dm index 7231091f..dbdcbd05 100644 --- a/hyperstation/code/obj/kinkyclothes.dm +++ b/hyperstation/code/obj/kinkyclothes.dm @@ -86,7 +86,7 @@ obj/item/clothing/neck/stole/black item_state = "r_suit" can_adjust = FALSE mutantrace_variation = NO_MUTANTRACE_VARIATION - do_not_cover_butt = true + do_not_cover_butt = TRUE /obj/item/clothing/under/sexynursesuit name = "Sexy nurse outfit" diff --git a/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm b/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm index acfa4704..a91e5b81 100644 --- a/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm +++ b/modular_citadel/code/modules/clothing/under/polychromic_clothes.dm @@ -144,7 +144,7 @@ primary_color = "#FFFFFF" //RGB in hexcode secondary_color = "#8CC6FF" body_parts_covered = GROIN - do_not_cover_butt = true + do_not_cover_butt = TRUE /obj/item/clothing/under/polychromic/bottomless name = "polychromic bottomless shirt" @@ -178,7 +178,7 @@ primary_color = "#808080" //RGB in hexcode secondary_color = "#FFFFFF" body_parts_covered = CHEST|GROIN - do_not_cover_butt = true + do_not_cover_butt = TRUE /obj/item/clothing/under/polychromic/stripper name = "polychromic stripper outfit" @@ -190,7 +190,7 @@ primary_color = "#808080" //RGB in hexcode secondary_color = "#FFFFFF" body_parts_covered = CHEST|GROIN - do_not_cover_butt = true + do_not_cover_butt = TRUE /obj/item/clothing/under/polychromic/bulge name = "polychromic voluminous thong" @@ -202,7 +202,7 @@ primary_color = "#808080" //RGB in hexcode secondary_color = "#FF3535" body_parts_covered = GROIN - do_not_cover_butt = true + do_not_cover_butt = TRUE /obj/item/clothing/under/polychromic/shortsbra name = "Kromatic Shorts and Top" @@ -236,4 +236,4 @@ secondary_color = "#eb7a7a" tertiary_color = "#ffffff" body_parts_covered = CHEST|GROIN - do_not_cover_butt = true \ No newline at end of file + do_not_cover_butt = TRUE \ No newline at end of file From 2008649eb3997e4b4d90ad1cd819fa15d4f36527 Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 12:20:49 +0100 Subject: [PATCH 11/16] pain pain --- modular_citadel/code/modules/arousal/organs/genitals.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 35564daa..a33c68d8 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -69,7 +69,7 @@ if("groin") return owner.is_groin_exposed() if("anus") - return owner.is_groin_exposed() + return owner.is_butt_exposed() return FALSE From 4e404560d1c11e42783dfe0f56886760e15dfd0e Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 12:27:17 +0100 Subject: [PATCH 12/16] finally. --- modular_citadel/code/modules/arousal/organs/anus.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/code/modules/arousal/organs/anus.dm b/modular_citadel/code/modules/arousal/organs/anus.dm index 5652aa84..8e0f5564 100644 --- a/modular_citadel/code/modules/arousal/organs/anus.dm +++ b/modular_citadel/code/modules/arousal/organs/anus.dm @@ -3,7 +3,7 @@ desc = "You see a butt." icon_state = "butt" icon = 'modular_citadel/icons/obj/genitals/breasts.dmi' - zone = "groin" + zone = "anus" slot = "anus" w_class = 3 size = 0 From 362e3346cc06e992b4f75caa597c4d730cdfcc7c Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 12:51:03 +0100 Subject: [PATCH 13/16] Fix. --- code/__HELPERS/_cit_helpers.dm | 7 +++++-- modular_citadel/code/modules/arousal/arousal.dm | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index 89486c36..5ce2bd13 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -162,8 +162,11 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) if(!L) L = get_equipped_items() for(var/obj/item/I in L) - if(I.body_parts_covered & GROIN & !I.do_not_cover_butt) - return FALSE + if(I.body_parts_covered & GROIN) + if(!I.do_not_cover_butt) + return FALSE + else + return TRUE return TRUE /mob/living/carbon/proc/is_chest_exposed(var/list/L) diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 4a9ff931..97d8ac36 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -78,6 +78,9 @@ amt_nude++ if(getorganslot("vagina")) amt_nude++ + if(is_butt_exposed()) + if(getorganslot("anus")) + amt_nude++ if(amt_nude) var/watchers = 0 for(var/mob/_M in view(world.view, src)) From 29cb1a0ae96defa9206da8169188716230eacf03 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 4 Apr 2020 19:19:25 -0700 Subject: [PATCH 14/16] Ports the VV Refactor by Kevinz. --- code/__DEFINES/vv.dm | 102 + code/__HELPERS/reagents.dm | 29 + code/__HELPERS/type_processing.dm | 60 + code/datums/datumvars.dm | 1478 +---------- code/game/atoms.dm | 1905 ++++++------- code/game/atoms_movable.dm | 5 +- code/game/objects/objs.dm | 573 ++-- code/modules/admin/admin_verbs.dm | 1 + code/modules/admin/callproc/callproc.dm | 208 ++ code/modules/admin/verbs/debug.dm | 268 -- code/modules/admin/verbs/randomverbs.dm | 25 - .../admin/view_variables/admin_delete.dm | 24 + .../admin/view_variables/debug_variables.dm | 76 + .../admin/view_variables/get_variables.dm | 271 ++ .../admin/view_variables/mark_datum.dm | 12 + .../mass_edit_variables.dm} | 16 +- .../modify_variables.dm} | 306 +-- code/modules/admin/view_variables/topic.dm | 128 + .../admin/view_variables/topic_basic.dm | 51 + .../admin/view_variables/topic_list.dm | 43 + .../admin/view_variables/view_variables.dm | 269 ++ code/modules/events/spacevine.dm | 16 +- code/modules/mob/living/carbon/carbon.dm | 123 +- code/modules/mob/living/carbon/human/human.dm | 2362 +++++++++-------- code/modules/mob/living/living.dm | 15 + code/modules/mob/mob.dm | 75 +- tgstation.dme | 13 +- 27 files changed, 4093 insertions(+), 4361 deletions(-) create mode 100644 code/__HELPERS/type_processing.dm create mode 100644 code/modules/admin/callproc/callproc.dm create mode 100644 code/modules/admin/view_variables/admin_delete.dm create mode 100644 code/modules/admin/view_variables/get_variables.dm create mode 100644 code/modules/admin/view_variables/mark_datum.dm rename code/modules/admin/{verbs/massmodvar.dm => view_variables/mass_edit_variables.dm} (94%) rename code/modules/admin/{verbs/modifyvariables.dm => view_variables/modify_variables.dm} (60%) create mode 100644 code/modules/admin/view_variables/topic.dm create mode 100644 code/modules/admin/view_variables/topic_basic.dm create mode 100644 code/modules/admin/view_variables/topic_list.dm create mode 100644 code/modules/admin/view_variables/view_variables.dm diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 0617c5d3..ec7a1108 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -19,3 +19,105 @@ #define VV_RESTORE_DEFAULT "Restore to Default" #define VV_MARKED_DATUM "Marked Datum" #define VV_BITFIELD "Bitfield" +#define VV_TEXT_LOCATE "Custom Reference Locate" +#define VV_PROCCALL_RETVAL "Return Value of Proccall" + +#define VV_MSG_MARKED "
Marked Object" +#define VV_MSG_EDITED "
Var Edited" +#define VV_MSG_DELETED "
Deleted" + +#define VV_NORMAL_LIST_NO_EXPAND_THRESHOLD 50 +#define VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD 150 + +//#define IS_VALID_ASSOC_KEY(V) (istext(V) || ispath(V) || isdatum(V) || islist(V)) +#define IS_VALID_ASSOC_KEY(V) (!isnum(V)) //hhmmm.. + +//General helpers +#define VV_HREF_TARGET_INTERNAL(target, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[REF(target)]" +#define VV_HREF_TARGETREF_INTERNAL(targetref, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[targetref]" +#define VV_HREF_TARGET(target, href_key, text) "[text]" +#define VV_HREF_TARGETREF(targetref, href_key, text) "[text]" +#define VV_HREF_TARGET_1V(target, href_key, text, varname) "[text]" //for stuff like basic varedits, one variable +#define VV_HREF_TARGETREF_1V(targetref, href_key, text, varname) "[text]" + +#define GET_VV_TARGET locate(href_list[VV_HK_TARGET]) +#define GET_VV_VAR_TARGET href_list[VV_HK_VARNAME] + +//Helper for getting something to vv_do_topic in general +#define VV_TOPIC_LINK(datum, href_key, text) "text" + +//Helpers for vv_get_dropdown() +#define VV_DROPDOWN_OPTION(href_key, name) . += "" + +// VV HREF KEYS +#define VV_HK_TARGET "target" +#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targetting hrefs. + +// vv_do_list() keys +#define VV_HK_LIST_ADD "listadd" +#define VV_HK_LIST_EDIT "listedit" +#define VV_HK_LIST_CHANGE "listchange" +#define VV_HK_LIST_REMOVE "listremove" +#define VV_HK_LIST_ERASE_NULLS "listnulls" +#define VV_HK_LIST_ERASE_DUPES "listdupes" +#define VV_HK_LIST_SHUFFLE "listshuffle" +#define VV_HK_LIST_SET_LENGTH "listlen" + +// vv_do_basic() keys +#define VV_HK_BASIC_EDIT "datumedit" +#define VV_HK_BASIC_CHANGE "datumchange" +#define VV_HK_BASIC_MASSEDIT "massedit" + +// /datum +#define VV_HK_DELETE "delete" +#define VV_HK_EXPOSE "expose" +#define VV_HK_CALLPROC "proc_call" +#define VV_HK_MARK "mark" +#define VV_HK_MODIFY_TRAITS "modtraits" + +// /atom +#define VV_HK_MODIFY_TRANSFORM "atom_transform" +#define VV_HK_ADD_REAGENT "addreagent" +#define VV_HK_TRIGGER_EMP "empulse" +#define VV_HK_TRIGGER_EXPLOSION "explode" +#define VV_HK_AUTO_RENAME "auto_rename" + +// /obj +#define VV_HK_OSAY "osay" +#define VV_HK_MASS_DEL_TYPE "mass_delete_type" +#define VV_HK_ARMOR_MOD "mod_obj_armor" + +// /mob +#define VV_HK_GIB "gib" +#define VV_HK_GIVE_SPELL "give_spell" +#define VV_HK_REMOVE_SPELL "remove_spell" +#define VV_HK_GIVE_DISEASE "give_disease" +#define VV_HK_GODMODE "godmode" +#define VV_HK_DROP_ALL "dropall" +#define VV_HK_REGEN_ICONS "regen_icons" +#define VV_HK_PLAYER_PANEL "player_panel" +#define VV_HK_BUILDMODE "buildmode" +#define VV_HK_DIRECT_CONTROL "direct_control" +#define VV_HK_OFFER_GHOSTS "offer_ghosts" + +// /mob/living/carbon +#define VV_HK_MAKE_AI "aiify" +#define VV_HK_MODIFY_BODYPART "mod_bodypart" +#define VV_HK_MODIFY_ORGANS "organs_modify" +#define VV_HK_HALLUCINATION "force_hallucinate" +#define VV_HK_MARTIAL_ART "give_martial_art" +#define VV_HK_GIVE_TRAUMA "give_trauma" +#define VV_HK_CURE_TRAUMA "cure_trauma" + +// /mob/living/carbon/human +#define VV_HK_COPY_OUTFIT "copy_outfit" +#define VV_HK_MOD_QUIRKS "quirkmod" +#define VV_HK_MAKE_MONKEY "human_monkify" +#define VV_HK_MAKE_CYBORG "human_cyborgify" +#define VV_HK_MAKE_SLIME "human_slimeify" +#define VV_HK_MAKE_ALIEN "human_alienify" +#define VV_HK_SET_SPECIES "setspecies" +#define VV_HK_PURRBATION "purrbation" + +// misc +#define VV_HK_SPACEVINE_PURGE "spacevine_purge" diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index f1208abd..fa655efc 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -72,3 +72,32 @@ if(!GLOB.chemical_reactions_list[primary_reagent]) GLOB.chemical_reactions_list[primary_reagent] = list() GLOB.chemical_reactions_list[primary_reagent] += R + +/proc/choose_reagent_id(mob/user) + var/chosen_id + switch(alert(user, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky")) + if("Search") + var/valid_id + while(!valid_id) + chosen_id = input(user, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text + if(isnull(chosen_id)) //Get me out of here! + break + if(!ispath(text2path(chosen_id))) + chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent))) + if(ispath(chosen_id)) + valid_id = TRUE + else + valid_id = TRUE + if(!valid_id) + to_chat(user, "A reagent with that ID doesn't exist!") + if("Choose from a list") + chosen_id = input(user, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent) + if("I'm feeling lucky") + chosen_id = pick(subtypesof(/datum/reagent)) + return chosen_id + +/proc/find_reagent_object_from_type(input) + if(GLOB.chemical_reagents_list[input]) //prefer IDs! + return GLOB.chemical_reagents_list[input] + else + return null diff --git a/code/__HELPERS/type_processing.dm b/code/__HELPERS/type_processing.dm new file mode 100644 index 00000000..ac7e5cab --- /dev/null +++ b/code/__HELPERS/type_processing.dm @@ -0,0 +1,60 @@ + +/proc/make_types_fancy(var/list/types) + if (ispath(types)) + types = list(types) + . = list() + for(var/type in types) + var/typename = "[type]" + var/static/list/TYPES_SHORTCUTS = list( + /obj/effect/decal/cleanable = "CLEANABLE", + /obj/item/radio/headset = "HEADSET", + /obj/item/clothing/head/helmet/space = "SPESSHELMET", + /obj/item/book/manual = "MANUAL", + /obj/item/reagent_containers/food/drinks = "DRINK", //longest paths comes first + /obj/item/reagent_containers/food = "FOOD", + /obj/item/reagent_containers = "REAGENT_CONTAINERS", + /obj/machinery/atmospherics = "ATMOS_MECH", + /obj/machinery/portable_atmospherics = "PORT_ATMOS", + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", + /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", + /obj/item/organ = "ORGAN", + /obj/item = "ITEM", + /obj/machinery = "MACHINERY", + /obj/effect = "EFFECT", + /obj = "O", + /datum = "D", + /turf/open = "OPEN", + /turf/closed = "CLOSED", + /turf = "T", + /mob/living/carbon = "CARBON", + /mob/living/simple_animal = "SIMPLE", + /mob/living = "LIVING", + /mob = "M" + ) + for (var/tn in TYPES_SHORTCUTS) + if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) + typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) + break + .[typename] = type + +/proc/get_fancy_list_of_atom_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(typesof(/atom)) + return pre_generated_list + + +/proc/get_fancy_list_of_datum_types() + var/static/list/pre_generated_list + if (!pre_generated_list) //init + pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) + return pre_generated_list + + +/proc/filter_fancy_list(list/L, filter as text) + var/list/matches = new + for(var/key in L) + var/value = L[key] + if(findtext("[key]", filter) || findtext("[value]", filter)) + matches[key] = value + return matches diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 65b1ce35..f97fde6f 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1,1428 +1,50 @@ -#define VV_MSG_MARKED "
Marked Object" -#define VV_MSG_EDITED "
Var Edited" -#define VV_MSG_DELETED "
Deleted" - -/datum/proc/CanProcCall(procname) - return TRUE - -/datum/proc/can_vv_get(var_name) - return TRUE - -/datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited - if(var_name == NAMEOF(src, vars)) - return FALSE - vars[var_name] = var_value - datum_flags |= DF_VAR_EDITED - return TRUE - -/datum/proc/vv_get_var(var_name) - switch(var_name) - if ("vars") - return debug_variable(var_name, list(), 0, src) - return debug_variable(var_name, vars[var_name], 0, src) - -//please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down -//add separaters by doing . += "---" -/datum/proc/vv_get_dropdown() - . = list() - . += "---" - .["Call Proc"] = "?_src_=vars;[HrefToken()];proc_call=\ref[src]" - .["Mark Object"] = "?_src_=vars;[HrefToken()];mark_object=\ref[src]" - .["Delete"] = "?_src_=vars;[HrefToken()];delete=\ref[src]" - .["Show VV To Player"] = "?_src_=vars;[HrefToken(TRUE)];expose=\ref[src]" - - -/datum/proc/on_reagent_change(changetype) - return - - -/client/proc/debug_variables(datum/D in world) - set category = "Debug" - set name = "View Variables" - //set src in world - var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round. - - if(!usr.client || !usr.client.holder) //The usr vs src abuse in this proc is intentional and must not be changed - to_chat(usr, "You need to be an administrator to access this.") - return - - if(!D) - return - - var/islist = islist(D) - if (!islist && !istype(D)) - return - - var/title = "" - var/refid = "\ref[D]" - var/icon/sprite - var/hash - - var/type = /list - if (!islist) - type = D.type - - if(istype(D, /atom)) - var/atom/AT = D - if(AT.icon && AT.icon_state) - sprite = new /icon(AT.icon, AT.icon_state) - hash = md5(AT.icon) - hash = md5(hash + AT.icon_state) - src << browse_rsc(sprite, "vv[hash].png") - - title = "[D] ([REF(D)]) = [type]" - var/formatted_type = replacetext("[type]", "/", "/") - - var/sprite_text - if(sprite) - sprite_text = "" - var/list/atomsnowflake = list() - - if(istype(D, /atom)) - var/atom/A = D - if(isliving(A)) - atomsnowflake += "[D]" - atomsnowflake += "
<< [dir2text(A.dir) || A.dir] >>" - var/mob/living/M = A - atomsnowflake += {" -
[M.ckey || "No ckey"] / [M.real_name || "No real name"] -
- BRUTE:[M.getBruteLoss()] - FIRE:[M.getFireLoss()] - TOXIN:[M.getToxLoss()] - OXY:[M.getOxyLoss()] - CLONE:[M.getCloneLoss()] - BRAIN:[M.getOrganLoss(ORGAN_SLOT_BRAIN)] - STAMINA:[M.getStaminaLoss()] - AROUSAL:[M.getArousalLoss()] - "} - if(GLOB.Debug2) - atomsnowflake += {" - HEART:[M.getOrganLoss(ORGAN_SLOT_HEART)] - LIVER:[M.getOrganLoss(ORGAN_SLOT_LIVER)] - LUNGS:[M.getOrganLoss(ORGAN_SLOT_LUNGS)] - EYES:[M.getOrganLoss(ORGAN_SLOT_EYES)] - EARS:[M.getOrganLoss(ORGAN_SLOT_EARS)] - STOMACH:[M.getOrganLoss(ORGAN_SLOT_STOMACH)] - TONGUE:[M.getOrganLoss(ORGAN_SLOT_TONGUE)] - APPENDIX:[M.getOrganLoss(ORGAN_SLOT_APPENDIX)] - "} - atomsnowflake += {" - - "} - else - atomsnowflake += "[D]" - atomsnowflake += "
<< [dir2text(A.dir) || A.dir] >>" - else if("name" in D.vars) - atomsnowflake += "[D]" - else - atomsnowflake += "[formatted_type]" - formatted_type = null - - var/marked - if(holder && holder.marked_datum && holder.marked_datum == D) - marked = VV_MSG_MARKED - var/varedited_line = "" - if(!islist && (D.datum_flags & DF_VAR_EDITED)) - varedited_line = VV_MSG_EDITED - var/deleted_line - if(!islist && D.gc_destroyed) - deleted_line = VV_MSG_DELETED - - var/list/dropdownoptions = list() - if (islist) - dropdownoptions = list( - "---", - "Add Item" = "?_src_=vars;[HrefToken()];listadd=[refid]", - "Remove Nulls" = "?_src_=vars;[HrefToken()];listnulls=[refid]", - "Remove Dupes" = "?_src_=vars;[HrefToken()];listdupes=[refid]", - "Set len" = "?_src_=vars;[HrefToken()];listlen=[refid]", - "Shuffle" = "?_src_=vars;[HrefToken()];listshuffle=[refid]", - "Show VV To Player" = "?_src_=vars;[HrefToken()];expose=[refid]" - ) - else - dropdownoptions = D.vv_get_dropdown() - var/list/dropdownoptions_html = list() - - for (var/name in dropdownoptions) - var/link = dropdownoptions[name] - if (link) - dropdownoptions_html += "" - else - dropdownoptions_html += "" - - var/list/names = list() - if (!islist) - for (var/V in D.vars) - names += V - sleep(1)//For some reason, without this sleep, VVing will cause client to disconnect on certain objects. - - var/list/variable_html = list() - if (islist) - var/list/L = D - for (var/i in 1 to L.len) - var/key = L[i] - var/value - if (IS_NORMAL_LIST(L) && !isnum(key)) - value = L[key] - variable_html += debug_variable(i, value, 0, D) - else - - names = sortList(names) - for (var/V in names) - if(D.can_vv_get(V)) - variable_html += D.vv_get_var(V) - - var/html = {" - - - [title] - - - - -
- - - - - -
- - - - -
- [sprite_text] -
- [atomsnowflake.Join()] -
-
-
- [formatted_type] - [marked] - [varedited_line] - [deleted_line] -
-
-
- Refresh -
- -
-
-
-
-
- - E - Edit, tries to determine the variable type by itself.
- C - Change, asks you for the var type first.
- M - Mass modify: changes this variable for all objects of this type.
-
-
- - - - - -
-
- Search: -
-
- -
-
-
    - [variable_html.Join()] -
- - - -"} - src << browse(html, "window=variables[refid];size=475x650") - - -/client/proc/vv_update_display(datum/D, span, content) - src << output("[span]:[content]", "variables\ref[D].browser:replace_span") - - -#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing ) -/proc/debug_variable(name, value, level, datum/DA = null, sanitize = TRUE) - var/header - if(DA) - if (islist(DA)) - var/index = name - if (value) - name = DA[name] //name is really the index until this line - else - value = DA[name] - header = "
  • (E) (C) (-) " - else - header = "
  • (E) (C) (M) " - else - header = "
  • " - - var/item - if (isnull(value)) - item = "[VV_HTML_ENCODE(name)] = null" - - else if (istext(value)) - item = "[VV_HTML_ENCODE(name)] = \"[VV_HTML_ENCODE(value)]\"" - - else if (isicon(value)) - #ifdef VARSICON - var/icon/I = new/icon(value) - var/rnd = rand(1,10000) - var/rname = "tmp\ref[I][rnd].png" - usr << browse_rsc(I, rname) - item = "[VV_HTML_ENCODE(name)] = ([value]) " - #else - item = "[VV_HTML_ENCODE(name)] = /icon ([value])" - #endif - - else if (isfile(value)) - item = "[VV_HTML_ENCODE(name)] = '[value]'" - - else if (istype(value, /datum)) - var/datum/D = value - if ("[D]" != "[D.type]") //if the thing as a name var, lets use it. - item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D] [D.type]" - else - item = "[VV_HTML_ENCODE(name)] [REF(value)] = [D.type]" - - else if (islist(value)) - var/list/L = value - var/list/items = list() - - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? 50 : 150))) - for (var/i in 1 to L.len) - var/key = L[i] - var/val - if (IS_NORMAL_LIST(L) && !isnum(key)) - val = L[key] - if (isnull(val)) // we still want to display non-null false values, such as 0 or "" - val = key - key = i - - items += debug_variable(key, val, level + 1, sanitize = sanitize) - - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])
      [items.Join()]
    " - else - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" - - else if (name in GLOB.bitfields) - var/list/flags = list() - for (var/i in GLOB.bitfields[name]) - if (value & GLOB.bitfields[name][i]) - flags += i - item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(jointext(flags, ", "))]" - else - item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(value)]" - - return "[header][item]
  • " - -#undef VV_HTML_ENCODE - -/client/proc/view_var_Topic(href, href_list, hsrc) - if( (usr.client != src) || !src.holder || !holder.CheckAdminHref(href, href_list)) - return - if(href_list["Vars"]) - debug_variables(locate(href_list["Vars"])) - - else if(href_list["datumrefresh"]) - var/datum/DAT = locate(href_list["datumrefresh"]) - if(!DAT) //can't be an istype() because /client etc aren't datums - return - src.debug_variables(DAT) - - else if(href_list["mob_player_panel"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["mob_player_panel"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.holder.show_player_panel(M) - - else if(href_list["godmode"]) - if(!check_rights(R_ADMIN)) - return - - var/mob/M = locate(href_list["godmode"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.cmd_admin_godmode(M) - - else if(href_list["mark_object"]) - if(!check_rights(NONE)) - return - - var/datum/D = locate(href_list["mark_object"]) - if(!istype(D)) - to_chat(usr, "This can only be done to instances of type /datum") - return - - if(holder.marked_datum) - vv_update_display(holder.marked_datum, "marked", "") - holder.marked_datum = D - vv_update_display(D, "marked", VV_MSG_MARKED) - - else if(href_list["proc_call"]) - if(!check_rights(NONE)) - return - - var/T = locate(href_list["proc_call"]) - - if(T) - callproc_datum(T) - - else if(href_list["delete"]) - if(!check_rights(R_DEBUG, 0)) - return - - var/datum/D = locate(href_list["delete"]) - if(!istype(D)) - to_chat(usr, "Unable to locate item!") - admin_delete(D) - if (isturf(D)) // show the turf that took its place - debug_variables(D) - - else if(href_list["osay"]) - if(!check_rights(R_FUN, 0)) - return - usr.client.object_say(locate(href_list["osay"])) - - else if(href_list["regenerateicons"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["regenerateicons"]) in GLOB.mob_list - if(!ismob(M)) - to_chat(usr, "This can only be done to instances of type /mob") - return - M.regenerate_icons() - else if(href_list["expose"]) - if(!check_rights(R_ADMIN, FALSE)) - return - var/thing = locate(href_list["expose"]) - if (!thing) - return - var/value = vv_get_value(VV_CLIENT) - if (value["class"] != VV_CLIENT) - return - var/client/C = value["value"] - if (!C) - return - var/prompt = alert("Do you want to grant [C] access to view this VV window? (they will not be able to edit or change anything nor open nested vv windows unless they themselves are an admin)", "Confirm", "Yes", "No") - if (prompt != "Yes" || !usr.client) - return - message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") - log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [thing]") - to_chat(C, "[usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") - C.debug_variables(thing) - - -//Needs +VAREDIT past this point - - else if(check_rights(R_VAREDIT)) - - - //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). - - if(href_list["rename"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["rename"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - var/new_name = stripped_input(usr,"What would you like to name this mob?","Input a name",M.real_name,MAX_NAME_LEN) - if( !new_name || !M ) - return - - message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") - M.fully_replace_character_name(M.real_name,new_name) - vv_update_display(M, "name", new_name) - vv_update_display(M, "real_name", M.real_name || "No real name") - - else if(href_list["varnameedit"] && href_list["datumedit"]) - if(!check_rights(NONE)) - return - - var/datum/D = locate(href_list["datumedit"]) - if(!istype(D, /datum)) - to_chat(usr, "This can only be used on datums") - return - - if (!modify_variables(D, href_list["varnameedit"], 1)) - return - switch(href_list["varnameedit"]) - if("name") - vv_update_display(D, "name", "[D]") - if("dir") - if(isatom(D)) - var/dir = D.vars["dir"] - vv_update_display(D, "dir", dir2text(dir) || dir) - if("ckey") - if(isliving(D)) - vv_update_display(D, "ckey", D.vars["ckey"] || "No ckey") - if("real_name") - if(isliving(D)) - vv_update_display(D, "real_name", D.vars["real_name"] || "No real name") - - else if(href_list["varnamechange"] && href_list["datumchange"]) - if(!check_rights(NONE)) - return - - var/D = locate(href_list["datumchange"]) - if(!istype(D, /datum)) - to_chat(usr, "This can only be used on datums") - return - - modify_variables(D, href_list["varnamechange"], 0) - - else if(href_list["varnamemass"] && href_list["datummass"]) - if(!check_rights(NONE)) - return - - var/datum/D = locate(href_list["datummass"]) - if(!istype(D)) - to_chat(usr, "This can only be used on instances of type /datum") - return - - cmd_mass_modify_object_variables(D, href_list["varnamemass"]) - - else if(href_list["listedit"] && href_list["index"]) - var/index = text2num(href_list["index"]) - if (!index) - return - - var/list/L = locate(href_list["listedit"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - mod_list(L, null, "list", "contents", index, autodetect_class = TRUE) - - else if(href_list["listchange"] && href_list["index"]) - var/index = text2num(href_list["index"]) - if (!index) - return - - var/list/L = locate(href_list["listchange"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - mod_list(L, null, "list", "contents", index, autodetect_class = FALSE) - - else if(href_list["listremove"] && href_list["index"]) - var/index = text2num(href_list["index"]) - if (!index) - return - - var/list/L = locate(href_list["listremove"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - var/variable = L[index] - var/prompt = alert("Do you want to remove item number [index] from list?", "Confirm", "Yes", "No") - if (prompt != "Yes") - return - L.Cut(index, index+1) - log_world("### ListVarEdit by [src]: /list's contents: REMOVED=[html_encode("[variable]")]") - log_admin("[key_name(src)] modified list's contents: REMOVED=[variable]") - message_admins("[key_name_admin(src)] modified list's contents: REMOVED=[variable]") - - else if(href_list["listadd"]) - var/list/L = locate(href_list["listadd"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - mod_list_add(L, null, "list", "contents") - - else if(href_list["listdupes"]) - var/list/L = locate(href_list["listdupes"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - uniqueList_inplace(L) - log_world("### ListVarEdit by [src]: /list contents: CLEAR DUPES") - log_admin("[key_name(src)] modified list's contents: CLEAR DUPES") - message_admins("[key_name_admin(src)] modified list's contents: CLEAR DUPES") - - else if(href_list["listnulls"]) - var/list/L = locate(href_list["listnulls"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - listclearnulls(L) - log_world("### ListVarEdit by [src]: /list contents: CLEAR NULLS") - log_admin("[key_name(src)] modified list's contents: CLEAR NULLS") - message_admins("[key_name_admin(src)] modified list's contents: CLEAR NULLS") - - else if(href_list["listlen"]) - var/list/L = locate(href_list["listlen"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - var/value = vv_get_value(VV_NUM) - if (value["class"] != VV_NUM) - return - - L.len = value["value"] - log_world("### ListVarEdit by [src]: /list len: [L.len]") - log_admin("[key_name(src)] modified list's len: [L.len]") - message_admins("[key_name_admin(src)] modified list's len: [L.len]") - - else if(href_list["listshuffle"]) - var/list/L = locate(href_list["listshuffle"]) - if (!istype(L)) - to_chat(usr, "This can only be used on instances of type /list") - return - - shuffle_inplace(L) - log_world("### ListVarEdit by [src]: /list contents: SHUFFLE") - log_admin("[key_name(src)] modified list's contents: SHUFFLE") - message_admins("[key_name_admin(src)] modified list's contents: SHUFFLE") - - else if(href_list["give_spell"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["give_spell"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.give_spell(M) - - else if(href_list["remove_spell"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["remove_spell"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - remove_spell(M) - - else if(href_list["give_disease"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["give_disease"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.give_disease(M) - - else if(href_list["gib"]) - if(!check_rights(R_FUN)) - return - - var/mob/M = locate(href_list["gib"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.cmd_admin_gib(M) - - else if(href_list["build_mode"]) - if(!check_rights(R_BUILDMODE)) - return - - var/mob/M = locate(href_list["build_mode"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - togglebuildmode(M) - - else if(href_list["drop_everything"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["drop_everything"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - if(usr.client) - usr.client.cmd_admin_drop_everything(M) - - else if(href_list["direct_control"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["direct_control"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - if(usr.client) - usr.client.cmd_assume_direct_control(M) - - else if(href_list["offer_control"]) - if(!check_rights(NONE)) - return - - var/mob/M = locate(href_list["offer_control"]) in GLOB.mob_list - if(!istype(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - offer_control(M) - - else if (href_list["modarmor"]) - if(!check_rights(NONE)) - return - - var/obj/O = locate(href_list["modarmor"]) - if(!istype(O)) - to_chat(usr, "This can only be used on instances of type /obj") - return - - var/list/pickerlist = list() - var/list/armorlist = O.armor.getList() - - for (var/i in armorlist) - pickerlist += list(list("value" = armorlist[i], "name" = i)) - - var/list/result = presentpicker(usr, "Modify armor", "Modify armor: [O]", Button1="Save", Button2 = "Cancel", Timeout=FALSE, inputtype = "text", values = pickerlist) - - if (islist(result)) - if (result["button"] == 2) // If the user pressed the cancel button - return - // text2num conveniently returns a null on invalid values - O.armor = O.armor.setRating(melee = text2num(result["values"]["melee"]),\ - bullet = text2num(result["values"]["bullet"]),\ - laser = text2num(result["values"]["laser"]),\ - energy = text2num(result["values"]["energy"]),\ - bomb = text2num(result["values"]["bomb"]),\ - bio = text2num(result["values"]["bio"]),\ - rad = text2num(result["values"]["rad"]),\ - fire = text2num(result["values"]["fire"]),\ - acid = text2num(result["values"]["acid"])) - log_admin("[key_name(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") - message_admins("[key_name_admin(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") - else - return - - else if(href_list["delall"]) - if(!check_rights(R_DEBUG|R_SERVER)) - return - - var/obj/O = locate(href_list["delall"]) - if(!isobj(O)) - to_chat(usr, "This can only be used on instances of type /obj") - return - - var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") - if(action_type == "Cancel" || !action_type) - return - - if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes") - return - - if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") - return - - var/O_type = O.type - switch(action_type) - if("Strict type") - var/i = 0 - for(var/obj/Obj in world) - if(Obj.type == O_type) - i++ - qdel(Obj) - CHECK_TICK - if(!i) - to_chat(usr, "No objects of this type exist") - return - log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - message_admins("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - if("Type and subtypes") - var/i = 0 - for(var/obj/Obj in world) - if(istype(Obj,O_type)) - i++ - qdel(Obj) - CHECK_TICK - if(!i) - to_chat(usr, "No objects of this type exist") - return - log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - message_admins("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - - else if(href_list["addreagent"]) - if(!check_rights(NONE)) - return - - var/atom/A = locate(href_list["addreagent"]) - - if(!A.reagents) - var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num - if(amount) - A.create_reagents(amount) - - if(A.reagents) - var/chosen_id - switch(alert(usr, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky")) - if("Search") - var/valid_id - while(!valid_id) - chosen_id = input(usr, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text - if(isnull(chosen_id)) //Get me out of here! - break - if(!ispath(text2path(chosen_id))) - chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent))) - if(ispath(chosen_id)) - valid_id = TRUE - else - valid_id = TRUE - if(!valid_id) - to_chat(usr, "A reagent with that ID doesn't exist!") - if("Choose from a list") - chosen_id = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent) - if("I'm feeling lucky") - chosen_id = pick(subtypesof(/datum/reagent)) - if(chosen_id) - var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num - if(amount) - A.reagents.add_reagent(chosen_id, amount) - log_admin("[key_name(usr)] has added [amount] units of [chosen_id] to \the [A]") - message_admins("[key_name(usr)] has added [amount] units of [chosen_id] to \the [A]") - - else if(href_list["explode"]) - if(!check_rights(R_FUN)) - return - - var/atom/A = locate(href_list["explode"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") - return - - src.cmd_admin_explosion(A) - - else if(href_list["emp"]) - if(!check_rights(R_FUN)) - return - - var/atom/A = locate(href_list["emp"]) - if(!isobj(A) && !ismob(A) && !isturf(A)) - to_chat(usr, "This can only be done to instances of type /obj, /mob and /turf") - return - - src.cmd_admin_emp(A) - - else if(href_list["modtransform"]) - if(!check_rights(R_DEBUG)) - return - - var/atom/A = locate(href_list["modtransform"]) - if(!istype(A)) - to_chat(usr, "This can only be done to atoms.") - return - - var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") - var/matrix/M = A.transform - switch(result) - if("Scale") - var/x = input(usr, "Choose x mod","Transform Mod") as null|num - var/y = input(usr, "Choose y mod","Transform Mod") as null|num - if(!isnull(x) && !isnull(y)) - A.transform = M.Scale(x,y) - if("Translate") - var/x = input(usr, "Choose x mod","Transform Mod") as null|num - var/y = input(usr, "Choose y mod","Transform Mod") as null|num - if(!isnull(x) && !isnull(y)) - A.transform = M.Translate(x,y) - if("Rotate") - var/angle = input(usr, "Choose angle to rotate","Transform Mod") as null|num - if(!isnull(angle)) - A.transform = M.Turn(angle) - - else if(href_list["rotatedatum"]) - if(!check_rights(NONE)) - return - - var/atom/A = locate(href_list["rotatedatum"]) - if(!istype(A)) - to_chat(usr, "This can only be done to instances of type /atom") - return - - switch(href_list["rotatedir"]) - if("right") - A.setDir(turn(A.dir, -45)) - if("left") - A.setDir(turn(A.dir, 45)) - vv_update_display(A, "dir", dir2text(A.dir)) - - else if(href_list["editorgans"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["editorgans"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - manipulate_organs(C) - - else if(href_list["givemartialart"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["givemartialart"]) in GLOB.carbon_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/list/artpaths = subtypesof(/datum/martial_art) - var/list/artnames = list() - for(var/i in artpaths) - var/datum/martial_art/M = i - artnames[initial(M.name)] = M - - var/result = input(usr, "Choose the martial art to teach","JUDO CHOP") as null|anything in artnames - if(!usr) - return - if(QDELETED(C)) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - var/chosenart = artnames[result] - var/datum/martial_art/MA = new chosenart - MA.teach(C) - - else if(href_list["givetrauma"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["givetrauma"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/list/traumas = subtypesof(/datum/brain_trauma) - var/result = input(usr, "Choose the brain trauma to apply","Traumatize") as null|anything in traumas - if(!usr) - return - if(QDELETED(C)) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - C.gain_trauma(result) - - else if(href_list["curetraumas"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["curetraumas"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - C.cure_all_traumas(TRAUMA_RESILIENCE_ABSOLUTE) - - else if(href_list["hallucinate"]) - if(!check_rights(NONE)) - return - - var/mob/living/carbon/C = locate(href_list["hallucinate"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/list/hallucinations = subtypesof(/datum/hallucination) - var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations - if(!usr) - return - if(QDELETED(C)) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - new result(C, TRUE) - - else if(href_list["makehuman"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"]) in GLOB.mob_list - if(!istype(Mo)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/monkey") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!Mo) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("humanone"=href_list["makehuman"])) - - else if(href_list["makemonkey"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makemonkey"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("monkeyone"=href_list["makemonkey"])) - - else if(href_list["makerobot"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makerobot"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makerobot"=href_list["makerobot"])) - - else if(href_list["makealien"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makealien"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makealien"=href_list["makealien"])) - - else if(href_list["makeslime"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["makeslime"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makeslime"=href_list["makeslime"])) - - else if(href_list["makeai"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/H = locate(href_list["makeai"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") - return - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - holder.Topic(href, list("makeai"=href_list["makeai"])) - - else if(href_list["setspecies"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["setspecies"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list - - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - var/newtype = GLOB.species_list[result] - admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [H] to [result]") - H.set_species(newtype) - - else if(href_list["editbodypart"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/C = locate(href_list["editbodypart"]) in GLOB.mob_list - if(!istype(C)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon") - return - - var/edit_action = input(usr, "What would you like to do?","Modify Body Part") as null|anything in list("add","remove", "augment") - if(!edit_action) - return - var/list/limb_list = list(BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - if(edit_action == "augment") - limb_list += BODY_ZONE_CHEST - var/result = input(usr, "Please choose which body part to [edit_action]","[capitalize(edit_action)] Body Part") as null|anything in limb_list - - if(!C) - to_chat(usr, "Mob doesn't exist anymore") - return - - if(result) - var/obj/item/bodypart/BP = C.get_bodypart(result) - switch(edit_action) - if("remove") - if(BP) - BP.drop_limb() - else - to_chat(usr, "[C] doesn't have such bodypart.") - if("add") - if(BP) - to_chat(usr, "[C] already has such bodypart.") - else - if(!C.regenerate_limb(result)) - to_chat(usr, "[C] cannot have such bodypart.") - if("augment") - if(ishuman(C)) - if(BP) - BP.change_bodypart_status(BODYPART_ROBOTIC, TRUE, TRUE) - else - to_chat(usr, "[C] doesn't have such bodypart.") - else - to_chat(usr, "Only humans can be augmented.") - admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [C]") - - - else if(href_list["purrbation"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["purrbation"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - if(!ishumanbasic(H)) - to_chat(usr, "This can only be done to the basic human species at the moment.") - return - - if(!H) - to_chat(usr, "Mob doesn't exist anymore") - return - - var/success = purrbation_toggle(H) - if(success) - to_chat(usr, "Put [H] on purrbation.") - log_admin("[key_name(usr)] has put [key_name(H)] on purrbation.") - var/msg = "[key_name_admin(usr)] has put [key_name(H)] on purrbation." - message_admins(msg) - admin_ticket_log(H, msg) - - else - to_chat(usr, "Removed [H] from purrbation.") - log_admin("[key_name(usr)] has removed [key_name(H)] from purrbation.") - var/msg = "[key_name_admin(usr)] has removed [key_name(H)] from purrbation." - message_admins(msg) - admin_ticket_log(H, msg) - - else if(href_list["adjustDamage"] && href_list["mobToDamage"]) - if(!check_rights(NONE)) - return - - var/mob/living/L = locate(href_list["mobToDamage"]) in GLOB.mob_list - if(!istype(L)) - return - - var/Text = href_list["adjustDamage"] - - var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num - - if(!L) - to_chat(usr, "Mob doesn't exist anymore") - return - - var/newamt - switch(Text) - if("brute") - L.adjustBruteLoss(amount) - newamt = L.getBruteLoss() - if("fire") - L.adjustFireLoss(amount) - newamt = L.getFireLoss() - if("toxin") - L.adjustToxLoss(amount) - newamt = L.getToxLoss() - if("oxygen") - L.adjustOxyLoss(amount) - newamt = L.getOxyLoss() - if("brain") - L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_BRAIN) - if("clone") - L.adjustCloneLoss(amount) - newamt = L.getCloneLoss() - if("stamina") - L.adjustStaminaLoss(amount) - newamt = L.getStaminaLoss() - if("arousal") - L.adjustArousalLoss(amount) - newamt = L.getArousalLoss() - if("heart") - L.adjustOrganLoss(ORGAN_SLOT_HEART, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_HEART) - if("liver") - L.adjustOrganLoss(ORGAN_SLOT_LIVER, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_LIVER) - if("lungs") - L.adjustOrganLoss(ORGAN_SLOT_LUNGS, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_LUNGS) - if("eye_sight") - L.adjustOrganLoss(ORGAN_SLOT_EYES, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_EYES) - if("ears") - L.adjustOrganLoss(ORGAN_SLOT_EARS, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_EARS) - if("stomach") - L.adjustOrganLoss(ORGAN_SLOT_STOMACH, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_STOMACH) - if("tongue") - L.adjustOrganLoss(ORGAN_SLOT_TONGUE, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_TONGUE) - if("appendix") - L.adjustOrganLoss(ORGAN_SLOT_APPENDIX, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_APPENDIX) - else - to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") - return - - if(amount != 0) - log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - var/msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [L] " - message_admins("[msg]") - admin_ticket_log(L, msg) - vv_update_display(L, Text, "[newamt]") - else if(href_list["copyoutfit"]) - if(!check_rights(R_SPAWN)) - return - var/mob/living/carbon/human/H = locate(href_list["copyoutfit"]) in GLOB.carbon_list - if(istype(H)) - H.copy_outfit() - else if(href_list["modquirks"]) - if(!check_rights(R_SPAWN)) - return - - var/mob/living/carbon/human/H = locate(href_list["modquirks"]) in GLOB.mob_list - if(!istype(H)) - to_chat(usr, "This can only be done to instances of type /mob/living/carbon/human") - return - - var/list/options = list("Clear"="Clear") - for(var/x in subtypesof(/datum/quirk)) - var/datum/quirk/T = x - var/qname = initial(T.name) - options[H.has_quirk(T) ? "[qname] (Remove)" : "[qname] (Add)"] = T - - var/result = input(usr, "Choose quirk to add/remove","Quirk Mod") as null|anything in options - if(result) - if(result == "Clear") - for(var/datum/quirk/q in H.roundstart_quirks) - H.remove_quirk(q.type) - else - var/T = options[result] - if(H.has_quirk(T)) - H.remove_quirk(T) - else - H.add_quirk(T,TRUE) +/datum/proc/CanProcCall(procname) + return TRUE + +/datum/proc/can_vv_get(var_name) + return TRUE + +/datum/proc/vv_edit_var(var_name, var_value) //called whenever a var is edited + if(var_name == NAMEOF(src, vars)) + return FALSE + vars[var_name] = var_value + datum_flags |= DF_VAR_EDITED + return TRUE + +/datum/proc/vv_get_var(var_name) + switch(var_name) + if ("vars") + return debug_variable(var_name, list(), 0, src) + return debug_variable(var_name, vars[var_name], 0, src) + +/datum/proc/can_vv_mark() + return TRUE + +//please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down +//add separaters by doing . += "---" +/datum/proc/vv_get_dropdown() + . = list() + VV_DROPDOWN_OPTION("", "---") + VV_DROPDOWN_OPTION(VV_HK_CALLPROC, "Call Proc") + VV_DROPDOWN_OPTION(VV_HK_MARK, "Mark Object") + VV_DROPDOWN_OPTION(VV_HK_DELETE, "Delete") + VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player") +// VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits") + +//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! +//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! +//This proc is for "high level" actions like admin heal/set species/etc/etc. The low level debugging things should go in admin/view_variables/topic_basic.dm incase this runtimes. +/datum/proc/vv_do_topic(list/href_list) + if(!usr || !usr.client || !usr.client.holder || !check_rights(NONE)) + return FALSE //This is VV, not to be called by anything else. +// if(href_list[VV_HK_MODIFY_TRAITS]) +// usr.client.holder.modify_traits(src) + return TRUE + +/datum/proc/vv_get_header() + . = list() + if(("name" in vars) && !isatom(src)) + . += "[vars["name"]]
    " + +/datum/proc/on_reagent_change(changetype) + return diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f89d5e87..035b75a9 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,926 +1,979 @@ -/atom - layer = TURF_LAYER - plane = GAME_PLANE - var/level = 2 - var/article // If non-null, overrides a/an/some in all cases - - var/flags_1 = NONE - var/interaction_flags_atom = NONE - var/datum/reagents/reagents = null - - //This atom's HUD (med/sec, etc) images. Associative list. - var/list/image/hud_list = null - //HUD images that this atom can provide. - var/list/hud_possible - - /// Last name used to calculate a color for the chatmessage overlays - var/chat_color_name - /// Last color calculated for the the chatmessage overlays - var/chat_color - /// A luminescence-shifted value of the last color calculated for chatmessage overlays - var/chat_color_darkened - - //Value used to increment ex_act() if reactionary_explosions is on - var/explosion_block = 0 - - var/list/atom_colours //used to store the different colors on an atom - //its inherent color, the colored paint applied on it, special color effect etc... - - var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. - var/list/remove_overlays // a very temporary list of overlays to remove - var/list/add_overlays // a very temporary list of overlays to add - - var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays - ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc - var/list/managed_overlays - - var/datum/proximity_monitor/proximity_monitor - var/buckle_message_cooldown = 0 - var/fingerprintslast - - var/list/filter_data //For handling persistent filters - - var/datum/component/orbiter/orbiters - - var/rad_flags = NONE // Will move to flags_1 when i can be arsed to - var/rad_insulation = RAD_NO_INSULATION - - var/icon/blood_splatter_icon - var/icon/cum_splatter_icon - var/list/fingerprints - var/list/fingerprintshidden - var/list/blood_DNA - var/list/suit_fibers - -/atom/New(loc, ...) - //atom creation method that preloads variables at creation - if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() - world.preloader_load(src) - - if(datum_flags & DF_USE_TAG) - GenerateTag() - - var/do_initialize = SSatoms.initialized - if(do_initialize != INITIALIZATION_INSSATOMS) - args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD - if(SSatoms.InitAtom(src, args)) - //we were deleted - return - -//Called after New if the map is being loaded. mapload = TRUE -//Called from base of New if the map is not being loaded. mapload = FALSE -//This base must be called or derivatives must set initialized to TRUE -//must not sleep -//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE -//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm - -//Note: the following functions don't call the base for optimization and must copypasta: -// /turf/Initialize -// /turf/open/space/Initialize - -/atom/proc/Initialize(mapload, ...) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - //atom color stuff - if(color) - add_atom_colour(color, FIXED_COLOUR_PRIORITY) - - if (light_power && light_range) - update_light() - - if (opacity && isturf(loc)) - var/turf/T = loc - T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. - - if (canSmoothWith) - canSmoothWith = typelist("canSmoothWith", canSmoothWith) - - ComponentInitialize() - - return INITIALIZE_HINT_NORMAL - -//called if Initialize returns INITIALIZE_HINT_LATELOAD -/atom/proc/LateInitialize() - return - -// Put your AddComponent() calls here -/atom/proc/ComponentInitialize() - return - -/atom/Destroy() - if(alternate_appearances) - for(var/K in alternate_appearances) - var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K] - AA.remove_from_hud(src) - - if(reagents) - qdel(reagents) - - LAZYCLEARLIST(overlays) - LAZYCLEARLIST(priority_overlays) - - QDEL_NULL(light) - - return ..() - -/atom/proc/handle_ricochet(obj/item/projectile/P) - return - -/atom/proc/CanPass(atom/movable/mover, turf/target) - return !density - -/atom/proc/onCentCom() - var/turf/T = get_turf(src) - if(!T) - return FALSE - - if(is_reserved_level(T.z)) - for(var/A in SSshuttle.mobile) - var/obj/docking_port/mobile/M = A - if(M.launch_status == ENDGAME_TRANSIT) - for(var/place in M.shuttle_areas) - var/area/shuttle/shuttle_area = place - if(T in shuttle_area) - return TRUE - - if(!is_centcom_level(T.z))//if not, don't bother - return FALSE - - //Check for centcom itself - if(istype(T.loc, /area/centcom)) - return TRUE - - //Check for centcom shuttles - for(var/A in SSshuttle.mobile) - var/obj/docking_port/mobile/M = A - if(M.launch_status == ENDGAME_LAUNCHED) - for(var/place in M.shuttle_areas) - var/area/shuttle/shuttle_area = place - if(T in shuttle_area) - return TRUE - -/atom/proc/onSyndieBase() - var/turf/T = get_turf(src) - if(!T) - return FALSE - - if(!is_centcom_level(T.z))//if not, don't bother - return FALSE - - if(istype(T.loc, /area/shuttle/syndicate) || istype(T.loc, /area/syndicate_mothership) || istype(T.loc, /area/shuttle/assault_pod)) - return TRUE - - return FALSE - -/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) - SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user) - if(does_attack_animation) - user.changeNext_move(CLICK_CD_MELEE) - log_combat(user, src, "punched", "hulk powers") - user.do_attack_animation(src, ATTACK_EFFECT_SMASH) - -/atom/proc/CheckParts(list/parts_list) - for(var/A in parts_list) - if(istype(A, /datum/reagent)) - if(!reagents) - reagents = new() - reagents.reagent_list.Add(A) - reagents.conditional_update() - else if(ismovableatom(A)) - var/atom/movable/M = A - if(isliving(M.loc)) - var/mob/living/L = M.loc - L.transferItemToLoc(M, src) - else - M.forceMove(src) - -//common name -/atom/proc/update_multiz(prune_on_fail = FALSE) - return FALSE - -/atom/proc/assume_air(datum/gas_mixture/giver) - qdel(giver) - return null - -/atom/proc/remove_air(amount) - return null - -/atom/proc/return_air() - if(loc) - return loc.return_air() - else - return null - -/atom/proc/check_eye(mob/user) - return - -/atom/proc/Bumped(atom/movable/AM) - set waitfor = FALSE - -// Convenience procs to see if a container is open for chemistry handling -/atom/proc/is_open_container() - return is_refillable() && is_drainable() - -/atom/proc/is_injectable(allowmobs = TRUE) - return reagents && (reagents.reagents_holder_flags & (INJECTABLE | REFILLABLE)) - -/atom/proc/is_drawable(allowmobs = TRUE) - return reagents && (reagents.reagents_holder_flags & (DRAWABLE | DRAINABLE)) - -/atom/proc/is_refillable() - return reagents && (reagents.reagents_holder_flags & REFILLABLE) - -/atom/proc/is_drainable() - return reagents && (reagents.reagents_holder_flags & DRAINABLE) - - -/atom/proc/AllowDrop() - return FALSE - -/atom/proc/CheckExit() - return TRUE - -/atom/proc/HasProximity(atom/movable/AM as mob|obj) - return - -/atom/proc/emp_act(severity) - var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity) - if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) - wires.emp_pulse() - return protection // Pass the protection value collected here upwards - -/atom/proc/bullet_act(obj/item/projectile/P, def_zone) - SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) - . = P.on_hit(src, 0, def_zone) - -//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it. -// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first. -/atom/proc/shove_act(mob/living/target, mob/living/user) - return FALSE - -/atom/proc/in_contents_of(container)//can take class or object instance as argument - if(ispath(container)) - if(istype(src.loc, container)) - return TRUE - else if(src in container) - return TRUE - return FALSE - -/atom/proc/update_overlaysb() - SHOULD_CALL_PARENT(1) - . = list() - SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) - -/atom/proc/update_iconb() - var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) - - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) - update_icon_state() - - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) - var/list/new_overlays = update_overlaysb() - if(managed_overlays) - cut_overlay(managed_overlays) - managed_overlays = null - if(length(new_overlays)) - managed_overlays = new_overlays - add_overlay(new_overlays) - -/atom/proc/get_examine_name(mob/user) - . = "\a [src]" - var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]") - if(article) - . = "[article] [src]" - override[EXAMINE_POSITION_ARTICLE] = article - - var/should_override = FALSE - - if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) - should_override = TRUE - - - if(blood_DNA && !istype(src, /obj/effect/decal)) - override[EXAMINE_POSITION_BEFORE] = " blood-stained " - should_override = TRUE - - if(should_override) - . = override.Join("") - -///Generate the full examine string of this atom (including icon for goonchat) -/atom/proc/get_examine_string(mob/user, thats = FALSE) - return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" - -/atom/proc/examine(mob/user) - . = list("[get_examine_string(user, TRUE)].") - - if(!isliving(src)) - user.visible_message("[user] examines [src].",\ - "You examine [src].") - if(desc) - . += desc - - if(reagents) - if(reagents.reagents_holder_flags & TRANSPARENT) - . += "It contains:" - if(length(reagents.reagent_list)) - if(user.can_see_reagents()) //Show each individual reagent - for(var/datum/reagent/R in reagents.reagent_list) - . += "[R.volume] units of [R.name]" - else //Otherwise, just show the total volume - var/total_volume = 0 - for(var/datum/reagent/R in reagents.reagent_list) - total_volume += R.volume - . += "[total_volume] units of various reagents" - else - . += "Nothing." - else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE) - if(reagents.total_volume) - . += "It has [reagents.total_volume] unit\s left." - else - . += "It's empty." - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) - -/// Updates the icon of the atom -/atom/proc/update_icon() - // I expect we're going to need more return flags and options in this proc - var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) - - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) - update_icon_state() - - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) - var/list/new_overlays = update_overlays() - if(managed_overlays) - cut_overlay(managed_overlays) - managed_overlays = null - if(length(new_overlays)) - managed_overlays = new_overlays - add_overlay(new_overlays) - -/// Updates the icon state of the atom -/atom/proc/update_icon_state() - -/// Updates the overlays of the atom -/atom/proc/update_overlays() - SHOULD_CALL_PARENT(1) - . = list() - SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) - -/atom/proc/relaymove(mob/user) - if(buckle_message_cooldown <= world.time) - buckle_message_cooldown = world.time + 50 - to_chat(user, "You can't move while buckled to [src]!") - return - -/atom/proc/contents_explosion(severity, target) - return //For handling the effects of explosions on contents that would not normally be effected - -/atom/proc/ex_act(severity, target) - set waitfor = FALSE - contents_explosion(severity, target) - SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) - -/atom/proc/blob_act(obj/structure/blob/B) - SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) - return - -/atom/proc/fire_act(exposed_temperature, exposed_volume) - SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) - return - -/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). - addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) - -/atom/proc/hitby_react(atom/movable/AM) - if(AM && isturf(AM.loc)) - step(AM, turn(AM.dir, 180)) - -/atom/proc/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) - return - -//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list -/mob/living/proc/get_blood_dna_list() - var/blood_id = get_blood_id() - if(!(blood_id in GLOB.blood_reagent_types)) - return - return list("ANIMAL DNA" = "Y-") - -/mob/living/carbon/get_blood_dna_list() - var/blood_id = get_blood_id() - if(!(blood_id in GLOB.blood_reagent_types)) - return - var/list/blood_dna = list() - if(dna) - blood_dna[dna.unique_enzymes] = dna.blood_type - else - blood_dna["UNKNOWN DNA"] = "X*" - return blood_dna - -/mob/living/carbon/alien/get_blood_dna_list() - return list("UNKNOWN DNA" = "X*") - -//to add a mob's dna info into an object's blood_DNA list. -/atom/proc/transfer_mob_blood_dna(mob/living/L) - // Returns 0 if we have that blood already - var/new_blood_dna = L.get_blood_dna_list() - if(!new_blood_dna) - return FALSE - LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it. - var/old_length = blood_DNA.len - blood_DNA |= new_blood_dna - if(blood_DNA.len == old_length) - return FALSE - return TRUE - -//to add blood dna info to the object's blood_DNA list -/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases) - LAZYINITLIST(blood_DNA) - var/old_length = blood_DNA.len - blood_DNA |= blood_dna - if(blood_DNA.len > old_length) - return TRUE - //some new blood DNA was added - -//to add blood from a mob onto something, and transfer their dna info -/atom/proc/add_mob_blood(mob/living/M) - var/list/blood_dna = M.get_blood_dna_list() - if(!blood_dna) - return FALSE - return add_blood_DNA(blood_dna, M.diseases) - -//to add blood onto something, with blood dna info to include. -/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - return FALSE - -/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - return transfer_blood_dna(blood_dna, diseases) - -/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - . = ..() - if(!.) - return - add_blood_overlay() - -/obj/item/proc/add_blood_overlay() - if(!blood_DNA.len) - return - if(initial(icon) && initial(icon_state)) - blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object - blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY) - add_overlay(blood_splatter_icon) - -/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - . = ..() - transfer_blood = rand(2, 4) - -/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src - if(!B) - B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) - B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal. - return TRUE //we bloodied the floor - -/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - if(head) - head.add_blood_DNA(blood_dna, diseases) - update_inv_head() - else if(wear_mask) - wear_mask.add_blood_DNA(blood_dna, diseases) - update_inv_wear_mask() - if(wear_neck) - wear_neck.add_blood_DNA(blood_dna, diseases) - update_inv_neck() - if(wear_suit) - wear_suit.add_blood_DNA(blood_dna, diseases) - update_inv_wear_suit() - else if(w_uniform) - w_uniform.add_blood_DNA(blood_dna, diseases) - update_inv_w_uniform() - if(gloves) - var/obj/item/clothing/gloves/G = gloves - G.add_blood_DNA(blood_dna, diseases) - else - transfer_blood_dna(blood_dna, diseases) - bloody_hands = rand(2, 4) - update_inv_gloves() //handles bloody hands overlays and updating - return TRUE - -/atom/proc/blood_DNA_to_color() - var/list/colors = list()//first we make a list of all bloodtypes present - for(var/bloop in blood_DNA) - if(colors[blood_DNA[bloop]]) - colors[blood_DNA[bloop]]++ - else - colors[blood_DNA[bloop]] = 1 - - var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up - - if(colors.len) - var/sum = 0 //this is all shitcode, but it works; trust me - final_rgb = bloodtype_to_color(colors[1]) - sum = colors[colors[1]] - if(colors.len > 1) - var/i = 2 - while(i <= colors.len) - var/tmp = colors[colors[i]] - final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum)) - sum += tmp - i++ - - return final_rgb - -/atom/proc/clean_blood() - . = blood_DNA? TRUE : FALSE - blood_DNA = null - -/atom/proc/wash_cream() - return TRUE - -/atom/proc/isinspace() - if(isspaceturf(get_turf(src))) - return TRUE - else - return FALSE - -/atom/proc/handle_fall() - return - -/atom/proc/singularity_act() - return - -/atom/proc/singularity_pull(obj/singularity/S, current_size) - SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size) - -/atom/proc/acid_act(acidpwr, acid_volume) - SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) - -/atom/proc/emag_act() - SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT) - -/atom/proc/rad_act(strength) - if(istype(get_turf(src), /turf/open/pool)) - var/turf/open/pool/PL = get_turf(src) - if(PL.filled == TRUE) - strength *= 0.15 - SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength) - -/atom/proc/narsie_act() - SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT) - -/atom/proc/ratvar_act() - SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT) - -/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - return FALSE - -/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) - return FALSE - -/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user) - if(GetComponent(/datum/component/storage)) - return component_storage_contents_dump_act(src_object, user) - return FALSE - -/atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user) - var/list/things = src_object.contents() - var/datum/progressbar/progress = new(user, things.len, src) - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) - stoplag(1) - qdel(progress) - to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") - STR.orient2hud(user) - src_object.orient2hud(user) - if(user.active_storage) //refresh the HUD to show the transfered contents - user.active_storage.close(user) - user.active_storage.show_to(user) - return TRUE - -/atom/proc/get_dumping_location(obj/item/storage/source,mob/user) - return null - -//This proc is called on the location of an atom when the atom is Destroy()'d -/atom/proc/handle_atom_del(atom/A) - SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A) - -//called when the turf the atom resides on is ChangeTurfed -/atom/proc/HandleTurfChange(turf/T) - for(var/a in src) - var/atom/A = a - A.HandleTurfChange(T) - -//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it) -/atom/proc/get_remote_view_fullscreens(mob/user) - return - -//the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera) -/atom/proc/update_remote_sight(mob/living/user) - return - - -//Hook for running code when a dir change occurs -/atom/proc/setDir(newdir) - SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) - dir = newdir - -/atom/proc/mech_melee_attack(obj/mecha/M) - return - -//If a mob logouts/logins in side of an object you can use this proc -/atom/proc/on_log(login) - if(loc) - loc.on_log(login) - - -/* - Atom Colour Priority System - A System that gives finer control over which atom colour to colour the atom with. - The "highest priority" one is always displayed as opposed to the default of - "whichever was set last is displayed" -*/ - - -/* - Adds an instance of colour_type to the atom's atom_colours list -*/ -/atom/proc/add_atom_colour(coloration, colour_priority) - if(!atom_colours || !atom_colours.len) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - if(!coloration) - return - if(colour_priority > atom_colours.len) - return - atom_colours[colour_priority] = coloration - update_atom_colour() - - -/* - Removes an instance of colour_type from the atom's atom_colours list -*/ -/atom/proc/remove_atom_colour(colour_priority, coloration) - if(!atom_colours) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - if(colour_priority > atom_colours.len) - return - if(coloration && atom_colours[colour_priority] != coloration) - return //if we don't have the expected color (for a specific priority) to remove, do nothing - atom_colours[colour_priority] = null - update_atom_colour() - - -/* - Resets the atom's color to null, and then sets it to the highest priority - colour available -*/ -/atom/proc/update_atom_colour() - if(!atom_colours) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - color = null - for(var/C in atom_colours) - if(islist(C)) - var/list/L = C - if(L.len) - color = L - return - else if(C) - color = C - return - -/atom/vv_edit_var(var_name, var_value) - if(!GLOB.Debug2) - flags_1 |= ADMIN_SPAWNED_1 - . = ..() - switch(var_name) - if("color") - add_atom_colour(color, ADMIN_COLOUR_PRIORITY) - -/atom/vv_get_dropdown() - . = ..() - . += "---" - var/turf/curturf = get_turf(src) - if (curturf) - .["Jump to"] = "?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]" - .["Modify Transform"] = "?_src_=vars;[HrefToken()];modtransform=[REF(src)]" - .["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]" - .["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]" - .["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]" - -/atom/proc/drop_location() - var/atom/L = loc - if(!L) - return null - return L.AllowDrop() ? L : L.drop_location() - -/atom/Entered(atom/movable/AM, atom/oldLoc) - SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) - -/atom/Exit(atom/movable/AM, atom/newLoc) - . = ..() - if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT) - return FALSE - -/atom/Exited(atom/movable/AM, atom/newLoc) - SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc) - -/atom/proc/return_temperature() - return - -// Tool behavior procedure. Redirects to tool-specific procs by default. -// You can override it to catch all tool interactions, for use in complex deconstruction procs. -// Just don't forget to return ..() in the end. -/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) - switch(tool_type) - if(TOOL_CROWBAR) - return crowbar_act(user, I) - if(TOOL_MULTITOOL) - return multitool_act(user, I) - if(TOOL_SCREWDRIVER) - return screwdriver_act(user, I) - if(TOOL_WRENCH) - return wrench_act(user, I) - if(TOOL_WIRECUTTER) - return wirecutter_act(user, I) - if(TOOL_WELDER) - return welder_act(user, I) - if(TOOL_ANALYZER) - return analyzer_act(user, I) - -// Tool-specific behavior procs. To be overridden in subtypes. -/atom/proc/crowbar_act(mob/living/user, obj/item/I) - return - -/atom/proc/multitool_act(mob/living/user, obj/item/I) - return - -/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) - if(!istype(I, /obj/item/multitool)) - if(user && !silent) - to_chat(user, "[I] has no data buffer!") - return FALSE - return TRUE - -/atom/proc/screwdriver_act(mob/living/user, obj/item/I) - SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I) - -/atom/proc/wrench_act(mob/living/user, obj/item/I) - return - -/atom/proc/wirecutter_act(mob/living/user, obj/item/I) - return - -/atom/proc/welder_act(mob/living/user, obj/item/I) - return - -/atom/proc/analyzer_act(mob/living/user, obj/item/I) - return - -/atom/proc/GenerateTag() - return - -// Generic logging helper -/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) - if(!log_globally) - return - - var/log_text = "[key_name(src)] [message] [loc_name(src)]" - switch(message_type) - if(LOG_ATTACK) - log_attack(log_text) - if(LOG_SAY) - log_say(log_text) - if(LOG_WHISPER) - log_whisper(log_text) - if(LOG_EMOTE) - log_emote(log_text) - if(LOG_DSAY) - log_dsay(log_text) - if(LOG_PDA) - log_pda(log_text) - if(LOG_CHAT) - log_chat(log_text) - if(LOG_COMMENT) - log_comment(log_text) - if(LOG_TELECOMMS) - log_telecomms(log_text) - if(LOG_OOC) - log_ooc(log_text) - if(LOG_ADMIN) - log_admin(log_text) - if(LOG_ADMIN_PRIVATE) - log_admin_private(log_text) - if(LOG_ASAY) - log_adminsay(log_text) - if(LOG_OWNERSHIP) - log_game(log_text) - if(LOG_GAME) - log_game(log_text) - else - stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") - log_game(log_text) - -// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements) -/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null) - var/prefix = tag ? "([tag]) " : "" - var/suffix = forced_by ? " FORCED by [forced_by]" : "" - log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally) - -// Helper for logging of messages with only one sender and receiver -/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag) - if(!tag) - stack_trace("Unspecified tag for private message") - tag = "UNKNOWN" - - source.log_talk(message, message_type, tag="[tag] to [key_name(target)]") - if(source != target) - target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE) - -/* -Proc for attack log creation, because really why not -1 argument is the actor performing the action -2 argument is the target of the action -3 is a verb describing the action (e.g. punched, throwed, kicked, etc.) -4 is a tool with which the action was made (usually an item) -5 is any additional text, which will be appended to the rest of the log line -*/ - -/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) - var/ssource = key_name(user) - var/starget = key_name(target) - - var/mob/living/living_target = target - var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : "" - - var/sobject = "" - if(object) - sobject = " with [key_name(object)]" - var/saddition = "" - if(addition) - saddition = " [addition]" - - var/postfix = "[sobject][saddition][hp]" - - var/message = "has [what_done] [starget][postfix]" - user.log_message(message, LOG_ATTACK, color="red") - - if(user != target) - var/reverse_message = "has been [what_done] by [ssource][postfix]" - target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) - -// Filter stuff -/atom/movable/proc/add_filter(name,priority,list/params) - LAZYINITLIST(filter_data) - var/list/p = params.Copy() - p["priority"] = priority - filter_data[name] = p - update_filters() - -/atom/movable/proc/update_filters() - filters = null - filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) - for(var/f in filter_data) - var/list/data = filter_data[f] - var/list/arguments = data.Copy() - arguments -= "priority" - filters += filter(arglist(arguments)) - -/atom/movable/proc/get_filter(name) - if(filter_data) - if(filter_data[name]) - return filters[filter_data.Find(name)] - -/atom/movable/proc/remove_filter(name) - if(filter_data) - if(filter_data[name]) - filter_data -= name - update_filters() - return TRUE - -/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) - . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) - -///Passes Stat Browser Panel clicks to the game and calls client click on an atom -/atom/Topic(href, list/href_list) - . = ..() - if(!usr?.client) - return - var/client/usr_client = usr.client - var/list/paramslist = list() - if(href_list["statpanel_item_shiftclick"]) - paramslist["shift"] = "1" - if(href_list["statpanel_item_ctrlclick"]) - paramslist["ctrl"] = "1" - if(href_list["statpanel_item_altclick"]) - paramslist["alt"] = "1" - if(href_list["statpanel_item_click"]) - // first of all make sure we valid - var/mouseparams = list2params(paramslist) - usr_client.Click(src, loc, null, mouseparams) +/atom + layer = TURF_LAYER + plane = GAME_PLANE + var/level = 2 + var/article // If non-null, overrides a/an/some in all cases + + var/flags_1 = NONE + var/interaction_flags_atom = NONE + var/datum/reagents/reagents = null + + //This atom's HUD (med/sec, etc) images. Associative list. + var/list/image/hud_list = null + //HUD images that this atom can provide. + var/list/hud_possible + + /// Last name used to calculate a color for the chatmessage overlays + var/chat_color_name + /// Last color calculated for the the chatmessage overlays + var/chat_color + /// A luminescence-shifted value of the last color calculated for chatmessage overlays + var/chat_color_darkened + + //Value used to increment ex_act() if reactionary_explosions is on + var/explosion_block = 0 + + var/list/atom_colours //used to store the different colors on an atom + //its inherent color, the colored paint applied on it, special color effect etc... + + var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. + var/list/remove_overlays // a very temporary list of overlays to remove + var/list/add_overlays // a very temporary list of overlays to add + + var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays + ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc + var/list/managed_overlays + + var/datum/proximity_monitor/proximity_monitor + var/buckle_message_cooldown = 0 + var/fingerprintslast + + var/list/filter_data //For handling persistent filters + + var/datum/component/orbiter/orbiters + + var/rad_flags = NONE // Will move to flags_1 when i can be arsed to + var/rad_insulation = RAD_NO_INSULATION + + var/icon/blood_splatter_icon + var/icon/cum_splatter_icon + var/list/fingerprints + var/list/fingerprintshidden + var/list/blood_DNA + var/list/suit_fibers + +/atom/New(loc, ...) + //atom creation method that preloads variables at creation + if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() + world.preloader_load(src) + + if(datum_flags & DF_USE_TAG) + GenerateTag() + + var/do_initialize = SSatoms.initialized + if(do_initialize != INITIALIZATION_INSSATOMS) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, args)) + //we were deleted + return + +//Called after New if the map is being loaded. mapload = TRUE +//Called from base of New if the map is not being loaded. mapload = FALSE +//This base must be called or derivatives must set initialized to TRUE +//must not sleep +//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE +//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm + +//Note: the following functions don't call the base for optimization and must copypasta: +// /turf/Initialize +// /turf/open/space/Initialize + +/atom/proc/Initialize(mapload, ...) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + //atom color stuff + if(color) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) + + if (light_power && light_range) + update_light() + + if (opacity && isturf(loc)) + var/turf/T = loc + T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. + + if (canSmoothWith) + canSmoothWith = typelist("canSmoothWith", canSmoothWith) + + ComponentInitialize() + + return INITIALIZE_HINT_NORMAL + +//called if Initialize returns INITIALIZE_HINT_LATELOAD +/atom/proc/LateInitialize() + return + +// Put your AddComponent() calls here +/atom/proc/ComponentInitialize() + return + +/atom/Destroy() + if(alternate_appearances) + for(var/K in alternate_appearances) + var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K] + AA.remove_from_hud(src) + + if(reagents) + qdel(reagents) + + LAZYCLEARLIST(overlays) + LAZYCLEARLIST(priority_overlays) + + QDEL_NULL(light) + + return ..() + +/atom/proc/handle_ricochet(obj/item/projectile/P) + return + +/atom/proc/CanPass(atom/movable/mover, turf/target) + return !density + +/atom/proc/onCentCom() + var/turf/T = get_turf(src) + if(!T) + return FALSE + + if(is_reserved_level(T.z)) + for(var/A in SSshuttle.mobile) + var/obj/docking_port/mobile/M = A + if(M.launch_status == ENDGAME_TRANSIT) + for(var/place in M.shuttle_areas) + var/area/shuttle/shuttle_area = place + if(T in shuttle_area) + return TRUE + + if(!is_centcom_level(T.z))//if not, don't bother + return FALSE + + //Check for centcom itself + if(istype(T.loc, /area/centcom)) + return TRUE + + //Check for centcom shuttles + for(var/A in SSshuttle.mobile) + var/obj/docking_port/mobile/M = A + if(M.launch_status == ENDGAME_LAUNCHED) + for(var/place in M.shuttle_areas) + var/area/shuttle/shuttle_area = place + if(T in shuttle_area) + return TRUE + +/atom/proc/onSyndieBase() + var/turf/T = get_turf(src) + if(!T) + return FALSE + + if(!is_centcom_level(T.z))//if not, don't bother + return FALSE + + if(istype(T.loc, /area/shuttle/syndicate) || istype(T.loc, /area/syndicate_mothership) || istype(T.loc, /area/shuttle/assault_pod)) + return TRUE + + return FALSE + +/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) + SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user) + if(does_attack_animation) + user.changeNext_move(CLICK_CD_MELEE) + log_combat(user, src, "punched", "hulk powers") + user.do_attack_animation(src, ATTACK_EFFECT_SMASH) + +/atom/proc/CheckParts(list/parts_list) + for(var/A in parts_list) + if(istype(A, /datum/reagent)) + if(!reagents) + reagents = new() + reagents.reagent_list.Add(A) + reagents.conditional_update() + else if(ismovableatom(A)) + var/atom/movable/M = A + if(isliving(M.loc)) + var/mob/living/L = M.loc + L.transferItemToLoc(M, src) + else + M.forceMove(src) + +//common name +/atom/proc/update_multiz(prune_on_fail = FALSE) + return FALSE + +/atom/proc/assume_air(datum/gas_mixture/giver) + qdel(giver) + return null + +/atom/proc/remove_air(amount) + return null + +/atom/proc/return_air() + if(loc) + return loc.return_air() + else + return null + +/atom/proc/check_eye(mob/user) + return + +/atom/proc/Bumped(atom/movable/AM) + set waitfor = FALSE + +// Convenience procs to see if a container is open for chemistry handling +/atom/proc/is_open_container() + return is_refillable() && is_drainable() + +/atom/proc/is_injectable(allowmobs = TRUE) + return reagents && (reagents.reagents_holder_flags & (INJECTABLE | REFILLABLE)) + +/atom/proc/is_drawable(allowmobs = TRUE) + return reagents && (reagents.reagents_holder_flags & (DRAWABLE | DRAINABLE)) + +/atom/proc/is_refillable() + return reagents && (reagents.reagents_holder_flags & REFILLABLE) + +/atom/proc/is_drainable() + return reagents && (reagents.reagents_holder_flags & DRAINABLE) + + +/atom/proc/AllowDrop() + return FALSE + +/atom/proc/CheckExit() + return TRUE + +/atom/proc/HasProximity(atom/movable/AM as mob|obj) + return + +/atom/proc/emp_act(severity) + var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity) + if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) + wires.emp_pulse() + return protection // Pass the protection value collected here upwards + +/atom/proc/bullet_act(obj/item/projectile/P, def_zone) + SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) + . = P.on_hit(src, 0, def_zone) + +//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it. +// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first. +/atom/proc/shove_act(mob/living/target, mob/living/user) + return FALSE + +/atom/proc/in_contents_of(container)//can take class or object instance as argument + if(ispath(container)) + if(istype(src.loc, container)) + return TRUE + else if(src in container) + return TRUE + return FALSE + +/atom/proc/update_overlaysb() + SHOULD_CALL_PARENT(1) + . = list() + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) + +/atom/proc/update_iconb() + var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) + update_icon_state() + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) + var/list/new_overlays = update_overlaysb() + if(managed_overlays) + cut_overlay(managed_overlays) + managed_overlays = null + if(length(new_overlays)) + managed_overlays = new_overlays + add_overlay(new_overlays) + +/atom/proc/get_examine_name(mob/user) + . = "\a [src]" + var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]") + if(article) + . = "[article] [src]" + override[EXAMINE_POSITION_ARTICLE] = article + + var/should_override = FALSE + + if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) + should_override = TRUE + + + if(blood_DNA && !istype(src, /obj/effect/decal)) + override[EXAMINE_POSITION_BEFORE] = " blood-stained " + should_override = TRUE + + if(should_override) + . = override.Join("") + +///Generate the full examine string of this atom (including icon for goonchat) +/atom/proc/get_examine_string(mob/user, thats = FALSE) + return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" + +/atom/proc/examine(mob/user) + . = list("[get_examine_string(user, TRUE)].") + + if(!isliving(src)) + user.visible_message("[user] examines [src].",\ + "You examine [src].") + if(desc) + . += desc + + if(reagents) + if(reagents.reagents_holder_flags & TRANSPARENT) + . += "It contains:" + if(length(reagents.reagent_list)) + if(user.can_see_reagents()) //Show each individual reagent + for(var/datum/reagent/R in reagents.reagent_list) + . += "[R.volume] units of [R.name]" + else //Otherwise, just show the total volume + var/total_volume = 0 + for(var/datum/reagent/R in reagents.reagent_list) + total_volume += R.volume + . += "[total_volume] units of various reagents" + else + . += "Nothing." + else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE) + if(reagents.total_volume) + . += "It has [reagents.total_volume] unit\s left." + else + . += "It's empty." + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) + +/// Updates the icon of the atom +/atom/proc/update_icon() + // I expect we're going to need more return flags and options in this proc + var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) + update_icon_state() + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) + var/list/new_overlays = update_overlays() + if(managed_overlays) + cut_overlay(managed_overlays) + managed_overlays = null + if(length(new_overlays)) + managed_overlays = new_overlays + add_overlay(new_overlays) + +/// Updates the icon state of the atom +/atom/proc/update_icon_state() + +/// Updates the overlays of the atom +/atom/proc/update_overlays() + SHOULD_CALL_PARENT(1) + . = list() + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) + +/atom/proc/relaymove(mob/user) + if(buckle_message_cooldown <= world.time) + buckle_message_cooldown = world.time + 50 + to_chat(user, "You can't move while buckled to [src]!") + return + +/atom/proc/contents_explosion(severity, target) + return //For handling the effects of explosions on contents that would not normally be effected + +/atom/proc/ex_act(severity, target) + set waitfor = FALSE + contents_explosion(severity, target) + SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) + +/atom/proc/blob_act(obj/structure/blob/B) + SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) + return + +/atom/proc/fire_act(exposed_temperature, exposed_volume) + SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) + return + +/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). + addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) + +/atom/proc/hitby_react(atom/movable/AM) + if(AM && isturf(AM.loc)) + step(AM, turn(AM.dir, 180)) + +/atom/proc/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) + return + +//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list +/mob/living/proc/get_blood_dna_list() + var/blood_id = get_blood_id() + if(!(blood_id in GLOB.blood_reagent_types)) + return + return list("ANIMAL DNA" = "Y-") + +/mob/living/carbon/get_blood_dna_list() + var/blood_id = get_blood_id() + if(!(blood_id in GLOB.blood_reagent_types)) + return + var/list/blood_dna = list() + if(dna) + blood_dna[dna.unique_enzymes] = dna.blood_type + else + blood_dna["UNKNOWN DNA"] = "X*" + return blood_dna + +/mob/living/carbon/alien/get_blood_dna_list() + return list("UNKNOWN DNA" = "X*") + +//to add a mob's dna info into an object's blood_DNA list. +/atom/proc/transfer_mob_blood_dna(mob/living/L) + // Returns 0 if we have that blood already + var/new_blood_dna = L.get_blood_dna_list() + if(!new_blood_dna) + return FALSE + LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it. + var/old_length = blood_DNA.len + blood_DNA |= new_blood_dna + if(blood_DNA.len == old_length) + return FALSE + return TRUE + +//to add blood dna info to the object's blood_DNA list +/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases) + LAZYINITLIST(blood_DNA) + var/old_length = blood_DNA.len + blood_DNA |= blood_dna + if(blood_DNA.len > old_length) + return TRUE + //some new blood DNA was added + +//to add blood from a mob onto something, and transfer their dna info +/atom/proc/add_mob_blood(mob/living/M) + var/list/blood_dna = M.get_blood_dna_list() + if(!blood_dna) + return FALSE + return add_blood_DNA(blood_dna, M.diseases) + +//to add blood onto something, with blood dna info to include. +/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return FALSE + +/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return transfer_blood_dna(blood_dna, diseases) + +/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + if(!.) + return + add_blood_overlay() + +/obj/item/proc/add_blood_overlay() + if(!blood_DNA.len) + return + if(initial(icon) && initial(icon_state)) + blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY) + add_overlay(blood_splatter_icon) + +/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + transfer_blood = rand(2, 4) + +/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) + B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal. + return TRUE //we bloodied the floor + +/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + if(head) + head.add_blood_DNA(blood_dna, diseases) + update_inv_head() + else if(wear_mask) + wear_mask.add_blood_DNA(blood_dna, diseases) + update_inv_wear_mask() + if(wear_neck) + wear_neck.add_blood_DNA(blood_dna, diseases) + update_inv_neck() + if(wear_suit) + wear_suit.add_blood_DNA(blood_dna, diseases) + update_inv_wear_suit() + else if(w_uniform) + w_uniform.add_blood_DNA(blood_dna, diseases) + update_inv_w_uniform() + if(gloves) + var/obj/item/clothing/gloves/G = gloves + G.add_blood_DNA(blood_dna, diseases) + else + transfer_blood_dna(blood_dna, diseases) + bloody_hands = rand(2, 4) + update_inv_gloves() //handles bloody hands overlays and updating + return TRUE + +/atom/proc/blood_DNA_to_color() + var/list/colors = list()//first we make a list of all bloodtypes present + for(var/bloop in blood_DNA) + if(colors[blood_DNA[bloop]]) + colors[blood_DNA[bloop]]++ + else + colors[blood_DNA[bloop]] = 1 + + var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up + + if(colors.len) + var/sum = 0 //this is all shitcode, but it works; trust me + final_rgb = bloodtype_to_color(colors[1]) + sum = colors[colors[1]] + if(colors.len > 1) + var/i = 2 + while(i <= colors.len) + var/tmp = colors[colors[i]] + final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum)) + sum += tmp + i++ + + return final_rgb + +/atom/proc/clean_blood() + . = blood_DNA? TRUE : FALSE + blood_DNA = null + +/atom/proc/wash_cream() + return TRUE + +/atom/proc/isinspace() + if(isspaceturf(get_turf(src))) + return TRUE + else + return FALSE + +/atom/proc/handle_fall() + return + +/atom/proc/singularity_act() + return + +/atom/proc/singularity_pull(obj/singularity/S, current_size) + SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size) + +/atom/proc/acid_act(acidpwr, acid_volume) + SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) + +/atom/proc/emag_act() + SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT) + +/atom/proc/rad_act(strength) + if(istype(get_turf(src), /turf/open/pool)) + var/turf/open/pool/PL = get_turf(src) + if(PL.filled == TRUE) + strength *= 0.15 + SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength) + +/atom/proc/narsie_act() + SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT) + +/atom/proc/ratvar_act() + SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT) + +/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + return FALSE + +/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) + return FALSE + +/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user) + if(GetComponent(/datum/component/storage)) + return component_storage_contents_dump_act(src_object, user) + return FALSE + +/atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user) + var/list/things = src_object.contents() + var/datum/progressbar/progress = new(user, things.len, src) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) + stoplag(1) + qdel(progress) + to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") + STR.orient2hud(user) + src_object.orient2hud(user) + if(user.active_storage) //refresh the HUD to show the transfered contents + user.active_storage.close(user) + user.active_storage.show_to(user) + return TRUE + +/atom/proc/get_dumping_location(obj/item/storage/source,mob/user) + return null + +//This proc is called on the location of an atom when the atom is Destroy()'d +/atom/proc/handle_atom_del(atom/A) + SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A) + +//called when the turf the atom resides on is ChangeTurfed +/atom/proc/HandleTurfChange(turf/T) + for(var/a in src) + var/atom/A = a + A.HandleTurfChange(T) + +//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it) +/atom/proc/get_remote_view_fullscreens(mob/user) + return + +//the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera) +/atom/proc/update_remote_sight(mob/living/user) + return + + +//Hook for running code when a dir change occurs +/atom/proc/setDir(newdir) + SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) + dir = newdir + +/atom/proc/mech_melee_attack(obj/mecha/M) + return + +//If a mob logouts/logins in side of an object you can use this proc +/atom/proc/on_log(login) + if(loc) + loc.on_log(login) + + +/* + Atom Colour Priority System + A System that gives finer control over which atom colour to colour the atom with. + The "highest priority" one is always displayed as opposed to the default of + "whichever was set last is displayed" +*/ + + +/* + Adds an instance of colour_type to the atom's atom_colours list +*/ +/atom/proc/add_atom_colour(coloration, colour_priority) + if(!atom_colours || !atom_colours.len) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + if(!coloration) + return + if(colour_priority > atom_colours.len) + return + atom_colours[colour_priority] = coloration + update_atom_colour() + + +/* + Removes an instance of colour_type from the atom's atom_colours list +*/ +/atom/proc/remove_atom_colour(colour_priority, coloration) + if(!atom_colours) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + if(colour_priority > atom_colours.len) + return + if(coloration && atom_colours[colour_priority] != coloration) + return //if we don't have the expected color (for a specific priority) to remove, do nothing + atom_colours[colour_priority] = null + update_atom_colour() + + +/* + Resets the atom's color to null, and then sets it to the highest priority + colour available +*/ +/atom/proc/update_atom_colour() + if(!atom_colours) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + color = null + for(var/C in atom_colours) + if(islist(C)) + var/list/L = C + if(L.len) + color = L + return + else if(C) + color = C + return + +/atom/vv_edit_var(var_name, var_value) + if(!GLOB.Debug2) + flags_1 |= ADMIN_SPAWNED_1 + . = ..() + switch(var_name) + if("color") + add_atom_colour(color, ADMIN_COLOUR_PRIORITY) + +/atom/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("", "---------") + if(!ismovableatom(src)) + var/turf/curturf = get_turf(src) + if(curturf) + . += "" + VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRANSFORM, "Modify Transform") + VV_DROPDOWN_OPTION(VV_HK_ADD_REAGENT, "Add Reagent") + VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EMP, "EMP Pulse") + VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") + +/atom/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_ADD_REAGENT] && check_rights(R_VAREDIT)) + if(!reagents) + var/amount = input(usr, "Specify the reagent size of [src]", "Set Reagent Size", 50) as num + if(amount) + create_reagents(amount) + + if(reagents) + var/chosen_id = choose_reagent_id(usr) + if(chosen_id) + var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", reagents.maximum_volume) as num + if(amount) + reagents.add_reagent(chosen_id, amount) + log_admin("[key_name(usr)] has added [amount] units of [chosen_id] to [src]") + message_admins("[key_name(usr)] has added [amount] units of [chosen_id] to [src]") + if(href_list[VV_HK_TRIGGER_EXPLOSION] && check_rights(R_FUN)) + usr.client.cmd_admin_explosion(src) + if(href_list[VV_HK_TRIGGER_EMP] && check_rights(R_FUN)) + usr.client.cmd_admin_emp(src) + if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT)) + var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") + var/matrix/M = transform + switch(result) + if("Scale") + var/x = input(usr, "Choose x mod","Transform Mod") as null|num + var/y = input(usr, "Choose y mod","Transform Mod") as null|num + if(!isnull(x) && !isnull(y)) + transform = M.Scale(x,y) + if("Translate") + var/x = input(usr, "Choose x mod","Transform Mod") as null|num + var/y = input(usr, "Choose y mod","Transform Mod") as null|num + if(!isnull(x) && !isnull(y)) + transform = M.Translate(x,y) + if("Rotate") + var/angle = input(usr, "Choose angle to rotate","Transform Mod") as null|num + if(!isnull(angle)) + transform = M.Turn(angle) + if(href_list[VV_HK_AUTO_RENAME] && check_rights(R_VAREDIT)) + var/newname = input(usr, "What do you want to rename this to?", "Automatic Rename") as null|text + if(newname) + vv_auto_rename(newname) + +/atom/vv_get_header() + . = ..() + var/refid = REF(src) + . += "[VV_HREF_TARGETREF(refid, VV_HK_AUTO_RENAME, "[src]")]" + . += "
    << [dir2text(dir) || dir] >>" + +/atom/proc/drop_location() + var/atom/L = loc + if(!L) + return null + return L.AllowDrop() ? L : L.drop_location() + +/atom/proc/vv_auto_rename(newname) + name = newname + +/atom/Entered(atom/movable/AM, atom/oldLoc) + SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) + +/atom/Exit(atom/movable/AM, atom/newLoc) + . = ..() + if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT) + return FALSE + +/atom/Exited(atom/movable/AM, atom/newLoc) + SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc) + +/atom/proc/return_temperature() + return + +// Tool behavior procedure. Redirects to tool-specific procs by default. +// You can override it to catch all tool interactions, for use in complex deconstruction procs. +// Just don't forget to return ..() in the end. +/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) + switch(tool_type) + if(TOOL_CROWBAR) + return crowbar_act(user, I) + if(TOOL_MULTITOOL) + return multitool_act(user, I) + if(TOOL_SCREWDRIVER) + return screwdriver_act(user, I) + if(TOOL_WRENCH) + return wrench_act(user, I) + if(TOOL_WIRECUTTER) + return wirecutter_act(user, I) + if(TOOL_WELDER) + return welder_act(user, I) + if(TOOL_ANALYZER) + return analyzer_act(user, I) + +// Tool-specific behavior procs. To be overridden in subtypes. +/atom/proc/crowbar_act(mob/living/user, obj/item/I) + return + +/atom/proc/multitool_act(mob/living/user, obj/item/I) + return + +/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) + if(!istype(I, /obj/item/multitool)) + if(user && !silent) + to_chat(user, "[I] has no data buffer!") + return FALSE + return TRUE + +/atom/proc/screwdriver_act(mob/living/user, obj/item/I) + SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I) + +/atom/proc/wrench_act(mob/living/user, obj/item/I) + return + +/atom/proc/wirecutter_act(mob/living/user, obj/item/I) + return + +/atom/proc/welder_act(mob/living/user, obj/item/I) + return + +/atom/proc/analyzer_act(mob/living/user, obj/item/I) + return + +/atom/proc/GenerateTag() + return + +// Generic logging helper +/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) + if(!log_globally) + return + + var/log_text = "[key_name(src)] [message] [loc_name(src)]" + switch(message_type) + if(LOG_ATTACK) + log_attack(log_text) + if(LOG_SAY) + log_say(log_text) + if(LOG_WHISPER) + log_whisper(log_text) + if(LOG_EMOTE) + log_emote(log_text) + if(LOG_DSAY) + log_dsay(log_text) + if(LOG_PDA) + log_pda(log_text) + if(LOG_CHAT) + log_chat(log_text) + if(LOG_COMMENT) + log_comment(log_text) + if(LOG_TELECOMMS) + log_telecomms(log_text) + if(LOG_OOC) + log_ooc(log_text) + if(LOG_ADMIN) + log_admin(log_text) + if(LOG_ADMIN_PRIVATE) + log_admin_private(log_text) + if(LOG_ASAY) + log_adminsay(log_text) + if(LOG_OWNERSHIP) + log_game(log_text) + if(LOG_GAME) + log_game(log_text) + else + stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") + log_game(log_text) + +// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements) +/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null) + var/prefix = tag ? "([tag]) " : "" + var/suffix = forced_by ? " FORCED by [forced_by]" : "" + log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally) + +// Helper for logging of messages with only one sender and receiver +/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag) + if(!tag) + stack_trace("Unspecified tag for private message") + tag = "UNKNOWN" + + source.log_talk(message, message_type, tag="[tag] to [key_name(target)]") + if(source != target) + target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE) + +/* +Proc for attack log creation, because really why not +1 argument is the actor performing the action +2 argument is the target of the action +3 is a verb describing the action (e.g. punched, throwed, kicked, etc.) +4 is a tool with which the action was made (usually an item) +5 is any additional text, which will be appended to the rest of the log line +*/ + +/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) + var/ssource = key_name(user) + var/starget = key_name(target) + + var/mob/living/living_target = target + var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : "" + + var/sobject = "" + if(object) + sobject = " with [key_name(object)]" + var/saddition = "" + if(addition) + saddition = " [addition]" + + var/postfix = "[sobject][saddition][hp]" + + var/message = "has [what_done] [starget][postfix]" + user.log_message(message, LOG_ATTACK, color="red") + + if(user != target) + var/reverse_message = "has been [what_done] by [ssource][postfix]" + target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) + +// Filter stuff +/atom/movable/proc/add_filter(name,priority,list/params) + LAZYINITLIST(filter_data) + var/list/p = params.Copy() + p["priority"] = priority + filter_data[name] = p + update_filters() + +/atom/movable/proc/update_filters() + filters = null + filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) + for(var/f in filter_data) + var/list/data = filter_data[f] + var/list/arguments = data.Copy() + arguments -= "priority" + filters += filter(arglist(arguments)) + +/atom/movable/proc/get_filter(name) + if(filter_data) + if(filter_data[name]) + return filters[filter_data.Find(name)] + +/atom/movable/proc/remove_filter(name) + if(filter_data) + if(filter_data[name]) + filter_data -= name + update_filters() + return TRUE + +/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) + . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) + +///Passes Stat Browser Panel clicks to the game and calls client click on an atom +/atom/Topic(href, list/href_list) + . = ..() + if(!usr?.client) + return + var/client/usr_client = usr.client + var/list/paramslist = list() + if(href_list["statpanel_item_shiftclick"]) + paramslist["shift"] = "1" + if(href_list["statpanel_item_ctrlclick"]) + paramslist["ctrl"] = "1" + if(href_list["statpanel_item_altclick"]) + paramslist["alt"] = "1" + if(href_list["statpanel_item_click"]) + // first of all make sure we valid + var/mouseparams = list2params(paramslist) + usr_client.Click(src, loc, null, mouseparams) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 3af57b72..0331e5aa 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -794,9 +794,8 @@ /atom/movable/vv_get_dropdown() . = ..() - . -= "Jump to" - .["Follow"] = "?_src_=holder;[HrefToken()];adminplayerobservefollow=[REF(src)]" - .["Get"] = "?_src_=holder;[HrefToken()];admingetmovable=[REF(src)]" + . += "" + . += "" /atom/movable/proc/ex_check(ex_id) if(!ex_id) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 282311b5..fdad7fc9 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,252 +1,321 @@ - -/obj - var/crit_fail = FALSE - animate_movement = 2 - speech_span = SPAN_ROBOT - var/obj_flags = CAN_BE_HIT - var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. - - var/damtype = BRUTE - var/force = 0 - - var/datum/armor/armor - var/obj_integrity //defaults to max_integrity - var/max_integrity = 500 - var/integrity_failure = 0 //0 if we have no special broken behavior - - var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF - - var/acid_level = 0 //how much acid is on that obj - - var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. - var/current_skin //the item reskin - var/list/unique_reskin //List of options to reskin. - var/always_reskinnable = FALSE - - // Access levels, used in modules\jobs\access.dm - var/list/req_access - var/req_access_txt = "0" - var/list/req_one_access - var/req_one_access_txt = "0" - - var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object - - vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. - -/obj/vv_edit_var(vname, vval) - switch(vname) - if("anchored") - setAnchored(vval) - return TRUE - if("obj_flags") - if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION)) - return FALSE - if("control_object") - var/obj/O = vval - if(istype(O) && (O.obj_flags & DANGEROUS_POSSESSION)) - return FALSE - return ..() - -/obj/Initialize() - . = ..() - if (islist(armor)) - armor = getArmor(arglist(armor)) - else if (!armor) - armor = getArmor() - else if (!istype(armor, /datum/armor)) - stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()") - - if(obj_integrity == null) - obj_integrity = max_integrity - if (set_obj_flags) - var/flagslist = splittext(set_obj_flags,";") - var/list/string_to_objflag = GLOB.bitfields["obj_flags"] - for (var/flag in flagslist) - if(flag[1] == "!") - flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial ! - obj_flags &= ~string_to_objflag[flag] - else - obj_flags |= string_to_objflag[flag] - if((obj_flags & ON_BLUEPRINTS) && isturf(loc)) - var/turf/T = loc - T.add_blueprints_preround(src) - - -/obj/Destroy(force=FALSE) - if(!ismachinery(src)) - STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists - SStgui.close_uis(src) - . = ..() - -/obj/proc/setAnchored(anchorvalue) - SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) - anchored = anchorvalue - -/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) - . = ..() - if(obj_flags & FROZEN) - visible_message("[src] shatters into a million pieces!") - qdel(src) - - -/obj/assume_air(datum/gas_mixture/giver) - if(loc) - return loc.assume_air(giver) - else - return null - -/obj/remove_air(amount) - if(loc) - return loc.remove_air(amount) - else - return null - -/obj/return_air() - if(loc) - return loc.return_air() - else - return null - -/obj/proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request) - //Return: (NONSTANDARD) - // null if object handles breathing logic for lifeform - // datum/air_group to tell lifeform to process using that breath return - //DEFAULT: Take air from turf to give to have mob process - - if(breath_request>0) - var/datum/gas_mixture/environment = return_air() - var/breath_percentage = BREATH_VOLUME / environment.return_volume() - return remove_air(environment.total_moles() * breath_percentage) - else - return null - -/obj/proc/updateUsrDialog() - if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) - var/is_in_use = FALSE - var/list/nearby = viewers(1, src) - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) - is_in_use = TRUE - ui_interact(M) - if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr)) - if (!(usr in nearby)) - if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. - is_in_use = TRUE - ui_interact(usr) - - // check for TK users - - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - if(!(usr in nearby)) - if(usr.client && usr.machine==src) - if(H.dna.check_mutation(TK)) - is_in_use = TRUE - ui_interact(usr) - if (is_in_use) - obj_flags |= IN_USE - else - obj_flags &= ~IN_USE - -/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) - // Check that people are actually using the machine. If not, don't update anymore. - if(obj_flags & IN_USE) - var/is_in_use = FALSE - if(update_viewers) - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - is_in_use = TRUE - src.interact(M) - var/ai_in_use = FALSE - if(update_ais) - ai_in_use = AutoUpdateAI(src) - - if(update_viewers && update_ais) //State change is sure only if we check both - if(!ai_in_use && !is_in_use) - obj_flags &= ~IN_USE - - -/obj/attack_ghost(mob/user) - . = ..() - if(.) - return - ui_interact(user) - -/obj/proc/container_resist(mob/living/user) - return - -/mob/proc/unset_machine() - if(machine) - machine.on_unset_machine(src) - machine = null - -//called when the user unsets the machine. -/atom/movable/proc/on_unset_machine(mob/user) - return - -/mob/proc/set_machine(obj/O) - if(src.machine) - unset_machine() - src.machine = O - if(istype(O)) - O.obj_flags |= IN_USE - -/obj/item/proc/updateSelfDialog() - var/mob/M = src.loc - if(istype(M) && M.client && M.machine == src) - src.attack_self(M) - -/obj/proc/hide(h) - return - -/obj/singularity_pull(S, current_size) - ..() - if(!anchored || current_size >= STAGE_FIVE) - step_towards(src,S) - -/obj/get_dumping_location(datum/component/storage/source,mob/user) - return get_turf(src) - -/obj/proc/CanAStarPass() - . = !density - -/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)]" - .["Osay"] = "?_src_=vars;[HrefToken()];osay[REF(src)]" - .["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]" - -/obj/examine(mob/user) - . = ..() - if(obj_flags & UNIQUE_RENAME) - . += "Use a pen on it to rename it or change its description." - if(unique_reskin && (!current_skin || always_reskinnable)) - . += "Alt-click it to reskin it." - -/obj/AltClick(mob/user) - . = ..() - if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - reskin_obj(user) - return TRUE - -/obj/proc/reskin_obj(mob/M) - if(!LAZYLEN(unique_reskin)) - return - var/dat = "Reskin options for [name]:\n" - for(var/V in unique_reskin) - var/output = icon2html(src, M, unique_reskin[V]) - dat += "[V]: [output]\n" - to_chat(M, dat) - - var/choice = input(M, always_reskinnable ? "Choose the a reskin for [src]" : "Warning, you can only reskin [src] once!","Reskin Object") as null|anything in unique_reskin - if(QDELETED(src) || !choice || (current_skin && !always_reskinnable) || M.incapacitated() || !in_range(M,src) || !unique_reskin[choice] || unique_reskin[choice] == current_skin) - return - current_skin = choice - icon_state = unique_reskin[choice] - to_chat(M, "[src] is now skinned as '[choice]'.") + +/obj + var/crit_fail = FALSE + animate_movement = 2 + speech_span = SPAN_ROBOT + var/obj_flags = CAN_BE_HIT + var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. + + var/damtype = BRUTE + var/force = 0 + + var/datum/armor/armor + var/obj_integrity //defaults to max_integrity + var/max_integrity = 500 + var/integrity_failure = 0 //0 if we have no special broken behavior + + var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF + + var/acid_level = 0 //how much acid is on that obj + + var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. + var/current_skin //the item reskin + var/list/unique_reskin //List of options to reskin. + var/always_reskinnable = FALSE + + // Access levels, used in modules\jobs\access.dm + var/list/req_access + var/req_access_txt = "0" + var/list/req_one_access + var/req_one_access_txt = "0" + + var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object + + vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. + +/obj/vv_edit_var(vname, vval) + switch(vname) + if("anchored") + setAnchored(vval) + return TRUE + if("obj_flags") + if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION)) + return FALSE + if("control_object") + var/obj/O = vval + if(istype(O) && (O.obj_flags & DANGEROUS_POSSESSION)) + return FALSE + return ..() + +/obj/Initialize() + . = ..() + if (islist(armor)) + armor = getArmor(arglist(armor)) + else if (!armor) + armor = getArmor() + else if (!istype(armor, /datum/armor)) + stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()") + + if(obj_integrity == null) + obj_integrity = max_integrity + if (set_obj_flags) + var/flagslist = splittext(set_obj_flags,";") + var/list/string_to_objflag = GLOB.bitfields["obj_flags"] + for (var/flag in flagslist) + if(flag[1] == "!") + flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial ! + obj_flags &= ~string_to_objflag[flag] + else + obj_flags |= string_to_objflag[flag] + if((obj_flags & ON_BLUEPRINTS) && isturf(loc)) + var/turf/T = loc + T.add_blueprints_preround(src) + + +/obj/Destroy(force=FALSE) + if(!ismachinery(src)) + STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + SStgui.close_uis(src) + . = ..() + +/obj/proc/setAnchored(anchorvalue) + SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) + anchored = anchorvalue + +/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) + . = ..() + if(obj_flags & FROZEN) + visible_message("[src] shatters into a million pieces!") + qdel(src) + + +/obj/assume_air(datum/gas_mixture/giver) + if(loc) + return loc.assume_air(giver) + else + return null + +/obj/remove_air(amount) + if(loc) + return loc.remove_air(amount) + else + return null + +/obj/return_air() + if(loc) + return loc.return_air() + else + return null + +/obj/proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request) + //Return: (NONSTANDARD) + // null if object handles breathing logic for lifeform + // datum/air_group to tell lifeform to process using that breath return + //DEFAULT: Take air from turf to give to have mob process + + if(breath_request>0) + var/datum/gas_mixture/environment = return_air() + var/breath_percentage = BREATH_VOLUME / environment.return_volume() + return remove_air(environment.total_moles() * breath_percentage) + else + return null + +/obj/proc/updateUsrDialog() + if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) + var/is_in_use = FALSE + var/list/nearby = viewers(1, src) + for(var/mob/M in nearby) + if ((M.client && M.machine == src)) + is_in_use = TRUE + ui_interact(M) + if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr)) + if (!(usr in nearby)) + if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. + is_in_use = TRUE + ui_interact(usr) + + // check for TK users + + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + if(!(usr in nearby)) + if(usr.client && usr.machine==src) + if(H.dna.check_mutation(TK)) + is_in_use = TRUE + ui_interact(usr) + if (is_in_use) + obj_flags |= IN_USE + else + obj_flags &= ~IN_USE + +/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) + // Check that people are actually using the machine. If not, don't update anymore. + if(obj_flags & IN_USE) + var/is_in_use = FALSE + if(update_viewers) + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + is_in_use = TRUE + src.interact(M) + var/ai_in_use = FALSE + if(update_ais) + ai_in_use = AutoUpdateAI(src) + + if(update_viewers && update_ais) //State change is sure only if we check both + if(!ai_in_use && !is_in_use) + obj_flags &= ~IN_USE + + +/obj/attack_ghost(mob/user) + . = ..() + if(.) + return + ui_interact(user) + +/obj/proc/container_resist(mob/living/user) + return + +/mob/proc/unset_machine() + if(machine) + machine.on_unset_machine(src) + machine = null + +//called when the user unsets the machine. +/atom/movable/proc/on_unset_machine(mob/user) + return + +/mob/proc/set_machine(obj/O) + if(src.machine) + unset_machine() + src.machine = O + if(istype(O)) + O.obj_flags |= IN_USE + +/obj/item/proc/updateSelfDialog() + var/mob/M = src.loc + if(istype(M) && M.client && M.machine == src) + src.attack_self(M) + +/obj/proc/hide(h) + return + +/obj/singularity_pull(S, current_size) + ..() + if(!anchored || current_size >= STAGE_FIVE) + step_towards(src,S) + +/obj/get_dumping_location(datum/component/storage/source,mob/user) + return get_turf(src) + +/obj/proc/CanAStarPass() + . = !density + +/obj/proc/check_uplink_validity() + return 1 + +/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc) + return + +/obj/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("", "---") + VV_DROPDOWN_OPTION(VV_HK_MASS_DEL_TYPE, "Delete all of type") + VV_DROPDOWN_OPTION(VV_HK_OSAY, "Object Say") + VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify armor values") + +/obj/vv_do_topic(list/href_list) + if(!(. = ..())) + return + if(href_list[VV_HK_OSAY]) + if(check_rights(R_FUN, FALSE)) + usr.client.object_say(src) + if(href_list[VV_HK_ARMOR_MOD]) + var/list/pickerlist = list() + var/list/armorlist = armor.getList() + + for (var/i in armorlist) + pickerlist += list(list("value" = armorlist[i], "name" = i)) + + var/list/result = presentpicker(usr, "Modify armor", "Modify armor: [src]", Button1="Save", Button2 = "Cancel", Timeout=FALSE, inputtype = "text", values = pickerlist) + + if (islist(result)) + if (result["button"] != 2) // If the user pressed the cancel button + // text2num conveniently returns a null on invalid values + armor = armor.setRating(melee = text2num(result["values"]["melee"]),\ + bullet = text2num(result["values"]["bullet"]),\ + laser = text2num(result["values"]["laser"]),\ + energy = text2num(result["values"]["energy"]),\ + bomb = text2num(result["values"]["bomb"]),\ + bio = text2num(result["values"]["bio"]),\ + rad = text2num(result["values"]["rad"]),\ + fire = text2num(result["values"]["fire"]),\ + acid = text2num(result["values"]["acid"])) + log_admin("[key_name(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]") + message_admins("[key_name_admin(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]") + if(href_list[VV_HK_MASS_DEL_TYPE]) + if(check_rights(R_DEBUG|R_SERVER)) + var/action_type = alert("Strict type ([type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel") + if(action_type == "Cancel" || !action_type) + return + + if(alert("Are you really sure you want to delete all objects of type [type]?",,"Yes","No") != "Yes") + return + + if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes") + return + + var/O_type = type + switch(action_type) + if("Strict type") + var/i = 0 + for(var/obj/Obj in world) + if(Obj.type == O_type) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No objects of this type exist") + return + log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") + message_admins("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") + if("Type and subtypes") + var/i = 0 + for(var/obj/Obj in world) + if(istype(Obj,O_type)) + i++ + qdel(Obj) + CHECK_TICK + if(!i) + to_chat(usr, "No objects of this type exist") + return + log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") + message_admins("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") + +/obj/examine(mob/user) + . = ..() + if(obj_flags & UNIQUE_RENAME) + . += "Use a pen on it to rename it or change its description." + if(unique_reskin && (!current_skin || always_reskinnable)) + . += "Alt-click it to reskin it." + +/obj/AltClick(mob/user) + . = ..() + if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + reskin_obj(user) + return TRUE + +/obj/proc/reskin_obj(mob/M) + if(!LAZYLEN(unique_reskin)) + return + var/dat = "Reskin options for [name]:\n" + for(var/V in unique_reskin) + var/output = icon2html(src, M, unique_reskin[V]) + dat += "[V]: [output]\n" + to_chat(M, dat) + + var/choice = input(M, always_reskinnable ? "Choose the a reskin for [src]" : "Warning, you can only reskin [src] once!","Reskin Object") as null|anything in unique_reskin + if(QDELETED(src) || !choice || (current_skin && !always_reskinnable) || M.incapacitated() || !in_range(M,src) || !unique_reskin[choice] || unique_reskin[choice] == current_skin) + return + current_skin = choice + icon_state = unique_reskin[choice] + to_chat(M, "[src] is now skinned as '[choice]'.") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 37373f49..149e020e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) /client/proc/revokebunkerbypass, /client/proc/stop_sounds, /client/proc/debugstatpanel, + /client/proc/mark_datum_mapview, /client/proc/hide_verbs, /*hides all our adminverbs*/ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /datum/admins/proc/open_borgopanel diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm new file mode 100644 index 00000000..3de5e39f --- /dev/null +++ b/code/modules/admin/callproc/callproc.dm @@ -0,0 +1,208 @@ + +/client/proc/callproc() + set category = "Debug" + set name = "Advanced ProcCall" + set waitfor = FALSE + callproc_blocking() + +/client/proc/callproc_blocking(list/get_retval) + if(!check_rights(R_DEBUG)) + return + + var/datum/target + var/targetselected = FALSE + var/returnval + + switch(alert("Proc owned by something?",,"Yes","No")) + if("Yes") + targetselected = TRUE + var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_CLIENT, VV_MARKED_DATUM, VV_TEXT_LOCATE, VV_PROCCALL_RETVAL)) + if (!value["class"] || !value["value"]) + return + target = value["value"] + if(!istype(target)) + to_chat(usr, "Invalid target.") + return + if("No") + target = null + targetselected = FALSE + + var/procpath = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null + if(!procpath) + return + + //strip away everything but the proc name + var/list/proclist = splittext(procpath, "/") + if (!length(proclist)) + return + + var/procname = proclist[proclist.len] + var/proctype = ("verb" in proclist) ? "verb" :"proc" + + if(targetselected) + if(!hascall(target, procname)) + to_chat(usr, "Error: callproc(): type [target.type] has no [proctype] named [procpath].") + return + else + procpath = "/[proctype]/[procname]" + if(!text2path(procpath)) + to_chat(usr, "Error: callproc(): [procpath] does not exist.") + return + + var/list/lst = get_callproc_args() + if(!lst) + return + + if(targetselected) + if(!target) + to_chat(usr, "Error: callproc(): owner of proc no longer exists.") + return + var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." + log_admin(msg) + message_admins(msg) //Proccall announce removed. + admin_ticket_log(target, msg) + returnval = WrapAdminProcCall(target, procname, lst) // Pass the lst as an argument list to the proc + else + //this currently has no hascall protection. wasn't able to get it working. + log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") + message_admins("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].") //Proccall announce removed. + returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc + SSblackbox.record_feedback("tally", "admin_verb", 1, "Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(get_retval) + get_retval += returnval + . = get_callproc_returnval(returnval, procname) + if(.) + to_chat(usr, .) + +GLOBAL_VAR(AdminProcCaller) +GLOBAL_PROTECT(AdminProcCaller) +GLOBAL_VAR_INIT(AdminProcCallCount, 0) +GLOBAL_PROTECT(AdminProcCallCount) +GLOBAL_VAR(LastAdminCalledTargetRef) +GLOBAL_PROTECT(LastAdminCalledTargetRef) +GLOBAL_VAR(LastAdminCalledTarget) +GLOBAL_PROTECT(LastAdminCalledTarget) +GLOBAL_VAR(LastAdminCalledProc) +GLOBAL_PROTECT(LastAdminCalledProc) +GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention) +GLOBAL_PROTECT(AdminProcCallSpamPrevention) + +/proc/WrapAdminProcCall(datum/target, procname, list/arguments) + if(target != GLOBAL_PROC && procname == "Del") + to_chat(usr, "Calling Del() is not allowed") + return + + if(target != GLOBAL_PROC && !target.CanProcCall(procname)) + to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!") + return + var/current_caller = GLOB.AdminProcCaller + var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller + if(!ckey) + CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]") + if(current_caller && current_caller != ckey) + if(!GLOB.AdminProcCallSpamPrevention[ckey]) + to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") + GLOB.AdminProcCallSpamPrevention[ckey] = TRUE + UNTIL(!GLOB.AdminProcCaller) + to_chat(usr, "Running your proc") + GLOB.AdminProcCallSpamPrevention -= ckey + else + UNTIL(!GLOB.AdminProcCaller) + GLOB.LastAdminCalledProc = procname + if(target != GLOBAL_PROC) + GLOB.LastAdminCalledTargetRef = "[REF(target)]" + GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you + ++GLOB.AdminProcCallCount + . = world.WrapAdminProcCall(target, procname, arguments) + if(--GLOB.AdminProcCallCount == 0) + GLOB.AdminProcCaller = null + +//adv proc call this, ya nerds +/world/proc/WrapAdminProcCall(datum/target, procname, list/arguments) + if(target == GLOBAL_PROC) + return call(procname)(arglist(arguments)) + else if(target != world) + return call(target, procname)(arglist(arguments)) + else + log_admin_private("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]") + +/proc/IsAdminAdvancedProcCall() +#ifdef TESTING + return FALSE +#else + return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey +#endif + +/client/proc/callproc_datum(datum/A as null|area|mob|obj|turf) + set category = "Debug" + set name = "Atom ProcCall" + set waitfor = FALSE + + if(!check_rights(R_DEBUG)) + return + + var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null + if(!procname) + return + if(!hascall(A,procname)) + to_chat(usr, "Error: callproc_datum(): type [A.type] has no proc named [procname].") + return + var/list/lst = get_callproc_args() + if(!lst) + return + + if(!A || !IsValidSrc(A)) + to_chat(usr, "Error: callproc_datum(): owner of proc no longer exists.") + return + var/msg = "[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." + log_admin(msg) + message_admins(msg) + admin_ticket_log(A, msg) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc + . = get_callproc_returnval(returnval,procname) + if(.) + to_chat(usr, .) + +/client/proc/get_callproc_args() + var/argnum = input("Number of arguments","Number:",0) as num|null + if(isnull(argnum)) + return + + . = list() + var/list/named_args = list() + while(argnum--) + var/named_arg = input("Leave blank for positional argument. Positional arguments will be considered as if they were added first.", "Named argument") as text|null + var/value = vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT)) + if (!value["class"]) + return + if(named_arg) + named_args[named_arg] = value["value"] + else + . += value["value"] + if(LAZYLEN(named_args)) + . += named_args + +/client/proc/get_callproc_returnval(returnval,procname) + . = "" + if(islist(returnval)) + var/list/returnedlist = returnval + . = "" + if(returnedlist.len) + var/assoc_check = returnedlist[1] + if(istext(assoc_check) && (returnedlist[assoc_check] != null)) + . += "[procname] returned an associative list:" + for(var/key in returnedlist) + . += "\n[key] = [returnedlist[key]]" + + else + . += "[procname] returned a list:" + for(var/elem in returnedlist) + . += "\n[elem]" + else + . = "[procname] returned an empty list" + . += "" + + else + . = "[procname] returned: [!isnull(returnval) ? returnval : "null"]" diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index ac028d5d..f6df2a5d 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -15,214 +15,6 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Debug Two") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/* 21st Sept 2010 -Updated by Skie -- Still not perfect but better! -Stuff you can't do: -Call proc /mob/proc/Dizzy() for some player -Because if you select a player mob as owner it tries to do the proc for -/mob/living/carbon/human/ instead. And that gives a run-time error. -But you can call procs that are of type /mob/living/carbon/human/proc/ for that player. -*/ - -/client/proc/callproc() - set category = "Debug" - set name = "Advanced ProcCall" - set waitfor = FALSE - - if(!check_rights(R_DEBUG)) - return - - var/datum/target = null - var/targetselected = FALSE - var/returnval = null - - if(alert("Proc owned by something?",,"Yes","No") == "Yes") - targetselected = TRUE - var/list/value = vv_get_value(default_class = VV_ATOM_REFERENCE, classes = list(VV_ATOM_REFERENCE, VV_DATUM_REFERENCE, VV_MOB_REFERENCE, VV_CLIENT)) - if (!value["class"] || !value["value"]) - return - target = value["value"] - - var/procpath = input("Proc path, eg: /proc/fake_blood","Path:", null) as text|null - if(!procpath) - return - - //strip away everything but the proc name - var/list/proclist = splittext(procpath, "/") - if (!length(proclist)) - return - - var/procname = proclist[proclist.len] - var/proctype = ("verb" in proclist) ? "verb" :"proc" - - if(targetselected) - if(!hascall(target, procname)) - to_chat(usr, "Error: callproc(): type [target.type] has no [proctype] named [procpath].") - return - else - procpath = "/[proctype]/[procname]" - if(!text2path(procpath)) - to_chat(usr, "Error: callproc(): [procpath] does not exist.") - return - - var/list/lst = get_callproc_args() - if(!lst) - return - - if(targetselected) - if(!target) - to_chat(usr, "Error: callproc(): owner of proc no longer exists.") - return - var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]." - log_admin(msg) - message_admins(msg) - admin_ticket_log(target, msg) - returnval = WrapAdminProcCall(target, procname, lst) - else - var/msg = "[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no argument"]." - log_admin(msg) - message_admins(msg) - returnval = WrapAdminProcCall(GLOBAL_PROC, procpath, lst) //calling globals needs full qualified name (e.g /proc/foo) - . = get_callproc_returnval(returnval, procname) - if(.) - to_chat(usr, .) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Advanced ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -GLOBAL_VAR(AdminProcCaller) -GLOBAL_PROTECT(AdminProcCaller) -GLOBAL_VAR_INIT(AdminProcCallCount, 0) -GLOBAL_PROTECT(AdminProcCallCount) -GLOBAL_VAR(LastAdminCalledTargetRef) -GLOBAL_PROTECT(LastAdminCalledTargetRef) -GLOBAL_VAR(LastAdminCalledTarget) -GLOBAL_PROTECT(LastAdminCalledTarget) -GLOBAL_VAR(LastAdminCalledProc) -GLOBAL_PROTECT(LastAdminCalledProc) -GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention) -GLOBAL_PROTECT(AdminProcCallSpamPrevention) - -/proc/WrapAdminProcCall(datum/target, procname, list/arguments) - if(target != GLOBAL_PROC && procname == "Del") - to_chat(usr, "Calling Del() is not allowed") - return - - if(target != GLOBAL_PROC && !target.CanProcCall(procname)) - to_chat(usr, "Proccall on [target.type]/proc/[procname] is disallowed!") - return - var/current_caller = GLOB.AdminProcCaller - var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller - if(!ckey) - CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]") - if(current_caller && current_caller != ckey) - if(!GLOB.AdminProcCallSpamPrevention[ckey]) - to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") - GLOB.AdminProcCallSpamPrevention[ckey] = TRUE - UNTIL(!GLOB.AdminProcCaller) - to_chat(usr, "Running your proc") - GLOB.AdminProcCallSpamPrevention -= ckey - else - UNTIL(!GLOB.AdminProcCaller) - GLOB.LastAdminCalledProc = procname - if(target != GLOBAL_PROC) - GLOB.LastAdminCalledTargetRef = "[REF(target)]" - GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you - ++GLOB.AdminProcCallCount - . = world.WrapAdminProcCall(target, procname, arguments) - if(--GLOB.AdminProcCallCount == 0) - GLOB.AdminProcCaller = null - -//adv proc call this, ya nerds -/world/proc/WrapAdminProcCall(datum/target, procname, list/arguments) - if(target == GLOBAL_PROC) - return call(procname)(arglist(arguments)) - else if(target != world) - return call(target, procname)(arglist(arguments)) - else - log_admin_private("[key_name(usr)] attempted to call world/proc/[procname] with arguments: [english_list(arguments)]") - -/proc/IsAdminAdvancedProcCall() -#ifdef TESTING - return FALSE -#else - return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey -#endif - -/client/proc/callproc_datum(datum/A as null|area|mob|obj|turf) - set category = "Debug" - set name = "Atom ProcCall" - set waitfor = FALSE - - if(!check_rights(R_DEBUG)) - return - - var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null - if(!procname) - return - if(!hascall(A,procname)) - to_chat(usr, "Error: callproc_datum(): type [A.type] has no proc named [procname].") - return - var/list/lst = get_callproc_args() - if(!lst) - return - - if(!A || !IsValidSrc(A)) - to_chat(usr, "Error: callproc_datum(): owner of proc no longer exists.") - return - var/msg = "[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." - log_admin(msg) - message_admins(msg) - admin_ticket_log(A, msg) - SSblackbox.record_feedback("tally", "admin_verb", 1, "Atom ProcCall") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc - . = get_callproc_returnval(returnval,procname) - if(.) - to_chat(usr, .) - -/client/proc/get_callproc_args() - var/argnum = input("Number of arguments","Number:",0) as num|null - if(isnull(argnum)) - return - - . = list() - var/list/named_args = list() - while(argnum--) - var/named_arg = input("Leave blank for positional argument. Positional arguments will be considered as if they were added first.", "Named argument") as text|null - var/value = vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT)) - if (!value["class"]) - return - if(named_arg) - named_args[named_arg] = value["value"] - else - . += value["value"] - if(LAZYLEN(named_args)) - . += named_args - -/client/proc/get_callproc_returnval(returnval,procname) - . = "" - if(islist(returnval)) - var/list/returnedlist = returnval - . = "" - if(returnedlist.len) - var/assoc_check = returnedlist[1] - if(istext(assoc_check) && (returnedlist[assoc_check] != null)) - . += "[procname] returned an associative list:" - for(var/key in returnedlist) - . += "\n[key] = [returnedlist[key]]" - - else - . += "[procname] returned a list:" - for(var/elem in returnedlist) - . += "\n[elem]" - else - . = "[procname] returned an empty list" - . += "" - - else - . = "[procname] returned: [!isnull(returnval) ? returnval : "null"]" - /client/proc/Cell() set category = "Debug" set name = "Air Status in Location" @@ -343,66 +135,6 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) else alert("Invalid mob") -/proc/make_types_fancy(var/list/types) - if (ispath(types)) - types = list(types) - . = list() - for(var/type in types) - var/typename = "[type]" - var/static/list/TYPES_SHORTCUTS = list( - /obj/effect/decal/cleanable = "CLEANABLE", - /obj/item/radio/headset = "HEADSET", - /obj/item/clothing/head/helmet/space = "SPESSHELMET", - /obj/item/book/manual = "MANUAL", - /obj/item/reagent_containers/food/drinks = "DRINK", //longest paths comes first - /obj/item/reagent_containers/food = "FOOD", - /obj/item/reagent_containers = "REAGENT_CONTAINERS", - /obj/machinery/atmospherics = "ATMOS_MECH", - /obj/machinery/portable_atmospherics = "PORT_ATMOS", - /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack = "MECHA_MISSILE_RACK", - /obj/item/mecha_parts/mecha_equipment = "MECHA_EQUIP", - /obj/item/organ = "ORGAN", - /obj/item = "ITEM", - /obj/machinery = "MACHINERY", - /obj/effect = "EFFECT", - /obj = "O", - /datum = "D", - /turf/open = "OPEN", - /turf/closed = "CLOSED", - /turf = "T", - /mob/living/carbon = "CARBON", - /mob/living/simple_animal = "SIMPLE", - /mob/living = "LIVING", - /mob = "M" - ) - for (var/tn in TYPES_SHORTCUTS) - if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ ) - typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/")) - break - .[typename] = type - -/proc/get_fancy_list_of_atom_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(typesof(/atom)) - return pre_generated_list - - -/proc/get_fancy_list_of_datum_types() - var/static/list/pre_generated_list - if (!pre_generated_list) //init - pre_generated_list = make_types_fancy(sortList(typesof(/datum) - typesof(/atom))) - return pre_generated_list - - -/proc/filter_fancy_list(list/L, filter as text) - var/list/matches = new - for(var/key in L) - var/value = L[key] - if(findtext("[key]", filter) || findtext("[value]", filter)) - matches[key] = value - return matches - //TODO: merge the vievars version into this or something maybe mayhaps /client/proc/cmd_debug_del_all(object as text) set category = "Debug" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 01d1902f..e426765f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -594,31 +594,6 @@ Traitors and the like can also be revived with the previous role mostly intact. admin_delete(A) -/client/proc/admin_delete(datum/D) - var/atom/A = D - var/coords = "" - var/jmp_coords = "" - if(istype(A)) - var/turf/T = get_turf(A) - if(T) - coords = "at [COORD(T)]" - jmp_coords = "at [ADMIN_COORDJMP(T)]" - else - jmp_coords = coords = "in nullspace" - - if (alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes") - log_admin("[key_name(usr)] deleted [D] [coords]") - message_admins("[key_name_admin(usr)] deleted [D] [jmp_coords]") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(isturf(D)) - var/turf/T = D - T.ScrapeAway() - else - vv_update_display(D, "deleted", VV_MSG_DELETED) - qdel(D) - if(!QDELETED(D)) - vv_update_display(D, "deleted", "") - /client/proc/cmd_admin_list_open_jobs() set category = "Admin" set name = "Manage Job Slots" diff --git a/code/modules/admin/view_variables/admin_delete.dm b/code/modules/admin/view_variables/admin_delete.dm new file mode 100644 index 00000000..947ad5db --- /dev/null +++ b/code/modules/admin/view_variables/admin_delete.dm @@ -0,0 +1,24 @@ +/client/proc/admin_delete(datum/D) + var/atom/A = D + var/coords = "" + var/jmp_coords = "" + if(istype(A)) + var/turf/T = get_turf(A) + if(T) + coords = "at [COORD(T)]" + jmp_coords = "at [ADMIN_COORDJMP(T)]" + else + jmp_coords = coords = "in nullspace" + + if (alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes") + log_admin("[key_name(usr)] deleted [D] [coords]") + message_admins("[key_name_admin(usr)] deleted [D] [jmp_coords]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Delete") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(isturf(D)) + var/turf/T = D + T.ScrapeAway() + else + vv_update_display(D, "deleted", VV_MSG_DELETED) + qdel(D) + if(!QDELETED(D)) + vv_update_display(D, "deleted", "") diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index e69de29b..23f85cba 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -0,0 +1,76 @@ +#define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing ) +/proc/debug_variable(name, value, level, datum/D, sanitize = TRUE) //if D is a list, name will be index, and value will be assoc value. + var/header + if(D) + if(islist(D)) + var/index = name + if (value) + name = D[name] //name is really the index until this line + else + value = D[name] + header = "
  • ([VV_HREF_TARGET_1V(D, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_REMOVE, "-", index)]) " + else + header = "
  • ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_MASSEDIT, "M", name)]) " + else + header = "
  • " + + var/item + if (isnull(value)) + item = "[VV_HTML_ENCODE(name)] = null" + + else if (istext(value)) + item = "[VV_HTML_ENCODE(name)] = \"[VV_HTML_ENCODE(value)]\"" + + else if (isicon(value)) + #ifdef VARSICON + var/icon/I = icon(value) + var/rnd = rand(1,10000) + var/rname = "tmp[REF(I)][rnd].png" + usr << browse_rsc(I, rname) + item = "[VV_HTML_ENCODE(name)] = ([value]) " + #else + item = "[VV_HTML_ENCODE(name)] = /icon ([value])" + #endif + + else if (isfile(value)) + item = "[VV_HTML_ENCODE(name)] = '[value]'" + + else if (istype(value, /datum)) + var/datum/DV = value + if ("[DV]" != "[DV.type]") //if the thing as a name var, lets use it. + item = "[VV_HTML_ENCODE(name)] [REF(value)] = [DV] [DV.type]" + else + item = "[VV_HTML_ENCODE(name)] [REF(value)] = [DV.type]" + + else if (islist(value)) + var/list/L = value + var/list/items = list() + + if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))) + for (var/i in 1 to L.len) + var/key = L[i] + var/val + if (IS_NORMAL_LIST(L) && !isnum(key)) + val = L[key] + if (isnull(val)) // we still want to display non-null false values, such as 0 or "" + val = key + key = i + + items += debug_variable(key, val, level + 1, sanitize = sanitize) + + item = "[VV_HTML_ENCODE(name)] = /list ([L.len])
      [items.Join()]
    " + else + item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" + + else if (name in GLOB.bitfields) + var/list/flags = list() + for (var/i in GLOB.bitfields[name]) + if (value & GLOB.bitfields[name][i]) + flags += i + item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(jointext(flags, ", "))]" + else + item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(value)]" + + return "[header][item]
  • " + +#undef VV_HTML_ENCODE diff --git a/code/modules/admin/view_variables/get_variables.dm b/code/modules/admin/view_variables/get_variables.dm new file mode 100644 index 00000000..3f90002e --- /dev/null +++ b/code/modules/admin/view_variables/get_variables.dm @@ -0,0 +1,271 @@ +/client/proc/vv_get_class(var_name, var_value) + if(isnull(var_value)) + . = VV_NULL + + else if(isnum(var_value)) + if(var_name in GLOB.bitfields) + . = VV_BITFIELD + else + . = VV_NUM + + else if(istext(var_value)) + if(findtext(var_value, "\n")) + . = VV_MESSAGE + else + . = VV_TEXT + + else if(isicon(var_value)) + . = VV_ICON + + else if(ismob(var_value)) + . = VV_MOB_REFERENCE + + else if(isloc(var_value)) + . = VV_ATOM_REFERENCE + + else if(istype(var_value, /client)) + . = VV_CLIENT + + else if(istype(var_value, /datum)) + . = VV_DATUM_REFERENCE + + else if(ispath(var_value)) + if(ispath(var_value, /atom)) + . = VV_ATOM_TYPE + else if(ispath(var_value, /datum)) + . = VV_DATUM_TYPE + else + . = VV_TYPE + + else if(islist(var_value)) + . = VV_LIST + + else if(isfile(var_value)) + . = VV_FILE + else + . = VV_NULL + +/client/proc/vv_get_value(class, default_class, current_value, list/restricted_classes, list/extra_classes, list/classes, var_name) + . = list("class" = class, "value" = null) + if(!class) + if(!classes) + classes = list ( + VV_NUM, + VV_TEXT, + VV_MESSAGE, + VV_ICON, + VV_ATOM_REFERENCE, + VV_DATUM_REFERENCE, + VV_MOB_REFERENCE, + VV_CLIENT, + VV_ATOM_TYPE, + VV_DATUM_TYPE, + VV_TYPE, + VV_FILE, + VV_NEW_ATOM, + VV_NEW_DATUM, + VV_NEW_TYPE, + VV_NEW_LIST, + VV_NULL, + VV_RESTORE_DEFAULT, + VV_TEXT_LOCATE, + VV_PROCCALL_RETVAL, + ) + + var/markstring + if(!(VV_MARKED_DATUM in restricted_classes)) + markstring = "[VV_MARKED_DATUM] (CURRENT: [(istype(holder) && istype(holder.marked_datum))? holder.marked_datum.type : "NULL"])" + classes += markstring + + if(restricted_classes) + classes -= restricted_classes + + if(extra_classes) + classes += extra_classes + + .["class"] = input(src, "What kind of data?", "Variable Type", default_class) as null|anything in classes + if(holder && holder.marked_datum && .["class"] == markstring) + .["class"] = VV_MARKED_DATUM + + switch(.["class"]) + if(VV_TEXT) + .["value"] = input("Enter new text:", "Text", current_value) as null|text + if(.["value"] == null) + .["class"] = null + return + if(VV_MESSAGE) + .["value"] = input("Enter new text:", "Text", current_value) as null|message + if(.["value"] == null) + .["class"] = null + return + + + if(VV_NUM) + .["value"] = input("Enter new number:", "Num", current_value) as null|num + if(.["value"] == null) + .["class"] = null + return + + if(VV_BITFIELD) + .["value"] = input_bitfield(usr, "Editing bitfield: [var_name]", var_name, current_value) + if(.["value"] == null) + .["class"] = null + return + + if(VV_ATOM_TYPE) + .["value"] = pick_closest_path(FALSE) + if(.["value"] == null) + .["class"] = null + return + + if(VV_DATUM_TYPE) + .["value"] = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) + if(.["value"] == null) + .["class"] = null + return + + if(VV_TYPE) + var/type = current_value + var/error = "" + do + type = input("Enter type:[error]", "Type", type) as null|text + if(!type) + break + type = text2path(type) + error = "\nType not found, Please try again" + while(!type) + if(!type) + .["class"] = null + return + .["value"] = type + + if(VV_ATOM_REFERENCE) + var/type = pick_closest_path(FALSE) + var/subtypes = vv_subtype_prompt(type) + if(subtypes == null) + .["class"] = null + return + var/list/things = vv_reference_list(type, subtypes) + var/value = input("Select reference:", "Reference", current_value) as null|anything in things + if(!value) + .["class"] = null + return + .["value"] = things[value] + + if(VV_DATUM_REFERENCE) + var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) + var/subtypes = vv_subtype_prompt(type) + if(subtypes == null) + .["class"] = null + return + var/list/things = vv_reference_list(type, subtypes) + var/value = input("Select reference:", "Reference", current_value) as null|anything in things + if(!value) + .["class"] = null + return + .["value"] = things[value] + + if(VV_MOB_REFERENCE) + var/type = pick_closest_path(FALSE, make_types_fancy(typesof(/mob))) + var/subtypes = vv_subtype_prompt(type) + if(subtypes == null) + .["class"] = null + return + var/list/things = vv_reference_list(type, subtypes) + var/value = input("Select reference:", "Reference", current_value) as null|anything in things + if(!value) + .["class"] = null + return + .["value"] = things[value] + + if(VV_CLIENT) + .["value"] = input("Select reference:", "Reference", current_value) as null|anything in GLOB.clients + if(.["value"] == null) + .["class"] = null + return + + if(VV_FILE) + .["value"] = input("Pick file:", "File") as null|file + if(.["value"] == null) + .["class"] = null + return + + if(VV_ICON) + .["value"] = input("Pick icon:", "Icon") as null|icon + if(.["value"] == null) + .["class"] = null + return + + if(VV_MARKED_DATUM) + .["value"] = holder.marked_datum + if(.["value"] == null) + .["class"] = null + return + + if(VV_PROCCALL_RETVAL) + var/list/get_retval = list() + callproc_blocking(get_retval) + .["value"] = get_retval[1] //should have been set in proccall! + if(.["value"] == null) + .["class"] = null + return + + if(VV_NEW_ATOM) + var/type = pick_closest_path(FALSE) + if(!type) + .["class"] = null + return + .["type"] = type + var/atom/newguy = new type() + newguy.datum_flags |= DF_VAR_EDITED + .["value"] = newguy + + if(VV_NEW_DATUM) + var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) + if(!type) + .["class"] = null + return + .["type"] = type + var/datum/newguy = new type() + newguy.datum_flags |= DF_VAR_EDITED + .["value"] = newguy + + if(VV_NEW_TYPE) + var/type = current_value + var/error = "" + do + type = input("Enter type:[error]", "Type", type) as null|text + if(!type) + break + type = text2path(type) + error = "\nType not found, Please try again" + while(!type) + if(!type) + .["class"] = null + return + .["type"] = type + var/datum/newguy = new type() + if(istype(newguy)) + newguy.datum_flags |= DF_VAR_EDITED + .["value"] = newguy + + if(VV_NEW_LIST) + .["value"] = list() + .["type"] = /list + + if(VV_TEXT_LOCATE) + var/datum/D + do + var/ref = input("Enter reference:", "Reference") as null|text + if(!ref) + break + D = locate(ref) + if(!D) + alert("Invalid ref!") + continue + if(!D.can_vv_mark()) + alert("Datum can not be marked!") + continue + while(!D) + .["type"] = D.type + .["value"] = D diff --git a/code/modules/admin/view_variables/mark_datum.dm b/code/modules/admin/view_variables/mark_datum.dm new file mode 100644 index 00000000..9f1b3337 --- /dev/null +++ b/code/modules/admin/view_variables/mark_datum.dm @@ -0,0 +1,12 @@ +/client/proc/mark_datum(datum/D) + if(!holder) + return + if(holder.marked_datum) + vv_update_display(holder.marked_datum, "marked", "") + holder.marked_datum = D + vv_update_display(D, "marked", VV_MSG_MARKED) + +/client/proc/mark_datum_mapview(datum/D as mob|obj|turf|area in view(view)) + set category = "Debug" + set name = "Mark Object" + mark_datum(D) diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/view_variables/mass_edit_variables.dm similarity index 94% rename from code/modules/admin/verbs/massmodvar.dm rename to code/modules/admin/view_variables/mass_edit_variables.dm index ba199350..4e78e1ae 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/view_variables/mass_edit_variables.dm @@ -197,7 +197,7 @@ log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)") message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)") - +//not using global lists as vv is a debug function and debug functions should rely on as less things as possible. /proc/get_all_of_type(var/T, subtypes = TRUE) var/list/typecache = list() typecache[T] = 1 @@ -205,19 +205,25 @@ typecache = typecacheof(typecache) . = list() if (ispath(T, /mob)) - for(var/mob/thing in GLOB.mob_list) + for(var/mob/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK else if (ispath(T, /obj/machinery/door)) - for(var/obj/machinery/door/thing in GLOB.airlocks) + for(var/obj/machinery/door/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK else if (ispath(T, /obj/machinery)) - for(var/obj/machinery/thing in GLOB.machines) + for(var/obj/machinery/thing in world) + if (typecache[thing.type]) + . += thing + CHECK_TICK + + else if (ispath(T, /obj/item)) + for(var/obj/item/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK @@ -247,7 +253,7 @@ CHECK_TICK else if (ispath(T, /client)) - for(var/client/thing in GLOB.clients) + for(var/client/thing in world) if (typecache[thing.type]) . += thing CHECK_TICK diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/view_variables/modify_variables.dm similarity index 60% rename from code/modules/admin/verbs/modifyvariables.dm rename to code/modules/admin/view_variables/modify_variables.dm index cc7bde68..1bf6b1df 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/view_variables/modify_variables.dm @@ -1,264 +1,12 @@ -GLOBAL_LIST_INIT(VVlocked, list("vars", "datum_flags", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "force_ending")) +GLOBAL_LIST_INIT(VVlocked, list("vars", "datum_flags", "client", "mob")) //Requires DEBUG GLOBAL_PROTECT(VVlocked) -GLOBAL_LIST_INIT(VVicon_edit_lock, list("icon", "icon_state", "overlays", "underlays", "resize")) +GLOBAL_LIST_INIT(VVicon_edit_lock, list("icon", "icon_state", "overlays", "underlays")) //Requires DEBUG or FUN GLOBAL_PROTECT(VVicon_edit_lock) -GLOBAL_LIST_INIT(VVckey_edit, list("key", "ckey")) +GLOBAL_LIST_INIT(VVckey_edit, list("key", "ckey")) //Requires DEBUG or SPAWN GLOBAL_PROTECT(VVckey_edit) -GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "bound_height", "bound_width", "bound_x", "bound_y")) +GLOBAL_LIST_INIT(VVpixelmovement, list("bound_x", "bound_y", "step_x", "step_y", "step_size", "bound_height", "bound_width", "bounds")) //No editing ever. GLOBAL_PROTECT(VVpixelmovement) - -/client/proc/vv_get_class(var/var_name, var/var_value) - if(isnull(var_value)) - . = VV_NULL - - else if (isnum(var_value)) - if (var_name in GLOB.bitfields) - . = VV_BITFIELD - else - . = VV_NUM - - else if (istext(var_value)) - if (findtext(var_value, "\n")) - . = VV_MESSAGE - else - . = VV_TEXT - - else if (isicon(var_value)) - . = VV_ICON - - else if (ismob(var_value)) - . = VV_MOB_REFERENCE - - else if (isloc(var_value)) - . = VV_ATOM_REFERENCE - - else if (istype(var_value, /client)) - . = VV_CLIENT - - else if (istype(var_value, /datum)) - . = VV_DATUM_REFERENCE - - else if (ispath(var_value)) - if (ispath(var_value, /atom)) - . = VV_ATOM_TYPE - else if (ispath(var_value, /datum)) - . = VV_DATUM_TYPE - else - . = VV_TYPE - - else if (islist(var_value)) - . = VV_LIST - - else if (isfile(var_value)) - . = VV_FILE - else - . = VV_NULL - -/client/proc/vv_get_value(class, default_class, current_value, list/restricted_classes, list/extra_classes, list/classes, var_name) - . = list("class" = class, "value" = null) - if (!class) - if (!classes) - classes = list ( - VV_NUM, - VV_TEXT, - VV_MESSAGE, - VV_ICON, - VV_ATOM_REFERENCE, - VV_DATUM_REFERENCE, - VV_MOB_REFERENCE, - VV_CLIENT, - VV_ATOM_TYPE, - VV_DATUM_TYPE, - VV_TYPE, - VV_FILE, - VV_NEW_ATOM, - VV_NEW_DATUM, - VV_NEW_TYPE, - VV_NEW_LIST, - VV_NULL, - VV_RESTORE_DEFAULT - ) - - if(holder && holder.marked_datum && !(VV_MARKED_DATUM in restricted_classes)) - classes += "[VV_MARKED_DATUM] ([holder.marked_datum.type])" - if (restricted_classes) - classes -= restricted_classes - - if (extra_classes) - classes += extra_classes - - .["class"] = input(src, "What kind of data?", "Variable Type", default_class) as null|anything in classes - if (holder && holder.marked_datum && .["class"] == "[VV_MARKED_DATUM] ([holder.marked_datum.type])") - .["class"] = VV_MARKED_DATUM - - - switch(.["class"]) - if (VV_TEXT) - .["value"] = input("Enter new text:", "Text", current_value) as null|text - if (.["value"] == null) - .["class"] = null - return - if (VV_MESSAGE) - .["value"] = input("Enter new text:", "Text", current_value) as null|message - if (.["value"] == null) - .["class"] = null - return - - - if (VV_NUM) - .["value"] = input("Enter new number:", "Num", current_value) as null|num - if (.["value"] == null) - .["class"] = null - return - - if (VV_BITFIELD) - .["value"] = input_bitfield(usr, "Editing bitfield: [var_name]", var_name, current_value) - if (.["value"] == null) - .["class"] = null - return - - if (VV_ATOM_TYPE) - .["value"] = pick_closest_path(FALSE) - if (.["value"] == null) - .["class"] = null - return - - if (VV_DATUM_TYPE) - .["value"] = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) - if (.["value"] == null) - .["class"] = null - return - - if (VV_TYPE) - var/type = current_value - var/error = "" - do - type = input("Enter type:[error]", "Type", type) as null|text - if (!type) - break - type = text2path(type) - error = "\nType not found, Please try again" - while(!type) - if (!type) - .["class"] = null - return - .["value"] = type - - - if (VV_ATOM_REFERENCE) - var/type = pick_closest_path(FALSE) - var/subtypes = vv_subtype_prompt(type) - if (subtypes == null) - .["class"] = null - return - var/list/things = vv_reference_list(type, subtypes) - var/value = input("Select reference:", "Reference", current_value) as null|anything in things - if (!value) - .["class"] = null - return - .["value"] = things[value] - - if (VV_DATUM_REFERENCE) - var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) - var/subtypes = vv_subtype_prompt(type) - if (subtypes == null) - .["class"] = null - return - var/list/things = vv_reference_list(type, subtypes) - var/value = input("Select reference:", "Reference", current_value) as null|anything in things - if (!value) - .["class"] = null - return - .["value"] = things[value] - - if (VV_MOB_REFERENCE) - var/type = pick_closest_path(FALSE, make_types_fancy(typesof(/mob))) - var/subtypes = vv_subtype_prompt(type) - if (subtypes == null) - .["class"] = null - return - var/list/things = vv_reference_list(type, subtypes) - var/value = input("Select reference:", "Reference", current_value) as null|anything in things - if (!value) - .["class"] = null - return - .["value"] = things[value] - - - - if (VV_CLIENT) - .["value"] = input("Select reference:", "Reference", current_value) as null|anything in GLOB.clients - if (.["value"] == null) - .["class"] = null - return - - - if (VV_FILE) - .["value"] = input("Pick file:", "File") as null|file - if (.["value"] == null) - .["class"] = null - return - - - if (VV_ICON) - .["value"] = input("Pick icon:", "Icon") as null|icon - if (.["value"] == null) - .["class"] = null - return - - - if (VV_MARKED_DATUM) - .["value"] = holder.marked_datum - if (.["value"] == null) - .["class"] = null - return - - - if (VV_NEW_ATOM) - var/type = pick_closest_path(FALSE) - if (!type) - .["class"] = null - return - .["type"] = type - var/atom/newguy = new type() - newguy.datum_flags |= DF_VAR_EDITED - .["value"] = newguy - - if (VV_NEW_DATUM) - var/type = pick_closest_path(FALSE, get_fancy_list_of_datum_types()) - if (!type) - .["class"] = null - return - .["type"] = type - var/datum/newguy = new type() - newguy.datum_flags |= DF_VAR_EDITED - .["value"] = newguy - - if (VV_NEW_TYPE) - var/type = current_value - var/error = "" - do - type = input("Enter type:[error]", "Type", type) as null|text - if (!type) - break - type = text2path(type) - error = "\nType not found, Please try again" - while(!type) - if (!type) - .["class"] = null - return - .["type"] = type - var/datum/newguy = new type() - if(istype(newguy)) - newguy.datum_flags |= DF_VAR_EDITED - .["value"] = newguy - - - if (VV_NEW_LIST) - .["value"] = list() - .["type"] = /list - /client/proc/vv_parse_text(O, new_var) if(O && findtext(new_var,"\[")) var/process_vars = alert(usr,"\[] detected in string, process as variables?","Process Variables?","Yes","No") @@ -372,13 +120,13 @@ GLOBAL_PROTECT(VVpixelmovement) if(confirm != "Continue") return - + var/is_normal_list = IS_NORMAL_LIST(L) var/list/names = list() for (var/i in 1 to L.len) var/key = L[i] var/value - if (IS_NORMAL_LIST(L) && !isnum(key)) + if (is_normal_list && !isnum(key)) value = L[key] if (value == null) value = "null" @@ -439,10 +187,17 @@ GLOBAL_PROTECT(VVpixelmovement) assoc_key = L[index] var/default var/variable - if (assoc) - variable = L[assoc_key] - else - variable = L[index] + var/old_assoc_value //EXPERIMENTAL - Keep old associated value while modifying key, if any + if(is_normal_list) + if (assoc) + variable = L[assoc_key] + else + variable = L[index] + //EXPERIMENTAL - Keep old associated value while modifying key, if any + var/found = L[variable] + if(!isnull(found)) + old_assoc_value = found + // default = vv_get_class(objectvar, variable) @@ -504,11 +259,13 @@ GLOBAL_PROTECT(VVpixelmovement) for(var/V in varsvars) new_var = replacetext(new_var,"\[[V]]","[O.vars[V]]") - - if(assoc) - L[assoc_key] = new_var - else - L[index] = new_var + if(is_normal_list) + if(assoc) + L[assoc_key] = new_var + else + L[index] = new_var + if(!isnull(old_assoc_value) && IS_VALID_ASSOC_KEY(new_var)) + L[new_var] = old_assoc_value if (O) if (O.vv_edit_var(objectvar, L) == FALSE) to_chat(src, "Your edit was rejected by the object.") @@ -527,15 +284,8 @@ GLOBAL_PROTECT(VVpixelmovement) if(param_var_name in GLOB.VVicon_edit_lock) if(!check_rights(R_FUN|R_DEBUG)) return FALSE - if(param_var_name in GLOB.VVpixelmovement) - if(!check_rights(R_DEBUG)) - return FALSE - var/prompt = alert(usr, "Editing this var may irreparably break tile gliding for the rest of the round. THIS CAN'T BE UNDONE", "DANGER", "ABORT ", "Continue", " ABORT") - if (prompt != "Continue") - return FALSE return TRUE - /client/proc/modify_variables(atom/O, param_var_name = null, autodetect_class = 0) if(!check_rights(R_VAREDIT)) return @@ -567,11 +317,6 @@ GLOBAL_PROTECT(VVpixelmovement) var_value = O.vars[variable] if(!vv_varname_lockcheck(variable)) return - if(istype(O, /datum/armor)) - var/prompt = alert(src, "Editing this var changes this value on potentially thousands of items that share the same combination of armor values. If you want to edit the armor of just one item, use the \"Modify armor values\" dropdown item", "DANGER", "ABORT ", "Continue", " ABORT") - if (prompt != "Continue") - return - var/default = vv_get_class(variable, var_value) @@ -635,10 +380,9 @@ GLOBAL_PROTECT(VVpixelmovement) to_chat(src, "Your edit was rejected by the object.") return vv_update_display(O, "varedited", VV_MSG_EDITED) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args) log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]") log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]") var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]" message_admins(msg) admin_ticket_log(O, msg) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm new file mode 100644 index 00000000..626e75fa --- /dev/null +++ b/code/modules/admin/view_variables/topic.dm @@ -0,0 +1,128 @@ +//DO NOT ADD MORE TO THIS FILE. +//Use vv_do_topic() for datums! +/client/proc/view_var_Topic(href, href_list, hsrc) + if( (usr.client != src) || !src.holder || !holder.CheckAdminHref(href, href_list)) + return + var/target = GET_VV_TARGET + vv_do_basic(target, href_list, href) + if(istype(target, /datum)) + var/datum/D = target + D.vv_do_topic(href_list) + else if(islist(target)) + vv_do_list(target, href_list) + if(href_list["Vars"]) + debug_variables(locate(href_list["Vars"])) + +//Stuff below aren't in dropdowns/etc. + + if(check_rights(R_VAREDIT)) + + //~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records). + + if(href_list["rename"]) + if(!check_rights(NONE)) + return + + var/mob/M = locate(href_list["rename"]) in GLOB.mob_list + if(!istype(M)) + to_chat(usr, "This can only be used on instances of type /mob") + return + + var/new_name = stripped_input(usr,"What would you like to name this mob?","Input a name",M.real_name,MAX_NAME_LEN) + if( !new_name || !M ) + return + + message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") + M.fully_replace_character_name(M.real_name,new_name) + vv_update_display(M, "name", new_name) + vv_update_display(M, "real_name", M.real_name || "No real name") + + else if(href_list["rotatedatum"]) + if(!check_rights(NONE)) + return + + var/atom/A = locate(href_list["rotatedatum"]) + if(!istype(A)) + to_chat(usr, "This can only be done to instances of type /atom") + return + + switch(href_list["rotatedir"]) + if("right") + A.setDir(turn(A.dir, -45)) + if("left") + A.setDir(turn(A.dir, 45)) + vv_update_display(A, "dir", dir2text(A.dir)) + + + else if(href_list["makehuman"]) + if(!check_rights(R_SPAWN)) + return + + var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"]) in GLOB.mob_list + if(!istype(Mo)) + to_chat(usr, "This can only be done to instances of type /mob/living/carbon/monkey") + return + + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + if(!Mo) + to_chat(usr, "Mob doesn't exist anymore") + return + holder.Topic(href, list("humanone"=href_list["makehuman"])) + + else if(href_list["adjustDamage"] && href_list["mobToDamage"]) + if(!check_rights(NONE)) + return + + var/mob/living/L = locate(href_list["mobToDamage"]) in GLOB.mob_list + if(!istype(L)) + return + + var/Text = href_list["adjustDamage"] + + var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num + + if(!L) + to_chat(usr, "Mob doesn't exist anymore") + return + + var/newamt + switch(Text) + if("brute") + L.adjustBruteLoss(amount) + newamt = L.getBruteLoss() + if("fire") + L.adjustFireLoss(amount) + newamt = L.getFireLoss() + if("toxin") + L.adjustToxLoss(amount) + newamt = L.getToxLoss() + if("oxygen") + L.adjustOxyLoss(amount) + newamt = L.getOxyLoss() + if("brain") + L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount) + newamt = L.getOrganLoss(ORGAN_SLOT_BRAIN) + if("clone") + L.adjustCloneLoss(amount) + newamt = L.getCloneLoss() + if("stamina") + L.adjustStaminaLoss(amount) + newamt = L.getStaminaLoss() + else + to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") + return + + if(amount != 0) + var/log_msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [key_name(L)]" + message_admins("[key_name(usr)] dealt [amount] amount of [Text] damage to [ADMIN_LOOKUPFLW(L)]") + log_admin(log_msg) + admin_ticket_log(L, "[log_msg]") + vv_update_display(L, Text, "[newamt]") + + + //Finally, refresh if something modified the list. + if(href_list["datumrefresh"]) + var/datum/DAT = locate(href_list["datumrefresh"]) + if(istype(DAT, /datum) || istype(DAT, /client)) + debug_variables(DAT) diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm new file mode 100644 index 00000000..2a0f3d73 --- /dev/null +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -0,0 +1,51 @@ +//Not using datum.vv_do_topic for very basic/low level debug things, incase the datum's vv_do_topic is runtiming/whatnot. +/client/proc/vv_do_basic(datum/target, href_list) + var/target_var = GET_VV_VAR_TARGET + if(check_rights(R_VAREDIT)) + if(target_var) + if(href_list[VV_HK_BASIC_EDIT]) + if(!modify_variables(target, target_var, 1)) + return + switch(target_var) + if("name") + vv_update_display(target, "name", "[target]") + if("dir") + var/atom/A = target + if(istype(A)) + vv_update_display(target, "dir", dir2text(A.dir) || A.dir) + if("ckey") + var/mob/living/L = target + if(istype(L)) + vv_update_display(target, "ckey", L.ckey || "No ckey") + if("real_name") + var/mob/living/L = target + if(istype(L)) + vv_update_display(target, "real_name", L.real_name || "No real name") + if(href_list[VV_HK_BASIC_CHANGE]) + modify_variables(target, target_var, 0) + if(href_list[VV_HK_BASIC_MASSEDIT]) + cmd_mass_modify_object_variables(target, target_var) + if(check_rights(R_ADMIN, FALSE)) + if(href_list[VV_HK_EXPOSE]) + var/value = vv_get_value(VV_CLIENT) + if (value["class"] != VV_CLIENT) + return + var/client/C = value["value"] + if (!C) + return + if(!target) + to_chat(usr, "The object you tried to expose to [C] no longer exists (nulled or hard-deled)") + return + message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") + log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [target]") + to_chat(C, "[holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") + C.debug_variables(target) + if(check_rights(R_DEBUG)) + if(href_list[VV_HK_DELETE]) + usr.client.admin_delete(target) + if (isturf(src)) // show the turf that took its place + usr.client.debug_variables(src) + if(href_list[VV_HK_MARK]) + usr.client.mark_datum(target) + if(href_list[VV_HK_CALLPROC]) + usr.client.callproc_datum(target) diff --git a/code/modules/admin/view_variables/topic_list.dm b/code/modules/admin/view_variables/topic_list.dm new file mode 100644 index 00000000..349d9da6 --- /dev/null +++ b/code/modules/admin/view_variables/topic_list.dm @@ -0,0 +1,43 @@ +//LISTS - CAN NOT DO VV_DO_TOPIC BECAUSE LISTS AREN'T DATUMS :( +/client/proc/vv_do_list(list/target, href_list) + var/target_index = text2num(GET_VV_VAR_TARGET) + if(check_rights(R_VAREDIT)) + if(target_index) + if(href_list[VV_HK_LIST_EDIT]) + mod_list(target, null, "list", "contents", target_index, autodetect_class = TRUE) + if(href_list[VV_HK_LIST_CHANGE]) + mod_list(target, null, "list", "contents", target_index, autodetect_class = FALSE) + if(href_list[VV_HK_LIST_REMOVE]) + var/variable = target[target_index] + var/prompt = alert("Do you want to remove item number [target_index] from list?", "Confirm", "Yes", "No") + if (prompt != "Yes") + return + target.Cut(target_index, target_index+1) + log_world("### ListVarEdit by [src]: /list's contents: REMOVED=[html_encode("[variable]")]") + log_admin("[key_name(src)] modified list's contents: REMOVED=[variable]") + message_admins("[key_name_admin(src)] modified list's contents: REMOVED=[variable]") + if(href_list[VV_HK_LIST_ADD]) + mod_list_add(target, null, "list", "contents") + if(href_list[VV_HK_LIST_ERASE_DUPES]) + uniqueList_inplace(target) + log_world("### ListVarEdit by [src]: /list contents: CLEAR DUPES") + log_admin("[key_name(src)] modified list's contents: CLEAR DUPES") + message_admins("[key_name_admin(src)] modified list's contents: CLEAR DUPES") + if(href_list[VV_HK_LIST_ERASE_NULLS]) + listclearnulls(target) + log_world("### ListVarEdit by [src]: /list contents: CLEAR NULLS") + log_admin("[key_name(src)] modified list's contents: CLEAR NULLS") + message_admins("[key_name_admin(src)] modified list's contents: CLEAR NULLS") + if(href_list[VV_HK_LIST_SET_LENGTH]) + var/value = vv_get_value(VV_NUM) + if (value["class"] != VV_NUM || value["value"] > max(50000, target.len)) //safety - would rather someone not put an extra 0 and erase the server's memory lmao. + return + target.len = value["value"] + log_world("### ListVarEdit by [src]: /list len: [target.len]") + log_admin("[key_name(src)] modified list's len: [target.len]") + message_admins("[key_name_admin(src)] modified list's len: [target.len]") + if(href_list[VV_HK_LIST_SHUFFLE]) + shuffle_inplace(target) + log_world("### ListVarEdit by [src]: /list contents: SHUFFLE") + log_admin("[key_name(src)] modified list's contents: SHUFFLE") + message_admins("[key_name_admin(src)] modified list's contents: SHUFFLE") diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm new file mode 100644 index 00000000..a85b4ff1 --- /dev/null +++ b/code/modules/admin/view_variables/view_variables.dm @@ -0,0 +1,269 @@ + +/client/proc/debug_variables(datum/D in world) + set category = "Debug" + set name = "View Variables" + //set src in world + var/static/cookieoffset = rand(1, 9999) //to force cookies to reset after the round. + + if(!usr.client || !usr.client.holder) //This is usr because admins can call the proc on other clients, even if they're not admins, to show them VVs. + to_chat(usr, "You need to be an administrator to access this.") + return + + if(!D) + return + + var/islist = islist(D) + if(!islist && !istype(D)) + return + + var/title = "" + var/refid = REF(D) + var/icon/sprite + var/hash + + var/type = islist? /list : D.type + var/no_icon = FALSE + + if(istype(D, /atom)) + sprite = getFlatIcon(D) + hash = md5(sprite) + if(sprite) + hash = md5(sprite) + src << browse_rsc(sprite, "vv[hash].png") + else + no_icon = TRUE + + title = "[D] ([REF(D)]) = [type]" + var/formatted_type = replacetext("[type]", "/", "/") + + var/sprite_text + if(sprite) + sprite_text = no_icon? "\[NO ICON\]" : "" + var/list/header = islist(D)? list("/list") : D.vv_get_header() + + var/marked_line + if(holder && holder.marked_datum && holder.marked_datum == D) + marked_line = VV_MSG_MARKED + var/varedited_line + if(!islist && (D.datum_flags & DF_VAR_EDITED)) + varedited_line = VV_MSG_EDITED + var/deleted_line + if(!islist && D.gc_destroyed) + deleted_line = VV_MSG_DELETED + + var/list/dropdownoptions + if (islist) + dropdownoptions = list( + "---", + "Add Item" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_ADD), + "Remove Nulls" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_ERASE_NULLS), + "Remove Dupes" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_ERASE_DUPES), + "Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH), + "Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE), + "Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE), + "---" + ) + for(var/i in 1 to length(dropdownoptions)) + var/name = dropdownoptions[i] + var/link = dropdownoptions[name] + dropdownoptions[i] = "" + else + dropdownoptions = D.vv_get_dropdown() + + var/list/names = list() + if(!islist) + for(var/V in D.vars) + names += V + sleep(1) + + var/list/variable_html = list() + if(islist) + var/list/L = D + for(var/i in 1 to L.len) + var/key = L[i] + var/value + if(IS_NORMAL_LIST(L) && IS_VALID_ASSOC_KEY(key)) + value = L[key] + variable_html += debug_variable(i, value, 0, L) + else + names = sortList(names) + for(var/V in names) + if(D.can_vv_get(V)) + variable_html += D.vv_get_var(V) + + var/html = {" + + + + [title] + + + + +
    + + + + + +
    + + + + +
    + [sprite_text] +
    + [header.Join()] +
    +
    +
    + [formatted_type] + [marked_line] + [varedited_line] + [deleted_line] +
    +
    +
    + Refresh +
    + +
    +
    +
    +
    +
    + + E - Edit, tries to determine the variable type by itself.
    + C - Change, asks you for the var type first.
    + M - Mass modify: changes this variable for all objects of this type.
    +
    +
    + + + + + +
    +
    + Search: +
    +
    + +
    +
    +
      + [variable_html.Join()] +
    + + + +"} + src << browse(html, "window=variables[refid];size=475x650") + +/client/proc/vv_update_display(datum/D, span, content) + src << output("[span]:[content]", "variables[REF(D)].browser:replace_span") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 97bfd1d1..d037adcc 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -393,17 +393,13 @@ /datum/spacevine_controller/vv_get_dropdown() . = ..() - . += "---" - .["Delete Vines"] = "?_src_=[REF(src)];[HrefToken()];purge_vines=1" + VV_DROPDOWN_OPTION(VV_HK_SPACEVINE_PURGE, "Delete Vines") -/datum/spacevine_controller/Topic(href, href_list) - if(..() || !check_rights(R_ADMIN, FALSE) || !usr.client.holder.CheckAdminHref(href, href_list)) - return - - if(href_list["purge_vines"]) - if(alert(usr, "Are you sure you want to delete this spacevine cluster?", "Delete Vines", "Yes", "No") != "Yes") - return - DeleteVines() +/datum/spacevine_controller/vv_do_topic(href_list) + . = ..() + if(href_list[VV_HK_SPACEVINE_PURGE]) + if(alert(usr, "Are you sure you want to delete this spacevine cluster?", "Delete Vines", "Yes", "No") == "Yes") + DeleteVines() /datum/spacevine_controller/proc/DeleteVines() //this is kill QDEL_LIST(vines) //this will also qdel us diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8633ff39..168b3141 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -973,14 +973,121 @@ /mob/living/carbon/vv_get_dropdown() . = ..() - . += "---" - .["Make AI"] = "?_src_=vars;[HrefToken()];makeai=[REF(src)]" - .["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]" - .["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]" - .["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[REF(src)]" - .["Give martial arts"] = "?_src_=vars;[HrefToken()];givemartialart=[REF(src)]" - .["Give brain trauma"] = "?_src_=vars;[HrefToken()];givetrauma=[REF(src)]" - .["Cure brain traumas"] = "?_src_=vars;[HrefToken()];curetraumas=[REF(src)]" + VV_DROPDOWN_OPTION("", "---------") + VV_DROPDOWN_OPTION(VV_HK_MAKE_AI, "Make AI") + VV_DROPDOWN_OPTION(VV_HK_MODIFY_BODYPART, "Modify bodypart") + VV_DROPDOWN_OPTION(VV_HK_MODIFY_ORGANS, "Modify organs") + VV_DROPDOWN_OPTION(VV_HK_HALLUCINATION, "Hallucinate") + VV_DROPDOWN_OPTION(VV_HK_MARTIAL_ART, "Give Martial Arts") + VV_DROPDOWN_OPTION(VV_HK_GIVE_TRAUMA, "Give Brain Trauma") + VV_DROPDOWN_OPTION(VV_HK_CURE_TRAUMA, "Cure Brain Traumas") + +/mob/living/carbon/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_MODIFY_BODYPART]) + if(!check_rights(R_SPAWN)) + return + var/edit_action = input(usr, "What would you like to do?","Modify Body Part") as null|anything in list("add","remove", "augment") + if(!edit_action) + return + var/list/limb_list = list() + if(edit_action == "remove" || edit_action == "augment") + for(var/obj/item/bodypart/B in bodyparts) + limb_list += B.body_zone + if(edit_action == "remove") + limb_list -= BODY_ZONE_CHEST + else + limb_list = list(BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + for(var/obj/item/bodypart/B in bodyparts) + limb_list -= B.body_zone + var/result = input(usr, "Please choose which body part to [edit_action]","[capitalize(edit_action)] Body Part") as null|anything in limb_list + if(result) + var/obj/item/bodypart/BP = get_bodypart(result) + switch(edit_action) + if("remove") + if(BP) + BP.drop_limb() + else + to_chat(usr, "[src] doesn't have such bodypart.") + if("add") + if(BP) + to_chat(usr, "[src] already has such bodypart.") + else + if(!regenerate_limb(result)) + to_chat(usr, "[src] cannot have such bodypart.") + if("augment") + if(ishuman(src)) + if(BP) + BP.change_bodypart_status(BODYPART_ROBOTIC, TRUE, TRUE) + else + to_chat(usr, "[src] doesn't have such bodypart.") + else + to_chat(usr, "Only humans can be augmented.") + admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src]") + if(href_list[VV_HK_MAKE_AI]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makeai"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MODIFY_ORGANS]) + if(!check_rights(NONE)) + return + usr.client.manipulate_organs(src) + if(href_list[VV_HK_MARTIAL_ART]) + if(!check_rights(NONE)) + return + var/list/artpaths = subtypesof(/datum/martial_art) + var/list/artnames = list() + for(var/i in artpaths) + var/datum/martial_art/M = i + artnames[initial(M.name)] = M + var/result = input(usr, "Choose the martial art to teach","JUDO CHOP") as null|anything in artnames + if(!usr) + return + if(QDELETED(src)) + to_chat(usr, "Mob doesn't exist anymore") + return + if(result) + var/chosenart = artnames[result] + var/datum/martial_art/MA = new chosenart + MA.teach(src) + log_admin("[key_name(usr)] has taught [MA] to [key_name(src)].") + message_admins("[key_name_admin(usr)] has taught [MA] to [key_name_admin(src)].") + if(href_list[VV_HK_GIVE_TRAUMA]) + if(!check_rights(NONE)) + return + var/list/traumas = subtypesof(/datum/brain_trauma) + var/result = input(usr, "Choose the brain trauma to apply","Traumatize") as null|anything in traumas + if(!usr) + return + if(QDELETED(src)) + to_chat(usr, "Mob doesn't exist anymore") + return + if(!result) + return + var/datum/brain_trauma/BT = gain_trauma(result) + if(BT) + log_admin("[key_name(usr)] has traumatized [key_name(src)] with [BT.name]") + message_admins("[key_name_admin(usr)] has traumatized [key_name_admin(src)] with [BT.name].") + if(href_list[VV_HK_CURE_TRAUMA]) + if(!check_rights(NONE)) + return + cure_all_traumas(TRAUMA_RESILIENCE_ABSOLUTE) + log_admin("[key_name(usr)] has cured all traumas from [key_name(src)].") + message_admins("[key_name_admin(usr)] has cured all traumas from [key_name_admin(src)].") + if(href_list[VV_HK_HALLUCINATION]) + if(!check_rights(NONE)) + return + var/list/hallucinations = subtypesof(/datum/hallucination) + var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations + if(!usr) + return + if(QDELETED(src)) + to_chat(usr, "Mob doesn't exist anymore") + return + if(result) + new result(src, TRUE) /mob/living/carbon/can_resist() return bodyparts.len > 2 && ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 798a73f4..89b05771 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1,1141 +1,1221 @@ -/mob/living/carbon/human - name = "Unknown" - real_name = "Unknown" - icon = 'icons/mob/human.dmi' - icon_state = "caucasian_m" - appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - -/mob/living/carbon/human/Initialize() - add_verb(src, /mob/living/proc/mob_sleep) - add_verb(src, /mob/living/proc/lay_down) - time_initialized = world.time - - //initialize limbs first - create_bodyparts() - - //initialize dna. for spawned humans; overwritten by other code - create_dna(src) - randomize_human(src) - dna.initialize_dna() - - if(dna.species) - set_species(dna.species.type) - - //initialise organs - create_internal_organs() //most of it is done in set_species now, this is only for parent call - physiology = new() - - AddComponent(/datum/component/personal_crafting) - - . = ..() - - RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood) - - -/mob/living/carbon/human/ComponentInitialize() - . = ..() - if(!CONFIG_GET(flag/disable_human_mood)) - AddComponent(/datum/component/mood) - AddElement(/datum/element/mob_holder/micro, "micro") - AddElement(/datum/element/flavor_text/carbon, "", "Flavor Text", "", MAX_FLAVOR_LEN, FALSE, TRUE, "flavor_text") - AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!") - -/mob/living/carbon/human/Destroy() - QDEL_NULL(physiology) - QDEL_NULL_LIST(vore_organs) // CITADEL EDIT belly stuff - return ..() - -/mob/living/carbon/human/prepare_data_huds() - //Update med hud images... - ..() - //...sec hud images... - sec_hud_set_ID() - sec_hud_set_implants() - sec_hud_set_security_status() - //...and display them. - add_to_all_human_data_huds() - - -/mob/living/carbon/human/get_status_tab_items() - . = ..() - . += "Intent: [a_intent]" - . += "Move Mode: [m_intent]" - if (internal) - if (!internal.air_contents) - qdel(internal) - else - . += "" - . += "Internal Atmosphere Info: [internal.name]" - . += "Tank Pressure: [internal.air_contents.return_pressure()]" - . += "Distribution Pressure: [internal.distribute_pressure]" - if(mind) - var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - . += "" - . += "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]" - . += "Absorbed DNA: [changeling.absorbedcount]" - - //NINJACODE - if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja. - var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit - . += "SpiderOS Status: [SN.s_initialized ? "Initialized" : "Disabled"]" - . += "Current Time: [station_time_timestamp()]" - if(SN.s_initialized) - //Suit gear - . += "Energy Charge: [round(SN.cell.charge/100)]%" - . += "Smoke Bombs: \Roman [SN.s_bombs]" - //Ninja status - . += "Fingerprints: [md5(dna.uni_identity)]" - . += "Unique Identity: [dna.unique_enzymes]" - . += "Overall Status: [stat > 1 ? "dead" : "[health]% healthy"]" - . += "Nutrition Status: [nutrition]" - . += "Oxygen Loss: [getOxyLoss()]" - . += "Toxin Levels: [getToxLoss()]" - . += "Burn Severity: [getFireLoss()]" - . += "Brute Trauma: [getBruteLoss()]" - . += "Radiation Levels: [radiation] rad" - . += "Body Temperature: [bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)" - - //Diseases - if(length(diseases)) - . += "Viruses:" - for(var/thing in diseases) - var/datum/disease/D = thing - . += "* [D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]" - - -/mob/living/carbon/human/show_inv(mob/user) - user.set_machine(src) - var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) - var/list/obscured = check_obscured_slots() - var/list/dat = list() - - dat += "" - for(var/i in 1 to held_items.len) - var/obj/item/I = get_item_for_held_index(i) - dat += "" - dat += "" - - dat += "" - - dat += "" - - if(SLOT_WEAR_MASK in obscured) - dat += "" - else - dat += "" - - if(SLOT_NECK in obscured) - dat += "" - else - dat += "" - - if(SLOT_GLASSES in obscured) - dat += "" - else - dat += "" - - if(SLOT_EARS in obscured) - dat += "" - else - dat += "" - - dat += "" - - dat += "" - if(wear_suit) - dat += "" - else - dat += "" - - if(SLOT_SHOES in obscured) - dat += "" - else - dat += "" - - if(SLOT_GLOVES in obscured) - dat += "" - else - dat += "" - - if(SLOT_W_UNIFORM in obscured) - dat += "" - else - dat += "" - - if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (SLOT_W_UNIFORM in obscured)) - dat += "" - dat += "" - dat += "" - else - dat += "" - dat += "" - dat += "" - - if(handcuffed) - dat += "" - if(legcuffed) - dat += "" - - dat += {"
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]
     
    Back:[(back && !(back.item_flags & ABSTRACT)) ? back : "Empty"]" - if(has_breathable_mask && istype(back, /obj/item/tank)) - dat += " [internal ? "Disable Internals" : "Set Internals"]" - - dat += "
     
    Head:[(head && !(head.item_flags & ABSTRACT)) ? head : "Empty"]
    Mask:Obscured
    Mask:[(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Empty"]
    Neck:Obscured
    Neck:[(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Empty"]
    Eyes:Obscured
    Eyes:[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "Empty"]
    Ears:Obscured
    Ears:[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"]
     
    Exosuit:[(wear_suit && !(wear_suit.item_flags & ABSTRACT)) ? wear_suit : "Empty"]
     ↳Suit Storage:[(s_store && !(s_store.item_flags & ABSTRACT)) ? s_store : "Empty"]" - if(has_breathable_mask && istype(s_store, /obj/item/tank)) - dat += " [internal ? "Disable Internals" : "Set Internals"]" - dat += "
     ↳Suit Storage:
    Shoes:Obscured
    Shoes:[(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "Empty"]
    Gloves:Obscured
    Gloves:[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "Empty"]
    Uniform:Obscured
    Uniform:[(w_uniform && !(w_uniform.item_flags & ABSTRACT)) ? w_uniform : "Empty"]
     ↳Pockets:
     ↳ID:
     ↳Belt:
     ↳Belt:[(belt && !(belt.item_flags & ABSTRACT)) ? belt : "Empty"]" - if(has_breathable_mask && istype(belt, /obj/item/tank)) - dat += " [internal ? "Disable Internals" : "Set Internals"]" - dat += "
     ↳Pockets:[(l_store && !(l_store.item_flags & ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" - dat += " [(r_store && !(r_store.item_flags & ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]
     ↳ID:[(wear_id && !(wear_id.item_flags & ABSTRACT)) ? wear_id : "Empty"]
    Handcuffed: Remove
    Legcuffed
    - Close - "} - - var/datum/browser/popup = new(user, "mob[REF(src)]", "[src]", 440, 510) - popup.set_content(dat.Join()) - popup.open() - -// called when something steps onto a human -// this could be made more general, but for now just handle mulebot -/mob/living/carbon/human/Crossed(atom/movable/AM) - var/mob/living/simple_animal/bot/mulebot/MB = AM - if(istype(MB)) - MB.RunOver(src) - - //Hyper Change - Step on people - var/mob/living/carbon/human/H = AM - if(istype(H) && lying && H.a_intent != INTENT_HELP) - H.handle_micro_bump_other(src) - - spreadFire(AM) - -/mob/living/carbon/human/Topic(href, href_list) - if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - if(href_list["embedded_object"]) - var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts - if(!L) - return - var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects - if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore - return - var/time_taken = I.embedding.embedded_unsafe_removal_time/I.w_class //Citadel Change from * to / - usr.visible_message("[usr] attempts to remove [I] from [usr.p_their()] [L.name].","You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)") - if(do_after(usr, time_taken, needhand = 1, target = src)) - remove_embedded_unsafe(L, I, usr) - /* CITADEL EDIT: remove_embedded_unsafe replaces this code - if(!I || !L || I.loc != src || !(I in L.embedded_objects)) - return - L.embedded_objects -= I - L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. - I.forceMove(get_turf(src)) - usr.put_in_hands(I) - usr.emote("scream") - usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!","You successfully remove [I] from your [L.name].") - if(!has_embedded_objects()) - clear_alert("embeddedobject") - SEND_SIGNAL(usr, COMSIG_CLEAR_MOOD_EVENT, "embedded") */ - return - - if(href_list["item"]) - var/slot = text2num(href_list["item"]) - if(slot in check_obscured_slots()) - to_chat(usr, "You can't reach that! Something is covering it.") - return - - if(href_list["pockets"]) - var/pocket_side = href_list["pockets"] - var/pocket_id = (pocket_side == "right" ? SLOT_R_STORE : SLOT_L_STORE) - var/obj/item/pocket_item = (pocket_id == SLOT_R_STORE ? r_store : l_store) - var/obj/item/place_item = usr.get_active_held_item() // Item to place in the pocket, if it's empty - - var/delay_denominator = 1 - if(pocket_item && !(pocket_item.item_flags & ABSTRACT)) - if(HAS_TRAIT(pocket_item, TRAIT_NODROP)) - to_chat(usr, "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!") - to_chat(usr, "You try to empty [src]'s [pocket_side] pocket.") - else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.item_flags & ABSTRACT)) - to_chat(usr, "You try to place [place_item] into [src]'s [pocket_side] pocket.") - delay_denominator = 4 - else - return - - if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator, ignorehelditem = TRUE)) //placing an item into the pocket is 4 times faster - if(pocket_item) - if(pocket_item == (pocket_id == SLOT_R_STORE ? r_store : l_store)) //item still in the pocket we search - dropItemToGround(pocket_item) - if(!usr.can_hold_items() || !usr.put_in_hands(pocket_item)) - pocket_item.forceMove(drop_location()) - else - if(place_item) - if(place_item.mob_can_equip(src, usr, pocket_id, FALSE, TRUE)) - usr.temporarilyRemoveItemFromInventory(place_item, TRUE) - equip_to_slot(place_item, pocket_id, TRUE) - //do nothing otherwise - - // Update strip window - if(usr.machine == src && in_range(src, usr)) - show_inv(usr) - else - // Display a warning if the user mocks up - to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") - - ..() //CITADEL CHANGE - removes a tab from behind this ..() so that flavortext can actually be examined - - -///////HUDs/////// - if(href_list["hud"]) - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - var/perpname = get_face_name(get_id_name("")) - if(istype(H.glasses, /obj/item/clothing/glasses/hud) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud)) - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) - if(href_list["photo_front"] || href_list["photo_side"]) - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - return - var/obj/item/photo/P = null - if(href_list["photo_front"]) - P = R.fields["photo_front"] - else if(href_list["photo_side"]) - P = R.fields["photo_side"] - if(P) - P.show(H) - - if(href_list["hud"] == "m") - if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - if(href_list["p_stat"]) - var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - return - if(health_status && health_status != "Cancel") - R.fields["p_stat"] = health_status - return - if(href_list["m_stat"]) - var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) - return - if(health_status && health_status != "Cancel") - R.fields["m_stat"] = health_status - return - if(href_list["evaluation"]) - if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20) - to_chat(usr, "No external injuries detected.
    ") - return - var/span = "notice" - var/status = "" - if(getBruteLoss()) - to_chat(usr, "Physical trauma analysis:") - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - var/brutedamage = BP.brute_dam - if(brutedamage > 0) - status = "received minor physical injuries." - span = "notice" - if(brutedamage > 20) - status = "been seriously damaged." - span = "danger" - if(brutedamage > 40) - status = "sustained major trauma!" - span = "userdanger" - if(brutedamage) - to_chat(usr, "[BP] appears to have [status]") - if(getFireLoss()) - to_chat(usr, "Analysis of skin burns:") - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - var/burndamage = BP.burn_dam - if(burndamage > 0) - status = "signs of minor burns." - span = "notice" - if(burndamage > 20) - status = "serious burns." - span = "danger" - if(burndamage > 40) - status = "major burns!" - span = "userdanger" - if(burndamage) - to_chat(usr, "[BP] appears to have [status]") - if(getOxyLoss()) - to_chat(usr, "Patient has signs of suffocation, emergency treatment may be required!") - if(getToxLoss() > 20) - to_chat(usr, "Gathered data is inconsistent with the analysis, possible cause: poisoning.") - - if(href_list["hud"] == "s") - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. - return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten - // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access - var/allowed_access = null - var/obj/item/clothing/glasses/G = H.glasses - if (!(G.obj_flags |= EMAGGED)) - if(H.wear_id) - var/list/access = H.wear_id.GetAccess() - if(ACCESS_SEC_DOORS in access) - allowed_access = H.get_authentification_name() - else - allowed_access = "@%&ERROR_%$*" - - - if(!allowed_access) - to_chat(H, "ERROR: Invalid Access") - return - - if(perpname) - R = find_record("name", perpname, GLOB.data_core.security) - if(R) - if(href_list["status"]) - var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged", "Cancel") - if(setcriminal != "Cancel") - if(R) - if(H.canUseHUD()) - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - investigate_log("[key_name(src)] has been set from [R.fields["criminal"]] to [setcriminal] by [key_name(usr)].", INVESTIGATE_RECORDS) - R.fields["criminal"] = setcriminal - sec_hud_set_security_status() - return - - if(href_list["view"]) - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") - to_chat(usr, "Minor Crimes:") - for(var/datum/data/crime/c in R.fields["mi_crim"]) - to_chat(usr, "Crime: [c.crimeName]") - to_chat(usr, "Details: [c.crimeDetails]") - to_chat(usr, "Added by [c.author] at [c.time]") - to_chat(usr, "----------") - to_chat(usr, "Major Crimes:") - for(var/datum/data/crime/c in R.fields["ma_crim"]) - to_chat(usr, "Crime: [c.crimeName]") - to_chat(usr, "Details: [c.crimeDetails]") - to_chat(usr, "Added by [c.author] at [c.time]") - to_chat(usr, "----------") - to_chat(usr, "Notes: [R.fields["notes"]]") - return - - if(href_list["add_crime"]) - switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) - if("Minor Crime") - if(R) - var/t1 = stripped_input("Please input minor crime names:", "Security HUD", "", null) - var/t2 = stripped_multiline_input("Please input minor crime details:", "Security HUD", "", null) - if(R) - if (!t1 || !t2 || !allowed_access) - return - else if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss")) - GLOB.data_core.addMinorCrime(R.fields["id"], crime) - investigate_log("New Minor Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - to_chat(usr, "Successfully added a minor crime.") - return - if("Major Crime") - if(R) - var/t1 = stripped_input("Please input major crime names:", "Security HUD", "", null) - var/t2 = stripped_multiline_input("Please input major crime details:", "Security HUD", "", null) - if(R) - if (!t1 || !t2 || !allowed_access) - return - else if (!H.canUseHUD()) - return - else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss")) - GLOB.data_core.addMajorCrime(R.fields["id"], crime) - investigate_log("New Major Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) - to_chat(usr, "Successfully added a major crime.") - return - - if(href_list["view_comment"]) - if(R) - if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - to_chat(usr, "Comments/Log:") - var/counter = 1 - while(R.fields[text("com_[]", counter)]) - to_chat(usr, R.fields[text("com_[]", counter)]) - to_chat(usr, "----------") - counter++ - return - - if(href_list["add_comment"]) - if(R) - var/t1 = stripped_multiline_input("Add Comment:", "Secure. records", null, null) - if(R) - if (!t1 || !allowed_access) - return - else if(!H.canUseHUD()) - return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) - return - var/counter = 1 - while(R.fields[text("com_[]", counter)]) - counter++ - R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
    []", allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) - to_chat(usr, "Successfully added comment.") - return - to_chat(usr, "Unable to locate a data core entry for this person.") - -/mob/living/carbon/human/proc/canUseHUD() - return !(src.stat || IsKnockdown() || IsStun() || src.restrained()) - -/mob/living/carbon/human/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE) - . = 1 // Default to returning true. - if(user && !target_zone) - target_zone = user.zone_selected - if(HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && !bypass_immunity) - . = 0 - // If targeting the head, see if the head item is thin enough. - // If targeting anything else, see if the wear suit is thin enough. - if (!penetrate_thick) - if(above_neck(target_zone)) - if(head && istype(head, /obj/item/clothing)) - var/obj/item/clothing/CH = head - if (CH.clothing_flags & THICKMATERIAL) - . = 0 - else - if(wear_suit && istype(wear_suit, /obj/item/clothing)) - var/obj/item/clothing/CS = wear_suit - if (CS.clothing_flags & THICKMATERIAL) - . = 0 - if(!. && error_msg && user) - // Might need re-wording. - to_chat(user, "There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"].") - -/mob/living/carbon/human/proc/check_obscured_slots() - var/list/obscured = list() - - if(wear_suit) - if(wear_suit.flags_inv & HIDEGLOVES) - obscured |= SLOT_GLOVES - if(wear_suit.flags_inv & HIDEJUMPSUIT) - obscured |= SLOT_W_UNIFORM - if(wear_suit.flags_inv & HIDESHOES) - obscured |= SLOT_SHOES - - if(head) - if(head.flags_inv & HIDEMASK) - obscured |= SLOT_WEAR_MASK - if(head.flags_inv & HIDEEYES) - obscured |= SLOT_GLASSES - if(head.flags_inv & HIDEEARS) - obscured |= SLOT_EARS - - if(wear_mask) - if(wear_mask.flags_inv & HIDEEYES) - obscured |= SLOT_GLASSES - - if(obscured.len) - return obscured - else - return null - -/mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) - if(judgement_criteria & JUDGE_EMAGGED) - return 10 //Everyone is a criminal! - - var/threatcount = 0 - - //Lasertag bullshit - if(lasercolor) - if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve - if(istype(wear_suit, /obj/item/clothing/suit/redtag)) - threatcount += 4 - if(is_holding_item_of_type(/obj/item/gun/energy/laser/redtag)) - threatcount += 4 - if(istype(belt, /obj/item/gun/energy/laser/redtag)) - threatcount += 2 - - if(lasercolor == "r") - if(istype(wear_suit, /obj/item/clothing/suit/bluetag)) - threatcount += 4 - if(is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag)) - threatcount += 4 - if(istype(belt, /obj/item/gun/energy/laser/bluetag)) - threatcount += 2 - - return threatcount - - //Check for ID - var/obj/item/card/id/idcard = get_idcard(FALSE) - if( (judgement_criteria & JUDGE_IDCHECK) && !idcard && name=="Unknown") - threatcount += 4 - - //Check for weapons - if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck) - if(!idcard || !(ACCESS_WEAPONS in idcard.access)) - for(var/obj/item/I in held_items) //if they're holding a gun - if(weaponcheck.Invoke(I)) - threatcount += 4 - if(weaponcheck.Invoke(belt) || weaponcheck.Invoke(back)) //if a weapon is present in the belt or back slot - threatcount += 2 //not enough to trigger look_for_perp() on it's own unless they also have criminal status. - - //Check for arrest warrant - if(judgement_criteria & JUDGE_RECORDCHECK) - var/perpname = get_face_name(get_id_name()) - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) - if(R && R.fields["criminal"]) - switch(R.fields["criminal"]) - if("*Arrest*") - threatcount += 5 - if("Incarcerated") - threatcount += 2 - if("Paroled") - threatcount += 2 - - //Check for dresscode violations - if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/syndi) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi)) - threatcount += 4 //fuk u antags <3 //no you - - //mindshield implants imply trustworthyness - if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) - threatcount -= 1 - - //Agent cards lower threatlevel. - if(istype(idcard, /obj/item/card/id/syndicate)) - threatcount -= 2 - - return threatcount - - -//Used for new human mobs created by cloning/goleming/podding -/mob/living/carbon/human/proc/set_cloned_appearance() - if(gender == MALE) - facial_hair_style = "Full Beard" - else - facial_hair_style = "Shaved" - hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") - underwear = "Nude" - undershirt = "Nude" - update_body() - update_hair() - update_genitals() - -/mob/living/carbon/human/singularity_pull(S, current_size) - ..() - if(current_size >= STAGE_THREE) - for(var/obj/item/hand in held_items) - if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && dropItemToGround(hand)) - step_towards(hand, src) - to_chat(src, "\The [S] pulls \the [hand] from your grip!") - rad_act(current_size * 3) - if(mob_negates_gravity()) - return - -/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C) - CHECK_DNA_AND_SPECIES(C) - - if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH))) - to_chat(src, "[C.name] is dead!") - return - if(is_mouth_covered()) - to_chat(src, "Remove your mask first!") - return 0 - if(C.is_mouth_covered()) - to_chat(src, "Remove [p_their()] mask first!") - return 0 - - if(C.cpr_time < world.time + 30) - visible_message("[src] is trying to perform CPR on [C.name]!", \ - "You try to perform CPR on [C.name]... Hold still!") - if(!do_mob(src, C)) - to_chat(src, "You fail to perform CPR on [C]!") - return 0 - - var/they_breathe = !HAS_TRAIT(C, TRAIT_NOBREATH) - var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS) - - if(C.health > C.crit_threshold) - return - - src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr) - C.cpr_time = world.time - log_combat(src, C, "CPRed") - - if(they_breathe && they_lung) - var/suff = min(C.getOxyLoss(), 7) - C.adjustOxyLoss(-suff) - C.updatehealth() - to_chat(C, "You feel a breath of fresh air enter your lungs... It feels good...") - else if(they_breathe && !they_lung) - to_chat(C, "You feel a breath of fresh air... but you don't feel any better...") - else - to_chat(C, "You feel a breath of fresh air... which is a sensation you don't recognise...") - -/mob/living/carbon/human/cuff_resist(obj/item/I) - if(dna && dna.check_mutation(HULK)) - say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") - if(..(I, cuff_break = FAST_CUFFBREAK)) - dropItemToGround(I) - else - if(..()) - dropItemToGround(I) - -/mob/living/carbon/human/clean_blood() - var/mob/living/carbon/human/H = src - if(H.gloves) - if(H.gloves.clean_blood()) - H.update_inv_gloves() - else - ..() // Clear the Blood_DNA list - if(H.bloody_hands) - H.bloody_hands = 0 - H.update_inv_gloves() - update_icons() //apply the now updated overlays to the mob - -/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_human")) - cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal")) - cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large")) - creamed = FALSE - - -//Turns a mob black, flashes a skeleton overlay -//Just like a cartoon! -/mob/living/carbon/human/proc/electrocution_animation(anim_duration) - //Handle mutant parts if possible - if(dna && dna.species) - add_atom_colour("#000000", TEMPORARY_COLOUR_PRIORITY) - var/static/mutable_appearance/electrocution_skeleton_anim - if(!electrocution_skeleton_anim) - electrocution_skeleton_anim = mutable_appearance(icon, "electrocuted_base") - electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART - add_overlay(electrocution_skeleton_anim) - addtimer(CALLBACK(src, .proc/end_electrocution_animation, electrocution_skeleton_anim), anim_duration) - - else //or just do a generic animation - flick_overlay_view(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), src, anim_duration) - -/mob/living/carbon/human/proc/end_electrocution_animation(mutable_appearance/MA) - remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000") - cut_overlay(MA) - -/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) - if(incapacitated() || lying ) - to_chat(src, "You can't do that right now!") - return FALSE - if(!Adjacent(M) && (M.loc != src)) - if((be_close == 0) || (!no_tk && (dna.check_mutation(TK) && tkMaxRangeCheck(src, M)))) - return TRUE - to_chat(src, "You are too far away!") - return FALSE - return TRUE - -/mob/living/carbon/human/resist_restraints() - if(wear_suit && wear_suit.breakouttime) - changeNext_move(CLICK_CD_BREAKOUT) - last_special = world.time + CLICK_CD_BREAKOUT - cuff_resist(wear_suit) - else - ..() - -/mob/living/carbon/human/replace_records_name(oldname,newname) // Only humans have records right now, move this up if changed. - for(var/list/L in list(GLOB.data_core.general,GLOB.data_core.medical,GLOB.data_core.security,GLOB.data_core.locked)) - var/datum/data/record/R = find_record("name", oldname, L) - if(R) - R.fields["name"] = newname - -/mob/living/carbon/human/get_total_tint() - . = ..() - if(glasses) - . += glasses.tint - -/mob/living/carbon/human/update_health_hud() - if(!client || !hud_used) - return - if(dna.species.update_health_hud()) - 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 - if(..(health_amount)) //not dead - switch(hal_screwyhud) - if(SCREWYHUD_CRIT) - hud_used.healths.icon_state = "health6" - if(SCREWYHUD_DEAD) - hud_used.healths.icon_state = "health7" - if(SCREWYHUD_HEALTHY) - hud_used.healths.icon_state = "health0" - if(hud_used.healthdoll) - hud_used.healthdoll.cut_overlays() - if(stat != DEAD) - hud_used.healthdoll.icon_state = "healthdoll_OVERLAY" - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - var/damage = BP.burn_dam + BP.brute_dam - var/comparison = (BP.max_damage/5) - var/icon_num = 0 - if(damage) - icon_num = 1 - if(damage > (comparison)) - icon_num = 2 - if(damage > (comparison*2)) - icon_num = 3 - if(damage > (comparison*3)) - icon_num = 4 - if(damage > (comparison*4)) - icon_num = 5 - if(hal_screwyhud == SCREWYHUD_HEALTHY) - icon_num = 0 - if(icon_num) - hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[BP.body_zone][icon_num]")) - for(var/t in get_missing_limbs()) //Missing limbs - hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]6")) - for(var/t in get_disabled_limbs()) //Disabled limbs - hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]7")) - else - hud_used.healthdoll.icon_state = "healthdoll_DEAD" - -/mob/living/carbon/human/fully_heal(admin_revive = 0) - if(admin_revive) - regenerate_limbs() - regenerate_organs() - remove_all_embedded_objects() - set_heartattack(FALSE) - drunkenness = 0 - for(var/datum/mutation/human/HM in dna.mutations) - if(HM.quality != POSITIVE) - dna.remove_mutation(HM.name) - if(blood_volume < (BLOOD_VOLUME_NORMAL*blood_ratio)) - blood_volume = (BLOOD_VOLUME_NORMAL*blood_ratio) - ..() - -/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) - . = ..() - if (dna && dna.species) - . += dna.species.check_weakness(weapon, attacker) - -/mob/living/carbon/human/is_literate() - return 1 - -/mob/living/carbon/human/can_hold_items() - return TRUE - -/mob/living/carbon/human/update_gravity(has_gravity,override = 0) - if(dna && dna.species) //prevents a runtime while a human is being monkeyfied - override = dna.species.override_float - ..() - -/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0) - if(blood && (NOBLOOD in dna.species.species_traits)) - if(message) - visible_message("[src] dry heaves!", \ - "You try to throw up, but there's nothing in your stomach!") - if(stun) - Knockdown(200) - return 1 - ..() - -/mob/living/carbon/human/vv_get_dropdown() - . = ..() - . += "---" - .["Make monkey"] = "?_src_=vars;[HrefToken()];makemonkey=[REF(src)]" - .["Set Species"] = "?_src_=vars;[HrefToken()];setspecies=[REF(src)]" - .["Make cyborg"] = "?_src_=vars;[HrefToken()];makerobot=[REF(src)]" - .["Make alien"] = "?_src_=vars;[HrefToken()];makealien=[REF(src)]" - .["Make slime"] = "?_src_=vars;[HrefToken()];makeslime=[REF(src)]" - .["Toggle Purrbation"] = "?_src_=vars;[HrefToken()];purrbation=[REF(src)]" - .["Copy outfit"] = "?_src_=vars;[HrefToken()];copyoutfit=[REF(src)]" - .["Add/Remove Quirks"] = "?_src_=vars;[HrefToken()];modquirks=[REF(src)]" - -/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) - if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS) - //If they dragged themselves and we're currently aggressively grabbing them try to piggyback - if(user == target && can_piggyback(target)) - piggyback(target) - return - //If you dragged them to you and you're aggressively grabbing try to fireman carry them - else if(user != target) - fireman_carry(target) - return - . = ..() - -//src is the user that will be carrying, target is the mob to be carried -/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target) - return (istype(target) && target.stat == CONSCIOUS) - -/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target) - return (ishuman(target) && target.lying) - -/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target) - if(can_be_firemanned(target)) - visible_message("[src] starts lifting [target] onto their back...", - "You start lifting [target] onto your back...") - if(do_after(src, 30, TRUE, target)) - //Second check to make sure they're still valid to be carried - if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) - target.resting = FALSE - buckle_mob(target, TRUE, TRUE, 90, 1, 0) - return - visible_message("[src] fails to fireman carry [target]!") - else - to_chat(src, "You can't fireman carry [target] while they're standing!") - -/mob/living/carbon/human/proc/piggyback(mob/living/carbon/target) - if(can_piggyback(target)) - visible_message("[target] starts to climb onto [src]...") - if(do_after(target, 15, target = src)) - if(can_piggyback(target)) - 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) - 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) - if(!force)//humans are only meant to be ridden through piggybacking and special cases - return - if(!is_type_in_typecache(target, can_ride_typecache)) - target.visible_message("[target] really can't seem to mount [src]...") - return - buckle_lying = lying_buckle - var/datum/component/riding/human/riding_datum = LoadComponent(/datum/component/riding/human) - if(target_hands_needed) - riding_datum.ride_check_rider_restrained = TRUE - if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled) - return - var/equipped_hands_self - var/equipped_hands_target - if(hands_needed) - equipped_hands_self = riding_datum.equip_buckle_inhands(src, hands_needed, target) - if(target_hands_needed) - equipped_hands_target = riding_datum.equip_buckle_inhands(target, target_hands_needed) - - if(hands_needed || target_hands_needed) - if(hands_needed && !equipped_hands_self) - src.visible_message("[src] can't get a grip on [target] because their hands are full!", - "You can't get a grip on [target] because your hands are full!") - return - else if(target_hands_needed && !equipped_hands_target) - target.visible_message("[target] can't get a grip on [src] because their hands are full!", - "You can't get a grip on [src] because your hands are full!") - return - - stop_pulling() - riding_datum.handle_vehicle_layer() - . = ..(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 - for(var/obj/item/clothing/C in get_equipped_items()) //doesn't include pockets - if(C.blocks_shove_knockdown) - return TRUE - return FALSE - -/mob/living/carbon/human/proc/clear_shove_slowdown() - remove_movespeed_modifier(SHOVE_SLOWDOWN_ID) - var/active_item = get_active_held_item() - if(is_type_in_typecache(active_item, GLOB.shove_disarming_types)) - visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) - -/mob/living/carbon/human/do_after_coefficent() - . = ..() - . *= physiology.do_after_speed - -/mob/living/carbon/human/species - var/race = null - -/mob/living/carbon/human/species/Initialize() - . = ..() - set_species(race) - -/mob/living/carbon/human/species/abductor - race = /datum/species/abductor - -/mob/living/carbon/human/species/android - race = /datum/species/android - -/mob/living/carbon/human/species/angel - race = /datum/species/angel - -/mob/living/carbon/human/species/corporate - race = /datum/species/corporate - -/mob/living/carbon/human/species/dullahan - race = /datum/species/dullahan - -/mob/living/carbon/human/species/felinid - race = /datum/species/human/felinid - -/mob/living/carbon/human/species/fly - race = /datum/species/fly - -/mob/living/carbon/human/species/golem - race = /datum/species/golem - -/mob/living/carbon/human/species/golem/random - race = /datum/species/golem/random - -/mob/living/carbon/human/species/golem/adamantine - race = /datum/species/golem/adamantine - -/mob/living/carbon/human/species/golem/plasma - race = /datum/species/golem/plasma - -/mob/living/carbon/human/species/golem/diamond - race = /datum/species/golem/diamond - -/mob/living/carbon/human/species/golem/gold - race = /datum/species/golem/gold - -/mob/living/carbon/human/species/golem/silver - race = /datum/species/golem/silver - -/mob/living/carbon/human/species/golem/plasteel - race = /datum/species/golem/plasteel - -/mob/living/carbon/human/species/golem/titanium - race = /datum/species/golem/titanium - -/mob/living/carbon/human/species/golem/plastitanium - race = /datum/species/golem/plastitanium - -/mob/living/carbon/human/species/golem/alien_alloy - race = /datum/species/golem/alloy - -/mob/living/carbon/human/species/golem/wood - race = /datum/species/golem/wood - -/mob/living/carbon/human/species/golem/uranium - race = /datum/species/golem/uranium - -/mob/living/carbon/human/species/golem/sand - race = /datum/species/golem/sand - -/mob/living/carbon/human/species/golem/glass - race = /datum/species/golem/glass - -/mob/living/carbon/human/species/golem/bluespace - race = /datum/species/golem/bluespace - -/mob/living/carbon/human/species/golem/bananium - race = /datum/species/golem/bananium - -/mob/living/carbon/human/species/golem/blood_cult - race = /datum/species/golem/runic - -/mob/living/carbon/human/species/golem/cloth - race = /datum/species/golem/cloth - -/mob/living/carbon/human/species/golem/plastic - race = /datum/species/golem/plastic - -/mob/living/carbon/human/species/golem/bronze - race = /datum/species/golem/bronze - -/mob/living/carbon/human/species/golem/cardboard - race = /datum/species/golem/cardboard - -/mob/living/carbon/human/species/golem/leather - race = /datum/species/golem/leather - -/mob/living/carbon/human/species/golem/bone - race = /datum/species/golem/bone - -/mob/living/carbon/human/species/golem/durathread - race = /datum/species/golem/durathread - -/mob/living/carbon/human/species/golem/clockwork - race = /datum/species/golem/clockwork - -/mob/living/carbon/human/species/golem/clockwork/no_scrap - race = /datum/species/golem/clockwork/no_scrap - -/mob/living/carbon/human/species/jelly - race = /datum/species/jelly - -/mob/living/carbon/human/species/jelly/slime - race = /datum/species/jelly/slime - -/mob/living/carbon/human/species/jelly/stargazer - race = /datum/species/jelly/stargazer - -/mob/living/carbon/human/species/jelly/luminescent - race = /datum/species/jelly/luminescent - -/mob/living/carbon/human/species/lizard - race = /datum/species/lizard - -/mob/living/carbon/human/species/lizard/ashwalker - race = /datum/species/lizard/ashwalker - -/mob/living/carbon/human/species/moth - race = /datum/species/moth - -/mob/living/carbon/human/species/mush - race = /datum/species/mush - -/mob/living/carbon/human/species/plasma - race = /datum/species/plasmaman - -/mob/living/carbon/human/species/pod - race = /datum/species/pod - -/mob/living/carbon/human/species/shadow - race = /datum/species/shadow - -/mob/living/carbon/human/species/shadow/nightmare - race = /datum/species/shadow/nightmare - -/mob/living/carbon/human/species/skeleton - race = /datum/species/skeleton - -/mob/living/carbon/human/species/synth - race = /datum/species/synth - -/mob/living/carbon/human/species/synth/military - race = /datum/species/synth/military - -/mob/living/carbon/human/species/vampire - race = /datum/species/vampire - -/mob/living/carbon/human/species/zombie - race = /datum/species/zombie - -/mob/living/carbon/human/species/zombie/infectious - race = /datum/species/zombie/infectious - -/mob/living/carbon/human/species/zombie/krokodil_addict - race = /datum/species/krokodil_addict - -/mob/living/carbon/human/species/mammal - race = /datum/species/mammal - -/mob/living/carbon/human/species/insect - race = /datum/species/insect - -/mob/living/carbon/human/species/xeno - race = /datum/species/xeno - -/mob/living/carbon/human/species/ipc - race = /datum/species/ipc - -/mob/living/carbon/human/species/roundstartslime - race = /datum/species/jelly/roundstartslime -//define holder_type on nerds we wanna commit scoop to -/* /mob/living/carbon/human - var/holder_type = /obj/item/clothing/head/mob_holder/micro - can_be_held = "micro" -*/ - +/mob/living/carbon/human + name = "Unknown" + real_name = "Unknown" + icon = 'icons/mob/human.dmi' + icon_state = "caucasian_m" + appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE + +/mob/living/carbon/human/Initialize() + add_verb(src, /mob/living/proc/mob_sleep) + add_verb(src, /mob/living/proc/lay_down) + time_initialized = world.time + + //initialize limbs first + create_bodyparts() + + //initialize dna. for spawned humans; overwritten by other code + create_dna(src) + randomize_human(src) + dna.initialize_dna() + + if(dna.species) + set_species(dna.species.type) + + //initialise organs + create_internal_organs() //most of it is done in set_species now, this is only for parent call + physiology = new() + + AddComponent(/datum/component/personal_crafting) + + . = ..() + + RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood) + + +/mob/living/carbon/human/ComponentInitialize() + . = ..() + if(!CONFIG_GET(flag/disable_human_mood)) + AddComponent(/datum/component/mood) + AddElement(/datum/element/mob_holder/micro, "micro") + AddElement(/datum/element/flavor_text/carbon, "", "Flavor Text", "", MAX_FLAVOR_LEN, FALSE, TRUE, "flavor_text") + AddElement(/datum/element/flavor_text, "", "Temporary Flavor Text", "This should be used only for things pertaining to the current round!") + +/mob/living/carbon/human/Destroy() + QDEL_NULL(physiology) + QDEL_NULL_LIST(vore_organs) // CITADEL EDIT belly stuff + return ..() + +/mob/living/carbon/human/prepare_data_huds() + //Update med hud images... + ..() + //...sec hud images... + sec_hud_set_ID() + sec_hud_set_implants() + sec_hud_set_security_status() + //...and display them. + add_to_all_human_data_huds() + + +/mob/living/carbon/human/get_status_tab_items() + . = ..() + . += "Intent: [a_intent]" + . += "Move Mode: [m_intent]" + if (internal) + if (!internal.air_contents) + qdel(internal) + else + . += "" + . += "Internal Atmosphere Info: [internal.name]" + . += "Tank Pressure: [internal.air_contents.return_pressure()]" + . += "Distribution Pressure: [internal.distribute_pressure]" + if(mind) + var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) + if(changeling) + . += "" + . += "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]" + . += "Absorbed DNA: [changeling.absorbedcount]" + + //NINJACODE + if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja. + var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit + . += "SpiderOS Status: [SN.s_initialized ? "Initialized" : "Disabled"]" + . += "Current Time: [station_time_timestamp()]" + if(SN.s_initialized) + //Suit gear + . += "Energy Charge: [round(SN.cell.charge/100)]%" + . += "Smoke Bombs: \Roman [SN.s_bombs]" + //Ninja status + . += "Fingerprints: [md5(dna.uni_identity)]" + . += "Unique Identity: [dna.unique_enzymes]" + . += "Overall Status: [stat > 1 ? "dead" : "[health]% healthy"]" + . += "Nutrition Status: [nutrition]" + . += "Oxygen Loss: [getOxyLoss()]" + . += "Toxin Levels: [getToxLoss()]" + . += "Burn Severity: [getFireLoss()]" + . += "Brute Trauma: [getBruteLoss()]" + . += "Radiation Levels: [radiation] rad" + . += "Body Temperature: [bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)" + + //Diseases + if(length(diseases)) + . += "Viruses:" + for(var/thing in diseases) + var/datum/disease/D = thing + . += "* [D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]" + + +/mob/living/carbon/human/show_inv(mob/user) + user.set_machine(src) + var/has_breathable_mask = istype(wear_mask, /obj/item/clothing/mask) + var/list/obscured = check_obscured_slots() + var/list/dat = list() + + dat += "" + for(var/i in 1 to held_items.len) + var/obj/item/I = get_item_for_held_index(i) + dat += "" + dat += "" + + dat += "" + + dat += "" + + if(SLOT_WEAR_MASK in obscured) + dat += "" + else + dat += "" + + if(SLOT_NECK in obscured) + dat += "" + else + dat += "" + + if(SLOT_GLASSES in obscured) + dat += "" + else + dat += "" + + if(SLOT_EARS in obscured) + dat += "" + else + dat += "" + + dat += "" + + dat += "" + if(wear_suit) + dat += "" + else + dat += "" + + if(SLOT_SHOES in obscured) + dat += "" + else + dat += "" + + if(SLOT_GLOVES in obscured) + dat += "" + else + dat += "" + + if(SLOT_W_UNIFORM in obscured) + dat += "" + else + dat += "" + + if((w_uniform == null && !(dna && dna.species.nojumpsuit)) || (SLOT_W_UNIFORM in obscured)) + dat += "" + dat += "" + dat += "" + else + dat += "" + dat += "" + dat += "" + + if(handcuffed) + dat += "" + if(legcuffed) + dat += "" + + dat += {"
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Empty"]
     
    Back:[(back && !(back.item_flags & ABSTRACT)) ? back : "Empty"]" + if(has_breathable_mask && istype(back, /obj/item/tank)) + dat += " [internal ? "Disable Internals" : "Set Internals"]" + + dat += "
     
    Head:[(head && !(head.item_flags & ABSTRACT)) ? head : "Empty"]
    Mask:Obscured
    Mask:[(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Empty"]
    Neck:Obscured
    Neck:[(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Empty"]
    Eyes:Obscured
    Eyes:[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "Empty"]
    Ears:Obscured
    Ears:[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"]
     
    Exosuit:[(wear_suit && !(wear_suit.item_flags & ABSTRACT)) ? wear_suit : "Empty"]
     ↳Suit Storage:[(s_store && !(s_store.item_flags & ABSTRACT)) ? s_store : "Empty"]" + if(has_breathable_mask && istype(s_store, /obj/item/tank)) + dat += " [internal ? "Disable Internals" : "Set Internals"]" + dat += "
     ↳Suit Storage:
    Shoes:Obscured
    Shoes:[(shoes && !(shoes.item_flags & ABSTRACT)) ? shoes : "Empty"]
    Gloves:Obscured
    Gloves:[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "Empty"]
    Uniform:Obscured
    Uniform:[(w_uniform && !(w_uniform.item_flags & ABSTRACT)) ? w_uniform : "Empty"]
     ↳Pockets:
     ↳ID:
     ↳Belt:
     ↳Belt:[(belt && !(belt.item_flags & ABSTRACT)) ? belt : "Empty"]" + if(has_breathable_mask && istype(belt, /obj/item/tank)) + dat += " [internal ? "Disable Internals" : "Set Internals"]" + dat += "
     ↳Pockets:[(l_store && !(l_store.item_flags & ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]" + dat += " [(r_store && !(r_store.item_flags & ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]
     ↳ID:[(wear_id && !(wear_id.item_flags & ABSTRACT)) ? wear_id : "Empty"]
    Handcuffed: Remove
    Legcuffed
    + Close + "} + + var/datum/browser/popup = new(user, "mob[REF(src)]", "[src]", 440, 510) + popup.set_content(dat.Join()) + popup.open() + +// called when something steps onto a human +// this could be made more general, but for now just handle mulebot +/mob/living/carbon/human/Crossed(atom/movable/AM) + var/mob/living/simple_animal/bot/mulebot/MB = AM + if(istype(MB)) + MB.RunOver(src) + + //Hyper Change - Step on people + var/mob/living/carbon/human/H = AM + if(istype(H) && lying && H.a_intent != INTENT_HELP) + H.handle_micro_bump_other(src) + + spreadFire(AM) + +/mob/living/carbon/human/Topic(href, href_list) + if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + if(href_list["embedded_object"]) + var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts + if(!L) + return + var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects + if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore + return + var/time_taken = I.embedding.embedded_unsafe_removal_time/I.w_class //Citadel Change from * to / + usr.visible_message("[usr] attempts to remove [I] from [usr.p_their()] [L.name].","You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)") + if(do_after(usr, time_taken, needhand = 1, target = src)) + remove_embedded_unsafe(L, I, usr) + /* CITADEL EDIT: remove_embedded_unsafe replaces this code + if(!I || !L || I.loc != src || !(I in L.embedded_objects)) + return + L.embedded_objects -= I + L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus. + I.forceMove(get_turf(src)) + usr.put_in_hands(I) + usr.emote("scream") + usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!","You successfully remove [I] from your [L.name].") + if(!has_embedded_objects()) + clear_alert("embeddedobject") + SEND_SIGNAL(usr, COMSIG_CLEAR_MOOD_EVENT, "embedded") */ + return + + if(href_list["item"]) + var/slot = text2num(href_list["item"]) + if(slot in check_obscured_slots()) + to_chat(usr, "You can't reach that! Something is covering it.") + return + + if(href_list["pockets"]) + var/pocket_side = href_list["pockets"] + var/pocket_id = (pocket_side == "right" ? SLOT_R_STORE : SLOT_L_STORE) + var/obj/item/pocket_item = (pocket_id == SLOT_R_STORE ? r_store : l_store) + var/obj/item/place_item = usr.get_active_held_item() // Item to place in the pocket, if it's empty + + var/delay_denominator = 1 + if(pocket_item && !(pocket_item.item_flags & ABSTRACT)) + if(HAS_TRAIT(pocket_item, TRAIT_NODROP)) + to_chat(usr, "You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!") + to_chat(usr, "You try to empty [src]'s [pocket_side] pocket.") + else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.item_flags & ABSTRACT)) + to_chat(usr, "You try to place [place_item] into [src]'s [pocket_side] pocket.") + delay_denominator = 4 + else + return + + if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator, ignorehelditem = TRUE)) //placing an item into the pocket is 4 times faster + if(pocket_item) + if(pocket_item == (pocket_id == SLOT_R_STORE ? r_store : l_store)) //item still in the pocket we search + dropItemToGround(pocket_item) + if(!usr.can_hold_items() || !usr.put_in_hands(pocket_item)) + pocket_item.forceMove(drop_location()) + else + if(place_item) + if(place_item.mob_can_equip(src, usr, pocket_id, FALSE, TRUE)) + usr.temporarilyRemoveItemFromInventory(place_item, TRUE) + equip_to_slot(place_item, pocket_id, TRUE) + //do nothing otherwise + + // Update strip window + if(usr.machine == src && in_range(src, usr)) + show_inv(usr) + else + // Display a warning if the user mocks up + to_chat(src, "You feel your [pocket_side] pocket being fumbled with!") + + ..() //CITADEL CHANGE - removes a tab from behind this ..() so that flavortext can actually be examined + + +///////HUDs/////// + if(href_list["hud"]) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + var/perpname = get_face_name(get_id_name("")) + if(istype(H.glasses, /obj/item/clothing/glasses/hud) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud)) + var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) + if(href_list["photo_front"] || href_list["photo_side"]) + if(R) + if(!H.canUseHUD()) + return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) + return + var/obj/item/photo/P = null + if(href_list["photo_front"]) + P = R.fields["photo_front"] + else if(href_list["photo_side"]) + P = R.fields["photo_side"] + if(P) + P.show(H) + + if(href_list["hud"] == "m") + if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) + if(href_list["p_stat"]) + var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") + if(R) + if(!H.canUseHUD()) + return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) + return + if(health_status && health_status != "Cancel") + R.fields["p_stat"] = health_status + return + if(href_list["m_stat"]) + var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") + if(R) + if(!H.canUseHUD()) + return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) + return + if(health_status && health_status != "Cancel") + R.fields["m_stat"] = health_status + return + if(href_list["evaluation"]) + if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20) + to_chat(usr, "No external injuries detected.
    ") + return + var/span = "notice" + var/status = "" + if(getBruteLoss()) + to_chat(usr, "Physical trauma analysis:") + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + var/brutedamage = BP.brute_dam + if(brutedamage > 0) + status = "received minor physical injuries." + span = "notice" + if(brutedamage > 20) + status = "been seriously damaged." + span = "danger" + if(brutedamage > 40) + status = "sustained major trauma!" + span = "userdanger" + if(brutedamage) + to_chat(usr, "[BP] appears to have [status]") + if(getFireLoss()) + to_chat(usr, "Analysis of skin burns:") + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + var/burndamage = BP.burn_dam + if(burndamage > 0) + status = "signs of minor burns." + span = "notice" + if(burndamage > 20) + status = "serious burns." + span = "danger" + if(burndamage > 40) + status = "major burns!" + span = "userdanger" + if(burndamage) + to_chat(usr, "[BP] appears to have [status]") + if(getOxyLoss()) + to_chat(usr, "Patient has signs of suffocation, emergency treatment may be required!") + if(getToxLoss() > 20) + to_chat(usr, "Gathered data is inconsistent with the analysis, possible cause: poisoning.") + + if(href_list["hud"] == "s") + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) + if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. + return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten + // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access + var/allowed_access = null + var/obj/item/clothing/glasses/G = H.glasses + if (!(G.obj_flags |= EMAGGED)) + if(H.wear_id) + var/list/access = H.wear_id.GetAccess() + if(ACCESS_SEC_DOORS in access) + allowed_access = H.get_authentification_name() + else + allowed_access = "@%&ERROR_%$*" + + + if(!allowed_access) + to_chat(H, "ERROR: Invalid Access") + return + + if(perpname) + R = find_record("name", perpname, GLOB.data_core.security) + if(R) + if(href_list["status"]) + var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Paroled", "Discharged", "Cancel") + if(setcriminal != "Cancel") + if(R) + if(H.canUseHUD()) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) + investigate_log("[key_name(src)] has been set from [R.fields["criminal"]] to [setcriminal] by [key_name(usr)].", INVESTIGATE_RECORDS) + R.fields["criminal"] = setcriminal + sec_hud_set_security_status() + return + + if(href_list["view"]) + if(R) + if(!H.canUseHUD()) + return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) + return + to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") + to_chat(usr, "Minor Crimes:") + for(var/datum/data/crime/c in R.fields["mi_crim"]) + to_chat(usr, "Crime: [c.crimeName]") + to_chat(usr, "Details: [c.crimeDetails]") + to_chat(usr, "Added by [c.author] at [c.time]") + to_chat(usr, "----------") + to_chat(usr, "Major Crimes:") + for(var/datum/data/crime/c in R.fields["ma_crim"]) + to_chat(usr, "Crime: [c.crimeName]") + to_chat(usr, "Details: [c.crimeDetails]") + to_chat(usr, "Added by [c.author] at [c.time]") + to_chat(usr, "----------") + to_chat(usr, "Notes: [R.fields["notes"]]") + return + + if(href_list["add_crime"]) + switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) + if("Minor Crime") + if(R) + var/t1 = stripped_input("Please input minor crime names:", "Security HUD", "", null) + var/t2 = stripped_multiline_input("Please input minor crime details:", "Security HUD", "", null) + if(R) + if (!t1 || !t2 || !allowed_access) + return + else if(!H.canUseHUD()) + return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) + return + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss")) + GLOB.data_core.addMinorCrime(R.fields["id"], crime) + investigate_log("New Minor Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + to_chat(usr, "Successfully added a minor crime.") + return + if("Major Crime") + if(R) + var/t1 = stripped_input("Please input major crime names:", "Security HUD", "", null) + var/t2 = stripped_multiline_input("Please input major crime details:", "Security HUD", "", null) + if(R) + if (!t1 || !t2 || !allowed_access) + return + else if (!H.canUseHUD()) + return + else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) + return + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss")) + GLOB.data_core.addMajorCrime(R.fields["id"], crime) + investigate_log("New Major Crime: [t1]: [t2] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + to_chat(usr, "Successfully added a major crime.") + return + + if(href_list["view_comment"]) + if(R) + if(!H.canUseHUD()) + return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) + return + to_chat(usr, "Comments/Log:") + var/counter = 1 + while(R.fields[text("com_[]", counter)]) + to_chat(usr, R.fields[text("com_[]", counter)]) + to_chat(usr, "----------") + counter++ + return + + if(href_list["add_comment"]) + if(R) + var/t1 = stripped_multiline_input("Add Comment:", "Secure. records", null, null) + if(R) + if (!t1 || !allowed_access) + return + else if(!H.canUseHUD()) + return + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) + return + var/counter = 1 + while(R.fields[text("com_[]", counter)]) + counter++ + R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
    []", allowed_access, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + to_chat(usr, "Successfully added comment.") + return + to_chat(usr, "Unable to locate a data core entry for this person.") + +/mob/living/carbon/human/proc/canUseHUD() + return !(src.stat || IsKnockdown() || IsStun() || src.restrained()) + +/mob/living/carbon/human/can_inject(mob/user, error_msg, target_zone, penetrate_thick = FALSE, bypass_immunity = FALSE) + . = 1 // Default to returning true. + if(user && !target_zone) + target_zone = user.zone_selected + if(HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && !bypass_immunity) + . = 0 + // If targeting the head, see if the head item is thin enough. + // If targeting anything else, see if the wear suit is thin enough. + if (!penetrate_thick) + if(above_neck(target_zone)) + if(head && istype(head, /obj/item/clothing)) + var/obj/item/clothing/CH = head + if (CH.clothing_flags & THICKMATERIAL) + . = 0 + else + if(wear_suit && istype(wear_suit, /obj/item/clothing)) + var/obj/item/clothing/CS = wear_suit + if (CS.clothing_flags & THICKMATERIAL) + . = 0 + if(!. && error_msg && user) + // Might need re-wording. + to_chat(user, "There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"].") + +/mob/living/carbon/human/proc/check_obscured_slots() + var/list/obscured = list() + + if(wear_suit) + if(wear_suit.flags_inv & HIDEGLOVES) + obscured |= SLOT_GLOVES + if(wear_suit.flags_inv & HIDEJUMPSUIT) + obscured |= SLOT_W_UNIFORM + if(wear_suit.flags_inv & HIDESHOES) + obscured |= SLOT_SHOES + + if(head) + if(head.flags_inv & HIDEMASK) + obscured |= SLOT_WEAR_MASK + if(head.flags_inv & HIDEEYES) + obscured |= SLOT_GLASSES + if(head.flags_inv & HIDEEARS) + obscured |= SLOT_EARS + + if(wear_mask) + if(wear_mask.flags_inv & HIDEEYES) + obscured |= SLOT_GLASSES + + if(obscured.len) + return obscured + else + return null + +/mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) + if(judgement_criteria & JUDGE_EMAGGED) + return 10 //Everyone is a criminal! + + var/threatcount = 0 + + //Lasertag bullshit + if(lasercolor) + if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve + if(istype(wear_suit, /obj/item/clothing/suit/redtag)) + threatcount += 4 + if(is_holding_item_of_type(/obj/item/gun/energy/laser/redtag)) + threatcount += 4 + if(istype(belt, /obj/item/gun/energy/laser/redtag)) + threatcount += 2 + + if(lasercolor == "r") + if(istype(wear_suit, /obj/item/clothing/suit/bluetag)) + threatcount += 4 + if(is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag)) + threatcount += 4 + if(istype(belt, /obj/item/gun/energy/laser/bluetag)) + threatcount += 2 + + return threatcount + + //Check for ID + var/obj/item/card/id/idcard = get_idcard(FALSE) + if( (judgement_criteria & JUDGE_IDCHECK) && !idcard && name=="Unknown") + threatcount += 4 + + //Check for weapons + if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck) + if(!idcard || !(ACCESS_WEAPONS in idcard.access)) + for(var/obj/item/I in held_items) //if they're holding a gun + if(weaponcheck.Invoke(I)) + threatcount += 4 + if(weaponcheck.Invoke(belt) || weaponcheck.Invoke(back)) //if a weapon is present in the belt or back slot + threatcount += 2 //not enough to trigger look_for_perp() on it's own unless they also have criminal status. + + //Check for arrest warrant + if(judgement_criteria & JUDGE_RECORDCHECK) + var/perpname = get_face_name(get_id_name()) + var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) + if(R && R.fields["criminal"]) + switch(R.fields["criminal"]) + if("*Arrest*") + threatcount += 5 + if("Incarcerated") + threatcount += 2 + if("Paroled") + threatcount += 2 + + //Check for dresscode violations + if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/syndi) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi)) + threatcount += 4 //fuk u antags <3 //no you + + //mindshield implants imply trustworthyness + if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) + threatcount -= 1 + + //Agent cards lower threatlevel. + if(istype(idcard, /obj/item/card/id/syndicate)) + threatcount -= 2 + + return threatcount + + +//Used for new human mobs created by cloning/goleming/podding +/mob/living/carbon/human/proc/set_cloned_appearance() + if(gender == MALE) + facial_hair_style = "Full Beard" + else + facial_hair_style = "Shaved" + hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3") + underwear = "Nude" + undershirt = "Nude" + update_body() + update_hair() + update_genitals() + +/mob/living/carbon/human/singularity_pull(S, current_size) + ..() + if(current_size >= STAGE_THREE) + for(var/obj/item/hand in held_items) + if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && dropItemToGround(hand)) + step_towards(hand, src) + to_chat(src, "\The [S] pulls \the [hand] from your grip!") + rad_act(current_size * 3) + if(mob_negates_gravity()) + return + +/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C) + CHECK_DNA_AND_SPECIES(C) + + if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH))) + to_chat(src, "[C.name] is dead!") + return + if(is_mouth_covered()) + to_chat(src, "Remove your mask first!") + return 0 + if(C.is_mouth_covered()) + to_chat(src, "Remove [p_their()] mask first!") + return 0 + + if(C.cpr_time < world.time + 30) + visible_message("[src] is trying to perform CPR on [C.name]!", \ + "You try to perform CPR on [C.name]... Hold still!") + if(!do_mob(src, C)) + to_chat(src, "You fail to perform CPR on [C]!") + return 0 + + var/they_breathe = !HAS_TRAIT(C, TRAIT_NOBREATH) + var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS) + + if(C.health > C.crit_threshold) + return + + src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "perform_cpr", /datum/mood_event/perform_cpr) + C.cpr_time = world.time + log_combat(src, C, "CPRed") + + if(they_breathe && they_lung) + var/suff = min(C.getOxyLoss(), 7) + C.adjustOxyLoss(-suff) + C.updatehealth() + to_chat(C, "You feel a breath of fresh air enter your lungs... It feels good...") + else if(they_breathe && !they_lung) + to_chat(C, "You feel a breath of fresh air... but you don't feel any better...") + else + to_chat(C, "You feel a breath of fresh air... which is a sensation you don't recognise...") + +/mob/living/carbon/human/cuff_resist(obj/item/I) + if(dna && dna.check_mutation(HULK)) + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") + if(..(I, cuff_break = FAST_CUFFBREAK)) + dropItemToGround(I) + else + if(..()) + dropItemToGround(I) + +/mob/living/carbon/human/clean_blood() + var/mob/living/carbon/human/H = src + if(H.gloves) + if(H.gloves.clean_blood()) + H.update_inv_gloves() + else + ..() // Clear the Blood_DNA list + if(H.bloody_hands) + H.bloody_hands = 0 + H.update_inv_gloves() + update_icons() //apply the now updated overlays to the mob + +/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_human")) + cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal")) + cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large")) + creamed = FALSE + + +//Turns a mob black, flashes a skeleton overlay +//Just like a cartoon! +/mob/living/carbon/human/proc/electrocution_animation(anim_duration) + //Handle mutant parts if possible + if(dna && dna.species) + add_atom_colour("#000000", TEMPORARY_COLOUR_PRIORITY) + var/static/mutable_appearance/electrocution_skeleton_anim + if(!electrocution_skeleton_anim) + electrocution_skeleton_anim = mutable_appearance(icon, "electrocuted_base") + electrocution_skeleton_anim.appearance_flags |= RESET_COLOR|KEEP_APART + add_overlay(electrocution_skeleton_anim) + addtimer(CALLBACK(src, .proc/end_electrocution_animation, electrocution_skeleton_anim), anim_duration) + + else //or just do a generic animation + flick_overlay_view(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), src, anim_duration) + +/mob/living/carbon/human/proc/end_electrocution_animation(mutable_appearance/MA) + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#000000") + cut_overlay(MA) + +/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) + if(incapacitated() || lying ) + to_chat(src, "You can't do that right now!") + return FALSE + if(!Adjacent(M) && (M.loc != src)) + if((be_close == 0) || (!no_tk && (dna.check_mutation(TK) && tkMaxRangeCheck(src, M)))) + return TRUE + to_chat(src, "You are too far away!") + return FALSE + return TRUE + +/mob/living/carbon/human/resist_restraints() + if(wear_suit && wear_suit.breakouttime) + changeNext_move(CLICK_CD_BREAKOUT) + last_special = world.time + CLICK_CD_BREAKOUT + cuff_resist(wear_suit) + else + ..() + +/mob/living/carbon/human/replace_records_name(oldname,newname) // Only humans have records right now, move this up if changed. + for(var/list/L in list(GLOB.data_core.general,GLOB.data_core.medical,GLOB.data_core.security,GLOB.data_core.locked)) + var/datum/data/record/R = find_record("name", oldname, L) + if(R) + R.fields["name"] = newname + +/mob/living/carbon/human/get_total_tint() + . = ..() + if(glasses) + . += glasses.tint + +/mob/living/carbon/human/update_health_hud() + if(!client || !hud_used) + return + if(dna.species.update_health_hud()) + 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 + if(..(health_amount)) //not dead + switch(hal_screwyhud) + if(SCREWYHUD_CRIT) + hud_used.healths.icon_state = "health6" + if(SCREWYHUD_DEAD) + hud_used.healths.icon_state = "health7" + if(SCREWYHUD_HEALTHY) + hud_used.healths.icon_state = "health0" + if(hud_used.healthdoll) + hud_used.healthdoll.cut_overlays() + if(stat != DEAD) + hud_used.healthdoll.icon_state = "healthdoll_OVERLAY" + for(var/X in bodyparts) + var/obj/item/bodypart/BP = X + var/damage = BP.burn_dam + BP.brute_dam + var/comparison = (BP.max_damage/5) + var/icon_num = 0 + if(damage) + icon_num = 1 + if(damage > (comparison)) + icon_num = 2 + if(damage > (comparison*2)) + icon_num = 3 + if(damage > (comparison*3)) + icon_num = 4 + if(damage > (comparison*4)) + icon_num = 5 + if(hal_screwyhud == SCREWYHUD_HEALTHY) + icon_num = 0 + if(icon_num) + hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[BP.body_zone][icon_num]")) + for(var/t in get_missing_limbs()) //Missing limbs + hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]6")) + for(var/t in get_disabled_limbs()) //Disabled limbs + hud_used.healthdoll.add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[t]7")) + else + hud_used.healthdoll.icon_state = "healthdoll_DEAD" + +/mob/living/carbon/human/fully_heal(admin_revive = 0) + if(admin_revive) + regenerate_limbs() + regenerate_organs() + remove_all_embedded_objects() + set_heartattack(FALSE) + drunkenness = 0 + for(var/datum/mutation/human/HM in dna.mutations) + if(HM.quality != POSITIVE) + dna.remove_mutation(HM.name) + if(blood_volume < (BLOOD_VOLUME_NORMAL*blood_ratio)) + blood_volume = (BLOOD_VOLUME_NORMAL*blood_ratio) + ..() + +/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) + . = ..() + if (dna && dna.species) + . += dna.species.check_weakness(weapon, attacker) + +/mob/living/carbon/human/is_literate() + return 1 + +/mob/living/carbon/human/can_hold_items() + return TRUE + +/mob/living/carbon/human/update_gravity(has_gravity,override = 0) + if(dna && dna.species) //prevents a runtime while a human is being monkeyfied + override = dna.species.override_float + ..() + +/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0) + if(blood && (NOBLOOD in dna.species.species_traits)) + if(message) + visible_message("[src] dry heaves!", \ + "You try to throw up, but there's nothing in your stomach!") + if(stun) + Knockdown(200) + return 1 + ..() + +/mob/living/carbon/human/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("", "---------") + VV_DROPDOWN_OPTION(VV_HK_COPY_OUTFIT, "Copy Outfit") + VV_DROPDOWN_OPTION(VV_HK_MOD_QUIRKS, "Add/Remove Quirks") + VV_DROPDOWN_OPTION(VV_HK_MAKE_MONKEY, "Make Monkey") + VV_DROPDOWN_OPTION(VV_HK_MAKE_CYBORG, "Make Cyborg") + VV_DROPDOWN_OPTION(VV_HK_MAKE_SLIME, "Make Slime") + VV_DROPDOWN_OPTION(VV_HK_MAKE_ALIEN, "Make Alien") + VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species") + VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation") + +/mob/living/carbon/human/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_COPY_OUTFIT]) + if(!check_rights(R_SPAWN)) + return + copy_outfit() + if(href_list[VV_HK_MOD_QUIRKS]) + if(!check_rights(R_SPAWN)) + return + + var/list/options = list("Clear"="Clear") + for(var/x in subtypesof(/datum/quirk)) + var/datum/quirk/T = x + var/qname = initial(T.name) + options[has_quirk(T) ? "[qname] (Remove)" : "[qname] (Add)"] = T + + var/result = input(usr, "Choose quirk to add/remove","Quirk Mod") as null|anything in options + if(result) + if(result == "Clear") + for(var/datum/quirk/q in roundstart_quirks) + remove_quirk(q.type) + else + var/T = options[result] + if(has_quirk(T)) + remove_quirk(T) + else + add_quirk(T,TRUE) + if(href_list[VV_HK_MAKE_MONKEY]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("monkeyone"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MAKE_CYBORG]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makerobot"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MAKE_ALIEN]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makealien"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_MAKE_SLIME]) + if(!check_rights(R_SPAWN)) + return + if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") + return + usr.client.holder.Topic("vv_override", list("makeslime"=href_list[VV_HK_TARGET])) + if(href_list[VV_HK_SET_SPECIES]) + if(!check_rights(R_SPAWN)) + return + var/result = input(usr, "Please choose a new species","Species") as null|anything in GLOB.species_list + if(result) + var/newtype = GLOB.species_list[result] + admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src] to [result]") + set_species(newtype) + if(href_list[VV_HK_PURRBATION]) + if(!check_rights(R_SPAWN)) + return + if(!ishumanbasic(src)) + to_chat(usr, "This can only be done to the basic human species at the moment.") + return + var/success = purrbation_toggle(src) + if(success) + to_chat(usr, "Put [src] on purrbation.") + log_admin("[key_name(usr)] has put [key_name(src)] on purrbation.") + var/msg = "[key_name_admin(usr)] has put [key_name(src)] on purrbation." + message_admins(msg) + admin_ticket_log(src, msg) + + else + to_chat(usr, "Removed [src] from purrbation.") + log_admin("[key_name(usr)] has removed [key_name(src)] from purrbation.") + var/msg = "[key_name_admin(usr)] has removed [key_name(src)] from purrbation." + message_admins(msg) + admin_ticket_log(src, msg) + +/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) + if(pulling == target && grab_state >= GRAB_AGGRESSIVE && stat == CONSCIOUS) + //If they dragged themselves and we're currently aggressively grabbing them try to piggyback + if(user == target && can_piggyback(target)) + piggyback(target) + return + //If you dragged them to you and you're aggressively grabbing try to fireman carry them + else if(user != target) + fireman_carry(target) + return + . = ..() + +//src is the user that will be carrying, target is the mob to be carried +/mob/living/carbon/human/proc/can_piggyback(mob/living/carbon/target) + return (istype(target) && target.stat == CONSCIOUS) + +/mob/living/carbon/human/proc/can_be_firemanned(mob/living/carbon/target) + return (ishuman(target) && target.lying) + +/mob/living/carbon/human/proc/fireman_carry(mob/living/carbon/target) + if(can_be_firemanned(target)) + visible_message("[src] starts lifting [target] onto their back...", + "You start lifting [target] onto your back...") + if(do_after(src, 30, TRUE, target)) + //Second check to make sure they're still valid to be carried + if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE)) + target.resting = FALSE + buckle_mob(target, TRUE, TRUE, 90, 1, 0) + return + visible_message("[src] fails to fireman carry [target]!") + else + to_chat(src, "You can't fireman carry [target] while they're standing!") + +/mob/living/carbon/human/proc/piggyback(mob/living/carbon/target) + if(can_piggyback(target)) + visible_message("[target] starts to climb onto [src]...") + if(do_after(target, 15, target = src)) + if(can_piggyback(target)) + 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) + 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) + if(!force)//humans are only meant to be ridden through piggybacking and special cases + return + if(!is_type_in_typecache(target, can_ride_typecache)) + target.visible_message("[target] really can't seem to mount [src]...") + return + buckle_lying = lying_buckle + var/datum/component/riding/human/riding_datum = LoadComponent(/datum/component/riding/human) + if(target_hands_needed) + riding_datum.ride_check_rider_restrained = TRUE + if(buckled_mobs && ((target in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled) + return + var/equipped_hands_self + var/equipped_hands_target + if(hands_needed) + equipped_hands_self = riding_datum.equip_buckle_inhands(src, hands_needed, target) + if(target_hands_needed) + equipped_hands_target = riding_datum.equip_buckle_inhands(target, target_hands_needed) + + if(hands_needed || target_hands_needed) + if(hands_needed && !equipped_hands_self) + src.visible_message("[src] can't get a grip on [target] because their hands are full!", + "You can't get a grip on [target] because your hands are full!") + return + else if(target_hands_needed && !equipped_hands_target) + target.visible_message("[target] can't get a grip on [src] because their hands are full!", + "You can't get a grip on [src] because your hands are full!") + return + + stop_pulling() + riding_datum.handle_vehicle_layer() + . = ..(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 + for(var/obj/item/clothing/C in get_equipped_items()) //doesn't include pockets + if(C.blocks_shove_knockdown) + return TRUE + return FALSE + +/mob/living/carbon/human/proc/clear_shove_slowdown() + remove_movespeed_modifier(SHOVE_SLOWDOWN_ID) + var/active_item = get_active_held_item() + if(is_type_in_typecache(active_item, GLOB.shove_disarming_types)) + visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) + +/mob/living/carbon/human/do_after_coefficent() + . = ..() + . *= physiology.do_after_speed + +/mob/living/carbon/human/species + var/race = null + +/mob/living/carbon/human/species/Initialize() + . = ..() + set_species(race) + +/mob/living/carbon/human/species/abductor + race = /datum/species/abductor + +/mob/living/carbon/human/species/android + race = /datum/species/android + +/mob/living/carbon/human/species/angel + race = /datum/species/angel + +/mob/living/carbon/human/species/corporate + race = /datum/species/corporate + +/mob/living/carbon/human/species/dullahan + race = /datum/species/dullahan + +/mob/living/carbon/human/species/felinid + race = /datum/species/human/felinid + +/mob/living/carbon/human/species/fly + race = /datum/species/fly + +/mob/living/carbon/human/species/golem + race = /datum/species/golem + +/mob/living/carbon/human/species/golem/random + race = /datum/species/golem/random + +/mob/living/carbon/human/species/golem/adamantine + race = /datum/species/golem/adamantine + +/mob/living/carbon/human/species/golem/plasma + race = /datum/species/golem/plasma + +/mob/living/carbon/human/species/golem/diamond + race = /datum/species/golem/diamond + +/mob/living/carbon/human/species/golem/gold + race = /datum/species/golem/gold + +/mob/living/carbon/human/species/golem/silver + race = /datum/species/golem/silver + +/mob/living/carbon/human/species/golem/plasteel + race = /datum/species/golem/plasteel + +/mob/living/carbon/human/species/golem/titanium + race = /datum/species/golem/titanium + +/mob/living/carbon/human/species/golem/plastitanium + race = /datum/species/golem/plastitanium + +/mob/living/carbon/human/species/golem/alien_alloy + race = /datum/species/golem/alloy + +/mob/living/carbon/human/species/golem/wood + race = /datum/species/golem/wood + +/mob/living/carbon/human/species/golem/uranium + race = /datum/species/golem/uranium + +/mob/living/carbon/human/species/golem/sand + race = /datum/species/golem/sand + +/mob/living/carbon/human/species/golem/glass + race = /datum/species/golem/glass + +/mob/living/carbon/human/species/golem/bluespace + race = /datum/species/golem/bluespace + +/mob/living/carbon/human/species/golem/bananium + race = /datum/species/golem/bananium + +/mob/living/carbon/human/species/golem/blood_cult + race = /datum/species/golem/runic + +/mob/living/carbon/human/species/golem/cloth + race = /datum/species/golem/cloth + +/mob/living/carbon/human/species/golem/plastic + race = /datum/species/golem/plastic + +/mob/living/carbon/human/species/golem/bronze + race = /datum/species/golem/bronze + +/mob/living/carbon/human/species/golem/cardboard + race = /datum/species/golem/cardboard + +/mob/living/carbon/human/species/golem/leather + race = /datum/species/golem/leather + +/mob/living/carbon/human/species/golem/bone + race = /datum/species/golem/bone + +/mob/living/carbon/human/species/golem/durathread + race = /datum/species/golem/durathread + +/mob/living/carbon/human/species/golem/clockwork + race = /datum/species/golem/clockwork + +/mob/living/carbon/human/species/golem/clockwork/no_scrap + race = /datum/species/golem/clockwork/no_scrap + +/mob/living/carbon/human/species/jelly + race = /datum/species/jelly + +/mob/living/carbon/human/species/jelly/slime + race = /datum/species/jelly/slime + +/mob/living/carbon/human/species/jelly/stargazer + race = /datum/species/jelly/stargazer + +/mob/living/carbon/human/species/jelly/luminescent + race = /datum/species/jelly/luminescent + +/mob/living/carbon/human/species/lizard + race = /datum/species/lizard + +/mob/living/carbon/human/species/lizard/ashwalker + race = /datum/species/lizard/ashwalker + +/mob/living/carbon/human/species/moth + race = /datum/species/moth + +/mob/living/carbon/human/species/mush + race = /datum/species/mush + +/mob/living/carbon/human/species/plasma + race = /datum/species/plasmaman + +/mob/living/carbon/human/species/pod + race = /datum/species/pod + +/mob/living/carbon/human/species/shadow + race = /datum/species/shadow + +/mob/living/carbon/human/species/shadow/nightmare + race = /datum/species/shadow/nightmare + +/mob/living/carbon/human/species/skeleton + race = /datum/species/skeleton + +/mob/living/carbon/human/species/synth + race = /datum/species/synth + +/mob/living/carbon/human/species/synth/military + race = /datum/species/synth/military + +/mob/living/carbon/human/species/vampire + race = /datum/species/vampire + +/mob/living/carbon/human/species/zombie + race = /datum/species/zombie + +/mob/living/carbon/human/species/zombie/infectious + race = /datum/species/zombie/infectious + +/mob/living/carbon/human/species/zombie/krokodil_addict + race = /datum/species/krokodil_addict + +/mob/living/carbon/human/species/mammal + race = /datum/species/mammal + +/mob/living/carbon/human/species/insect + race = /datum/species/insect + +/mob/living/carbon/human/species/xeno + race = /datum/species/xeno + +/mob/living/carbon/human/species/ipc + race = /datum/species/ipc + +/mob/living/carbon/human/species/roundstartslime + race = /datum/species/jelly/roundstartslime +//define holder_type on nerds we wanna commit scoop to +/* /mob/living/carbon/human + var/holder_type = /obj/item/clothing/head/mob_holder/micro + can_be_held = "micro" +*/ + diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d457a3d5..5c6f1ecc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1277,3 +1277,18 @@ if(healing_chems) reagents.add_reagent_list(healing_chems) +/mob/living/vv_get_header() + . = ..() + var/refid = REF(src) + . += {" +
    [VV_HREF_TARGETREF_1V(refid, VV_HK_BASIC_EDIT, "[ckey || "no ckey"]", NAMEOF(src, ckey))] / [VV_HREF_TARGETREF_1V(refid, VV_HK_BASIC_EDIT, "[real_name || "no real name"]", NAMEOF(src, real_name))] +
    + BRUTE:[getBruteLoss()] + FIRE:[getFireLoss()] + TOXIN:[getToxLoss()] + OXY:[getOxyLoss()] + CLONE:[getCloneLoss()] + BRAIN:[getOrganLoss(ORGAN_SLOT_BRAIN)] + STAMINA:[getStaminaLoss()] + + "} diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fac2f8d3..f3ca2844 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -979,18 +979,65 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA /mob/vv_get_dropdown() . = ..() - . += "---" - .["Gib"] = "?_src_=vars;[HrefToken()];gib=[REF(src)]" - .["Give Spell"] = "?_src_=vars;[HrefToken()];give_spell=[REF(src)]" - .["Remove Spell"] = "?_src_=vars;[HrefToken()];remove_spell=[REF(src)]" - .["Give Disease"] = "?_src_=vars;[HrefToken()];give_disease=[REF(src)]" - .["Toggle Godmode"] = "?_src_=vars;[HrefToken()];godmode=[REF(src)]" - .["Drop Everything"] = "?_src_=vars;[HrefToken()];drop_everything=[REF(src)]" - .["Regenerate Icons"] = "?_src_=vars;[HrefToken()];regenerateicons=[REF(src)]" - .["Show player panel"] = "?_src_=vars;[HrefToken()];mob_player_panel=[REF(src)]" - .["Toggle Build Mode"] = "?_src_=vars;[HrefToken()];build_mode=[REF(src)]" - .["Assume Direct Control"] = "?_src_=vars;[HrefToken()];direct_control=[REF(src)]" - .["Offer Control to Ghosts"] = "?_src_=vars;[HrefToken()];offer_control=[REF(src)]" + VV_DROPDOWN_OPTION("", "---------") + VV_DROPDOWN_OPTION(VV_HK_GIB, "Gib") + VV_DROPDOWN_OPTION(VV_HK_GIVE_SPELL, "Give Spell") + VV_DROPDOWN_OPTION(VV_HK_REMOVE_SPELL, "Remove Spell") + VV_DROPDOWN_OPTION(VV_HK_GIVE_DISEASE, "Give Disease") + VV_DROPDOWN_OPTION(VV_HK_GODMODE, "Toggle Godmode") + VV_DROPDOWN_OPTION(VV_HK_DROP_ALL, "Drop Everything") + VV_DROPDOWN_OPTION(VV_HK_REGEN_ICONS, "Regenerate Icons") + VV_DROPDOWN_OPTION(VV_HK_PLAYER_PANEL, "Show player panel") + VV_DROPDOWN_OPTION(VV_HK_BUILDMODE, "Toggle Buildmode") + VV_DROPDOWN_OPTION(VV_HK_DIRECT_CONTROL, "Assume Direct Control") + VV_DROPDOWN_OPTION(VV_HK_OFFER_GHOSTS, "Offer Control to Ghosts") + +/mob/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_REGEN_ICONS]) + if(!check_rights(NONE)) + return + regenerate_icons() + if(href_list[VV_HK_PLAYER_PANEL]) + if(!check_rights(NONE)) + return + usr.client.holder.show_player_panel(src) + if(href_list[VV_HK_GODMODE]) + if(!check_rights(R_ADMIN)) + return + usr.client.cmd_admin_godmode(src) + if(href_list[VV_HK_GIVE_SPELL]) + if(!check_rights(NONE)) + return + usr.client.give_spell(src) + if(href_list[VV_HK_REMOVE_SPELL]) + if(!check_rights(NONE)) + return + usr.client.remove_spell(src) + if(href_list[VV_HK_GIVE_DISEASE]) + if(!check_rights(NONE)) + return + usr.client.give_disease(src) + if(href_list[VV_HK_GIB]) + if(!check_rights(R_FUN)) + return + usr.client.cmd_admin_gib(src) + if(href_list[VV_HK_BUILDMODE]) + if(!check_rights(R_BUILDMODE)) + return + togglebuildmode(src) + if(href_list[VV_HK_DROP_ALL]) + if(!check_rights(NONE)) + return + usr.client.cmd_admin_drop_everything(src) + if(href_list[VV_HK_DIRECT_CONTROL]) + if(!check_rights(NONE)) + return + usr.client.cmd_assume_direct_control(src) + if(href_list[VV_HK_OFFER_GHOSTS]) + if(!check_rights(NONE)) + return + offer_control(src) /mob/vv_get_var(var_name) switch(var_name) @@ -998,6 +1045,10 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA return debug_variable(var_name, logging, 0, src, FALSE) . = ..() +/mob/vv_auto_rename(new_name) + //Do not do parent's actions, as we *usually* do this differently. + fully_replace_character_name(real_name, new_name) + /mob/verb/open_language_menu() set name = "Open Language Menu" set category = "IC" diff --git a/tgstation.dme b/tgstation.dme index cb439391..adcfeb8b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -152,6 +152,7 @@ #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" #include "code\__HELPERS\type2type_vr.dm" +#include "code\__HELPERS\type_processing.dm" #include "code\__HELPERS\typelists.dm" #include "code\__HELPERS\unsorted.dm" #include "code\__HELPERS\verbs.dm" @@ -1188,6 +1189,7 @@ #include "code\modules\admin\stickyban.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\whitelist.dm" +#include "code\modules\admin\callproc\callproc.dm" #include "code\modules\admin\DB_ban\functions.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" @@ -1211,8 +1213,6 @@ #include "code\modules\admin\verbs\map_template_loadverb.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\maprotation.dm" -#include "code\modules\admin\verbs\massmodvar.dm" -#include "code\modules\admin\verbs\modifyvariables.dm" #include "code\modules\admin\verbs\one_click_antag.dm" #include "code\modules\admin\verbs\onlyone.dm" #include "code\modules\admin\verbs\panicbunker.dm" @@ -1226,7 +1226,16 @@ #include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" #include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" +#include "code\modules\admin\view_variables\admin_delete.dm" #include "code\modules\admin\view_variables\debug_variables.dm" +#include "code\modules\admin\view_variables\get_variables.dm" +#include "code\modules\admin\view_variables\mark_datum.dm" +#include "code\modules\admin\view_variables\mass_edit_variables.dm" +#include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\topic.dm" +#include "code\modules\admin\view_variables\topic_basic.dm" +#include "code\modules\admin\view_variables\topic_list.dm" +#include "code\modules\admin\view_variables\view_variables.dm" #include "code\modules\antagonists\_common\antag_datum.dm" #include "code\modules\antagonists\_common\antag_helpers.dm" #include "code\modules\antagonists\_common\antag_hud.dm" From bb44f92618be0bb26f9d5e896bc284671e5afc3a Mon Sep 17 00:00:00 2001 From: Archie Date: Wed, 21 Jul 2021 19:02:17 -0300 Subject: [PATCH 15/16] Prevents mapping helpers and baseturf helpers from being clouded --- code/datums/components/chasm.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 3d854a76..4a64e5f8 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -21,10 +21,13 @@ /obj/effect/particle_effect, /obj/effect/light_emitter/tendril, /obj/effect/collapse, + /obj/effect/cloud_collapse, /obj/effect/particle_effect/ion_trails, /obj/effect/dummy/phased_mob, /obj/effect/immovablerod, - /obj/effect/crystalline_reentry + /obj/effect/crystalline_reentry, + /obj/effect/mapping_helpers, + /obj/effect/baseturf_helper )) /datum/component/chasm/Initialize(turf/target) From 5897d7fef3a9f14b6bca04c09387fde0c275e7f1 Mon Sep 17 00:00:00 2001 From: Dahlular <55758850+Dahlular@users.noreply.github.com> Date: Thu, 22 Jul 2021 00:28:51 -0600 Subject: [PATCH 16/16] Bluespace anomalies are more difficult to get Makes bluespace anomalies more difficult in their occurance; this is due to the fact that people have often been clouded randomly by them. Not fun. --- code/game/gamemodes/dynamic/dynamic_rulesets_events.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm index efaa5eff..cc56359c 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm @@ -289,7 +289,7 @@ enemy_roles = list("Chief Engineer","Station Engineer","Atmospheric Technician","Research Director","Scientist","Captain") required_enemies = list(2,2,2,1,1,1,1,1,1,0) weight = 2 - earliest_start = 20 MINUTES + earliest_start = 40 MINUTES repeatable_weight_decrease = 2 cost = 0 requirements = list(101,101,10,5,5,5,5,5,5,5) @@ -297,7 +297,7 @@ repeatable = TRUE //property_weights = list("extended" = 1) occurances_max = 2 - chaos_min = 1.0 + chaos_min = 3.0 /datum/dynamic_ruleset/event/anomaly_flux name = "Anomaly: Hyper-Energetic Flux"

    `d` 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 z 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≶3^ z0iUZz;7*vS=7m(aODz=H1A+5CSUOD&!PSR+xG|{yMts>y0)#oqA&jhRLm*1X5Hd1{ zo?nHgzr*GBdc(v$53%q+=vc~jr0?Tz*PHA-u>JvZo7DfpFhM}! z{1(>p&@x@491PbSHczv&`Bc{U!(U(9g_slzuF|@FmkYVx#nz}(k##%qA5}F!_aW$< z#`)RCO}Fliu}sHE4#`5ds*&!N*9AAxtC)&EPrjOR*DJGq{Jm-X$r5v>rTCVOuEB^t z!@%HEO|hx-*6wdl`)OQ`#fJ}RLB70asIpRgnA+W$L-g|ee1Y-R&AClqBSI|Djh{6l-kA>Qy}lX# zU?m1$vI{?S6^ez(C}=;H(nLp#SGgn;cR(eQf=*o4!qSqFzb2`_$3@?ELHj~W(p-EE z;N(9YxwQ!&kR?lOMVg%Swm_Q|Nv#m1L)dQag-Z~={n+hofoolafbSu}&k0}lyw2m` zDXCiLPm)vS}ejgEO{Un`dn^kzC6DkimHOqxaPlebMTo;Z&Z5}NZ-L9kE`B3(| zswy7Fgy#JP@YA$}py#FrIa>?nV#(K(r2GzU{#L7g{sPahPjZbDntPlsf2{Td?UD=0 zh!Pgpz?~NiFtk9B5@CCh_&d5S=Mm9Rx+r1n5bm~Bx{Jz)7j{p$ixigj8sR=z9_^?- zFjDLLAaV9un)ds)96s>XQ@=OOn!3BYH>l&^J$l5F6!+Qt=KT5dT{t`kLj1->eJ-n} z3VF|sk549QqQ2qD`~?GL+_L((#H2kpScsd=BdPsZm!eIx5b(uv1UXsRD{q)zMZv!f z2bD+=%G9d!_jYzZ=k>NIut9Pj_!8o6jvd*~qkg4<6H*`uvx~Y;wq^IkGl?_lbr{Fi zd{bHWo8L2bPbAjd&kdHI@u;L^7wBvm>|-kNwtH^-HJe9NRHvVbmG!tB^%@jx}NIKrAr5>8Q$m8rYhqS`cf-k=upl{59k}(or8P{zv38*y4wzs;GFC=Tjsqlevk~cQF(TMo3qY_R?(OGQ%*g&8ZTd6BPvEMGo$l?wZ9vDT zK-hkRXV7Sc7~Gbv*6TC}&B=@@oOR?xyaW%6XxOe4-?RGa%{v^m@9vLXOll~0<|w}} z4s|w9TF1(%YW<3?;szHw+}Q1vhsKU5Mv0H@+<8O*g!F2GhtZUur7P&j?n+U9VyyfL zv+Q9)=+W+XtTMK`BqTrg(|K>yf!&=^RWkX2?GEVGjg2mIiC+{5dulJTr!&{j#o7}{ z=8+<-tE+Oip{Zh6t~X84RvQ?CQ*>;Q>gZ86l?azW4E$phJc4{?>Lauj91Z7j#1Di< z!-0V!+>+kXMAI@?1LU>XSf8M-n9HDssu&TR8OG+!zIZ{&p=(LVv9(^&xH<+~csd#XR!ZO8ddFr^w{`JhBQ2rLnVVw!1#(#-fm+K9u{4vqL!Di?F{7%?N}*K@=k^MX~l2m-!^yRCCdZbNa}u$+jg04 zY|8O6-{k@62%!A{(>|;lHs1spcyh-W@uS-6DuBg9aX4R<{c-Ep>tU%z1**Qjx2JcX zD2pdrR>n%hq_z+IZlxV?#v3DZjUxF2%r3aUnec7fI3wwABIc5z^TfbbFl>9Yg(pD7Q(}tf-O)C+w zTW5GQ%l(B&X3`T zx~Q?9M|LiD5|m{hgsl>8Pge;rCBo5C3H{Y4!+R8%|)+(Idl=;VVH$MT;Ls;)!I z&NT(2>p^zcKf(8uk#du-hl1}bDZ^WWud|4F(UZ>Ch={_a)C6DcP80WSZhlnKL9;hBM@atYh(hQRCO1$YnG&Qk z2K8qaMAX#Oh|#1I6ID}Z#icP$j*b>CE_A>$QQ2>P5jO!!Ih6Mei$^Pdce*Z7!3tsQ zwptdSxAnBQ2K$ukKG+qdozeV!8g0WPbB#+<(7f@eNKN;xC4MAR`nW~)sY!3kV*bbr z{GhZyc8X3aaE)Eiye1}Uee8#e*M0-U<6&0mfRimaK&9SA~R`4|C5ZuW_=K z6EAAHe{bWM`vb0+B0&6|+i$nKd+#M@9GAnZE57-QG)?OCjP;ybu*$uC|6#z(+@d08 z!3Qgm^TIXIu^Ez&z;S6M|845G$98LP(f^CKw+@IZ>fT0Y1nCfvMiCJaloDxS2nCUp zZV>5^l8_o&8fl~j>5^`SmQJN%=#Y}mnYo+y{eJhm_3!d504nrdZXps+ywpn{ehZO z063aQ-m%#%o0^zNjYCA^0~Tt6GAe%J&4Nu}3kC)TG|d7bR`;d%6_!)e(tx1nK?+5b zL%Cu2(wnQaoiYH2(n!3J=g!Iibhu&EoDVp~?gIh&b{6oTnoI9y6jP`8 zxbv5*9uT5}=y>TsyD}5#Tch7NoQJ)|r{K&vP~hxZ;$k1$po_qX8cq%baRpf3^d5Y~ zG|D%L(Z_UL)&_foTO!!o>@~*_l{%AHm4KcU4ngAi$bz7*THrvaPT^xB9z)|>b37k* z-n_Vr+~KE)JpL?opfErqLe2x-`z=qC08c+Xgy#&0v9rk6G1V@tmmYt9mt%qsxqxc% zr*%q0hyg;4dSWg6Nh3|0zyBibI=h}9F79`*8R&eWra)udavtdZVKbmD|LKHl3ck!` zQ>j+ecM6;iuHPxi_#KDC;|6Frv1pk}djNepZ}=78ansx0Yl@@((NQw6;DIhe`mhcN zz_l6qWM?x|QVgge3JUORYCOBLOG-GBlaurRhOHh9T);?oN&6(%S#+Ru_HpUsTvAglKZzI41#WV8Es}m`pvy1yu7f$DeR48 zk0vImD492AoGZg>@{^KVas-nL3lG|A($0-$6@mEz%0rCF6Vw4RH`+l|cf_u+FxP#j z(}W%~XE-`D)?-*(bIZqG;ZBN^<2J?L?QI7~q@ujLH;3ZhYzT1lg_qc>6u~qqB^(jI zUvRv)av$T*e745OJuEtMbXaz5o!LA$-UmM%{WkaWeaA?i5~HA?pm^CN7NotS0}26B zUL+(Wc*MkA;HZhf(v69MSp`swB^D780dgBR-ibPL#mL+o7Y>I5Rt#m{r5^7aIWvHj zUtBa26cJ(mc!mwY_4K@o!+TYGw#0S2MTk`wRM&sj*hNI#(5HKPdEJh+z8R0o%D6!2 zdjqrw{1`izVYoH@CfFe-(8XF_^L8U{qswsG_AVpto6TE3JD0{(x3sS8Y16}naUfb% zZagpOB0&H3Ij)z^Zp-QlgF=*~?{&<4>Hn#0#!-I3^Wf#JhT?vEViF4Z$eYn_a*=zp zg7bs8TfolaU@b<7H}yR3WrD^Wqku}?rmoIG@CnrD_lV$& zYW{~0%MtdLR<@n_-yQyQStq#T!@r>?F=*vmV;jz0?sFNbZ}h{~kk3V#FuCiR9wXds zGvl@8(cWI_?EzRue}Z>NI@ei=J9AY(s}nNAa}ipldMLDFsb9-bAMT6mKGNwxVX3wAAf%= z;MAhOeG37m@jdNj%~ti(B&Qjr1ayYeOq4FB@AK63blcF7Ti-25!#U}hNra;TzZVbc zn)5yC=?3&Bxmstx1St7wZzLAt5)=LJes>Ov)~wXdl%^D0L@tEw&Vv4h?AowAaF6Fj?EkSfSFm!C1NNh zI@%X(;W_B*c*?p&0H3Azq(I`c*N4Vohd@T@|G@%0Ewk$kjG=3L79A#+!*}D|DqpMD zsp(*`>e2^X)e%sG|CJjf>*Hrg)mIxXdh8`_dHV<%b^kSFYI+=|y}>i?Zd|+aA8$0V zdc+g9CzJ!^^*!UJH*W0pbQgHnw$Kfg;ACp=TIg=u5vsaaiue$^IT!g-pUT^9g+`q? z0q*3kf)1&dn$WJq`K}^3goox zo*%u)F{AszWno})P`_zn5Kv=8U4z73Z zt=ni8H)qeldR(tl(hWzP(_D#7hZi_eE00#jfdqwhChG>HPgWV!VGpW2_#gWsB-G)y zxdUK)L4bmHi3ivjQ1=YENC3nlRaGyD=&_rAX6E#R01|U~vi*dO&GPI5Xyw&;qZ({L z!YsZE0$Ep>XTKOwFZvT464DkypD?(1YBA|E3!*du+sjYK3$yfu&{RQ(TOlDKRCy18 zJ~$vdrqII6JX=^u;`ee-ENYiO8BP~{`p8$UGkRMJmvnh&x>5_Tb)O!leax|R7Qsk9 z_KPsyER2dv8mJKbw&DYXd=G0=X#o+jF9^WByqc9!HFv}%FWt_)R#=NBKwze~>`&qF z{Rd8Mq<56A3__+eSa4JBqilK}SAAeGnM1o1XWZ`x2W=txr34Qz6W>}XyIp&%nK#6F{JPJxN?+-OsAw9CkI)z{39;PH3I29(Vy*B&mSIBn zYqU~M52oO51G^ZqbCqdQ$TG0qsn4;hV$(I?DwbkYZPIVHBSn@TDn+ta?M>_xDJm+ym1WE2yN>;?H|AAdr>)~lFAx@Ry1q^& zdt1-RDeT`=M9OPmx(~NnrZ|;)A69<0fWYdpmHH67bD4XmL&3aj zQ>F0M5c#9WLJ>00*GLu(o%B8s>Up`h^$x14KsQ#`@ij9H7U^^YCUY6am!555U6U^G zjGL`2A~cK!s;2$O9@e(70QF{`&!>#sW-~UBJD2`R@7@9s!n0!`NccB?`dD*}#3@1X z=^-i2(?xejG}P1(E4LnZa}8GXgdihN>`OH7MM3UDDms zph(2T!$SskLVWTxMRSE6ma#$VP~@Jx%rSIvIgl`BBX}RsH1PbHt~56tuccDm6{()8 zasUa(=l{-&wQok(ZjiWDh~>Va1kq`txd{M)TeX>~Bdgy3ts=4@XS+@)w7qHs6L=LK zETzh~4-rteCgXVsqx?E?%_7<0-3J72qdX1!U*jl^k6_ou55LCXPQ}{Ccv)*~}alA%RdRYJir-_#sgD=ZS*x+dh#`y*xb>hsvrlD_p3!}<2pDy$8RPI zgtsAFMMHr-xBr6k86*r{5?~fip7hao_Y~R@8@K;)BsH2vU$~id=eb!=Q#DoF$mN}x zx;C<=ih5``A_2iY#I6(NjrR0xaxVIz-;|a!-sMWA>II>pqkmc#v3d!lXw;4sdItvq zPjh6~uNz#^|I|)W@A!X>jr9lh2|y~+SE>noWiJXsjSefBx^-`7<8f73ZROdfJ0=Cx zhP;|Z$@V%(6&<}^>BO<5w6Hl}On&drGTfS?{iLm#+23#rn4if_y@oXX`oRJmg_o{# zo(jH@zEVG2U*hqIjEk%jF@?oC48yubO3Q_7*oyl`#&=|5mNnQ;V0x(Sq=u0zZ35S4 z;eGR+RdTS#*qO$@nL9DGg^lm_$rB+YT7~GXs$&Z|%f?e+Q*x(Xy8ZC|Es3ehL+%)= zDE^uho5}G*L(O8`RSX{gB)6{_df&u7yUpmUtmgwZJ)TmE<$#G zt&Z-QhBP-foATXeReIa$_t`V&7w)Xfa?hx0+CorJONx%p?e$z2D)z8 zcy@MeO#f`*y&6}McYMgt8|i(;wzK=Wva-f@9s%U`JQFJJLPmZcGyKcBaCvdeG5Y)W zqsEpb=Ej<(HktIeDlc#xD84k+NCKUEgtAJybsFl z5qWEd?mK-=IGy#Z!9@qFLl~f@4FX1=x!aoRJR&PXkn@)(LY|J9_`bf==i@L6aHS|e zzfWM0U*)VTq`Me&+XIy({fW|&lGkQtk9T%p;UhIPCKbyRK(L!N#_4(*oB+vWFLWxQ*Xm^q!VMc#sRvpmA1H2gI_ z_Gnnv;hb<^!_|T9iQMHq2~ICLK>WW565W3E8UEyv3>eUSfkh}S%)9BUKbR5AKI?bV z=(B3eaJ_0K_&8RB(Q7e1ZITi)jk#L3VyQn7@zc9Z7%|mvtNy9pj%IvPUwBS?2l@fj z%V^_R{#!5WRE7y&oJDs^ZpvQ3p#nmV*KgHZqZvA}>r@9ZmY59ne~C3H&x7#kql$4m z2zM#`L8(TJ?tiOrF-P%r&yPcYV!jFW>d|hh>uUS&JH0Wcbu?JuHL6L({LF_+c4;aN zVI&8ZdJaHsO~!GN`mX{X=3a?#taW3f0+QUl*`NZ`70Bh>zX9_#dlpUhek3jqzZNd$ zcvs+g88bj$JqLp5A59Ftgaz7;1m+|uoV_Lz)c5l544}~T?kzwXyj(@+$(&cVg2)3mjJh8ao(*iM&E$?|>$jS3A7!MF1D7&fx=Rl-gXo`-Ij*gxl$XmK!y2=PS&Z&K5E6Rg`WQ0MeWr{E4zY)|S zUvr7eruhyd@K_G_srvxN?`iC_>iICiy6Kc}BHrH@{@EX^Tu*gm;bhJzv(aKSgACpg z57Xwp0cArz4W%Ji>qdKj8}+2vl}a>0-8-ojTUe}Nx{Xw0R*v*ey{dKz5(+oX@+83c8ms4>wBo~eVsPsd~q>k@exR3_M( z7y0(-ns!X!CRXdW6mbCfnVTCZdj3iH9?)*OvjCt{UOWuHzSpX9K)iF?>b^6*d1~*| z*mxjt0N$s~Y}iiv@Uk$A>L-1qBX1A8xV%)+cN!$mWqrSSQ>4Ak8-9$d0Fo!zqB&O# zi<1Zfdxuv==^1}V3d>}C!kGW?)joUQfCqPVDEQGmfcMTXM%W+Jb7_u9AugQP^rZbT zyC9(}RTm^g@al~0xPcjCDx~8k=>EL`q*QWe%-jUWbp8A2a>M?)QiCJB%&+hZiQ_}h zgp3AYkoTdi{csj``hLnHALjLxF|X3`t*;q&^@yXRqk=NT*!<7TV+X8p>!R1e(x=;{9-%q$tP}MmvXMd&|WX+7FU+cCRksL z3h)y&;mCxeapc zX4DmmmSz$xbjR*(RoSn>sgZ^QG8i=KovJG6kmts6LmKn*qYv3SuVw#R4VG1BQ0Sp9 z21!pN3!CB*MaA~a@hu2r1J6#BXuCqQJ%Rw@xE^P};z@xm^&C_oX=F5E&4WPlIyIl1 z^Y{ot8A42OmnoS}@hz=#=dlQw>|eQi5bTD`U@8dBzA33g@`p;Y4WOE7 zy0{=TaT7XcPlpQ#2)KE8=)Op~!3(4)ze19~-Q4~p{PJ>JbxyMb_72)w6&vLQF|xKM z^ziTq!wigvN)`Rd0?%Unka6QQ;zIH^Bno|b_r%bLns?C9$h=H1kK?Jb-bC}Z9SKNX z$`meknrk~dzk6!zUEh%J!1Gi|aCYn8(=j)T?w{tf(n~c5oeUgP^%n{&u_P+7iJQ8C zSz?d?FM$Z=aWN10Da0J9(VlgDS50z%`2J$(`r-J)j+PW@=WE?Q7$gD1AD8UM9%KfH zN1_Wtkz_+qaSSvb!hX>1Ctp016nv9ux>X90c}0l~U6-Wi&TPYaydRO2D8~B@#mN;S z$;`DIsi!LjS|fg%0*{hJ&rVD&wJ^RMVo_YNHsh3DsvyP_4kEsFKe-=?L}@emln5eS zn#vHc^6}(*{ENVMuY&sjBQxE&O&5R#08rg%mD9)OmdR$C+6Lt@gruZ0IT}xs?0#G- z*mQFY>-C0AzK%_~$!M?1e9A!Xo6YskKg*d*VjUjFEKlP5@2+7J6Fh{2XI{DAMMGz_|!ZidLy< zZ2V|{ZSmw(o143;OCkKFVDJnm#Gs)*YZ>NKq-4L5 zq(P`V-!Cs$B4W_F-{8hs#B;)NPA)Fpg%Q45%>jmIj%}g#OQ(eqAtM$q07652!t-L` zOYrxu44?Nz2J@{cwjDUM8BSX@FIpJA^ws<#DRKl zXlSUt<;G>*b2Fje3oGR!}q+7c#Te0#CC7u8mo17 z8=cc*y{I$A{wLG9sGfCpNKDSS{4O&wc%D5As@TSkdXe?Tp$im)?{U<%A&|*-`2GV* zrHT7_fpzVnNs$oyMMld^%gZE3q4f&(OUBW;P3j=L@|zK2d8L$#_sxu@Q|&qGQQPb4qr`JPv2uAIzF{Fo-Wbx?Lpxw9tG zGmNMR1_Imt)JCwSN+`MI|vDMVRK4I2`S ze(u|NtwoncAZRQWQdIngFQM)-v<3>~A+1lI(Y$@HW10K=t{%@a-(s8=Zq)TpR&{=d zLc2$HkRNF^P~}AUJ$BtA)pz6khVmaEK606c2fy!kx_#Hacy(tZgF&FcheFfvr1SbI z-)+rsH)27SLnZI2SoV}hDcHT|th-gjKFNOW`8I>F6^j(ETrd#cS$Q4eCVxaqQ&ish zM^p4UCN3{cN3sb=&$a3PhB?PN$Q1qweX80F;KDRS(&Lk#gcXg97De@ae;IK%WHh$n zHP9Px7R(WQm3<=W_(F;cd0$`Rj~n6S#j22u4KZU4jEjBpZZwfEJK~h66V$4Uj9t1@ zyhg)AL)%MY2!5-%dh^TYu`fD0IzF2GFCa(1php0C6Otxu%o&84Q6^gw{a{p4Ri!NO zj_oWTbu=6amrCp^bNX~+W6Bd&63AmQV&OuGN`l@OI1ccUF&lvdO!67-pjOX8%y#j2 zJKbvqfGKgR)6_2WQ`|F6%BuA?M)sT`YPCVc~GEbIjU zAmw$Rrg&-X9QBJ8ZobxMqKZ^zxi`Jo#@3cH?XnuAQM8AjyXR>YeJUy|!{ucJOtAhE z{s7Vm1S#LA%&1MRuy(@FSMI8DR}t^EP{s)xTPEpS7r55o!`Em>5=ydt1K=XwG0svCS?C# zz?*DyBc1uj>E3S}4Z2LI z9N6O>&JxYAn9bR36bkx8o&s-F{NfrQZA3@7%yDv6)@^D>xVexl{EXtdhdDzzdjwTW!C^z zZD#c*LwzZL4md!uHEtEl&dnB3<;3&-J9GTivw%}Pn9>auHkHE?=@3*$(_$+oyvzk&my&F`-f;P`4jaR15~8LYntO)ta{_Hz)ct`$1_2 z`OC#DS>x>;x3OBmgieFZX&6irK&wfPJjoQbSYNALO%MY<|6>dP>xV!fr|CU$bF4U% zTddF3!KAaEcQUl#Z`jj)c57m@OM}u#wG(JIzDzDMxdz!QHm$9EW1#<6Y*gq^zW+C> z>i>6O)D1@IA3_?`ep9P|-2hv1OrHJUzgT!<2Bv_ZE-CFGl@IIL#il%`nR%1ClRQaq zjdV6oV=!ah>wzJ+$YbAgN!3bG`IQF;qrb2DA51KxOR51o7tYFpk?p8n*#6PP3@uT2 zbI0k(8Aqg(_3q6PUoSN89*f$g`pjPBcd0ucSeclh0MZFL59Ku$4-5=sx)D7G!=oj8 zyoIq-0WvEu@U&@gHgLA8O5p^0)RLKFjW35%%>09k#OZWgLf!lNZ8rED3$d{xsp@( zO2djdlKW2%&N|0kQU*_(n?IAe7F7{Eb%#rrz=F{wW9(Xuxj9^DKemag-_&mo8N;l?;ru@T7i3d|;jvl}bNsbQlqT+j_FnkBaDTfe>ue&Gz(Gi7oB8W93{}fi7_)qc}bTAsuyBjANj9>p2Cq zWmkGW3Is3;E1|GjH_}?>dbv;mABOs@JFAwThI;?o+2#wNpBhez;)#m?ZhWCo$a5!l zLjd!4IR0hEQ;XZzMX<9nO%&P0Fn*o9A)?uu?lQL<8Q~edM48qz-!u6^gIIKBl)Q0n zr4GuJ@PS}^BOvXwL+adPhKrcBPhRwS8Qe-!wc|^+bA5Pdxd#d#&(=~BTDGV$?a#B< zT`;fp-dj={ygLuuK!&b6N@y7WUD*$*e(fYwk01&=+yCU2@(+z*@%@OQs1e{=PFH9o z-4yt9-PVMfim}&-W_+cHELp9QFXBE$>3_wTpIwM!X8F`UJa`;7zGNqe3V?@oV^luM zS-g=;)_igkYkA6OHQUn`-<%{I-wW%+Op(HU-^30z-X z;7U9__{BE&!=mi|(FIq_!k!Y+t%`1(XB#Dcbp!*4+RrgwD)25b%=j?M=;Ra`<)P^f{d839Taw>v8K2k-!1U^98f#y4tGk0%sT*B{=2E$TnB| ziWL|AV9wj>P{u5ZON)%Nh)h~uoVzrGWk&(d1p8r!|{EnK&Xa3-ld=y1KggY7?%54h$eSqg?eUWrjW) z*>GoQVc|Y|JORw>Z%}cQG|^68F}}=zKo+VsRv3U)a&sTYq1ZCs5*f#Gh$uyE7;?St zJ*sE72B1u!t_O11*kFDO@rj5a1_?;0xP_gSRg6At(GVpB5NaTiO(4wA℘F3i-IY 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 JRL0TfC zt$L0DeZQ#IYIP3pjs6?|91%hPXE#h+4Bu)SryWnU{(wWCuQjgepjn$?gxG1?)4F5v zzi;$kO<#o_tVte*5?tWNQb6Q8G`Qh#I&hzSF)>*x#pOjT-3gW+{ev-86(({LQFA0k zHa-LCa#5pbHvV^ev1$_066$=HRIJjY2N!A?lqEU!`aUY0e@w_U$NgES0y%Y`rT(l z#!vGPu(JKP|=!Jf`D>klV z4ZbatDi~la$nEn}p~SEQ*Y_V4b8^l7pBOTg(>Z068i)u=3oSsR9f7QC^utx46e5la zVrJYwHuK~KN$pf~MxDTkFC{+l-Mgvoj@1``kB9DgnNtF7rSYzUtuC_GH|&jS@r$Dl zwhFpe3WY_b%R_vnZIv84()0|t_D)f+(zy-KIuwzYox)n)897x^CO!RB9A7c_(YWg$ zE#-H}UQ#<^E0xnVyRD+TyBmHO5~Akq&1z?YuZwuWn;^{hDV8_S?dBJW`pK=>6jqmo zQjNvMU?yr(evde!_itxqj1%~+#>EBgDT$T!P$f}1B9s#;WpH--*qFyaAs(!4mxXk5 zh6ht~qjmI9`X~ZJl)XS*%{?i4e>cZ>F~-pFXRYT^TLe-+A)Ezr--jy!-TLx;Eq6)# zCHv7Gzy6BG!-5t2oZh0e8PoC~jkf*zlyK)qHH&ssHiCkjL=U<-oFGl2YQ-Wv&(Ib` zq$}hcy&z-7EPkTxkhO-#3$_ttsUO*SDQP&33N|PoDHp=sq}k;hY7xEy&=oR7VD1}> z_nh@R3diamU_xAjaasx_Jo|%Bu$X1fgc(eAr0xQcAq+N;gtaDI1(JINE7Qiy{)|j2 z_i|@L9g})CiIKI)%}cA!J7ynCsZ9PPevC`>13KjaCucx{fr;;C&e=vqJ z%NeFhQ*Xpst!DCyZfOIJQg;`Z*_M?Sv3o$C?z-XOHNFUHD1;)PK6Dt({Q z!_!#h*^*n_Xlyn#xUc8&=>(?I4p1sRV(!=v|K?@Zl!SjR{Wf0vIQv!l*8vL-HDkBC z;o;$!o>9rkeg82xU~f;#te-Uf*7 zwVkz>azS6Gp!|*VKvq(IE4xV2ZGSRTb~`jK#OLUEaqxzge%!fx^L)~ubvGw9Rg5m2 zN3`ZaN-S^IbK7xB)b9z?U%&`v6}5a&-S#|lSfmS zh|<$DIqIf|$>ovW)G#t75}56&aJX`ML^39f`MD4zm-|-zFZ-1rI55jE{eM{d>#(Ta zsBIV?Is^epX+c0bq(pEKkP<-fs3tF7^3(5=j;xR?0;@q_0gIj=e|RGjs?0;de_ z6T$$(a~mImdV$WlX`4*@j1}ow4{0`yj#MpmBsm-$)iRnCO3LfA5VOy=K&T*nBZj05 zT&Bpa@=#cESN`7@&Y!#J5HjJKVV>$r-3>c06v+De`mz(;t#kyOlqe+*RhH;SgYOe4B01rTEIfdY2Q?HeFJ*qZ>iTsHdej|&N4&%&!F7j zSo1|*|NbQ17XlmI<;!j2<|T!B55r9AWq<=QhdQFR2TDxy=p1zB5v=G4TklPMGq|&& zgeX6U|HiSrCtV>hf@bF~9VMz{<|^?{&gFiXNjl)l{##TR&RHqf;y(SrKEFBN57x9W^*uchEin3{FH)b8f4G`pu*50l+-J@#YOXw{(Bz!oG<{~O6sRgGw#>NpVe8I z-iMTqyzsL&8t7kE4GpXLrs#XTk}kQ(_j?H3jA7t%APv}~t3>+0kmqqT`~^pimTwrY zGS~}m)MY09w7>Ha8$3Z?Y(_X5z-BG0 z#R&Whd~d%#Gp(NfcHoS4&u9s+-yY(}<8^g)BSBK?0aePU%cP#i=zE0|kc$V;1q`ZS&iO4_-5U<YF6HbjA6B6-CD({as2s5tnr${6do)BgzHolso$+Chc1p07B zIG&0d9#7&`HDtoY`;HP`M-UE{!`|fqyxNYfWeg2K;#7Q=f*=A89{$kJgiB*Ta;)G+ zYdP<1deHoc?}6!eo_J=#ypLC!SuEc0+;e7Tlz72C#lk54rZnBK%|5Z8sGM=t_-Q>k zkhD9L>x{}(xlb- zy#KozkL%I@xE}EUIx)D=AGAOsy&eh@;LDNek^`!3XjwswuzPN5p-{I=9C(1-!wIWr zJq%h3;?iI5sMo#VPC2EAVV^#$YW)bRw?6sEq^bPwDpgXAZoVqWqg5g&A~O!YeQtAi zS;Fp|QGHqqCt%hs(#Ync=I?JN{11%A!AG-ydGvYhC>Z3YNyi)7wzu7%^amNXPJf%R zc<|!&Kok^oepSexU8up)-0_3Yj?S_IlTTtJb-PuaQMm(~Ox8&RmkXaUS2&ucP4^G`Zw%-0QD?V}$@^YV1D4nd{9f!mq7zZ2D8~ zga+0BcJysM;2W`_6RW?3=cj0X2NQMIoSJVb7RSt$)Zsz{$`6l6k76E5a>WE^%|iQ6 zG)c$G7`%#|naTgpO$fp;5IWW7{RsJ1yZ^pL{d;UbWrM{jdsuGXYQ}0|N&isR@rq8% zxc)7nv3H5PX&Hz3?@@a4PaZ`Uh4(42xqw5%36_ujE3mSG!>T>=6>lzdufn2X% z9DK2`dF&#)PNO;MiPBNvESQJ5b)UGP<8z{J%yC9_m}(5-I*4;^}{*1F=xoWCNf7 z-=x%p|34!P|6g84>EE~RA-0`HESax)5hq>BJz0t=^O>Jxcf2p_U zzJC|S>fL)^sW^w)`BQ$PpsR`2HTaJRYvX21=gIB0OTgj6b=+slQj>eKcyzpCPwO5#=ORdIV)pA|HUB zy|mtqId(tQU%rPUJ-Gd_C52|!xQ6^LN2PKg-~R`}lT-K7FM{f@tqfm<8jVzd}AUr>39( zaW3{C4|)6Y_Wtp29H+r|+*b&h6RPa-*UDlzm5)2%a?Hgmd*TdrlELqt&aa(8otWlha^MD9iM)CK$ClT z{KKhCIMdcqBi7g!ttbAD=y1O`75Mq<`e%<>hsKdmA#ex3?#+rN!>{X>L}abJe=)p-|T*>xPyNEXX2W_rYVb;a;ut z^vfVL_thRpqV<#qw7b?ST$qg9Klj1tvjT=#03yRKL(69k+9Ib3bS;G#u9o0j39J(2 z0R!Ol>*tYtZ^ZtI(EZElITzEclY@La$>}a}7=u2p7?Ctbg?Z>0Uo!AqhB`< zo~~z#_|RO{0yz6r)B#(a$CSlu_v`fOq$9-p+?~;&MM&!`SS{1y`>(o8eUpD0>+b=6q|HMbK^7;0`2 zO<_*Qa$;kTe{Zyp#xq*esO*F20tWGEjdxl!*6nNrpFC@aZb%$VS+(k2@dkN>#yg#9 z4YeFZ$bEs1GZ@%A0d>Ia8KkH|s0JP-6}-;AdipcVQ~i8S^bmR#N78ed8n~3)I>UR8 zS=nSn-UEdY)OpF?n+HPpn_Wy-OX5T3N4t?%hd|Q&i=&@g2o=^7Hu5fyGQs=oVkPh> zQT?&Y*`S^VsG(EEkK>LW^-dibJY_B-ymST?QjARk!&@rwBsv`kr@Z?KAyfiLJL$zt zMBR(mqVBr7G(b$H!vLteuIlAt*n=n((&Fb*?#Ts%SQ|*OE|J{_2BL;uzx;f10w}TB3nZT> zea`>!Q~B-9?X76>6fGm8RA_cnljg~q;mr|gzjmM3_~FjoX^v+=;qM0w$nhv@>oEWE4!-|5lu>Nc|2oI^i)xOw``_m$tSNMrHDgBa~nmZmAV#xM@`F3k_Y$? zSHtQLZ{M7TrxNj0w!U{Z7*v_h&-(*|!`19K;G?Z49Ewl2W|cCNF#~%K(XZm}9510A(xqdzlWN)&Vkg8bgs_Z%;u*rf2C^Jh+ zN=82Ss`~TtlR5SfuvA(w3JWM=jECO>bG!Ld$Lk+Es)Y{q9W*}M^zGhqBa+)zTS0@)# zWbzLR&{^_9`jKcIrM7x~bGEsnAcX-K&3Mn*?xvNO#*w|Ks35{K8~s28x^?^StNoek zh(rwHMxOU~Y}7(s;DrUT*GlV2%qtH%$F+iQ99`l`qp1~LQ92Soe@%;1QUks(Es zop9uY1ape_`$s2QiLF8WF~L4L=w$6fibfq8lH<>tYe|b+KCnE4X_3zWX?2bsRl_g( zTAubt=^^%NDlmA6xk$xoOq@Kxa2q`odk^RxnOiyXQHx~gaqSt6P)TtzMvvfaT&4j6MvXNQn-}bIRf3+gFU?)d>UB4XXCmmCL=4MJGHCR#z)lSu z+{v4P(jiJao|Sn%iRElUPh^{kzdC=5TKnYMjir7R+;PhkxFR8oo`ciJ3CzhhQ0|~B zC(h=sh>v0-B8ZUM8}Z2jAZVJ{eoN?rGdqTcJa+Ia=WFjjK2lg!srf*1IPn!03N?w= zy0W_Ze71B1>d;g}4>2)ue+9yFr;unVkCQ;`S`+Yr4~LOPEBMPkX}FcnD{_`unB5F5 zNKQe5%*q(|iszmDA}ImynxDe%1g1k6F4q{x&!}!s2o@JPKdvc|{+BQfvB7G)n@h9` z`}FDBp%Ec{LJ1uUOU&4T&{M-oSnmt|>_0>GqQ5P`Rt^3P3qShK`r0~OV4#2V3qM$Y z#_eO%3S`_Pm|vLJ?h^yHQeJpOgFs_IOPKELzx7k}W~#z`QJW9_3YkP=sb z6Q2|vMJA&gkn)oNkt@vlx6PvY&{ftqgJv94CAMHi1X6anm}3VH=PE>8nVM%!PraWkBgSG~Z4-U0b)*j?TBw(-gZe+N$1vw<0y zUvgEYL()O#U0c8to9*Frw#|O$L11)J_8C6p7o()zPgE0@s_yzm(Xj5o1aC4C!lY-V#!rv7*7PVlk=Tz~zM9!_ zm~UGfSE@q1d0!!8V6+K=hOgz>i+tzh4bzTpLCk>_iUu3QJQ^6G*7<{j^v+yJXI?2% zKYsWMuwsOgs*ZQfTOU#kFDOQy^V;)6mhW+Rb`S%a> z`^5*L<>lpb?(HfGVlDsLHeOft47NwEb#Xa9KkvBh?7YTmv5}K=c5!}1D(X<6eHnQ< zI)>7A+8>AUR7AV5i)jHxJ+6V55kc7Z`2OWv;_W>x3E={a34JJ}?Zq~}o*9MzFFBoB zEwol|n!V^}-o0{|HeZ?b#gw`eKPNNGSc8Z|yDsYc3lT@DA%sQ@T-oHGsqk0m2gM3y zb_Y!rODu~dJ!s$5%ZO^IOEL+4n9>S5cSSzrLF_9sIu(ZgDAj78bO|@{DOr2)f<1Ki zJIl(+cNXt<`I^6#9t%p%Hu7d8DlP;JOaUZpUm;(j3t9h4Qx^)F85;}B%04w5Oqy9U zlc8T3cocC1<}M~7vF2)v1m#}H8KUx4xc5WD5hDIHf?49b;Vdb*|s?(s1OReESOSh9LNA27ZtPZ^Yb@ zV$i0pTrDEyvCkA=jmUvymXdo35+W@8jp}(l9{lHXFE(XF1qrITuhfNx$Arjje%3%t zf+sS&1+FS2hMSi;LymgFLtd2Mxxkau*{t4KHuxsz`?JCJH@_2N#Q98Lo_qguep&i> zR-Wu#%gIx-e@Hr;q0r@H`4-c*_uR`s;1gB!6Ja2B`2!*&&(bNTlQuXFkyH|cnzuep zx>-8OXc7Wb80qgW3v_{N_wOodHB!^WkB_2)Rj9Ipe}gGQ@?v|+k*30at<)WnPu2-B zX-5Scbg_LaEk5toU;ywtK29n6MS~2|3W*$5oI*t=kFG=&5J{aMn`9VQ{MC_{lc<`X za&VItpxDhDn8@Tx>;;MyevI%({E#KKQocEVb4Ef+`UBh_c|lM8a`fwW)7v9m?n%`V z2#APQi)_|9rf|j~b56?;U)J^mWHb~6m#wJPu9c9q&uM>9wU7gJ-+!XxIvb?r*Bma) zFYIg*A$5=xR&wAGVS)RFOGqGfb~-oLkPLm6-+PBT;vNzn2yPtickljkkr2$lO+FG% z>>z57vF+J%b(T#cKjQ3;J*|@$pl@?_VGr3=c)5Yw@ z*eY2Lo4^K+0~w#`AV6xp`;FXM5F9G1qB5XXHRgMbo%=G2uA9Y&wB&zr!hE#pHl^h20i_*X9)oC+Hkt);}fO$y84Fb z*!R7!84$gVJtJGM8HSQ1KP?d{gz=bX5m~sueo7(ml2o+f#pWouQHHzt^rj^XS?EdU zi*8blYSFg0yi(Rr4uF97LSqfpqd|6SG;kJ{KllE85bJbTVeI+*W1oRudX!C%pfa@Z z?>lXt*x(fubR{FP-vwV4Qnx?tnFn_7=9F#}9y~^L`g@WeG#5|Cg!Vr?@2Rb(IJ4|b zrEHI@u4>o27)zL(F?UL8XgXdV;B-H4e{gp0BpsQ5q4ag({p1$mVM{ynBsEOOOVHU) zrkP3PVCRa6?!11j7e})*nySH+^9p%vL{t(-_w4O_cz)u$8|64_`5QNt#wYKGfLQZbJahSwp| z7rif^6cp?~ZAcOrCg^$qOch+cuRLed9~uJCe+W-R_u zN7q^rjyBSPhwbC^Gc>D+r>P{|iT5j19AX8|(N%3s?+p#Zy=QHRci~hP!mYx4cN>~gqMtYyq9*cefR{|kCpao3Bk5Y~r> zhv92e>y^;sk4x*n@K<*Dkn0i-nZ<6~k|W_Ct<@jcR|b3GbSRf{c|(t2-D%;*Z&Kj1N86}adTE-= zA(HXjF#=?{jSL>LS&IWHp@i1vOn73VZ+*@CU^^^$g`n=d=7j*UAbW?aM_YuWtl@5F9jcX@JcOeNTX-y>puv9Go1tB zPh$#uwwU}xBj3;?v`!VL&vIQlJc68JEz!*cWJT1VH1iMdoWRZDz+1}nAy<=Kxy5G- zA-w%$+t|6L{>w;tP*8pSXOC_h5uk-sp&G-)eb*CLL2ilWe<_>l&(FQFNsB3Bw!Qy> z-n@*ng;xcu#QPh51_V6c&hX;t-V2$~;jf}Uwy8=+7&g@$MAYNSI9IY@Xt3O+-w7ZH zd|CY=4&yl&0f}AF+u)NLV?U`s*dJx2DT`xP4bu-6CWE6Fdjxha8`HJ)TBPO#+wDD# zE50!8ptsq3{w>Z&rLJgW>IE5!nnwPPJ$nJ0GviTOQF6EXcu?mAz$3Gfgo0(;Hw;{%cfY8z+L8blKOG<4=UZR$c@n{ymB$A zd*$e3ly*lB_cC>pdo`Qg;|N_IO{drXOaT=G3aj@{OQ%{A_PCOs1sa`2Du^e|tCtqj#Z{nc!UsDN2Ptf1NEQ+{1?G1=x>bzn za@YJ42{s2sq4(2^>4Ev;VQb=$IL?z`Ji|H4kN7)p(EM$#mRGUAhLO&Nwdg&+wRvjl zo`fHM@m=UJPvQr35AIf5mWKU`WV$o0{Gwiu+GZr zq8+a)@4?8-vh+bp#=CNY7gM;4ZBM3v+l8QoIga=14ufX&y7O0%=a&9u?UUy^o_H@m zzaL_JBu>D0tGkuA%62O|M=}t7vF`9kb6o49*SmgxJ1F!QJnlPO9vXs1u7!XAA%vlt zCr2`d7+tQwm)$HC_bDDT5YhCX+IGfr42a`FF2dN{d|%;WWM=03+1Ajb=j-k5?fLhQ zpeuB5t0vO5QImVP=Nq#($70|0$(jKyi?9;t`bN`Zlwag3GR@c6WO}Xg0>L~mVTuyG zz|kb~qY-WnrAB~J1@1Q+@xk4gA3%r?K*OUQ<34+4`_Y4nimH>zHtUb{=+`zZIX#9B z;kA6cupk)Bb!5NB`p@TiS<}Q?6CzmWUOD-wj?Q_=5iM!E>_@la# z7f4>-=o~X@`yVY+=%6*mOPHf2Ln55Oh_JA*^x^0v7VEocoCJvGG9|(*%#tqRha++2 zwKjH4D6R%{n>_FcesF|nuE+7e<9;b7e}8E072k?8}F07#^{pPZ^Q9W{eT z4aKQcg7XU>+J};LHzJNp$f){+cZb% zT`5F_%XA@GpZ60c)M?j};R0#9G4314v1~$UJBev=9hAbddl4!sQ6>LOw}6oEmS!RR z1{JcC|D(1dY(#LTsVRQ)V=D8qxs4+VIgEExBlY<5vg_Zk*FXx8Em2@=D7CxBX00x? zIW8*72NuUFBV{9OCVTkD|Id%kOKSiVD+8)r0}VzbyAhAV$-@WrqAZ ziAzYBw!+87%^RY@MF6!0ARVZ)tC;?5ATIYyPDWlH=2~||_vuD|)Yl>zLe)h-S5FuJ zW0d-8*t!GKMEukJqLT^8w(1UY&%o2NWcw0VRal36RHBXa?iC$9*K=eQaipEns59X+ zXRE6_;FwjXn6`07RT*flm^?f-InN$<8L zYT`ONz2_L^M#-)~arHy}dQSO{zt7*g%F}8sJ)q#UAESH!ztYHJm*^9t4Jh|Zl{oZjD*nSnw`GEuhWWM*p54OL1f zv3Wp>aC~a2ed_BgyO)7r;D40H88(EJjBMmuJCnw6y76i;#H#t82>2ceC8gLJ!Iv+Q zm6Vift`^eHDAP{8yKo(E~qa0nM z=fu-M9H{y_=K&;F*}C%;FV+B5+q%DB!RcQ28k`jvgg3r=knMq!qZsK_8Z{wkFfV6C z;~9elD(g?~^Bf1>wVDxu9VAu{H)j*SI>l8+&OKwR(wtBAD9U!uQ20csHb~8{F3wzG z#BTqb;cp(eM#aFu7$#pF8slDZO+@#t!Xu`jz@DycqS-?5=D)#befI2`n2=j}k+_7! zmoOhi(ivrnnS2=-wiV?W+lN28|4RP)+w?q6eVdrQNL+lRTZUx z?I>EpiNi?su^ZUUcY5;l)jq;>!bz};b%&ANHyt(*GD+1ln7qFzA@G&_B&@2aUh9in zNJPm*2r{H9Px7Q&l@(3;w*IS&bsqR6yDnc4Ak?9lf2@z>=mcr`;X{3R_ZA&gnY_BP(;eacx061qL;nM6hP> zk30YjP4C9hbe)Ne^}8!5{G<^$YB&pD*Z|=9bN&Qa{m6x-8XHkwJtk_!KQ3-=S87X+ zch!S~vY=|%-r0$wTBzJW1sV_&6BCEW$HzZ_2||cSoJ(1odZMC8hfTMZp;S=H2*FeI z!^SI3!P6dE5^yni{*bM^nA>9{zH32ic5>1N>>MrA#$uO9A}YCjz5@zn%8zY0R=#s13J|yBhP??1&jC?lnqPMrpB(?p37LA&;XzqBzp0wiEoqsB5@TMDbV@YhvwIY29Bsi%Mi^``Xn_epocum+$S4k~NIX;v67BSTDe>1%6h_!X&e4ZmGn zTm+=1rv4on9`;U4OQXDq_1|x1hXFoqaM0l40}PS#-Kry|*Z3vsZ-xnD*G5X4xA-@A zoqZbq0%}^AxqUR^p^D7_;#ipNz2fypdNj)ui1T9&9X2J6y?XO`*8YDG!z0(+%y8hRxJBBmKMkxuH@ zOwzg;&)XZzkC3z}j#xoK5V$82kn08+y~AV=D$RMjOCq-&XnWw(?wPYUBv3Z_f;!p> zXQQF5Z+UBZxyH@-=K@#mCn4_k_T0Rn94x6uO7>7DCOiOZeu!KLn=GI_zF|K9%V z+?U+MFB-&chC4Z4r)Lk?)S`LERRLM3qi|gNw5J&L0nW1nh6L{tKWt3*-k`Y-LJQA^ zPOUnlZW!o^p8H`#EEgLv+#-4%rAf7_U=ut%=ua_4>cyrO20kSbDw%jNcJ|xVJ|d&) zYQDtZzgLPBS~aqLK^(bI#F2Py%xzpA3Z1g#Z3jwzg@uKmMkFdshZC>~N|Ya@ zBHp@3VMH@LiKcyJGk-b#zlj^w4u>=+*3dz^=X_PlAPOHA;fk7e>Z6JZ}!~cmMP$ zY@eRT3mu@Pzj=9WYF3RCRvso~1(_EZCvFbvdYSI@^iXIsoeAVSmvN`z7ufG>HH$#0z5jl0wUU_zG%8!R0;r*7dq2-NO^%F%jn60uI`5&gI z-y3*VC;qmo4?RWd03NK0UxW$*DvP~csk8@a5w!w_cYL`-&-cPRR)a~hHi1Gnr>&ix z%>hhl<|R7!V|nG>js4puut9>7^fm7qnfvL^C8gSz*wy5;soK?5-I3s!GNU2NU6_!` z!rR+-rkiA~j+?!pYHjn`dG4a(-0zVqG1Ys1apQoFDgRcVob9W9M*IAa#J#EE(QiR_ z8 z|2gxS;(PsXGJvc)`}idA$jL)@cTLk_16;@oz-#pcqsz>=;Y?sELK4cZDBp3>AS%Vd ztHDamD={g4{YuNv|IMb6)#QyjD4G-(DC^Cb@(@{Yym+(%-B0|G);mls{k9D3HePU& zmU=QP0izP+*M1Y2wMm8?{?RZ^V*4DznnMSXCH`A#5>L7k;(tKjnfN!sNsk9ZHQvv@hM6<6 z=Zs-0YHBX#S1BY~l;{U`gE-D0mY0$p?HFvr+S8J(s-MogR!H8yKrQ^kyZz)sI2im0YAL-m)TsJL+ zU5d1OCIiT`Y95L1yV)o#(G>jB)rf&&qI)GT z$>SwP4^D(i_aOK6&EaLC?Qf6OcbcXh!{ZF%A3w;`V#cMc>q1l7f&isr3g;r73~A{F z*6}+Kzg~iY@~oBil^B{n5Du}+nN}8#=y{lsKe=PL zw?lPU`;PmZG91*T4PrG%)bOu+j;#se;{=$ng0!xjg2vIaK4|!;CL!3*nC?X+Eve*{ z$r3}J*S~xnLG;&$v2T}MjaBecDj4Z8(G>#IpZTM4GhNZoMU?CdQ;?*a6@ctH<#txd z3E%9Nr{MB9VHmzNA#@zSwgTjxA6{o~zfL%gG?-U4&&Rz}YC(as`c7TL-kaT2RxX%} zYd8=pQl=aqpYQe;p~~!xP#E)Hp^y%G_)KOLkEotku98knOsqoS9n(95%O=Lgk(Hjx zN=oT3yd)T>qddWp&_~PZK+iA;@}doC1n7+pirpkgcYs54#=pcg+!70 z)Fq%ByYrBwKgoQ-Jcd>$%PpKTHW@L;83kB-z;?uwJVrljqO}N+ZN$cY7;g%V^q3o? z1U4m*{M6jQ!?J|V)_Fx3;H&$^IHajm+>QAq|j!01c2 zrJ_+@a4GOi49wC9j^jpEKyjMS_R=fjvivmCmd}+rqRr8w&7lp9AxS9J?+Q9CDHI64 zzcOo&Ri*?XDgkSQ^ud|YdCy9X(I)bAqQ$35!}-^Ch~g1hY61MN>(-^PUS+LREeQ>% zWw%(0T_ZxV@NH_V_t`smBO=1!1?mJG4(d^F;gC8WH{;*J3cjqONA_1qM2|~PmPF?3 z=eGh{tTvTjlai5A7fRY8XRQ{2lP@ zcc{JyA2KiOLb6ZID3I3*8TqvS$i+pSj2Qp=+zb*{UOFbd3pyhL=zBJA5pB)I&Zr9t zbL4-LP!J4y@0@whfHoC=_?lD_{NyEN${M4ZW8-SsD#GHAV~!PZKRI1KJGCnF)@Jy< zRZMK`%A8emrwR0T@o*K2vV=Uh_<9e-q*U#k_QLLqk$tQw%7JW&rr)eOHqW z<5q)a7yez?iC%L;)(@1nJwk7~S$(_xr2mm4I96O-9Mn`ozT|#FaY0gnhw$hVq&yjm z3Rs@mY5dgs@t5Dg$g503ab7ZJUCnE!zN{>mxtBd)#S|M{Jbr-zK22tL)oTw|P;MHq zql$bkmqn*w5}eLp0jZD|bBXV{zg2s(F2c2GAIFc4Ej_|;a4=b@^-)PHe}cxm^}V7yC)y)u z`n%BnM&i@Mu!dl!BhFSJHbwXk_DyPVL7tL#ymayEZM%`aUvsq2b~Dr+HC}orJisCM zJdfkJ$za(HGTC~Kq%?lvlLCc{+LP|WUI>JZJ;0Y_Z>lGZZgPHmg&A-)_TbTeR#RgR z?@i9TZbp}qKcgeAN~k9Ty(Q#C532a4GW0fkC`v%Uc|mMc5f{@#~Z(sGEx zT|R0!t=6=E$VM3YCq<3h6@kK3%m-T3wo=P#mK=xusz~)n%$kF^ZqAZH#65IL2Q{m_ zdDo07RQ2N}8fOR?XN+~&4EMZi&Y>wi8RN>z%39tlZWfo6M9=fmIy~OdY7azsM*zKo zeqZ?K@vQ!r+tmV?c)gWM%f?m|GV(=PIgrZp8UY0R&frAn)bQlh#YJ|JT!Ibv_p__3 zZXD9b@ss(Qd2UW8s#uoKliE`S5bVdsl1WT zbLgr_%hC6<%325_C?UZ?^#mX#cA^dN>Fuv(_XKBRSiMgnHn2N>HsToR(I)CWx<2vdZR8vU`Q zvVL-mPz_1d&_ZZT<#_sQ(F*5XeG{U7vW+2A@-HLSTZfwiyb9SH)jvxD8)h|km+0!A zZvKg$Yp?k_>`XaGI83js!&%2BH1U-sPvMwmZ?9YhhGEsRnq+si+n|-c4oMbp|WR>~O!5b1Daq{ELFZ^2SC0 z=ywuR@iad^Jr$9b#sn_xwv4&+Z_Or2GCRFF7&FvbAK~zO`tdQ5Ov2p4?psyR>|El! z9myv?^pQb4&BT4CY>?tTQ> zF{=F=hREKhRb&V?knXpxDda0TSxdTqed2i~howuqGQa<5xqOD-my!m3=*p2J!04j- zj&#azoaob;Iz#oX`mvT$651%~B4h5x$uHvNaWSObXVTfu>Ib<;Keh$sf_$#mMqbxuE z>NiF-@8IyzE9WPgK9L>|(FTuu+iTM$#Gh2pQr%E6ZC>2GFom(ePYqg@d*RbH`~-jz z7)MA={BfH z=y310K!i_SY7N5ggYh<5k_vHNLA&OX)2OOnM-}sNzhGp)#nAnTCv&R}gI5qdFkNW(cU>6Cr<&M~;ISb0+Fa(1AhV zrsm-bm6CqB#;%uT^1Ne~2;1VsL=R9JQl^3^>k2m4ZWpY={*brsBO(u=J?T0Irew>^ znZodAxo`SJ5HdWB#{>@jk^5!I_yuk{)hS?_1snfq7YAH-GcU3367rF*IvIXaU^e(C{B3pa7C0PDpC< zCM+yOR9idETmyVF?i(2e8w6n(D~_C;SWd)RNc@)V*yYeBh`-@nfn2~=nm7|ETZ$K8t|4Ib0TgBb4Cq(Zq! zQf&w>)Z*EL(7u&AXxkcph%js3Itx!lh5SO8S+J$6e2%5|7!5_MNIr>UvZ`4;g!xhY zN881rr>X8ZiHeGX_;dECJ5$!8pgghy9=VJ7x_TqMHXN1cP`TLHSjJgQQh;!%$QZEd zs0t?9v@%;$JZ{DA0kJ%N(O9f98ygN72C>TH*F!&DVzYNc6;qSlkKKyuH>6GFKy;3S zKH&(_wzQI1Y*%@FkE3*Y;RwDf_(*0Bguem^yp7$Zs+DxP0CJ%Bj#PG(x_F_|Ec@QW z*Wx3?NF-(PXt!mE1)DilarMkY{o7?X?Nm~tQ_8{B!&$~V*y`@?53{MF6*1+Phm>pI zsX~5GYsmiYCu|FAwMOm|&z#puFVb@ECQRO@22MPPBg1y!g_% zqO#(uMqO%Fb=GDKY*?pqRp5QwyTCdvi4q#a4P=k<^-o!6}qv;K{G%RkHS9p{P|n-X@0?m6)^DcrWCjFwRY4 z4=M7wrZ)$R6zIgu0(($vYimYpe53HSPbv7N@9CkD@2b%_yUagP(_L6iC`&P;rsdC6 zw{I?9a4avGh7 z$Ll>ku3p@|+|04YT4+7>GV{dj2I1L%A`hRR8n$qfgw7>4W4mmG*9TJ=|3mBcD(>OD za)P?#1_(7Bwptx+Ay`*)=~z~#rZ{h}svpi_NF3J8<2NN+`+I@oB51L}4b}WjbFxYa zG_tz!jdaAH@MrTgI(DFRwMa zqTLhQhwE{nJGhP2ajLWBx>`zpbJXiC`-{W0i0g&-RB!GYCG71slZq@|iXOTcQpj%L zYm3VfatrNWg)|4@4_zOT>W-VfDTeBOkp*2?9~w8>^kzP~I)p}~z_8)BWm_%~{^Xw? zXS(t>&F9U~pWj1ph|VC#YyZkAA`IAfbSpaK5|JTgYwqXcR@e7>O`8a5+wrasx3s@l z?=f528jU;$DUws@C~t8XXYL;V&t1=1oVlFwK6FLb^ps_em0!CJ-8C#7A;fw4v?h8n zdT`nsCqPF%*rus^hTsQ55C~{p03Co&F40bJ2nA1>o&SMngXhSt=hheEY6cMQ?v^~! zpA{=?t;lkn8+W@hBtQAD3$V@)G(k?~V}AjkVD%}v;F}dMt!v!9tCM~{WU7dQCAd2F zgq8>V)XT^H*YoMxyvwR<2N%Evey4!aaPo4&naGNu$$9$iVag;ULciD5@F4sux@i^q zaINP~UVR&PtCiRssa0psc=+btTep;7jS3Q{<$B$9l;SnW3grue-w4_9drNd~DEJ5L z9S;Vc%i4v^Y*^7QI`-VITz!4$$!}0h9x9f#%dIJp_;xJ`ArE)=ij4RuxxVPJb;MU4 z{$SoC?7(aKZXN0Vo|9YbNmDsK16Ks%;UPcl;Jy3Xqe$n1tHa-&I24?SBO~&XGAY5E zaYX*eC@Uf>bOl`RMvm;tbT0}w(=e7Hu z#I=2&Y>xX=L0el+_})fDCI_5GQ2mYjo!4B+3y;^92?I4-=b;GQ9j8{He-@zEpoH>8 z{-v4lXNAvgbdt1>3kvYBsHy==u0IotDb&tJV&&SxdYmEXq zca|mI$60TdEZpe17q-7G*U}A*a*hr4+4oxc#{o$zgFl?EuRxlb0_rVRb->-+bs$%a zRWsg7T<4SynIC?&Ef{9hV`|ZR&7EL@6BP(;>3LT9;zs z{*=&3hII3a4FdVxHq{$mpW`6ia=IkMeFop?iN6Vwp0a%#Xtl2PyErXvoFZgP?hXtU zbaEz`mp=8PUW}o~45rZ# zje zD)I@x80nk1WK?S(ti-W)|25}4Y($0NXW@Im33Ps2KKP|&duDbemzGx=o^5($WgC8% zGacd-bb;0WOym(Ngq@qn$;)FnURLGp^fzdo1}2!^ryw6&_6D`}j(lJ9qImW_p3P?I zejp1k0@~TP0kv6|sl#;WSiWq<9*atnJ>1wV~A&R2=kE zipk)K{bFz&HKNL@EldDy)hQ*%)~3_n#?p;&HV2bb-oq!h7{>HJwv!!($Z5m}8au zEC_OX)4RIfl8CrQ@ZTI(J1x1knV+Zd;SG5;kX=8eHE3Od#kjfTyWjNQ+-?mqhw{#$ z??KVV{(e&_ev_9 zhUHCnU)mJ{@2o|bM(IHX;fwV^Vfl!Wlxz)jX&6^E8GAiuYD?zfcv9>c{@`8L$-1gh zqb*WJK&dgedb@GAHa$H}e@DsJ$4qORlI%k71BNP@mu+>}bZ-V_2~rN(jkYa0=)-ej zk*IOew99E`#>&sXn@Y5Z_M_|!Z(t%9uZ7R<)j+zvR6M#wcaG}?4&V7XYV5mlJz*Bjc_ zf_+h0c@|rm)34Dsn;S(wNXzt;R_nd9JYa;5-WmDR7uqy?$yhdc#U-RD9cy+iJ@;I& zN}mXD=SiLg&({Nq7uMGBG2U2#$_BeL7CpN&X!A=X4RST!cLFU$IG<=>Dxb~!(~#~Z(L@< zx}xE#8}o}xjt5W3o1@+A_pw;R8CO^ZG&BwO?i01jZkYo_R6d7w-;Ng{NePi{ji>Iw zBg^hn{wip?tuD3wd`?#o-dIs9nyj`Hp+ z`w%nSYh>Cs5Tg9}Y;u)XT*`>hS5@udc8_>4vV-+?p)di>uvm{!^Khu8QSd7#8SguY zPV@QSS`%nb_~#p9wyFzu!4H1hxs=!fE}Qp@wW&Qh{~+DB)gt|Me zV)Qx4A<1*=RfWmX%D9GpXsvOK)EAh_ON->D9gb%e3Jfru^+F!Oa`2Fr7%QZ2c>F% zYDVx-L(A zH0NeOCKtOIuw~cNDIH`2*g6O<58=+yt;5?WwBVSDW>4rt1^I}iVXDE z_Obq{bEg2c(1s6rA2*CAyKkg#pL(a%-MMxz^sKrc&$Ag>21VAUwHw22TZJDnm?UPLHO-HKq!; zaMxwT@_KVc!Mc-KkTXgew$RjCtBEp`@J+JdW^Fg*>AG{BULbd(RMj&K_TcxfjR;MGtP zmS6tS5!trpKEmE7a!n7s?2RMQsn5@2{Jfu!Wk>fC4$d5DA2_W*>Jl;n=8wZ-Wyi<% zE|qkQbkVxsg>3oX3c+z3(=P3#=D%W65X<{5I6v&kvWy(^r;Ro$-O#3ev3xs#uC-5L z9H20Jy0RF^4BAU3-ytv#P_*%ZHdZys&Z?$@G%>{!jAFTV2$)K*rz6BQU^Hn4fAOnF zcGbT5l{WIrYZMnIB3gN@lw2nycxwJA#8^CLNPQqOpP7%f197B`Y~)n@df9;O#g^8; zZ#}}e*}3OVaCUUcQd@FnJ^Lfo&h~ALMs@{a{Yj=!=h|Aw?Sb2T%5YWjCbggk@uAtM4=ea;aiWstrqx$sp({ zaqB$bde(ZOg-#{F7RI(=)>v<)pcIF5Pzi~%WcyKQ7n=CME~AYX;?;Z$tf+)?;@M<5 z-bU6Ji4Q6=&#Y0h?;RmSyISDqfc}vI)4NeUyMDhG7Nm;C1c8D&lRcB9dKo^Hm(9~cW6azSU$w*fqrXD;aQY`^H(Oh z4b{(1wWXzZ#zf)k`c~n2c}RA{$;N`0cZj0L(63e1PSCPZZ@EkO@Iq+k%uGs*rfZEk zse!lMAc?52FCwzIxU=<4L~5IE*?d)i50A&1)sY>x$k~11@{>0ERvbM`LquFN@w1EN z6hki3g=BQ46a34i)0Kmh%Pv$+*Yx0b4|S1=zKzWYOs9E#J#)4@Gu&tdbBLiyJES~M zD2mM1{o(%n^W7t%d(&Yfbar;_$HP^W9(uxoh_K=N9w;okAQ zyP#QJw}*G2yvK_CyStj_6KZNEJZxDG3P$&M%f0ht)~eO~$^H_>^?3fv-RX*kKq+M5 zCDPO<#o9eTtuqxa#1qTIq20Aah|^$-9cDq(k7OKqVFgAUdBSjPKD+|7B3Gs= zELvjuVEMhvtuaD$_jb|(Lh8KRa|Nh}`yWOZ%O-nX+UTqADbtop0f{&1yj~1_W#9y~ z+xs!y%_CIVGlqn#4pM#__AOUfY)4z@B2neZuGcF%)K_*!hj);-y3{NR2tT=eCTSYM z(}w{zcgI*cIXS!n0&y`h?IjysgkvvDZsLpXj z(c%MR=pUmxm96vwr$ca)V>?RZCCnckE(Q_>PJdy1ZVjign1Rzwq zcKk|D!etxIQ3U63%Px&1{rW1(1{%rQ294t>6dLI~D^vu_lOi0>0Q-b7Ne)A2r?&fD z1z-pU#mfqA*92V!IT(JHuQHC0%x#UHov+Vyu{y%b7gRBcDLqH5Bb@UBe1+WB`?`i^ zZlYOdcCQ2k7>T%@S^v5@%KE?xQi5uRnIhB-zxSFFUfr;tJL@sfu?BZ83x-`e0t}6g zLQ0})Qdy(g6q#E$Gs44D5JQWTmIva8tgJ`F#~kOku8B^@_miq9FGa|Sma*+QbI8Nv z`d}?-NMph810CyL$?g!Y591pjV;CVvp^=T9g0v=)R=thceO|PpCDTsqMBcr{3BM%@ zisNw>h(N@(te_3+*G1Sf2Aw4LCt(*IN-|GxPO2;t8L+O9{jfC6Wwg%pr&rixJ-{@X zqC^pO6jjJ@YEhgi&(RpJ|G~0esZ8m1asY-0!F9Zt(2+CM2#B}TG36x$WnB*H_Jl4rk7FoRKo|Z?i1paIy{s;u z4_9r%uUW>@mRJ`<)>K)D4#-%&tgj3Uds_!O$#ZMSor%bz_Rwei6d0^3Bz9)%;Oe>y z#JudnwsRRp?9_I*e%~Pi@vy%D*1M)$e$BWv_jL_>VV%u-DJVKaC-8Y3+a&98e!&0` zn?PW?qtgt`N6oQlSH$vMAGj@lPjBl3JiY@v2_TMgE-jYYq zxDxsL4N!bZNbQY}jB&tOX+Qrw-=pe2CiC~(#*AuKJ@HwJQ&~=As0WWrYblYv&#o65 zg1`|vcHk$w1)3dvU=SjO_Pp!n43T%FrW(aABCpE^zX<(D%49Sd*ZI{=pv0aB^Avl971)TQCx2utx zL!(1?zK$lK#nLF>Xg>dvIRG6;eb*78xWRT30VTZ&y-0kZsV}h`2vbSxPm7@>v5_m( z{qh~_!^X}|htS=xtLNil@A`W)Feti5Yp!HzJ+Y=jqPz*?{!YE+#w{Fl>j}F3aoR{n z!pe&Ixd|JGcX2V6heEtez4oAxQf#NfPU84`f4nMc1OFUF!rxs& zNd9i3iU!AB-2^bfI9fHmvfs zSL_qF`uIq#RHM$#SDV7d_Qs5M`kV;ZjX!a7*8xsXpL8uRN)l?g zwUj`qyH9ei;Pe2isdoR}Jvkknk+=;yYU=S46~?-i>b*qYSKtD$*c(`hB9R~iF!g6q{f|Tai3yC*U zaqVlZkt7cV;X-O1+v1_7_?l=kB^q@9a!uc>^XH56 z>zkdkeo=f5ZT$Wq~ zpB8_l-hx6N^-{vh&a@zi0>0W~OJl;~zPe;nwDRj?kyCb}Y zxwoccMOOp;14dm6TD|)a0FgH~G z@nf3&XP}Vx=>2ikLBL^5frfp{Pv6$sTHCe9oVf1~1UpXxYB(X>yDHPQ+9^-Ll(S3Mir2JDE zbK|&iNLs1G>!Bd+>-*Ax_?Vb%P4UqgKq{$et^Gz?^BsyN_cdRQ9%Lx(EFXPMFLOdJ z@)QHKmo}|tq{C@T)wZggi!(trL!d9dx`76ffsKW%se>hd2ix2afqhndYP$OruEty* z>s2p*-|GZ>%OkBScO7bSZ(Y@8V3TIztDAvqpSVcw-4@z&L}_>LIro&5U|V9=G19A_ z`8c%1f+SGtEC?3#TuS+v2^bG;xq}?RQ!n(i(Dbwh1kn|_KbO4GP?$~Hns_nB=);(1 z$<}CFmL5Z^VLP}rIJffA^O-T%2poA_6FT5UTk*hWHtqH>yPNzqheXdLk z9jh%G^3k!sIbY98HrEys+;`N&rxl*dWIl>UIKMo~>&9dpV>`)U^+|(2*EnZyNnhB^ zA0E9v_q>5T?n;jK^jxj*h~TN7F8*IEfUXP#7P+q`o+p99*CG<8unUqsLxk-MSF$1K zoY{;WBcEMvg^{0MHxvir*}YQ0B=*(5K&r-Xk(u*aLK^qcH}b^X@1wgC**$-zC*rbn zAL5Top_clMsHMPqkc7FGguot6R%mf$+H&53ZY?dd(BKPzBnl$39{5krjwGfflxGH5 z$=g^LJUyjmXJ-WyANJ*L9*t?Gw1hKdj@yKuE;k-ud}vT*mJouWm0ZR?*Ugs~{N{*7E7%K&bxdM%@_>y@Fd zX%%TclMBVCC=JMLBP11qySY8jT}#Dn^Nqf3fnzE9A|iP3{t-M@_RtmvwW^KEVWO4E zg8tdz)Y>va@aKUV<@NLd)^)`>tWLXGHVE&%KaB}ut`KH@P4wX#A(1rcGO86jb%L%Y z`S3+@2nYT`mM*&+%vlfc*fCVYS+GBxUdTA-KAlEmp)#b`vZm%OrI;NS@IGM0b~;Puga3d1Fi{HmeI>} zlBqzbN{`oLh7E4=)w?k6)!8z;oj9#DBh6?b(pc#-S7`0XkAg1yW2vJ_ELP{fLaN+P z3!g-|oXE*R&2dGhr;KyY+Iv5;%ZOxFA+tx*lSzM_ZcP`#wRZO|_1I&xt$PbicixRw z(YEITimkZzRl75rO=J~E0(lKz8x$48N^1e5dwMy|vJE<~UW)hHNUvXMZFk^LrJ23Y z%9NNqKTd}dzG;H}&BYn+xwKrt@E}xZ% z`M02@=0(@D%*`+fOR~7}rx0fwsrg7hVEw zP8!sPtv-k$g5KMS*Uf^^_%c?X20OoYef^^*uJ^`fNmB}q?y;DeUU+5Y?q_=}l(S1} zFaFGI`D;z0#-YWfqyz>x3&e?}hANlVHLT4MOX`8B;h!ye=dt4SBL1GU6VjZAa!PX0 zJ>ytJ_0uC7ZI~Edh8J(>2XB*yz@uGLKJyHdnLfPp-D&csaHMpW$Sg%gcktQ3<54{P>Wyxio^as*tEDsq6 z7#KEIHc+WOh?mXMUgAEA$}l~8+h^JQW-m;~c45RkoqpQ|m8m_Ja26$h zhQV@Z5`Eg}YNGQaiu2EVpD{J{j$UF~DRadQI3v8rdCF3gzqRvaNzqHvf}RzX^v7MQ z1w$#T9lxe>0*1A3tO@7kEZ_f3dMlHWS7&FI*dbg$sfisufvp>LDc=U&Bl@ZlrM0hv zy}}F)x(8R~o9u6yFo=0}*0%c2G0~0tQZeSgq2y)?e*a6ZX_*I~c;bOVLeEMn^azp0 zAQqKYPZ{UX!nW(*D}qkVIW_SBEMsh&uIP8_ZD4e=V|Lni1)LdT~!YhJ-0tdNX!-D5$*S!1HnLZgLXylRVqq?Vd>j>*YMGz-P7 zEQoeUZ2~T46tU#;B$$xT6kP`L@Y*jlpm#0IS1P8qqbaglsE<`U-$abg71k2FB~Zs< z1C<8uKHxd0*cF14%&MyLE-c_A#7S!5)7|dvV#8PF>hoEztZ&s1rsion$CkpMMT5^D z>rP(f#hyQUI_{2Bye84^7xX0%U<_@@Sc29B*Sgoa=azslg=Bl4wn517j3&N=j^Gn$AQ!+s~ZdT7Z-hoMur)*QpR(uI{eKflz z+^8BR4}-1+QFsrErp6ko2$>;c3`LA*R*}p2gFc^Ds%N|OS4ibxp0vVoQ5e#EI9W!v zL;Z8l%rRxiv|9>|;96gkHzfTJz-pi2M(1YdZ(jCM!;2>RVd~9`f|{0PN5nhc^19H- z{?pUd7yz~pYBRY>tAeS!E(9xZU4v1Fp56ahs}5E6oiG~XuGWA(f_iI{c5^1kLsTk` z0t_p47H0bqf1Xf#AEWOw&&xMW>eg9&(Kc9+j=NON5XEG^sKnkelwwWbEPrm&0TlZ5 z!%?^p=BmPyun@uJH}bE3*BuiR zu{=e?oJYa6R&ve4q+By_?}0nq#k%svkqJ?Od-I7$bdPHXxf{eF!3SP)X3wm=VAo2U znbV`N3srNTL$)Yjl@%%|7$0?x5wM#w1#)u_yFc>PqEXhA{LPd_3=6YQ_ zi}(=4%n>q18?BZYlQnOdr^c)6leHvrkxbFK38TLb_J&%);rU zpEqn?T{s&79rL`r6E4^4zEAFNeID;2u{zG>F7Kp{(9Mz@|edT)Gdf{k>?x2M{F<>mE^)1l&cQD)AEhdQ5P_b#e{F4z57<^>k3 zuBUdGTFg>R8{IeWU&Y$91&#>G73}$d4p|UhhliO@=5SS1ylvSM)S1c(tasGISy(_8 zJAo1lc-$1Ax_v|N@janfc?-U?Sj2lGr>GpPld@* zuu9j3sq;f$_OY7@I=g01Hpwc%G4(`2IY;bw4-%P=#G%=qibcV^ zgw<+LlRfdmoUkixh-$bKN#r@XmbFD+Sd~;oQrbtRL`HA+?{WAp>Y~cfo?jl;qnHV- zB0`Sw`e|(iYS&~H1kK!QeSSBlpk?>(7PJ4o#kTotDGeOr5{8#>)68CXv{QmYk}OML z7Vu&IZ8h}83o3eag3kt>-MC*XCf)}xqM#>l`U#BrF*IBXf0IKR4Xv`nv+MRl>ZjUD ze3Tdi&6sC^XpRnj(jQ@Ek@Bj){qL8{CX2GXmj~-_O@5CqTtRceXwI&AKL`l98nb9o z(#zn(X$nSOJ?;-SkG5Z59KKtoN1(oUKNK9fHpvVjV#!s=?3&e=`|_RQw{g2U=VVn^ ztGA|?YwZ(>pw}slgZr2*kXZ67fkS0&UcdTR^SnhS+bZoif?WY->>iDj^srEhjeQDf zbk%7EIoh?^C~EMes@oxJgDUX$5TYvvt=7SkIR+7qRLtm^LofEW^iSVvw*Vxp|fiWbv z1L)ipn7;}-4PX?S>$H3EkpLt@ahkOxwgmr89S>&sbSFa9bUo*K%`EEvT_z-EF9}Fe zUsN`@bT9F<5RSA>kiEHV=O~_y$A%6#Q~^K_g}<$sgxQt48$M;;@pC7KGe1DKz3OSBFfqWsAM3Doeb7k6wYu1v-F_?k7EW156B)vU^*(X+`mMJB=sdfl{K zU0zDZwMmGhZ{6W|eLnv+BAK)cgPHq)s0g{Vid+9xtsz3iu&5ed_$-^ddjk$(hFoQw zG5gvJ43dapjuS~UD`E8MuC5HA@GPLv{F?bR{_%5eXtb07$C@H@m*Nh=Hm~s&GyC8) zrY6-Lti58ifne~owdqt(5;*oC9b7=!&Z%@=hroAg=Fql9^S`Xady=?+-s#Z9XBi#c zKC&GYU>^{z9L*3kWtTm*RlTm%BK0j11Be(vQ3Nln8>V|p~j;J1Uqc+5s_fQ8mw%E>iV^z={Gm>P4aaETU_KIv@7XMX* zI$$W_)ehTJGE~y_%gVy}7&O&p^U}e=;e8>slQ2c*hX7o1AtICK9WPrgOamvDsEBlH z78+W@rTWNEm7+pEG^jLQsZxsOb_%**gh{=1zFDz;_I6&X zaK2_8NYJwiLyZVz7(fA(i4qPt`<&+d=aE3nQ!yVuWoAc;HrdjTqLuug)Sh%gcYcIx z^BQ~ACM~~r+)=}joO&#;d9gn^-rm6>vG_~iuWONod=pWW1VFd|km)s7X(iJQ;wf6} z{Z@SJEh6^!0h7L(aqveJ1O?Q=;eHN@LXvVuQ%;e*0pczO$)nej#G&V(kpMa1&i`4S zY{zi&@Y%%~IG(itcuBhBPneaBCbqR%>Qh^6fCbzYL*$1gkK?DF{F~M_d0+#R&wrJb zYJ0N1!7_1mfhyHM#NsxF=CN??{q#j}nMP@elQccJuIuOol%TW(jTL{QuCXeBVUc@5E*rI^HA2&lvdQ!g^HFX z6PR9(Y!|0RW}Cc+qVe$1P=LY;x*CcYgvk4HJ)8zf74DA^SO!AT(;m^dVBQ%lw6v-Y z1!+cS&q&i1I%#jWGJ__S!or6X8nlQ&h<*l6A~`x@#9hE#{Fq6CPP>G<$uDv6Jk^Jr z8;xJt0+FKDmixPJnlXKP-|YrwcEr#~CF z40taQP{}^dC?Xe?`3?>9_&7^3wi}1^5D&28rH9T{yuOk3riJ$W?02Wy@JE@f@V+RC zkOKdl0y4i$G?GdoC&?kGHIQC2qR&i}PUH=8s?8na+{$_!Y>d zgb}VwM&n^Mm-z)-Rq*nf9>s3o;-&J<0+mAaS8UZX9WNBt=--0nhV~cey+gD9sVuhW z3+|AZ8zgP3b(_6!7Exc6ef*Le++D@Vc9b-U#+pGuL8prTyt4V+?+cMXakX448882M zz&-9T^JOe7j>80{Wwl#qQ!mpsxmsHZ9uA4G_m?9HEtDe>IF$5oPMTIF=hruk%}f#n z^yFYpd!yf{mcpGXPP-eMIH+t&Vs7HnbsG0KC0tc$_eL|OoZnW8r@{66mA42kr+MXt z92J%7Ncnx07&SP8qq2;FcJ&${xxv4V-&?Uu)4TG6p#EP{(KfQ@&n#NP{vw5 zpX}*QUV*>=#|9`5n8q1>Zdcm;LyF;&fWK(i2C$Q-hp2%lJ)xe1meqsTJ6oEn@M~Ke zqMr{tiDL2*3P}KV*R$T00tl?qlv4cwoOXHtHMcGQ4j~Cv?eA3*Rfs#7E(_{Ddvrpx z+Z5A8yys02QF!A6T_iSo$=6sYsen3_x5KB|n>~Hu>{lBsW1%X_PHd=2c?VnUDsboj zL7Eix?--qF*rh~wBf1Yn!~>(dSz@-K;t%B6`v=rH z+vr%-6_Ghfti$3G5^9W3?5$i~86tGlWM|z{`D-}z*7(GS3R4=XUibr$)9qlsgs_=1 zy2@_*%Z!o7aj8USq03A8PWsKfXDllTvcE)Eq8uBuEx5kVT%pTNDJsz2)lhyZ^5TkF-qo;Ub^R!Wf9xSqZ~0Hmva)06b_ zB{E`V+18=u06atl^^IRRKFg==Vh6!AAyv=owW97uQOQ@YUgwHt>HcdPgM{rvd6<9M zmy5rv(MG;@JsesD=JMqu9|z-8dcL)leRm2dLVTv`l_*C5bCG89X3Uv~qp=M|U!k~& z_j5h?&z=GM`YtI8O*z8D98cv&4VD5b!AyVHwqS@ z&9qwY_&6twrc}ON=Hz$&0K_Y_=0zMKPic6a-jk-~$m$+r(65vzSX$u;>}Vf2p4=KL z_|{LUPdT^5C59SGn(9m*Z_0i@Kt=)FDxp?(AwW$Onl)bA%$LgYlG7O+d{yIwuIXzYH_ik)BE$^Yw_$pDt7iamlYvu3O#ls(kUC`M9%I6SP;{rb}Ya*{)dmL7*qwXYNd zpP5l5M`H5LmW_>6Smca0d^7M3FcIJ1IS~;h*5aEL7;Ww56xY%8XzV~5K8Eng0XhHi zS+&PymH%U2Y^a+5!We23%z{)o;+~>eE?r{7QnOSH=4>zxOzQauygh2I;UYKTZj04t ze}2*)T&X4ru9E&PcNs3XD=*tLaG&zjoD?%suc4z9X&(Lb*t`dm1> zZCsQU<%3t+fK<19)(;Li676$~QGm{&0t*N!V+{+(>I}&!XBHq^rE$@llX{PfZ)9Rr zTI{>}>ph#p<`oT)=&#!METi$IXV=RuXDM4$^Mz0I4;N;--4_1!wB+5FwD}=mk+h)= z(3Ug;kcZUlq^4a#yQrPmt~G=tZ;?&V@z^0YH8BXB@MYS;2?xQB=W+J1ydP^9 znrL`(jP>NKz&V~{Vwst$5SRvnASmld_ZM)ncUze^Bgl5#_>4}z2DwZEVTDKNVTL{1X2zHkI`|r?$#W;+P$rBM3Mx(Ge!-^2R&8 zwQw%;_UHdn-5k#Cd4KVLPeq7+>+6ex5ZwORa(OCf>+=@_irSw?m9*QEDra!8t)!U# zNUD2N({I%uUn7j$SI0Qfn#v$NY$=<$l$OYI8^DMkXK>(eqL@K@oez&wxCD^OA$)HB z%#k3h(#O-7!ggw1(0oU% zVgLHu{5=ADH)a|k)ZPN2(#2rErE;*b{|47paA_C3H-QOF$JD9TwU&TbD7V3+OaCec zhSqy9IkPxptkV8*WB<52%j>QRzK*ykS+j!_ZDE?x7!=(TMY?1`@V?szMouljm_~sg z{0FaZY2hrS!O6imzu-IMJC(JKP0HzWCiG#7MFAfu?wlURFK@0+W%)2?95ynPI)Yrd zoV2%CQUU|%;9oy6HWFX4s;M)4PZgZwe}+_mYSoQ1N*3XBF8|R~0bSK=A0_?2zx)4v z584-1{GSp3G}`|;IK_C@|L^DjJ^%mK+Wp{)nw|IWaB8I%ViQ%bgR*1-DQDIH_q&~) zEAanK)<2?21q{b4{SI8$ahb^!)?!Y;%X0;S2yOJ1m4PLe3WOYvHxh0)XjYus_w^M1 zd+Ze?ddN9T8V>m}^Q<>D2dH@8-yB?~9n=e;{AbTCK(OFUbki^Fdva+MXjz>J!F;y{ zAAdVuNW}b+Ue$dKLSz<@T{9gx+L{QY>5&7{M}VwJ{S#E)HcEuX>!D0-e+@Z&U{-T` z2V|;=)`|Vq(Hr`Lp?)y8&M%Ldk{%oBuvD0 z=Z`u~noA%R@(-;2qP(1!JSX#uhV#z%bx&=Ck9F_g<02~Bvm+M0SzLoyJMXk4GU=3` zKmg{zR$Yid&%%Q8!OU{dW&kquxcZ{Kw-?3lI*C<9hU7VG8W(LWBerA_{1z4y^X|&m z+L~#m9JEvH(&=O-T`E%_re5ZUovrzheYQ$rsQjpc>s(@~mWHxc_x|7jSBMc46H`8N z_V(;N{XlpV2^AHAl9F=xq~39j$GDxj=HWAwP7}7DPFGa2xIno%1%gBr$>9B@8rRXw zf@iun_^C@-#3KJsEK)YVk;UJVRs>#lV>{%GQqo88zLup*(rO0wP*bJI%l0lhezoz& zMYh@-QBmUcV`Dqpv5{t3=WB+V*`!e76b9oJT9Jp9*(XViZ|@!TUb2?wNHJAGO{h|p znMh5hsUAP3U%@a>hWlo?J92*-io3(?DHS9s)9mkV=PmVsY+L`67vS5}xPFv)-(N2+ zk!mPyR#Bnv&<(5QR*NQO}B`7Dd(!jKsCBK`=o9HS9fI-lTeLqSE6=22W`yznC= zgyH3Dl)l`pA8Z@PYZ&iya>5ZqqI_TIt@$=I3iXS0d8U9@tb0^r6K-&%q=>&~mIi$> zDHa*U63oA(ozkif5Nmqpof3WcAdRu${RTq^_<=YG#>W>g^$#{69%rqg>BR8HLMXWP z+~T5__=<3$iVNYCbn;_&egay3&VlR3-kxNdjoj(C09FUty7R}uo2ZBr$Y)>~ZM;*$ z@%uS1v+Eihle+7}ELXWyZWkqL(cWRhwh_Ne{39CCt@#n|dX%=+Fm!1LUzm5C2|O); zY@MFku8#Hhf9NWaX`IvcH4XLDYhN*iS@kGo>}FxZ6%NA=o6h*uWKS_kNPy(8^k)1w zD*|F9y!L)-Z(buL=lf$-OoJoR(@6@ow5$s42>V2Xsygx_!@~aPG~db*`pwz259}r- zl~N%TFF=opT*VG+asw6XEKGiC9I6EYp#Kcjns-!^Z%yv%^c?EA>;+e^Q5u>ec^BNR zNcN>{V`II%u8j{S6HQ^w3^3i)l}BK$b)V-Txu4X|nJ>0rlxuR+xm#c` z*cun|I^WaxMUfdlTpuv$LGx&7la=&lWBFXKKll|s4D!Z5RuTS5fU4j+P;mrKy2pQi zTs65m^6qEkC4L!Lz}#?cWgd8Cc^lC?diV<9BbtB7OH6+bJS0uB#>OPJ=bzEV0;Mwa zxz`a|T3b^%EZ;t7K2Kl&DK0^qb96zyfaRZ|fyv)~-ah#DqPe0&e@hI_1#$2u6c5*3 z|L_geVY2j@nDNo-h|h}$qSjwU3glE+EQXr$e@mOLc% zys#e=+NiNo3qZp;d`HxjjHIW~!Dr3QeHv|{i)#kA&88o{4_d}y#k#mh&&|uy@Az4L zyp%Mc2NHjAm==vNbY%OU;^u2ec%;$(fpCKEqkc5K1MMwS*VwgkE2ca~6FpHG+MmlN zHc=ep&lVO8Y654fp)K%ysN1KfBnh|ph5DmahxBAHx_G79Kt_BdMyYn*T$2r}*yp!*@+hO^P5O1La7`Ut2f$nypVtGc)`) zD-w5EAhI{Fi`Vx(uj7k5k<)T}U5UMwamt9^k&XL$I{mw&lH@Nc2U@D_76p15Or{xm z?LULj9E2>n5o_7o85YZLF;cTpnsn9}@r4-;uKusM~Q~Y9+D!Bba#nv6Yxpml4GJyaUsT zI%OV!XTJ6Wmm=v_M2X#n<6R0Te;i+QJ?xDtOj99^)=O#IDJ*Ck{#uIJ4RF-S+PlxE zClhhYlvI&OLPIy=E+4EIM(QhCQ7;EN1DODhT+Iup8KI$}#n~B92`d;FZ`h+dF3~eh6meghWKS^nrUda)L zvrBL(rs~at6sYIu9S-IcpM+q*%C=nv&W+br^o&)r@l zHXGw&ay0_<$Q&e9TpS)rTKLuis~34}*^GP5n9B00Uj#wz&$!RQAF7c(%2V|CYLt*G;yoy$you>=He&xYbV|P`$)Lu?_N#lH{4d&EIE) zdAas;|0vVFl#zp~568&7_&`nltJlCFA+rc2_AcxF$x?lh&*Lq?tDSA*1Mb8_^L*sP z$%H)Z4L_$JvNg)yVTl9PuH1&&o3$hg_WJw6!opRuqK{mUhWbS@JB%CX8JL-Syj){; zMKGnW3aZrO*-Cm&PT>HZIMwg0Jy-vI0e&9e41?Bg63@fAb@}K+d?&OgM)9jW7EG#T{PtR1qc{`@81xbR4tj&SP z{!A4S;^6n)hvWY{0awsAUms8Cqg5fMKD;7Wo#0*jZpf=PuwEAUXMml?S!!wasdwR8g=eBA@ zsGh&$b=rY&!U=%Hjx$IY`bR$XxXb#i%+uxO$MndF0dU)w0*iJ-wg&R- z$tcAQ+ z%vH$EH{HC_Y32r!WL~4JSC5IXdKozVBANmGnR`2X%B8C1ulFo-?4(NZ{$cX4zzgxOU02JC_pqjYF-rqI`8_n>H?*|43A-%&}W zwSOvhcQ5aBt^FM=bs3OD5H(ZQNLo4s3<;%!B&;h2QN+*07TX z8;Ax_f`?SH6TJJXIHZ`S>0kS|t}fRMOvbd<^!?9wG&jp}@d;k0h}=!X!)Y`M(|tZ5 zEkz7<=;Wl*;q+??J_i3(MF084c|}dluUnO$qA>ZtPwLCHbFHndG6A$`cDC9owhB_} zPp}`{({!jAvzYL9@`3S$xw^jRLvar}m%k{pL)}jc1FelhHBaShhsxR&NvH+>Rc|83Xhb*XO!GQ)qs}%#4uVa3?RJxYe58jB0+`2wUJZAdP)P);8IO zxYJm#8LE=f=5=tE&aV;?9gSHepTREDwAB4OHmu|UcOK@suw@%=gj2(_HfX`@-f+pg zO`y{0Wot9RMEMg)h|lY@xZGwkgm-ndt46kS$O$O=!pT}%%jR6_Di36ch=m`=7$I9} z;9*E&eEcsUwdX-M<5i~*E{Uvz!(U547t+?&21>V514&Un;lh~8bkZ*HSy!)Jz( zFmbJ<5bNdsz=kR9(W#0T(o#SfG3G;pzxDM+fVwxow1o5iy%-?!YY$M7kyp53EiHo2 zKG!kSQrJKvP*P-~G4Rdp?d^1_nt~I|^X4$+Oo);34I?8XwbbUCB&Jjq+aK;RK^P|j zxb-%*@#K8t-Z7dzPcqu{dVeDIkjH#Hd(f$NT#eESpg|6w2j{D+7=4iIX~d+gn(5vs z{nwwck)S1@_{GQ=c$SqX;0{(gvNSAbw|;Um@`o=E5LBPi>@KgqJ4paLN*jKKizclZ zaxSy@1#ba|Nn@6WMuCnv+O9}C@G%mdd?sg_eco%x-KD5>OG$Tk zNq2*!bV~Ob?&p2}IOn?FxfXV2c9vy-^X>ZV9xP$BCk_tR_bm9OjIj}k(P3LWf8x%1 z(BHS@-nVmO`1zrIz5A$qX`VgV|Hxjeo&Ci!+nfBMkfe+NGNq)9NM}HKff{i=zNY?t z$DHc$`9H-Z<*+uvBkQ^jkfxTn;WRq)qT}d}SqF_nsVtL@)t2eN3>9lh&L= zsZDszzB&_gF8A-fgvmD_@(oX1ztl(I@13meCYz8@`on{F8#21Nvm`79FRwD#PdCd_ zm80M4>Akl0pRz(m2Pd;<4&uLSz=MH8hyHodl6Tm&y}kskQzTSWwT}kxyj%9p?LK_K zuC<=)>+1_0(Fk2HGca|H(a_lX1-}g1cv6pjBLlMReBNU*6b5$abvymBoFdmwuAD5P z@n2lN+{L7>{!<>e-g`444hl{9%<9rk-4KvkO5?e{HT_`w6jEILhAf45?UQqCcqn(z zgNT;}`CL!>^Ya`{uq1kb19hZFK$gFIZE3hn+)-Z5VwraB($b86U2VbAV%e&`9mf3e z6?5J3tW|C4ih-?=a&exO3Z|GcI&>W|AUIVtcI+f>z#=I)i-F^v&dx0eM|nF;Q-1AD z7eDak*c#5RE`bzu8%Tjt?$B9NZ9L;qYRcy zj;!~4mhaWPg>EP@fcgrVL6*JVbHCSV>oovU@}*Na*0$AF>1;U6%{0_nE`s z!H``IxPH@^iu@H7{DTKXHr$*?0y0C6y`ctI_i+Nx5Wqu-IwET5<1kdLNTFxB@c`n_ zF()@GbX=h{(A3YDfDUYr>S5%ut2p=oteAm>jijY5)6d`&{G@YA$aF!;rJ2E}^>rSj zfv-5rH#N=rQrm-#x_o5<4SoX<)3UUvPwuUQF>ke;0y)S&l|ap`m#lMbu<_4M?Jma3!B zy6QJIHGx=Qfgnak8h@|vx(R!739xu15-3(3XX!Sv&|W>Y@Sv($PVsbQS55Q>xz}GF zB2=nWG-Cgs}WH>m`lEu*{cuai!?ZQkA8bi$3 z(>NAd+FnOt$xx9U5Fm}&1Uqt^#{|*GV9JsceM#T1s%xDmy5;^2wp>uL_`WuWc*crFG z<}PSn2m`~f8v?+2=$K5@2i|vO$0(&I!*_`Wow>yt&eyJQg)YaAhy9&reO)fCO8jo| zRBE9xF!4Ha$}`xZ``oiW+{p?cf?Ke9F*vWUcY4mMmNi)ceAvw)_)oT{nF4DU>5VpE zX{UDs^oi}0g(v&NHLTyl!xaiIOv1R)3!9GdAnDzw@SPKANS{?M8Hpq2vZ--#7? zK62`vesWk7WkqND)SoWze7dkRg#`lj2G{rfyP|yG9susV;^f55^bsZt3SXt&Yuaiv zdSR8;jHwy#hM@D2Tgr|8lpoiZ%oA;dY6rPUTrR@x!e~5i$PyyiHAY=;6dScZ_3q47 z=PP>LC_?ukGM5}0qrD??)|rp13?{8D4%L%`y_}ejC}IRTz`T>LFL%~_OFiHB1Bitn zDUEvF7|X;8FQL|J9_&= zmpR$E)7a0G-uu3lkEq|og5Zr#*E-c3b?pX+h9va$$$^?FYig=b-Z?4nyp1qJS2z&U z|8lkZzU)M>pkkLo+6pevlx9iU1ht%h>T4Xthn(s3+HmLUYYg?ioj%v^+j-XNPT(4Q zLLYmshQ1by876#3*Q-{Q7n{7NtNu|_lW@|4U8qk}9}9d=V>8#j#gd@lc%6^^g@~GE z?=f*oD-{5Kg%2;@LuknoI4*Uci@CF zd7n}uaL6(EXq=tePua8(@#H(7pFKX91nxBkj^0L-Of~Yk$IAaU*`8Wnj{f~y7S}Qw z&^!-I5fu{?D=fvUhmG1l=NMToI*H86q71urKse?%Z|V^DX+?it`N#G3L)qGJ#b_*YC!r2R@;CcMm#K}FTV-M@K#d}oQc+Jk4^dz084c{ALJ zHxmkSO1t}r48h7J^f%R!10WwLf9NXnU7R)QzS$~zxyGcg=TaN*qbxcpZ}{|dvd2;L z&e>KBi(_7Vjo@WRKv08^@KWkwodCuLc+hd5Fz#CP7WHLmYYfD zi0chnhf%ZcA7srT%HOo-_uo4%P3ENtaLtwn3lPv@sk!jbjS3xVb)D`qF8j?8mI zwM86?y&TljP(vbzvT&Ve_*m~M{A(6I|GHOK!lyBop6&D?KSgMo6?&^q>M=1jWMaNd*(q;-XWSExWoc&z-(4}~b#rQ@F!ufm>Yu6YXN5D#u)8fp&?8Tbl8;L(GSD*xvr~TjwR`Ad++wT=D+Kzk0fTs9^Q{W z`+K&Zy~`Y+6c9*lHc(Rw22mwNN3STP&s14$%8Nbw>FL!u*e{YR;G7g zLc#m>1SMgjQ)m5CaVd~7g50Cj+I?N`rGUu zJ}6{g-n!^8-Ix`b1l?ae^8}slKsT-okGXc1p10;No+HQlBNn52=H>{%sp!f@YPv{; zgsTlt_?LV2g5O%CL^$fn45V+)UQ~bp%iS93rl>57oS8B#fCc!IMTmfUEGa!bCL&=W zgLf#AC9FIS1O0Cr;I|&+c-0TilEji<#j_awc43JN5lFyD0Q~ZnhLk~8_()SOsmpK0~1HAGCQw+%!IfmN9)(!OxrW;i$2a-}sTaLWy6FY*=cp=_~I8@~v0^ zhfmVVR*cpyK3BIcc8Aqt1)HGJ#K7x}9_P)0lxk78`2{WEbaviZcYDcou1e8k$p-ad ztJGf+U;#CTf7Je;;9z5rUHFG(_AQFG`n3$Aj5~Cz{e<}{p8UJh=xK0G<}gfj`ycA% z=h#c9*neG4n9j4-edDk;APg)s9eW2_QK;c00?3|fhy;anQd_t}9X{*!xd z=!GDF>hlM}@TU;oI~RnFDSPp=t6I&=WAf$pEkNHhf{Y+4SIK=XKW+hgIxWqV^w#w4 z#+1d{?v&1HorfOG zt@#PC;LGJrB8!q^Vgki8k)T6rU0^|f^7m*%;C$Rv%;3Bx`Ej9LXN>|)vca-aJJC$6 z7++MNxjp`kil_D}QT0Ofti>fNFdsjkyBR=k$cg^k9v11=l9A!3bRgi|nD+edpOanf z#G7ZHIN&hxDF^{W+H?554GYX9j+=Nc5o+-aa_+?Mqn$xc9P!MY2}}Q=z40F2wlkz6 zzw9KyP1xAj7!&Fy{0c)*+Daoa!f6C6ne8j(1BI;8Jd*$0)}xwoQO3SAVKcAr&Ub4{ zNihZFK8TK5IEas5Bg~DbRzYSluO_;a;X<_meA346M3ov}KXdz>;C)yn3hMOdvYuU2 zqPO7i>#`B7eV~fIA5*h?pU)lFw!0&E(i{0^(>mTyDVbuVZ=+9#fAoGns&~ej*P{Kb zp9FUH1Y`7ky$qGt!qz>$e%FHTGVI`;rDdT65<`c1VR$P{VZo)|Iug!TtM5O4z~HRV z4OM#II;HXZpm&?hv)6;Zf(n7KLmq~|PQ-NjU75PNYwfGzc~lZ^RJafevcAcv4@6Y= ze+K@pSXQ$&9533l`3^h$w6hD-FLzId6wDobY2w4(>`y$)WL4 z8OGE}gE2c7hUO)stI?h9pKHT>phJWr9xf&s&r*;5CjI=(By?$qB;J){_aEJITDm4L zYwPK0YSzN3eNU+$R5f1#=2j35%i0otS@(w4rspe?HKsd3Dnv#Yqi53ndTqW^*OFT> zHk=DOG>eSUj%;R=)|7Ca>=+onhtA-La?-f z(fg(~o{e1;-Q)E)e^h10Z^|BC-8S43+q6M5R(R9in>h8h;TpGOuK30$k2^=DrY2tp z*7KCRhUBSkkh2~GR z-&$H)ih{Wg(0()GB&JFnQc+g+pI{IbgEX^@^yS=#1P2>}CLX%^cjY_4Iv6fHZRiGD zqP;vRTAI3`e@r}eD;3E^S=j)Cj1@Fg2-i~w%&yLAg8~CFadByG&aR}ufdt3Ci~vkM zSu3Rr7P`jY0%L4)a`g1~{V9PytXmPryA-VrJFUC+D9=?+cy*6awoeMxm35B?6gNYI z{iJeKy(=qZ6Yqfc@is=I!A$HO?Vb&~r;=B*twZp-s8ec&gg#y0B=iF6_bf^$zG{fDr z@5^l=t9Bil_cu?dc;W@`r9gTvYrfJ+)AaD@AlRVCCpV|FY5j`YUW|8&Ci$>H1_Ikj zbrNx(ANM5DCRI5LjQIRrec=Q zp*St`ue|RmeZ~ZNp=)QZAV6y|`1G`mV=XC9kutNu=yerV{S(@*%QbK_2Npc|UQ+aI zmPPp4x_$KW*ZWXt?D&7UqF>Lw?@)=Glkb)Y5h+ zU8BL>c2lv7C0z@*F?Lf>{~m&Qmi9Lyhk931Log(nH=Fwg#~z+fLZyCuD$PyN*^g86 zPVZ+gvxywo*x14&BgGXJ(Kw0G5+MZ>mhm8TJed0i9oMxF)t#dS_MF6Q#yyCjFF!xT zJk;ozeQ_U1tgA*1dK2KAPtVW0!9Y#r=V}k1wHRsYr;7rS?7X}X9n{~JoKBUeXnbtD z$H&{A#S(T4poZ8yjG22n+2?OSR)#Xlse@V$>SKr)xFP_?! z3(Z(ykTZSMFG{LWzW<0UeIA-r9Uf-+fH;$UD}~%ia9Foj^og+AIeM2!)5I;-2tH2X z6(2&C%FSW52i6#W&!+CHH=LiNe9b?!rHM($5W|(KM}d=;zWw;o^!9#u>h8rvs#9F< z`NY@1iGIhwy%fuW^N1tsC2$|t-bOB}$-95xx|}4Cr44y1f$-V?5wuxicG^TEf3b*O zj3B^pHQIXvrH;){Q=b+(s!GmBD@uKakKys9dGF&(Thl zx-tz6BH0-6%+J_`uZz`q&r6XAxgria@rj8&2ewHs8GDs z&)9w>DHOt2cx)@+3T*@h*U$6S`!qwq%a*T9V<`I-heYLP;R3Z5VS&P>8=U&|AL5ga z=C65iVi%S<*ZwK}q9})*R(Q^k8(|%XfVfTM6N5^tWlWteUKm>=^uAz-X#n6BcYbaM z8(T$$-yuVD8!3RR_~Gx)mA5_RH`Z&g%yfq7mWzP3KcpkT8f8826owih|A;)K`;!F# zU!fVS=iLeC#ERNwFL+b7}k%q!ns{h%KOlHV@Oa`Qu0uio4eTo!d&PVpd}C4 zapV-rZrL07>l<7QWSmojNRdj>3;2(r|9U9{b2mO2C}5O{q4w0L+)T&*BYl#5+j{~}z9!9jd0RYUdVw=a_^Ao{3{i^W0G^AbpU1V#T`8M8^* z!>S-?;5gibt|*xH$r^JKPt4AS{$lLUAmyaqJ4I_wele1wK_wApKQEMZy9?UNF1oUh zZG>#buogEpH8ois8SuPdq+hZ(G~#N+L(L{hLtZ|LmcHN7h$BWi2#Z=eJO#uKET;pR z$I{BU92$mB7WwNJQRN_LA&?)76O} zvo*|wB`2YP+hGX#B0a&Q@t&E}isQgyVsNvZ{C)08k*0o(cY-6=$#G;@%6nkh%J;MO zb7JasWz&1JOipt59x)S#JlbvDm%u5quUYx=?cWT%BU|35gRx~F=cpJw7+`Tx@y6=FV)-RzbkRc%BQkoIvT&u13-KSp2;x``J-tdc zV}~%}af|4NTR^gM#948|i4CgL`gg?(B zv*k0rK=KYwiMb{diX4%Fq`3Pwl_Q`7Q~Yn8hgQD8#&_SHpfgi5JJag8C4+XvkG9kp zlYS?o$7|!?6sMhU-Fdod%G6nL943mtzyhejl+w&H#UpGeZ8PQ)(Yoj{GlN8~#!2=( zZ%S{}>v6oUfJ}pD98l!{9>&%FyJ3hnhUD>SY-W7VZBe5bk40eC+)P8LcEN^{du^A? zEUC$hh7yVk=Cg6y)J#!J*hAOZS4z~2m(8oiiqyKS@I>xoe)vjBOaGZ)S@EIf>h9`Z zsfTI$P$W6Mox$RXiwxHnLvr0DtozJ=Uz+4GZC2T5VIb5102`%{Ek~dCLmDG(^BzcX zMjDaJ-swv2Jo^~u_^UZ*qRT9RkkE6+>`o1H?zxg8(|4wD*nknysOV@(4-Z~YSWoSN z2yiI56Num|NwA!4x_cxs(%%vjo&V;q#T1*0!SXyJCyX%M+&?3KtUgp#^^dWlqoDx+ z9)j;$$yLiTXgRG|fBz(z=w0M%yB+=e$jyIZWMqVH@KB=6)m(~dxjUYH{B;A22L*s3 zPjwmBHWvH>d# zPj9bdvBSUm+q;{!f=uUokBbun3cyaj9gCKhR(G}WEF!m2-vx9w!>dlA6itJBg9sFo z&5vkdeXsiDN;nUqJ{(=7ZrBXk`o4`sGzz@bpa2TmdrYwvGAa6*5|G|r?d&)cmq2)j zOuM)PT=jZ^tTEo;SR;@MdK#Y>^NTmf1GCYu`^gVpi=ZYBRqoEn{`!Tv8eT4Lswy>!{n}~kUdKm_u8UpIiFUZVe=1Ow^b$C9 zp|Bnd^la8*#0U!djtX|<+NrCx=dZ7%Vmd*rWB^Qm%*`df5y;y-?y%u@CQ1Y&hsq4N zc6(5nY;Exi@9(I*NJtUBVj6ee+sPIUY)#mVz$m6ufiOkoWqNH9*8HD|05lSAL_6Qh zUNGdw3;jC!lC=d4z5l7z_h5F(pWA7cHqZW4lT5023c1gCo~KsVP7VbwJqhgLSOU=xP^ z{uc2ijaEQ6uHG;R&~Z2^oQ>Vb}d6lk>b$70d zfS>-nJ|d#}>9n?^QG={LBIJ#P1ZqNY`|g~Y3yKEoNe zSwmZUv_kt-B2@C(UrqcLUkcEVGq}UJPC?{cbc*A+c zN+x*;b8Zf&7v43r75MDx9^JptLkJzV0>dE{5|JMuglpgaG&bh)vyEqRB1#=J90vcmp9WZpLMJ8HZY8 z=4F4JB7>b*RVZKChjlqXBd6ecvHZ$DZ}+6~>PQ2Imw8Pb@P4F#cpE)07|yL!=qv8d z$GzG;-vlEfkGYTihI4TK*GD48-!mr(3(*f3;q?UpYjI?v?nG;AqV(2bsVC8~!GyCt z4u|Kj&~T-b0sp)uSM@i+jL$#s2nIcJeb!Ke5r2*C$gX*pc)DY}1i>;D=~;Kfyy=8} z;GLXODlFm}P$*9qsx8RCBg{-;Xprx3i>Cz_81Ro)?5_y%V)L%rI?Bp=V7r_0$v(J! z8Eq$N+&7!`7*deY)+XLX&I7X+@4&tI*9~_N4>*DJh2{#Oj*2in~5c%eRr(ol~AVsc@j4#G|c9u2p8D-9UUdZcU z5pg9aNd5Vf1{MzPl9=Lmr96CEaIj?in#E_^r6;msbCj2ePW8g8$lJ}~hzD$N*H*6ZS)Rs zhQ2qm#dNIScPT!{XwrV@c*~9sX;aG+% zB4PvF_4J#hq-%1TQ4{g~ri~0wI2=p|6cE@XY$wwXf$c;{HmzUyvKfmgE~*-)BpBR! z{)Pr3|)H=izltsF(go8Zk4Ewm22W)MUP5l{1beewDBuIw7?L;%h+?Im#o zuJ*cNunNZqPR9bm!gVcW4}2W@v9-G~B&_aL5nCD{Ui-Oa0v*6j#-A`2r+-(jl_d*v9-a8?*(+;8t zt=usx&-ExrMc;}J%IgM(}BJ2*H1QI9cly?^YoJ=`6XD>Hs) zzI=Rqy!V*y_%BhBP%o~U7a*q97h|+z3OeL#!R$Jmwid?U7m_Hw$WzjZDf2B9^lDMr zst7HO8Kov>EIGlv1#2k>D~4GtUD&HGwk5+JfjFzAw!0dn(y^1qZL8)aQ;TNd{)@{( zKQ-rxOg6$P{%h`OaCUfn{EaQU(ShT?@G(-L8*?J;w{qbglx$|@8Gl`UA6;)^>G#N#+k{Pbm%>-qtjapN08-<^KwE zW}`XN-Dc;jgcTOFi-8~6Iczv{XNgVji({p~Y2=|M6kOi2;o3hFO&xpU$p~vjiHU4+_{5+TDekp!Co9L?To5fg zUU4x?qhh~oi3Bybe#;j1;ssOLg@uT<#Y0KIqrcFALuuF7*BKhm-{Ag9WtO8$D!42M zokkcSw256IiJL?wj$CTb;61wwDPY}0wh%Vuo*4D-kHA$fmT6bb0=o3nI*A)cuJHR; zss-ezUsvDsKyCAWVAvlp#UW5Pw%9C*JyFUi5I&$9?I+0fA02>Jf8 z9}q0{6K?wD&Y{w|{(HpCWH8-@B1b}I-LQnfA`&7h>W?Zg!=AXwS$yPuI>K|;5LBs; zzD?pM$nS#dM8DGC_YFl7E)2!44J;yo;bO7ttjd&At~z#1y#HR}MLOimC^izMQ(-!Q zR5&Yx@-GGqsK3s4)s`+;iU30ef1}G@gwo3*qX92c=tW=rrni2H6Qm8y&NYnR{m)uc zyvY1J1$f8ImB^!a293)WUXvQ(_lN2~$4ncZZ2WM2{JCmUQd3pf{<6v)KOir9{mS|Z zhsB>E;DYmVjCW0({S^+Wto$q7mq@Rem)o<2z7o8>ZBE)|#FGnNdL;C*O6{hy(J(SbHfQ>Ip*y!Z zMyw)yh0uc~+5gY>>I2fR7n%QmZ{e~p+VB6}{(sJTeC7v0z~=wmB39YY^;NF5FU+o0 z+s8iM{P*7r2AOued!f|-*&epD^5<@&%bpH7lzo6g#3Z0 z{2G3x3qN~YfEs-lW0|8~%$G1?RU2qTc-(JQ3u8FK7u5>`CayjNaCA7edS}(G<~tIW zh%@REbHaNb0wl%3!Q;WLTxruHPGw{5#VED};(n6yDARyAWcO$j9{3xC00nwx3+n0X zYu27i?`=(!^(#R`?wJniZ{SPq_()EujIFmrgTJrlKk7IiZ7aJ4P|D~h_Y+&->TC)%A-T34q7y2w?dN5nM z6GP2zLQ@3N=iukvgT~wbHivcb61!HNnz_HO2QxH~4iOK6+qhDVgjYcGvdg-XNmhgE zedT4WmQn<8d^L`c5jR`>E_-TTL^3iY#Q|6w494m9-jq<}Meb&$40dRL4dweklq0n|lr*7393ls2IL*sf~4SZDTZma~e{u8n7?T1Pz{75jvi}nh{yUvf^ zifaQMKwxm`2-LSsYR_@dmOLj z<>et+bGqTSzIy8yPZBZx;907(8%Gx?gQEngA1?E2DD(e>?Rde$-k76`1wd5o-1bkI z^*mki+~d6bruWhl!<{#ou(9=%x^Z&V=T}4`R=jk68REWri|6YmlNPUOJ`W=*tO$M~ z)pOG2d`vb_Y&RTy?$mLX6d}Ojp{?3B~dV|-ux#t+l9hWRa6S7L+M*HlitjA|jbUu<>W|7*Op?Bqws z-8+7X({`j^&*O={g%m>QG=i`ZVOP1QzqAVHxYibZ_O{ZcY%%3CzY2Mhc6CX39v=`p zeD`7QnRJnQ_nV7m>h%v#y&y}^Mt$MmwX1*5+?XbWbUVrHZ1P`zfqhl7xbrKQWZ zAnFMKQ1uw;+T1*DGj`=byxRGcl+7#q*QTLLOn=Vqm4O%v@sfhTTXtb9Ine@KIlB$A+2n>qC%EqS;2}gH7@OL562&WM%-p&Mn z3^~@Cnmmaqq-CNEJZ;&NNiWnG@#N&?9W~@pkR>%NvJJ#ecUDZ0`w>EZgD?!ATWC3{!er%p!(v8L#pBvG|Y7b3Au z585N^?V`im;Qh%X<78z{cnjG?ES!EB-rOKKS8x@=^{StX1w5JrN=lxDO|k{2T$`NjTteMA*M4*n>6fDoB?L zB}A%s&3>wk5&P&QJ|!CDA;VD=?O^z7c+H6)rYbQa!h^TP@4Aj|0l>!udew%BMw~z> zo#lM>5`hWw_Xjw6c%0jLZ00*`3HVV)v?v^G`y%pANKsl#l^Fn_DeO&B`9>T4$jHcz z{0do48@zDrO&}~R?Ak0?EO}aQf&_qJOS@*xenpN_u#xtKH8@@AjdYD+9=vmq^`qdr{_c3JMWARCRfj*uRHe0}1qvK3~6nWj%^~gGoXX#iQ@1r>1K2 z!WyG#e1%{EmZ>St;NT!{>)~`q0=GEpPS(wW=d^cmX=$(Gxkgsr2(n%f(WNUHs}>9j zK7khOn7?X~8X^)>fO>K7)(`wL)Qh>!AS^Pnn9xx8Bn7$&_HmF``ex=#1pWB|I3y(W z`v!?jZ0xS5)dITZ%eQas1_YapTT^-m8)YlCxro+Z&AXw5HxQcZ!DW1PY8ffvmByBQtdUaEMvSVa3Af8QAP$ zb7A>lzsT9bV~VJD5MqzIn0U5@EKRh<&LPj>V^u{KhCRBSs(D9X{B;r``wy&jabiSS zbDbv<(j{HePZxts1S@`Uu0kMYV0b(w^UUG3)&|Ea-y|yivo~m6NzaB_!nvNAS!mLijesK$iJup;75Cgvw~YhIkBM za5u=B3wBng?!JKuF&y#JNqLs+h6X~gqAfi=y|B30dA1uq%#2_`=rQP!;9kFBrtX@|(zyCUc zSE2YGP9!6l&Mc_j{EIq5-~5EbBe47o?rOST;pTAQz@okIM~h`)_n$*(;nW^*Vd^!p z>dH@cWlqr%70TavdF#0R#YlX2xi#rL5Z`(7L$0 z=x4F0@kTF4nb3FBgkVPIn;fn8N95u5zxXt9QT-1(b^+y)WCfw$G#S3jd3bqA&?Qi@ zvSNaf5U?RBSb;96zMiL^H%L?YT(MN0nw=fnsy5~EGj)nCpARwircBf?3?Skx*YWSg zr?l4t>Qr7<|62958#I68y9kDZSS%^S#DJAbota$w>_&VnVpA2taQ z?=9fce{SnM%vWl<+#eN|mbxaz)j$>BNm=v^iRZnjAJCpP8mYhdZh3GTh$`)pvc>AE zMHPDc4NJxk!m}&g=`B7~W(+ zwVGz=yoA*4qz;&h%gQ2xr(S9+iF^S8g8g%m5XwRjdp7lp%x0G3gimm=y)UF>VVeZE zCq@+~+D^bAe^Ki$5J5r1w+M-35J_Kt=yI=P~x& zDiYyw@pSXONq)w=7&PcgloyrfiUpzh_?k>Ma~hdqL8QJqOzNDRwTO1GXO}uGh8?wT zE|GSUXJ_ZGoML;r;StrL&Zy$fUgoSSOG9$}loA!SINje5b*D1dYe&#H{Hkwk5dX2sux|F`zQG_HOj3d*%jstd5-hZQWH2wOGYJ*T>ogNlfV94^(z zkr=diu$hl#paJtuuEokuKH^;9QA}?Xf%E45)lpDpW~M}mIA(gXC_d4CJf9~iFuSYm zBEx?XgT|W|>)%!hi8_|uiLM-;*sPEh#TnKTc_p}<=PT*azyN+5@gS|K11SkI@gRu` zo_k>XXI@T4q2}~IC5wGmG~HQ>5ozxUWdu-ffEU0Dxjn%k24lLox@NDK_La*xv(k7H z`U<54g;RBp&&En~yXJFoVWq@hH~2U0Jp@+hTU!@P6j?BKeAkzjk;$#C#RFS!15+H- z+CdWKgvQMBE1yRYD|3=4qTNcSKngRKsS8Nk|(c3x$TgFZB z6lF0+y5(_JBztVEcPP^v6=;nH%Y%QvypmGTgT(%f@K=KOvCZQ)A@1dpCHu#ODG>&W zNtVZ`dsmYApc0HswObxWqN}itjWvEh*Th|bEX6lQ%n(;&xbLTgD$4_DO zE3Hf)w)MOhaxpBmxS(2c=5dAFhAXC&tt?8H01`h6=(sA0JaYb1+H%TQ?c$wvRxX|a z1G(8*e&V#1x%-spZ4j0^d-^3IOu|8EVkjjbJ>(vnIJXIrMz1rzivwq`vzhSog z2$DGiF7oIDZe$1WX6qlfLS`fC%Zf3&=pX0uNOWl%9x#VEIYb*e0{#Qjh%x!dw5(lA z#Y9G8j6JAv0f}k0T?Q&D0lEDLS;f|YwaxH)dU}NE4KPlhQDC4Cun|#hd zL1mR_6fMv2$F24ulw&?%an~nn;V590sv=21<>OQ+qb=Fuk`ADNEoD$VbG3hYHN+2< z7-8NQsj00+`X!%P4)ROF=go&`-X=X%pFz-6(=;EI1iQfsq`Wph2ZH5SVZ09y5B@<2 za5IR!>RrRI6`PRRasJSD7yw!Sv1qRCwtwMs=BH9~2L-~%S4UBz4qXY;T3 z1rq7+!=&}70f%jk^!ErURPaCq(iwEL$7vQp6B@q{S+ko$rZg&wUxeK~?odo>$o0+P($%&xXdD9dA1P zCNvF#N$i`DUSd1UwXiPFC0PkC`*tmRbZY7uVn>Z+g~Ig|pbTXv68rd<4=A~X2gpkQ z^12_BYAZ|>7FJO*=HSW1a>a;z)=oNDPbd&jR(lmDts3CzL*3M@Rc-Xw;5jlj7X9WX zd=)#K90eSEy%uyW(O1E8cJqZD6|Gp>^>!}s`^w}Y#~sheNx(L8Q@VLL8YfCjnYUbw zkcH28xxcJ^?Qf-D?|T&76Qp3cuaO368X%0-sB>_X&I}VD!AfUlM%j0bzFN~n>VD3? z56`9`Zbi?YIPm=Bi{plW_n=!c@!oJ(n4p`M$U!25;g~Cb(+A3c3p(J2ubNn~^d3j6 za!_bMFP<(o4pWfM;;p+lnzW~PJKoKi?r)k_O>|Ng(Z(NK?Ip7rGe6Qe)^3)#xcDDj zHoj5bdBtrzZj<=<=GDVc1swhxq6!GgzEJ12VF9`1PcF!^0@Wv)!m)Ti9N2ErjGrOe zOzQP!9V*=kR*4^H)-;WfuE>T6q^fITY&nl@f=~T+xu2fED3dU#Dy+Lsqmw4vq{yyq>)en|Wl?6L*=PUkXvjcAWU1r}7n{9ljMp9xKf7hG+~sU*(_XI}hC0E}(2a zE#r59vc5ig?nF4)op9P8GVN~O83;FD^9koVzz^KhtT2SYz`&5=OJk;jQ7bA+O8+T@ zdA>#P0(S!j(AF8};TCQF75+|6?nSIy1VYw^%fn9{z#dI;@bm-^H=_F2fw>)vR+a7; zim|jBwa&}*^>Y5fG0$S0^}A-48|??en@XgR4@JSC83R^8v6ljrpXYd`pR{=rTC7Q- z73CseaYRrjP`$w9A;N9tJ;B5yj=1GUy=>0Xh`$)@6tZBmeF4t62aO|e$XS+p@fSg{ zv|(!D0USC$%MUoCeAM<_Uf`y1{naRm7PF&8C{f@$`?BVh@ zV?Z;=dg7=)7xej_hlj!DEox=&J5Ipx$yO=-nveNMT^)B?od^#QCLHHo9VYVh$Loae zB9a90LD*U?q5XHUdhwB&IB4yakp(Fe9*Tf9Pw4%OZmUD*Vzt#(RSi$|AvpBNR$Z+R zeVA2y@csODR$Y8?s@&3V5Z85rJha&HXpK2%vsMAQ0h@{Z?lSjR{5+yc_3L{ z+yDUF#y38FCeDnfjNGSJCWON&--7qysUwHD9=)QYJHxY82#N8T!l|~>AP5yP^S3wm zs2l8SfSc?1`WK^|B!}t(nq1JBiWw;dwMW3D4kRS;p$h|-ux42OPA>T5Lm4UkIhy4^LnK?JQV9v`?#ENV`(H^mPGHlcO6>>nUo z^+*QC3lwQXsGsP*VFa_Ze;aM5PF%W;i`aWjzkhhx)8=!JNkI{JbK_A)TAQCAIur=? z2m2ty`jJX80O?#TX?+7sUjuHc%UekqnayO2jF%t@_$E?yF<1Qv6@|iC@Sx#4!_?Fi z+1)u}C$9tyRoKmo;P4lp2$knkRg08=ihPpZo0AGZA8VDDv4u6#1 zr4QWPex`C<_PAkOs&qfm7t8db1j`?DTUto#Sw5rp%tpUo_tpe!zKx%s9>Gj_!}HTU zOM~Ad^-j{pI0S5j&`ACw?8UPGpY^eRc|;~rnk%&i7jhka)HFo)Qo?9qa?$FE?}dR zo8Dm~$-LmwO;dH~#~n5XRWhhWrZAr~Ht}W7-k#6f52I7s&tqv{XT62hkN|Z6eS(1h zR`*ZP{}4tfH{pGpCAH}Zxnx=NPhAuw7G=9elN|Vm1GY%LhXI=qsYrP2TILG`S>nQc z`^Y;m9ca_VhL_GFw}(Q`K|n?&j{Hm$(?|d5B-HC1~8`L94VGOSnc% zCo=}n&*o2Z7^TfN`^beJnjU{RX0{ZIEl!y*pzIc^mk=sKZ!FIBf0+6TsHmc@?Lm+Z zr9nbLK}xzC1(fdY?(UZE5b5r2kdP8^knV2j2I-vt@P6<2t$!`?&fI%u80PMC_TJC) z?0v!`W@89gQqb|HoVipfmpM-+)o85II(t715 z&q-v^gzipQaYG0lKQ#prUh{97RdH$@HS7I))=GTBIW_`I!E+y+-y%R^5Oj|I_}Qg` zm5W67@+jc5gam@04w0P`@8jZ~y~wWb&2JYF6&Vk4YQuMpWCq*RljyrVFm}vF`<8pC zGkKei4`+(}RbL$_GkHVLhoHZ9Ac9^mHLX3`T(nvBT@)}JFFKPf^l4?k@ubzz zhaK5)V1@en1b%4tEimy6n%onhRw;3(ggMG!n@OREL zgyNZWC9ETSJXhXNWvy#j8?WK7(~8LoG&2?b&oyM=KrV5KsPp{d84a2X%#ZaC6B` z-O^Rh^wy>fnO(e4rGh1lV4U#s7Z?8gSNw6VuO|f&mUKy6-1)py?7#z)qh>>%F>wya zJhmzpX{-SI%Cs3ZlgeE!(tXnX?;YKGxb4#W@Bh9ZzA>TX_-1$ayiaItkQ0mF=gL`- zE*aG7x}9J&RobvhEiExQJEN5zhZ{;p^YX#E4giJfvQ2^hb?xAa zHIItR9qmb2y74j}6y*xyBbshbOi z1Vu&+kZz&8$E;ilcj zpEyaK@7Yzo@)@9XyAqZ*X67_{JaVQb!AJB+9tY?@zznZ7i#1CB@033F2@+dKXHd$Zvz| zyl2e>*_a!epJS%8EEU7;9-(u2EPn5pi{i}L`f7XR_V;vnblJ8NUq80bs9KHQ|HG$M z)b^W8&F+(?#Fv&AsuD(S2s*wd?;x)+vc7F%Eu$$<0fo_89M-caA&npMu#xvmrjI`I zl8G73_1L58bI|-Mh40jwyc*JqR0t!1h$)qqcMCYO>xm0n-MyN@wm-Zh#PQpL?H5wx zWngp1`7tphFW%GLa~yWpHTLX(vHKJ2Ujwt=iZ*vjer7Gj6lrbp!A2N?u~S)9cPP<) z{tTy33OTdHQpM}lj})y$w1vk_f(TZg6)Zd7qq{^R>0= zJr5v_YHMRpF6svt7D+G6+zBNspodbSMW@AM`-kg zot$geo7qnWk2sGERnIc%Id#6x?YK>H`Z1hju{b}Engc3hsc5`kund#m9xX43KyM7c zFYNl@U_q4hT?3Y7TOz+7t2&ljF!Xv_#792-pqF;Y5zlew>e6n=Uo<0pdXO~548 z$1#MiOso$t2Ym&v$7wqI5Ji#72V|`d3$B<(|VfCu;KTB znL~q~KY#vOCL|?MzJDJ&;O`hMjBbXg1>_2*4j9C2$aSV8Vlpz(JGb9K{{g8ifs6^Q zB@fQ{v29BTAS9*TDiAcRn$#e__jG;=GWR#H zS=TyP`v5`b)CBdkYD@Jp=X`$Qxs|-vbo`4N>~ zvz?@B(HDa=@uCXLZov8s4zgl(2cg5~M}=HlO1oh&RXq%j%eZOG zc}qT9niT^~H$;%JoybyS<>P_+Y7J61oQpLf8HCG;m1Wml7xrKbSFfrJ z*q?<^a$fwj+FFFMU97J<7}pnqRvOpH=|DY_eX5NBv7LJqC5vn0&_rJXKutQgBXsiz z$a^cFcU8yb*|i8It8f*e{bK^lYyZITGsySL_R2{wUdOG-?!Qt7!m6HakDp4rVJa=y z=9~u)yPqCA3?V`hExbHDqtFXC{a!Bd4r{`e1{H&xlV7;n({*C)^fv=o2~%9~s9)pcrtm-TPGt7C97f6QF7k;F8^~?q@v; zpLZ=cg-XdmM<$S1fd1*P1q8@|0t)}O96*#*##v6 zW@kl4{}L4MWtyq1tYF?P=edus33MS-zC#Ly5=u_S_%iN2I66g&@;R8ik&yhXdt-(S zdUVv7-x8uDPEJm)Cd9PpQmUeq*6*8}niiS;_)@o)4_y>uwe=A3@U6d})MJ{RLXY43 zBB@tU)A!4C&0qB6SGu5}&%8R3tLBWWRdtNW5m~<2$HYGj?iwo8t_Nc_zBlT@RAC|e zw^^$#kJL?Gf0@LPS}53P@%4XqqM5Xd|82xr&q&{Rs5@AOOaJVQpQgX8rS-*x@1BW* zlJd}?-DY~R4LLcwdnDQ!HgY_XOR-R8{advgc8#^5x=a2wP2`KTbd+@6z|<6;fPldD zUo*03QtrV1e-7yNxUB5AmN~VpB)!ojT?FE1FYxf5tE#FtwX^_$;2Gq_%a?DCBErMJ zwVjo4PdpympWfDCj!@U%1hbhW-YRHmYsV>$(?(zIQv6s6khB>VGuTCy63}be=-Pmf z`%JI>^&O|_g6PWhH2H&oX{Y*tPdtc;V_{xD%2yB^+cP9v>Q?Ak+w#@b*>9qf&knUH zicm}#Kuf1Ii2<42yv5rsbi{S(@V37-D$9K>8;boUzP$UR=P(@EERM0p?Y4z*VblmW zi@Uj{8kNF};$k11$jzVzL_7-&=r*lt_AF$QxMjsnV#Kh9j971w>)$8p)MTx;W4GLR zb$r|`UrDn38%}EbdA4)`XH+3qd@WOPB8w-9#_Mt?CJS)7EU?bU3~KL(&dFnvS~-u5|KE>5GN2Qo6-!sh^eWmxwyH* zP6xl=+Ac{@zq7QkhzyPwTs=69seYCRw^c+&Ym!}~*H^~4e(`PPbvfbn&PB(n z_(-ciXd&(u*pUrVylvE@)VHls$d}J)H%o@y3pWU2C|csUN*dR*$D0Pl-fE{$%8cH* zpPEXZirpN)P(k;)J`-He-e(>!?T7|ylUgQ<%}*^`bdb-gGv7=)`pregEWPd7zAu)o z7q{_z8|LB50;~Zp9v%?kV{eaS5zK_tAt^;f-xOGM-2=8VUiKSCJi!ycv@%2A)g<`I zuy1JY+G>(n>oy+}^L&y*P&c5P>&w=r0R7#HZb>`CZ64!*@6aTi2};Zl@*Agt-vE(l;Na zrUQTKUchDN^j!y60%S^7@C=>I`&{15%}t2i2>I-Qw=>zfh?wOQy|?#mifIp~9~(y^ z-?(x6mn-i(os5$|?1=j@pJRz7zY;61OWvkm@Hi<*@0!>iH zVdeU(mYq`%wV#00fz{pd`0rl|i!U?&@d8NnY4860+PF0FIxJ;l2CX$ReiI&yA$0Zi zeQDJ##UNybbhs!RIQ;aIp4~ECdMWvN#r7^1@WMR3hsgh{1u%qmV@330$?%DNSTXB_ zZvUV-3aUURc^PrFAYgRKTb-9j8o`I+vu8v*c2xe=<5RgP{=A|)Lv3YmV%8PSVgmFi zHBMe0KSNjjI$0-6dVIt-Z_Fp1!84WXxc8868#PfROUcYEe}HbuxI=6Q+K{_U zl$Vw>S9Tz-hOIay{gnS0U5Vt{v5wq*sDohfEICSW$Ruyh1oGnIw^0P_tc01Zhp6d| zBNf;d1PS~R($k)KQ3UySW=TrZPA)E8b93qk?eC+$zEdFOp`w?xsi?VpxH>(X(Sg@v z%Y8iWqgFe6y!*rDj_nw)(@R9q5uw;oku-GAb6UJ28ar-(NDvT9a{IE?(CY=iJ6U*m zI0S-2CDRjhwhdGpUzO)wQ4Z1ju?aZWJ?%WxfWY-&{Hq*{C$JLE%Ns@t;L*?&CWIRT zzX;X3O^wUpz_sp>v_(4Yh@pA+^6Vje51!%hPU)Pte0(IC+H+5D$wY{bjE446U;hoL z6}Mkb^8Pm_t*a|_eu+5RhWJ*x)4|zU6ch(P;|%&%%4x$4BVxLqgL!79T2Eh2U{Tz4 z`3bPd(2j`>`~W!Dv_-Wgj~mtG44XzIYZF#Rl=lU42A1QMuHK z3%0NP-VyOovO&OUlBxZS$o*uby~x$PUb+3`tuC&)*z^N>mhV27!6T?(d5LS(GOY?a zTkq}fAA5RVK;t%g(Y`$eA4;^RLtmY6@$vuO;iR~o%Ts+pQgJ^Y6F+?jlX^Ov2EUt4 zD(Bn!nrJVIGUeg;>Q950)(`swhZ%cM13LU^CFN-~D@ZbDPOQajxUfyWy4^VY%;1~A zP$E4CqYn8!A9V@<{zcqQYUOFLW&U(M?iw1xI6OR*s$I!P_V)t|ItVG4@A7MEUgFW& zvcNRuYW@`pv9|H>@`8@eqsz-StgP~w%V6RbPg#5t6MeJ3@g-t?!ep?w;gxkL;T-}W zpVsJ@j=*rg@oiK*&gua|pujodV!~QzCZFu^z!fSFqTiU)`I$2|MoB91ozIC}9{l_f z?b_}k5|-?n%CNUEx&==(McNhl4j#>_Pjdc z=bWA$uiw6cOx12bOdQmLEeMS89`qdO%XW~!ZUC&Hs9?@jVGyJ7ap&qT!@r?n^+^C1 zlhlD$+dzdp>BPdBrN$Yli*h&;p9Gnn2GOi`9Us5=A;o+&YR^mjBoXArhV zusvwy#&L1P`ffPi7c( zE0+J|FY1if6nSLTXuDE|15M@cKzE^<%xyt6tK9tP$UrUvWkx3IJvsDre)f<`W@zsJ z`?G;tkJW_MK;zEmet*GMRqEOC8La_v^nkk}6AjR|1axSn^_72%+y0#nBD5yiEV9WM zj?kvV*v|ZYz$@67hmPTz$TP2@y7EQfkrA_Y^M?ukCi3i>S}B*Vq3Lsv?k6q^`2j)}G^1 zRporY7&T`zoy=rUAr?ufKj>fPt?B}A@vmN2?Vt=u9lYbUL{-GpfHLG%SHB1f3ZlB(nK>sc8!Q9U7G2=A0mw1ldSr3wZx)!l%%*qEIq1!HxSLK`<}c*i{Z1R$Y$V3$2+X?dqtlrElNF_ z&+6(#m0HcuK*Mhcw00Dv3ZKNpD7d(0-N+~b-_PW{r=->F@Z6(KXR%0$R=QtNU5IsH zIDYaQp7 zUpzco2rVzt8jYiVr#2h4k9b*gP2ZNYla@^3M2D{HAmUiUOIVbeKN5-!&Un`q!HG#T zdRnAXPEFr4NA4a!LZM<{e%EYF5cjsPg!J;|j(Qc57R5YZ%HI0EPJ2Af+h@KK??Bu& z>jjH=MXDXaa2ArD)hx5)u*GV+)jx=z3?2EQ`T$}*LCY;Z0vpHreenYRW0Yzrg3W)*mwsD+f7YKs z_g66ANq;Lm9Mwddi?l*^h(lIZcCpDGKBZ6mIaqUz9`A2J-$gNZcW##WnE6fL%H3VZ zKchJx*LHWqK89fC+zu^tou6}WfgWqfJU6>s zaP@n~gT*4B;G8|>Z~Jivj0|#+`al&lJYX2ZPjy5`OWQS+#z~5gv;Fw@WF!8m;d{kC z&g%T~15A2(%Kq;$LJ5uQj4`IYZblI3MJEz%QyfB_^>%y<4cGjpq~QT7|&&_hIM#bQ|FBg+M^lmFZ~}EnOG+gmsTOU3i2 z$1Csqhp{;QtP=Xm73Y+X|IlcqBAdVNZ4)?Ec;DVyGKD5{7#WJ`?n~VnD|+`Zb$W_6F&cAwItEbP5*nVo~#($vFC&~3APeu5tbUOZ=q}! z*b3_6_3i>IqWHe!|9m(*uDlM<1lUU7n%yn>)0^su43T#eXXvTr;Xp!l7rG&}#sYBB zoY^~Wi?$m7`JCuff3XJNI5|4eU-5=F(8~VSNGMv|b~qw$LIGBKi^?dxX;%)K$xI`n zMqGQcKuR#_mX@^~0j1cAoAC6l)W)ShV3$;uLm)h2gXL&N2lHoLU&b>uKhg5>>pPr} zz6Ob!GxzQ8DKt-Zcp&U>DY;R>sS`4JvUhsFVbpp7-Tyr7^ChuE@f2w*7Hg)eJ7j+b z4kFUniwz=jAuuZ1&v8A)c1ho(6PCB}B<;w2!{keI;y0R%Q z{B4=tn3*WO`d@Yu%^WO6zv}Hb^Pji1di87rxT?Cb{k)mKVKX{U7cm_+T_n0Tp9DJ^ z)n&U37qz&2@;eF>G!)hpaXv#`u@3bDdTc8ym0C0c9X<~{pw{C>T))f&{!4S5zEb5f z2m}aLmzZsIq|{RF_*0~=czikxj_;0!w5t758Ch}u#$9KHsl9AQ)~r1Ey(^dw4J)_e z^Vi$DWqe1)G__Oq^kq`5zhpPzm>{La2t0vA@%jMgSmIOe?`$q#O_QZAU_{BTgH z86Mluoeq4)d`Gjl#&gc$o19K5mUSL51(H3%F&M-OY>%8~k&?hzxD!uLFoSL%k? zulE}I{PTxOt(#K@@kI@=-{4*cD#O+4EVk=o@XD&piuR-*SRt9 ztH{a8;e+-!ivcJzdBQWgJH)NpDR#et*;^dAt5!5yppE5pnZg&IF+nHwjbq z>2*#K)cv-MnIn>2#6^9-$RAs`id<)(4f;v!&K-5Iu3r+tE~}?GVb;PzE-Vx~y)om0heTJ#!n(yBA3B8++{#NOdbM}MDJ5F)o0B8e2`l?wuZdIVh9vLceb^*HwaApF2L7j|!PSXFbHR<#CN zI&73}ezNeNLxWYwYVOpA8?L4Ne)8X-Z4|_>xcGgm`~{r|r$ra1!Itd6zaiY)WW#_-HSJIV`WHhTJ)cV1zN1dpn*Ctf_C~5pHqfL|-5IqSvg} z6+fL)N?hD5HH{HcP2uno8^-z)*v{z)tLXt*Jmt-H3M>A)J{Af4me-@Sd+e64$#l1o zSJy}WOjd!lH)F_#1+wgeoV(2Ux8q!Dmgh*#>$xd5kdwYFm_IOqbuhn9j^e_uS9Db< z5DsNOCVo{MmEg27&& z;lxv;6xfS<4kic$>}3=U7_=T}v?ySSB_yLBuWaGrs|S5U%@S+I!L|c`27c1pXjCMY zw7Zk!rDs$x>tcWgi;V5cVGlBi;CSRqM~%U z09sboi8s=3H^xb=Fz|vO?)V^`iFBUQWV?@dDOg?#L814iPd~r8naQy{^{fZYwaBmY zSsr}W&R~8czG{9!eeA6J`YiPHeg*W9>>mm-^Ah}CN|}WC_!!X3mVokI$&%8_modM4rNxw; zqxw$2?xiUzYfo5P{g%eZ_~jWDk-lhI9%Gu0ecaem+hri-5i#j?cT-mN45FZ*&^nyS z9|3w}v0a?cKOHjoJ@LVo6*`cUGgaNgIuvU570{F%8KUNH+FU*7nbt?5Ffp{~wQ$fD zRo+^s1@Vh|#o2GuWqr9UR=nHrZ`k42ORDrque_@k{cgnMm@z#eOdOk~<&-D;y1nIr z`27qiGV6MdfcR^vo2vnwp%Qz+-ln0Mx^}dNQn2y@tWG`BVC)fDrkS;Q@VG7V^kGKd zAc9wE0bWdEQcgnw5wJV-3I?;${cO1=R!*21I%*Iv@i`BnhURLS($fGiZmlFyWzH~k zIYr2%>>hNdq$b7o%HS2i`LX`+za8B}t~Ayw;0Xyef-k+_Y%k zjy5hX;W2FM(NH}soaj_rr$O=VxwnPw5B77Lwmx~1$#Es3n#-uu*a&kjRGBIfQY7gS;-q3Hvepm)y_Vs$Qn<7$BP9c5< zZH#_4lzswPDKD^giIuNd*hg)tnI_d@>L|Ozd`b&yR*$c)q?kOwxLot zYvL7ri>ZJ~s#xE_kw3FaOQJ!MYmL>+LD0rz= z2c-sv`|zS_ANSH6`POlB4GpR(4_P6d(e)!QNO34r4HOV_R}`hT)>#DI;RLighK;l~ z#CWEkTf}LAa+(I+F+Bl30RwI^4SqYPT4+qf ze$wL^*p_Zjv67LN^=2j2By*OB3|w-1yxG1hu#H;Mzw7Jg9gv3VZ)R-z19w_&N>r*J zRk>I#X8N)hTnPdrj_Lkmp&Rz91biAgh#xJ{G&CbS)=PH9$Tc-nf3G{F+9{k3>6zhO z(cvCZ#X$6!2!}ugigt3c9nSvVX;T>*nX9v~lKXRDgv^vx!i*y=5p6lbRq#W%mZSSG zly%-f*=s6wR4Rb)Jg~6r9vYS@udE0b!-*`V%?N{20WK0eo@$tCnwtyLwzf92urMlI znVbwQr6pxy8O|=12m!A&xmBplf!B0yP@A57@QqGNis2%=^p9?KB5gI69-1vJ`_1lj zzN_J_0dFI56T?)Or_`ywezvIyjkP9t3|={!jUKiADFE3`^U1ooO`t#BM~QERgY?&_ zK8GZutnRA@zvMQIO;wkdm(Nbon~a3_Q!Z0^13=<5PTL>1JlyAbxw)~aso}sOKdqRB zp#CH7nvb0w&qAZO z!1D4hG0FHs!MlX82d^$>y+^O)ic5(4t*y>E35j)}pj%kh=Z@UVB0${}6phP-20Y*5 zp{}i!e>fA_65N0C%A;E=71)IQ^n^1K13kUG{Xb8pe;V{uL*gIkx#H{;l0g`Ey89-s zKz?S>3xmtU+q^J^Ka!J1sY=>#5S5;xH149ktkm*TK!ieUR*aCdpILZ;^#TPMZ>Bve zuxw-{r0my%x_r8~z~7mxq&4>$(J5BG7VOZy-CER0qz<%+dAG$ZA5}mj*|UXJ&y9e# zlT1Fs^^PMioB8v44uE+AI26?)gYc_VL7-e%P{7XcLF4^s!!oX=vJME+wt&3>^?3Mi z9((QJMZb$F3-+!n#E2BTryf7!F+PFMi?S#kw+7)L<%>VH9G>TrT zGxdXpjYpm#otXH<3j3OXt>yF8Xn7eKGfQhR>4cg^uj@bZf4Sc^+J@`CLa)fBp(dF0 zvYedxm}3_LmR)7|YI)rl`J>G1BO6}u+Mvab=Q@`c(CJ`a-rO{&g@^l%P*sOvt*(r><>z&C5v0*cNdsmY8P z7+N3p6d{U=in?7)sm6h=|5SgDkE>Q_yt9EwMJp;=WgBNJ!NB61Tk{=k`o=+;ZK4Jk zjHjdmth&TvXwLd%DVi`>hf5NQTs&b+o8yHyN$y04y>ytU46R-Q!dQjX}85H zkRC|8%Wc7a22lt3yQ~YQ0K*$CWInQ;5Mo$-zc1p9=yN2;n9XrW{%$P!%cgnyFL7W(D103{Gg0$$2N8RtE>Ib8` zD-Mtr6VE4M%URw6)$+5^j9ur~_Az!RutzK;>?`E)ayF05W*^%I>z?&FXDpT8Paqo8 ztz%gktYVnTKfqj&Z6W@6Zr(aX1dxGzMorzyg&DOcOy27d7|YLEAFuB|$jEHgY}hXd z5y%T_q=4~Zd3$GAVZb@yle{dxLF{~sCWE>J^HyYSzqI2t$9_Yg`RXX!Z1VlnJLD#+ zG|}MxRr_PjbBQp8ij3}`Ch`@WG?dB{)3@x-@N8{49;IjPG!v4qi%?Kk4+gO%Xwe1u$JH){#NhQ(%)lB#$9)A5C+cbPxV;In&Bya8WlNWN*fmD4vd#g9PT+w-?6n zkO}5S0${n#E8DQs2P~Y_DX}Pai`JWBzOiCU4uMp5+WO0uuRDV6FnxnV9*m12d=o8O z9nKdzL+-<~7!?D7`H1P0-;Kg1Px420ANoZ-?g>Qx6()TK84GadJ>|45m1-c`6g43_ z43&tPU>O6MEr6EBinu?=z(hjTQ$F*xwMw6x2WK?DL3T3T86yNQi_Of8_V&Db4O@}H zy7qj{|A_X+$Jv!y;r6riFA&TcxGJfPVwU&y_2sT13q=}>&zpi$H1b%u&#a>=2F-rF ziMD4}1#!PE@lk0k6^~LLrY~CBp>j5rzQA}zZ!CLuk>7)~sGw#1?6%DIU8V`) z&l=Q-8o5QmtvWSqz@Ng;Qnsq!eVE&UebufVSuXcZvg$$V@}C%a3GBN}GIB23!Q`$c zyF**PBt`5MV{)1_2t{+@pk3E2Gf8`?b=G0`x8GSaQMJA~@kfEgXm-MlH6;3u!(4n8 z)m`8^cg}QjvbiBwDBCjKob4BtNsQRUL!+z**xzz01JDamv%e8o=sI~e`aQ`aW`E1~>V0GylPx0_vCriZC3JA*j$ z<~5}$WF*lIwZc-d)lVuvxX4hehah(kxq_)?3$FxVg^MF+jH#;MjMIxxxAskMKVL0) zWN6(g4Aw1s+_k{>j4D*5$}{TGNRKY_JS9D~^c8{=&>SjnC+%O}sPG(rsG%%%o0oj=NJ|YA;Wca|>Z%|u`1xZma<_+)nUxcz*h(3#?ewH|OV|X8w)+Y| zlv|IG2+afa-EFL2aa)srZ6T$gZRf!%Mt-n|mvUG5?roZXfSp znmHH#%dCq#Y~_Wu?*MM8?WA6_Y;HO8K~{_AQ|;E)P#OR$8Rgckr%IKt&nIM`JRrzg zalwwv*wWljvDn$x(9_7rlAlPpXj4Tg#*=m|oUnY8WRA^NIVGjH5$(7hFd&LklfU~` z?Yn35)nW{a?!f6=jX30zmpcFbtP8v}2(N(=1q}L2!h{ug*7;-%vG{l4?&kh>*iTW0 z@_f;U;9HXjo1%sU54K58)*0DFQd5>6)YvkpP#*?FDrX4d#OSx0Y+cDVO0~qF6+T?W9#-W?8Q_;(Rh{*k9LA7wtmJ$r4_YG(;M_$6te^Obz+v1byfxK zKeELps`WpvZBA+bqX|k3lo%QK!$p}U0I6B?bH5}2cTD%3uld~i_ow5F;S8~Ow_psz znMidH>nJKh*CRGex7ItOPB^i;0k0)?Ps5==#mqKZHP+`ysO)Z#yqh|UDcTyk9ndSK zCpzuPC@|hz$n;fUb><%6_?bZzHYSq{%9`OAWE*3h+^!*q)Zc1{O=aCL?<%`hK)lfQ7~Ld)Chf5dE&yWhyzySK zRFHVspxIRR*3X{5e$0-nx}Bk3gJJrvO!_DR3J;od&~k4|WzQ5|(MRdGb)-HJ+qtXu z#sOj$;mn(PO!yCDap!=KWo({%@Gj$eQ-9T;>DvaiUF^X7V>&XTr46cI2>Ck zz#B2y)bWK)2AzqO?!3+U?YK%u{(9RC3mkTUr8^Zt9P6v)-*we}+`C8_vzhY9lu zr*~5EER{k3TS`5X_L}^GN!B@6;HY1-Qyo5qp&JmX-q~s~>hc~3&)_ji`oTsqZ+>*t zr%W0|f5oNmpX+t}8wBS7ZVm9A(d^?#5aPNQ-?&vnGYtiZhY2?~0+W;f zb}j^{_N##3m7{ITnc|?JTu0YYxiS16k0aKtj_+N357FkY%vsO8&0C9{qZL#?w}x&U z1YSH^ln--Jx`-AKnGq40`kBoc|E$6=MEStLJ@khw09=lA;8;F>%CA$s`~4ifEd^;4 z*+a9Kl;|yASK1zm_x2yJ-A+FWpkM_8wJc?g6UeJH15QJ92-b;wcbscCwyX;0#}DXI zovEzl^svlOs30}C6J$W4WB|bKziy0thE}1F>;=F2kLcsyGy&ZdFgPgn)7+jb0M2?) z;B?zsUM9R-&^i(NIx4C=7|H!nmT~wc?uTi?I;Ezj)$_k3YkePMn8Tj_kDG{a^zi!V zTD1F3to=jO?35?UH0_-pSz@ucogcm0{;nmBPVZx*E%WtGI7`pIN7PryCdNvXy>U2pmO*RLI^;PxD-Sq28g7xQn$RkglL zuMivSWL`TfWBizz{xvXwR8X*)%j^PP_u3VjfxCMFuw~Fch(t$6U{*&nL|1hxd$8=d zWAAP%P}rjD%bZ3B{wUwXQxsNlVQIe`|BMe`Nbt}byQv~}( z0!eQCAglS!b{A_zSh{6Z%0B!ORkqU-yG2*cI8sYXEFc^y#;LGN>Dqif%i9WpF9&QG zE^p4WC1_d&wmN1AyQ!1l>dQYfVYWEhhxuU-* zj{;mA3~A`(0wimm0Z50i8?Y*5HT}l1sHMR@l8Yt@`nJHy?6vW}hGblPHw0XXhndHB z;OxpS{tfF|!UAA0#1Ki&+ne;e&qw-U!yGI^-qvV9eHD)t*j+ur&&hEvyXx+|KAP*} zb<{!jcVtu;9;AT9_yr)os78(e;mZ&8lRddZ7^$hmq7zXZ@Yy4~?hdJP3f`%^i0Gnv z*{I6OJf|-q=N{y97X_o3WivaNU)1Rt;u;7Pq|N!f+pYwv;E*7oA^*u4tMg)aclY79 z=L9&UfgpZ|_{GM)u&+Y`Fq=WI>^uo5$;Sgkmw~Cw^es5%+5m|bVMvAZ*v3|W!z;+^ zW!5QWq>$HuB|VD_1+d2_QWA>j=TXAMX_WS#R2KFA^f)S^2dpi_t#({Kc8$H^V?u}4 zkVP^tRh`sq%|;wN7Z2L&N41(gXXdcFRnsy>-{I&2H+dxP=XpG_U!92*t2&mfrKGN_Fd(%#f-FZ8>+fsv^{T0UUBH27bldQVO405EeJ#T0VEcw~jz%7d} zME0v8`3D|}jOge1ddm}Wb1*D?nrR)pn60;R@Rmw1^exDhaAzS+IhG|H0IrrA) zCS_(fYTgZE&4yyx6z~U;O&rAh!>L59g&L$W+?r6q~r$N)fot1gR2e9#7a+=-c zhV9Bq*Mj8Fs77$NHdv3k-fHhl57wtzumu&PKx;|9SKgWAVueBp_-(MvwlozKuz^aK z$=CoLGZAk=)U&^bkoiuw1)p3JC;^^w_d;TrguR^<&Ga1)Pasn8FRtkT=E6HX@u-XS zJ94VLkmu_fC8rZx$M~7JWGlA!MOjBMo1FWsu8F})RmaGP=!J2>O06H%y}pGF!+hk7 zvS;%S@F2?`>&}2rd{-$<#hwb}65mM8v-HjTv1`73O$Q|N6Xl=mq?JG{4RjSRI+MRr zsUjvb@aTUp*dN5(*p9er0~1uL0WOrt6>yJXb8b#ie8jIL0UU|8#x%sEsZ}orSy$GJ zZ29#xAAt-u?YrI)fPI27Ni7KA(IHSTd`VDYa`O1|IF#sXiX&`>Y1r1`*@ zel{~VyY{CutoKdkz|z+=K~PNLWJz?YnEzP%&w$0JS;Gm zMoM48Tes?!ExaFkW;loZ7MkCdUHD3LK2YQcd-2yd{V7$o-iIol5AbVy zQyN}h>DB05f8Mwd^HI(wzP`-2#UiPY1$DWpQxCf7!(CHl2l%<$KpH#JfooC!MVe_k zbW0=MnB?-4M+bdWujlXA>>uG=4C9^zJ00^L9}y(7c_084j4wE!O!e8hRHLxwdmRM* z7*p3T67Ry95H0HA!DHr#_-Dp#iq^L6v?c5pO-4-Wp2brRO<#9H62%@rM27hK-BG6& z1+liv_(9ljQM91nVQ61J8Cr3pMROS)9U8Ycd%C5v3C13o&LzZ)4DeSRnp!_A<&1ty z+1(pzTm|ObUMU?ji&x~3y*?c2e)u;7ba_h%1dzztRaF81Raee+5ZJgl{WUQ)9ob%7 zzZN?E_fHrwZyTH1KiWFNmcD(@(ai08(g~QGxQt<|c^XJN0_@KF!>_{zxFpzybQ;X4 zrKu^qt*xywiJ0k5D+?F0dX(h&`4r7l6z2mdHTlyZi*Bp*5N?HfpK&5KRdtZ~ECbLK zfV_C>un(wT6m6_17er}kY2#8|HMP*dKm>FmmQRD{lG4(mA|n3U{km|WJkHL}AYI0r z=|V$83jn)psi-7cAsQ{l)jWf247N!@Bq#b*s8Z9naNAUD>y~$J*j$=-cW+bvyuJK0 z%u257Y4kktep^)kN$sOZ?MJE^qd_95D-Wlnl)WK1=XLupdtcI!X@)H(OcXu39fqW> zOB~Q#$iKCc-g_k|bzt5O7eEa!W8pNGOcKN&*|Bku^yf(f<(IrE8kGt3CV`bfVk2Lc z&#~j`5WZK!i_fH$RhCzm>i&npfPAaloJtbGU~IvBr8n4`HxeT~Kvm9CV}`N?-Xz6r zoX{#I4?d?X%pY5bX!IxhDg>cBdg;sI^9P+gB3InAW<7q`G#hAIw}$Zd1^l$mR@(P5 zG^anl%h&Il=BeS!g{uOp6rQ_c$wunfDNfErGF5(@$(|AJ<_fOK6JG;*NT^#a<=QJ< z^V%48ym!Bg-_tYL+A4T6GLi%H5K~m7jApR{&4`NwFojI%T|b=t`=qE!b5uiR zN_8cZb2b`?Y1R-0v;n_rD!BkNW^4jAvfWWc)DrSLJa^e1idnM}e$KR|kQK0lcJmxB zl+^HkzTu(xg_%iLjYyiqa*q`djXry(FYnM_iUMI@@NgtU^R_t8;C01}r;>iA$F>2D zA;)Udi2+?PUc=luB5Wn*1f3h76vTYzqaO(cefU1;v_3IelT%Y`i_MOJ-ohUG(#%$o zA`P%x98Iw_t*xYUo|Heh+smmREZ3tf&Yd2bC=H*Rr_-O8ME_s3M2NWY=mFs?S~U2Ir%-pSuO) znf34GlvMj+9OqA130TfKSXa#`gBzFKGQQBfXK*aoS~!hV{M_^t69w8Y0{`x!Llq zJ`uE@>ynzG4(%VnaP@ALQ=QR1D*kus|MWC1y|Waq3s!H8#%!(l=i?jb%2mQ|?G6`| zUrY_;5W(~ThF(~GhH-AyGS@dqXS3rrlkcO~fx0Hb$~9dwyCps*DGx%Fm|@aY)|Bls zzJbf{c%VYopDtHFi4u$sKKRVnNQJ&VoPlGQz>9VS>`&x;7y}=YIi8>>rXGWRiK7Ogk5t3u%PAj#dcLRX?ZZ?yfuS=w=A47~TXOXdndv z@l>!jCNvIF4X;&y=_*uvd@f)OwHz#kkvTE$-R9^$z5o`v&c3cnJFP!$|MshgU(mnd ziJbWAC|`Y1A@xS?dr3*i2=-sltpHd)Hzyx-6B4O2pI~4E$|QJH-uo&og65S}TO`My zq9^H&eBG2b-^+zVDpQgk0kFZW(Zy8yo!Iy!fJnX`a2IQ79f0^3g04vsr4O(@cBXK! zmXx7lTrAay$hK1Z9m_V5>T@1EOE7@_Ph*ddk6XbB!2i{!Z5RROc)%DfEhE$BE9USQ z@nnyX{E#uJRGa`XCG0S7D~!j}iw>!GQsh^_94mw+{&S>x}_ z%)x*X*~0EjUFMBPXIm%lgmnJ}Q%-)LK8BqECI~w<@`f(5rkX=C$W6~^8F__eWJe6# zh-Y3dicg;E`4Aw*7g-!Ww>+5JI8~4qrqVyK3e(U0gPAvt_i;GqBwF-=k*oUKO{}=J zf6S|57mcyz$yggl3@gX>64Q3HN4yoOKZo>RV<|r;e><^R;&~?kYBGWdwK9P`0UpRoGR<>Qa({Y|q6CnX0q0wuELC{G$Jd7X83^Ji!zbQVbze=}CD02t{;g-PD^VXUcmYBp;#` z%DYK2`7zASlKb{EG<4h9#BUEc%r3aDfN5U17CLc>W#5*}58?SSY1PdNxp7J2^O62|s(4K7cSW zP7CO)lZ=^Q8!nb3UY+<4`WsEpZVi8sZ7i0v6*VY^mOq=a8H!1FDQfuwFxugIZlCF6vp`yo>Y$ej#Sg@K%sdmg>^zov%9*c%(FGGzp*0 z7F)y5?S_DTV$DyrFHMf@2!LEPuiryId>^yQagKjeTSt!#9b6tDT($U#V(^2dd2`!# z1Q!UYydxk$6USG=q-lPP$<%Y!Z5%@nL?YC_9Fw6Gx(LEZGOI59YAbCwxFL3$Sz#gA zFOoYJqi`RJ95A)2OV?v-N`CsT} z*E}ou9?)B6UY9h}jSpaK&|3n1mS9F>;|W*a?E0D8m3JE#mlmHbW7R2{hp|JW^MCro zzakODiJe{CpnvcGXVZ6e9U$H$bNv4w#auO-tCZu;9bZwt z?pTC>RRc$cG9Ys0|29b8#<#SjUx09iLd~K04*44yYc;UYS_BJiSw}m&p!$=X{+;hK zw2Sjc{cCCcFfp=bWWN-OYH-61^55LFqpJT~e6vdA8xR4IziLkN!VA;;k!+ihUD(i+ zfkCUU!>wD8e{+J%jwqSAVOF>sF=M!lCBa`R)q>d?s|>5xazws{9oreq6<$;a2M0ov zZ|yg5LVcK{W`&ww^3pRfJOcrkMP*OVht7{y+3{Jh*V(aYOe>HQ3~<+bH?V&t$&+Iz z!vK*1C~_|b@@Ijv;~HCLZl>7aY;5~G!y)n7^!i>pKwnLf)esj)*=6XXJ4Tk+v6KAt z?~LT5lm;CZ?3#;mp1{R5*oY}xI18loc{jVV_eIT1D?bEL8rtDj>xG#0V(Ry0q^mV= ziQ{YZRjx)Q2=4xP+4EgN2ptFirVPlH_gSLgStsAe0wvLmUK^DdV#kf;*btRf0*D*J zDApwcN-*f35&a}hmKe|q(PPnKxqyk$#vRc|hJc8Xh`i7otl z9o6Q|e1yDfB<&G4S&!cAb0mPa5iZre7cf+C8{|Ldg*G^)?Kvs#m3!iA%h(O8rH*Y^ zCN8)@tE5s-%Nn$7&%)mFe1sZJ$;2j-(P_OP9~JWMamBV!;+A0&>y>#y}Yx%*dI zdVXmMD_#``@Wz6Wxr)jP7M~v4+|@K;Qg8-D*WTWnd>V=xrmS<6bar>Qa`4ew;sMm? zOglSwkQ)-ucs7q7w@$X7jhqT8=7RDkRj?C9P zvce=;Ab0nZI~TROi9cNL)v}ZmxGe-5nV)7zWRIqI>?{)If4;SU==AWpD}$Yz8a@*p zu?CqOV-id|5n1i|>C$oXXROlS)bJGhoxT8roPdNv9zutk801b%D~h2=Qcs)LR2cY~ zN-YC!XZ!{3k~Ot%AClMly6vP7F2oMg`{b;SW1L%uTd>sC)jJJ8bIcyK$~=E;ZOvt1 zVCZbW!STvc=v{~B;?`0$V9_aO!^GxF&&k2j^ZRppwjUK3_4={iv>PB4 z*^6c|XY7l&l|R(VLW$OmkXf!HAL)!e-*rE=EVHI2?S(SWWL7V9ES~c2rhHR>rc^H^ zd}m@6nV|PM;|DV4pF7QbQ7<+OBeQ-WNpD3*lUq73BhhRcJngNEv)?ze8D&Xh1)h{k zpy%v0-Zw0N`tMtmOkD^x;0ZkKi=7wfOGnN~p|YB@d;w079*i8&zObNqG@g3)`EN5b zQ;J+qZT#EMSXRHj0#sz_H8uKUZz{Yx(r!bVFJ6SVBi=#&q19s2($WJ%Ljhl;-a?S9 zpC6!mgc^IIGGApUB{2xolYr!LgA+E%cpHg7g1%r}o}V`k4^skd#OC#D%U3?Q4ul-c zKKmH6zGucylf`eyQPH&2^K6kr28ITLx7o1)g9e_AhB{@B(cJj>_+m21JOVJD0ivO8mqdj_{$#_;xEbHBr`A62!tgAFn@~BmwYacBZc? z{3bjBoCC}uRiYzfWA7X9+`Ok9Sk@c6GWE%Nn^cLPBi|me{HsS}L(($R zEaC+I%l3Cz+qw9Pi&=sMh0NQ1MBn3M&TlLb$e9X=OSwOBbMsKlb5wlpdOtZC`xR$T zk0Uc1pcSsDu5M{-!$G0$3XA@|5j%Y!E7EUgX)AhaYBv!RQ(OF?^~?uFx6jg#UP60* zLLR&o2&6aDS_=QBB}Zl4EZ|ppb4~^Ue|kK3@$eoeS5LW@y2F@x(WRv%rLQUo_WBfe z5#81BKGEq6na%#r8k0^`k{(L0E5?DYLltaoB@Peyvw&j=pvTo>$QYQS*HZ|77U8{A z1I{HpaI!7BfzCR^QQh9Q?EKOFT^r&e;hYD1Pg#yp7>(r8W9*#N?+zY!Ls0NayQyf^ zYTB(>4Fk?CWYX63HyAZy)#$g6p-(p5TVdRzPx927N5L@{M*_T};g20M-*SEk|L6zu z@q`Nv2lS!!OBLfT@;bPb5nYn#RRpLixIrSma&(ccw0DH6=qmD5P{o77VARk@_K z*A#Jo0TBb|KSckP=XS;zui%T}GVod(m%h|Fqt4VWCAF7I~ ziZH{!pSd%+zkK}oKIcioss3F_O?Rt0wxKZG%tJ9v0KUzJK z+bsR~z{v%3gS}>Yl0X5%#%D=ka&mTlFTYImz8}s_Hidkie?cKBO%CAq_yjtZ%lYyZ zbjgA)+AJZ#*zzK+3~V8Yq+|gA-ld~oj|D72_>eS}{l2?>U|l9jpSn6ZM9e@BL174s z+i_k_6lNcNR|<~<3X_QNF*tW0zm!E&p0QIXLV98}=XdL$#(;D{jp6T48rSAJfw~db z@J*q?$crB1X7>+|m6u3Ox5vUW^d=1t{qFn? zg8{A`Af*O=``!d2CBy5o;GmY1R_|?2W>p0(pTu0mBpp`UH$QMsL4g}kWUjS*;B@=C z@#NWOW98lh-_t-j1jb*Y zXk^YP<1S!`dL!*I-KAoC$^WVFaJ+@&JXVg{a$yTbb2fNkdi+=8<#>5p=9-^{5Sqvo zErnW&Z9Csuz@0qtJ6`}!hM^>Lkix2ohr#+QBg|@v_gYwO^a?`$aJbxO)f`?Wd z_nW|twY1MO)$iZZt?ljCr1;nAdQ41iQTlRM zfS~S%Tg<-4HvmN>NPuDgAeJdI)36$Xz^MA6pP;6Gtylqe3JmDZFL$Cr%Z|mpTU&eoYnS3~%D&Lv+S134m%FEuXTM*4>fzaQB_(}1} zER;YLhX3t-(a6h@kx>OAmNAR=n|1K+3Ii*ZMIm$XW#{*-@_B)}SqiTn36^L)X{)sT z9o<~Suktnl2je~evBz0fZ3d+==Y3&%jF1Y?m)Y$Z^MRug=kVH_uKeIxlm*NvRE7i@)pu)C{GE=6{buBwe*PR zaHyCi(&0t(Lm>5*dWR-Mvif&p{_%aTD5+TU*pEFTU{ zW1b+j(ARy5hGPsN&&cp_g-4IVsA{}G0v`_JlH&G)qC>$?Em)mB0%`?h3Z2LycF&OX z-+aIARVip`!#E;ovNAF-j@J5_PbMyo)~*kpPz!ts80wmL5?5Z=)6roS6Qcp~HtoJ= zGogUaf(;ykwGP`c6KO~GGz%Aq#yN6v`H+~1pU@rr`7_nSQW$@Bc6Q^63#*XO4RC3` zR=)KmJ^`T_eF`aQC{~~@5u&GFpNc*Jhqb9j`W^*Qi=wmFOY9*`td9j`^3{`s(T!$I z6-s%-O%h#i)6@%ZDE0qvA|^E$w5np6U6B9TO%Tn(A|#7VPofmj9nK!g6zCz99Ec@| zgQviQZ^mymhg$s5k-?=DudJR&>0a+U@nSB_I9jbiL-%@fee`R#VZn~rgYX9k@CR(uNAcI0oLD*dNVzx4@MH0DEQvop%XriurQ~8K9F_9Q-!^^F6V2r7 zfS||sV1O{NM1^dCnQwi4J4DxPef=I5KaCN8h(Z#RKQ87G22I<73w9tJF2_;yogfV-?FM--)FD&}l8Uj$algB|JT+ zUqaB_D7}Zl;@i1p@*Fp-jA-WdpTAW{n^YVNh>VN{{W1$W=m4v_ZHUWv-=xgqt1wO6 zH}gkel^KSbx1aaT;55oAF7|qm2FTP3GdH&UBxa{FLuAk7SXt@p?R!D=po*d4eF}>^7kT<#r_M2aon}g&TaYJyx zXsoB zqM`?GZWR{edu0>Y?`xq1rjs2R!P5z+pKxX!U53-+(?xwW8|B#^K$0LV!KIHZZ;p5__n8Z4AaGL38VU|47k^4}8TLh=@6UBaUEB5;FyE2j( z1t?%b6z7QMa4yhx6>Wt!V3U}To0o^}v3z5Y8kl;i`1&~>lz#e@VY9!gWyBlC2FaRNtogIYEMfB^6g#fet)g|Kcb zVo{X_xcs8URtP+=p%uiPVB~+G90EqzZ8jOg1A>pLf4n$kSt;l?o(*hNghdgD_AX#r z%KI1*V=G|g1z-?g?De@Fp)du z1_pxBP0PsmKwiEv?2mX3ro2R|IeUkV@Zx}b+POVPk9 zvWwoRtuMO5Rc~*zi({K!EkDU<$f6m;u!2!zSj-Mvl`E0^k1608Nb-h7$28B1vUyZj zEDk%I@UY14>^ALw(cQMce_K?NkdKMFf>e?P-(otk`77mx!0UeDqcpu?LEP=SUq<8= z9)j&aewbHFg`NrtwwqN>K@gtbewm<+E2bI#fZDEJCQH~NbtKcxaX;Sm;}*0}WcZVy zwwqC%>z+0h27*8vAOdZ>-?ZVTsELS%(#Ky0164?!t#QF(UF5|L8iwFq2ZnD9lFwke z7ZRQ_-{q!bRzuX?-cFN)OD1tQNofK>;a#`P@$A1_smQn1zb*u%2Tdym2a=?Vr|BpRBzCJ>(%B{T>tCnw}?VH`aVkWkBl;O6aRnpY_P_UDD_jm9|Mp>F< zxsR_8tM0t;!iQpI5qBaYBXe~6I2A$WtZOzZOS(1j0xK(!?LoRy$X|}4+;TLzUM%>Wadd&C>7~<{39rd#WUd}PQdc&! zp%wla|9(`Fk};}rK#-lCE2}P#nSY!G@r#ev4FY$pf-Z>qgl>5%hPEfgeFDdtkqI2C z8c3Iapc2H&{|kQC@7S4%VmzsFsg;ttXv|4fzSmLtJRi-n43T_o1K-9 z8{_Nu$BFT&*u}b7c}hGR2E3a{#@)>ynYC@0&+GJ~buM(+AQo|U>?YQXtds(Lu))8D z;9?mUtt3mYZ3`$NwQ8X`gs~5I!OAD2_;UEa7xd^&jEw9)@SWcOYlBSgBE=F(>YaGj z_aiI$F(Rw!?8x==tq@5;L69FQ>Sv&ZwxsU&<6nt zpGS$v8sAIOJ6a#h9Op2g53)9g5lNk$f*Xmcx5~A@HpM|e<*!?XYl`A#ZSH3xd zuHK|^dc{_uh40hp49Ej9_!FRF6Rfp?>_Fz5ySi;*Ve9EP>1bjkN0Z(21pb6$A(_0@%P!s&NXgqSE#KcyW}eKsaJ z6BBb=JQ%lZy_CW*B26c8jvLy4fzc7_(#t;u0X6^N;F;DaUTMR;DYB&+Su^>NL7CV% z3E#!n&?QEDMf962i*Co{Cs$6O%{ltsE`=guW3{yUNc`;m`ezY_+@9z?2_s*1)SiU2 z%lcyNCQY%S6e~J%tT?5jLE!gE*Tp=D1kahjf-ik+lf81>dULjcj!~iJS-k#l>1*B^ zgfum!6|(g;_1uc9s(Mx79AR<;U#(Fz zatkqkL(-?3FKcVVooi0Np2REW4Ti0*E~ske(4>dK{xm}KOR;jwFJ6EJSF9Y076{8B zXVv?+d@r2sSjgreA@bMu_Ba3!ez7*Nbt2oZLkMt7{c>nVXkcneGE?UFJq;2Unx6KX zg#v8_NUIu)6~dy6F&8S{&L&=rN9Cj}ReCb^P-mSW-o+CaA=vI4-ef5}37VG{8_hWS ziT7zDS69pwPH_r0y$i9edV-4}l3&wOA2{yFZFj}-HgVYD*fjnoE|*NO8$D1&X*i;> zT7>goI|TDdZ0JbMoBIe4kpvFDRP+>y{17U3jhjk(_Tg<&g7sB4P?l?|^ z8N=d0ATVr=KVcjxtJm@o3LdlXM)&3)*9l6#DNOGifsL>1|u?(XXx#31_@o47bF78VwmnZ$h&!i0o` znmRf;`6YRNfSz-;KTS>%-5O4LhnH7d4SqsnO7ud2kMUr9tc}K$7}C14Do|6x1t2b! zcYn**-y+9eKfzFntG}=R>(_#dIE#%4{_#DzOfBh6&rimJFxDdK`?AP=rLY__VlXSw z7vtg-j>{JgFWu;f+g6y7@gr&zp(hcB5bwNMv)S`YxQK0SKT)(52*@d-VqZ#LIKCCf zz!hg)wEIjNN*N_YJjG-d)#RY(F}m?FjQI!Fv7{hP`XFWxhpri>ziK4Nq7g+alU$;( zPGxlA%IikYM{AjQV`;829Le0}b_fINi+PK;(3{l(|Fmw))?hMqF`;DJR|WlW5S*X) zW5JC0sERgF?zmt0exqf?%Fn>328B|&Mi*aKCX ziyu5*I8S%%xo|EdC|~!TpRB~CAFbJ~cP}7vJB1;6H;q6;h7lwGCPOLl!_zx6F_*nC zGiYCb0&D5i)Gx*Wk#zw~6pSUX-ZMblv+Z*!^O)J+^a_vVY4&yo9vR^0@3Z|R05@XdCx`HO!-qroYN z7|+SKzTVUO#dmOVN~hDn&``&=g#)eMglo*t{@|fP>2Q;@AXL|a5zS(ztWTRv3KV3u zfi1W5ZG#mW_S%IM$Ff(^qzCsi&8iK|f9kWyLs&}MHuwR70fS@Xp+y6l$o?G1!o{Wl zy)XABip5doOPElPx0MjlfSsAEcw@4F;Wl3t~u3>M)=}vfLfVJ7;|II4m|cU~qy%22#@x zwX&&`Cf?^l2Esu%35BFvzlEVAaOLk^El8C7z9eJkE)fX5+;zz4SbJ;pJ7E>6fN~fXvD#0h7)L z)HdTQumKJrfb0Wo+7oX?N8MzmA>fF22ifNzDkxy^U(HKJ!A$k^@*+xdU=Si*{`*wp z22~;R8&bSR+HG|%BTO?ogX{;k!sLQB)h$9cSd`eUxeUBk{a(tVg9Y3Hk-JP_NbzO76iC!1Qw6ZpT_uPzxk`^l+ zPneYW_)IBpkVT#bEbIl1$rFb&fbP-vxC(TLsQ&VsH;QnuogE(3>xQz8?>v(^7k8PF zUHC~RVBND4q|8>OAiI}fut4-r2N*H`3m19QB_a4Qw>DVqP$JaRDv`cLRzli;K?zk* zSa_}6+B&dTavGn7@JZkSnPq!#7r)E;KUe?{vl;^pwHjqrRSHF=mK=|KwZUJNHLI6; z(VJ+IIk;-Pd0OiE;hgD9YwIi^y{L)}BY~s?jhDNVp{pOSQe}342kzQO(0zjNfii(&81qI}cjJ&;Vrw1L(*HQ;8t{y#l z)L3TOK}DvJXOQ+B<{b~Pn=ycH45XWTyfA$-ZW7$e=@CXSvZP%qi9xQ?lH95KL{ZU**uo++1LMQzPf^RCUm8`esgA-p zuQy+kKSgDKerW@8A3R`V<;Q(t`*~+-uyaSVhF?ONrNfgU2{ zy>j!>JG~3K&BNqt2g=5|eCJY0jtxxz2V-b`27pBFqdvPsXbaeIL7 zUNf2gVUG3u-8om<+#6o>)eVUM#V`GD38WgbL5N?agCkTihPxLsyRbvnw!M_=8n(Z9 z`^Ba>!b8u`?_^sW&5x0Ca4jSp0XeoE!fX!XbgFV{D+oGWVDv~acatbO|GuAmc$3#U7D_(ya~!!(Y?ep!wW}+ zp`nti@cIA(4~FCbbsb-*W_vE-{;FGML&MGY?{7R(O~pv)CRk;B;OkrXXH$M=@?CZw zS2GUZtDeO7xd?}eH}!zUrPT`EknDTD1N(k@j~$&?jSf1Dy5#cEGZv9d+EkIrE&qPY z*nKky@;_e?6C3w#{F0QEh0xS&aXq3f72bGLkbnr(n~xfmQ=M0fb2PlRqibu}HrNR* z>94G}7{=&~J!VazPu4&&7Zx!LGFzU+Qg{w8PmdhK^A2h%hVlfaB&S0aCEXM4&};SY zgq9HYDLZTk%Ocb>Ovi6NhQLj=TK}$W5p|?mbI{|Rt1ZY;+IZAzQ5JQ67&4?lwdO-K z2cavzXJ%r8RQKx}8_v_S!^43kCH&mU&m#d?AE3({%>--g#b}AIuNva$lB^~ymjSzx z<J8osXV0;cVDG(s=w#>DC5!SJ*cpEc1mM1Gv9Rt7zzNybqet&*tP{ z5s{eexXIbytVeSn_=l*oZp_HY4A_aR@9rwU)gZ&=rFMJ!wlKGMV|SOj^4+_EnHj#S zj66I(Wi}&z8tR5$iAcThjcqwdoDs{Z*2qa>MvtLF%E(EaZeHuHj&jmWI3id5*x)Zu z@w=X@e8)}y(ac$EGDyGvvW^(DW!zK@*uPpVgfQqyz+-QBs9xGCWq{s;Ltg5*>8jB> z_!CrNtJ_(cW~wue6Q3TOm2tX`NKJ(6#>}uku()glHZ0V7@dB^MpbUvkfkZf%zPKCC zF&qPdFR&$)C#SZ(#?Qt^oRs<6JD3+y#RdFJsJ5$?&efN~Ir49I>Z-1C z2eOU@65kC@7+CsRPMhP%G8V6Ba)R-eugJoPAno7i+a{i1BBGI-x2KIo+v%h^pYBMp z%)D;96v)i3(H<)CL_gFyVJ7mH&j)+^es{R}5t4oqJ0+oVaIUf76 za$2L&z`Lj=^|{%qI&0V_sAYjx@4P+snd>dV(3VS8L()*C(F^#pJ=9L4j3BDKWFqI8 z1?w{B?Fk`vPEJ)F>y7?C^YHL+agS|Ua9*cSb_wCHf59?KE^N2nI=ioYt^Bv?vN26v6Hnz5h+{Ptk zC4$@)^n7oWm|d0;{0T(9x`pCYkFD-~qFivPop%#IXd@%T_o&1Ae&GCLn#oTehx`-i zIC3!*4?C}g0Cc~om+@=4{|xkREM_(}bJeovqFAlr>o`!9kTX1@qEa|eC}ek+G#fSA z2(g@$;*QN&21HH{H~{4N+y-_d_DhowxWKW5kkTMXogPun8e};N5cVfI zz=zWIWq#CBfc^ur5(CXS7?=&=L9pvS3H;D4HrtA-s-H$kAwl}O4=E|dsy9b0&B^eA z1G%%emriI--@`)`e37P>QNcS%bQD#pUq(#*gjqG>$uljZyEEQ4HZ_}Pq+zoAsy~1p z^_>Y^(=F1^{f0hckfp3jIEg`^=1j&4?Vz?xz=v(u7bvzj8aWwpvpc(%Ch|;ZA2mNc z^80PyRY*U!>>m5x(W39uZ;>u-5mpg8O(`!-xs$K|>PIh|NmU%q-C9q9ArdFF<-K~= z4gO#h+k~yKs)E_IHfCySq!(@XBRu3IN;%r^EIU0N0#eAv-adXciHM9$<@M{r3Jtz5 z4LXhICxAtmoQfS))~_eKGM&(%lm4e;|ANDd7dW8(X^-pgok_4>O-k?ry{vl1g8`(U zSEu@ZALCat<-?l+O=gYu)ic-N-)uRl(Cf0?$vwTjI>m&fPX4vqi>+t(umvY}bZe3~ z`5z40m$BRirf-bh`+2QF!ME?RV;jFZxy#~dH8@_p^XT!@*1;rF0wPo69xV#WXXAef z^OPgA#F(^Z(BMBsGCkksH^Yyg62pQ^`Cq9xO0s9Ob1rU;c~n>3CA*L_z7jz9IW*1A zg?|2Q)7t)^QTSM@s&qJPqDGLtHMqrLH^hK)J^^N3{UP;JMAWe-t=1=UYHAV)pD0p6 zS@kaQ_bxES>ZrkX=lIRvHATo4GD#Mby1&&Xn63Jr!I!rib5|j6G^5`x)Z~Z7b(z^J z?&2rc_AUZ<+HpoFMz5UkWZ-HO76~qt#eP$8lJw0Wd+#D5%qK}sPoY8|F)$*G{9Ddv zCp3B`H;ORAquq6F=$%7#U%sz?xIuVFBli~?+yXGWi_cBfJkyT$R($)aFNjd6wY{@A zF<;qZROmSBK&%0?F1%T(^Z?hy#W;uNu{g7mn8xSLx2DT0D;XdW(d6Xh^`rnf@75Cu z{3Zu%Y9O=~N84wEgNw^@@~4%!(>zq9>s%8#YS;E23-8C9$$RWvT!oTU#{dH4aMS?k zna#}1pnjRNWY0#I(d-$p3X2zJyB)Ij8@$$QL8UYJ_r;Ir`iQA}uii>#4BN1-x1wk4 zurW-+tl~a5fL%!Od@ajT`kT&x7>*YbW|+nh1Zcx;-ig8~Zx#-r8L-P1;^9Ki@CP>2ZmhzpGw>!_EF*-b{yXm*bW8+LSX7LB-gh#gLDqr%b%h6RpgP^E!ykooQt$ipMtDS zrGgr>1*?27J@TE={_9PMldZC~Q@g*YmO@QqK3oOZ6R*I^3elxP>Z1XVl{IspqEm{h zqyF)Q1seF_B$^EUrsOV>Ae4z-8caKLb)Q4W&QbC63A4h`a(>T6)$<&zO5vwuqjwk1 zEoh~*sF%b_Pap50JM09^nH$cZ9}C}No|3J^NY;AFd5nOQCtjIaY#8Dc<>lc49|4Vt z=R(*OVCussBy3JQu-3gAW-BIGCGMHt=}TNFpgps5xPN-L0+**+7$lv28Nn8JEJ;{!Bl7ft%AIkg)|^y zGEzTjmv3)tQ*8=)p4Db$6}-K!78>MOU;XXGBhvMDpFo!-Xiy%^<7xbOTM>=GO9cgm zfnTl8$~W%cc0SHkY6iCyRhB=QxD)O7C5ItkGc6BC^M85d8P78eLE4Gu7sB+ zFSjG#=HQT@`y!@Fva9}L0W?bUr^08{sQXRh9+ef$7e_o=oost(Yg2DBG89q;8aY7E z_=fJ!_rrv9(Xq&jn@05(Wp`09-@4Qp(2bPOw_n$Nno5gp@>CFduuyA&7O5~TK*xC(R*(3*c@Cml_87#7M)cU0}X5y*43 z1^vIrhu4*GR1zqXrooC)r*{=l^>BCK$Q>nBO!nUD-jbtqF@*;)H7HzVoUJ9H+^h>O zVFf37Qb#5YK`F=sYfQ4+$l`wYtDL37awcza_4B z65BN)6>@Ba|M}ci#9;idLu`e7d>p6$E`XhJ``32|=)cPd$!y>owL$5bISNxAR>!vH zMMtw@y%xyJ-`T)wT(pxV)SqoKBqW3PcuQe~EzqF-e(&!;@rynP zamw1zs}N=p;8vSjz36PI4PPH-{9nJI_45KT*66=L{-zjZ926Y9gr|oS zLqC5tUm#CSP0fF6?_pZ#o5FGaL&Um-^k}(iOg|5o^^lULw_~w;olWae2!V#D*fTyy z`mCMj5pfCi-9z_i&i~FiorV^L+U+u6z+t* z?Sx(L;~knVCvC$XJ_+nExDPqRzuHTBC4}NAeTpTRNxyRxo3L1;7Mo}Kgi!~*F;3z9 zH@9PrS>U8VfLY66s;YhGS;L&3NOCm}BlcEc?lXoJlKvRx^Eccvsjq7GMkOGB0kmaW zCinV7#}c!;Te3LNgw|$rzuyV`QMZwQ*cyrAUU6m7!nX78^Sm^RVFMwJ--`>A5mgE$ zrrb!31A;EL7@;Z=wosY$h=$)x(2tAUyS&L9Ea#sB9WJlpLo|ZXVxlHkkY~R^h_x)T z{|0K#c@nl%kgfCgVcO41P9 z8a{|Q&&xUO!Gvlo$ibn^JVZJ6b zq{u_>Nj4;GGsW(&PYVDa)xqAyEuvg~4UNBQpt0@~>ikn*gr7U}7lGv1i^sc{d4JH9 ze2sZ38tKa#N&l&DA>thfuj_s@afpTsHlx+v&IZ&Gwt*1bZB;$cK4zZ-M_+{8{srv& zKR+62*7t(9Z^WWaK+a=YP6xH;y{W}0xz%c@^A!R=8vS=~W}N)Fi7#&BRwnVGZ-egL z`g@4u#2xxrRO%3$=b{<)uCW1|%;COcCW4Z5{+(m76+n`m{Mw5MwZ_ssCAmWe7ncr7 zI$IcR?&_YkI^0*ArRJDgP=iV5-)KG%OD{deHg(ZF5nIqc?{6U^B{Q!c ztB4cYw{qC|_Z2>Q@eKwZ4;Vgd{{aWt|fU(J| zEk6?~{N9Mg6H%nyg_oWhxn{Qtp!STkm)+;mC|c*5z<@0MoGOi+-zN{b6d*GdR}E&F zJ?;pkXC*$H)AL^C`i^ETIvX?a$ZWf80Iz`(0x#dUzX}@ehu!jX^2BesN(dET%uytF zL@X&pgG%-aWqAB9%1n`SXCpZ#XEHx{n4oKSnzf<7V*?rtn=&raR~h3k6}1fL4e06j zO@mV$SQEuO&rha*(r)|?TetaJSMkbdA<2lDT&bFQFXrR1S0^WlLOknS$BC)Qea7~S zp|pMS5j`;h3@E$Rwk#{z{K-ZuT08~+Rrw19YTZ^S*=K!2=^9Y_M*LRGx6_%Z&{Wyw zs<|WSoD<)S5R}auZg+DP2_=B^Yy2T*cP}25R-uOh%}O0%?p~Z8LH^ziSJL1pVA`+$ z=<|@+FG*z?-G(`46x^DxMWsrEyfhqyYC4SxXpb+`AAHmId3lMw_o7>Sl%W^>M9j3k zimE{kr9p|VGxmTQWw_?ruLlOSpTM)*297+Y_qqg6rO9x0*t^5F6;O(bG%gMaMgnsPEm9})JMUJ)$z-A-u z(OxP4v~=t&m>!XJFtjE0!*$QERXH3OxO9G*x~rAkU=YEQI@|4dQo5(9<0y=F+?i|l zNTKLN+b*Ir$^pu5qXf&-XSf*h?+}}b7&6BDd+ME<2VfW@1I*FzFO!--VdO8kGa!Gd zQn)^-?_)eg#HXvk^VeVZBq~3f38UecvDl}vc@A7?xB}`ec8LX$7R~ifUX$NoicUGSS|@V480*SwhtEk{;~5@Bgy+3sYg}7MMk~7AwSOu(`<*%Uzt@ zLb_To;m>1dt>uo^oJ5K7n91i;tievG#x&I2P(7(XtthSWPS|+s;-r@&iwPwj1olZ} zVuJ@q`Ef9--AbRg!fO5MT#upLnaPa&2Ch_JhPy$aU?^qGUGAU*yn}BOti9qvguC%v zs6&{}d^NlMAv$Rby~n$FA_rdQjBO}*gDH^_;$JKkQaf5K`%+KB zZlk<6V?%}zsh+3y$)b?6fs7rK?sd($#^hkH)%N5QS;Le#o$?VZ?j;f@gt zAfxA=ytf{iMb@kN2SnsFHwol@qz7-~V(u8rfSTcs4aH#qL6wzJ@lT_f(!y%;A2G`4 zumuaESVZk`V^RwgjI`M^muA*R4-(MhMLh`>U1-M=w1%-j%mCu`SCYJMDV?eWZ4G(+ zZQCyoj{3G=@}0`KbN|#*bS{|W#=+DucGPNxX4&j4bdM=DNSD};vEWH_&Kg! z&{IoN#|<)*tx+|KR7yRY!{tpD`Fmlh6RP&bo=6hM)I3g_e5xw_c|66_5;=Oi&F+t9 zC(SP~H>V$HAltOh(FeZFgbmHOUM%}yuV4txJa?8sp2sA!95&oukP9%78zLHVcsqSD zLWSj@Th}+`>&mf!Wcyw9n4}YJo|}d4f0Iw;6HIa_KmU~^zTjAHoS8)AWTlg*_?69Z ze%V>pn7NLjZswTz!{~bE`@$_(Lb~n~FImx{Ut>^m%s&utdHw~r+26G%ZGLvIU97ZZD{!eG$9Sv94zCC)276~Fskf=crA=)TG5JVTf zBoczrO9rD8gjAwO@9oi}w@45}qPNj&^e`AR^V{AAUF~U^JTJKbxAH7WG zq56FDLX3DM#;##krTEk6hyYQ6Gl# z!$E*;FwEH7S{#b63Ap}?Uydsc`Uo4HKnh+Go)ne3d#+CE%KFb|8cZmX0&-t)aIi=7 z5_!LUm4R-pb8vy*@7u}-^^FrQ!Gka71**U0RoYiwk?HNWULRmaw|%>6o{^F5c|~An z>aWlXR8J}NQ1K(e61$1`rmSZScWl!GX|yMct%vI)sndfYP&Eqta(jn~p{hR=swRYg zRp#B_$y!MHkUi{}s_fg8wP(#cF#0dxd>SL5OUS{sp{>8NN9P00OFN@o5-li+eVMKA z=m=lh&4aRNY{EM*wKFd>DR1c_J#gZPHVMD0lWE=`zkBanDF)~OYl0^DeI>nVCB>1! zE*Jd%SgLMunlPC3{wm+z0bUthn zXQ6(+!3mfP(u%WTS1+p=TM9-{M-E77-C%4EZ>nIiW6vd8zm=-O{<<(7^2o8oA(9yD`OiDojysdPktjiJBWw>H=;QC@!6 zUX=xyo7YhTNI&#omU`lonJYg<=RIQpYmcW~Wc9yUd-}B(L_f9Q(=V%l=L9hQw2$!G zEqHwG9)jl=FbPG#-2?d3MPhB6vF4ro&XfDYqx^>%s7)THdz0c-6KAs%(Uuu!9QM+u z_=5}%&rO6CXOzDTbQMVn@;$hF1G-991K(?{o5BcW_xtqqQY=q4_xTU4W}zZ-;wdvu zR7P8;kQ3<48M=gTA3Q5{2OfXz_2yt!C=NbTV30^Zs$QIv@Z|9|jaqrGSrpus@ArDg zB>y2kJ))TSb`-&*$u@7J>ODn;c4XS0M+bq7=CZO01x-+U+1hH^+~n1P158yMrrg?| zwigM(pB4Hdj0ebO>vD7o@vSMS>$S_K*S3--N~~AbI;(jpPoVvtd#zcy1b*=Do{{HF z^Co)v2D(Q|xR21j50ieoxV0L&=!qplD`9(p?dPJoqq( zmKfe&b67rXo}cJ(q{XsQBQPQZL@NOWX+tBTwo1OaSae;Bq%6i{D-)4DU$~`%m#g`P zz%Rn^U|hklZj5gI75|aW(gBYx-JwRx8^PC5&wL#*KM^|4`zZYJ6h6@s70hGTIA)g; zyT#2DW;}U*WZt7-226|j%Kq=?fWdvYW(bo7v$|^W_c`E*KTVB{=V)R5|F$OMU#-bb z!293lEoX1sPP_Jt(dBKp^@8m4eKq-Mk2+U|GB_{!N^=^>z?o_Alp!O_wT+-6{LThg z3gfo#8dunD{qmCL_er)f=Tt7VM&&!(f4E=ve?6cg{D1Jinh%{P6nTVbLX#mkr&(>Gnnv6{$Dz z&~Qx1?@h47rrvk_L{M#le8!tUp?`Zkp>v^{;F(YK6WqR9%_{2cCVYW5Ah6tBfK2Ew z5`I+j<9~MH&&LISGzZ0lW+1uSVIF)w<+v z?|WOHC!W{`sVNrK{kfKfy($i&j75O;$o|`|-Qv7FQXlLY)BTT+!lD-h3F>JX zmJiBrl)yRq22vFr_KNGb({BD!;ANjqqqg>^;`-WfZrZk`!*cl3-`$nx3swrrxPRc7 zKd1|j=DwA^y87&-mn0{Ug#=Z0YJdXLQXqA$^Z{j*&CJ`TCwzQ-Z7&&k2f;2|KNgI0 zvEO~-VFVF{gBid76T={O6aK1PjCVo=iGG=LZ=hpidv(LFZ}(of6x!4%fjLk`O|5g; zJy?`9veQjF6Cfv=WJe*i_I%Q^Y^*`O9bUnfIVM~61f z-;Z2ELgHBqruy|+;-gsO_C4(S`g#z$#&kgDzrdg<{?))SWO!Vc;RDm()(%AJ3XG6z zf`U|N;ZjA*EJM>voTEo?vSL65vX1gYihm(kQT+Mbu2N@|W>-Q1cH=-F2IfokrT1BC z#YowLi!WJ38*BadR~=9u%nndE8;3+EL{O~v#dA>oComOtKnOk{8d?g*{gIG*xm>kN za&gN435tm>%g&kx^_Wq;uGkL9;51j!B)T}-EW%cNy)itc!mOUct2pDTVXMob$B)Xz za6+knwV2#iV`A{|7SMH60<19&4UIXI6IlUMmfbEzH~O&iB_4>daUYP`IXT226~+fP z4UZ^`yqrX)?HpiA^5Nh9^ihwMh74Q*0?F+Le9IQ8kKv#&{S)1Joi@YQj*FS*lSm|{ z^^=GR$8G)}5C3UI)Ir)OwXFQl6u|mjx5FYnUHlI>i2naU1Q|?8YPelLO#LXTtc@pr zlH%c#TE4~gZ@e$cjm#C8#ALje8SM-=t}LW!92oQd4-X{1HNaUgt0W8|H@hO9b=sft z-`5}?s27+6P+?nBo&G6%5avMagQ;Y&w@^QZ7~)#JV5UDS{LfAP`RcjYD{alNcO$phnH45>HqP=|*FxwVrrwle=0&jU z01o?KEVZjatc=4N)*kW)4*}2{KHQ)SQA! zW8PNlXa(GrwA@vLD70s{+6Uo7nc16mz0a_lR>ft0ogA}|i^X7H*fvj9r#HpB=YM5a ziD+r!^98~LeSdSVh~VR?&AVu}oVyb$lJ$2)mm++Vr*{>bn*yGmlAieUf^Z4l%>=OE~U8A5(U#qzhi56Wm2 zM(Co?n3BqHL~Z3V?AGUew;!5sxNn=fY}=fZNjU8ApOSIqlZZZI#il0n)iE~O3s{DZ zaOf9#Rn8KP-N2)jy=R#BA!oe6mQgU$kVD0v1!PU<=6w63t3r_fyEC}}iU&aqsR@x{ zZ}M|oxsf}+ph-&zk;nTMPRZv^x}V?vRgOjywtQwss5b#5(DM@+=uTn?v+&3@@7kbJ zbn7P#fD&27O`fKPsBzdrO)IEvD7G(3{;F24n%GE$;>^(`m1E^Yjn3kAqD}7pp^l2z zcJLzUJ{t4IIdYdegc}THgs|v*G%Io}C>bZ2hls~w8bm5&?1UVjZ_>S3yEc&bgi{2@ zDIgHXRh3Da(5-26>#?<#1%FGx)Ww|9)@&0Q*~7c4c9IK=Pwyi~ek3xWd;FaGriIr} z7M<^|iPczV_pR5_+4sHk7&m&ws5_*7tfiD&9q`jw_Zj|B{TyOtWpCL+wQ`)CoVakB z_kEX(g&7NmVGM!LQ=V1|1cE;uYjp)8JPxRi@IQMG1L6a3#&nh=`N3u!nF&x~hFk*z z?|9vSTnGea--@A zXA?2VJycX3a~_pIffIy=nWn{m{z`vg4Pl}G5Q*Pmn#g+^RE~G5?V5vi{l?CW@6MMi zQ4bjCWZ)(m>vZ?ZkVGGE)H%AXC^Okx=Cv~+WpW{^)B$m_{z(lWrw-~@$wX&E62n!b zQzy0zgu>pS@kz86=NIB8tVg?~1}7!He4Y&Iaq`824kGbxh}0g+)&n+vr-@r4q%Vyj zLsj}V(j!r$7Hzff()9TBkJ`ziNeSEo*z1`uTq!7!if(EO*W3zH@> z-Op%cxEYqE!#6@C-C37A46IqFM8TqFKBe7S!P&XgjGUJiHB33bbP9Qh@nR$1+70|d z{FwO%CqxQ;J#uQ9p-aev_UY1J@14m(~4;|QE+ zwY-c+@1STQ@A*0@<&pn#){gwKqvyg<{^cpp7o)GlC%E z5(8bjk=sxcju3$zJbn|&VYY)HfY8a9DLhX0_47Oaf`Fw!L`AdQs3DZR% zs+W-`fk1LV)Z-Q7Q*W8Q-aTqt8NHrEF}+J=C*X}#)zr(R=hb$pZZ5v3NR0nI_>VA$ zO}qhpQjzWqz8*SYSGC&jMP=n4m=rC69Cux;A}~3KrM}zxpgY1(^s7^WqDr@Jf4Vpm zFhTx(eBa^X;?uTgzaoalfdrCtR}T_&Tw1k|d|<@FY5G^9__c{b(AD&QepGI6x?@$C z!sc=H=~Gp~bxlg^|jcf1RaV1cm@{2|_2Bxxde-F(3Q(bhiE=o5~eM_UPQs#T@HB301{|EsI+G zA5Sq%rYNwSeSFUbju2J~}dIo2`Si;}WdxvMW^sDyT z1UMa0(D&s0D<~^7vzSt|y3cIoIr4TF%xaz9D1F4?0_%D{f0kB<0-j-P;k%c+8~H#b z`CJ|x^iSg($B0u&JV^5 zw)w0D06OV&25-%&4=#PL`rrY9^(g#CyBk}6SfCD(at}Yc)#LcJiNs;R(9boNA$CN? zfzRbN2iChx$)>R*?u0;+s3ndqmnqC2iwYJYm9L%1TJNv=x9Xj?JVWi}P1T&_oPE%dSom_o z+weBQ9Qb1(Ke7hu+OfmH4&8@e5jzi<@P3E%kaLGNY4LBkRJNB1I~%gTWeq}g{bpGs zMB$A#cRnBO6+-k&jn9yb~~dSR+qZaCYW@JwH!C zNHSz;*dRkOro1*y&>g?SzK=4i_dfmY@c6eC;miKN1ChBD zu4RUTOX@v{2PNRrCs5yb?IM>(&{1?898mjkt-wI}g~i3(Ouzlj)R-1kAev*Jm(%Kh z;_iR|Dk@Xi`GKmcUvhpoSNa{;dwO|i)z>ov2}eGDenmjfhAbE3R70Nw39w8scRxQa zEUaq$l=lv7wj_#lr|v>1fsf80zH#TXCgsLg#PVJw{(Rz{$@96Ab`NO(Q@a!r041X~ zV^zJYWrtmgx*P=r32}atlBAaF*R6glS`tVYew|vRErq%7inFYy;BmiaQ2wiBboY?j zDhq}4nTEj0cGCovD!_A?m4z94@|O*G+{dv?Z3V0RnNXwpHnd>wPE1yQ6#>Ldhv0eo z31tkb5J`jd%Bhl%frdZr0SdDS@V}o&;X5^^wy*p^si$Pa-~%uBqZ$e)>4H0aEm^Xi_)NDoZHC= z7xzdhILRiNI?LON;Sd^+V45W*3aTI`py(hRkx)UEvLmrnC$xpsjwc8(6(-yW9?n$C zlB13Iw8Yf@Y=-1)1*i4Ht@H-|l|*|x--}zs1ss0qdZ(8=STyfr zi)4D>sl(X*Kg_u3%mS?ke&{GB2J>P4gwn={GQzy+(t!CSrWX>A1c*0%MkgeJ$s z@5N45OkR8%`us6{d$@4)BkCau#_H<^!#AQEugm1JOuxcr=Lm8*yFRL|&MEe<_T*dC z)_iVbuRvApHCct2PM1NYCCqw|rJ)n)w$tEKtIcQ!X^)JSRo1GB3o+dnYo&tuj#J@m zY-}K0P!_w%rC+I1y@^*l^b%NqhZi$F{u8pfuDC&bY)X|sd*puzFu5KHldExgoY1gq zLl1r-)m(5tX|X=@j*jwvF{YO3k8!8kh%qz!Bq}RH-??umQq^@1eEtlQ7e?Xo`)6jE z3jFg&(JKmq5jMxt5vom<@Ixaa&S1!mA zpV%L?t~4AAb-3mRJk-a_32pHSWV}TBNbo7cAfLEvs8p7z<{cc2<$jYtK6wB0Yi~+) zN4&`5U@=ZOip&xta)g}>{W2-+wg9R9zQ-kgs5Jhn%zTD+&T@W?_AC1@+?*u@TfY-N zXO~pSo8#=!RobDB<4wRd`|JoxHQg;+`)J8Q7!QG+tgW zN#ENT5&wY!L`B%zrfRVcE|UAlALb8TcR}PQ7rFFcr*~K5jdLNpKA#BMGMlwFjF^DL zCz?bt2qJ0Ii(gMZAf@fH*ym6@;>dV_9nPE#*u zd}DCt{cxlqDE|(+3wo@+0io3JL!Q|H^dNuo7#*$49X!Fa&vdG{jo99CJh+EJnM{Sp z>{xcTZ%RK%4z%>cJ`1H`(n;&iX+Uv#6iQ)BnhJ0ACzF=1vdW{D4K2|xeuKBcB{nTa zLfHGh5fRdNM!hMT1It9Gy;O^Jg`D@HsrU9W?CPd;eZ7;2A>mIG)x8_jNW9x$W}T!m z+(qNXHumoH+?|&QbDwJ?fCPQF|M}qOx~DBN9SnEj^=jf4k)5Ky1PTCCy+Hm%gh2#< zjvgrqsa|d?wWwp4>GQc()!%A`Y9JaHq^0_PCwH;KRJ2ovprLB(N2#WX^&nFr4|y-~ zTMc;b(^kT%Lwz!@-xmTqthVP7UGRvXZ9|K zc2|kBfDn_d5Fbp(wmAOoaUXl-q+~YU^i=+>>Ae%E1I9d0aym542fmx&!CD*8%+xqx zD|rey$Gd1H@9)LbgdCFC!=p> zq+!1kyd2As{P^&=(*LY3u`KhGjdZc!@^j8pl5(A=w0X0^9k2@!NV8&Du+>g~>xy`J zJ}r}ELAe%=w-%4FHxiHRr1vTlTzv?sg4s(f&Zj0jv7u>F#5<*b-4z!r;q!W51$>eM z&hgB5?Y7x55`MiUE#Ci$wy^w75l4mjG$k7zSL^6 zunavXiWPh-AgoU$%Sf!C>EH71e0JM*w#o0KZJDZy3Q4Rgcfz5Zh%DsexQ~fr@-dA^ zALYzNi56$b>NqwBDv2lez{<*`~<1N zQ$%%h^e|?aX1F2gZ0ra6A=gM&I2jqxiXLUPjNRS_@}|wWT4t+Enirw!N$BVMOBtUU zG4A6nW7)H;&w_U=!eNo4c9jo$&g^Mv(m%6fQwrM78ez&uzu=)OvQ#B%uv;YIVqDko z3_lSm-x)!N#dH&70H?cty(G3~wTJTN=(ZnU7WA>5#+ zI1zbQ@b~Ct8vA0QEEzkpd*W{$JHPbp9Vle!#a-2F*p=*%%yIw19Ew~G1;tU{-to4h zpC1{=B#_aav|BOEOKtZ27|M$C9d#8qM_fV2B~V&O_>g-ITff{7g0Ho-~8 zIF2l9*)cx&{*U@hL)4R&X7?Lw2#C~+-vztUsoGBmTfwb8F%#r+cy35^{^>vCFiWg- z5YTi``T0`SSC+kg#)b8+J24RUVrFJ;YikRNVhNp-25+U@m&m7GBxTuYleKS?1}Jcn zhtLI&{d`Gc46m4T)S2FlB9mPs4=2+#WhiCWeT{#)+1hP8bdUGF;xW|BuWA1b0aC6Q zu5}T0`yhX8FkZ^Lk?jWdc^IBEF9-4JlGL!Mo?Md=JvedeZ)a;Si1@TJdhSlHf6#4W3nv#IiwDh-$Kqy9}n@VmlH3X@+zw#o%NbG#&Bwy%J zE7{Ig3*czK<;S8;yLE6d%tFef)!K*=V>I7tKMAsl;`&W6hg;IVnX%CA!Wckqpg&bJ zRKDgBdb`Gg$X*TF;@9h75KugD>+wFc5*x3IP#0@lcFq{KdfWf-hJgT=X_#;@SPhOl z)qdiP1LPYDxtoksr-^;&dym<$H@@}jU1r4rSz5lSJ1NxCX*5xlwgoI+=N+PQYIBIa3Vud|y8yfbehPc``HBEMg?x5#em21$^ZHC?Ck8*B3QvGcA|#2+s^G*Y+P=1#O-x@(9mK^8SV=i#`okh+Ed|BJjlO0}q02MFvQ2n7R-;-tD zYx>rAfrh`%o}Xx`VJ?}cEV8kT2B>4*O8H(;Q1Gx;(#XliG1B#FvzdvmE*>fC9XMIZn`yf|>&>u|X=_chm=%U~oH`u;RT ziM*yWa%ei#m(D@r;TtrRWeMR=xBll@{WJDO$;?6K2GZP_%vDuM8SU{G;9H2!cin;n z5cv#RQ2Nq)6sL~RJ0#jYjX^vPMrFVbSXegj*$=egHbP#l|D;IhX}tdK*E#%yz Date: Tue, 20 Jul 2021 04:44:03 -0300 Subject: [PATCH 05/16] Something about leadership and mimics --- hyperstation/code/mobs/mimic.dm | 53 +++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/hyperstation/code/mobs/mimic.dm b/hyperstation/code/mobs/mimic.dm index a98282da..c89e973c 100644 --- a/hyperstation/code/mobs/mimic.dm +++ b/hyperstation/code/mobs/mimic.dm @@ -243,6 +243,48 @@ /mob/living/simple_animal/hostile/hs13mimic/proc/allowed(atom/movable/A) return !is_type_in_typecache(A, mimic_blacklisted_transform_items) && (isitem(A) || isanimal(A)) +//One leader mimic spawns per mimic event spawn, they are able to consume and transform themselves into the station's dead pets. Buckle up. +/mob/living/simple_animal/hostile/hs13mimic/leader + var/mob/living/consumptionTarget = null + var/consuming = FALSE + health = 38 //They have a teeeny tiny more health. + maxHealth = 38 + +/mob/living/simple_animal/hostile/hs13mimic/leader/Life() + . = ..() + if(!consuming) + if(!consumptionTarget) + for(var/mob/living/simple_animal/pet/A in oview(5, src)) + if(A.stat == DEAD) + consumptionTarget = A + break + if(!target && consumptionTarget) //Don't try to consume anything if we're currently attacking something. + var/target_distance = get_dist(targets_from, consumptionTarget) + if(target_distance > minimum_distance) + Goto(consumptionTarget,move_to_delay,minimum_distance) + else + tryConsume(consumptionTarget) + +/mob/living/simple_animal/hostile/hs13mimic/leader/proc/tryConsume(var/mob/living/simple_animal/pet/A) + src.visible_message("[A] is being consumed...", + "You start to consume the dead [A]...", "You hear strange fleshy sounds.") + consuming = TRUE + if(do_after(src, 100, target = A)) + stealthed = TRUE + speed = 5 + wander = TRUE + name = A.name + desc = A.desc + icon = A.icon + icon_state = A.icon_living + desc += " But something about it seems wrong..." + qdel(A) + consuming = FALSE + consumptionTarget = FALSE + return TRUE + consuming = FALSE + return FALSE + //Player control code /mob/living/simple_animal/hostile/hs13mimic/ShiftClickOn(atom/movable/A) @@ -298,6 +340,7 @@ /area/asteroid/nearstation, /area/science/server, /area/science/explab, + /area/science/xenobiology, /area/security/processing) var/spawncount = 1 fakeable = FALSE @@ -360,8 +403,12 @@ notify_ghosts("A group of mimics has spawned in [pickedArea]!", source=pickedArea, action=NOTIFY_ATTACK, flashwindow = FALSE) while(spawncount > 0 && validTurfs.len) - var/turf/pickedTurf = pick_n_take(validTurfs) - var/spawn_type = /mob/living/simple_animal/hostile/hs13mimic - spawn_atom_to_turf(spawn_type, pickedTurf, 1, FALSE) spawncount-- + var/turf/pickedTurf = pick_n_take(validTurfs) + if(spawncount != 0) + var/spawn_type = /mob/living/simple_animal/hostile/hs13mimic + spawn_atom_to_turf(spawn_type, pickedTurf, 1, FALSE) + else + var/spawn_type = /mob/living/simple_animal/hostile/hs13mimic/leader + spawn_atom_to_turf(spawn_type, pickedTurf, 1, FALSE) return SUCCESSFUL_SPAWN From 7ceffe217e4fea8c4531e27d4c1fae0166c7a2c1 Mon Sep 17 00:00:00 2001 From: Archie Date: Tue, 20 Jul 2021 05:03:54 -0300 Subject: [PATCH 06/16] bonk --- code/__DEFINES/admin.dm | 1 + code/modules/admin/verbs/randomverbs.dm | 7 ++++++- hyperstation/sound/misc/bonk.ogg | Bin 0 -> 7741 bytes 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 hyperstation/sound/misc/bonk.ogg diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index d8b5ab0b..36966d0a 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -80,6 +80,7 @@ #define ADMIN_PUNISHMENT_NUGGET "Nugget" #define ADMIN_PUNISHMENT_BREADIFY ":b:read" #define ADMIN_PUNISHMENT_BOOKIFY "Bookify" +#define ADMIN_PUNISHMENT_BONK "Bonk" #define AHELP_ACTIVE 1 #define AHELP_CLOSED 2 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1f780448..01d1902f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1274,7 +1274,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits ADMIN_PUNISHMENT_FAKEBWOINK, ADMIN_PUNISHMENT_NUGGET, ADMIN_PUNISHMENT_BREADIFY, - ADMIN_PUNISHMENT_BOOKIFY) + ADMIN_PUNISHMENT_BOOKIFY, + ADMIN_PUNISHMENT_BONK) var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list @@ -1393,6 +1394,10 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits addtimer(CALLBACK(GLOBAL_PROC, .proc/bookify, target), BOOKIFY_TIME) playsound(target, 'hyperstation/sound/misc/bookify.ogg', 60, 1) #undef BOOKIFY_TIME + if(ADMIN_PUNISHMENT_BONK) + playsound(target, 'hyperstation/sound/misc/bonk.ogg', 100, 1) + target.AddElement(/datum/element/squish, 60 SECONDS) + to_chat(target, "Bonk.") punish_log(target, punishment) diff --git a/hyperstation/sound/misc/bonk.ogg b/hyperstation/sound/misc/bonk.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8f03c8ecc0ef082207b9b05aa7e866663455a717 GIT binary patch literal 7741 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 D2XDV7 literal 0 HcmV?d00001 From bbee556d3eb53f46305b158a4cdb4ca1ac762b1a Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 09:24:35 +0100 Subject: [PATCH 07/16] allow equipment removal on new genital. --- hyperstation/code/modules/arousal/arousalhud.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index 8f5b61f5..cf903eb7 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -238,6 +238,13 @@ usr.put_in_hands(I) O.equipment = null + if(href_list["removeequipmentanus"]) + var/obj/item/organ/genital/anus/O = usr.getorganslot("anus") + var/obj/item/I = O.equipment + usr.put_in_hands(I) + O.equipment = null + + if(href_list["omenu"]) usr << browse(null, "window=arousal") //closes the window H.mob_climax() From 357749cd5f92b2737d90a6ca98acd72d8c0760c1 Mon Sep 17 00:00:00 2001 From: quotefox Date: Tue, 20 Jul 2021 11:59:33 +0100 Subject: [PATCH 08/16] Hyper butts players can now have larger asses. --- code/__HELPERS/mobs.dm | 1 + code/modules/client/preferences.dm | 11 ++++++++- code/modules/client/preferences_savefile.dm | 2 ++ hyperstation/icons/obj/genitals/butt.dmi | Bin 182 -> 2528 bytes .../code/modules/arousal/organs/anus.dm | 21 +++++++++++++----- .../code/modules/arousal/organs/genitals.dm | 18 +++++++++++++++ .../organs/genitals_sprite_accessories.dm | 11 ++++++++- .../modules/client/preferences_savefile.dm | 2 ++ 8 files changed, 59 insertions(+), 7 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5f6d0248..af7e92b1 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -183,6 +183,7 @@ "cock_shape" = pick(GLOB.cock_shapes_list), "cock_length" = 6, "belly_size" = 1, + "butt_size" = 1, "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_sheath" = FALSE, diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 9bc42104..42ae307a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -134,6 +134,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "cock_shape" = "Human", "cock_length" = 6, "belly_size" = 1, + "butt_size" = 1, "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, "cock_color" = "fff", "has_sheath" = FALSE, @@ -923,8 +924,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += APPEARANCE_CATEGORY_COLUMN - dat += "