From 12357ca18cd55a2d0d34060d3450d89153b827f4 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:18:25 -0800 Subject: [PATCH 01/19] done. no environment errors :) --- code/__DEFINES/melee.dm | 2 +- code/datums/martial/corporate_judo.dm | 222 ++++++++++++++++++ icons/mob/inhands/equipment/belt_lefthand.dmi | Bin 5290 -> 5902 bytes .../mob/inhands/equipment/belt_righthand.dmi | Bin 5214 -> 5927 bytes icons/obj/clothing/belts.dmi | Bin 15277 -> 16888 bytes yogstation.dme | 1 + 6 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 code/datums/martial/corporate_judo.dm diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index 3987040dc31d..32749af19073 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -20,7 +20,7 @@ #define MARTIALART_WORLDBREAKER "worldbreaker" #define MARTIALART_SPACIALLDOMINANCE "absolute spacial dominance" #define MARTIALART_LIGHTNINGFLOW "lightning flow" - +#define MARTIALART_CORPORATEJUDO "corporate judo" //Weapon stat defines #define SWING_SPEED "swing_speed" diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm new file mode 100644 index 000000000000..1e9d1838ad06 --- /dev/null +++ b/code/datums/martial/corporate_judo.dm @@ -0,0 +1,222 @@ +/* + * Corporate Judo + * An alternative method of dealing with tiders that isn't a stunbaton for security officers. +*/ + +#define DISCOMBOULATE_COMBO "DG" +#define EYEPOKE_COMBO "DH" +#define JUDOTHROW_COMBO "GD" +#define ARMBAR_COMBO "DDG" +#define WHEELTHROW_COMBO "GDH" + +/datum/martial_art/corporate_judo + name = "Corporate Judo" + id = MARTIALART_CORPORATEJUDO + /// Only allow use of this martial arts if in the main services areas (bar and kitchen). + var/service_only = FALSE + +/datum/martial_art/corporate_judo/can_use(mob/living/carbon/human/user) //this is used to make chef CQC only work in kitchen + var/area/current_area = get_area(user) + if(service_only) + var/list/restricted_areas = list(/area/crew_quarters/kitchen, /area/crew_quarters/bar) + for(var/area/restricted_area in restricted_areas) + if(istype(current_area, restricted_area)) + return ..() + return FALSE + return ..() + +/datum/martial_art/corporate_judo/disarm_act(mob/living/carbon/human/user, mob/living/carbon/human/target) + if(!can_use(user) || !can_use(target)) + return FALSE + add_to_streak("D", target) + if(handle_combos(user, target)) + return TRUE + return FALSE + +/datum/martial_art/corporate_judo/grab_act(mob/living/carbon/human/user, mob/living/carbon/human/target) + if(!can_use(user) || !can_use(target)) + return FALSE + add_to_streak("G", target) + if(handle_combos(user, target)) + return TRUE + return FALSE + +/// Split their punch damage in half by spreading it between brute and stamina. +/datum/martial_art/corporate_judo/harm_act(mob/living/carbon/human/user, mob/living/carbon/human/target) + // For service only: make sure user and target are in their restricted area for martials to work. + if(!can_use(user) || !can_use(target)) + return FALSE + // Check if this streak leads into a combo moves. If so, do that combo instead. + add_to_streak("H", target) + if(handle_combos(user, target)) + return TRUE + // Effects + var/picked_hit_type = pick("chops", "slices", "strikes") + log_combat(user, target, "attacked (Corporate Judo)") + playsound(get_turf(target), 'sound/effects/hit_punch.ogg', 50, 1, -1) + user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) + target.visible_message( + span_danger("[user] [picked_hit_type] [target]!"), + span_userdanger("[user] [picked_hit_type] you!") + ) + // Damage + var/expected_damage = rand(user.get_punchdamagelow(), user.get_punchdamagehigh()) + if(ISODD(expected_damage)) // Easy number to split in half. + expected_damage += 1 + target.apply_damage(expected_damage/2, BRUTE) + target.apply_damage(expected_damage/2, STAMINA) + // Logging + log_combat(user, target, "attacked (Corporate Judo)") + return TRUE + +/datum/martial_art/corporate_judo/handle_combos(mob/living/carbon/human/user, mob/living/carbon/human/target) + return FALSE // Continue on with the normal act. + +/// Inflicts stamina damage and confuses the target. +/datum/martial_art/corporate_judo/proc/discomboulate(mob/living/carbon/human/user, mob/living/carbon/human/target) + target.visible_message( + span_warning("[user] strikes [target] in the head with [user.p_their()] palm!"), + span_userdanger("[user] strikes you with [user.p_their()] palm!") + ) + playsound(get_turf(user), 'sound/weapons/slap.ogg', 40, TRUE, -1) + target.apply_damage(10, STAMINA) + target.set_confusion_if_lower(5 SECONDS) + log_combat(user, target, "discombobulated (Corporate Judo)") + return TRUE + +/// Inflicts brute/stamina damage and tries to temporarily blind/blur the target's vision. +/datum/martial_art/corporate_judo/proc/eyepoke(mob/living/carbon/human/user, mob/living/carbon/human/target) + var/has_head = target.get_bodypart(BODY_ZONE_PRECISE_EYES) + if(!has_head || !user.can_inject(target, FALSE, BODY_ZONE_PRECISE_EYES)) + var/msg = has_head ? "They do not have a head!" : "Their eyes are too protected!" + to_chat(user, span_warning(msg)) + target.visible_message( + span_warning("[user] tries to jabs [target] in [user.p_their()] eyes, but fails!"), + span_userdanger("[user] tries to jab you in the eyes, but fails!") + ) + playsound(get_turf(target), 'sound/weapons/whip.ogg', 40, TRUE, -1) + + user.apply_damage(5, BRUTE, user.get_active_hand()) // Owch, your fingers. + target.apply_damage(5, STAMINA) // A small prize for trying anyways. + log_combat(user, target, "eyepoked fail (Corporate Judo)") + return TRUE + + // Your fingers function like a screwdriver that can bypass normal eye protection. + // Protection reduce the damage and other effects. Lack of eyes increase damage, but completely negates other effects. + target.visible_message( + span_warning("[user] jabs [target] in [user.p_their()] eyes!"), + span_userdanger("[user] jabs you in the eyes!") + ) + playsound(get_turf(target), 'sound/weapons/whip.ogg', 40, TRUE, -1) + + var/eyes_protected = target.is_eyes_covered() + var/obj/item/organ/eyes/eyes = target.getorganslot(ORGAN_SLOT_EYES) + if(!eyes) + var/damage = eyes_protected ? 20 : 30 + target.apply_damage(damage, STAMINA) // I do not want to imagine fingers in empty eye holes. + log_combat(user, target, "eyepoked no-eye (Corporate Judo)") + return TRUE + + var/blindness_duration = eyes_protected ? 2 SECONDS : 4 SECONDS + var/blurriness_duration = eyes_protected ? 5 SECONDS : 10 SECONDS + var/damage = eyes_protected ? 10 : 20 + target.adjust_blindness(blindness_duration) + target.adjust_blurriness(blurriness_duration) + target.apply_damage(damage, STAMINA) + log_combat(user, target, "eyepoked (Corporate Judo)") + return TRUE + +/datum/martial_art/corporate_judo/proc/judo_throw(mob/living/carbon/human/user, mob/living/carbon/human/target) + if((user.mobility_flags & MOBILITY_STAND)) // User standing. + return FALSE + if((target.mobility_flags & MOBILITY_STAND)) // Target standing. + return FALSE + + target.visible_message( + span_warning("[user] judo throws [target] to ground!"), + span_userdanger("[user] judo throws you to the ground!") + ) + playsound(get_turf(target), 'sound/weapons/slam.ogg', 40, TRUE, -1) + + target.apply_damage(25, STAMINA) + target.Knockdown(7 SECONDS) + log_combat(user, target, "judothrow (Corporate Judo)") + return TRUE + +/datum/martial_art/corporate_judo/proc/armbar(mob/living/carbon/human/user, mob/living/carbon/human/target) + if((user.mobility_flags & MOBILITY_STAND)) // User standing. + return FALSE + if(!(target.mobility_flags & MOBILITY_STAND)) // Target not standing. + return FALSE + + target.visible_message( + span_warning("[user] puts [target] into an armbar!"), + span_userdanger("[user] wrestles you into an armbar!") + ) + playsound(get_turf(user), 'sound/weapons/slashmiss.ogg', 40, TRUE, -1) + + target.apply_damage(45, STAMINA) + target.Immobilize(5 SECONDS) + target.Knockdown(5 SECONDS) + return TRUE + +/datum/martial_art/corporate_judo/proc/wheelthrow(mob/living/carbon/human/user, mob/living/carbon/human/target) + if((user.mobility_flags & MOBILITY_STAND)) // User standing. + return FALSE + if(!(target.mobility_flags & MOBILITY_STAND) && target.IsImmobilized()) // Target not standing and is immobilized. + return FALSE + + target.visible_message( + span_warning("[user] raises [target] over [user.p_their()] shoulder, and slams [target.p_them()] into the ground!"), + span_userdanger("[user] throws you over [user.p_their()] shoulder, slamming you into the ground!") + ) + playsound(get_turf(user), 'sound/magic/tail_swing.ogg', 40, TRUE, -1) + target.SpinAnimation(1 SECONDS, 1) + target.apply_damage(100, STAMINA) + target.Knockdown(15 SECONDS) + target.set_confusion_if_lower(10 SECONDS) + return TRUE + +/mob/living/carbon/human/proc/corporate_judo_help() + set name = "Remember Teachings" // Soo creative, wow. + set desc = "You try to remember the teachings of Corporate Judo." + set category = "Corporate Judo" + var/list/combined_msg = list() + + combined_msg += "You try to remember the teachings of Corporate Judo." + combined_msg += span_notice("All of your unarmed attacks deal half of its amount in stamina damage and half in brute damage.") + combined_msg += "[span_notice("Discomboulate")]: Disarm Grab. Deals 10 stamina damage and confuses them for 5 seconds." + combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 4 seconds of blindness, and 10 seconds of blurriness. Effects are halved if they have eye protection." + combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 7 seconds. Only works on standing targets." + combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 45 stamina damage, knockdowns, and immobilizes for 5 seconds. Only works on downed targets." + combined_msg += "[span_notice("Wheel Throw")]: Grab Disarm Harm. Deals 100 stamina damage, knockdowns for 15 seconds, and confuses for 10 seconds. Only works on immobilized targets." + to_chat(usr, examine_block(combined_msg.Join("\n"))) + +// Apparently, all belts are storage belts. Wrestling belt is the closet we're gonna get. +/obj/item/storage/belt/champion/wrestling + name = "\improper Corporate Judo Belt" + desc = "Teaches the wearer NT Corporate Judo." + icon = 'icons/obj/clothing/belts.dmi' + lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi' + icon_state = "judobelt" + item_state = "judo" + w_class = WEIGHT_CLASS_BULKY + var/datum/martial_art/corporate_judo/style = new + + +/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot) + . = ..() + if(!ishuman(user)) + return + if(slot == ITEM_SLOT_BELT) + var/mob/living/carbon/human/human_user = user + style.teach(human_user, 1) + +/obj/item/storage/belt/champion/wrestling/dropped(mob/user) + . = ..() + if(!ishuman(user)) + return + var/mob/living/carbon/human/human_user = user + if(human_user.get_item_by_slot(ITEM_SLOT_BELT) == src) + style.remove(human_user) diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi index 39d634317334c145297165cad3710f053cab9af0..45f175e059f982d171d140d381a3dba0489a3946 100644 GIT binary patch literal 5902 zcmb`Lby!qS+s7ABx+J8V1r((bB$k#2Dai#SC8d@|RumDWyBnlSLO>P)C6(^{A+_Yv zuq^C8%kw_h8`t&z=^y8uIdkURbIr_W?)lz#Xs?aeD0z0QhIejCQ!=3X>8XB9CeA?-?OYz8FSSF#SXO zTtN7To4~Wk+V2aZ@>Ates+w|`oBH>0OIse$H*)E0k5VMxh3_x4Z`aUphlT&1_qn&t zykTnS8D{-bm;{)J>h^i7ahJq=A}1=VE-ZX1FKba^T8($?$+yKZTWKb|fV9k-!n{uo z&2jE+lv_MM7J!~z4f;b6^Vsy_5R#E{V#l0ZzJ#w{oqr_tL6vePXPw9jdzb|eEi;%r zn^4o>nT`=nY{yKsBmtV@@k>8=!3xDD4v+3p0$5%A7yzK%QCC(l^v~X33i2>C$|X2l zi6K|Sz4MAj<NY@1sRjL>)Z8NH;yyuX1(cnR}l*AN?pM z_6up;AbA1)5@j-VnbP#z znLUuleG4VLgR2pnF=*DdzO}m@b{qmTL&3(Hmfo%-1gR`*B}#35E2;6)W!`*EXwo0G zL58by$lCUja=DabsybTjHV1|UK1oUTh%Hl{h5=I;LEy-0w>RPwf>_u!S;OOBM=L?_LzYvNGaxb z#!uXPgU5iB8S5vgr7~5&-w-Ip-U3m8)wZ+9p>M($6XH)+CE`nI32f1(s<^KVF9I0l z*3HdKVGqjVtQ!zB+5+!%@>w_v2u#S3a3*eO9XdK%0?V zSxy?_vF!t6+p7RoT(ymcfybIc3s32%DLxQ&6?@ICrvlSS^KJ;p_x>ALC7T62YmYpq!K33z_d(c>!TFl}Q+E#YyMI&l{WFbUdo1dI&iFV<6 z)pNe}y;t8onFga=wBf-}RdglHEEZshb4y-yCn*J>{4dk^AFA~QpvM<<`;ObrVOL$XL$ zMLMzd^0{X--t%;!sFSBUua$hIy;^zmw70_+IZFXv<^;uDcdkgDvS3l`TE^KXe2Z4p zQN3K!GBQd@$;r{ipf}Pqb{!lY4X_o*-Y&v^@P@E3juq`Zr}6VD*WTT znHM#M0?6TgEh{yR0;s3?0VkUbAx@$$yH#xlpLI;zQsup*MJ|1Ott65Ch0#TbsKR`8r##(0Q& zg)U=z0p6eV%TVt_ZBCKTD9$!t^0M}JbJO1k2kw2tI3DaR*hNhCpe%BcZ>Fs zFkv{*Aa*DKN`^}anEjiD zm}7uho%P%Kpl)3GL48*FfPes7qnSGwUlEI%y(`@e*#i_CKg4qN z`EuQjE3cs7>#A>|SIf;&{r1s*5`n;D9<#6n#a{X28%6Rk-mxl9_ z2&bkxOAhGLpnmOTe&tY9-!z2Q#?=8|JkPyobHYvRi6~crePqY^?oz3pF=f*>b zMXLtgf}lZfU4d|%krN;#Escb;gC#yvN_9nL1$7mjXl5)Z*2?pq)C|{&7teM+SzXMj z`x5TW$>~X>INR619*hHo!++jXRWpuSt~{%6ouCvcGcF|NoL9 z*+#1aA_%X4xk_rxf-z5eJc@cNH;MAvjG8K`lF%`D$~y6;<*mp2xJVQ{N9B|9yN{!D z{9z9w+I)l>p_@*J3sb7AyKtZ`M=Vc-IxjxP<9`som3co)u zlp%eXVt)U!mL=fm;{uB2?z(tt?fHL0@236S?R;bUD|GWIzwPYv$F|}SwiqUxu{nOu z?O_#xwO%q|9&>^pbJf6x{r7lkZ!Sxo&-JbvPk6zF#D|J=E*a7UILBohg(HyW*~L4))9dRYGt3l96=e zxOb1m-}X~FwuZc;iR-}3OJr!~*kwrM#HwfdWJYmoIH3oQ#j&r&=@@kN&%%?;+Ok+C zDfWOrvU8&`5m6hK-8ep*7ScJFe`vzZ=lK@LpD8P^ral?WlC&I(z&u++_9S%3t|9lQ z;TH?i0)4W%*zK^5HF~Ax%o##0%~0}Iqq5L0hL6lp>PkT@fNj9upuzanlSkPc>t4e? z%*NY{%G_;n)E(D(hg4N!&z+{QdtnQ87V~)hGy>zWR{t9HY~@qai(OY0{p%SJu>-KA#U9UY-3d)|gr(!%ETA z)a2ZTmrS$nvVLyo;Gpl~!r#=~tnc99 z(48bqPf8rurvwIre~8zwjm^!e=j7x}j*Tg7Z*QCRR(OSa$EXGXZr*qn9OmXIhtirB zRBdh#N5J=ghWEa?EN<&|P$+J}6A8aQ+}PYqoY{>5@rpbM>&jQt)%_eBOP(5;^YQ%r z97OTCd~qdv&GV;`kc5xCNO0AGQJzQaJJED6Z|?`pl#%Tby-+w;?tp-aibiE};9HBWA+ zydX6iO~8JSkR4#X7L_y#h|m0c0owod+7EsrE<$@{@jrqG@5Yz69Nd*n6$9sXV=I=l z@%ZRTqpXGe>n>hi|JZEfZFWNSBQ8F5z!ZVDbG!UBZ#q{#uJFHTYh&+R!DNKoieIDq zf^^3^tpgR<*-H62#3GHZ_mRg6hu#x^8H=nZ&TKbegQT%D{qT;3d8~y}AFD4T5z#e{ z64rnK8P?%QmM;|*567maR9NFwgLttNDq&%ik_a%UwYO&gk2p5$Dw} z7R8~|$J7YfbNZ%7In`C0E~ci9u5%(>aqT((k;wK(UPtI9QTQ<1&6kEuf@fF#XF8+S!00m0 z9ItTS51kj>R0ZuvW?YG>-U*!{#zZRKl@U8uyJq+T6g`4@ca7M{?q z@3+`2A-~ezD&gYA(4PRng*-N~!-Q2Cbqas8uz_P}`tADtPUb(X3_&4%t$l!l0vTv& zFw6ISb^Ll>KL_nKR=lqfT$(~)@N@g4W9nNsiZ<)>B}lBF;k|y-nHc1Rx_OgOKjU~E zGPjQn=dfnj7B0MdEm!)anuA13&@O$0XmP*C2CY}j@f{1d>|*7v90yiM*hS4QW0Hzh zi^ob@3$~@2Pu7R4WROiO2)gr`e;ygVg{uLo=NjEAs3H4yEe6lMi1 zV+GTmg`Q;RZqM1-aUMdu%F{KLOd_Z|sC_;uG$rfJ#kBeoOOm%75R^# zc9+4Rwslb>aq5?9LS${^Y9B^wfZBQRS<6t(#|J=@@|6}-0X>Zy*zbYqosj#t#u@-u z!9D|ycf~JE{wMenruShPz5UbB*x0QtFR%@zHe-)FkGa4}x$xilha)-a&X_XzS(ezfL;BN1vowI4zC|-YeesWntes*67*GhsX+ke+Fu$LUvwrM}gr_ST5ezOgms0L?)6f%9u`eicp> zA27{&rIA^@Eq6jES7!UNI@>SVaulsBeB99$$WE{C$DK*=Ho<8D7L=e14DNB9oDUf$Sc!v6nj`RzzMsDL@8Lnqc-zmIxxvIuxe6DygZ0 zS=RjpVL7}X+i1tPs^vp0eeEN$QnUvv80Ntf7~5m$6@3dV5zlRsiuTid8k5sy-lPR{ z`3h249JbJp_LHPT5Spr*DNVm_xycennS5B)O_SqtwsMbd@2!4_&siIm;UxgiN-Zir zj*4a)#%2z#hv0 zLktuLpn(1cxP+&H!RU$Z#%H_Fbq@4=66ERc2LOa+z8>x8ZWG~T-QEjhS0Htk z*vK0=hYZ>LnP6R_V4Dj)KJ-JjXY3oKI6XL$GFgH($nXSK$#-z+>64a>K}Cvh4{TE| z$9Fimux$IRIqF+6eY-(olN%A^w|g!6#`h0(=CRf=5E5-^^OD89-S-HSAG_~UY$=lw z#2dtatD(lyRJ|bS`4j&#p5NGOGmBiAQ%C%FvR*G;HCJ&?y{-W(z8>TrV&y=~8pQV9 zQFZxhT>s<2^Q3p3Jdgj(oH(9aiJK9+S?<5h)O)n5wQA_bP5;ycu)glSu*^+7Pm=X= zc-Ia&ci5Fu)oPqj8dK)NaZA@@^oLm=r_9H`_DA}6ekh5VU5l+9ot$@RGf}Y(P`vFt zR_JThI(0c9+4e$5YN6t_m#EAACZ%9ewc(&wjFXk0PDhCyZISHB13WRShV&4aahIR!$ zzu$|hhn@!MLegIgEg;jj0g^Q9m+*^rZFm1x0D<;r3dMd60Z0kYhf+aqVJ{XA3p|q~|5sBN+<6>KH*@n?|e}yrR16vO1u*Qr@x| zg2iG#F4(_#HtiQXQyZLy#IQ>cV4X2}(<9jVnJ9;jhPTzLoa`Uu| zb7Y}xM2!rPzU)U(rw!cZ$84Okyk630q_5@-_7nWc&g|z6UC)jo-Ti~de*{lrgS|Dp z$7M%{ckn-}qT}aszL{3OuFC=lt%h=A2T;atCDZgxKPo-6Q^Qm# z>ilfbog56};0Gn79?rUht_Is!&zZ9>y&P#r`FRIO<59|d>bY5=lsWiREu88`X~@sp z@_tZ3{ZT@@IXNUWG~0BsSj6<*BK)caw)}uF(M6ttCRRahB09)MrmGOe6W7GeKHJzlHW)Sd9YKnvTHyPYWUQg5v}Rqnwh(o|Jf z!j)ye0I`~aLR`pw+&FqAqfiS`Mj*I(tp;nps%(zk3_0Aw3rGx#2I=yjd_Bn}xNb(C z?LXl7SLjkgeEyQ^JCL;eXZGC2U>z;JN0_8NUgZ0PeeP~UHctLPtu~Sa3W9Cmu>an!hMG(oFFh#6 z6il9*>2# zn1N||lz5nnaOVVH_rorhoWU)ELm|H6j|~h7xQ9!a3%q|s^ zwvfi4ReyF@LK^m>h3rCNMkw71B{el;36~WO&X8T;M>B9z(@uqRS6|-k7nv`9qZ7;Y z+iA;RfNmZJwx}!r6jp)N9>ags<(%WleXPops|sClSi(x~E-I3cibsi03_^sOBTY@q zX>=9S!{*98sKuQ6Og=`7MZ0U$x+j8VDEoxE4&j@IE0OX)-W@Bxa~Sv1=L?gsI|=@i zT&MvIeU~%v;OzBSaALo!oUj*{@LPgru1lSSaP}o*@)&NH;6|LR81Q;6;1gigiyDjw z%tC>rr+j-Bqp;=S%VO2`=~zs#UcYt<7(m%TF8MU%xbVL_sFAsRvi&mdP4?=SOR??^ zIZ4=DRU4CQS3%tcX!pOUwXWY7cY4kHUF7= zQo)Ghby``s1}7ret|loi)Ux;YD%$JYpKc3HRLO$JlfjOI?T4F3hEk9&>Zx$rjr@$y zLZzdcB6ci2Q;TQjgFptMV-=usp~`y#UFSIV#gI*4m~^@d z71ll~$bj+bxm9P_+f^(qdS4TF9CtUdjh0&2YwK-MNRg^dt9v-@q!w!8sp#K=djKs{ zl&ZGgq`&a|@ZH5z+|lq#Ys0Daslz?#3z?ic&OfJzQciQ0oO7IS38W`T$s?v4M{p@H zS&+B#2bVPpcdKIAy8Xq$`o?}Dtc+A$K3!h6_3*&~rXbbi=TgC?L+={g?w!s|#KXa;2lf~{|2xP#Ms@<|67x5a!J@%|b~WkF5rBfD z(^n*iO$6Zek0O`l{O;-tF*pw%VTyi8!wL60oW;ypBGt^P&{D@YQq{CtW2H8!cKE)0 z-3%WojweG!JHG!%q#RB&+uDhkAm1#aF!~X^(kYd5k49pD%QQQY1FPMFFMekHV56nC z5U7!NTE_(m*kuh)6i4WP*an|9mc1AS4?%8mockmEp*NQlP-!*(+9$CK3cQY{2B;bY z1{3_0Y$ja|7tcy8cGnZ1%BefpZDo1N!`D}<_@$1+_@d74E98Hu=Dnpmxnt|u33Zcu z9q0H;`1D)oU#fm5`Q>+<4OGG}dl!?9Qcd};c&hU^B&5K?^QOwipqp66?z7$g55teu z3ah!YYV^9_xDRKA8YV{2&TP5E9R|aesIGjygWe`YSmRt|W023$KvP9#)um(2o(&Dpm^!eZ^K`0ndVp^lCzP%PYFI%e0|Ko$sLFFR-?5|{y>^|FiB&?* z-Q@0OxWtHw5j8dBN9gF4_f6V?i7AQRC6=Lpb5uyAWSNte`i_GM{oJou(+>&@Tz7DI z9{W69_FI_18PR7OM=fG6VPFG{%**Eii$$XV|1bops~r#|y>=9lXA|lAY01;~D>Z8z z%|ENBhPjxQXnhF3)d3O#ndw7E3wy01)22ruhh4+-_!Wq`&-Z@TZ(#m=f~5CazvPru zRZhr;gfnbOYiHF3E`P^5snF>(#FjI(Wm&e^Q^1JbKTqQgYBG3BtQ9Y2+-P2TpE%^@ z`njgYnlO@w&;Q&-*T|+D+YP!Cy&uZA3xE;5zF2dmFfydm$4cPE zib3_s$id-Z>Qg<*yv$|P6Y>^bd1CiQoTD1zXnSZ8oFbWZs38L))s2UJ)XSSkh{z-B zHD@Dt>v<1AX`StLc~WFm%H-@1D{Af0CAc z@Vn!zfB%jPpALF1wuRU@m@#)YJUfqEub!$~*o3Y(E0LoHGN0eqO!?|sW^nO`=4W?} zbf(`<*cV8VQLt^)5LeW;?n7Q30PeSc6duwL6e!{joU{1hH)e}sVLXSn-!%Cv=jM%E z*y@SL%C5^SUF-apzrWXwl+GM?|0|<)%d&#w<*W0s~b`E7Lqg*I?j_j7E|*Kikpv=H}*zpY3rYwh^IvqebTOSM!dj zC3l~pQOZvE#7tju3h`-WbBM%rS1604yyqk!87!M(Cs{Mzj_zn})mguVJi&PS`5h|U zuQz}|Ua5v{KUz=f5}nC^I}4<+MK9=qo=ezftL0X00ei%MJv)`$<0}=yMiq45Ad$#0 zO#v-M_W@aa(Qv*YY5-2&vTic0n?u4i7LN)2OFb#S>OyJIc*Op&;WIcs#pSZNyFXRi z&Z&UAk~SLT>4GFpe0Vk3yjoBgq%&=kcI#C{?qij_2=ldSZecBr{jiY&aFOO<{Bv`E zfB$P~%gCPkrY1abwn=@@n<{>FXwEeKqhURECA3T^x?1P!GHhCyJ~cVh~~FF^4W zvQNt7M7tTJa}tlwT5lN-u_Lj+lu2wxBrfbOmlx&OtTf}K$JorPbs+W+ zOJabKjuCW~=_oL)b=*vDP^H;%5gEP@+NZ+(&waSl&$o z3kb&L(2O^D!-I&iZFDKUORQa)?Bdh!S?x|O)#($Dx?cugikIDxobp>OG)3L%fr>Z| z@qAyc{`xrbjCJ({&D$NKF3_7}=RXJx(iLzCOqE)Tjq*}mtQ6?o_g|=kj2Z;pE(&ls$qBuU$gI6j5&Tqk@p=)^h3t$7(TTqD_G%J7k?uO5aSQwn zy2T+PpjB>0gmqZ=!aur}C z?WlH|?%OKkQ(9|_&D3)Bn;v<}HpJ)EK?dTsyiueZB3X3P;gKk+Y!|{jLeYtqZD3eK z7=MRIOqcl>RfQ8PQ)PNWTOEkZ%g3ZB**13<4hh8f*i>WmEVFu*pP1)MZZ;jQta8n$ zfdR8kQ5{|y;EfMg1ruYEIn!?d<^LKM&(;Y9=wUrxXPhmU1=>N9#R)N3)Zl>cPBL>X zlwSM4l5#k4a{1K7?_TDswH*R!b4OkZ?o!`VeRoNy?|Q;SqgIP z7K@@Dk@inz*I;(u-rl_@`I)|`g8>2USIO>J5nLM>P=ECDKFR>by7Vgn*7LkMWIkw! z`dit7RU8tXL$dWpQrhlI9TdF5L2HWMNvInLi?%lSKFM2PFv1|Eq7oV^=xKtO z_Kg{d5RIf~u%ypA3Sk>l30p*>NpQqkimOc%Fzt}cLkU6tV90A?WTDxHg@#p1ip(O_+mgS&2(`N9K=uxW&f3c zvK%m7e!0(CV)IM>qMea21Q!x=F^Ze*W`1G+zPIGFJGM7dt<*oL#c~!%#(uE3LC*P4_G!WW@^ky#Bm@LKSGe7- zzIFYmEYkhvy@t%(drMKdgM8RbAL@=VCa$(9oSUqKOSLV|!?K|?G60JJ;L29W!Y z@is!^e{7 zNPJpOkn5{8Y4naWBXJ~lv;->h7n9+Zey%GMk~jGiqZ?{d7JWi}l_+@TUB-nDn?*N| zr@Uh}r&JyDq&E&W~} zD%X!3qQ*V3?}gM~+kHs{Oa($(&~g0o`8Y4ysfQK0?53EYQiSIG|fIO8* zl%{}#ID7Uk>ph8#>0o0}XQ3={_#XIx@+}wKCgyHDGn%M$BoKx8Re!V`)6q_6k(JX! zZ(Ly~A7R8IUpHo`+l+cZj%Te8^^%V3*L{pE&8(;A+zp>iqCN9seiUe@3dvF=-Q|I& zSy@>EutOF8^6L% z>DIyr6mp=KDh*c_zPv2jT(!yU5r2aQ%`1!0nGA_wKW4ey)i;f8CMb_3OUO zG_POYQ83KTgVOF+_XP!%z?d=Z+JLr&?SYYXM_t{1nBaDx;_gV=%|wFn%A1nUH8tat zC*M6qBqdpNznNe%DFu=RA-o`HtQpC#cPF}~7y7VZ3F&9fW?OYU|8QjOW_VXuS3y}> zPg}8b*XvH%lop9GY|1FO;_tP%apNh41-)sOvyI(+1@OVFxQfxY{E|8sL2H*Yo+bT`I0YJ>9qw&3iW`d&RiGRhx^! z;*JaL@eV@CNlMVfqw9lNA56b>x5x9;*O@^c2;?03NVuCt^|JP+u542J#*#+gQPMgG zD_z>cD@+UC*jqtkzBqS`;?<8|J~qKDhgX9lxyoxpBV%US{w`^PsXP=){tP)ldrm%L zPu5PobphS)2|1RNlY6*BLU(8v?rvMC4#7{>=+nH48LT%kCNSi#V@1C-M;q6%qs4Aq zoOw5>WO13KQcj90An<(U&J`eyRV1hp&5G-2_ z#{}RUTj;Sl(;ws=mBT`uDr4fvz$zH?0C6u<*1&BHfThZm%WVUrsWRi^F@-QA?8Wgk z7(f^<_!b*6U~c|l`k|t(;zc>h2?TWlR3$m&f(Fg{0Wa|4n`HjN`^UgNt1%tlOmONloXH%-{ zrNX^V8E6c~@GJOm*#L5|qzbR)r!CI(`iMr$Ye5c|Bf`)dWFj>2XF4j8Md$ee$8}X! z%P~#5_t}*95x@(b9eM?vDkm?(6Q2)QM3mds-{)5FdUxCbtS^%(yH5Qqqly+3v?})q zV@T2WIgH<_cyOo{ja`+za z?DR+X=~g5e@=xLYe!O}Q8C+G0dg-R6Dq zbnWzH^1V=)>hcfoFp2eEiH4U|OS{Qt-j4OB(W`=RoT^nsCP1pgr>eAmtsk+~8@*8{ z3u4k^YXVgb%h1>-K;GC3J*~~f;c(y2C$k1|*@(`^3{jOd2lTouSpF8Z*pyVe!G!SC zdaIO+LP-K!EQdx$emk*hsW~0(uOlymc_2$)3?T{yhP;P%;Naa)74v1!EvqI1<>ymZ zH2jmaZob^5tFS!XTC!=BF*P;iyn6MjPFPr2KWC1J1=VeVYva=3=X2qyY?r}Ryu=Z* z0Gt^d4iGT@dB_C=_%hI(S7H8x(6^#-TF`KcL7D1u$x?uhl1miD$=lV%NA!)OCtGMR zk;~Hw)3%;I#c9 z?J+z<3w}UB(}D=3@LRUZW@o^@s(vL}*SbPyx*%uy)!*k{$<}3XXo>Nt^4_Ph!tr-x z#z>D%L<$CFzOW}n^q$P6UEWhR2|+feb1rsAhp_xOgYyNlWh0$~8-%*hAZPXUlNae0 z<(7nh6lNgjrNB6!M+rHK5*>!wFeRt{8tPh-V&6VVWs|jdJs6s!JW@mEVo41F9vEz` z8S>NToOIq8ZP&xn?tEeQoC#F0g_qkrfaznu+tN$H{6J?I?rtzL*)w7b`%(~GO< z{F$(TM_^pCH>>IJ7y2dau0y^dT<@(n1wBMJ&>bEo8H7Bywf8%PW+MeOA0%`eCyFz8 z_9Lxmb`6>m&#@~D`Y!~Gb$QQ{fvyh%3-E#K_489g35{%U9B|QNnkv4ruoOzSpB~10^N>T(LLW2IJr4n)N0E=i56J>6;DrGSu? ze~{($f%Fzaj?9Hx+u4lqd>wO?s+120EH;!iGO-H4*;N3;Y=0CgYIP>I+h`awnq7sx z(j(Y%bUKCmG%6@@CKnp%d588{lhT*x6T6jLzmGQJhIuH|fiYbl#K<+p;b%qa5M;9z zt+=FMg5WO3WAc8rY!&V>+?Kly7o1)QT+z8(n^Rj``x%AW7})^bu6Wu7u-b`J6A&7_ zjK*?LUNf#Jp1sB4B_y;Ek$m~1r)?!(-S^zv%)HXurUwnUhFOg9rn5TPuh#a)(h@1Q1HS|Ic8shv<_D2*u ztjD7|mb;_qIh>lK===I|WWueQVG~H1*H7@8gwdh=K2|46=YTf8XoA`8l|G%n8B%cW z1}_5Cw7R<591(HO)!jXn8oBR?h_G>We|}AKm(ptN3DY!H=QEmShS900te(a`KY`$F)|YB?d=_$nVInumy|?945;>#uNS}D zohc&Stzm9n+!J)>icru$I;M`A8Ex-lwVB-`r}MLZ&uXA{q~Do_+*bzKxmmdH1*}fL z$jGla$pp!j)%&dC#ArFxP#FWRUS4nb9>8{aCnqNh>!&x4Lca@-pQh%id0vANF1)Cu zI4wKT%Tw=cZzENCJIdE5GhMvo?Eq>Y6$}?dwd8_Ov>^UOI_f!*+eE4&Ek*ushheOj zW21VBG(bjBnt5G$fU{`&8Ed!fqye7K8K{(62bx}NsW}y zQUw{m(9@<@o9=q+`1@CS8lh=vY4bg!9KP`84X7;?cct{w7$hPUA;^Nh{UZ~Pi zMn(pPg7R{GYE~@B&Hdh8TSrZOybweUuX32p{Ra;UtEz_flHB^`IC>gGBiCEdO`xrHR`TcxVX9#_#V7Vn4FoByrG%!dVe4G zapC4rFe=mj)Zxqs+1w9c-)F0?s+{Pjl*hVzd#5igxlri?!Q&NX5miJ54Ml!dH#fJs z0RF80fKSv@WQQHD%r!cGdEWTya;9ttY3o{0bbM-b&u$Q2`{eoC@Fl1FiA@Yp;_Ta;a?xsoFg}TX>{ub_7KO zQx^?)L1)((U@tCXHtg%v{hZRN*-T=+GLI;PDcz(WX5{C~ zHK>%3j#A4%>YTm8C?+O$Lyn~3?ChM;c*muF|5*QvLP-3!OUW!y3rBOeYOgim?O&V@ zI}3UYKVYe>x2tuzFPjJ0!KG|dcz=Lr(h&NKdTg#-DG3F^jV?!1vZI{(dMv-M5&pjA z;@ePt?uWnNlKhvY<@^W56&2<|`QCi&L)`L?lB@F2AH!eGFLr7Ir#mA!-BEBQ4Pe+z zX!YqsSkLeg@pWU`t)cZ{_$+anS9T?0kRkW<(Ra;z&m@|b!~0f2=MhnngBPn)Su5!b zB8cPDvDSlRvc1Jb)cypGFoQV((5*9(M|KsQ>#u}{{ij#UEc{N+Zg(q2F_%{7uQygM95~*3$tG$5 zYG@Y7>}Ov2W5)`8J#KK+5#A<)SXg+&8IQJa#w6%fRCB~5Zaijg!cb8h*Dm1J8bdq_YjDP2JXgzt<~MDv?`)pJ^1n%k`m5YJ_UKo& z(*2Boif)kj1&X2`$qWWmC5ED{Ev{L+%Dd+q`Jv-*km%CjuL=u>yc4&DV5%bJfcr4` zuOe!!rm}{P6$WZN#~w5=l#yvv3U=MRlY-yu-pe`pz=RFd>krdJPj2<(H^tsKdKdMW z+R5^UiZ}HfERiQ<3iO|$VwygF@_dAys-iMxoGG$t)f?m{a#oHJY(@h>4tiYMCRgMG z@-1XP;Ll8sV>%~c8G5Z@ELuTESBl6yPiyWgh)}Dnqdk{2**7E!sQv3p28{lIyL(lb zJA6t5K=WAjKZd&2%Ckn&;yIfe;X;e?->Ss`YdY6d3iBNuR+cRerZ;=yhiB`Gytw#O zcfip2pE+cT)snl&_qf+IyY1FO=Cc7`E3C?b7bFz;T6nx;GgPwg5wBK2wHFTePA}3b zYF$&&1R0(e5_%9evi$M7ZWiwHL$Wed!gSlZEC(wZ7N>aHTB)M8xPAN01VuTSbU*77p>+(XfA{xO+V(dO;0XY~zLJf!@RYf2`i~>>;0jZ%AIaDcv2uL&1d!kem zNODjSRC)QDIv6k8_&7-j{9)m{^#Kvd+cwlwZ~q2%>7$)t^_NK8%O!Y_yGXG zQ4?ds+W-KUG^YT(hdG^-%2kb=%g+#NJAcE6e$KugkNrKoy#RoqyyW!O$^$A#t`863 zE)X)}io6$$PWcp&rL)z>w7@m>q5Ol024H&b4`K9AgnQmaKh^as1} z6_6hcq=HY&-~B?S3oEYkq&)rWaNcI-6&I7KJ0gejZ0B>=?Xb)$x}_F?Wjp@}tLZku zS@u;ELw)O@yd~3&BD~3%F*Uz3G?6!-)top-jUAWTR)BCd?&^F2U_zT^_ z$Alh&vSi@$@+38!Mjx#U(^bv&W6p$3x-s+C$LZm=^pD$NItKti3CbaWhTm~LK&Rk; zT%v0oM53j`FaWHb=;w*r<9mH1;aLl@gK&5RdWD|T2xf!0XIDrYJPBG?pRUTebj7f+ zm&Dy*4P<6p`|u1P=|kYzkhF2Z##LW={`1n z>rs3kH=ko&7{8K5fXqDRX%4U-n|>h=ZEv8a=+c#|=6O$<7LEUvhIK&}?`pra*^1{( zb>)dp^9Yo2*VcX}L`WTfM9N0U9~1LdaY?kl@zWia2rq*uSUA7 zAGDGX>cqRI1sr`-7rM>#euFKb9^{k8dpMMjw{LEQjl^__*uzXh9L-}asm0CB4oeZ= zbc~6&QSsqr&8htw3b2H`OutcQrhE@3Ni|@vC(g1;9Qg( zXZD2hJkAdi8Q5WhLaAci(YC)0yCheYLAA;p1 zQU_Q3Fh61O=74<;V*mt`u+gBlHY^z1xvBKjpw1nIuWtBRA`f%fCz`ca zld_|9vyVyxM%yEwa{YCL>)^juW~B#aYulG2Cpiq-{vel_!l4uSkJEazSt4DP0{Y8> ziGu|<1|0oWwG6n4lHq9NWDWLXzqj*2J!M?N#qqlar zK}E*yBy$4qr~KlZi7r#y=#uF8_Se2`I>sAj1S_85lL!B~=m3$I(CUh{g4t#+K(I^3 zKQ=hT+Q#VOcgK32UuzC8ozkqbmv?#4``{qxC1f zS8R?I7=f-Hs#`0oTHduCMZ}~!aPJT+T6Mn>fo~5NH+*yajNK2~)*eN~_KxcYsfbBV zRDkl-PeAPN?OgZ%kRNDp=ZY}E3(T6im%$Jfg;Vk!1@*IX5qQ93hvbVdQ?z#bjap~Us=FxWoYUw_V$W7xlP?)W) zZM{<){|d-d_yv0gxx2aKjX0EgX#3_ab^XWezEYTiYP+s~*W5P_*a*u2U)lJvYeCUw z4@%9lPb5p}vIo_5pwjuDzki4;V(l_R;qifgk9b}59dH2c`f!2vhP&71U&G#iBXpi$ zT1x$_L16fL>#hdd?Tui2WYUVnj&(?@@{3p9aCS+kJ$urz0NEH}=@QnZQUmuUYOooi z0X+UgH*BEcJ6+1!wX*(Qt}CCf-%)xaqK2gFjY~$-o(!)c_575{^;;b$@WuxB%7s=E z!qz?`HCNf8eX*cp6%itzO=$D^miDtDij&7sd*R}YQ;Q|=jZe0QAxOQoDCNa7QcI)F z^Xm<8A7PBn@nfQQ1(>leNS_6tRE__jJ6* z#_Sf6pzjmbuZ;btr55u^lUv)be%L6zQ-@0)x%TLeg2YRW&2<|n zQ649ubt2sV$2)gg!LQcz%~ea9pl5`yIp^beU)ISIe2#$!&5TzDBxN=mQ~j8AxGAZS z{fuZWwvP^mNg8ma4x?=UVA>K2mvp5xmzc{a=7w&suj0Ewt$ux9GP2Qifob^3Qg>KH z*_4j{w0aD`-O32Qy|Pwh?ee}{Upco^pgHL=3@rOsdrxzEHX!u!PQK$= zc@|S=f7>j7i$g(0M%)>?8E^FaGOxA8e(mg#{D06mr&N43<)*DuA4_ZR*9VjDtE~QW z9lKBvT5^jXwwjU%PX8|G%ri9~z}TIBZyxbV(lVu1sGC8UUW}|$Dv&9d&s36?=vW%b zc##bcId}_%o@it2tUiJ{V<)Y?Ki*Y!c-p#&UkQ_^9C72*@(iWzdNNePd2cl>K)izH zoqa;8`ttXd2P|QtAxUYSdDrT;cuNp~&uwzT>(}Wn3zUK1Z+Z62x&1k zzSj@sKYs_?-QDd@BZarc?VWKF9O6@r8-raxj`<^#-61`;5~{~ zlsbs=wX}^MopyIQ-5m(3mi{rZi~_FJQ|f)+rU3hsnL}+;Ub(U3Mw_xer!V3=Hat9> z)%jATNJPuSZ>BRLaB<`~gUJjHC4$QCpU{Ek#+v*#ME6s}Zw~vNkABuMf7ZXep=wR( zqxSHrkS>!0rCMRpE5DB41xo|Y0jV*07q`?4o*Wj`iTKYm!T*;l0(gDAAGz?f)5t0$ zl%1yWZ?=)AQot>f9hW!QH&jWKmlRyX@iUR+Oht#x%cJ3!2}&#bO1J{8EQg%xTs1W@ z5s`9e9TT9CE#*$O-^ICqImKxHm_wwTf4rx?y-sZ|8ZJt-Zr{+KmrRzvbLE<`%(21F zY}LeLoc~%LH^*Yqo^f`?D#}xb7K*FS9&3B7-oxG?7&Jy8PUc(-PyP5(#kr6}{Tn2E zo6$%&H@XKI9Q5mT6U$bd*|OdZUP2Lx#Mbuupqj34Tf596N2N4@3&=Zf68Xc&y=T@z z$W0-=a}u)jj;7}@3NTaBhFl|8^QX~D0VGZ^SUCe1WZD)%9bd$CiqS9hFn zc7+0o`4kiS!3#MTuvzYZTLAc0RCd1&qpTiMI|$l z#3Z^?>+y3|ne?tj92VdUi*Gis9!L1gb8~Z_m*1I5xW=*eLWN$#F%!QA+y6Fdc;wJj zR-B~sL7IXm5#I3xA40y%z|Bt+@}Kl;)2NNvO66EU<*5T=-|vGC6>;xa{T%>`4$Vpn z*G5UV25%AeaKr1neZOjXYeuP*xLVbBo&mp@+?eEjvE{Pte8USlJ+ z5358W(9?gTW^c$Oylvf5CHfCPnJm5&c^Rel^MAXnss^2NQyqkKU|}ymhOk<;>6NhQ zxhtOhz2&)p@jMgX!vTV41I5kd3>4+7UyK&G&}QB+akhTE(xUZCvtZ2?;{nIi?*Czj zp~?}9KK_>XF+UGzrAt^80P5^gh=W5_z*@{_Tp;-U}|Nr>>;UCrvp4OYfd}W1}Ljd)S1qCuI z>e1Dg&_Xr2fh8*kzR|S5`c7KD5ZpCvbYwdWhtlZf+#Q9xCYTK<9#D-GxK`S>fdBT~ zQr1~M@ZpaU@bA3?L0fhcJ!fe9$8)QxBu%scJZnEF{s7uuX?7<%fG>a#x-!Bid}Ho0 zurI?M!MHvPTB~r_nT9#TIxl2X!f5FI@m0iPb52ui#3PkQA0R^u1WeN=Tf@Q|M0kzG zVx`+jC1v+xPDWh!5O2mf)sQoau*{|GDrg3ZL80Ef%r) zA-T`;o}EOD{hd|w`4=H2UW#H8sX$#?dja<1$c|hyJhR4z_jIXBmFf6L*2H|VMU!1_ zMveoFLb(PRLJ~zH7ng>gI$&h1hikG+fMV~K|C}3n06%Sws>w=bVG&G((Ual$?VgK?GE?gc&6oND?In z5fl(c(g4Ho+TVZo?e00dZ_hi2ru$TNSJkb$b?er5znVn7hnkdRtYiQHP~Ov0GXMYx z_z0{Zh{69m%I$h!LVc)_iNBiT6MH{bAAeVGF8~NG%Fh1aH7`mLH+pP{*bTUvk(n2t12!C z*P}X1TGz5QNPkmsf>={@V$S?1Bp;0n_2t$cjugk4ASJEHy9Iv!h^D-$0^8-5sroeI zXbm$`jdYZVJb0k#a56d)u`L@lJUUo|CVd8eW^#sncnaL4M9dFg)8Og5{Fjz}`QIc2?TXnu}!5q?}3QCS~m zu3rD3Md$?-axaz(J{kMwT2$;adG36Nce;L&$OW08KiW?GLC4Qz_GWH2E-ZwNUW{n} zJdjy#S_qS-7G zzaBbdJZDPF|MlsI|0DLzKkcSX?+`$9Ybz9pi;Dw*lfj_%msO&Gl8p@)z{Sr`4CsZt z`nKEHYrI!_TV}O#1m0!-H($=1y8Yt8mKJ5(_DYafa;e14WbJ%0qMODIeanPnDgVGg z=!%X~+v}?Z7yPhKWTDMJms-XRLAVM1J8V zZpIroK8UN-QP5qscL$c?l*v& zXV*}AiUvi70FB5)i9e?V3H#PIWT=I-^Lh0kq}>Y+3aF)`0?oN)nUrf4N(zX|$;t7< z%36?0N&xzjaPGT;f!vXleD47@!X3Pu0D$tnTbj$B=Kyd!ce*^_cf9>EXWdE@+&EQ9 zD3nr4-GGJNm9BNsme>e)bw&sP!Y!vz?%(Kkz0mK^5x@yEgn=+wYX|`*lK%Ade?$Vn zyEslYM@;F!4%+`0EieNXa~5RH8C7l&_vENs+TzN>`2jVv;9%?8UhoLLpPcv`cOd8q zm)$C7HtvOULhC3-g09Td3c!^bpYTfPi+kl45VJ>i`?3H_h@#sNC?V7Itz8Ef!PqK< z2zXXh2cKK-;&DF86e!0gDbkVfiK|2HYc#Lo&U0m`6RVpl2#Pa=*W>O0& z!v{56kSDhD>x(m*01$VdL5;G80j_;xWGbk?p-0<(Yt}u>Nn$=`=wF!H@TM{Oc&CBNIgr{#4oe^EvT#f}bY025&m>pvAS+w4jQ zl-0gmM3Bi9Y2KIlPAD;JJ zE+Ny8#5j?U6Qbg}+jlt_{#=|QfR5qqbaz19hL#ZgDd=#oME%@89l;WFbFDPLMB5E> z5_}oDE`}eiJBI+(b-&v|a}n!hF6<$v5cGj8+-x=2!|w^VH1wAHW5$qIe-Q*?1Pcba zcxe4&yAjPeqNAguuA`H>e3w4y8-2n648n zb@3hxC+NS4inKs`IDwuc>@YV$JD*4>2rp4df~`FXsX*0Hc;91{d}zFIn+$ND(zWvm zRv58=x&9&b-^@#OXIy!-zHH#;=Ue(=<`Lz?!G?wgjer0NGBUFLuLD;BE%%A!bBZe* za$ElR&!gv9oG|}t?#$F@fa|)ctlMsQDE{Ymk_JSkZX6fLBu43xOmt0;62?kSBQvg*^!201@j*ux7Xy0z=^a0He)AA)b z&hDIi);v5#5eG*|j-6aa?-Pu@g0*fSPw@f=CznUQ@zyZFh>{~p<>J9>_BGkbz$46W zrgU2Bu8H;*x;ki&^2Q2e@(Xcs66Jo&?jx27I2{0JF_TgUF@D>Y?sX>-^xgX=#3mO^ zO+-WleAR?nNq^%hIvdvlVFn(~IPevHA305Li2PJH7jqX6!}( znPRzo4Gf@`XMWmKCbd7j zHK(Mk##3+8X_mm2+EdDkyjmJOK1QqwC&K3XfpdD3Raf4{YWkj7MwX}%lwF6|qeC-> zO1E!)sTxTf^GAH^{bk9If2@VL`wm!8B(vb?sP0n(re zfXHvRac|7E$Rr$2E>FAcB50I{0b@A2znFS?k*qnu5M%1Rd>Am>v&-c4(YiP{Wm1h& z(j$^sMn)V0pmEq#>Bm;76H^U3afOAlU%O?<{;o}4-=EMd<;r$PjkH-arWyL8FOKJH z?uIe$?(PDp{e7Q>NYF9hnmnt1Se!BGY?Ii1g0{oT$z9|IJuj&FfF@9it$?q!wfX|j47mlMWVv$(+x&Z*h zfHFc!G>)VpD3rczEz?+f!6B^Z_c-6ZJO#@ra_)PxXO0)ls}luiFwY_log7FY73gLy zT{;Y+*kB`m43U!W@JZRXOuYR5%j{2DzS-Yt#^{=0B6`yblXwkf{O0el+nZiJraU9i z>0#Gc9{0&S$Pj4D1UoB$$COHP(0vxvwv87QRr|A=-^P{p0OL$nJFt!4Z20i}K)yw+RQOB5%KkGCHe=#szzuGgfv zm;Ex9mX^Vr-6zkov!8zceBVDHAfJ@;*|e=oDt77eLqzJ}NMU5U`mW+vA$?v=8 z1mW*f2hue(;c3dRRYa4HkRJ!R2Pl*{iQo`tUS9Q=#Bb|1eRDS@fFm+;}(eGcDh#x7lsdeAEfo_W@19}z=NCdIkZ5;#Qzy;x-5 zzuBe&Y$Wm7&*{@ZXCW!*0>W}{RoZx&Z)X(n(K_r83XGJKfV`)?gC(KWwpN=v)kJm* zhJOy;v$i_84XlhHVJz3Vx{x8mgG0LO3x5d^1#)U#_zR6Uph$oc(5SdI76&-TX!RA) z6d60NgkKsd^+Rye^&c~7FKcTyQ3JI~GkgGNyF9_U+Fj=BWJXa_|FwiBE#rvYb~T*%#pw~0!+@&~W;P24%c)V|>^7TJaZ)|jqL zw4-r(!Du6wbgA7R6)n8%lx4*>ITbMfhxlv-smK>yNH;j-gKT}(5s_^Wwc&Lxi~AQZ zGa@GVSLe4$$8{@lpXMCI#AAC?AFTUs@8X42eW}pkT;1!IXSh_r7#kT>!^nxb7!@ys zUv@w2D1_xh6d>t|`*tgGvh%!e~{C{i+{x>h9?rC^f z2qmT_^KGCZ;}3IN^RD$GZQEeFJa+4LpN57Iaq;obv$A4;{&ec=?=OGR6)m40Wy_EQ z(WdQN6FIHD657onm`%p%;cw@9EpB;5kNDYWEnjg&!eMab0QTtY(0J4G=IO*))#1&? zsrPo+?f3o`fe$6~Q(7*+1kDjzIjEKrI$(IH-N{9-xNg~fE$uff$l(Hs+3qkYpzLk= zI4`zsR^R<(AQcgojl3L{*@rjyg0ACP%hq%MaZAzqgtb>J+ObE!YWG_N@UIY-#kn*b zG_FCN$8zY{r0P_R0Ui{rgTQG9U`k4-?0&`=AFt2$z1X`-6b*|~BD$;){n@CldUbqi z>M3Xt9gez_^z^N^U$G>pH;%h-Wqyj~{0w?0ynP}90#Og0&1OD45~og9xO<15n=Kwl zQ{~eB752-sjTCFx>a7`OU8)!PAHV#xs375gc$ajx5odJ=4SYtp>uHgE9ScRLGtiY( zj3K{`KqQc-{jV#c;Q~>BjL31rt@+I)an!yKMwE;q9f;{3DO6IigXW7py(D~c5NmF3 zo|Q8$g7ggx*!gE!6IayN54+OMevERcG15aZg*~n&naLNbYyB6v!hHBaJ{S4>-cy?%n2Ybtxz=nqE|Hzv4y${Kq$BEp(KcF3}sTSG? zf1P+aTfw!hI0gld74(u1MY)Zya39i^tOZtLSi9a^zpNtW+K395{;vhvo}md`A_ z)rZRs5PV6i(~bYFWMCLpAklX-d+g-+#o$BJPIuTeE7EXPwg9pdJ?9Z%tC@dedm<>n zim|n}{bf#t4m8M42M_F5$bTQ(KAl@$TwA`w^g~;AY!)`ws2t6Dqv#9r`$$3$tE)a2 zshf?)o&C?go7VAyY+J6r7F~z<+&#Fy`oWA(90sFQ-S=QrS4*4At>u6`)~R+%dTwG} zuaHADF@k*N!OyFWw#mN6B#h1w32yle4a&fyy3?aoVKIcJ@8H>CwO9_|c>1uP%J|jT z)Hk8#3y7;{sBfvV@dNRX*~c@^PvGVfiXxFco0sdHkGK{+X>``ACBmYov!qH~Im03Y zNZQ?iv1pG1^0n8bTb(GJiPeyu{`^f|1rdcDbX?Qn;USlT0*4m7{Kd%7*Ed%$7rsA< z#;vcfkK1d8uj_xGh&gqWX!VhgO*%{T4c#rF?xPa3uGiR*#turLG&3@>9^giAg|Fhx zOC>|3aSf{+G~)n1U2;x~!EH}iC&=|(4sgqf;`szgsLGmVI-ZY2JJxC0uHL6-h_Lm7 zhODO-B8s014+E%=AG0xH&tlFMgK8hQ8XrhWNvXaxP=0C9(S6*OGi^?Hl+y9DbhzBi zXY8)xgc^gF7xXt5*XFq2o$gHgrmwPBl|zY7#m;USGOkj%wak5m8woNfoNe(ggza@p zesOScqVBe$5{zsy6TZXE#`oohjT_VrSQZf(JaunuG5tx}PfepALCyFtZ?6=O8(ekiWTZ#t2S)VN!F7o=xk0=%J4u6imYooxU0UN5^df=>#{!o+YH;n z7Tcg(3W+pzbAwwfohaW|WNlKokisEe9!1=!m!gbSUB)oyBUo~{+>q7=LDqzn8X(*j;HE0_C=l~YJt1Ej3^hAgd%)j0o{P0pe zKe_uo%py9|6ccd?Xc~rSvM>i);j;$fG_E9aVX;`f8v{By!yu;hFuC+E8>H>&HupjC zmL~HxHG|8j${@$@X)|U!=w%I^%M5Z=R2Dkx*X{02UkehevE5Y4gw|Gt2)O8&Jwg77 zW5k(wHUrx`oJhkg0#K0My2^$z?hSW4nR>&KJ8vdBR!=uVlY3L()>`8x^mq<0yZ2gs z#9Ll!NjD7F-%U6!lZYHATED_%7Ci|EY|f0h2qYU@cuXLjjSX|V&nKhl(;+!9hf6?! zw6Xh`Rnl|L;Q&8Au0J_5Q~3G)zun0Y6}jqXW9xF)ah}4>6S`>C#YL6x*andh9z9FH zYZ=?O$kFxsxgNiKBKn1>>7Bu1T4s36$S0^H9kIWY3bQNAut%Mrm->T+yf)brWI+z zOzUub-ps10>08rj{&(m@I}59LepTR5}K^r&to}{ZNyS+1x&pq?g zuSmO=*L4UUNhkQn<=U#zA9gw|M^6?og>ApU=3K+ScSz#Gx3^1oopUm9)Sniw>It`N z*o$K<*O(?|e~r}1j9@S*-F2z7yED~}w5Xx4pWVP`7UsPEI_aQ4|nA}h_=Un`9@(}i2n|b{%?Gt|1*;Me}8$PJid7OtLNKO+_SCJMHi$5 z1+afRWJFvyN}tf@gipO1hy8sF5Ym?v!>&cz)$9&dhwmMy;to9{1E%8?M&*c{2S?Z? z*Y_4W=w_@(6@^dZw!QbY@C)-TlIx?SmQi#OVGzL4dnWW6;i`bS=YZn7E;90CEcuJY z2!eik-}0&R{N*M4vPU1K@xkTgHgYZh5;?cm_B{pN{PQZCRyQl4cX27%xtEW!8z+IE zs1Or5u#sF5^I_w>?x5QEMxo=6uuL3DmP$zOu+p`&S$8JZHV42t33<^Rp@L^`c`){O z%GNN1X&8hyiAaWi_YTV3cBHB?Iu>$4Vba=)>H#?eBLcM0)Bt_)+@K#pP6vaOu4*1v$bo4V^hWJ-d zBTrL|X#_+4+W(b)v8BXG|63Hn+4Y>S8qK)2r~4HpByA)uS;8_afhz0}zILaN3sK*u z>-EoFDx=t#dBPuC)@Z%jMS26NV#l;Wjx9_^H;25Eh9#JHsU<8M_zk(zX;Bc78s)*4 zmz~d_kF8N~UAx2V;6Pu&%gZd5BJBx+h*42d2nvek&VeFnn4VxZGY7}O*cdgisl#;= zC`?N62$cz88?-HRp8eSYes01Js33-Jh)z2D%)ytmzTcnp;|s2Rvc>kRHKYNo_*uLy zJ-mWheN?M)g8$9IC>OVe2qhWud;iu^24`TE)n*L$=ohE|68u{vI&}yNg8=VVY?$AB zqLH9T2=d+dDQmXMe4oK^4XgRL=aoC&k!viwpnE|GSW%i{OcVRyKj~szH!w1E zWoy^tY@g{9E*|LYf@OV@_DKRj@3xJKOY3`b!xD9T|ASF<{=CY^?C!0-fXe2?cK4=J zv*mHth2Y3!+G}1|+RpqK%V;A}ifwjA5qZVi^l)WCo7s*j+iIP{xG%XPvO-p>TH= zt?+QUTh^^T856-<8J)}||NnECkDo!L6I_IFHDPs|Yv zM^x?CcX|qghUj>(Uqol?;6)aE?Wc8QeZp4JPJ9VA&{vu}$bvKH(}OI<)&9#zPYvHf zfSAzOS|g>J5T$X;qEm`omjP8dy2Umbh-gz$Er*pdla-N&_iGXLLl$ct!UF%4h5QhddM zx1_O3se_-<=}e3sZKgj-7U(KD<;&Kn{3Kx1g+R4h$gkq|KT@qT@osuisKe+a>mi;Z z?gS!T>zJnkpX=N z$uC_8e`M8O8gO%SLpDc>>E0on5syjo@=-imX)}>nQV#sNu;iDo=N^4{%!Zfm5t(%{V0!k}^-q+>oU_@Tq*oBM30-Rnic>uQ4_y``h5U z&B7YrGa?No#vik^O%*Zn%JG*6Yy-e^f^E==QL^B4|WyWbP!_4 zzXvx&dY7EVcO)SiXLDoWE{d1&h5Ybws|(R=vOOmD4|{u-ZU+nR4q#i7S7tigRj7BT z(o<4mH7efD!?$*K84MzWbPz9g32$)J_+RmR>#ITDEg=oIF7%5!;h%RKNR^ux6@^71 zZ#k`=mY9#s$+da=15EL(kalksYR{AFd_!Ei=Zv=XPdrNIzspCTX++LqEa{?MIu&o+ z;@I1$vhS6d7r4+$zY;U715~E6YFV-FIC+sL8WC}+F}j^}5yllPrl~rSl4XCdU%Q25 zf!+}a)V(@gyh(`}Zi2X0F9qvFJzk`Kf0UNamO`>Sd9_hsYf<~*-MIyEG|`T|Evq#E_;nP zTL9>#H7|SfD*Iyf)aH??l#l4OL_3=jOs$(R=T_ zmyz3go!;whLAX0TtM9^=(W=QYbDc~|DI$M}M0-h2pb6OiZon?wR|Lguy+F=2!1Ujf z7D7dUm=AefZ|0*|{+D?2|J@7vpMuZ-^UG|J96)c|k6QLlWK;8?cw3biKgmwu%1z+y zmOX5D+w{9oNvFkVOo-;oeyAwc{B`1Mk z=rK9mjG@$Gc|-7)<@5kjba#>{f562Ph~iQDlz%5J`ySEVuqe{}R;2+;J{b6s=8vw{ zR=P?TH#CbN1emZ@oVR$Y)*P$t-y;)8ks=t-j-E(`Sw*J9CIH|(`^N>q%&fV=@*5@h z(DHNQZjXC6Yf0~sQ>hOPahZ{5-WHm$eZ{jN%&!;v>Pkpc#`6+~P$kDl5wiDnr?|~3 znhn269JAN2h?X{5;>2;Ax9VNo)2%BtjuNo!)~ zIHl&Xuez6n>^S$QFW;v7Wl1lrs`Zw5=ksXs}jl{s>%r8nZs98kcdCutQad7%{Ml|0wF)`W)WH~8` z>L+2};2ABSuK7K@2Hxz~ub#|IP2WpXY=9)Fb7p@~q?OU4b2tbGl&XG}uK$D06lI+m z0VO&P0k)ZdRLkSvoy>;eK?Ta;DqTNBObqQa4Ski%&L;f+?WU%oF(>e=2RA-GKJ?`a-EnqK&WrbR*nxCQSiQeH+;c0;Ik_InkfMKL3%o4Z4hJ3%VYjUM5oRF zqlN|k$&p#?*48~vQ6WaTWeR5Q36&r1vx-nms4lY6*VO$bg$oN$0_D}HcjoC2Yl=TZ zUr5}4Z6ykObhIm}V{;VEGW+C53U6*e!hvTi=L4_3yw3LUQ!yT1UVTeTc@3ZE&!0bR z?7flw=8dSDnugt*od;RP!gR+ZfZoO}UtFjpB`V2UDD*AMteu`zLfVrm=W0zyH5o_f z^V<_c;8Lh>VIj0r!GhwOvkDTg>H){!>Kj3ZGO8*-?D?} zQdlY>rFm3B^_Il#`2F0VA6toD%CG#LjOfFAtL%u>i7AAo72T!_nVWPmvR*5FwC9S2 z9lM9NV{*2}qtA3V$1_5`1_bMf6K^(Z_@pPf^#5N7fFB5Sk15TiR zoP8LmEb%5USejt9^dLSq=?Z>p1D`HH7-;D{;PVymb@B4ju;xTFC-JfX63Js@dX<%x zTz7=CCXHsa2nJ)=bGZPfj!Ap-AIA-=BiPH2{UHuuR|4AnHr`j0S98XJxrXJS=IHt6 zz$*fGr_yxXH=h{?7K?VaZrt{jF}8;BfolBy`*#-)k7idW_)t^hV|(w+cW7ip!_`&b zv)>a>j>h`>?C@?7QZ6Eb&je`|++BdAnB@fIe3xm8WtCS$>KowK*4FgDylYT;x~ENC zHY1BxkY7=tndl)>ML^$NK1La#3I; zb9oCsgd(54*Ppunt)h)r;A?Yjn|mK$;uF?M*AFEEvJV{A*UW2I+dokwQ0Gk=^ymI2ToHirrfpH#G zpgWdLZg0C((RpdQS<+swdrtPa(L$(i`9S@)&^a~R%Z?5fK*R=6VqJdgtlL-XTB~MJ z)zM+vo<{FtE-!)by4qIVa@qf!MmzHhHhdkiIV4ZyJ7I|8b;d2P4B`jpt2U*qeIkVi z*BOLWIwQRT?<(9G`D?DASZLCEk~=!ef1dW(2V7mA2R!}NzVJ=JqL-nsH=?$-7Qk^_ zVq0$t3dX)`V1}^&nQ&`Ckgds1gM5qjc@U}|`+I30rUByUcSiz!hT!_jj;+Wy;ncRt zAA$WAISDw*y8Um^O=IW)kxBz+RR}cs;ps z!zDcXKA-f>VYpB#hV`S&3%}6rrJYa%a0H(VruW_HaL)%AkeC``U_ZR`@UkCig+`SB z7NzGrW8Hmk_3s9J9k}%LoH$_Gw2rwYKudlS{IEG<);o9~1l3`->>C)26jV(e_s@%Hi>m@>8&rl9+E6uNa33U0*sZYzsT zQv4mzEQB5A8Htyz>2B~m)h9ALc+fGR7?hJod7>XRk*IXsD$pO_^HY*ZIL$XNASqXJLkM~_m!S8WU=EB;wT`SUz;(<6#_W`*;loGSZtZA<1) z0iyEC#@K{r?D8~qAzXfNDp9FfQR$@tDUWfjQ8f2hK{1(Ck%TmFIEu;3m8w0J)DH^O z$5b_>w~wiX&j;N57Qjf1jgXR$vb2w*d8s1%cZ)*tE=|If3)A`5BFe3uN-pfM;^utZ zSGT{QK00kinmC-Tx!Zq?t%@0w*@74DEo&PX8ve8FMo@rl&Z;Z;wws&Vo86b5SJ1>? za8XhCFjiL9jAmgzLOTnJYeoA>-5dHqBPaT|cZh=~3DGFwDu_9mte6w)zl33Eb54(; zc-gt|{OL&L1$_@E@MEfk=8EVdLpx|Uw)O@m^@!pqtMbEXUIG5UPa7_bMkc-ed}9?i zGcwmma2(-xVbm)iCC$fue(i~6F^$&sld*@G=3f&DlKd2$jE`0~(KtR}g=$oe(o;LH zw!-J^4m7rdmJzT{mXa*E`_5HE^E&kVd=)(tldQaq%S?l1p1AWBpsce{3XMy{ zvwdUL`?v?-a+1^1>6oK*GA=eU(4swaFv(@8%8;-^2csYv8XuP?Q-f>)FK8Xcg5uLU z(&|RxWyDH*us1Um*6q^iV+RYiK+egjA?!_Da3#ial%$M3#HbHc3Y_?jwDjIL{uPt5U*xO>=meZ}xlRPiJ!0d`6yljSqVysHS`O zhTI$d?_MyiZ{Z_#m#CEbJrk=-U`oya^qEm%@@T+d3dX@xY}~B{;Bw7K$1Pyvpx<{f z4{daQlrZ-2-HpjEu#{KvoAgtQ-H*YC>}GoFkWOTv8vmBv|6$rlaI03og7;CwMc5mnK4dSAYj1#>N?KsC*5 zq;Hg&$qC4$*Bm%!A&~!9+?YJ({~SZkW5K-ef2RJ+!vc&pGsV_olD{b@ajx&JnH4QP zxc_PvcRS|xcYUA>7etUJy;rw=TLe;*P1t!r9OFx5KMfxn00vp3LP#-2l%3%k0gaW=CjqDJmaO{W=%@UExB(LN@5uxx(GVG14Jt zz#BmVexeK$6M>+J)vm(m6|2-{QnY{)Ye*oE%E-qvKOsh+{2Ny$lJn2Zk5`#&&@BT2h#;aT<@;k$4Caf&Y{*1bBagt3NBu}9_8 z?UqOa6i~Q|Yu$-8Uz?Af?g0Zn0II5rf7L`=J4JO{>r9N0w+YdE`|D;KuyRiPSO^Kb zn8I8_+Yt(AVc3ce-Oz?o7lSoO6%7U2*JWH+mm-RhY;7PXR<>mQ&A-M#*!%|Ie-M-) z_w;%X+RCp(h7)9QN;`=L_rYCuOP|wwwIZz^vbG{a7ld2T^4QJMB6W={?u3*CjNe~M zz=ktOBEz6+ef}LCN8^Pskyg2iho|R}3-L+=&i)m>FTc%LL>$AHW$HORS}aKqlbo-_ z0@+N(<*XrhsV-)b1=jmNu;zzDS_TDE&%=-YG zBA4PW&QI(=X9=w5xVyWG}+VJk=1lmx8qFMKp90hD*2S zQ<7b-$~4FXsgwi>@8`aIn-9@f%uT8;|ERd_agBTi2!E*QqoPz zJ39<%*6d49K}Hxw_WkO0Mj>-`GIHY=V2l#)zQnTx2g;vN0S|}o2q)d$J{0&b@*)#s z13V{+ZQ-)xOKG~)9APSZS28_uo?s_5Pbj$q`3yE>Fb^e_KM@w3LMoj!F=faCIk^c; z06)HQiYVAkUd4+4Bl>+F8+X9ugxzWPb(IU`_)Z2A{rn?vh{LcGRdf(qH2E*cb@o~R z7W|J42=XIA#+tP8-a=*V{}Nm7L;n>12wo~+-+eW_0mnK!IYC#3ZAw(4&WMOUc07H0 zbGTt$U_l_#dEaSpnOvmHW*V!Zv!bbZ_WWdy@B%jpPdo0HVOV}i60NO4CmQ&TeeU4i zZg2C9qM#K-efq{fRvgI51Y5Ok5g}r9Ge^0_js-x}65h+C>N%vciUTYq;no|6H5}d$!sW#s05ee|Zq2bNmxk&l*0mD20$f`mB*{-8>;j4}W>}I)^j;KY`g`@dppS z+@bS-Vh9U8x?9v8%waSK^8B~9Icfjjz$^q`dt9pRiA*w|CNA>e$2h)7DcX=d`Ztvb zzxQu33p(QV)u3L(bL2{KAW!)td)8TZ*A@xu@mepP;oB>zTP|WNpC(ps4MV8aZi+zx zmAjXHk2(_cHS=`Ns7u!$uA0|f$nz1z7t7ytE%%x2?g?Yf#aQMD^lidd?&j+NKy%%l z(NPN5kKMY8B=Wd>21YobY>1Tzz@ID85h75%CA#l9h~ER(`$Y!6A!5g-mLt{@a?Cao#E3u8~`Mek; zCWYa*E<&h)F)>ss)HuME#!g4!;?n(@b6d>%yrMpPYIe7z#HL@ z&+g1OQ8dQln!Pd8x1AfqUg}Sj9RyPp5K-`_%Jc8-ayE^=I~dE1fMu2+lgPOMr~sNC zeBL+rboLXYa3t+r^&-NaKz;A8S9cr3u_wR7I`H{iYlqfBwKVY$OW$2xE?)C?^;+GM zKkmU~V&&ZcRBFL&GVU(HVFf&KLNfk@tD7(KbNNJdJ3hY(x1P96XF^vl<>fzg}`_ znnf(OaH{YNFPP{bnXSh7GAfw&k6PkrWY+(iEs>g~mVzq^w6bLVQ zoZfkU0D^&Cmr*lTgKCLLmvfng<1K^I{*$BglK}k9qk|v;SXsK@3q{c3Q1d`6*)4U2 zm^>ZBj#?M|?7OR%3>kdPv?(LPLdH0roZ9;IN5&rI9 z3#F(81O$eb_jRxFhsxt)6Vbm*3GB*QeIlDUv+8 zW}S#F7DLUpo4kA3GF7z_arC-5D~sMc-T`Zhzj>FyAVZ8=X9lK6FroEgUcGWF?Ln4C5)>jYr}iG59$%o16JDvLKESez z0q&kiH|Up>KSz=CiYE-V6IVHV_$*i;Rssj6;U1qitYgyGo;bqcC#SavRqIOM`Ahq+ zw^Loq1#^G&d_)r8>I?c}|6$qeZ8RtG;r>`@`=&S;J^J;l^Ld=V+&%_&LqGuQ;^B@B zS}sWQ$2emrypQ%y_O@}q+Wrtf``L-}!Vw-w0_D5NsYmVhdsba7c29l28rN06Hf#J?g zO{Khe0ljamX;=S7>l0>PdJy>Rqm?W!P0^9^zJmb`lepGMGO9at)Le>+rLV2J3mgbN zDPP~)&c}w=?+j`xDhzB;{AV73=eDel$1RC^(!5i_`W&WH=e2rgD2J>wbhGaB6%-bN z$5RO1`7bY1NMq*D0Aj0fnr&|ZZXo<`tdaF#wS$*1Z&KrZ-`~rH9eBReO2=VNnzN;D z>5#Q+#=)Y`i;kwq?WNVo&xeEJNI20SDGQSW~B@B?v0x9TU$kUH#;aOfJ#fd(%jZ2dv)$+y9BJAc1ANOdlnZQU5f3E zh;u&}i3V}2LmdiM?hM#f=*1D= zb^KR3ZOOCbh5<3#(n$&>5BgVI6xG^XriI#K;^Mx?JEqEgMz~fro%Ce!*sou;mB_{P z&!I(Ps87ub?{D@E4AKExXX|E>gELBp5@?m>`bO?2H??4LB9Q=YVzXrh38QNG_JZxf zr?hX7g=b7V?^qI^?zs?;%}d4BMyX2AZ(4Zt>QMoi`yk|fxVu?~Fp_0r!|d;i0*3u6 zg?W8yhy#3K^Se;^D+P5|$ z{WbmhnULQNM1A?DQO9e`&zMr!U&8*i1-yXBovo>1nrec9yYC!H83kqE_gk)2w&cEy zTpf&3$B>#A;$J~#Dk%a1V8~_o_=w8O%cU(t=6<@@)YY#$ISpTHPQkI#F~n0Ubt#b?(|gLh@RA<{Pp4cEd^K}t2A7TjR;`d7JoCC_#*dq^)u_}t_SvE zUtd+a#Q#d?S$S_Bc}vFrP5<{MXZ;A9y8xG`fH!mq`qmLD-sF@4GRBG&kyb`tc2xNH zSrF}f%k*rR>W%31X-%fpdT`?v=9A4R^@Av#W(i|U5NLR`OauV}Z2%cX1x9iE=S2Ta=;|)-218h+3^!Sb?0^uXi|9$fcgz1iY7gDJ%7!r zZ;^Bl-@Ks4N$TUmU)H`E0rJ*^afvka@&{xb!7C8mZiP;)y`3F39o>2hF2~bLun!#L zn4Bv9TRe9e#QhkbNA;55n+j4!SOw=*cjFis!|!wEOFsBd06+K0S33)bP=hUAnH#qeuO*^PBh{V~fvty~J{B}#Qn--OUYN%5B%eX@mVPxwU z`ON4V8bHb3o|it#?FMv8EB`i=fcQ@pnwo(ZAFsa7c`{SUbw4;*+D)-BhMxy2ahKgd zg4KnGNAEm@{bO(MBFpEST9T+w?-kzD3-vS66ekH6N?SyfQgC{3%zrXGvZT(s|8l>n z!XE(O*u5LHepuib@4ida6p(E`qZ@>Jdu*o6)6v30K=Q598E&v z&!78?pn?}H<@T1CwkyKKdnTLD3Uf6f`x4$~JIZn=WHbXSrSIJ#kfJa|g6x_s>l3+e zcZ!DZ$*;NgmUMAq{zI}{3{eCYbLMh_YQARsi(niqI2UPaUsTivfkjwEaC+XO?45kI z=DZ0>OI$9-S{B1>D8oJ;XKnS*(zSNZpQE0z2h(*-jMCm?!F*vG>N(mThR=com6kL` z-N9VJ_p*MPz<#D@U+qc$-;CRhz0XfiOA1tWF)okc6TI!HxLXEZm%wl*DyUk~Bj@pvnU);@H!> w3cZThbAG@^VQQLb?I0jL4m{tCJimlp*CxoB%8si1`(cNB>JQZ#RBWREA8e33y8r+H literal 15277 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 PT!4m(wsMK0`TPF?WSQ5k diff --git a/yogstation.dme b/yogstation.dme index a9da5cca7450..0fc46f6e8159 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -705,6 +705,7 @@ #include "code\datums\mapgen\Cavegens\LavalandGenerator.dm" #include "code\datums\martial\boxing.dm" #include "code\datums\martial\buster_style.dm" +#include "code\datums\martial\corporate_judo.dm" #include "code\datums\martial\cqc.dm" #include "code\datums\martial\flying_fang.dm" #include "code\datums\martial\hunterfu.dm" From 5e4ae79bcd6878ebe37bd1f19903069d0000399a Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:19:59 -0800 Subject: [PATCH 02/19] proc this --- code/datums/martial/corporate_judo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 1e9d1838ad06..6400af89963f 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -69,7 +69,7 @@ log_combat(user, target, "attacked (Corporate Judo)") return TRUE -/datum/martial_art/corporate_judo/handle_combos(mob/living/carbon/human/user, mob/living/carbon/human/target) +/datum/martial_art/corporate_judo/proc/handle_combos(mob/living/carbon/human/user, mob/living/carbon/human/target) return FALSE // Continue on with the normal act. /// Inflicts stamina damage and confuses the target. From 7b99f500e28ff499339564aa40311959eadf7e97 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:21:21 -0800 Subject: [PATCH 03/19] forgot to rename this --- code/datums/martial/corporate_judo.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 6400af89963f..5dee283f3678 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -193,7 +193,7 @@ to_chat(usr, examine_block(combined_msg.Join("\n"))) // Apparently, all belts are storage belts. Wrestling belt is the closet we're gonna get. -/obj/item/storage/belt/champion/wrestling +/obj/item/storage/belt/corporate_judo name = "\improper Corporate Judo Belt" desc = "Teaches the wearer NT Corporate Judo." icon = 'icons/obj/clothing/belts.dmi' @@ -205,7 +205,7 @@ var/datum/martial_art/corporate_judo/style = new -/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot) +/obj/item/storage/belt/corporate_judo/equipped(mob/user, slot) . = ..() if(!ishuman(user)) return @@ -213,7 +213,7 @@ var/mob/living/carbon/human/human_user = user style.teach(human_user, 1) -/obj/item/storage/belt/champion/wrestling/dropped(mob/user) +/obj/item/storage/belt/corporate_judo/dropped(mob/user) . = ..() if(!ishuman(user)) return From 87d97ad16aa307334a415b4c5e3e10038d23f3b6 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:28:07 -0800 Subject: [PATCH 04/19] adds the combos --- code/datums/martial/corporate_judo.dm | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 5dee283f3678..fe6ffb8524c2 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -43,7 +43,6 @@ /// Split their punch damage in half by spreading it between brute and stamina. /datum/martial_art/corporate_judo/harm_act(mob/living/carbon/human/user, mob/living/carbon/human/target) - // For service only: make sure user and target are in their restricted area for martials to work. if(!can_use(user) || !can_use(target)) return FALSE // Check if this streak leads into a combo moves. If so, do that combo instead. @@ -70,6 +69,28 @@ return TRUE /datum/martial_art/corporate_judo/proc/handle_combos(mob/living/carbon/human/user, mob/living/carbon/human/target) + if(!can_use(user) || !can_use(target)) + return FALSE + if(findtext(streak, DISCOMBOULATE_COMBO)) + streak = "" + discomboulate(user, target) // Will always be true. + return TRUE + if(findtext(streak, EYEPOKE_COMBO)) + streak = "" + eyepoke(user, target) // Will always be true. + return TRUE + if(findtext(streak, JUDOTHROW_COMBO)) + if(judo_throw(user, target)) // Can fail. + streak = "" + return TRUE + if(findtext(streak, ARMBAR_COMBO)) + if(armbar(user, target)) // Can fail. + streak = "" + return TRUE + if(findtext(streak, WHEELTHROW_COMBO)) + if(wheelthrow(user, target)) // Can fail. + streak = "" + return TRUE return FALSE // Continue on with the normal act. /// Inflicts stamina damage and confuses the target. From f6ea011eeb0b984eb753d1d75122cf5c92363225 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:34:04 -0800 Subject: [PATCH 05/19] judo at a cost --- code/datums/martial/corporate_judo.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index fe6ffb8524c2..b23dd897117f 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -25,6 +25,14 @@ return FALSE return ..() +/datum/martial_art/corporate_judo/teach(mob/living/carbon/human/H, make_temporary=0) + ..() + ADD_TRAIT(H, TRAIT_NO_STUN_WEAPONS, "corporate judo") + +/datum/martial_art/corporate_judo/on_remove(mob/living/carbon/human/H) + REMOVE_TRAIT(H, TRAIT_NO_STUN_WEAPONS, "corporate judo") + return ..() + /datum/martial_art/corporate_judo/disarm_act(mob/living/carbon/human/user, mob/living/carbon/human/target) if(!can_use(user) || !can_use(target)) return FALSE @@ -205,6 +213,7 @@ var/list/combined_msg = list() combined_msg += "You try to remember the teachings of Corporate Judo." + combined_msg += span_notice("As long you know Corporate Judo, you cannot use any stunning weapons such as stunbatons and flashes.") combined_msg += span_notice("All of your unarmed attacks deal half of its amount in stamina damage and half in brute damage.") combined_msg += "[span_notice("Discomboulate")]: Disarm Grab. Deals 10 stamina damage and confuses them for 5 seconds." combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 4 seconds of blindness, and 10 seconds of blurriness. Effects are halved if they have eye protection." From 27143a1d89687c0f84387b52fbb7f8e4ec0bf2e1 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:40:51 -0800 Subject: [PATCH 06/19] flips some conditions --- code/datums/martial/corporate_judo.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index b23dd897117f..44ccc264f70d 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -12,6 +12,7 @@ /datum/martial_art/corporate_judo name = "Corporate Judo" id = MARTIALART_CORPORATEJUDO + help_verb = /mob/living/carbon/human/proc/corporate_judo_help /// Only allow use of this martial arts if in the main services areas (bar and kitchen). var/service_only = FALSE @@ -156,9 +157,9 @@ return TRUE /datum/martial_art/corporate_judo/proc/judo_throw(mob/living/carbon/human/user, mob/living/carbon/human/target) - if((user.mobility_flags & MOBILITY_STAND)) // User standing. + if(!(user.mobility_flags & MOBILITY_STAND)) // User standing. return FALSE - if((target.mobility_flags & MOBILITY_STAND)) // Target standing. + if(!(target.mobility_flags & MOBILITY_STAND)) // Target standing. return FALSE target.visible_message( @@ -173,9 +174,9 @@ return TRUE /datum/martial_art/corporate_judo/proc/armbar(mob/living/carbon/human/user, mob/living/carbon/human/target) - if((user.mobility_flags & MOBILITY_STAND)) // User standing. + if(!(user.mobility_flags & MOBILITY_STAND)) // User standing. return FALSE - if(!(target.mobility_flags & MOBILITY_STAND)) // Target not standing. + if((target.mobility_flags & MOBILITY_STAND)) // Target not standing. return FALSE target.visible_message( @@ -190,9 +191,9 @@ return TRUE /datum/martial_art/corporate_judo/proc/wheelthrow(mob/living/carbon/human/user, mob/living/carbon/human/target) - if((user.mobility_flags & MOBILITY_STAND)) // User standing. + if(!(user.mobility_flags & MOBILITY_STAND)) // User standing. return FALSE - if(!(target.mobility_flags & MOBILITY_STAND) && target.IsImmobilized()) // Target not standing and is immobilized. + if((target.mobility_flags & MOBILITY_STAND) || !target.IsImmobilized()) // Target not standing and is immobilized. return FALSE target.visible_message( @@ -234,7 +235,6 @@ w_class = WEIGHT_CLASS_BULKY var/datum/martial_art/corporate_judo/style = new - /obj/item/storage/belt/corporate_judo/equipped(mob/user, slot) . = ..() if(!ishuman(user)) From e93fe1ad15da05d57adeefc620c7f4a533d99a2c Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:43:35 -0800 Subject: [PATCH 07/19] animation --- code/datums/martial/corporate_judo.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 44ccc264f70d..2c66a1424e37 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -104,6 +104,7 @@ /// Inflicts stamina damage and confuses the target. /datum/martial_art/corporate_judo/proc/discomboulate(mob/living/carbon/human/user, mob/living/carbon/human/target) + user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) target.visible_message( span_warning("[user] strikes [target] in the head with [user.p_their()] palm!"), span_userdanger("[user] strikes you with [user.p_their()] palm!") @@ -116,6 +117,8 @@ /// Inflicts brute/stamina damage and tries to temporarily blind/blur the target's vision. /datum/martial_art/corporate_judo/proc/eyepoke(mob/living/carbon/human/user, mob/living/carbon/human/target) + user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) + var/has_head = target.get_bodypart(BODY_ZONE_PRECISE_EYES) if(!has_head || !user.can_inject(target, FALSE, BODY_ZONE_PRECISE_EYES)) var/msg = has_head ? "They do not have a head!" : "Their eyes are too protected!" @@ -162,6 +165,7 @@ if(!(target.mobility_flags & MOBILITY_STAND)) // Target standing. return FALSE + user.do_attack_animation(target, ATTACK_EFFECT_DISARM) target.visible_message( span_warning("[user] judo throws [target] to ground!"), span_userdanger("[user] judo throws you to the ground!") @@ -179,6 +183,7 @@ if((target.mobility_flags & MOBILITY_STAND)) // Target not standing. return FALSE + user.do_attack_animation(target, ATTACK_EFFECT_DISARM) target.visible_message( span_warning("[user] puts [target] into an armbar!"), span_userdanger("[user] wrestles you into an armbar!") @@ -196,6 +201,7 @@ if((target.mobility_flags & MOBILITY_STAND) || !target.IsImmobilized()) // Target not standing and is immobilized. return FALSE + user.do_attack_animation(target, ATTACK_EFFECT_DISARM) target.visible_message( span_warning("[user] raises [target] over [user.p_their()] shoulder, and slams [target.p_them()] into the ground!"), span_userdanger("[user] throws you over [user.p_their()] shoulder, slamming you into the ground!") From be80eaa2bfc95a46bc3ff224dabf2da190e651ca Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 19:52:57 -0800 Subject: [PATCH 08/19] change order + diff wheelthrow combo cuz conflicting combos --- code/datums/martial/corporate_judo.dm | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 2c66a1424e37..56a0e5c0c14c 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -7,7 +7,7 @@ #define EYEPOKE_COMBO "DH" #define JUDOTHROW_COMBO "GD" #define ARMBAR_COMBO "DDG" -#define WHEELTHROW_COMBO "GDH" +#define WHEELTHROW_COMBO "GGD" /datum/martial_art/corporate_judo name = "Corporate Judo" @@ -80,6 +80,14 @@ /datum/martial_art/corporate_judo/proc/handle_combos(mob/living/carbon/human/user, mob/living/carbon/human/target) if(!can_use(user) || !can_use(target)) return FALSE + if(findtext(streak, ARMBAR_COMBO)) + if(armbar(user, target)) // Can fail. + streak = "" + return TRUE + if(findtext(streak, WHEELTHROW_COMBO)) + if(wheelthrow(user, target)) // Can fail. + streak = "" + return TRUE if(findtext(streak, DISCOMBOULATE_COMBO)) streak = "" discomboulate(user, target) // Will always be true. @@ -92,14 +100,7 @@ if(judo_throw(user, target)) // Can fail. streak = "" return TRUE - if(findtext(streak, ARMBAR_COMBO)) - if(armbar(user, target)) // Can fail. - streak = "" - return TRUE - if(findtext(streak, WHEELTHROW_COMBO)) - if(wheelthrow(user, target)) // Can fail. - streak = "" - return TRUE + return FALSE // Continue on with the normal act. /// Inflicts stamina damage and confuses the target. @@ -226,7 +227,7 @@ combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 4 seconds of blindness, and 10 seconds of blurriness. Effects are halved if they have eye protection." combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 7 seconds. Only works on standing targets." combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 45 stamina damage, knockdowns, and immobilizes for 5 seconds. Only works on downed targets." - combined_msg += "[span_notice("Wheel Throw")]: Grab Disarm Harm. Deals 100 stamina damage, knockdowns for 15 seconds, and confuses for 10 seconds. Only works on immobilized targets." + combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Harm. Deals 100 stamina damage, knockdowns for 15 seconds, and confuses for 10 seconds. Only works on immobilized targets." to_chat(usr, examine_block(combined_msg.Join("\n"))) // Apparently, all belts are storage belts. Wrestling belt is the closet we're gonna get. From 631428d87e2db0c690c1c78da1f1553153cccedc Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 21:21:24 -0800 Subject: [PATCH 09/19] blindness debuff --- .../status_effects/debuffs/blindness.dm | 45 +++++++++++++++++++ yogstation.dme | 1 + 2 files changed, 46 insertions(+) create mode 100644 code/datums/status_effects/debuffs/blindness.dm diff --git a/code/datums/status_effects/debuffs/blindness.dm b/code/datums/status_effects/debuffs/blindness.dm new file mode 100644 index 000000000000..26c148e39e52 --- /dev/null +++ b/code/datums/status_effects/debuffs/blindness.dm @@ -0,0 +1,45 @@ +/// Helper macro, for ease of expanding checks for mobs which cannot be blinded +/// There are no reason why these cannot be blinded, it is simply for "design reasons" (these things shouldn't be blinded) + +#define CAN_BE_BLIND(mob) (!isanimal(mob) && !isbrain(mob) && !isrevenant(mob)) + +/// This status effect handles applying a temporary blind to the mob. +/datum/status_effect/temporary_blindness + id = "temporary_blindness" + tick_interval = 2 SECONDS + alert_type = null + remove_on_fullheal = TRUE + +/datum/status_effect/temporary_blindness/on_creation(mob/living/new_owner, duration = 10 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/temporary_blindness/on_apply() + if(!CAN_BE_BLIND(owner)) + return FALSE + + owner.become_blind(id) + return TRUE + +/datum/status_effect/temporary_blindness/on_remove() + owner.cure_blind(id) + +/datum/status_effect/temporary_blindness/tick(delta_time, times_fired) + if(owner.stat == DEAD) + return + + // Temp. blindness heals faster if our eyes are covered + if(!HAS_TRAIT_FROM(src, TRAIT_BLIND, EYES_COVERED)) + return + + // Knocks 2 seconds off of our duration + // If we should be deleted, give a message letting them know + var/mob/living/stored_owner = owner + if(remove_duration(2 SECONDS)) + to_chat(stored_owner, span_green("Your eyes start to feel better!")) + return + // Otherwise add a chance to let them know that it's working + else if(DT_PROB(5, delta_time)) + var/obj/item/thing_covering_eyes = owner.is_eyes_covered() + // "Your blindfold soothes your eyes", for example + to_chat(owner, span_green("Your [thing_covering_eyes?.name || "eye covering"] soothes your eyes.")) diff --git a/yogstation.dme b/yogstation.dme index 0fc46f6e8159..ee88aa46dad6 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -764,6 +764,7 @@ #include "code\datums\status_effects\status_effect.dm" #include "code\datums\status_effects\wound_effects.dm" #include "code\datums\status_effects\buffs\buffs.dm" +#include "code\datums\status_effects\debuffs\blindness.dm" #include "code\datums\status_effects\debuffs\blue_eye.dm" #include "code\datums\status_effects\debuffs\confusion.dm" #include "code\datums\status_effects\debuffs\debuffs.dm" From 635159ee1635b958c755e42babe51e69dadcc73b Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 21:21:57 -0800 Subject: [PATCH 10/19] harm is normal. blind is consistent. other stuff --- code/datums/martial/corporate_judo.dm | 57 +++++++++------------------ 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 56a0e5c0c14c..73b752e7a21d 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -50,36 +50,18 @@ return TRUE return FALSE -/// Split their punch damage in half by spreading it between brute and stamina. /datum/martial_art/corporate_judo/harm_act(mob/living/carbon/human/user, mob/living/carbon/human/target) if(!can_use(user) || !can_use(target)) return FALSE - // Check if this streak leads into a combo moves. If so, do that combo instead. add_to_streak("H", target) if(handle_combos(user, target)) return TRUE - // Effects - var/picked_hit_type = pick("chops", "slices", "strikes") - log_combat(user, target, "attacked (Corporate Judo)") - playsound(get_turf(target), 'sound/effects/hit_punch.ogg', 50, 1, -1) - user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) - target.visible_message( - span_danger("[user] [picked_hit_type] [target]!"), - span_userdanger("[user] [picked_hit_type] you!") - ) - // Damage - var/expected_damage = rand(user.get_punchdamagelow(), user.get_punchdamagehigh()) - if(ISODD(expected_damage)) // Easy number to split in half. - expected_damage += 1 - target.apply_damage(expected_damage/2, BRUTE) - target.apply_damage(expected_damage/2, STAMINA) - // Logging - log_combat(user, target, "attacked (Corporate Judo)") - return TRUE + return FALSE /datum/martial_art/corporate_judo/proc/handle_combos(mob/living/carbon/human/user, mob/living/carbon/human/target) if(!can_use(user) || !can_use(target)) return FALSE + user.balloon_alert(user, "streak: [streak]") if(findtext(streak, ARMBAR_COMBO)) if(armbar(user, target)) // Can fail. streak = "" @@ -151,11 +133,12 @@ log_combat(user, target, "eyepoked no-eye (Corporate Judo)") return TRUE - var/blindness_duration = eyes_protected ? 2 SECONDS : 4 SECONDS - var/blurriness_duration = eyes_protected ? 5 SECONDS : 10 SECONDS + var/blindness_duration = eyes_protected ? 2 SECONDS: 4 SECONDS + var/blurriness_duration = eyes_protected ? 10 : 20 // Intentionally not multiplied by seconds. var/damage = eyes_protected ? 10 : 20 - target.adjust_blindness(blindness_duration) - target.adjust_blurriness(blurriness_duration) + target.adjust_temp_blindness_up_to(blindness_duration, blindness_duration) + target.adjust_blurriness(max(0, blurriness_duration - target.eye_blurry)) + target.apply_damage(damage, STAMINA) log_combat(user, target, "eyepoked (Corporate Judo)") return TRUE @@ -174,7 +157,7 @@ playsound(get_turf(target), 'sound/weapons/slam.ogg', 40, TRUE, -1) target.apply_damage(25, STAMINA) - target.Knockdown(7 SECONDS) + target.Knockdown(3 SECONDS) log_combat(user, target, "judothrow (Corporate Judo)") return TRUE @@ -191,14 +174,13 @@ ) playsound(get_turf(user), 'sound/weapons/slashmiss.ogg', 40, TRUE, -1) - target.apply_damage(45, STAMINA) - target.Immobilize(5 SECONDS) - target.Knockdown(5 SECONDS) + user.Knockdown(3 SECONDS) + target.apply_damage(25, STAMINA) + target.Immobilize(3 SECONDS) + target.AdjustKnockdown(3 SECONDS) return TRUE /datum/martial_art/corporate_judo/proc/wheelthrow(mob/living/carbon/human/user, mob/living/carbon/human/target) - if(!(user.mobility_flags & MOBILITY_STAND)) // User standing. - return FALSE if((target.mobility_flags & MOBILITY_STAND) || !target.IsImmobilized()) // Target not standing and is immobilized. return FALSE @@ -208,9 +190,9 @@ span_userdanger("[user] throws you over [user.p_their()] shoulder, slamming you into the ground!") ) playsound(get_turf(user), 'sound/magic/tail_swing.ogg', 40, TRUE, -1) - target.SpinAnimation(1 SECONDS, 1) + target.SpinAnimation(0.5 SECONDS, 1) target.apply_damage(100, STAMINA) - target.Knockdown(15 SECONDS) + target.AdjustKnockdown(15 SECONDS) target.set_confusion_if_lower(10 SECONDS) return TRUE @@ -222,15 +204,14 @@ combined_msg += "You try to remember the teachings of Corporate Judo." combined_msg += span_notice("As long you know Corporate Judo, you cannot use any stunning weapons such as stunbatons and flashes.") - combined_msg += span_notice("All of your unarmed attacks deal half of its amount in stamina damage and half in brute damage.") combined_msg += "[span_notice("Discomboulate")]: Disarm Grab. Deals 10 stamina damage and confuses them for 5 seconds." - combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 4 seconds of blindness, and 10 seconds of blurriness. Effects are halved if they have eye protection." - combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 7 seconds. Only works on standing targets." - combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 45 stamina damage, knockdowns, and immobilizes for 5 seconds. Only works on downed targets." - combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Harm. Deals 100 stamina damage, knockdowns for 15 seconds, and confuses for 10 seconds. Only works on immobilized targets." + combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 20 seconds of blurriness, and 4 seconds of blindness. Effects are halved if they have eye protection." + combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 3 seconds. Only works on standing targets and if you are standing." + combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 45 stamina damage, knockdowns, and immobilizes for 3 seconds. Knocks you down for 3 seconds. Only works on downed targets and if you are standing." + combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 100 stamina damage, knockdowns for 15 seconds, and confuses for 10 seconds. Only works on immobilized targets." to_chat(usr, examine_block(combined_msg.Join("\n"))) -// Apparently, all belts are storage belts. Wrestling belt is the closet we're gonna get. +// Apparently, all belts are storage belts. Wrestling belt is the closest we're gonna get. /obj/item/storage/belt/corporate_judo name = "\improper Corporate Judo Belt" desc = "Teaches the wearer NT Corporate Judo." From aca3dc3dffb8fdf3bffe6813a6770f927de99f4e Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 21:43:24 -0800 Subject: [PATCH 11/19] no more immobilize --- code/datums/martial/corporate_judo.dm | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 73b752e7a21d..7ce21ccb28d1 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -174,14 +174,15 @@ ) playsound(get_turf(user), 'sound/weapons/slashmiss.ogg', 40, TRUE, -1) - user.Knockdown(3 SECONDS) - target.apply_damage(25, STAMINA) - target.Immobilize(3 SECONDS) - target.AdjustKnockdown(3 SECONDS) + target.apply_damage(35, STAMINA) + target.Knockdown(5 SECONDS) + log_combat(user, target, "armbar (Corporate Judo)") return TRUE /datum/martial_art/corporate_judo/proc/wheelthrow(mob/living/carbon/human/user, mob/living/carbon/human/target) - if((target.mobility_flags & MOBILITY_STAND) || !target.IsImmobilized()) // Target not standing and is immobilized. + if((target.mobility_flags & MOBILITY_STAND)) // Target not standing and is immobilized. + return FALSE + if(target.getStaminaLoss() < 50) // Target must have taken 50 stamina damage for this finisher. return FALSE user.do_attack_animation(target, ATTACK_EFFECT_DISARM) @@ -192,8 +193,9 @@ playsound(get_turf(user), 'sound/magic/tail_swing.ogg', 40, TRUE, -1) target.SpinAnimation(0.5 SECONDS, 1) target.apply_damage(100, STAMINA) - target.AdjustKnockdown(15 SECONDS) + target.Knockdown(15 SECONDS) target.set_confusion_if_lower(10 SECONDS) + log_combat(user, target, "wheelthrow (Corporate Judo)") return TRUE /mob/living/carbon/human/proc/corporate_judo_help() @@ -205,9 +207,9 @@ combined_msg += "You try to remember the teachings of Corporate Judo." combined_msg += span_notice("As long you know Corporate Judo, you cannot use any stunning weapons such as stunbatons and flashes.") combined_msg += "[span_notice("Discomboulate")]: Disarm Grab. Deals 10 stamina damage and confuses them for 5 seconds." - combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 20 seconds of blurriness, and 4 seconds of blindness. Effects are halved if they have eye protection." + combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 20 seconds of blurriness, and 4 seconds of blindness. Effects is halved if they have eye protection." combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 3 seconds. Only works on standing targets and if you are standing." - combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 45 stamina damage, knockdowns, and immobilizes for 3 seconds. Knocks you down for 3 seconds. Only works on downed targets and if you are standing." + combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 45 stamina damage and knockdowns for 4 seconds. Only works on downed targets and if you are standing." combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 100 stamina damage, knockdowns for 15 seconds, and confuses for 10 seconds. Only works on immobilized targets." to_chat(usr, examine_block(combined_msg.Join("\n"))) From c0e17ee8fd348915b040e9a661f937cfab8ae123 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 21:52:37 -0800 Subject: [PATCH 12/19] removes some knockdowns but more stam --- code/datums/martial/corporate_judo.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 7ce21ccb28d1..110efc3213f6 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -174,8 +174,7 @@ ) playsound(get_turf(user), 'sound/weapons/slashmiss.ogg', 40, TRUE, -1) - target.apply_damage(35, STAMINA) - target.Knockdown(5 SECONDS) + target.apply_damage(50, STAMINA) log_combat(user, target, "armbar (Corporate Judo)") return TRUE @@ -192,8 +191,7 @@ ) playsound(get_turf(user), 'sound/magic/tail_swing.ogg', 40, TRUE, -1) target.SpinAnimation(0.5 SECONDS, 1) - target.apply_damage(100, STAMINA) - target.Knockdown(15 SECONDS) + target.apply_damage(120, STAMINA) target.set_confusion_if_lower(10 SECONDS) log_combat(user, target, "wheelthrow (Corporate Judo)") return TRUE @@ -209,8 +207,8 @@ combined_msg += "[span_notice("Discomboulate")]: Disarm Grab. Deals 10 stamina damage and confuses them for 5 seconds." combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 20 seconds of blurriness, and 4 seconds of blindness. Effects is halved if they have eye protection." combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 3 seconds. Only works on standing targets and if you are standing." - combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 45 stamina damage and knockdowns for 4 seconds. Only works on downed targets and if you are standing." - combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 100 stamina damage, knockdowns for 15 seconds, and confuses for 10 seconds. Only works on immobilized targets." + combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 50 stamina damage. Only works on downed targets and if you are standing." + combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 120 stamina damage and confuses for 10 seconds. Only works on immobilized targets." to_chat(usr, examine_block(combined_msg.Join("\n"))) // Apparently, all belts are storage belts. Wrestling belt is the closest we're gonna get. From 521aff83fa909c49bbefb3aea748217e3e9c8af2 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 21:56:12 -0800 Subject: [PATCH 13/19] no items on belt + give to hos locker --- code/datums/martial/corporate_judo.dm | 5 +++++ .../structures/crates_lockers/closets/secure/security.dm | 1 + 2 files changed, 6 insertions(+) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 110efc3213f6..732afecceaf1 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -223,6 +223,11 @@ w_class = WEIGHT_CLASS_BULKY var/datum/martial_art/corporate_judo/style = new +/obj/item/storage/belt/corporate_judo/Initialize(mapload) + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 0 + /obj/item/storage/belt/corporate_judo/equipped(mob/user, slot) . = ..() if(!ishuman(user)) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 12a29dddd2fe..8ceb3568d0ac 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -75,6 +75,7 @@ new /obj/item/radio/security(src) new /obj/item/storage/backpack/duffelbag/clothing/sec/head(src) new /obj/item/barrier_taperoll/police(src) + new /obj/item/storage/belt/corporate_judo(src) /obj/structure/closet/secure_closet/warden name = "\proper warden's locker" From 360742b443f10a6702e05c52193885c67a835ece Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 22:06:42 -0800 Subject: [PATCH 14/19] finalized, probably! --- code/datums/martial/corporate_judo.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 732afecceaf1..cd128fc6781c 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -13,10 +13,10 @@ name = "Corporate Judo" id = MARTIALART_CORPORATEJUDO help_verb = /mob/living/carbon/human/proc/corporate_judo_help - /// Only allow use of this martial arts if in the main services areas (bar and kitchen). + /// Only allow use of this martial arts if in the main services areas (bar and kitchen); if for some reason, we want to give to the bartender in the future. var/service_only = FALSE -/datum/martial_art/corporate_judo/can_use(mob/living/carbon/human/user) //this is used to make chef CQC only work in kitchen +/datum/martial_art/corporate_judo/can_use(mob/living/carbon/human/user) var/area/current_area = get_area(user) if(service_only) var/list/restricted_areas = list(/area/crew_quarters/kitchen, /area/crew_quarters/bar) @@ -154,7 +154,7 @@ span_warning("[user] judo throws [target] to ground!"), span_userdanger("[user] judo throws you to the ground!") ) - playsound(get_turf(target), 'sound/weapons/slam.ogg', 40, TRUE, -1) + playsound(get_turf(target), 'sound/effects/hit_kick.ogg', 40, TRUE, -1) target.apply_damage(25, STAMINA) target.Knockdown(3 SECONDS) From 5d1fb7d0c308db636c723ef93de3ad55ed735915 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 22:20:07 -0800 Subject: [PATCH 15/19] better help() and no streak display --- code/datums/martial/corporate_judo.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index cd128fc6781c..48c124f1ac4a 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -61,7 +61,6 @@ /datum/martial_art/corporate_judo/proc/handle_combos(mob/living/carbon/human/user, mob/living/carbon/human/target) if(!can_use(user) || !can_use(target)) return FALSE - user.balloon_alert(user, "streak: [streak]") if(findtext(streak, ARMBAR_COMBO)) if(armbar(user, target)) // Can fail. streak = "" @@ -204,11 +203,11 @@ combined_msg += "You try to remember the teachings of Corporate Judo." combined_msg += span_notice("As long you know Corporate Judo, you cannot use any stunning weapons such as stunbatons and flashes.") - combined_msg += "[span_notice("Discomboulate")]: Disarm Grab. Deals 10 stamina damage and confuses them for 5 seconds." - combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 20 seconds of blurriness, and 4 seconds of blindness. Effects is halved if they have eye protection." + combined_msg += "[span_notice("Discomboulate")]: Disarm Grab. Deals 10 stamina damage and 5 seconds of confusion." + combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 20 seconds of blurriness, and 4 seconds of blindness. Effects is halved if they have basic eye protection (e.g. any eyewear). Completely negated if they have lots of eye protection (e.g. hardsuit helmets)." combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 3 seconds. Only works on standing targets and if you are standing." combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 50 stamina damage. Only works on downed targets and if you are standing." - combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 120 stamina damage and confuses for 10 seconds. Only works on immobilized targets." + combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 120 stamina damage and confuses for 10 seconds. Only works on targets that have 50 stamina damage or more." to_chat(usr, examine_block(combined_msg.Join("\n"))) // Apparently, all belts are storage belts. Wrestling belt is the closest we're gonna get. From d6a67eca70ea0146a50dc031b60d23922fc7cf62 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 22:37:05 -0800 Subject: [PATCH 16/19] cant get to maxitems 0, so put in the book. also ocd --- code/datums/martial/corporate_judo.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 48c124f1ac4a..4f97702e7082 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -13,6 +13,7 @@ name = "Corporate Judo" id = MARTIALART_CORPORATEJUDO help_verb = /mob/living/carbon/human/proc/corporate_judo_help + nonlethal = TRUE /// Only allow use of this martial arts if in the main services areas (bar and kitchen); if for some reason, we want to give to the bartender in the future. var/service_only = FALSE @@ -26,12 +27,12 @@ return FALSE return ..() -/datum/martial_art/corporate_judo/teach(mob/living/carbon/human/H, make_temporary=0) +/datum/martial_art/corporate_judo/teach(mob/living/carbon/human/user, make_temporary = FALSE) ..() - ADD_TRAIT(H, TRAIT_NO_STUN_WEAPONS, "corporate judo") + ADD_TRAIT(user, TRAIT_NO_STUN_WEAPONS, "corporate judo") /datum/martial_art/corporate_judo/on_remove(mob/living/carbon/human/H) - REMOVE_TRAIT(H, TRAIT_NO_STUN_WEAPONS, "corporate judo") + REMOVE_TRAIT(user, TRAIT_NO_STUN_WEAPONS, "corporate judo") return ..() /datum/martial_art/corporate_judo/disarm_act(mob/living/carbon/human/user, mob/living/carbon/human/target) @@ -225,7 +226,8 @@ /obj/item/storage/belt/corporate_judo/Initialize(mapload) . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 0 + STR.max_items = 1 + STR.set_holdable(list(/obj/item/book/manual/wiki/security_space_law)) /obj/item/storage/belt/corporate_judo/equipped(mob/user, slot) . = ..() From 07f7af38629341cecd5581e38c113c76138583c2 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 22:50:09 -0800 Subject: [PATCH 17/19] forgot to mention downed here too --- code/datums/martial/corporate_judo.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 4f97702e7082..e0e26d44d511 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -179,7 +179,7 @@ return TRUE /datum/martial_art/corporate_judo/proc/wheelthrow(mob/living/carbon/human/user, mob/living/carbon/human/target) - if((target.mobility_flags & MOBILITY_STAND)) // Target not standing and is immobilized. + if((target.mobility_flags & MOBILITY_STAND)) // Target not standing. return FALSE if(target.getStaminaLoss() < 50) // Target must have taken 50 stamina damage for this finisher. return FALSE @@ -208,7 +208,7 @@ combined_msg += "[span_notice("Eye Poke")]: Disarm Harm. Deals 20 stamina damage, 20 seconds of blurriness, and 4 seconds of blindness. Effects is halved if they have basic eye protection (e.g. any eyewear). Completely negated if they have lots of eye protection (e.g. hardsuit helmets)." combined_msg += "[span_notice("Judo Throw")]: Grab Disarm. Deals 25 stamina damage and knockdowns for 3 seconds. Only works on standing targets and if you are standing." combined_msg += "[span_notice("Armbar")]: Disarm Disarm Grab. Deals 50 stamina damage. Only works on downed targets and if you are standing." - combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 120 stamina damage and confuses for 10 seconds. Only works on targets that have 50 stamina damage or more." + combined_msg += "[span_notice("Wheel Throw")]: Grab Grab Disarm. Deals 120 stamina damage and confuses for 10 seconds. Only works on downed targets that have 50 stamina damage or more." to_chat(usr, examine_block(combined_msg.Join("\n"))) // Apparently, all belts are storage belts. Wrestling belt is the closest we're gonna get. From 1ec49fb099d0b8837adbdd58c32c80d7a88c2f48 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 22:51:15 -0800 Subject: [PATCH 18/19] whoops --- code/datums/martial/corporate_judo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index e0e26d44d511..192ff2bfba9f 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -31,7 +31,7 @@ ..() ADD_TRAIT(user, TRAIT_NO_STUN_WEAPONS, "corporate judo") -/datum/martial_art/corporate_judo/on_remove(mob/living/carbon/human/H) +/datum/martial_art/corporate_judo/on_remove(mob/living/carbon/human/user) REMOVE_TRAIT(user, TRAIT_NO_STUN_WEAPONS, "corporate judo") return ..() From 1b6a1ceac320003a33d8c0ef4a63d0a407f97484 Mon Sep 17 00:00:00 2001 From: Rune Knight Date: Thu, 4 Jan 2024 23:01:09 -0800 Subject: [PATCH 19/19] flip this --- code/datums/martial/corporate_judo.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/martial/corporate_judo.dm b/code/datums/martial/corporate_judo.dm index 192ff2bfba9f..0a78bc218493 100644 --- a/code/datums/martial/corporate_judo.dm +++ b/code/datums/martial/corporate_judo.dm @@ -104,7 +104,7 @@ var/has_head = target.get_bodypart(BODY_ZONE_PRECISE_EYES) if(!has_head || !user.can_inject(target, FALSE, BODY_ZONE_PRECISE_EYES)) - var/msg = has_head ? "They do not have a head!" : "Their eyes are too protected!" + var/msg = has_head ? "Their eyes are too protected!" : "They do not have a head!" to_chat(user, span_warning(msg)) target.visible_message( span_warning("[user] tries to jabs [target] in [user.p_their()] eyes, but fails!"),