From 660a62c4bb8cb5fb828431d22b4a7ecc857d902d Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 29 Nov 2013 22:42:34 +1030 Subject: [PATCH 01/12] Fixes the shotgun dart sprite bug. --- icons/obj/ammo.dmi | Bin 4190 -> 4290 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 1796d4bf1b215b1ac715a0302659ae47d73dc0b5..b5a6f7f39df5cb5d8eed97d414bd54f0921d3308 100644 GIT binary patch delta 3700 zcmY+Edpy+H8^^yhm-b2MvDxFuS>bMQNqY&2$gkR z)DXs?++$ovS~KH1ZsR(PF&97k+x`9VJO4cAdCqyA*E#R=`8-s`R;5%~gxLWh004F! zuHgUx67i?%ZxEFWw*jE{0+0m&dlyI~5H(hWqeWR%J={yM`mNK1mA07uHghCUeUH|sPs!ApO7 zP?LfAP4A$AukO&s>j1mN)^n<2gqP}n{q)~tL@DXrx*WyPS^BcQ)g&&dRafSTkA_%> zi}bS+b%m?W25%h91Bbs1`LS4_jzgTes(~Z*;lYpW>R@spXjx ze((nJpkUS5y1MApLe8r3=<~B(k$58>DNqI3#0lE6p6~0b9G^e4-Oh6f%KBm<&DW9zqFA#W0!TP}t_@eWlabv3ryX^VRe3co8n z-;rP4bevu(QUb`b82KVQ(v_WJSk*0x_$$q>>ujs$=qIBB{<%K2xcNq-PxLmW+pCgF zO&De&i0$DHja$!aI(a7QdtWK&&98qu@}Rk$^Qhr-XmCPHyk##HX%V(Q)rk4Jd%#j8 z33_j3i2M{=I&|luiJl5`+OpQ`*smKcQmx^Ze%f9cUZPH}`QMvu{EVeG9nPeqEH98~ jw^9l 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 DF{$ Date: Sat, 30 Nov 2013 00:02:05 +1030 Subject: [PATCH 02/12] Added skeleton code for mob abilities. --- baystation12.dme | 1 + code/modules/mob/abilities.dm | 81 +++++++++++++++++++++++ code/modules/mob/living/carbon/species.dm | 16 +++++ code/modules/mob/login.dm | 10 +++ code/modules/mob/mob_defines.dm | 7 +- 5 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 code/modules/mob/abilities.dm diff --git a/baystation12.dme b/baystation12.dme index 0695839aea..170b53098f 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -834,6 +834,7 @@ #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" +#include "code\modules\mob\abilities.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm" #include "code\modules\mob\inventory.dm" diff --git a/code/modules/mob/abilities.dm b/code/modules/mob/abilities.dm new file mode 100644 index 0000000000..5ce440a48c --- /dev/null +++ b/code/modules/mob/abilities.dm @@ -0,0 +1,81 @@ +/* +Creature-level abilities. +*/ + +/var/global/list/ability_verbs = list( + /client/proc/test_ability, + /client/proc/tajaran_ability, + /client/proc/unathi_ability + ) + +/client/proc/test_ability() + + set category = "Ability" + set name = "Test ability" + set desc = "An ability for testing." + + // Check if the client has a mob and if the mob is valid and alive. + if(!mob || !istype(mob,/mob/living) || mob.stat) + src << "\red You must be corporeal and alive to do that." + return 0 + + //Handcuff check. + if(mob.restrained()) + src << "\red You cannot do this while restrained." + return 0 + + if(istype(mob,/mob/living/carbon)) + var/mob/living/carbon/M = mob + if(M.handcuffed) + src << "\red You cannot do this while cuffed." + return 0 + + src << "\blue You perform an ability." + +/client/proc/tajaran_ability() + + set category = "Ability" + set name = "Tajaran ability" + set desc = "An ability for Tajara." + + // Check if the client has a mob and if the mob is valid and alive. + if(!mob || !istype(mob,/mob/living) || mob.stat) + src << "\red You must be corporeal and alive to do that." + return 0 + + //Handcuff check. + if(mob.restrained()) + src << "\red You cannot do this while restrained." + return 0 + + if(istype(mob,/mob/living/carbon)) + var/mob/living/carbon/M = mob + if(M.handcuffed) + src << "\red You cannot do this while cuffed." + return 0 + + src << "\blue You perform an ability." + +/client/proc/unathi_ability() + + set category = "Ability" + set name = "Unathi ability" + set desc = "An ability for Unathi." + + // Check if the client has a mob and if the mob is valid and alive. + if(!mob || !istype(mob,/mob/living) || mob.stat) + src << "\red You must be corporeal and alive to do that." + return 0 + + //Handcuff check. + if(mob.restrained()) + src << "\red You cannot do this while restrained." + return 0 + + if(istype(mob,/mob/living/carbon)) + var/mob/living/carbon/M = mob + if(M.handcuffed) + src << "\red You cannot do this while cuffed." + return 0 + + src << "\blue You perform an ability." \ No newline at end of file diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 76ab17fbd4..de4119f254 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -37,6 +37,8 @@ var/flags = 0 // Various specific features. + var/list/abilities = list() // For species-derived or admin-given powers + /datum/species/human name = "Human" language = "Sol Common" @@ -44,6 +46,10 @@ flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR + abilities = list( + /client/proc/test_ability, + ) + /datum/species/unathi name = "Unathi" icobase = 'icons/mob/human_races/r_lizard.dmi' @@ -65,6 +71,11 @@ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL + abilities = list( + /client/proc/test_ability, + /client/proc/unathi_ability + ) + /datum/species/tajaran name = "Tajaran" icobase = 'icons/mob/human_races/r_tajaran.dmi' @@ -87,6 +98,11 @@ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL + abilities = list( + /client/proc/test_ability, + /client/proc/tajaran_ability + ) + /datum/species/skrell name = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi' diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 1c3498802d..b6b7edb729 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -24,6 +24,7 @@ log_access("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() + player_list |= src update_Login_details() world.update_status() @@ -44,4 +45,13 @@ client.eye = src client.perspective = MOB_PERSPECTIVE + //Clear ability list and update from mob. + client.verbs -= ability_verbs + if(abilities) + client.verbs |= abilities + + if(istype(src,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = src + if(H.species && H.species.abilities) + client.verbs |= H.species.abilities \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index dc984663dd..85992e55fa 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -84,10 +84,11 @@ var/lastpuke = 0 var/unacidable = 0 var/small = 0 - var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm) - var/list/embedded = list() //Embedded items, since simple mobs don't have organs. + var/list/pinned = list() // List of things pinning this creature to walls (see living_defense.dm) + var/list/embedded = list() // Embedded items, since simple mobs don't have organs. var/list/languages = list() // For speaking/listening. - var/list/speak_emote = list("says") //Verbs used when speaking. Defaults to 'say' if speak_emote is null. + var/list/abilities = list() // For species-derived or admin-given powers. + var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. var/name_archive //For admin things like possession From 19c41e3d75452d872a9c63ca5d31929cdbc3b575 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 1 Dec 2013 15:12:11 +1030 Subject: [PATCH 03/12] Commenting out test ability stuff. --- code/modules/mob/abilities.dm | 4 ++-- code/modules/mob/living/carbon/species.dm | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/abilities.dm b/code/modules/mob/abilities.dm index 5ce440a48c..aa56bc61f9 100644 --- a/code/modules/mob/abilities.dm +++ b/code/modules/mob/abilities.dm @@ -2,11 +2,11 @@ Creature-level abilities. */ -/var/global/list/ability_verbs = list( +/*/var/global/list/ability_verbs = list( /client/proc/test_ability, /client/proc/tajaran_ability, /client/proc/unathi_ability - ) + )*/ /client/proc/test_ability() diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index de4119f254..de883552b8 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -46,9 +46,9 @@ flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR - abilities = list( + /*abilities = list( /client/proc/test_ability, - ) + )*/ /datum/species/unathi name = "Unathi" @@ -71,10 +71,10 @@ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL - abilities = list( + /*abilities = list( /client/proc/test_ability, /client/proc/unathi_ability - ) + )*/ /datum/species/tajaran name = "Tajaran" @@ -98,10 +98,10 @@ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL - abilities = list( + /*abilities = list( /client/proc/test_ability, /client/proc/tajaran_ability - ) + )*/ /datum/species/skrell name = "Skrell" From fd34554bd97ef89835067974b8f78e0d3b42ec35 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 1 Dec 2013 15:20:17 +1030 Subject: [PATCH 04/12] Further merge resolution. --- icons/obj/ammo.dmi | Bin 4190 -> 4290 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 1796d4bf1b215b1ac715a0302659ae47d73dc0b5..b5a6f7f39df5cb5d8eed97d414bd54f0921d3308 100644 GIT binary patch delta 3700 zcmY+Edpy+H8^^yhm-b2MvDxFuS>bMQNqY&2$gkR z)DXs?++$ovS~KH1ZsR(PF&97k+x`9VJO4cAdCqyA*E#R=`8-s`R;5%~gxLWh004F! zuHgUx67i?%ZxEFWw*jE{0+0m&dlyI~5H(hWqeWR%J={yM`mNK1mA07uHghCUeUH|sPs!ApO7 zP?LfAP4A$AukO&s>j1mN)^n<2gqP}n{q)~tL@DXrx*WyPS^BcQ)g&&dRafSTkA_%> zi}bS+b%m?W25%h91Bbs1`LS4_jzgTes(~Z*;lYpW>R@spXjx ze((nJpkUS5y1MApLe8r3=<~B(k$58>DNqI3#0lE6p6~0b9G^e4-Oh6f%KBm<&DW9zqFA#W0!TP}t_@eWlabv3ryX^VRe3co8n z-;rP4bevu(QUb`b82KVQ(v_WJSk*0x_$$q>>ujs$=qIBB{<%K2xcNq-PxLmW+pCgF zO&De&i0$DHja$!aI(a7QdtWK&&98qu@}Rk$^Qhr-XmCPHyk##HX%V(Q)rk4Jd%#j8 z33_j3i2M{=I&|luiJl5`+OpQ`*smKcQmx^Ze%f9cUZPH}`QMvu{EVeG9nPeqEH98~ jw^9l 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 DF{$ Date: Tue, 3 Dec 2013 03:36:10 +1030 Subject: [PATCH 05/12] Compile fix for global ability list. --- code/modules/mob/abilities.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/abilities.dm b/code/modules/mob/abilities.dm index aa56bc61f9..719c0a01c2 100644 --- a/code/modules/mob/abilities.dm +++ b/code/modules/mob/abilities.dm @@ -2,11 +2,11 @@ Creature-level abilities. */ -/*/var/global/list/ability_verbs = list( - /client/proc/test_ability, +/var/global/list/ability_verbs = list( + /*/client/proc/test_ability, /client/proc/tajaran_ability, - /client/proc/unathi_ability - )*/ + /client/proc/unathi_ability*/ + ) /client/proc/test_ability() From d86cb6ac5645a9256362ace99decf33c297b500a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 3 Dec 2013 04:18:12 +1030 Subject: [PATCH 06/12] Icons for cryopods. --- icons/obj/Cryogenic2.dmi | Bin 105027 -> 108975 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi index 8b1a9f6111b360c167de3fd5c1dc0ddd945eff93..1a524c7621cae29ff00be649aec4bce491ad9475 100644 GIT binary patch delta 21734 zcmXt9Wk6L;w53z&l9rTCk?s&F3F&U>Za8#@(jg!%-QC?S-QC@J-|>6z{e#P8&YYP& zd#}CLn(i8e@@a%0R6vi1in^1yiKCIjcRQ!=wl+{uZof{{hNIJ1adf)X)H%{rDR61{ zW8u^2Ilkd>yufWI^Fb%f4{*yJ%(?!=ha=*Xonh7tlFRkJYQ)Y<#GTO~}Fidd#B+{m{0amdZReSP4X-$AL9Plw z$opWIPE0?QjRT(n6FgIKj?ztfTM@!Hf$|$cgvZhizFN~8#w9)ciZJgp>PIC+-SwMR z!A<8RlC7GC1K(3QsAo8P_+Wu5t>!W<1eub`Ys4m3pp0_;Yn7MmUkw55ILhn*&0b>^ z+u(w)c*407>d}BHo+8h?*RkJUyM`qFh2uF8R2+Ujv<%6iFeQroV#Hcg+b<4c$mPw% zmzv~1bc6p!?QZQj_4`<1K84iVsAWUxGJV#=r#la3>E}n`yX<%-YCa5clAbcjEZ0|r zpatSD(h=x-dP0O6wix5%ngi4?_-+Rw(mxmx3e3Y(m*C{{4|ud^B6mp4{$#5 z;C>CJO;|JOQ_ubKCzYFvE|Kw^9f?xHwccTI!h0l}S}@vnq-y9s z=VIS~N)AC1U>|b5(LGe6ApJ94jt(7#<4Ny)6n5Z(-(pYQL;}B%G4l)sGg4#)2SFIo z_TJOX{951vkrGxVQMlA>&!IPqcJ5{+%t%Wr&1qr`4c6d<(-MQ7sV(>od0xul=%N|P zK7DR>yng|9pHIxtaGA#Y9KKmwPOJ0I-okT7&Iw&B!7QD(j6QZxW#{7jdE%A2gNo?5 z9ihcR0KW@|arOIvqg8FP@-td`b%nKNV$#R)v!f4Y6L33afpOAWRufJD5biy zr!1yi-ngArABF-}VCq+3pbfqO7xpStkvqO zc6RtA<($w|J72~09`@!*>aghWF}>jNFHif`uRVULa(pv27-*rDR@g{4K%nKmir^Re zkI;U1GYIrGg4pC8_50qWV^94%$??(6i6`mfVLg9R-M(u#5_b~E7OX8J8}F)hS_MSIeclOjb&{Zm4$zJ zMoq8(Y8>*DS|;)0wAq?bqbgD?1l_QHiKpW3EglnZNS&A`k3-8@;GGcmE97cGsM??# z!KQHs@AhP=Us*w*w+a>VDzF9Y`)M_9$I3LEccCt{1482hcf?76_pu{Ndl#Vj%n{Xm z=E?7R@{x>|Fai?=UcJeQ2N9igU9J7G*K+`1noRzE-j05sr-6gDbG25B_~8-fIs)04*fBPp@ER6CI)8<|Tr;$-E2o!Dkb4>e@bBJEuE*I8(fXu%CrU z_WW;&wuRpH)gke+(bEr|d%SS09^hOS2Y6e}SNNsbG=;gYc_*C#kS8i8XYidMemg?A z%ie2Sac#vMt(Wo}0OV>7{FR4}$VY3*fXk{OwCNF$yvBuoOitQj@g?n z6Tpv>6yr_rv#7lqVql4J?~pH0PL*!Syl;P6Ig`KlODflPm)rq_7XF*jZk5=(abPRz z)2>n>PI`Jev7lG7Ip@%A=BUjB%7bm=P9kw=n4@yx-@q$yT0%)~<-8t2kbq7WWCmX# zolj3_*=prp=~moqK#(Ah3BJZd(4K~8O1X? zl}m@7&+DNEWeLs)xAu)oE#|=k7T7H_^49}uPEPL>K8Q0VnI>x<0I{0ZS-iwl9YAEDpC&&=@gN-RgA=Q%fvYP@Zazj;W*bA(S$ z`d7?O*#o#A+{pAtgDf4PvYZHf%j$V|+tPn+>(G16;XvmLcWQ(m)_&vx;)Z&b{8||~ z>!Grdv>Z1UwLg#u@(~iilOf^QtmMgx(7Op4bT-ZY;^cmt*Bv}o6NQD-*0Vr2{eoUxTkivfx$S~#L?r$#jVk)~s-D48wdE!JS4x_&B4 z=27^~1nnD)&+vP?zUkXKN^r^Ga?!O&vo$-AGtng9Q1Odb8M>GP(#aY#c!HbUN#BlC zKdiFC7X%>}ljEW%`&Sd7&erat1)^QlcaS!|jn`KUTY`h15-G7jUEM}9Q7>qkIW}5u z=JdhMrRc!!cduZUe7(SIRckhLxHP z8`xy&Gm<(RnOZ*ZWRWi#E1bOKeN-8F=w^`vec>>J1(jGSP+qsL!r8fZJyg1R)5nRPV zYZBidm`J$+PLj=b<|o{>^5C-sy_8ojTYCppMPBy+q0Hu2Y%-&jrUbZvpV?=NCwTsy zNJ5LZYmEz7&?u1QOMJuU2-YQ%z%IaWenxe6ejMC6`wSx{a)gw&{gqA`@ABVlg=|1k z)a4C}yI$7h*YU31#AVdG*Pmc2L9SjHxtE`};&R*`z^t=bNljxSs<&QBd>Szm4Cpm{ zk40BDhZhkPfQU~2YzE!#WL2grVzbip(e+^`soG&@NP75PnD~61wU$ktxNn!x-80$K zd_R~`4{}dbI0;Rb>Z}`!$zI_4`GNH7Uc~USFw<-}QIWClI-TEelMJTkw;kn6v6~l% z1~j&yvDpl8bGr@13T70)6?PkPv2LO}Kwx9yWJBSB=L^L9*)5@8A2ENQk248{vUHu) zuZ^v*lNYO&W)~M*s`7=#UAQ_qdHuOB=z^K{I<_cYJ_ncMwQU!HzGjDi0eDh|GSq;M z8~UtJlBBLmj9K>h$QwN&aS3$wY}uDJ9nxEIRoZ`{!b%?9)nIUJ>)fsECxsO*n67lc zGCg+T^CyQIFj2hUO9V~`5i2Lu+;?5Senb1V^Q|H;y#7$neVkvPEA4HmYQ*$Gk2xpS z8-#@>XNEyzEML#lMl)3jU!Y5<{@JwpUAjE&+~C&_JrOKzp`H4|ckdXA+uEYr;cxBu zc_L{y4B86A)K!191N~Jj4$=<@q6a^g<(WC_2T&7taUNXF9};CYw0+kuM$UW?L(g>S zLiy%l)khF`n-Loze*J}|rCIJG9DCl|lwLQ*YujYDuQ=_`H!{jiD8M+}zhIHE<4uQy zfresFd6TH7w^JBJWR~Da@1sBVU|rreq_8UXdQtJ+ij(kgXWSP4_B`7a5e(9*#k$y~ z)Yq`+)_#KPH&fV0)Fi{K+m80+PN7*15k3aKGsSAv9yb=cUKbL}2?+_KUsBrd zTF-X4Y?cR%Vg&jCu)ck_vdV30N-fo@XJ=*goitauAE$Utvu#TmW@*=c^?ZHUa~$K@ ztFT$0(x6*2{xM|8N%)R{K>ujAR7Fi~dVYQY9K-#%vLD14lxt6`ccwc!;1Fm&zFArC z|2?~Lyb=_W`xuv*FW78TD>SJ#O>T`2)JaFrP3I| z-UMr=M!ro}$;ZzB{y=^)KK%{0rTpItp{f=qlmjnEmu#)N<3A;I8lG(=m2i7g8la%a zp`^t{R0OkEFk`!s|Ej*#Y)({Rl^9M{{X%D;wKiT+#1zPZNf>qW?0# z$UPZ$29_WxiS0xj0GNxUXO%jVui)UC2>dPZ8tXQfYU?ij$zj1{`Q#% zifz1nY;}UNVNHb?x4&+|mVW}OdgX7QzI(?yhwCP`*RRA)%RUc|K-i>z^_x(a+9OL|A>?u^FG585gNyC`LB>&E(WBtqP9fxiT5g}p2ZmMPe zw(B1i#~}z)W{eYazXF%dh_?^ky+SYuH@*nAJ}Ng_dke+!Em2P9AieW@$qFc`D-HZO zv9=;b^Gnit2ICBf$l|gjn4)##+SwXvk_ta{2VwC#h}Y|^m*Cp|Ar#-2ELi@nS8PN+ z^q)~?itki%#ptRkj|0ylX{zE6`xpIdSO$v}N@In}_1ZJMpKhVakzn+m7U#|%y!dba zD${O5wDei{5cDXq<#MSPR6U(0pjhfM$f>_8A3-{-3GGfp!oD< ztwnYIezVepX)L6*LhlfxFQQ_0R<-Rsh-KU7d5dh^q7^cv*5*Hb5MLm*b-{f!SDpl) zy<$Uq-;8NER_UTp=|SGK?aq@nVlxW<3ZUXDX4&3}lNC$Kwh@ z$e|wr%%DSa`iMH&{^s4BOIsI>m0qu&N|(O-T9c-1k0f$GhQnB)c1yu8d9|Wt^<+$1 zLOIXX1`r+Bm7wVZMqX7lwf?Qsv$!|Z1agsBXAxPYf8&q~CKqdKO1|f{}Z}SLM?_RX5w$`}|us_f#E-J!;pJ##Wq5nh91sTuLUW&2= zN1+sxZa?o~Soww~if4Li5un}_a)&iEz;T*YP9L+1jPg&-$nyrUsq&n_1z_Sa>t-~A zsUG_NSV&vh;mb222~SS)RZfq&Nby|uOw_l&8X;k&yu7AWzsbM8S&Lza1Vh{E@MgeB zd2tD~8GGEU#^jEGIBy81*lUxqa7o9N7RjZnSuDVHj1C7ApOm!a#5;+LG%Wf#i@f^1 zzn9<|@&nnmM`Neq#)7$%{5`%!?XrI5Ia8+XtoZz(KSb)*^9!?0D{H-w(+`2p7l(Ck z=1)UuFSd$WiZWu3lq9P;hOplX@q++=oM{WmTVEqUOz~u^_o8SLEaa& zPGPT5lSJxdyp(->g!8~wF!UM&7!<=KMob)yw=|~w;=P2Tltajos_^Yw{B{GUA9cjFKCuqDxRXC=PIN3<2IZ zwU^Ge#kc;j^iH^!Y_?OVq3$7AeN-0J!B&i(ea|`D`8DlRynSRNfn)QpgFSPeVP=`$ ziMO{dq~6zx59$Uf@FK!nj6R>7uipH5Qf}ag>)GEQE!YbC@H*ir4BOh^$4rT5T)>0~CC*{k z&i(6JskM&A^^QqTfXT-w;9aR=M4L*87-bu5+>FHc&gj6D&CC&>W)E3>x2{#`6S7e= z-^_5x!(Qgzz)wp4%TVsG@ry;qA4Dv~pY^cx=mWxoO((0LOd(q4rGRD%M7<`?@uXP8 zT5E8?XFSm5(MrSkV<)W3v{_j}(dE@8JepLc%;Z1ZMVi~vgoe?o4HYJfaCzHbi{JoF zmggbRr$UT@o&C*2szXDvou%VQCt!r7`s(~s`xhxGGNGq&y*>G$_Ut0GR(Yv0W15_5 zQTCBPl8iFnHQ%Vu0f)5`Yu3cLNo3dkn=L*icQp?=lNht?h&hA;eTQL7U7sg-A|*2M ziEcQ$gtTrgIkSD0i)W0hHQpe=Drd!~;2Q)zH)@{-J~ze2-u;3gL z00G6WP0NKOAz@G7(9w-N;j`YX0n@{LID-RPY5J#UATGudDAn{>J(1KZ6I08Q+K(B0 zn^32HTqBx=A-FbQbu2~dE`IB44FcP{LIv;ezCOuYl(Pwj>*~%%QYgTJk<^BhayG|` zF`~|@#C)M)-&rw5rOK6Y7PHUI{=)Ms_sZ>lPRtN#vgm7i+sZY{i?)tC57eU)N!Vm% zAxEjA%$EVcwTjvZ7QJ{uv@1D&9Da>31@qOti9VXPKTtZTO!RacB}N)}3WA(AKtNc;sYE`a2dF3dx>8dzRa+IM3N1mDUes_A87MMoAiy7|51x#y1X8 zdFWSNlrSQFQK2?A(omsE&{h*E>Hhd=;SuEH^5_Cg8(ZmL?T%jG+zgUjIz0@t6ek9S zTrYjTVNJ&t$k8;ie=26dT@$f&2*elQlTQ;mk=d-6pNuy*XPxE1MS*`8>g+~y-@l~y zg)S$KF)n@RbtBjH%d2HsW3ZM@qr_|U_#Pz=O4uF4+)qO3SmcOtHMK0W0X}gHs<6fd zr5=V7M$uZr&lGeI1|qxCNcZ_gmF5ccxAL{G>W3$70LCi>8{ zK34W5hIns?5!X^U-cbDhjd%_lSe3^n1r*hk7@XV)7p-U)l*GG<_ix3uz@uG|jn6{Pf;!Iv&JoA@eg8!Mk@^1qC6( z1(`s(p&$y zM)Zb8+YO7<=^KK-ZIr&QdGEZw=za`XpeGlu4TZVku zJI7sL!XG7^14DX`r~2b;nhXV?0Ar(fQ*Ahe1&OkplxqwmpMTy)g#}(@gzK|%XFdO8 z`)um9Zn?iak2mT4?o=Pw>h#{1ac;n}abKLtyrgvNDg5>wKAw^Lv0oG_@@?^xQvX^}+vukGliymwc$&BLrag2rnj4rIX1-mRr)t zeJRP|ViK_o)#s+NRh%Y0A^(APIp^x)I1Ha@n&M(*Vczr%ru;0S@S4}LdHueC`p-^C z83eEHKE#B4t)lI}@?HQphh#gNuIf|#hO&c0&v(+H=)YH0_%<|1BV3>c zR%wyJ3_etYh8Dc^J4~ZiNC`VdA5beX`|?z8wIFI_M485A4MUEBWCym(7IU-gv6q-+ z7?)nz%Ct3eG2S{npq=inz;Ls+cjz@MfSeYgr@z%_HA>>0oUE7W^hQ0Sx+D$Z`(jK1sv;-itSt;`Nz}Z$%St-w z>XdWeka)iS=bg7TsL0IqgakvOEuxJ6?glFwM(x-BZ{NNJn+xfJY4ci51VqHb;^Khj z(`?5hRfk66BAEAF${BwS&dC;=60B@WmLbh0k!P(T!1Ib${iPLWcz$jmz{Ie%@$=_9 zFsG9ivG`m>TtX_7xxMw-Q$qW?c-Uu)y3hZXz7)2a-$XR(Y4O_)0 zB(OCUWHN~1vl5Uo9_oLxUKE#-LR_l1WuX`QdLBn0UtzV1WpO>@^dNDuv&4XcMmGiq zJ6kF+5F2Ik`614HIGj(^IwjhuKf2OxLzI`7w_?GnVZ{h~yME1wkA#HenYo=<%Rhc{ zEwyUG*lOKvO3s2)E~#8AnhtuKu0CFfE=|9wcu#-@9m=)`mr^ ze}XEHX%R8xe6R52%e_MoExGNGU?D>{lZXY31Xg5hx#=wc6zIvCrT@o_53z}QdwX+o zaj|oAe>O9t1*2;yJq)S&AU`dfSG;}+Y_5LimiuEw?x9(0!mC2_G0y{+ zJ}z9TH9U|(z6-a%vCh9t9lbOko>-yjfZ&wsJredQ2Z@hZYnUvjT%js;Kd=~d`_v09 zEux*cSkmdaEYm@3>{p$l&LtUF39Z(}G@Eh}L6bjdE6^{(ik+>((8MpPoa6M+OZUBa zfnrWBq;IU!9PyK0cU&7KVn3ADtXMA{yvM(#D%4}|)l13DCl;U$I<$J%=XsFRrG-3}Ds@P-Kr_b}dgNDae6>D1; z=ZD4R*>gucKF{2b!1J|(jt)r(I+^LiBEyr@|oLZ9OG-P&I~_G=FgWwMxdLLl0y{%s(npJ1S1{e;r<~ZCL=_e+O+!;8_q?W|LIjMEZRA26foPik0Jf zcvX3q%oc!%Iu3i9LI(NugEmorS62RPYZH8Ml#u}m#EL;BhkyB>;0?m<@q!pRM#tXO zS8wl^+*>oFl$H?H5@2e*qkb;J(Hg$knt^VP_dDM!Gx_X|Nu=}r^v2!2_TOv4kTz~nB`}=!V=v@yoC(16lGx8 z*CM9g65OZEpMfzTJH#_ysaiJN>i4g1Ov*+&^dVqZTmPFm-O}3ZEP}B6yzK99R?|?7 z!#xfxC075))K1T}U3=2>^B3%mJ|bIwO6a=p)A`ymGN_%BBW*){ztcIhw^)rjP~LhqtSj}XwD*s zA7L=cdo=FlC$_e>{Tp@|Xd&-Ftkcr+i&853_oVrs^6~-@_&i+g8F`iFGu%xFj{w(N%jESLN$WwIkc)S3EwqD`$ZQgu^ z&AoGzd{iF4YD{>o5Q?AO+27Q*4g^K?Bs2AU@r7iEgx>Y8XA!ur0KjDJ^mnJRVjZ!d zGU9-tj@D90pYRF>2vB|$v{F%ZAy-wtL00=U*`uEJ+uqz>S6%v2IF`lxK<3SxNRu*f zw;hg@4&T&2Pq5yv73)+X4a?_F*Br^(e0ZjJEH#vnR1hB?m(=pq>F?nEH z5fZ7XY7g-~5w4l{zX`8uc3`JQ6B4sWf1@h1dsRJd zIp`F9`dhW!6t4q+kybFo!o)t2c+gWPVrJqeEz5>IeCEfkpeC21sts2+)|USPJu$v$ zqqSx&zj9*&m{(Zx@eLvKASig}aOi%Q>H(hbz2X^sdDUqlhTs9;26u#gyE zyS266%kVtqG2qGfr)ooa--@~=pucson`SG|o$u1vLtQc$uRd_e&WGn{|6{Ft?V0{g z=$spocX8XuqdMq=p=|Pk6~m%?p-Oqb!T9B&pG%1n@rQ z^{XrTcB7c_jp@h%RmKF8K|ol;tgmi?(FbzX9?g)jxx3bgZqvSX#vI;HL(Y3lv>4%7 zcMpEM9P4C~%DC?h@d}=tOvWl_LNSGQ?Qn7iyKFH7*58^czSVPGbpR>DH z*yELE03W0kL7iBm*@fvJWoJvF`9?7ei7lv%|#87~MbgD; zCW6j4Z$YKwk1lsi&-gR{{d_>2saBG|7Lese<-+X+_q53lGL*#agpVXyPDlov(JTl3 zCuB4mSTwo6KSaL74q=gnRyydjrG2tR=s{?~2x61AsZTq!V6*+nuwmL(_)}rdCmfUu zCUB2B6YL!M5Bid>hZ#zQueou{JY=4fE}hIvD7`eF{hTn07rP29g?cy6F%dS!fX$)4 z$=nu{$xK3Qp~@29^{~M@+DG_@cP*L6?I(3hP!~E$=imn8?J)DEAin9La|-G1%$G}Z zNRbUb$ZpXlF3DHQW^!rv_P_hrMp}V-RKTmtLvo#L(wztOB)4-90X80pNW|s*&D^02 z%H9|iLZ|ihoycWweceV1=?0|kxs!&+*Hs?!zK<&w;I#`$_u%D=fAa^?NWeYcH%$h& zz8BivgQCJowH&6I%Y#J)d+_BF?5a~u%zDagS!3yCHhUu~r>M&NoM?mTrV|Hs%e!#n zGRt0Yz{S+@DQdkfsnEM@`NBYE%|%pO+goWJBXCQA4rZ!H0KXT|$;rxCYdx=F?921B z_#l}0pzDFJ{7N;Pmc+L9_j7Aj^k?2KG~FNNPhI$JtS8*ewVF}g8(<;AeQTP(1?{<) z?#c~$zS~jFf(h;#_o|}3p;)XzJI6N+1UZ%v>{j8!9KA6yRa~zekunntfGJu{13#^^Pz#zYC?cG&)m84|DW>NWJX zpe&MQ6oA0Q5I=GC$8}S68K#f+u{*r73{EFRMLAc{$E8{^Qlj?sBJMigt++(7GnDtjfnpP4udzxBK-c!r}8;ejOnt;qMLbLV6h(aPtu_EGB^ zok>Wlo~|!8-!UkkP-tfrHsloHq(&*5{A;c#2(TXTn2%4qY8}~T=mS(FbVEX1M7OT4 zu5q6uPm)|g_2&wV{vl^$UQ*VAX}W&4FP&r4BFssYmt%aKH|{)t)kUOqe|#~www5TK zaR8@zRch-Uar;f+lBe)g8WuX?yOk*I1{Oj1+YPQTl9tt?0*2Yqe-*1-M?tJpb`dzZ z3}~R|K8eV-w}{w$FW@GvHI*wleR;OPaDCPI2&}`8>xG}%7d;2L_!Hb`uorC8U05;8 zP%+(N8!~3yzkz8ZS5wm+L(OO(fHCJf=^ui7vMp^-0lAv+Q_P6o^QYd<(fb$jBxarP zQB$Ms;1AC67lVf}R~_Y~T~$5uIY4!Woun1)xMRr%%j%r^cOA(nAJV52M2X37TKz|q zwiP2)fp#?PopAuY^Eb@_&eb?CcJ%p5qyB$UAF*0_dTNuJmZpdZ<5L4XQVwT4qA&X9 z>_rxG#?6R6momzSWX#S=UVBh(!wVO#f(>Z!f}-TTn;@nZ1=%)2ylE8>NrOdo?J=>B z1Q+MDX`*P!VYwRvpOwkn4t{qPY*wof63iGe({XZCDa1ch#pT9kyV57fRu{V_gUZ@2 zehDK#$?K#zj+4@Ff)yl9J`s)Pf}7+CM>@K zPnPN(FM9EfYBiBVdI3cV4UH7WuIszi;SDJT>s4=h*8ueg%b(b;UNd%H(&FeCuZj4I{0@d-PYC6E00IvIbXCmLeNMk2%|Qy z9>NWM!Cqy*d23h&Fk|o&7QXc@buHNf`Bqo-P^8P<(w?SW$1QkhRZ)?qGX9B zto%ZmCKf;nIPmPCl1=zRLmH#Nz30%VKDn1Ld>sKp8aF6TpU`E+1uCo``px`5)N#r) zHMt`Mj(wiw80cejLFCwavl+f)paT$ z=RRG#hU;ul!a3;d&i(}J2gRI(de?59e-U=Z!Oi_)ZCIc6AJ;Ns${}}@%H~De54$Hs zm3emc_D5L$cMI#^46|Y%Nb|F^wdIj1!k96ZR3c0_MY}F;?5lX`MX>Y>Hlbx`;;QZm z0Z6p7t7`;lML_Xb$Wl+cy~uisS3 zF&@{4lq)hfY@-Y^-z-6uy2=OJ)&)@%0JYCJFrH6To>nkz4$_qNm?twv_>`9%C6~sv zL(jkfc45Q<9`U=ord=DXLN5mjw9mm%dvYGvf7vqHOG+X^4FZo*-A?r?MsJW0yQ0`y zea29>7wqi7dg;hX;lbK6h}o4AI^U5_9{)LK@_gZE+J4OK^vsL|#n1Jfq+Xzur>yyu z*GrHrO2MoBPdA*s(_?+XT}Q(RJ$+o!hdxvk|5Lu+XjVbi+0Nn_3yPmepyjW#Q{>sF zy@hap(XxDJJe70#wtREV{+Z>jO|-BnKK=(qulny(b9yZtb7r}E>3-92Ncro^$n-aG zd&A6nCoML@#gMUVODNfMo`IlS8D*Yo>-N8FRB_TSXL!{GppHly()~W7Lixs54%e4B zrk_?oO+8jr?F2Ge;xvH&xl#J zvr)u&Jvc9TmUc&B6vT)t*r5t#P@cg)yi}I*>BE&v%3y;GpnVGV0I=VSk1Ixowh-2x zYxK+@KL$a+p|50leONEQH(z+X`}^9}#Gmp4ni6c{Vh5?l1)mt9)U@s4L3JA*6|ds^ zHrYeoZW6Z7xF{%VHvJNCkX`(`+)E+D&@GK#i(nto*ws_XT3IIlO$wDw2VGrGE{d@Y z#!q`8=Z&pbh!{xU{yDVwSOcgf0lxF-P`DL&V&a+(5qWv_ENH!^x--gh620 zlGAY+QU3neo^A7nH8phTJKc3~rLVM@50ClCE@L<}pR&*Uxb%2Ed{l#pBDVNQ!x3~> zPA*!4NRF|!mSf_n_hhgEM#_lP3sjFP#5(*`j!CK-1hw2_0PoYz&~H`8=LUjYGPIBd zuoIh^nc+^CUtC-q<6avd{Hn#2wJiIAkP zK_A-Q;vziz2w7WO|J%jW<-v5;d&5rT|df(z;h3GXw{ z*|~Oilv04d+-mccBh{N8m6=MdU*vxjmb3kSh(l;!Q!q0tSl;*AVbFu_5!fqhz17s! zTNTYFXG!U?tqETib+gJ%9^R!n*SdV}wrwztUn{H2VxD2eaUC@Ik*|*m|HCARBxi)Fhry*e9aG@_tS??W3(d7L=GuO`G}m7jk~cbr3jfGo2SWtsms6O74&{Y@kC&gXxI zA5%`kw__2-pBwu4n-Kt&Pbf~RGs^=_HEAfw?fquK4cl1bZn<{KQ$dpstc zuDv;2&zO9F45DHxN##nJaT}IfAfE2oahN3wJWlG2G%U~v7kM8>-gBnivtE7T7U>3ZLMD^X=|U3I5ze;Bo`5WIk+zFSedZXFGi6Q_V@ z$i0SN`Z$^o;GZu z@!WKhxGr~MEAV&z%L*TGvh(tSh;BaN1&@bA5TU#;u0Z10fmc4Dll;{*bWW2I&mA#| zV|S10dD4H4xxCRVC=-Y~M>GvxbD)eo6C9g(b>koFNNOMXDZ{ce#&>26Dmj7O2B$4o z^6nD^QIeohX*(|SnQGea`V<7vcsnowmE7~w5?S|$2M2VITA`__gm5Ci3kuAp_L_WN z9xFL3@&Um&0gq^SU^C);gr2lInIhM(!}$yu)y5L z#?K`5*b?dVZ zWFWmXBoB3c`}lNsMoSvA<`mGM3yhWj*_IDa~(_+ChsWIX*P}tCPyOXcRLRp zry-1rl`o*9qw73z85Y?=fh=?j`CzKZ$-M>jVVgVuPV#_&0N~zB(B)*2+Vd|~7#tX6 z%5@R3=5dEUKzoC_9Sy%e$W~U}(|h6PlBl2roEwZp@NX;G5AHyuUFU3E&R!vxZ2Isr zLf$??!)m24ef-RXQFxha3RJ{~b{JC!IG`W?yCvV7&@?GTn!yRd%5|4tJGj?(0k+0g zq#FNBw8%hE$~@?QF$c*-n|jAyT(uTjiv8{(NPYW@+}Og-gp59^z*cN(DT%XM({9f2o2x& zq8SM6mDWzK+)zJy0>Y=klvFNIh9l>>o5MEsz%Y>KDZ^$IN1YYVy3p8Vz5)js=?^Jc=8g&W5J6n{X)tTB^fZjCx!vX zPl|rw))ESMX>sF%`4O}`cBl*X#Le^%lF!_9x$3inj0;o&hYQY&$=AzkCBoFU9>Cqw zy2C^FWf)x?I`IR+f$#i9S_xib-0hweR}hI{M?LAoVGUpIzpDv*SMU-svh)$t-;>S? z&c~_S_Y;|L@c&6eC-d)jE#3+7rZ9P_KP)XR75@42ySn;cV8qPIOB`D-*3iw(%us(4 zRf0t@6f*)6pME^zlpfP=F+t>SX($_)# zXT8m}F%qfoY)q*tUeZJ#Wqt*vuN!NTNhcpK-(U6^vdPlKElbPXF&&?8{LNHkC7=Q$ zZ_v16>E!YS=e0UQ?+g6Q2&$Wbq!mG7;x<8p@kgs|B%Q!cEMJ{76BCbgJl$8;Iduc}9hBarb%)7T zZ$1Xu{N*lj(ZYiNo(ztNETI2$RksO%cv3Lq*X>?Bk%f|EZkl{$P5OZVGqo;k*BFY9 z&T)C#Oa)wG)2o*H``ma5} ziwwyh8D*&)PTC*d3h=pN*)`MtN;))uDf)Kr;ZgDN6Ly+i!v9W=wLaN}5M+}i*>NZ~ z9p2x+AZ@S~io=xZ#$cdL-xdf#v)cBCFJJUV$Up(FJ9@9wNni5vTlTEZPF%;m*9NHL zl&@@8E-ShKyz|TtGF7U@JDzJ#y2u?Zx3}8kSz-=4u%D^1z%jc+(2W=wx|Ngz#!M+4 zP_&S&+m2r89-MiZVgxR0HN55jm6QLXNqapojkjDys-(?eztUpr}aQ74o8fbm(?7NDEy_ z`S)FvTS)L{6c|y~f%?=`a;%Mu=iM|^JVxR2IoQot8O>6c*~q57Hrs80xn*5j*Wm*uBH{RxI=Gvs#FVu@1K;Ty`IpC@K!fin1YR>;)eUWCAaP^ zgMqD1K2CAQ^xcMjF~F1WwN22gwRI%zQ;a)!$qU3V++-u@`m6+|y}!%7ZY&!U7!uE? zWXhG5wIV>q*rKvxD?#TT)}TgH(UC9;tj1k>>iAv22CI&ajzjCk&F$vdQBHen`W7jA zr4!-V1cn$Xx~&_(w%3w1r?xZh3dmaB(+Xu3>w8Q!dek0c@?qvynb%r8`?2!rE(FaO zf<^MHvevK+OY7JWuFUkm~|yTJt^Z#69kM(UFb;TdjwLdxAM8A36gt zKs<0Fd_fjpUl>5gN!SQ5gn(dW;sES_Jr43NKU&nLYEfYFuGnN}VUQefcKg2FZgLTk zfTzyOYq{-!C9vY!%)%IZxZ=6igTQxCuRV;_OywNUSAsRJyYHwRhCFQ$1bphXU$g~y z%A0DxD1Nv|wt=Y^=hvv}T$OMzE5TGiSm>YgkcE+yVl6Y|BdE zKm$hkztryN2c}8V@ZK-8-a8D9bEIy*ZazUNNBfFOVQ?=eC!CDBBk&!~x-9Q|(5lEP z@{|Hwb+dt2j@fabZ9jvE%Sspn?)G$r&(Bs`url9soRnAB&F{3;bBAtB{ew6KY36yl z3jH_EymyiPh0V8HmwUUwu1D}C3{Aq2-RMjbW)$-AV(VVubN}5*&Qa8-P^lb(5!21d z4?l&WY9%=is)ur?p&DLZ-))icx?y1OrJkR&UYM)2&FXXEd#ll}$zHbO-|E?Q!V{ow zB0+-)O@x4+0y-2vaFsSaCg-|f zLd2RDd3kNlo1Wj;NNVJh`d7WU-~``#9u@BBo|jg{mQ}xMVVifU#f7OZ<-BEkXc zOkOGf;8HCq0s7bZgBCH`Lp^))C}YF9=x(V7htc!Y3pEu5W^i-U_BcZIJIikg+P0Qz zWxo_(7b^6?1qV=eVJwmxP^`W5y^=;%t3XQ0@x``93A)X@dP);EGLG zcXyBId(bn?glnb%^1sq3Fq8fVa?PE>^a(!;nx_r`wlmZYve$bv`YXyC(N}z*23!L- z0;6xZh2}WvGec9BW$%w2enyI)ySN&$rm-a@4X=$-#er|6LC~8s`EJMdbzf@dD0pcR zij|xAveJ#5{Pk_fq!uH%Z&(-i@2+5#7i~u~5kDh$y<1wFob;PJ+6iYU!^r&JRt9cN zt~h|Ll+F$#bLqTy-Wi~d!n?Jxs+$VlUE1hErG49yS(HI0=!Fy0-+hyLpX^muF;b|K z|Je&VJ|QWGgD~RIfKf=8O`~+g(z;huC#p6-cwhpz4^3vmA6#QvbR3{3vSgrZMPo77-b2d<{e3!iN%-=J6L7SX%j2-ylUy$(HkT;rkU z(I*@`r`%4uT>`&i9*At)0}JnQK{%w({Clt7O}}ctFL%XMaiU`qHzdjzZ{7N1$cPIv);r zm(9N$aB%{xLC>(|?ecEsp$|zq2)=##xTvD{^ zJe?Wxm`bSO7GIZ{pi$sjm2A?@~25)~v z6k9y`I+DE*XSRr5(t+og!wO)>i#ti$Y%?8t)oFGCr5T>PWk+a5U-wqsSrrwGw?X@( zo{DLgYXB;@5Tt!(qeD?=G#lim6ALnfZ(Y_4rH{%~>Sru!wfCT1PQ9?Jd%J>B$J4&L zY&8Hg*`030mp9g4I@3gN0>$3TauLyq=;t;QY3cgjH#L2hq#(YZ&YZV<`kw$;5~uC$ zRF;eh)amjY%;pKtIuVH!iH^YW3(P%VeG8uBY99#SQ`KQnSBm6`Rc8+;GTwhkkpZ$ISRsj`O zE4#vB{L7b<35SUmh^BMTJr|$P$B`pPiV7n{BDjwoqh`qx%$1e0usD{F6_a9aqTw*9 zR0<)RWq%}>qr9Ye5L;eS!m!6jRi%^RVLwKrj!1#$X2XT&;qm%-=RjN0_fmpDG7=#f z4x_VJhJ!3IhTC*8{XD0xI z`}UDZCX0fNI1@d{ut_AKCiWepaqrNl8fwYPGtk-pcmng7>J(M@^~DhN`+RdMQ<>m)oSs%-T2&Y7Oq`O$nD0_ z)PF?O~@X!ak*XfzTC1mw=R5aZJ@jOM3}lCc=p+FG287U9~zA8&Uzez&_Q2z@-l1%F#K zl>vWFBu<$>6^+WH_Og~1^mfsQHQd&Q5D1_(8s$}onY@sYI>W+pRo2(@o8jU2mHm^Y zB=O`|T=q0Iv8cC~xAMnVYHh{2Xb}M3yr3V=6vyOEhyShNVeY7}mpxDt zk6Nom2nG>?LDX8U9Frvk0t~mcQMGKDT$jTx7dneY7Gr0N{R$K)P%sye1%KF)BS*OX z_;CPw^RZXuB_)_G7WwmJc=hN}KC*Hp0L!daLcP8813#;+<>Cu2D7tq1O1H_-uzEG7 zswy-F10UJ6i6#C0biMZ4gpq435FjB4*xl};4C-d9l@0MYf6ZpOXv2B<17l@3n@-MO z(b9sop#gna87n^X8CruuI)7exK|UWZcor!^AaMLR@o1DxI!z)TM`tv$L8Ccsex2Ej z-fl-SkHCtV?1`vSX|grI8A`PJazMF)E-h_5yxr zuz-QIZ+-5|KJ~@uOM!jpLl!7n>>>*+94xxK-lj=l$d$7WY$uDV3M5(9#g-IGyo$G( zAvu)xVJ@1XB&W7y%e$QqASjbGzd6H0{?DBAo%82pXQ%eMP>8Ydao%~tdv%6FPeJRw@LGvrG znB9rb!e7uo`?_$Lx<~|nC`3bhI{;<<`&rx4f=@q&!-IqP^?%Mq(0sdC6@0yH_B(Lk zz`=`xO$c%7!UY162t9Li#1|HrSXjVlIJcHyYU}E33){a=Oz?MS&X8PM;gqt(68iKKb>HR7OkKZjZkYZu*zdrB0|y5MTL31f(*zAOP0ZMiM~XVsisD%@!FLuOkKZD){>==vsvK>>3eele^!3qjY8wZ?zLJn=_1(_=c)dEEE7ujBogJF_WR|+&PWk5&%6f`;Bw(ZGZMV zaNxkfL14#LptNPMq7jT$N+s%ATFBqMOMGsQ+HjcZXp}ljR_5o|t}%D=B=1L~+*(`H zv@nunW;Z|^uzC8%4ZeE!U0XKn@W24+*;%GO|6DsTU2JOvUe=(?z>(HgO^~Z+U;qTc zgIZBZr7}peimb?#^sYsK!IHvHKYzQyKb#-shAf*Ipip}|$(b4EKL6aDucQ`>wi25a zq567Sjvh4w6G_j`?3I7{{(ZBRU)BRrqubC};EemmBS(&wQW}=2m+fw~cNf#%ZzOF7JdBFpq8lIAge?6vGs>GM%mHxUB@kw`s)uqEgh-EKnl^+Y@# zmi4TQ;e(PaBbG|$SPH@8F-wo_0|Oi$7%)ZX&&qFz&s!|IEZ7Q=<$NAFpEt8pYOzRs zeqNgp-`>6_eyLKST^GKK4Sx+JmzPbS1WcbSNs@L^XYps3Ancj{Y3(%cxmXNEFFSTV;SF6b7k4jSq?E~!N~KU$mHGL30FEC& zjwDG;jE-*8bY)joxcTc}6R6UO`E^mV6{Zk+Z4J@w=CLKfbGvI$lz$SEtdhyBBTEu< zdO+FR+snAu59dd<`zrniw{GDU1TEmPl(W=w*(NkM%55F`WBbLwGBH6=pY>I?jJl{6 zzZ=K0vbeaf{8syw7ifQ}RAORu)C|@iJa_;=cXv06q7aEhxO?#;u0Q{oCn2%9Nqlb3 z97~X%o1<-TkZdwZxPPYy(C1WH8a@EqF{$M;)6>%c^z`&l5{p0sqEf=`uG#WERi(pH zdIh$1O767P(|`Qp7o59#)s_Kz7XCysX*>T-H8r-(l+l@5?aTK+ni&lF000IGNklK7ai}?N`3Veg_U5I5-HH zzo7m7{rq%ta!Vi6*2V|F`Hl9s*9-bpEhkR!iII)cyNj#{dOXOoOe_|oQmOFh(IbY2 zw5d&BeDMX{-Q7Ei@#7C4a$<1MR(dpMd@HgHdKOG{yLqdlgU0rD?%uwQ*X!jKBO`R^ z5RY7LBuOTjh<_u=GLIiU;_bJ!lGxbTAL;Gw?^-l6mbaxxp;hA3Dz0_b@lcV42Soff3NmOT3Vi&A2dzi{QSJlUydC+ zMl2S?>-FOCc$m?BZpQNetp4~(rK0(&*Q@#RwV12!9D6H}M?l=Fb;b98tGz)s*WME@s!{iT!!_+l5;}yj{@qeeYlayso z(*3aCfqw%B4h{ll09IdLZ=3%Gnl`6KzpAg+Z0&||I*pX(9jUk zXp~~H$k5P`8MK#5CF<+z>Fw?1FM(0^-rU@@ojYLL9*(7Ak(2-SArt*?FfuZ1jy@O} z8RquwJM{GQAj=9(&CSgIjeVOP(1s9O&qZE8cShSnHNW5QwWXf_U+@DAZ+)lJyZA1R zdw=79_#Eta;J|@{gMa|q5LWA=G&?)HV>jAPNTpJwQYkZdQ&rWb`AVfy6bc0jg#tdG zHjr~{c-Zy>m@i29{agGqGxG=@5B2p8mRD_`s1A@!#7U-7e0NxzqFyQ%5&a(XM>mm3 zlh5ZV7K?a19&))H_b&X<;eUzv0mg=h$$vd~VEPka-otjk`tr*!i9{kqcF=WIBb&{l zC`l|VuR8<1Mcj1TRrl(0H(&p^4L_*618n#%qZ2x`dK8=wGjZMvb8#0+y)N+{< zC%VnY@&$+gW#V_>z=4Ao4FR+vtg^MsP?C@&iS_k$JRT2jU0YF|1+y-Q(P$J^Re#Cl za;U0m3hV_zprN6GibX_k-Ihq>leL?y;t^`dWOJ~&!TNd{pI0kHR$s+}Jwvm!5~EZs zlFepO%VqNVcmu)XAsmUYv9ZN(49#@-Uk-ljlzf1?x;or$x9M+&P+yj1mX?;x$5mA& z7K`obmz7F|a=FaL#s;A6{|MVNV1L=FId@`E#N~1$7+F8v7D<+wn_t4K>zT^sGON*V zo_KDGr6Luz0yQo&nY<|~clci(eg_U5I5-Fh0L#nE=FF}_p}?v|9fUHh|CP#pQCFSII8d7Jq+Jvv!r7 z&_^7Ut3>?{|H1NG{Xv#xnwpw`tw74{b|cF&<#L%qp`d3+5+wAg=+(Zs8+<+=!C(-u z&!e**k0i^qv}$`CT5XYJ*$gl@HY&tpG2*%wsrp>(1~K3#Ac|x%+Ie>PUk-i;4jec* z2ndNpf?zO6DwV?Ja+%qJkAFV;X#3`OyWrBLOPi@w%3Rcp1r)S}uC}(;mMydX9goEb z)zy(qrf|D!s8qBrr+@yZ5B_5QAHDbE%|s$;{s=d>w3yGyl7!divz0GYOE%8oKUjXS z`-AasK@d!TGBT#tfD4}9M~lUxnGy5(d?XSH0%GH~<0%!3czr%|k$*O4lvx&hc=~fB z$%>Ydsca$!{O0>P{0GbLz<~n?2Z5T##>VZN+wpXZn-!NXUE1;ec0)kiJ`fb1?#I=N zAHDbEr{doY4*!ecm!+qh$F$#mxtss(hQF52<*$W*dFjD3y`KXI4jk+i{|n&hORFK> Slkfll002ovPDHLkU;%<`YiWW2 delta 17755 zcmY(qbzD_Z6E=Df1XLuI?(XhJy1Tnmx@)VTbhng%fOMC{p}V`0Zt0G5x9|IY-@SMK zIKNYS?OAK>nKkpwGZj;aUA2g@lt87ghK{?0rJK2{t+TtWlOqJ;opG$K7?aM5F4R>~ z>B&+iL9cKt=v-8-zg@YM{Rw#(QNxU4lQSRM7D5^PDeA3$U5M5?rtPYrpVjK{Ek;1# zeRY6jdP>h|sjY=fpRDX_~{yU03%=Sv$omG?hPV9PTG(EWKc6K>@y^dmRzxD!ERlPi1 z*&I2$KG)I*_3X3iAte{PWp|02UP$1JX1EoB>KsFu&TDzbs#t9q1pYF06u6+x?6mQhdo^i%My=;!pL+TY6uef~|W z%|mCHGXDC=&@ELR;8Bt*Nj%k*(rwa4q}6+H+`Bb$cT>@}b(1MP!z!L?qJEnA``Jcq zi;6{bWgmg337NJdVry;$H%iS#5=*+U`wO~s^x>=D&9gc0SEPw*+k1&UpNI>V)PFv< zRSLYprYs8=Ay8(feKG?`ZR01z1GcK;Po*cC=8%HE)tL8M9)=xw5*amNzLgeprQ{NV zgZI$zj0}X&)mqa$eB(|p0z;4~*>uqx^3qrzo^ZsK>$1O?6#7;Ay2a&vRL7!Ukx51=ay{-xz%jy|*lO2YdF}Ne%_KLQn%a|Y!|4pOt?%uDN8O^mDx>m!h=?meLi|-2OdvdI}z>h*F^z6AV{geKIJIE{9jTj_U zGxl`(YvnELQW{KIO1g4{chO!^kUzD`j4zDY5qx$tz0Mym#^7BQscRM(SzaZKU`F)B zQif@;%Q`u+XqCK&0%q4qa|~nrw-Yg2g%nXzd5qy1L))hhPs`xNG(xr{@1F{@e8Ueb zpu}PTI=W7?SBIi+e#yoc!Yc1^gK!09nr-|6Wc^kKzG zr^TC2I;OtH`%DeBfhf17B_rrzH7|dgeG%Puf3Uw(J9&11!!@S95M7TyxHU+Tj2r;K{?WWxGNnKob^uY5iTA7~u9=qH&_Z zj=@4j(yg|@3qd8?!hzo2`AkEjbPP1EL|)u~RecwWvtiVtX0%&{el~e{b=yKLq1r9P zA3lv$*xJfuEQ6gfD)&WfEu?{JFOfaU>u` zL7nibP@Q?xi4zw&_(NeW%wx`wXZy{a>Ll#>20He!VMWT`zQh&ozIP59I4}=$nTD}a zCnNLoX=*aJthPt4xrbkQGxTSJm^Lf3k{+Hx8m{je8p|Wu&NmmB4VG%1zTtd zhtP%63~cXEyl}^)>fw8PFWfcjd;mz$m8{c;=bv+^E!-^=}Cp>}KpPeTDYj z@ta#S)?m+>VaW4o%ZXO;G4Y^QuqQg$A4>+U49y1-xod#%N+j})k9b-saI@mIt5)>R z(9p29t_~xjXZ}3FZK=)d>EUlP3zF;lvIaeuWpi=Gfw9c!T$Ira%p2IlA!PWJDd3gi z{;)7#@3gi`cS483`u=~CbkWtMpCK>#Ke5!)KvMYM`)xsveDsp=@WCF*i=;QM5Y$#d zhL1462j=ho1W7R>LrmvijCcI+QiKc*?O^IndyTHokA$B%=~++#USjCpLlHilx@r?3 zQ)I{`Fz3JhWf`d>Ab85Oa~~O!Vq8P7?L4TVG5Y=uR@ky@1l3%P<(rNEP*?M2a1?_M zI`GPI#s(eNp3xLu_77vpO#eQB|Bd*aT?}fU6!Fe!vX7)Y;8s1bSaC+Zp2xU}bgs4V zA{Q7`zq7$SKFr&l(GH7_`~%q7eXkB^>WP1#mB7;wZhJ?J@EQ$iqaS&49=9z|TDI*H zQiT=iLTGK zD;ItNd!EGoJp`SidWz)lK3SUaVE&)fG$PdRy}detOCRkx6}DUc-Rf=2Gr!PDOWtM2 zi{3|jHq4GA=l%ddC+bttuU{F=GX-|!&$KCg$?&wJIHHtTmb7fSEvNq$I{)Axx32UJt&Z;9<7!w_H-Qgs`-neqhFq$UIF= z=l;lF_#`(2yWJxoLXBT%oruHe7KN~3k|oKQu%@9?U@RK@z5S#+l(H*@!$c2%+YEhZ zHpo$Xc7NOhq(%4(uSM=}dE5rJ!mfBkZW40=myLVHP+_tyrI#N8Lk36LXX|AuA-#i#{{41+&r@e{{p9R%S732 zUl}S4#Ax3!E$A3IQoIX4&%=3s%HV^8U7tYJuULQ|fo$nKPR#qEyZ4AW2iX~evj@v< zr(zCzZ?t)};n0;re1@8nU`PHhTP3CIitr<}RIbzP%dK-fgq;Mh34|XO#?0#U()_XN z^~wnOT!VSm{4X*VZad$wZ2fJ$F>>H0n6R;h)-N~^^1Fw^o=;#}S1e{vJI=gwuwDXO zB2?h}-!_8Sgp4I4->}Szws6UczQ68f@2KyMB?E-&7_?631UxJK?_5z3;S(}hgE~IV z9p;ym9A@yD#t1);EEf-Ho3P`_P|95?Qp0z3nG*`E28?E)Yr>{4ds0*GE_T&5HMu^D z$mXjN3j3!5t$+EKLr~XA2sP?yB;#aQWdwmttCdWz>Z9ie468B3AJ#+I;QqNewI(@+ zYzA{X`rd{a40T!^9M~0nv?h-;TYDDY9eym_ z8cX7Beu1ZW|8=^#g}bQ*FICH5TX$_F@aSXVI<+ra&xAL0<4pLw2cgh-3ipIZCyytfqVG=J&W_(8%AOEd4vHz)9md_3zBvOh3d?dl6kx=y=Tw?vNdz^+q&<*T- z$A3gZg_x8Vtq;;v3~{oysd?lH+Ob|U3wFHk>FI1~ z3J~xe3St+EzEDSA48Y+vvN+T7RNqpbtyQ?$OE62Gs`yh4ZvnMNb_ObQ`4$nLKT~O+ zBuwJV-@lIT{6xledO1~bSwsTJQBfGL5Q~aSDAG>)APvA-1mpb>R01HxQ@yu6{?0WR z9EaBBz@0O7P^ssRi^4BK*DlkNN|5Q`kU^ti9*;y?;eSM$9vIbmYVy)xFWeH*`hs^1acXc+YLlS1bQXlr{+#=!yS?;i~3KXPX% z(bOCsct0EymFl#mR`_4pa|E)0p0t7{ON#Z)<1HY9B+4Eqiq7c2egV7?JsiYtyEy>z zoQwuzZlV%7JMHMZ99aUsd-9hKyCtcg)K01Z>)kf2uD9c1C0;sf;|)(Z)Q$gc|K&80 zTOAMZhuqWT`6*lL{tF7AxXAf?p~ufRI)lqvwXhEP<~l)6v^@YH_n+uhOo;gG22w|b;81SvP1-r zG@g!V)eK7z=T7_iy2jY#?{X8Q<^G_AGC_8mV(oEj26Uy^u5A2RSJmv}TojJM9Di?V7 zJe8MFiP}X3uXwp;fFucXOh_)J>jllM+I~FrN0N5Z#Vz#FsdP51vMzOie6Lm=^%q+j zYZ}v|a6-q=sVW=YH*cu&bsS~U&yP(8(c`zgEUP}&e?My*XS&e*%*pwz9C)5UGwo$phob=#2o%{j zh)((2!r=wu8;7y}zHv`}(mk|xWx0e&G%XN^5s43n5+al2&Q!f%4*8rF$R5YZ-%MO2 z5_Pa6o$#xe3X4L3S2Uf}x#zaI3s_=F$w8#N)R+Ga#= za{b+cx96bnW*8&>RCgWev2yh}2iBDr=pDMApB~`AM5-d-*#7n@(8&L+C*c4_))-SJ zzBJH1xmW7TUd34?iWy~k;DKZ!NY%i^Mmn1M-28b3fFvFgdXpQmSJj^DW@;K&JLLp$ z6aj6=*~9DJEk}bD{!|T512l2x9K%x4L=;Iftm6}6UAdB_FQa{1gX5fH;XhF%k#AgK z`dug<-K-hA4tpHVl7*8$Tpy?BHt-tjOtpHkWIDBojkN^~qFW0RQnT$pyo!~}m;1&k z9^ah-EIDdFJK7a%=R%7#zA3NzQdBkem#_FK7mNG`L{?5(L*7N0*6YQYvE_D<^0x*K z213$mmwA>yw@2=yk?UcRa zvYR413#7HMBmX9=5wnLkEGC?3tf>mT_JIA_&Gn1QXZYrfNB(5)WfbbS$nqG&fBzsB7>dx^gZT3N%Y}oDa(w9c>5T2s5XtiQ0k3HCS$0 zSrkq-EUTJ~S;_s<2IBwBBCPAFckfHVCl>gf9?Jn&0THD)Y%~@XLDuf=^sE2|#}=d3q?ACf|1J;z%h#}E3zb0p)Q0w=BY}kb-OgtdRvAl6Dlng- z@h4|0)%IY{Acd|0YEKn@t;?1*z}b?{(U(0IPTa;Jt4)DG7@u3GFyq~tSG#(BU{}S&#{?_=XBNYl1MO=EW0FOXxm1>J#;}+ld-(GGr_C# zHP0ZcsBjg3Ld+*H7FzY$B`PkacAy>p@NhMyOx|mT%*7=U5>k{ZLeff#?$R6<8HIrs zl0;xYW+x;ptfclX?EPD(lF{4mLR=Hykj4#&uD(h{v2qm?0q_%Ekx{{6-*x*0sH~f{ zlUPXKpkEkl3tp8~OfD>pDL)^JxE1CZYjPkZOvsFyQJL3@vv)QcIYv-3(UcM>2>75`|EB7tpcm)nJR~AE|unGJOn$R*y|7iW*&j ziTWv^3fSz8Y67j6R`xEJw%TR0ciDo5G4Qa=vVJjq88aoKe5E<*=A*CBL#vTpoKt*2 zKaU)iN;*t|JdW1oh12hSYN{9Y`|C8WDP;zOIP^r`ON*f>XdKp2%dmJ!B~4Rg1~S?C zaKhLR?DYc-7S{0TIBz>5(i~1@)h@UN|O>L02894W}IwMx@9^ z@-*@?LqELU-lkf5-t!y_ZL6zK)=@2EsF^C_HRw5cA1J--=q^Q(6NE%3(s!LgxMU?@ z{s4!~sM9`}8-5i}8P~5YTJmyvE7NC7n0w=D0})#xyql?M9kG_jK>o3sp}?a}3n(`z z@@MHfq9DX%RpUh<6VVBnLks-)w&$_oIoV3z;JQNW))bE*WTl8LKuqgC%XfB`8>LhRR~$da`!9G9Frp2*EE=~{DnzcTU!x=0I^anhKHMz z!qU>nyL9e}>t#1&OROhd_!j3rq9!ERA=Ik-72WL3!_(Bk&5rm|jE2T(;#gnI-$sgt zGr>KckBi+{V?rT{CEM5$UwJlNj_^k!1x(*yGeWj#HObgn`RKKVaRP5e=KlgQIo-%v z!ARy&Y2(BsvtK=f5#MZx0vV-=J$tMJJ|+**i3-dhWE>~~0MK~&dXtV9i`HJ}HHOe1 zZI-BUY)zfdHj|282B`bin|PDY@9tm2r_Fc2q$W~`yH@6Xbss(%Nb>q?K`rcVH@olH zlL4de%d^vp(>UpL4NWacLT|rJXBkQ}q8gk;j9@MP*x;H-&pK`@AOnYvFBf8|Bn?yf znJJa?Scy~6BjBoY7T^_B)*7Q!Joi0iBeQ!B}0x7;lbFx z%g8AVzTWG^=tB+=n`>;S`MK`*m&`Gdv6dm0!iVDqHodZLLE=syBucVyiB8iaROta$ z14c|T4fmsgxYw$33bwG(8(~uHsN9)-xy$ATr#>V7q5jp@y%8%jb92f!ahWo~fA(mt zN|F@FzGryx3QFc<6dxYS*D6V``5ob2FVuvgyj5JFVQ2pU{D6|wtO)nKV#vr-p#R!h zfN0Dty z*LW#YDWk5gcG;8QruF=_yE}wMY02wNfPUc=T>!Dk?&wX`qC;u(PB`619O@D5x3ZX9 z4@+BZR_y6OSa6pPA*xz#Xhk8CblD^B#>ro5yeQYxx;dSjadC~IDi$B)^PCXjv1;-V z6AKH32$P*Z9n8WmU3REM!qEeI-(_C?aYHi=|2mOcip*a|_%vyY5fm7W^u*{;Ov5eM z|2{ei!5r>OWe7d}K!Fh`jhQY{DZOdxg19_C|8l*iH@zQQLKG{xisB&_)MQHw4|-|n(Yk@-o_90s0*)wM%9B+j6~wE z;zJZO)OC*?@lrM(mxQFxS+py=yeYyM6-wS9B;5H$AA6#;6$`SYhQyo_k<$vlOlUL| z%h|0nk$4nEzylts1IbMKa*ODg@RYrnjF~`P>Oz6uZ}{qq?KK(!!molA?yNoDo&N^Qyf)U?jwScPv#T?70m zd$D-0u+YT8Ut}1IYvs+yf3VpgTXxQ~xCL$<;Y7q2X_x8cw!>LaJn+>NEttQmmlocKq3hH~Dp0DaML1p^%z)`oG$Egw85B2a zLpU&FAp*y|tXzvQV)M?R>cgla0Gd^j9GO+ktt%h>kR0?|lBH#&&*QX)HY+!_D0(DS z-T17b+e_k#Y!PAymIW57aLPQ@_&8*#^r+OnE^qFLhC=Cqpcjc`4K}R5c)vpUTZ!qg z^TY}TJ_g7uz7_YQajiztV)$In4Ec6_LX)77Oz9^dhipdsvsT`k^#=zoAQMJDL{Gm5 zLta>0T-4h@?=fQ|k3+6t)cMgguhQr zO3Inqm%A@BGhU68&sU?uIM6K7QZwYrA&HWjIP{2&dYL-Mo6Z&k$dSPFP3qCfBI_|B z2EipPM0S|8pLlM1HS0D4cJECa2&~O1*kX`w&Nf36$V2&4X@gXTMg09ZzUZ3F{T2Ch zbGI)zD|J|GFVkJ{jkFJojcytA36Z z+e-?>gfCHX>fk-cv`x)sJHS31K3>>CDP`3Oa}!i$egMDoU*?gLN|7@npeDqqNRS`d zJ9K-03Eu(|LhdOfsno0*>dl;New;kr@U=OSGBSor^SmguPDjO&How)k92x{iSFDiA3simMW>fL@UkUMCZj%(9=pq? z1_KYTg9{KYcnn(C@e?p(4HZLA)D1~%p~x8$_}K#-7nfJ;rkIB)qG!7>LJ2a`+ujDB#r=10qk(&bX@YWDBSK z7af@Q?O%2~V6&0nC0wj+g#>LrTvs{I(A#O1cOSX4yI#`9o*dpy=g`@U&1z_$x9+wT zJqiKPqAck12Fy%sh@F!g>4TLScH)mIa$W{jf+!8-d=9tXk4ojnO`*Pp@0+#y1Z(05 zc6iQ9TGgSVV1PEck2_~8t4Em16^rFCohVR+%_O2_5WoI=2xpTMuj&o;L8jKu?A+uk zpKtHI*!Yl;u}ERP_dnY`AHW(88?W?JG0t zg8)CjGk>N8IR+T3B_$<+)fI$RBjtbqAuwSN)lgF%7&8rzcgrP%)$FC*>E}1@4g#K$C0eBrlcE)+#)=rYKQta5rN+(mTQxw!#YRD1PThOZ zTl?0em2f*+oV7z%mKv1lywK4QWkbog9lc~q|S*;NgS4u^!&Bn7#(4@!r1tHRe91@ z?^}p1B$=CgFuP`Hq27&#K*_aKsyS1KvzS*g>JEA1qMyU1u*(jk(XvZ|4<%)4)X8{l z5Il-XR+Pk5jX7{pG^S_GFcBCfeZok`^gbFviT%XkeQWUK6@j;J%gS!0B{%HWZ%zf`)mwY^Ud>NRCDTn?2dKoEY(7K&KDfM0Q&S)|8Iiaid3PtH;nT+1 zt>8lbw7P1fr>Dp3d4$Wv#DsN^Kk{zb8XG7gscTer$OAu5}=DYb+ zdsQo**;3}6I%Zmrl}s+jxs~a)y3WzCDhcJ3IquY@48;6%IOZR)Xt%qbTR2ly#b$TT z@qLk8n$~!0Bc~U-fzt&g&p@S!mcLDaTmH<3NwJZL`L3tQ_-nmPkc$=yv)NREB4k>5 z@D<&tEa2L_GQHzQDTV2{qq}o%?UB8X*3s(T=Z7cTh^P4bj0WDD981ZDI++>-%TNo? zk7ek(a?VEk@%E9X$d3340IeH5@YcAA-?r1DHf1fb%}BY{A3_kSjb(zxQz*!+dS zDK=9irKVO&-9<@_6Tc_9LKT~Upi5PMXv6QXsrQZJ2O**E-ri6jL76z@I3SnIpAMTL z?F#!@@sLoIw{a*TvhwllZ>r|+1{zloE_g0J?7uQ* zMhb*U4+hdPqbcH834d28pu2kI)OKeDQfzvU@Aj<0`mxADQ$o|-@mHj;IuoZxIU-<; zr!|}|J=5aT_&q)D1)PmN17Hg;O3iTi#tMsByy!WKr__?6^4Br^b}Q&RBxK2_mjpgC z>-3cBx;w2!FE~nDvzt~g*|x$09|Hosn}3^}v6GU(B}9A11swDIbcAsteVsI@NMhJE z=fw577EnH&kROoKE7j<@|Jd>z4DU{MJZHnHp{2zxEF3*!mtRwp z(Az7uGn^JgDf?564!~wM_{D4bb-g`p!{R=dHXcOgGk!#fL9G$5B3^+}_$7DpBK8!) z$*xm{f2f#ksFAryS@iozN-4f~w!2uGhj*ln*`c~h$tMk{=OsKw>-xa8htVGFRa>(e zFCl8@`e~wR{)f*i15`Zpk<8CltFS-&n`@Swd{X4(HwzAeK;ATrUgCH4Ss0~%nWQv# zmMUSlB+~9#KSfOcb?^swPtW8%on^=58$Y}>{T_?w;%AoIp3{m%%M?+iHZ&=5xu>!( z2?^JQSa3J)Ix%tYBZebl?IVxouo*@IN zOLr0W^G||3&vpO^Z)-crG<;Rj^mQas4+PJ|)_2?hl?jj7AD~8GI;5Ys#R}7)&e=S9z_P zf-6M%rGpL&7sB2Kxw_+y+Ltduo}O+TxAkyn+~;3?QT{PoW}o)5wKM3G3Ma>`2*2Ei zcWm1fN!W!6<9|rCKQ7Dkl~mAYPrVF+15hfSzU8w#V;#3w4V7zg>m70b6w;;7pvGoQ zjToR5U4#d>=Si@rC=PXDf{PD8P>#~Z&;Y#d~ft$mB74D zJFq8WR?s4_oT-`cr9MY_&1Yw6mMFn4OHU_Vs5ZdaeBYb8OK)v7G2F>9L89DU2~3Y@ zVxHFIwT553WF@{Pdy%G-nDxgYpHos< zFC9NH;q*6K;y0_9qlptQ-f<$9v6pJfG-gM#t`)q4F*@+1DS(E2|L_pjV}=kUW(o38 zvi&w01J1Jld}hIT{WTF;C2w3*x-XO8EwW8KIng#X1!owXJigz zYDkpm0<#Uwqob`ozY_q?^@EqGPD!jfM;ad&m+RS>KLVm?;Z(wa6*59+s2U<2SscCI zOA`R`Lf}nlzKIJo6a)U@6PeO#3d%8dR>~uf#l@HQ)Tl` z--BzRCC|wDx9H!g9oytJIT_4|fWUl3C*1JaU!3@|)~?7_M9eAhnU3T+#^ZLNl8u+X z-_9pGK9B(Ks9upJsST>_UHV$?Rh8EzEtHl0iR(l0fP`ony+!MXQmJmuL6fbuKY|1e zZ_9V7@|v{at3NVjI%6a;KFN?5wD9;8{IvRxe(4nWKpn+ntbM+kwnt-jY{6hXfcPNA zru&g9j&5MR6Ctt3yc-iSQui+Vd{FYC$x&i=B1A<$GAze>4L|8DBgc+&V1RvPt z28pPw6URoPy}Z<+7H5*?K+ft|Zxn&s%*+gLrcyMKfRwsAR-8;Q3GB8{{W%1pt?=-7 zpF?+T+jU}MLd?zWLb6Q6hx$Z8rQFSAZlUtf0nCm=K%6OBavS*@&pt(b*dRu1!cWZo zE5KLyVL!y&k{Kg0T6mK{Ut+_w7*EJT zEBE^(oDe$>RdHWUv8DYNuBLSpg#goA4VCu9zWos?ra&7-X2tV^% zVk&u$M0t-ly?(rn5w0Uc3y=E!38E**5TFypvoAR~I4X7)+4bV(inq19)K$ds4J*bg zUXtq|1Np&3n62N#$HDaPxFfqHl0w9occy*4bbd-dCT!;24$FRan!fl90b!{uVju4P z&aZDUB;&*z)`Y1F8Q2AfXH$$i1?iNB6P4|lrDTJN3B0T_he8#T>4ywX{b$x%uW^{NwVP(w> z4#$G+Rn!@)RS>G%0`Ch~1ksaUkQ&y_dqsH`3ZiQcUQRZ5m1IRTIa%EN%G|P|DmF(q zBll~Z@qPEm9ic1GZo$mub9A)zhys!FhFu}H}%_OC+2k7q};Y%4&oM_m->RTm9Q+;yH zgwK>3tK`hB&0$5*KY}bIr%=p)#hVk+e_$vs9*25Z-ODF4uFHS?h;_$SV|DfjyAwIL z4}yC=QJsvvN-vS8rHt%$c|%Qkelo=g7D~0gh|v-7gpBvo8h6U#iD5WAuvu#Lle&8Q<&#t)#le*l z-WMj%PdiL{!9DvKE>AUeYnp}uz4xTM2-laFK;mUeliTjbnKvsg%HEZ4^!CGYRqj*x z!>0a1>9Y1)#3q)8x`BWuoB0aw_voK$C;AN~mJT{63@N<5In8!_wV(3UrtS zxRXDEJ&q*`J$nxXrehMw+g+K^>vdWIvz+&01#iWPGk{oU-bmW;e~$}G;8{e=)AbVQ zYuj#nSgOImLm{1~%RDC2AX|N$r8PQBAV471KK!y~R~IHYf8xw5cL03ONLNn=inB9n zJjnlHp`n@`cL#@uT{fJqS2NmEtE;1mB>wHq3067Bx{aX{xtx=l25mn8l`%R*_Z>i| zHgW?c52C_%Bo>ePbIKO+{-No5k&94ZHjEV6!0#9zmDpi3ya5&g->@P?ao;nX8YnsP z>Pn3Hs-tOIWbE3S9Z##}8Xq<>-#?>mJhHb(3))dhMVp?>qI%Ig)Q~)jS7iyRxYwiG zu2j3Isny@i>C-Is8AO2H@p#RDQvE6|&b_G4SFc^oc4s!b zbJI?(XVqP^V5i-tNpwnjA~CkunyYZG%?ru;ODrL~WfSuFlWEIdzlQ<~C-g-4rh-wY z@>8;8ewXbO8|$ewrRvtGfN)L=&kkK#-p>PLoq$jI@+s`Rynqa7@)Q&l%V5_<%lRO~ zuHd*}>m2UyqF{a4O~^y4JyhRPb~c zntH~UlbeSm1N2X2`VD66X-cxtl9Gt5EMj8sKX9U+_{W~jnA>~D$CeHbksz&*6uEK5 z5i^}zRS=R3{L@ACoxG!5W@hHps8o71=!HnpRWceBsMX^y-XkM~_HA}=x*tKyhqdtN>h{UY-h~a zDOVm4@q}dIU!~bboQ4$QGBC}@fMF;L$ zy|T%**J1bZlx)1bzgn^fEKa=zX^v7r5AM!C;@xJUnu9R5g{8hK3d!E2-b;%YO`Z;~$Nfeu|23 ziHL~6?8a?MktY*}W>0Mf)K+QoFi7-1qS}AHls8@ zu;Wc>M4pZp>*RgnQ4n4{p2YxqdiL}9c)%B55_q!?3Ru9r-t?CBsR8QZw>KE)<>rOu4NB1=_F zefim0M|dpOs~uA^hbz|U5xZHjNfzl`dANti|I>-!(~No>nGo1u#RnCkl(taQrKcZE z+63E5)L;n^sxF6rER&Bbzu%k4g?$50kK#1|jF&Yv--8WPR6LbaF4x?S%c+MTTiemO z#|LxW8MkJ^0Mmn(IQM98??-)oGU!v>`7>Q71Pq_b%b9z~XlKz7Ug$6;$EzV1KlkLF zT-;UaFoK~6Cw>$r(>!=^&>gM?+^jT-lKxnpe$As2>jW-*9i^VuG8}t5IRg7b>#A44U}GD=QZT*6iOX!3e|DK17FFx*=O( z8O4NDm&~pPc50p!Zn`_(_W*+6Vio4+9b}U{aR_A%4p)KjfZbvL z6~3`wsHy+GK77ze>R%7me`S=T7``C)zv7yuO7wra){-tFQB9`0lrt)Q%O-68q!mIv zl}hrB5AOdrcnY>pvd$hdae=m{Tp8Nn$ihO>s ziWn3v%GwEbQgk}jth@848EW?}Ih~mFocH)|mlzAs080J&g%LE; zE7tH3Ebh%wv!2L<>^BdZ|J@sACU?lkkA0vIT|V2_Pkg)YF6EOcXGzPGKCyol zeqmm($F|_G7byj7yRl`XeJU=Xj^ri)i80$x=4_DeDmLu7=`F{nLq&)~;NPO^sfmj6 ziav{)oC&+6UkMBQ8p1R$gCNt4hI(dO3j4~|P_U*sCfVCtPzP-fyZryCFqB+pQddjw z^nG|I9t{tL|F=XOSB*78bcj@mrC_>b-VE@9HEU$>VbOu=;ozbVv#)m#^bUT8MCl?` z$=SD^a(5x>6KJxS^7IT7HgzE3QrSkON*vK-1h{s%qFDmSN81BuUj6q;ZR#F}`}ag> zrAK+p8K_pPCSne<685W-jQ#m>?&T366lPP~y^kCnoy&pGw&)-sCB?c!0rsCd@(k!i z{yko@1<}m|_RQ+BqP+)KK2ANRxGJ`8|DQu_Q54vFCrGK70pTcbO>39Vhy|oH<%et! zv!kC7#Xu_5kCMaS>ylsp5d%FNh*p`N?uNfap6aD9k-0e>q*pKy-<|)bPAMg5OS?3v`E zh_n6wO2sso{@mCUv11qX)c7cvz=(9d!yQ@sr=_=|BVS%>)Yd}&93Q+e5lo<4fN5Ob zL`I$U-1}0!&>RQ#2+ct^qYWN4QE{#AHi@me_Owf8?$IzpC6)f^z)eMSOWHDfkIlFC3$Je%g&{xG;?ZmMj`lexOwc2`K1=0w zIMmSt9B{{6T<&dWh+vyWDHoTGJO97J3tLRc{5Mt?L3=q`iCA^$-E)Ri-e&pn-k%RqcA0L^gM~Q|0|g~X9*sz}7w5<7?yimH zOLJfG0VF#+gS}dQ5bP#$f}5*9VOjvPVkybjSv^C7Y*y*$L0e$Y8o|UPdPxd`C+B`A z`Cf;!@#Y!jZL!%tx}?1P;R|+}=Uu%Vc=2bvq%@m_RIff+@D8^SI3-?15dLtp1l9@t zQ~%#B_#I4HHNU$nf6~$`vf?h_giB3`6*M8kpCHb9=-foO=Z*!u+Vc#7PoI+YP&LB- zvGqZ=3RjJ>K%$U+fO0j9xaotxA(8jvr=xaIh13zX6c%s##FR}Ed^L~|&GzmE>Hjm; zE{}r?f@V2!v0Z#olD@Wn*EeaF#wi+p*{}#%+8)z(D4}U~Ui$KbE^2d^Endvr@a$Py zkdu&xyT_6XS@owsJbf~?qNdKC_vgYrjXrI_G5tv=rr6rQncm^1Xn%%%!}sU*=?{N> zRTW%eeChqGMULT94qdyxJmZjy(H=(ukKK1)e0HAVUjNc5va*nd<+O8*R( z+?03AK5eOuv$C?<@$c7b2H+qWJ8$vxNuJ9E&sdq%OX-H2nm#;#{sXhe(x5xr@?`%# zOmt&s6WAQdvUXaFN@AhK39++3Hb0rGlpijx6Sr(n{kC7HudPv(czu{%_?|nCi3X%hdVB87H;Y?JesKs(N@U`}&7>yLV^i z<+;^Q5()_my;ynkk|ukle8R;RXF=yU|3aPr+v_gf>QtM&Fy+_No)^q(BA4$G_gOym zy6P{{^yT+U`QC&>D(9VB0{%4c=k06GaA&uRp8(wKU^VyH^U0rQa`Cxn%?v5Kv$a}Z zR8L%VYN))H5Z~^TOD=EOVxsx}=%b~qp8BP=qV>>}$}a1$WW^*KNYmQu>h}nn{WG>g z+Sc>^r}`}~?C Date: Tue, 3 Dec 2013 04:21:37 +1030 Subject: [PATCH 07/12] Basic functionality for crypod despawners. --- baystation12.dme | 1 + code/game/machinery/cryopod.dm | 248 +++++++++++++++++++++++++++++++++ 2 files changed, 249 insertions(+) create mode 100644 code/game/machinery/cryopod.dm diff --git a/baystation12.dme b/baystation12.dme index 170b53098f..a6db500870 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -267,6 +267,7 @@ #include "code\game\machinery\cloning.dm" #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\cryo.dm" +#include "code\game\machinery\cryopod.dm" #include "code\game\machinery\deployable.dm" #include "code\game\machinery\door_control.dm" #include "code\game\machinery\doppler_array.dm" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm new file mode 100644 index 0000000000..7731cf875b --- /dev/null +++ b/code/game/machinery/cryopod.dm @@ -0,0 +1,248 @@ +/* + * Cryogenic refrigeration unit. Basically a despawner. + * Stealing a lot of concepts/code from sleepers due to massive laziness. + * The despawn tick will only fire if it's been more than time_till_despawned ticks + * since time_entered, which is world.time when the occupant moves in. + * ~ Zuhayr + */ + +//Decorative structures to go alongside cryopods. +/obj/structure/cryofeed + + name = "\improper cryogenic feed" + desc = "A bewildering tangle of machinery and pipes." + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "cryo_rear" + anchored = 1 + + var/orient_right = null //Flips the sprite. + +/obj/structure/cryofeed/right + orient_right = 1 + +/obj/structure/cryofeed/New() + + if(orient_right) + icon_state = "cryo_rear-r" + else + icon_state = "cryo_rear" + ..() + +//Cryopods themselves. +/obj/machinery/cryopod + name = "\improper cryogenic freezer" + desc = "A man-sized pod for entering suspended animation." + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "body_scanner_0" + density = 1 + anchored = 1 + + var/mob/occupant = null //Person waiting to be despawned. + var/orient_right = null //Flips the sprite. + var/time_till_despawn = 9000 //15 minutes-ish safe period before being despawned. + var/time_entered = 0 //Used to keep track of the safe period. + +/obj/machinery/cryopod/right + orient_right = 1 + +/obj/machinery/cryopod/New() + + if(orient_right) + icon_state = "body_scanner_0-r" + else + icon_state = "body_scanner_0" + ..() + +//Lifted from Unity stasis.dm and refactored. ~Zuhayr +/obj/machinery/cryopod/process() + if(occupant) + + //Allow a ten minute gap between entering the pod and actually despawning. + if(world.time - time_entered < time_till_despawn) + return + + if(!occupant.client && occupant.stat<2) //Occupant is living and has no client. + for(var/obj/item/W in occupant) + //TODO: More complex/interesting code for storage/recovery of specific items. + occupant.drop_from_inventory(W) + W.loc = src + + var/job = occupant.mind.assigned_role + var/role = occupant.mind.special_role + + job_master.FreeRole(job) + + if(role == "traitor" || role == "MODE") + del(occupant.mind.objectives) + occupant.mind.special_role = null + else + if(ticker.mode.name == "AutoTraitor") + var/datum/game_mode/traitor/autotraitor/current_mode = ticker.mode + current_mode.possible_traitors.Remove(occupant) + + // Delete them from datacore. + for(var/datum/data/record/R in data_core.medical) + if ((R.fields["name"] == occupant.real_name)) + del(R) + for(var/datum/data/record/T in data_core.security) + if ((T.fields["name"] == occupant.real_name)) + del(T) + for(var/datum/data/record/G in data_core.general) + if ((G.fields["name"] == occupant.real_name)) + del(G) + + if(orient_right) + icon_state = "body_scanner_0-r" + else + icon_state = "body_scanner_0" + + //TODO: Check objectives/mode, update new targets if this mob is the target, spawn new antags? + + //This should guarantee that ghosts don't spawn. + occupant.ckey = null + + // Delete the mob. + del(occupant) + occupant = null + + return + + +/obj/machinery/cryopod/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob) + + if(istype(G, /obj/item/weapon/grab)) + + if(occupant) + user << "\blue The cryo pod is in use." + return + + if(!ismob(G:affecting)) + return + + var/willing = null //We don't want to allow people to be forced into despawning. + var/mob/M = G:affecting + + if(M.client) + if(alert(M,"Would you like to enter cryosleep?",,"Yes","No") == "Yes") + if(!M || !G || !G:affecting) return + willing = 1 + else + willing = 1 + + if(willing) + + visible_message("[user] starts putting [G:affecting:name] into the cryo pod.", 3) + + if(do_after(user, 20)) + if(!M || !G || !G:affecting) return + + M.loc = src + + if(M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + + if(orient_right) + icon_state = "body_scanner_1-r" + else + icon_state = "body_scanner_1" + + M << "\blue You feel cool air surround you. You go numb as your senses turn inward." + M << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + occupant = M + time_entered = world.time + + // Book keeping! + log_admin("[key_name_admin(M)] has entered a stasis pod.") + message_admins("\blue [key_name_admin(M)] has entered a stasis pod.") + + //Despawning occurs when process() is called with an occupant without a client. + src.add_fingerprint(M) + +/obj/machinery/cryopod/verb/eject() + set name = "Eject Pod" + set category = "Object" + set src in oview(1) + if(usr.stat != 0) + return + + if(orient_right) + icon_state = "body_scanner0-r" + else + icon_state = "body_scanner0" + + src.go_out() + add_fingerprint(usr) + return + +/obj/machinery/cryopod/verb/move_inside() + set name = "Enter Pod" + set category = "Object" + set src in oview(1) + + if(usr.stat != 0 || !(ishuman(usr) || ismonkey(usr))) + return + + if(src.occupant) + usr << "\blue The cryo pod is in use." + return + + for(var/mob/living/carbon/slime/M in range(1,usr)) + if(M.Victim == usr) + usr << "You're too busy getting your life sucked out of you." + return + + visible_message("[usr] starts climbing into the sleeper.", 3) + + if(do_after(usr, 20)) + + if(!usr || !usr.client) + return + + if(src.occupant) + usr << "\blue The cryo pod is in use." + return + + usr.stop_pulling() + usr.client.perspective = EYE_PERSPECTIVE + usr.client.eye = src + usr.loc = src + src.occupant = usr + + if(orient_right) + icon_state = "body_scanner_1-r" + else + icon_state = "body_scanner_1" + + usr << "\blue You feel cool air surround you. You go numb as your senses turn inward." + usr << "\blue If you ghost, log out or close your client now, your character will shortly be permanently removed from the round." + occupant = usr + time_entered = world.time + + src.add_fingerprint(usr) + + return + +/obj/machinery/cryopod/proc/go_out() + + if(!occupant) + return + + if(occupant.client) + occupant.client.eye = src.occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + + occupant.loc = get_turf(src) + occupant = null + + if(orient_right) + icon_state = "body_scanner_0-r" + else + icon_state = "body_scanner_0" + + return + + +//Attacks/effects. +/obj/machinery/cryopod/blob_act() + return //Sorta gamey, but we don't really want these to be destroyed. \ No newline at end of file From 411308b287679c18c65b318a986ac7b3a55f125a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 3 Dec 2013 21:28:30 +1030 Subject: [PATCH 08/12] Added item preservation, cryo announcements and a minimum timer to cryopods. --- code/game/machinery/cryopod.dm | 40 ++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 7731cf875b..65af95ca46 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -6,6 +6,10 @@ * ~ Zuhayr */ +//Main cryopod console. + + + //Decorative structures to go alongside cryopods. /obj/structure/cryofeed @@ -19,6 +23,7 @@ /obj/structure/cryofeed/right orient_right = 1 + icon_state = "cryo_rear-r" /obj/structure/cryofeed/New() @@ -39,14 +44,33 @@ var/mob/occupant = null //Person waiting to be despawned. var/orient_right = null //Flips the sprite. - var/time_till_despawn = 9000 //15 minutes-ish safe period before being despawned. + var/time_till_despawn = 10 //(9000 ticks) 15 minutes-ish safe period before being despawned. var/time_entered = 0 //Used to keep track of the safe period. + var/obj/item/device/radio/intercom/announce // + + //These items are preserved when the process() despawn proc occurs. + var/list/preserve_items = list( + /obj/item/weapon/hand_tele, + /obj/item/weapon/card/id/captains_spare, + /obj/item/device/aicard, + /obj/item/device/mmi, + /obj/item/device/paicard, + /obj/item/weapon/gun, + /obj/item/weapon/pinpointer, + /obj/item/clothing/suit, + /obj/item/clothing/shoes/magboots, + /obj/item/blueprints, + /obj/item/clothing/head/helmet/space/ + ) /obj/machinery/cryopod/right orient_right = 1 + icon_state = "body_scanner_0-r" /obj/machinery/cryopod/New() + announce = new /obj/item/device/radio/intercom(src) + if(orient_right) icon_state = "body_scanner_0-r" else @@ -62,11 +86,20 @@ return if(!occupant.client && occupant.stat<2) //Occupant is living and has no client. + + //Delete all items not on the preservation list and drop all others into the pod. for(var/obj/item/W in occupant) - //TODO: More complex/interesting code for storage/recovery of specific items. occupant.drop_from_inventory(W) W.loc = src + var/preserve = null + for(var/T in preserve_items) + if(istype(W,T)) + preserve = 1 + break + + if(!preserve) del(W) + var/job = occupant.mind.assigned_role var/role = occupant.mind.special_role @@ -101,6 +134,9 @@ //This should guarantee that ghosts don't spawn. occupant.ckey = null + //Make an announcement and log the person entering storage. + announce.autosay("[occupant.real_name] has entered long-term storage.", "Cryogenic Oversight") + // Delete the mob. del(occupant) occupant = null From b35e8cd8fbf276c452cd590a77169c42d3fd5b7e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 3 Dec 2013 22:05:35 +1030 Subject: [PATCH 09/12] Added cryopod console with item recovery. --- code/game/machinery/cryopod.dm | 99 +++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 65af95ca46..d5045c8aa8 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -6,9 +6,99 @@ * ~ Zuhayr */ +//Used for logging people entering cryosleep and important items they are carrying. +var/global/list/frozen_crew = list() +var/global/list/frozen_items = list() + //Main cryopod console. +/obj/machinery/computer/cryopod + name = "cryogenic oversight console" + desc = "An interface between crew and the cryogenic storage oversight systems." + icon_state = "teleport" + circuit = "/obj/item/weapon/circuitboard/cryopodcontrol" + var/mode = null +/obj/machinery/computer/cryopod/attack_paw() + src.attack_hand() + +/obj/machinery/computer/cryopod/attack_ai() + src.attack_hand() + +obj/machinery/computer/cryopod/attack_hand(mob/user = usr) + if(stat & (NOPOWER|BROKEN)) + return + + user.set_machine(src) + src.add_fingerprint(usr) + + var/dat + + if (!( ticker )) + return + + dat += "

Cryogenic Oversight Control
" + dat += "Welcome, [user.real_name].


" + dat += "View storage log.
" + dat += "Recover object.
" + dat += "Recover all objects.
" + dat += "Revive crew.

" + + user << browse(dat, "window=cryopod_console") + onclose(user, "cryopod_console") + +obj/machinery/computer/cryopod/Topic(href, href_list) + + if(..()) + return + + var/mob/user = usr + + src.add_fingerprint(user) + + if(href_list["log"]) + + user << "You clicked log! :D" + else if(href_list["item"]) + + if(frozen_items.len == 0) + user << "\blue There is nothing to recover from storage." + return + + var/obj/item/I = input(usr, "Please choose which object to retrieve.","Object recovery",null) as obj in frozen_items + + if(!I || frozen_items.len == 0) + user << "\blue There is nothing to recover from storage." + return + + visible_message("\blue The console beeps happily as it disgorges \the [I].", 3) + + I.loc = get_turf(src) + frozen_items -= I + + else if(href_list["allitems"]) + + if(frozen_items.len == 0) + user << "\blue There is nothing to recover from storage." + return + + visible_message("\blue The console beeps happily as it disgorges the desired objects.", 3) + + for(var/obj/item/I in frozen_items) + I.loc = get_turf(src) + frozen_items -= I + + else if(href_list["crew"]) + + user << "You clicked crew! :D" + + src.updateUsrDialog() + return + +/obj/item/weapon/circuitboard/cryopodcontrol + name = "Circuit board (Cryogenic Oversight Console)" + build_path = "/obj/machinery/computer/cryopod" + origin_tech = "programming=3" //Decorative structures to go alongside cryopods. /obj/structure/cryofeed @@ -98,7 +188,10 @@ preserve = 1 break - if(!preserve) del(W) + if(!preserve) + del(W) + else + frozen_items += W var/job = occupant.mind.assigned_role var/role = occupant.mind.special_role @@ -135,12 +228,16 @@ occupant.ckey = null //Make an announcement and log the person entering storage. + frozen_crew += "[occupant.real_name]" + announce.autosay("[occupant.real_name] has entered long-term storage.", "Cryogenic Oversight") + visible_message("\blue The crypod hums and hisses as it moves [occupant.real_name] into storage.", 3) // Delete the mob. del(occupant) occupant = null + return From 0a0a71a66c44eaabf31094b81d7ab107d94275dc Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 3 Dec 2013 22:31:22 +1030 Subject: [PATCH 10/12] Added cryo log, item recover strings and various bits and bobs to cryopods. Restored 9000 tick delay on use. --- code/game/machinery/cryopod.dm | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index d5045c8aa8..605b575bd9 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -15,7 +15,8 @@ var/global/list/frozen_items = list() /obj/machinery/computer/cryopod name = "cryogenic oversight console" desc = "An interface between crew and the cryogenic storage oversight systems." - icon_state = "teleport" + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "cellconsole" circuit = "/obj/item/weapon/circuitboard/cryopodcontrol" var/mode = null @@ -58,7 +59,13 @@ obj/machinery/computer/cryopod/Topic(href, href_list) if(href_list["log"]) - user << "You clicked log! :D" + var/dat = "Recently stored crewmembers


" + for(var/person in frozen_crew) + dat += "[person]
" + dat += "
" + + user << browse(dat, "window=cryolog") + else if(href_list["item"]) if(frozen_items.len == 0) @@ -90,7 +97,7 @@ obj/machinery/computer/cryopod/Topic(href, href_list) else if(href_list["crew"]) - user << "You clicked crew! :D" + user << "\red Functionality unavailable at this time." src.updateUsrDialog() return @@ -132,13 +139,13 @@ obj/machinery/computer/cryopod/Topic(href, href_list) density = 1 anchored = 1 - var/mob/occupant = null //Person waiting to be despawned. - var/orient_right = null //Flips the sprite. - var/time_till_despawn = 10 //(9000 ticks) 15 minutes-ish safe period before being despawned. - var/time_entered = 0 //Used to keep track of the safe period. + var/mob/occupant = null // Person waiting to be despawned. + var/orient_right = null // Flips the sprite. + var/time_till_despawn = 9000 // 15 minutes-ish safe period before being despawned. + var/time_entered = 0 // Used to keep track of the safe period. var/obj/item/device/radio/intercom/announce // - //These items are preserved when the process() despawn proc occurs. + // These items are preserved when the process() despawn proc occurs. var/list/preserve_items = list( /obj/item/weapon/hand_tele, /obj/item/weapon/card/id/captains_spare, @@ -325,7 +332,7 @@ obj/machinery/computer/cryopod/Topic(href, href_list) usr << "You're too busy getting your life sucked out of you." return - visible_message("[usr] starts climbing into the sleeper.", 3) + visible_message("[usr] starts climbing into the cryo pod.", 3) if(do_after(usr, 20)) From 74fe8cd76a31a2108a4a6a6e64d7ff3ccd3bdc03 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 3 Dec 2013 22:42:22 +1030 Subject: [PATCH 11/12] Somehow managed to break this during merge resolution. --- code/modules/reagents/Chemistry-Machinery.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 8a46fcb356..9de1bfe886 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -10,10 +10,10 @@ icon_state = "dispenser" use_power = 0 idle_power_usage = 40 - var/ui_name = "Chem Dispenser 5000" + var/ui_name = "Chem Dispenser 5000" var/energy = 100 var/max_energy = 100 - var/amount = 30 + var/amount = 30 var/accept_glass = 0 var/beaker = null var/recharged = 0 @@ -448,6 +448,8 @@ var/amount_per_pill = reagents.total_volume/count if (amount_per_pill > 50) amount_per_pill = 50 + var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) + if(reagents.total_volume/count < 1) //Sanity checking. return while (count--) From 5c1415f3b898552abadad18bd787e60318213ab3 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 4 Dec 2013 12:30:37 +1030 Subject: [PATCH 12/12] Removed some commented ability code. --- code/modules/mob/abilities.dm | 58 +++-------------------- code/modules/mob/living/carbon/species.dm | 15 +----- 2 files changed, 8 insertions(+), 65 deletions(-) diff --git a/code/modules/mob/abilities.dm b/code/modules/mob/abilities.dm index 719c0a01c2..e5e2be9af0 100644 --- a/code/modules/mob/abilities.dm +++ b/code/modules/mob/abilities.dm @@ -2,11 +2,11 @@ Creature-level abilities. */ -/var/global/list/ability_verbs = list( - /*/client/proc/test_ability, - /client/proc/tajaran_ability, - /client/proc/unathi_ability*/ - ) +/var/global/list/ability_verbs = list( ) + +/* + + Example ability: /client/proc/test_ability() @@ -32,50 +32,4 @@ Creature-level abilities. src << "\blue You perform an ability." -/client/proc/tajaran_ability() - - set category = "Ability" - set name = "Tajaran ability" - set desc = "An ability for Tajara." - - // Check if the client has a mob and if the mob is valid and alive. - if(!mob || !istype(mob,/mob/living) || mob.stat) - src << "\red You must be corporeal and alive to do that." - return 0 - - //Handcuff check. - if(mob.restrained()) - src << "\red You cannot do this while restrained." - return 0 - - if(istype(mob,/mob/living/carbon)) - var/mob/living/carbon/M = mob - if(M.handcuffed) - src << "\red You cannot do this while cuffed." - return 0 - - src << "\blue You perform an ability." - -/client/proc/unathi_ability() - - set category = "Ability" - set name = "Unathi ability" - set desc = "An ability for Unathi." - - // Check if the client has a mob and if the mob is valid and alive. - if(!mob || !istype(mob,/mob/living) || mob.stat) - src << "\red You must be corporeal and alive to do that." - return 0 - - //Handcuff check. - if(mob.restrained()) - src << "\red You cannot do this while restrained." - return 0 - - if(istype(mob,/mob/living/carbon)) - var/mob/living/carbon/M = mob - if(M.handcuffed) - src << "\red You cannot do this while cuffed." - return 0 - - src << "\blue You perform an ability." \ No newline at end of file +*/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index de883552b8..c5d5351e3f 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -46,9 +46,8 @@ flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR - /*abilities = list( - /client/proc/test_ability, - )*/ + //If you wanted to add a species-level ability: + /*abilities = list(/client/proc/test_ability)*/ /datum/species/unathi name = "Unathi" @@ -71,11 +70,6 @@ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL - /*abilities = list( - /client/proc/test_ability, - /client/proc/unathi_ability - )*/ - /datum/species/tajaran name = "Tajaran" icobase = 'icons/mob/human_races/r_tajaran.dmi' @@ -98,11 +92,6 @@ flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL - /*abilities = list( - /client/proc/test_ability, - /client/proc/tajaran_ability - )*/ - /datum/species/skrell name = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi'