From aadccce155fe79f46fa8291ad501cd503e39b56a Mon Sep 17 00:00:00 2001
From: Metis <100518708+sheepishgoat@users.noreply.github.com>
Date: Sat, 14 Sep 2024 00:46:32 -0400
Subject: [PATCH] no more errors
---
GainStation13/code/clothing/accessory.dm | 1 -
GainStation13/code/clothing/haydee_suit.dm | 5 +-
.../datums/diseases/advance/symptoms/berry.dm | 6 +-
.../effects/spawners/choco_slime_delivery.dm | 2 +-
GainStation13/code/mechanics/fatrousal.dm | 2 +
GainStation13/code/mechanics/web_weaving.dm | 2 +-
.../modules/clothing/under/jobs/clothing.dm | 3 +-
.../clothing/under/jobs/modcivilian.dm | 16 +--
.../code/modules/mob/living/emote.dm | 2 +-
.../code/modules/mob/living/species.dm | 114 ------------------
GainStation13/sound/voice/farts/fart4.ogg | Bin 0 -> 20433 bytes
code/__DEFINES/misc.dm | 5 +-
.../mob/living/carbon/human/species.dm | 36 ++++++
hyperstation/code/modules/resize/resizing.dm | 77 ++++++++++++
14 files changed, 139 insertions(+), 132 deletions(-)
create mode 100644 GainStation13/sound/voice/farts/fart4.ogg
diff --git a/GainStation13/code/clothing/accessory.dm b/GainStation13/code/clothing/accessory.dm
index d02172d1d7..e8f482167e 100644
--- a/GainStation13/code/clothing/accessory.dm
+++ b/GainStation13/code/clothing/accessory.dm
@@ -3,7 +3,6 @@
desc = "You shouldn't see this."
icon = 'GainStation13/icons/mob/accessories.dmi'
icon_state = "gato_middleman"
- item_color = "gato" //btw I had to move the sprite for this to 'icons/mob/accessories.dmi', the shitty code made me do it!! GS13 will just have a backup but it's not referenced here
above_suit = TRUE
/obj/item/clothing/accessory/medal/gato_badge/middleman
diff --git a/GainStation13/code/clothing/haydee_suit.dm b/GainStation13/code/clothing/haydee_suit.dm
index 132098acf7..ec2a42cf25 100644
--- a/GainStation13/code/clothing/haydee_suit.dm
+++ b/GainStation13/code/clothing/haydee_suit.dm
@@ -6,7 +6,6 @@
icon_state = "haydee_helmet"
item_state = "item_haydee_helmet"
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
- item_color = "white"
slowdown = 0
mutantrace_variation = NONE
actions_types = list()
@@ -14,8 +13,8 @@
/obj/item/clothing/suit/space/hardsuit/engine/haydee
name = "Haydee Suit"
desc = "A strangely voluptous suit. Offers little to no protection. It also appears to have minor flab-compressing properties."
- icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
- alternate_worn_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
+ mob_overlay_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
+ anthro_mob_worn_overlay = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
icon_state = "haydee_suit1"
item_state = "item_haydee"
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
diff --git a/GainStation13/code/datums/diseases/advance/symptoms/berry.dm b/GainStation13/code/datums/diseases/advance/symptoms/berry.dm
index 21e6e9c8af..8e8a4070a9 100644
--- a/GainStation13/code/datums/diseases/advance/symptoms/berry.dm
+++ b/GainStation13/code/datums/diseases/advance/symptoms/berry.dm
@@ -52,7 +52,7 @@
playsound(M.loc, 'sound/effects/splat.ogg',rand(10,50), 1)
return
..()
-
+
/obj/effect/decal/cleanable/juice
name = "berry juice"
desc = "It's blue and smells enticingly sweet."
@@ -69,3 +69,7 @@
/obj/effect/decal/cleanable/juice/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
+/obj/effect/decal/cleanable/blood/update_icon()
+ color = blood_DNA_to_color()
+ if(blood_state == BLOOD_STATE_JUICE)
+ color = BLOOD_COLOR_JUICE
diff --git a/GainStation13/code/game/objects/effects/spawners/choco_slime_delivery.dm b/GainStation13/code/game/objects/effects/spawners/choco_slime_delivery.dm
index ae4162d302..4e4af9cfb4 100644
--- a/GainStation13/code/game/objects/effects/spawners/choco_slime_delivery.dm
+++ b/GainStation13/code/game/objects/effects/spawners/choco_slime_delivery.dm
@@ -15,7 +15,7 @@
message_admins("A choco slime has been delivered to [ADMIN_VERBOSEJMP(T)].")
log_game("A choco slime has been delivered to [AREACOORD(T)]")
var/message = "Attention [station_name()], we have entrusted you with a research specimen in [get_area_name(T, TRUE)]. Remember to follow all safety precautions when dealing with the specimen."
- SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(addtimer), CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(print_command_report), message), announcement_time))
+ SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(print_command_report), message), announcement_time))
return INITIALIZE_HINT_QDEL
diff --git a/GainStation13/code/mechanics/fatrousal.dm b/GainStation13/code/mechanics/fatrousal.dm
index 7c62f9e0fe..c31b6054af 100644
--- a/GainStation13/code/mechanics/fatrousal.dm
+++ b/GainStation13/code/mechanics/fatrousal.dm
@@ -16,12 +16,14 @@
var/mob/living/carbon/C = quirk_holder
C.hider_remove(src)
+/*
/datum/quirk/fatrousal/proc/fat_hide(var/mob/living/carbon/user)
if(iscarbon(quirk_holder))
var/mob/living/carbon/C = quirk_holder
return C.getArousalLoss()*35
return FALSE
+*/
///mob/living/adjust_arousal(amount, updating_arousal=1)
// if(HAS_TRAIT(src, TRAIT_FATROUSAL))
diff --git a/GainStation13/code/mechanics/web_weaving.dm b/GainStation13/code/mechanics/web_weaving.dm
index 0163ad277a..d334a04d74 100644
--- a/GainStation13/code/mechanics/web_weaving.dm
+++ b/GainStation13/code/mechanics/web_weaving.dm
@@ -79,7 +79,7 @@
name = "web bindings"
desc = "A mesh of sticky web that binds whoever is stuck inside of it"
icon = 'GainStation13/icons/obj/clothing/web.dmi'
- worn_icon = 'GainStation13/icons/mob/web.dmi'
+ mob_overlay_icon = 'GainStation13/icons/mob/web.dmi'
icon_state = "web_bindings"
item_state = "web_bindings"
breakouttime = 600 //1 minute is reasonable.
diff --git a/GainStation13/code/modules/clothing/under/jobs/clothing.dm b/GainStation13/code/modules/clothing/under/jobs/clothing.dm
index a6066151be..9f5fed672d 100644
--- a/GainStation13/code/modules/clothing/under/jobs/clothing.dm
+++ b/GainStation13/code/modules/clothing/under/jobs/clothing.dm
@@ -1,2 +1,3 @@
/obj/item/clothing
- var/alternate_worn_icon
+ /// Where do we want to grab the file from? use this for GS13 specific clothing.
+ var/icon/alternate_worn_icon
diff --git a/GainStation13/code/modules/clothing/under/jobs/modcivilian.dm b/GainStation13/code/modules/clothing/under/jobs/modcivilian.dm
index 5669b66a5c..05c1ad7ec1 100644
--- a/GainStation13/code/modules/clothing/under/jobs/modcivilian.dm
+++ b/GainStation13/code/modules/clothing/under/jobs/modcivilian.dm
@@ -36,7 +36,7 @@
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_9_d", GENITALS_UNDER_LAYER)
if(istype(O, /obj/item/organ/genital/butt))
G = O
- if(suit_style == DIGITIGRADE_SUIT_STYLE)
+ if(mutantrace_variation == STYLE_DIGITIGRADE)
if(G.size <= 10)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l", GENITALS_FRONT_LAYER)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER)
@@ -62,8 +62,8 @@
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
- if(accessory_overlay)
- . += accessory_overlay
+ if(length(accessory_overlays))
+ . += accessory_overlays
/obj/item/clothing/under/color/grey/modular
name = "grey modular jumpsuit" //change name from base clothes to distinguish them
@@ -103,9 +103,9 @@
. += mutable_appearance(icon_location, "belly_[G.size]_d", GENITALS_UNDER_LAYER)
else
. += mutable_appearance(icon_location, "belly_9_d", GENITALS_UNDER_LAYER)
- if(istype(O, /obj/item/organ/genital/anus)) //if that organ is the butt
+ if(istype(O, /obj/item/organ/genital/butt)) //if that organ is the butt
G = O
- if(suit_style == DIGITIGRADE_SUIT_STYLE) //check if the suit needs to use sprites for digitigrade characters
+ if(mutantrace_variation == STYLE_DIGITIGRADE) //check if the suit needs to use sprites for digitigrade characters
if(G.size <= 10)
. += mutable_appearance(icon_location, "butt_[G.size]_l", GENITALS_FRONT_LAYER)
. += mutable_appearance(icon_location, "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER) //to not adjust overlays every time a character turns, north-facing breasts and bellies are drawn separately, with individual icons
@@ -143,8 +143,8 @@
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
- if(accessory_overlay)
- . += accessory_overlay
+ if(length(accessory_overlays))
+ . += accessory_overlays
/obj/item/clothing/under/color/grey/modular/bra
@@ -153,4 +153,4 @@
icon_location = 'GainStation13/icons/mob/modclothes/graymodular_bra.dmi'
icon_state = "grey"
item_state = "grey_bra"
- item_color = "grey_bra"
+// item_color = "grey_bra"
diff --git a/GainStation13/code/modules/mob/living/emote.dm b/GainStation13/code/modules/mob/living/emote.dm
index 8926b4a995..181ebfddeb 100644
--- a/GainStation13/code/modules/mob/living/emote.dm
+++ b/GainStation13/code/modules/mob/living/emote.dm
@@ -77,7 +77,7 @@
/datum/emote/living/burp/fart/goon // Fart but it's funny !
key = "goonfart"
key_third_person = "goonfarts"
- noise_type = 'goon/sound/voice/farts/fart4.ogg'
+ noise_type = 'GainStation13/sound/voice/farts/fart4.ogg'
//Shhh... It's a secret! Don't tell or I'll steal your legs
/datum/emote/living/burunyu
diff --git a/GainStation13/code/modules/mob/living/species.dm b/GainStation13/code/modules/mob/living/species.dm
index 19e2013197..28c8cb450b 100644
--- a/GainStation13/code/modules/mob/living/species.dm
+++ b/GainStation13/code/modules/mob/living/species.dm
@@ -338,117 +338,3 @@
FATNESS_LEVEL_FAT,
null,
"You suddenly feel blubbery!")
-
-/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
- if(HAS_TRAIT(src, TRAIT_NOHUNGER))
- return //hunger is for BABIES
-
- handle_fatness(H) // GS13
-
- // nutrition decrease and satiety
- if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
- // THEY HUNGER
- var/hunger_rate = HUNGER_FACTOR
- var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
- if(mood && mood.sanity > SANITY_DISTURBED)
- hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
-
- // Whether we cap off our satiety or move it towards 0
- if(H.satiety > MAX_SATIETY)
- H.satiety = MAX_SATIETY
- else if(H.satiety > 0)
- H.satiety--
- else if(H.satiety < -MAX_SATIETY)
- H.satiety = -MAX_SATIETY
- else if(H.satiety < 0)
- H.satiety++
- if(prob(round(-H.satiety/40)))
- H.Jitter(5)
- hunger_rate = 3 * HUNGER_FACTOR
- hunger_rate *= H.physiology.hunger_mod
- H.nutrition = max(0, H.nutrition - hunger_rate)
-
-
- if (H.nutrition > NUTRITION_LEVEL_FULL)
- // fatConversionRate is functionally useless. It seems under normal curcumstances, each tick only processes, at most, 1 nutrition anyway. reducing the value has no effect.
- var/fatConversionRate = 100 //GS13 what percentage of the excess nutrition should go to fat (total nutrition to transfer can't be under 1)
- var/nutritionThatBecomesFat = max((H.nutrition - NUTRITION_LEVEL_FULL)*(fatConversionRate / 100),1)
- H.nutrition -= nutritionThatBecomesFat
- H.adjust_fatness(nutritionThatBecomesFat, FATTENING_TYPE_FOOD)
- if(H.fullness > FULLNESS_LEVEL_EMPTY)//GS13 stomach-emptying routine
- var/ticksToEmptyStomach = 20 // GS13 how many ticks it takes to decrease the fullness by 1
- if(HAS_TRAIT(H, TRAIT_VORACIOUS))
- ticksToEmptyStomach = ticksToEmptyStomach * 0.5
- H.fullness -= 1/ticksToEmptyStomach
- if (H.fullness > FULLNESS_LEVEL_BLOATED) //GS13 overeating depends on fullness now
- if(H.overeatduration < 5000) //capped so people don't take forever to unfat
- H.overeatduration++
- else
- if(H.overeatduration > 1)
- H.overeatduration -= 1 //doubled the unfat rate -- GS13 Nah, put it back
-
- //metabolism change
- if(H.nutrition > NUTRITION_LEVEL_FULL +100)
- H.metabolism_efficiency = 1
- else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80)
- if(H.metabolism_efficiency != 1.25 && !HAS_TRAIT(H, TRAIT_NOHUNGER))
- to_chat(H, "You feel vigorous.")
- H.metabolism_efficiency = 1.25
- else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
- if(H.metabolism_efficiency != 0.8)
- to_chat(H, "You feel sluggish.")
- H.metabolism_efficiency = 0.8
- else
- if(H.metabolism_efficiency == 1.25)
- to_chat(H, "You no longer feel vigorous.")
- H.metabolism_efficiency = 1
-
- switch(H.nutrition)
- if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL)
- H.clear_alert("nutrition")
- if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
- H.throw_alert("nutrition", /atom/movable/screen/alert/hungry)
- if(0 to NUTRITION_LEVEL_STARVING)
- H.throw_alert("nutrition", /atom/movable/screen/alert/starving)
-
- switch(H.fullness)
- if(0 to FULLNESS_LEVEL_BLOATED)
- H.clear_alert("fullness")
- if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG)
- H.throw_alert("fullness", /atom/movable/screen/alert/gs13/bloated)
- if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ)
- H.throw_alert("fullness", /atom/movable/screen/alert/gs13/stuffed)
- if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)
- H.throw_alert("fullness", /atom/movable/screen/alert/gs13/beegbelly)
-
-
- switch(H.fatness)
- if(FATNESS_LEVEL_BLOB to INFINITY)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/blob)
-
- if(FATNESS_LEVEL_IMMOBILE to FATNESS_LEVEL_BLOB)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/immobile)
-
- if(FATNESS_LEVEL_BARELYMOBILE to FATNESS_LEVEL_IMMOBILE)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/barelymobile)
-
- if(FATNESS_LEVEL_EXTREMELY_OBESE to FATNESS_LEVEL_BARELYMOBILE)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/extremelyobese)
-
- if(FATNESS_LEVEL_MORBIDLY_OBESE to FATNESS_LEVEL_EXTREMELY_OBESE)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/morbidlyobese)
-
- if(FATNESS_LEVEL_OBESE to FATNESS_LEVEL_MORBIDLY_OBESE)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/obese)
-
- if(FATNESS_LEVEL_VERYFAT to FATNESS_LEVEL_OBESE)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/veryfat)
-
- if(FATNESS_LEVEL_FATTER to FATNESS_LEVEL_VERYFAT)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/fatter)
-
- if(FATNESS_LEVEL_FAT to FATNESS_LEVEL_FATTER)
- H.throw_alert("fatness", /atom/movable/screen/alert/gs13/fat)
-
- if(0 to FATNESS_LEVEL_FAT)
- H.clear_alert("fatness")
diff --git a/GainStation13/sound/voice/farts/fart4.ogg b/GainStation13/sound/voice/farts/fart4.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..429b9ec90a42049d31d3219465a5e6c2b04b75af
GIT binary patch
literal 20433
zcmaI71y~$Q&^9`YySoKh+#Q0uyIXK~mtX;cyF&=>?iL8H!QDN0AXo?x;BL3tRwV-Hr=b#tke7c_%Z;rEtlm2!3m_DU^ZvM~C3Q8~~&zw1@!;
zS6MLH$HCotT_&uUq5py9A1UM@fE+2bKi_2sD4?hU0K&i8{X_p$MgOb*+Xy-SW0fcr
zAUfhoBIAlP;tC!~WL2HF{BBjOF0cK*C?0^uXMcwss{vzFhJR6ARCC{j8MUJ5QC`Xa%pU{i+w3`Y2~v^eRE|}
z1t+QO3d=EtBn1;>z{y2{O^krn4)Q
zUf`O9E~JaL$&RFn7F2`5jMOcpy_TG%@}ne&N{WOhha!if6b(ZFPg437hSS(Z?tGAz
z1XJ1-!jl(9LGFtzqz(DY6ip6=iNP%j6O2%ZkN^(|MoL0r0*6BUAAm7Hn1Yl)1tnD=
z;xP&^qkv$9B!tLF0Kkj{L=PbGLk<8Yy^w*?8^)n(Gb#@mAwcgQU$TX*q)akcVLme+
zte1Wmm20V&ZsnIttCwEln|o}Vd*oX>(#$n|qd3haG>~u?82>zwC
zl{5_B{$;_I(&DPfF0;)(^3A2IEVM0zFxciER}@yNYvmsL=34s|o)lD8GDH_1`{vR{
zm)de%DXQQ|&EiODaGCn$9z~U&WR*tQnq?Q3M_1ZqmqJ)ett%O{O0sE6<+YR)7rDef
z+C)S2fXXaI(vp;do!8V#k%z^FU;>W@i7@FIIq5X16`TH#@cA=|xFAs+Ab7wPJn6#GJk1n&ni200aU|
zAVN*x@x=c@MGycY>4ym1W7$gx%wySybJU~RhY8FT*@tn={u9FqDCx078Vkm$q=s{MitV_
zCtK)cANrQsWGDaig>5cfcB!Qv1kS>v>{1)K^b&|eqe@TpvrB9XY5hu1vmphDiwo^L
zOCjJNWmVc#8cyE`LZF?;!IVE9DxE-8YZXuKO+wp=%s=vqX$t&5|ZT=
zngl0tv@{_3Y>sIXTS%*!>DwIF7DQLtauj5jLc*dVTQdy+
z!ruUxh-3co6XZbuUkTy~v%ik{>ka}9h@T)n`S)t+
zU%t}6F8YrdlGhkqAX7%YnuU8vQa&WHK>@n}fH%?rR>BsFk1LfXOu^
zN2QtUqcF-@e=O?z7+wtnxIqK{l(RRIkSr!yNQWi#cbs7R79L0C%7Fd;o{k}M{}y}-
z>Fjdpq6?4yCYan~OesuAI)eD4Q07*0`X*9P14m0HK_toINafO9i~iL>N-_zeOcI@+AcRv5
zj0Ncw@)^YzD*QX<=OBV1O47|mO3q>nB_XIlRE6A6+mG#=J4ywSdF7KkihcDrHAA%V
zk%SmQnQ&xVD0}Ne27xfQ%vX>S()}!U6j^R0=uH2L%M9kwE5@*z#r!fywr3
z1QNATHqbw#1_2&m1O9&qA-HqG1&Gb9cMVS~Zt9=i`Nxm8AOLMh%nc0i#lrykvRFXy
z|IBUw&d&eY4Iij*gyNY*EkG0n2$nOGO9z|EVaZWa
zG%$@prfbN&4hj4*ND_WR%@Bc1C)(!x0Fwc~fW^ACUrmdzSudJw{rlhK>tgN7^projz
zrX;1Jp(3ZOtRkY`1*?T`U>~@3j6v>@cN4N`ilMfO7i;3
z@cK&i`il4ZO88F;(d)n~&fr*OFENkmx5sHN4V~P%f+)(A+K}YOKkK@U)3it$CFfD(+Emih?JUhDAnR?wpWnS#eRSJQQWC-Iv9k#N5;VsEkSKY$I7D(?d0ry`IKv
zFRWb2zt1WDHeRb-8Oqc9tnlL{;^%AP*A`wXnceB3hVhl|TI0y?)OA-lgtPiwo9Cth
z#qb2MM+g2BTwUuEgYR9*Z|t=#B%uf#Uhq7M=ZMr*UVk_|lpa%g-9XD1;AkupB2lxe
z9?2|goc>wPGwW5nc-O&skIY8Zz2iRn8fM!`TI7~?Mo`jDkLzhH$u$V-Tz!)t^dT%0
zF#J_%wk0Rom7^b1xv;@s(pn}H;Q!=}fU)E)&F4%d&144PT$UD`z{qY+$lMl6Sdu*x
zJa9V8L;&%my#<@W1>L}aFV7p4tP8&3fph8aqXAnEamak`^;!1360E
zOYvopFN!N>xFKKxg#X8(RlUTJP*-F*)bxPY!W%h(0jVvF!AP9`LUNhZsoKhW;qyKm8+Q_RairM#
zJt71)?A5F4KJ~tU%^_nHZE?b*{8PILcjlTMJ|(k$<-jqeN}52w==OR<3W#qx@jzMb
z!EaLNZ)+q9^nic%62jP%{`$dxmW75WT-PQ5J!N;le;L5%XQh-%W*Nhb-ll$=>?N#9
z)mtC_sJs3tI+b0`3#EXUZ7NAY2I}CzS3_pCGxaTYxP4BxDKtuHetvF@b%;J^AB@du=(iyfW{=nkmKDk3c&Eo>%}5;R=6?@fpQGLW)RX_m?)J#$cwkgDVz}
z(caJWa&C1i(iNVBAvOZ82FFaPCYirM3D$?eWr*&@2`
z-%#YFqt!^d*bwmaK$5Avp1T;8ra&yAzAd0jH-J{3uA^#v1Ika3#oQBcV51G-O1-gAae
zZt6N-0`A5WaY-xJchCvUp0xHDfIm?k;-W!rSh&f{)B3m3UA|iS+ZsW}
z^E}J2t|qw8ccC7i2wI22x`&RTjyp*FvjVxO5mlYfGQ_uwQ}=93hUt
z|HkQjX7Q5ro}H)&RZH#8`uCQ@5X%RD5li$|C(zqc(KOT}h5z@)`WWpe
z!eVtcJQ;#^R%uyBs2sAQ#QDaaWp~7ly6pqsWeLprXQIH>7^jZAa%7!m
zvzn-kdJuh+<2M}dWlgdxj}D$cbitTWVLB|!F{s9Szjf-2V3k{6XMh&>j!Gd)}x(>;&RgP%*Nug8j}X}@ZH
z;_7f4RPlsC(_PYctnuU8GwGQC#e1@2^#oYH$-&BHUG1sBjR`MEE{o7PL$FnbhQKxu
zrWw~fDsCke(Hcfz5qly|!MZa}3HUn38nV~u*1`ubPqe_A${;c_
zSll2`6AT+LY8ssiHvLwqKN^>3gi}cI4-skGW|$JE_2Dt_vPnm8
zHrn4ugbiu%BTMG&rR1W2Tb8-&zfGLZLE}QOZFpW{3&szPJ~EsyD;wcvg2dVg*o*AV
zc+kxzKHj%y9>S^atkyA?bh?4<>+*|$;yGkp_Q=sc%5X1HKFmPK`%4^)+w~m`IjG(g
zMaEm&S*i8I3nJLN#r>z*`yc$t5>Q<oTHz{^O>pizf)8>#0b?N%O+(Euk8LLWzajei~A7=mLO2n$N*0
zjbceH%xJa~Z?%4KaP3zv3$LQ(Djunr!qk`|GXwctei9Nn$gjjAGL&V^A((C1g9c1n
zb*Xn+{`GH}&P4gKiYei#S~?~6WNxUfvdkS=Pk&*K48{Cd+bYq;Lv8H3M;TRw!*-wy
znu=>)Uds%!+a9^{)M9Ws*cDhkG>U&%Qlf*0lJaD_M*HF3uaLo3P3f$w?&~jBYPd~Z
zKRLcf)`U7nBW3U6X{=4i%O{5gL|Urtq~M$(T6W?NZ|uro{Nxv7Q8d_r?cSj14gc8D
z?75Kri4wA4J4o~8>EjVl&KI#%(IiL
zCRVDB%-s4d<2!aokc3en=HjzQfj^@I`J(9%CxJ}Nrsoja;5^YL|ezcJ6Asx$hr7!~jXkd#WT(ki=QF_nY;kqD!}Q}Cv_I?7^`
zd+313#!!#Qk~T91Fb}ya3tHlT$r@i?>d)TqB}CPY{o+1pK?Aym|T`aSz~bT!(594)lJ
z;~-e-&PhY(XVix1)t>9nC)+j4`_?}%JJ=DK`%U`xSof$smzy~~f6yo1D)fF69~9}l
z@4Art#Uktsea*MN74%!qi$nfK`dk8sT9hlR&mX_p)0-uLsfH7@AWgb$xB1-Z==;Dz
z^7>HzqX2V{P%$N?hsRsWK&$l=e85sJ3VT?C||2T531(OK&rm{
zgwQVMpy6danP?vRgz7nYNqhhNi$MK=c?(;gZaW{QR@`C}2
zRBkpjc#JjD_%35eB4*U|N;SvER0$m3i6ZpZOK^T|JE_wzO`u}@zPS2;x9?5^H|#1U
zd$af&=ym@E3kV~Vu{8Szjkb{>yl|EOgY}&}KgP&+;ZDx@(HZSz#jj>d{NziVqbB%&
zx){?4NllGywV=$WHhsZ&r4J06^v%tj;nJntXM&Stzo#is!N4GoXQ&bV@SGDPciLX<
zu&R
zmmCNSRKHC@Xv(Oj;GAVG8(T%WzDBOQ`|`)`-l47SY9d^gMY9{mi4uk1KQTNMapk8p
z9z$l6=e=@np8I@K$i?Nzn%9+ynes~;udxR-P|RS>@zE6jH7wVdJGE0YLN-W!q@S8d
z!?N-49hRDozs}bWz1fAnsON9O_09X&y%rW-`E#_J3tDtKSH?Ri#O12}NH)|L4#q|c
z2960tp{w!QiVVJ>sh4cO2i@5eHqg9Vo_^=}#F5&*StePtCFlP<@R^vd+76mU6IQKT
zdT_%BK_m{{GajoOMnOlh*nYsN&6IyqDzBMLTVkyr3uxvzyH<p!KpKj+9^RA1>17nyH(GIMK
zYdC=|qVE$yYX;%fBiD{&Fo_(?LhC;GnM{Zi(YZ9CXsBN1&AJRox;ZNKhgET91M!?3
z&>ncSAFDETI;?)3cBNCsxQ733>d%W=tsy1&F_I)puZ}^0kgL_4f|Xc%fV7>FgjW5W
z5TM*yLw==u?}ECv2d>8?;2LSDsmO>rmTlQ@n217-Ww5k($MAM(Esl3u>WDCYTH{Y0
zxLZc$o?A7}(7Zhj3q1mD`l_NP^cQMcwuck|3GFUj17diO8bj;xu*RYQ(RSe#N
z#qhELqko)5u)zmu6^~jM2Dh0~A}nf2E`0Q9n0~jxBy&9L%O6>zUptM40ep2gu972}
zFpTfM4EaUp;TjK>J^*~DwAb1#p*ey^^<%DchRW8sU>zYSpo>K%_*C!8>|y8-Go<*ZYym&}^zhAlw;+@T%5t^>O-vx&c+X)q
zMJm{zDYkha(FD;Twnfp5x3zU{+P)12OoLdrciO{S5yfl8>F$!b<
zSt9m%o0H)C&+9e&6}RVx`+Wg^m=9i3;ZLUU)RNOYkZ+XJi-%W@JZY-sw-(VR0bU3J
zeE08#?RQst#Hkwrlwumr6PM`dTF&^e)7$Zjux2&@AxaMq
z{q!j0g-vsDDXIJTM<9`qR9Es0Ij9K{c#Z-ZP+XPo)vG8|95Bei%=~PZqLh9s)SwGL
zdpBlTvg|X)-?WckC2XtmO4RfLJuxDeZQQZzZ9ShpHS**gL(QQD^_wN+Mx!o82e)Pn
zfbiZ@<@ysa!6ITCv4l_H?&tiiFM;q%EHHgj9uxJFLIZcaXTr(lW&}yJ?+BgfCJPx*^9@!HWIC;Xfm_(qKc}wOK+B
z^#UbDX4+GC^dlT{uM4*@ju|YR2wa$)JlvanyqlEH
z$T}QG^teb2Ep#%`tlrIhHE+^qa>ZhixwrDY4fce5Q#oRhc@`XHJeFo$~UVMm1)h%)aarQ)O
z$j(ud5gt(V2a5IeO92=5JB@NA5%ZA2StPHMCsg}WpLLd=n}o8KLQtvu;nCWdCKB_B
zpxyYKcN5Q_c{X(%n=QmPsf)~5Lba%tlw@;C0@WUR>^)oJV`}F$Cm)^Qz#eyz8^ssg
zH}HU`ru2ZGwPJaN!e`MZ$_V6AfkL@f27m+bhtv3Q6nC8cJ+OLH=-9<+LV({9-NVy-
zd4w0Q(T4wzh*VDlG_*^2s+pOZC@l}~d1X5hjQilS?s3lqo{QX-+{Ot*iQb+<6cpw|
zEKmF{6bz9jQlFevS$m}Q@9E1@wMgy}+tISJDzhY1Eh&4IKq`E(t5b_RT1153JzT~;
zOCS2Q^PdnyzEq)M_ci(FZWbsf%OLHKx{z(VUVpoB3Pyx-fJ-ZROnDaXBog>vYx6jeqgu58(IN
zdsMig(Q>7kPYwK4=WE5PZgQp~@ri~Kg_Kx>Bq9vsvHK3%KIk&w6RBn@4TUejb+KY0
zUZXB~$GF8$Hy_Z~`5K6PAU&v931>&4?vs+=b(e}OQ=0Y-vwR;>N5V@rUxaWwQ7eGF
zC$G}Vtc&fl*F5-5j*Y+`j_AH6lQ%F_1=pLOmjFnf;>aEBiBW(qQ*D=`?G^SM%C|V8
zeb#YLMRA7gfl&+afHMj{MYaBX^J6m=O)Mv7?x#Ov;&Ftx#`0BB6!}{XT!BSOQ94eF
z@!QvPn9DNCzS^E6lUgK3e$!W)$AqHRXbyhUrvRd;(b#L#?t^zGZhCy}@qa1s`bB~%$`R?du+nok#;
zmF}!786#zXU*{ysIa4(E0tNnM0<}nBX?xnEmr|OEcqT47%p%mwP^g>h^J3>;5RZ`Q
zv;pe*!(SC!pp2VYGEbjz>6hE}gjk-`5E&+UB9nQ&1c!>VATGwos2Cx-`}hS)@(~Qu
zVz$?umKpnzt4j7xPvnzvNo9S`j*d|uBTYwlM;=W23&tl7UiTpOa&Ap;P~gi=wn(K=
zSm2>7jFxZ=Of%hl(BkXyTF$te1uhuCd0d$&F#XPW#H(Sm!a!jgq(U`jyM9I#CU*15
zdN(YL%Q86Z&s&!{M2w6!7l!XyabOEEqANSjwE|=x>efY(HL86awey8k}%9ZF4R*>cnG{>^C^ETi`}-|or9X1$s*aP^`M
z136jdhbnj4$nUdO+tB8t0vnm9_j2n
z9uANZ5yE2djGVqN*YuZ2v6O2s<#L7`IL4=Gz=xV8?jnGILU+%dNdNvtecRY8z~hB%
z_+$~?bvHE+JR)Uqy%iB}(zbQ`)gxGMfYT!F0Eawz;obnMTQSVX0{LWc5XVg<2?NRx
z{2U|fKhIxh=Elb`@>XqrC~|469eJgX1tfV2PSm%1f4kt!iu?3~tUB)gjz;nY(|&Yo
zO?Adtd9H8M#>D7q+1WPNtA`pPJ|MSTv(A3K=lolthck_AFu{|yzLEa4F*Em5RVV+F
zm=ikJuhHbBIj_LD_o>r;L^L{=nH}4Uu}Ys?_Kfg-R;{HJ=>40-e6nWkU~_}+%|d(i
ze~P60D?GI}rt!02#SQl#t6*k&?>8Teer)uOmX?GJXIRb0;pU4~wA%%WpU&1|#g&JI
zTt#em#CwtK8g8MQ{UILY7MGQXEFsUffI>$kYy=mRlU(yud1KWR;vXV1Q~g}un26`u
z!IWxyXwmB@ossf2`zv8Ua*qT2scn!0S86M6+FOJ9Y}|TV{H-NfTiHRw*R>#y&7e!d
zU3_A-bGu+6(VtB$80IG1ycCpdjQSLAxT5g%VB=9CNtc`v_XvFFnB19GVJ1>PNtnMbPi
zK15=Q9eb=GZ6!pq!23w^Tz~dy)LB-T_>N)@0&ii!7O9TcB_VqA7`W%M!kIdSCMkLT
zW?rXG8+PotP3=Frdzfu1^sE*ITwvUbTv8Ac2HepVLiVt5UYY2)|b^FuN
zo3mTC0;dXS%|i!Z%)PUjrEE2e@S(D=tRR~H32d(rrsmjVfpo3u@bU!_!H|Fokr5T7
zO%}R0lEQvmVf|RUZzqRQQ;dp>Q@kwy)9=>hA(-Z;kyYH+&+x$QstbH`ab!zH&E{A2
zETtV}3#E^oE>pHsR}onqqZv55Z{ACNnxj&%Ic1dKwI#D3{L1+fDta@H$2cGV+p@&&
zP^Ky9rK`J}Ln{AUsg5bM!;3Z$MafX3@rQL^b6;hF5edm`s|9_dAscr@Tr$k0sCha>
z^r2G2WNAv
zBvLvGO{AC8be%KW_BENj{iQ=YyG7Wd2s+e05s1^er8UqLGgT
z>wf<@tC#M1|M~VEbL=mwp}t!{DWQ|qrm_H){+sCn0EQC7DPCjK-GR0Fk{eA44t;Ln
zU_U$GP{8Sa2PLNI3f*gLiRcGgyb}<4=q`J4ICT54@p;QxCtH0;?;%;GW^^Nk#z7bO
zh|qIOh+H&r94Mg32}nZuibl3E{dn6@UF#UBkUdtz7dy&n&uQJVEBE>~CY}z4$T%i_
zAHJS94fWP_BP}bnT4MWY{0il)@J!3f2wF?0FK$^M7o*_NvCEqBGsxoNZGM~l*urbA
zdwJe$$8X!^BCW5QN*sm3@Gxq=Md&QP9Aq#ZUiA5uU9D?I&4ZzKw5}_Y(op^e8kLqmcK;Ny
zUw@I#Q0ZZ#K#P#GvnUVMYZHlu;oWete4CVsBr5C^MkY&^GmHiKeO}r0w9{_G)ai&e
z3l1=R`3ZB-jQv{m#6P^|SZ>Ss>OVfQo+^0vwdz>bB_vtu^Pd9(f?i2QOpeJ34uz=&
zbS*c*(Lj0(l5~veWv!Op_KTxOEFGE$NJM#g_i$p!SPTZZD7v9fbJ4q)E
zp10e_NOxO#%ex7JLq6CEkdw=zobHxF&6W$bMWjxC^(VC@?>#B#p-7QEWawp6A@cc$F>$seR(aep>2OEasQR8Zdh{M8D?g6yH|ORJiZ|)I
z;oA52ue9Pl!U~XYl8kaLuy(`Hf1BA}hy2P8?qlq{2@WjUj*#ip9z{#(nNrRF+hS-Duv}cmG
zCTXgTAXx8lusN93Ej9PF?quu*Ah5ShW}58j2dt&iS@cCvhr|+tt0TnPhXEZTF6X`aF|otGXN2fX?OtCc7&oTTk$or7bpZ3X$(mL^n$aqi!Z)3+*=C9BRgomuW?
zx63=@8&gMfV%!bFaq^-VTbK!fcRudiYUp;XzqQ}gM|?F9vyh;aAThd62Y<_zpA)RS
zsikAw#Jk3K%3V-qm7|+Lc0<&IDJkkxV`F)
zF!H$2LJ^b1oY9aOOGid6ZIX2tx+d|qN?n?|@d}CeL%I@$nkLVWNS0FM>*kV;fr~~v
z*5~v7hcsX7Iz7G8me_lO`D=f|ZkmH$+3&)EZGI9_bH3g~#wdqzcVA-|f=*XhGhBI8
zuyiz*B82zH0U#5UzO{^REB0jn%RVFCaVP`|jt`EFjZtn?>Ca9mSS1qHL+r`vi*wD0
z{a0zcH$-C%agBrMlr%@%e4RJl#9qSzoRDW>alf+sBca!?R|ZJrYjPs^W1byuAWsNF
z*%LJoSyg{CHoq(UXs`2ZSd@$T(FRZM2hj2b7y~+Zxi7w(G~>`u=WG*EOmuh9D{3}S1LVpazZ?fEoquymG9rVP}KJs#!cq4c27g%(s;a}zWPD1
zsJWD3bALXXpr7Y2%GnjkJGS_AxBcDu!;?Qf)#*^j<-zd8G0c;g$mzkGsdJj!Fqk(`
zENsA*u7cgUX(o@1J&d3@v^@n>EM?d;iN44<=Ka*2_1u(I9f7Zt^+QV~*_H(yrnjZ#
z=(t(&s@hXnK@^XyD`s$#3&{h59w|~LQ>@DV1
z*Q~y-betHr?}RCFywly1N@^Oh=3$j*jep8An)UL;)yVL2&}zwS=(_*A1t?f`fH_7Z
z$wWsQTl^A_jJ%8=j+FSO8Uzn-w1Sfrvp;z}lEa++`D0#VmN!!=@*&Z$rL(Ujy2`sY
zsJfL4Fe5k#zlFHPTFJRhaw3pAGXRPxs;Lh!sAN&W_VZ8eld#~gHFEf
zA%rRsQ8f9hJ^K#a@}>v&R{83~twSrfP^3e{3;$%cf_G&9uH*lU&PCwd!7!D`W}q_+
zp^`m5H8f^8h(r%8-@?HJ
zbrPh!F>upM5!1kS`(Y)C`<_t($^3f)z9ZW(&A^Xnxo>?Gx@^{4gAP3VT^#dz*dd;R
zVsP!Zzta^iGFJ0gDw5jOX2hk|sS!hPpw$dNRxnXYt<<%rD&VLw+?4_~Hoa&3O^C!**D)z~xkk5!1f?TVkO3ZKkD
zhq4H^AFm1rFRE!Wb;y0DzXo$o(|sF6Z4&_4P{02qQUbTUH}A%|dxOrykIW6ouG1ee0qpEbu&z#wYJUZ#D
zSpt3Hb!KP8e*5RAcx?i2L@hnuoU%`F3Rrju1hHjsIUHP`w|*$0GU9ks
z#GIS7d};3Kqyg~BNGvO}*jO7p$(V0`D1Gv7jZ9k;mLn@$asK_@Negk{m)AAcbGi1h
zTv_RYpKwL}#{T{<4L)>C2^ynAd3VS&h&s^*2707*AgiOJBm#}f0C>lTY*K`JfXS#m
z!VLO`A10fRkQwGKi3!s`ML_5KNfJbF?xblUM%k5ovQ>Hno3%QJy=DM=T{5#gJ#~4#
zhh?~d0onOw7Keb+hybb-hiAZ=RIrUV?>@i_8P-|cG#5OXzeUtl-L^)VO3
z;SxT-B5r*u(=TGg-d=PMFdB#^+sYzu3&U5~=j%^%7-=3*dcO5yxc>-4?a8qYg_ZWe
zp+5Y({7QV(XTb~l(=6N!rxZ)NjM@F-tZPj6l+?`>(q?k1C)#ht@PjuLk6(k92y(V*
zlz!4DV<}njLSOxQ+d5w#HsgKEnX1lY;ttah2M#MZnQh)U6?>l`%`dVm8s4pi!gqTd
z)XbR(D)Ey3V;dr~BK`M&E~D_o`=Ys(2qiK-vhMGxPP3xvte$KU@Sv%_rE0Yv;Xfk!(k)f8N8U;S*JDZ=joZc<
z!V53wK^S48StUCvko2iMXA(XX9K6r*329pIi>lLMt|u|^`#gD=y52-;6Wvwi0{3d)
zeU3e^o;R5BLX6kshl&%E?e7C0?Y~z^Rj|>c^7nj~Q?S5a0yFFE)ymQ0J0N!#9@>x5Wv|_8c`9sJ>gqo>*ybL
z6Wy#>W0M~I3wc4I5E}`p3q&AwtZ?-~g(v;jhnl#<2@$fsZtf)_z{ed_oTav}v4d
z3$fi-8bbzeiwZjT`l6Dauld*RjAUS7t~V4AlsFWi1;#QWX>TAAZWo@&-H)tO~V
z<2Wa^QH4E7j3`xu;_ttm$jy!|_J5M=cpMbt@Fu7eCR3O0A{)3SBCd@b{!*2)0(lLq
zjhh)*O9jmqT-xX3K2l5M8DUgf((4;~Kj1WK&wFI-LC6TijGzpN<3X
z2XsP*#{K7o3*&_jt$pjML#RsPMB(hcsnFSIXmDgPS?+($oM1U>P#w5!70;5ZtAd1i
zCA?hW_{cpU5pDjIf;sEiCz5)x)za?EN*QNHmHeOB{OsfDoAq?^@8yOvky;E#A8RD6=i)~ZQKyvCQ|b4BzP8>fh7u3I?0gI
z)EvbK+qOm(J8Zoz+{k>%Tp#mkGHk^r7Zyy6Hegz}PySdqog+!{t0m0?3su`_Kfo2Z
z($E6xQP8MlKh#l>e+7rtzJ|IiV94YnN9xx~e!>`WaVq6&
zG7KaN2P{6RkF)!BV|%Bi-sct?uYzVc*9f2@sn4v0AR(CfwaN8s3xBwUfOysq+ThPQ
zD-&>tn
zqimX?(19HQ#-<$`Z2ZpU(7g^rW^&e!V%RiE?cP?fQzEb^a!K{x^QK@_i9PVWap$n+
zWQ(Z^w~9vB_pC`gs(~V(xGjeUJE2&cu9sQqIvUwd`x7T%oj_EsULECeh!SxswdjH7
zTvDdTl`2}UwWV4(u6tx%OGTqjR1$fkMgzUtNsFLaTWPP}|Cw3kMvW5+_{xjz;euT3
z7M1}QOmO7EGZP|75}KV;E=X>xA}}r*&y9gO9C_0Lf|-l>u@p!~T~_^WFSoJPC(2Xk
zdPJ%&@~ds3bW&}3Q;$^n&G~?m8odA(>DythFE)d{o&|l$@dbyc>iI&!wf;z#gYugI=cF;z2kO;e=T!ZHfK?s39>kd
zvyR0%X5qDSwAhZdksfuGSe^%Wa)&HXt?hlIut>F(>m8i1?Vs>Po0mgc5Z2Fp3;m`o
zlhtZHjE9%dX(%Jm(>$yR`dob8Y#YH3k?SRb$Bf0ce-V?!$_(xjhm(o`R*kHqo-dOL
z(;j6|jQXZf`Ul5*jz(pSbdcUh3Rv^pM^l;fUTYrTM1jIzFDH@LO->q$GEm(QTH(Xo
z8lRg>lgu{aR4v`o{QLrgR_r@ET)uwL@!^M&nJ|<|&M|!F!_Fl2;ik5+bxz6zxZ6l>
zA^ILV=;*pTD$Pk`#{JDN39=)aj4M6^{O*rS#NkZ>`iqi?ySAKKMwmQ)C!x!(;;P~z+hm^$
zaLmnFK`=04=S%>+hz~aGJG1&k^n~6BWAdn<{Xt0ZOoKOF&hZ0<2-V*z;9U*^WPers
z^cW4p*57(pL!qnUSggEO>edj9^ZORjRi^=g-TtKAx}`P5eW>*Z^*Xki>-$D0;;M+?&o%Tqs11f8xmPYb)YJbX@d@YiswBo!Pr@s)_gZUVj|hs?Yz
z75$-zvDGUUYhghQc4UhXGwe6@N^hh#_F*kVa$>ibRrC*Q0&PQ?8>h;FA5$8F^>^P>
zle45ut}{|~xUqMa$KNP|%VsLk4Sb?-cA^9`vijc#pjfpHbu{XnIZ1x|vE59XCKNed
z9KD5B8d0d7JvmhnfK3UGQUppItiM_@AA)kbqa^ZKG{u*gLE
z9#PbM2gY@x!@9W2fX6dL&6rwnBcrItoQ8iTVLCqNmcY<{oWywJp}?cs)&Y6#QX*I@
z=nJy~D|KeE=Sk*U<2!}2V*R!q^;SMyA-617T+K3`P<5dii|EMYd;vnVDG~m#p2Pi4
z!FfyVBQZP_4(Kg*&zyMLB3yfx8fqUlLusvB0p7Q2>H-0yH!B9tW-E^05E+++E50h*
z$nBv1U5={~1tfZu-c3>a9O$}zCiJ6l{j#%+jDTWRM4Z=6Htd?Tj>h-{DH56X2`<^M
z>T+zQkfcgfWnm|P>-`Tl8Ck^XOoT{P
z>#u+AMxi2xD}nYaI41q4;|4GfEOK42DxQVSxjqZ&n(CPte)N_ph9a({OM%{#Mu6c~
zS>w^E(h`b0MGxYJP%=E!giqcjAO5H}FB0cA(VhLipU*t2HO$I(x
zsWYV%5_uzH(Jd#Z%7z$Lu^{ktZTZ%kW5nFYhSoXL-5gLWw5%ZUZ?`nx1ZK)4$@1iPtSfxw$31-)#5Mdq`Dx^>+O
zaeckgwEv_*?4PwQiU}B@jhVD{{#J~YN*;j)$5s_?>&w0Q(ac;&xVo$pvnRsP-1B8#
zH&s(xA%iz0DmooYx7p>%K1?>AQVMs`S27GHCsiXJah=YDJ;kH%(+fUX9NGz}es#xb
zcS!7o3MQ!HI;2TX?O^*DnSl!1+-z?p6NspjhZYRmx}qHoGS>Vy_87!_X;ar}AT2Sd
zqb5|lRU!w81fZO)*#Il6PQ^M={6$DFKOei9Jo0l#2$cZ-cW(iY8S4zw0@EmrDmQya
zmuRzZxlv6^t$d-MBs(wssHb#apM|yO%RdLoT@+T@S@tF+vjW1snqQK$&x-F_RwBy)~_Z-Dza
zNo32x#2oa8dDW9yYr>3MiA<}NhHQYatnEl)6_358c71U|@98wEVwGY#*xkqX$f8yE
z`5t>Fi9<}*y}LUs<8?K$XNZ84-PPHjyBBR+X7
z+qp)wg%bM?k|KCy(Ws1~5XY4pj{rTHaQmt9+J{Q(re~L%w_BwJ?@H(taldd|D$<9m
z^OqLrGxnkXi59yYzP5;PzZ&b*b5mLlx5`BOeif?8HcknLc(jVY+GOn}}GHqzyLM@+qYpmYz<}
zf7fEU`sHNtGpIf@5B*I{0-V^07zODPc7U*RNbTyyB#4Sk3hPS1dpCjk5Y5c#vf75Z
z#iBL-{HqlV5!PBq>;V!%ZN4aHyiv#@HRC*yQJQ4N2U<<*$!XorPsfs)Azyzng(Y5d
z1af1JAO@UDt|$s}JYs8oDigVLa_1gdxbyg
z4}@|TfM516I<#t06ffB3crufjP&y4iR$>4BYaYi~s><**d;pVYtfQaNi>|-}&ymcB
z_gCHkkI&CB8X{|v$CLrooKDSG#%SL^vKjurTUPSfl@2xZTSY2bqm~YtB0u$^yOnBb
zs(2nbt)g1`Kz7p_B)Bi>RkaE4J5Znt3_cf6-gUnnR};u)3%sp^{Oux=hS)JNOxwBK
zCNkCnZ6(eP_0v}h?u63171Os##45dOhDKRFZQVYfcW*`>Ig!k>4TJRZSLI*QNJkJ1
zktK|_jHq6V!twa?D^9_*j5y(;19LwRV-yVp-{EHmv>j*!P5G3lS$ypmLQu#j8NtnC
zX86fez~`zl$5z#ohKY;+UT3VvxNxgvxC&pf^=@OyERir-9
z3Kq;J8Vd^kl(57CGwfYO^A(;O`o6Poamp)XCt;@b_8_3^Q#apL5lTmcrzy(0%7wdt
z5Tmkp-kZn)KUKmoi!WkP{EE$LDL=|r*VnP*PkyBGCjEYUTLU)c3lBqOJ*n!^jK{=zaV+I469pE#^3tB%jXeqt3Ee+@od<75^9c9)TDeptzyEb09;
z-ub=l8+GcXRB%XnU_9Z#<#aq7!joWZ{C@&V47Bt4Mjl%(%o3RjWMW2Y7#kV~f=6D{
z$2*{*WZ?3yF%l;CATQaE8AbKofk;CCSN>=xwqhEKVG8Vo$|E!(S-GQ2fn}n6Q#-bW
z?DLmJK}_~>=YO`%NxVjML3+0~R1G!haybN)&K`fK#c3#7{~$DsvIK&I6)|oU=v%6W
zt9AOxl{J{_aDfQl7~J5gsf+P4v)3tIcHuK03@&l_ZvgXa-w_x-0}H9{u>!66$zRd&
zf<9kPAK2=-g6Aa%b4Om+UUwjx#>MIK*x^&iZ*)0fupNikAZx;I9+|P66%Fa=A@9xY
z{|YDN3nTRZKwt>Bx!IyYxiVU!n0hBiQ|hV@*%j{`s&cMPOi4Ksq~siaXA#_^Ohw!4
zA1hBSFijR%0G>5tbw&}De(DxJfI0tiLIW58`^5d=WHyGL$OTz=i<1BK&%peQL|GNg
zme7_3Z(8UB0}r`AjHJ^2u+@BwT07S_D9XI$lip`$Rv3kYpTOCyaD+e@BxtFj+cT_P
zcSQ0Wd&u47a^PJaq_2o3s)qpCEd=GrVOEL&oV3AM;TZ8-J&Q14#88qx1j;y%oncLG
zI#7{K(q_$7ig<1c%|Iik&CRX((Df}{pVxj;nU$5dFyhYY=^{vX6_h6c8~{*h3>j0L
z6axxWhm(rEVP6GCVdM~K8Syj|>^R&(^Qc8Q{pFCFpD1anga{%hi?|hyrHjEuq8)k;
z7K17Cl8GZStkIOnhwgeb)yekBKk>Oo!&Hi-GiX(W!nt=o9dLL(DXl;}cK-;jF
zA_@1H^B|IO878O@v)?=-w9c-2WD~tGg^|12t3-+Z^ew(Tg0{@ZlzPM
zwjwPlwy6@av)b+AmV@3g|LP=UZ|VxS6@@50-1tppH-uytW>=B29a(0hyNz|WyJvTO
zMROV)ET)wYNQRpxc_j7k#9yypO(&v7r`Ktzvt~@~-Eybm0ejp&I_Le8JE9y*f!Kr#
zWe!Awk5pg|v^u@ae(u4G{@jZO0KPR#{OAI#2k`~~$EINhN>myHz*=8l5#MKd8&RdO
z@b3xKU$(x?+sZLF%E=BBNKdE})?nhHg)x#)DpndRp+<{sbK9;un_x-8%qa2B>)RLe
zO-2fECM(%tH|MR2p{!UG3zdau(Uz*kYrV_;(q-|Ai(`x=K;ozf%rQnXs=|^Ju+p
z&3;!IQ)7Lirji&<@dfT41qj30RvOWicqoW@S*i;S2LO6d|1OG#IiL>S6Im+Tb4jB`aYWlZzNnuMlv^vO*u_R~AIBbgaLQ)`o(s9a#Zuz<4T
z{YuqBORrRpbksL5qAy-hsG|A&&tQ$W3(P>p-GTHOkQZRUqh|ie4s1;C1MZt%D)S>oKs7DDCZbXc}^PzAl`rshW65
zS`(+J%~G}r8x6?yqxD*We$!(v+IP)GHGu%#Ha&9>eacws-~PV%ginj_3XRc6=bMdg
zs7rs|`OCRFuc&r~_SdW*C)T$&^vl=n{r7R+-J0PvHGZdocBM56HOj^1h@@vdL$SY8PRR-~6Q)b#L3>PuR{eEG_C8@JcW2Re
z{V{(+ysb*Z!W^Zb2NDX&X;yqnmDT0h-8R5Z+p%c(JXOB$JWepD^fYF738f%GQ=+eZy432i$4=62jR!eH=S65!JA0UR8H}HJ
zXI^ql-w143!0
zqd8S~CtuYI`m-T5v>fQ$s-Ovhq}}OBF^32|N?CKXpifUdcZ|
zw2pap8UU`Lgc}r*5)87~vklQkBue{pbfv8w$*0^X;+sL+6?7c}R*O?Y(4o
z=TauSvA{al&D`{E0-?aO;LBTqc>Np
zD3HOB351P|rWR89Axn?M;`}a4)5Lr9w0xQOo{D
zm3^D|4+oG^7iB`&ostYBl}>8ROPdGAAix1j5Z|j=H?buMv+O|*i(O-nBBrmURkN@A
zai#8BvLmY$ZK(7rdN7?XTKk`Smllb5wBidY*%uOIa!h2zmkUDJiyTEHRpcnm=sAr8
z{NnRsTd-T3Qpxs;EB{mmfewd27=&qW50DSW$Y65ld*9|7#jjMaBIlBFO?RE;Y=L|A
zwxx}qi_UAZXE$+3xmHSyu}!z`OCO?;?LBnTP3!w|*a{-1z1T}pql*&z{rrKZx=1@>
zj}engryL=XDXc&ZEB|J-D%-s%x3`kpXSPj`!i>Cqz64kI0ALvAij%H_ZsVj{QhuRq
z!mDV6J1nKda%2Y^Gm#q9-}x#W%t~*tJ`US{?n&8Ua{h?gWbwJG_wVg|M{WGLQ+=wr
z_)QoP&xqgoFAWa9bM3cva?pct^JTE*m)nuwUSkgt$k=x4X9__|DhCHhl^f=%rC%DE
zf_mcb(rO5~0iH9vAixfhS&xsM0rxyS+Re_)pIvlLT<4SA*Pyld2WF=Je_%4cVfU#jQn3#vJ
zTKd)&8UA};RKE4eEG&Z>OY`M#zxP%F5YjeW0t7}O3|wLqQHlV-S}TFmP1LxOjb_M7
zWo}TS7b_O(&}1to+y3f*m!3C}ddZOZGf{UKOL``reVK@2`Lqf|82$OV
z00000007`5-5=XFwnb``!rPid*=_u>k;y|2ELZQBLz%w390z@v+>(<7lQ<
zHk{HJ??R9a$NjW>imAE#8BA_@{QqljETI4*z$8-ka(8wh%@+Ad_5tz;<_6+X2D1J9_ot*)mgS)@@FrYwT
z;yyk;LIZ$vs+Sr7inTSi9ZybdN#$zI;`+Y#*(dj~w0r;GpJU5ii-V?~NPYAB8*&8B
z0{{R37)wPE0Dvp@hbCuH^_39-0Jv$?B3CD&nXIExXQcHglR^6Ih84W4BoXp95)IP~
zkO{#~lnn*|@V`|%cb+)F=RfOMKMHc+_ZaPbjQ7ehbj4r(Td3ip%)Q;L+pp9L0TU1&RuBb68*7N#hDh0LTb_oP?cUDCfQE$EHm@I~6}REq;FD
J_MFV%#|5@j2T1?`
literal 0
HcmV?d00001
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index ea84f115a3..3933856d4d 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -154,6 +154,8 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
#define BLOOD_STATE_OIL "oil"
#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever"
#define BLOOD_AMOUNT_PER_DECAL 20
+// GS13 EDIT
+#define BLOOD_STATE_JUICE "juice"
//Blood Decal Colors
#define BLOOD_COLOR_HUMAN "#dc0000"
@@ -165,7 +167,8 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
#define BLOOD_COLOR_UNIVERSAL "#db3300"
#define BLOOD_COLOR_BUG "#ffc933"
#define BLOOD_COLOR_PLANT "#3d610e"
-
+// GS13 EDIT
+#define BLOOD_COLOR_JUICE "#0004ff"
//suit sensors: sensor_mode defines
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 75833d5ec1..68d68f3d92 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1502,6 +1502,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(HAS_TRAIT(H, TRAIT_NOHUNGER))
return //hunger is for BABIES
+ handle_fatness(H) // GS13 EDIT
+
+ /*
//The fucking TRAIT_FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
if(HAS_TRAIT(H, TRAIT_FAT))//I share your pain, past coder.
if(H.overeatduration < 100)
@@ -1517,6 +1520,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.add_movespeed_modifier(/datum/movespeed_modifier/obesity)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
+ */
// nutrition decrease and satiety
if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
@@ -1588,6 +1592,38 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(0 to NUTRITION_LEVEL_STARVING)
H.throw_alert("nutrition", /atom/movable/screen/alert/starving)
+ //GS13 EDIT
+ switch(H.fatness)
+ if(FATNESS_LEVEL_BLOB to INFINITY)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/blob)
+
+ if(FATNESS_LEVEL_IMMOBILE to FATNESS_LEVEL_BLOB)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/immobile)
+
+ if(FATNESS_LEVEL_BARELYMOBILE to FATNESS_LEVEL_IMMOBILE)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/barelymobile)
+
+ if(FATNESS_LEVEL_EXTREMELY_OBESE to FATNESS_LEVEL_BARELYMOBILE)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/extremelyobese)
+
+ if(FATNESS_LEVEL_MORBIDLY_OBESE to FATNESS_LEVEL_EXTREMELY_OBESE)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/morbidlyobese)
+
+ if(FATNESS_LEVEL_OBESE to FATNESS_LEVEL_MORBIDLY_OBESE)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/obese)
+
+ if(FATNESS_LEVEL_VERYFAT to FATNESS_LEVEL_OBESE)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/veryfat)
+
+ if(FATNESS_LEVEL_FATTER to FATNESS_LEVEL_VERYFAT)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/fatter)
+
+ if(FATNESS_LEVEL_FAT to FATNESS_LEVEL_FATTER)
+ H.throw_alert("fatness", /atom/movable/screen/alert/gs13/fat)
+
+ if(0 to FATNESS_LEVEL_FAT)
+ H.clear_alert("fatness")
+
/datum/species/proc/update_health_hud(mob/living/carbon/human/H)
return FALSE
diff --git a/hyperstation/code/modules/resize/resizing.dm b/hyperstation/code/modules/resize/resizing.dm
index bffdad6d71..a330d32d6d 100644
--- a/hyperstation/code/modules/resize/resizing.dm
+++ b/hyperstation/code/modules/resize/resizing.dm
@@ -17,6 +17,83 @@
M.Translate(0, 16*(size_multiplier-1)) //translate by 16 * size_multiplier - 1 on Y axis
src.transform = M //the source of transform is M
+//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can.
+/mob/living/carbon/update_transform()
+ var/matrix/ntransform = matrix(transform) //aka transform.Copy()
+ var/final_pixel_y = pixel_y
+ var/final_dir = dir
+ var/changed = 0
+
+ if(lying != lying_prev && rotate_on_lying)
+ changed++
+ ntransform.TurnTo(lying_prev,lying)
+ if(lying == 0) //Lying to standing
+ final_pixel_y = get_standard_pixel_y_offset()
+ if(size_multiplier >= 1) //if its bigger than normal
+ ntransform.Translate(0,16 * (size_multiplier-1))
+ else
+ if(lying_prev == 90)
+ ntransform.Translate(16 * (size_multiplier-1),16 * (size_multiplier-1))
+
+ if(lying_prev == 270)
+ ntransform.Translate(-16 * (size_multiplier-1),16 * (size_multiplier-1))
+
+ else //if(lying != 0)
+ if(lying_prev == 0) //Standing to lying
+ pixel_y = get_standard_pixel_y_offset()
+ final_pixel_y = get_standard_pixel_y_offset(lying)
+ if(lying == 90) //Check the angle of the sprite to offset it accordingly.
+ ntransform.Translate(-16 * (size_multiplier-1),0)
+ if(size_multiplier < 1) //if its smaller than normal
+ ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards
+
+ if(lying == 270) //check the angle of the sprite to offset it accordingly
+ ntransform.Translate(16 * (size_multiplier-1),0)
+ if(size_multiplier < 1) //if its smaller than normal
+ ntransform.Translate(0,16 * (size_multiplier-1)) //we additionally offset the sprite downwards
+
+ if(dir & (EAST|WEST)) //Facing east or west
+ final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass
+
+ if(resize != RESIZE_DEFAULT_SIZE)
+ changed++
+ ntransform.Scale(resize)
+ resize = RESIZE_DEFAULT_SIZE
+
+ //Apply size multiplier, thank NeverExisted for this
+ if(size_multiplier != previous_size)
+ changed++
+ //now we offset the sprite
+ //Scaling affects offset. There's probably a smarter and easier way to do this, but this way it works for sure (?)
+ //Just to be clear. All this bullshit is needed because someone wanted to store the old transform matrix instead of using a new one each iteration
+ //Winfre is currently doing a great job at coating my nuts in slobber while i code this
+ if(!lying) //when standing. People of all sizes are affected equally
+ ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
+ ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly.
+ ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
+ else //when lying. Macros dont get an offset, Micros do. We must also check the cases when a micro becomes a macro and viceversa
+ if(previous_size <= 1 && size_multiplier <= 1) //micro stays a micro. We modify the side-offset
+ ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
+ ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
+ ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
+
+ if(previous_size <= 1 && size_multiplier > 1) //micro becomes a macro. We remove the side-offset
+ ntransform.Translate(0,-16 * (previous_size-1)) //reset the sprite
+ ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
+
+ if(previous_size > 1 && size_multiplier <= 1) //macro becomes a micro. We add an offset
+ ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly.
+ ntransform.Translate(0,16 * (size_multiplier-1)) //apply the new offset
+
+ if(previous_size > 1 && size_multiplier > 1) //macro stays a macro. We just scale the sprite with no offset changes
+ ntransform.Scale(size_multiplier/previous_size) //scale the sprite accordingly
+
+
+ if(changed)
+ animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
+ setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
+
+
/mob/proc/get_effective_size()
return 100000