From eade350dc83369d59b1cd68c8140310d0c83a1cf Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sat, 2 Jan 2016 01:06:37 -0500 Subject: [PATCH 01/23] Sec Rifle Port --- code/datums/supplypacks.dm | 16 ++++++++ .../projectiles/ammunition/ammo_casings.dm | 38 +++++++++++++----- .../projectiles/ammunition/magazines.dm | 33 ++++++++++++--- .../projectiles/guns/projectile/automatic.dm | 35 +++++++++++----- .../research/designs/weapon_designs.dm | 33 +++++++++++++++ icons/obj/ammo.dmi | Bin 18874 -> 19498 bytes icons/obj/gun.dmi | Bin 75828 -> 77597 bytes 7 files changed, 131 insertions(+), 24 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a0aaadd6e51..54558f0b654 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -332,6 +332,22 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "incendiary weapons crate" access = access_heads +/datum/supply_packs/security/armory/wt550 + name = "WT-550 Auto Rifle Crate" + contains = list(/obj/item/weapon/gun/projectile/automatic/wt550, + /obj/item/weapon/gun/projectile/automatic/wt550) + cost = 35 + containername = "auto rifle crate" + +/datum/supply_packs/security/armory/wt550ammo + name = "WT-550 Rifle Ammo Crate" + contains = list(/obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9, + /obj/item/ammo_box/magazine/wt550m9,) + cost = 30 + containername = "auto rifle ammo crate" + /////// Implants & etc /datum/supply_packs/security/armory/loyalty diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 557407ac8a3..9914e0bb87f 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -28,17 +28,37 @@ /obj/item/ammo_casing/c9mmap desc = "A 9mm bullet casing." caliber = "9mm" - projectile_type =/obj/item/projectile/bullet/armourpiercing + projectile_type = "/obj/item/projectile/bullet/armourpiercing" /obj/item/ammo_casing/c9mmtox desc = "A 9mm bullet casing." caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/toxinbullet + projectile_type = "/obj/item/projectile/bullet/toxinbullet" /obj/item/ammo_casing/c9mminc desc = "A 9mm bullet casing." caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/incendiary/firebullet + projectile_type = "/obj/item/projectile/bullet/incendiary/firebullet" + +/obj/item/ammo_casing/c46x30mm + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = "/obj/item/projectile/bullet/weakbullet3" + +/obj/item/ammo_casing/c46x30mmap + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = "/obj/item/projectile/bullet/armourpiercing" + +/obj/item/ammo_casing/c46x30mmtox + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = "/obj/item/projectile/bullet/toxinbullet" + +/obj/item/ammo_casing/c46x30mminc + desc = "A 4.6x30mm bullet casing." + caliber = "4.6x30mm" + projectile_type = "/obj/item/projectile/bullet/incendiary/firebullet" /obj/item/ammo_casing/c45 desc = "A .45 bullet casing." @@ -60,7 +80,7 @@ desc = "A 12 gauge buckshot shell." icon_state = "gshell" projectile_type = "/obj/item/projectile/bullet/pellet" - pellets = 5 + pellets = 6 deviation = 30 /obj/item/ammo_casing/shotgun/rubbershot @@ -68,7 +88,7 @@ desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance." icon_state = "bshell" projectile_type = "/obj/item/projectile/bullet/rpellet" - pellets = 5 + pellets = 6 deviation = 30 materials = list(MAT_METAL=4000) @@ -94,7 +114,7 @@ desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards. This one has been packed with even more \ propellant. It's like playing russian roulette, with a shotgun." icon_state = "improvshell" - projectile_type = /obj/item/projectile/bullet/pellet/random + projectile_type = "/obj/item/projectile/bullet/pellet/random" materials = list(MAT_METAL=250) pellets = 5 deviation = 30 @@ -135,7 +155,7 @@ name = "FRAG-12 slug" desc = "A high explosive breaching round for a 12 gauge shotgun." icon_state = "heshell" - projectile_type = /obj/item/projectile/bullet/frag12 + projectile_type = "/obj/item/projectile/bullet/frag12" /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath name = "dragonsbreath shell" @@ -150,7 +170,7 @@ desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \ The unique properties of the crystal splot the pulse into a spread of individually weaker bolts." icon_state = "ionshell" - projectile_type = /obj/item/projectile/ion/weak + projectile_type = "/obj/item/projectile/ion/weak" pellets = 4 deviation = 30 @@ -158,7 +178,7 @@ name = "laser slug" desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package." icon_state = "lshell" - projectile_type = /obj/item/projectile/beam + projectile_type = "/obj/item/projectile/beam" /obj/item/ammo_casing/shotgun/techshell name = "unloaded technological shell" diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 9ef9938071a..4fb8564cb57 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -116,10 +116,33 @@ ..() icon_state = "[initial(icon_state)]-[ammo_count() ? "8" : "0"]" +/obj/item/ammo_box/magazine/wt550m9 + name = "wt550 magazine (4.6x30mm)" + icon_state = "46x30mmt-20" + ammo_type = "/obj/item/ammo_casing/c46x30mm" + caliber = "4.6x30mm" + max_ammo = 20 + +/obj/item/ammo_box/magazine/wt550m9/update_icon() + ..() + icon_state = "46x30mmt-[round(ammo_count(),4)]" + +/obj/item/ammo_box/magazine/wt550m9/wtap + name = "wt550 magazine (Armour Piercing 4.6x30mm)" + ammo_type = "/obj/item/ammo_casing/c46x30mmap" + +/obj/item/ammo_box/magazine/wt550m9/wttx + name = "wt550 magazine (Toxin Tipped 4.6x30mm)" + ammo_type = "/obj/item/ammo_casing/c46x30mmtox" + +/obj/item/ammo_box/magazine/wt550m9/wtic + name = "wt550 magazine (Incindiary 4.6x30mm)" + ammo_type = "/obj/item/ammo_casing/c46x30mminc" + /obj/item/ammo_box/magazine/uzim9mm name = "uzi magazine (9mm)" icon_state = "uzi9mm-32" - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = "/obj/item/ammo_casing/c9mm" caliber = "9mm" max_ammo = 32 @@ -137,17 +160,17 @@ /obj/item/ammo_box/magazine/smgm9mm/ap name = "SMG magazine (Armour Piercing 9mm)" - ammo_type = /obj/item/ammo_casing/c9mmap + ammo_type = "/obj/item/ammo_casing/c9mmap" materials = list(MAT_METAL = 3000) /obj/item/ammo_box/magazine/smgm9mm/toxin name = "SMG magazine (Toxin Tipped 9mm)" - ammo_type = /obj/item/ammo_casing/c9mmtox + ammo_type = "/obj/item/ammo_casing/c9mmtox" materials = list(MAT_METAL = 3000) /obj/item/ammo_box/magazine/smgm9mm/fire name = "SMG Magazine (Incendiary 9mm)" - ammo_type = /obj/item/ammo_casing/c9mminc + ammo_type = "/obj/item/ammo_casing/c9mminc" materials = list(MAT_METAL = 3000) /obj/item/ammo_box/magazine/smgm9mm/update_icon() @@ -194,7 +217,7 @@ name = "toploader magazine (5.56mm)" icon_state = "5.56m" origin_tech = "combat=5;syndicate=1" - ammo_type = /obj/item/ammo_casing/a556 + ammo_type = "/obj/item/ammo_casing/a556" caliber = "a556" max_ammo = 30 multiple_sprites = 2 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 2121d3e4cf8..69ea9084a26 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -6,11 +6,11 @@ can_suppress = 1 burst_size = 3 fire_delay = 2 - action_button_name = "Toggle Firemode" - + action_button_name = "Toggle Firemode" + /obj/item/weapon/gun/projectile/automatic/isHandgun() return 0 - + /obj/item/weapon/gun/projectile/automatic/proto name = "\improper Nanotrasen Saber SMG" desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors." @@ -49,10 +49,10 @@ A.update_icon() update_icon() return 1 - + /obj/item/weapon/gun/projectile/automatic/ui_action_click() burst_select() - + /obj/item/weapon/gun/projectile/automatic/verb/burst_select() var/mob/living/carbon/human/user = usr select = !select @@ -102,14 +102,30 @@ icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][silenced ? "-suppressed" : ""]" return +/obj/item/weapon/gun/projectile/automatic/wt550 + name = "security auto rifle" + desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle." + icon_state = "wt550" + item_state = "arg" + mag_type = "/obj/item/ammo_box/magazine/wt550m9" + fire_delay = 2 + can_suppress = 0 + burst_size = 1 + action_button_name = null + +/obj/item/weapon/gun/projectile/automatic/wt550/update_icon() + ..() + icon_state = "wt550[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]" + return + /obj/item/weapon/gun/projectile/automatic/mini_uzi name = "\improper 'Type U3' Uzi" desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds." icon_state = "mini-uzi" origin_tech = "combat=5;materials=2;syndicate=8" mag_type = "/obj/item/ammo_box/magazine/uzim9mm" - burst_size = 2 - + burst_size = 2 + /obj/item/weapon/gun/projectile/automatic/l6_saw name = "\improper L6 SAW" desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation." @@ -125,7 +141,7 @@ can_suppress = 0 burst_size = 5 fire_delay = 3 - + /obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) cover_open = !cover_open user << "You [cover_open ? "open" : "close"] [src]'s cover." @@ -190,7 +206,7 @@ ..() empty_alarm() return - + /obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user, params) if(istype(A, /obj/item/ammo_casing)) if(istype(A, text2path(underbarrel.magazine.ammo_type))) @@ -258,4 +274,3 @@ can_suppress = 0 burst_size = 3 fire_delay = 1 - \ No newline at end of file diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 4a9c5d0b455..01917cb8ba0 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -167,6 +167,39 @@ materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAT_URANIUM = 1000) build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin +//WT550 Mags + +/datum/design/mag_oldsmg + name = "WT-550 Auto Gun Magazine (4.6×30mm)" + desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle" + id = "mag_oldsmg" + req_tech = list("combat" = 1, "materials" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000) + build_path = /obj/item/ammo_box/magazine/wt550m9 + category = list("Weapons") + +/datum/design/mag_oldsmg/ap_mag + name = "WT-550 Auto Gun Armour Piercing Magazine (4.6×30mm AP)" + desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" + id = "mag_oldsmg_ap" + materials = list(MAT_METAL = 6000, MAT_SILVER = 600) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtap + +/datum/design/mag_oldsmg/ic_mag + name = "WT-550 Auto Gun Incendiary Magazine (4.6×30mm IC)" + desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle" + id = "mag_oldsmg_ic" + materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtic + +/datum/design/mag_oldsmg/tx_mag + name = "WT-550 Auto Gun Urnaium Magazine (4.6×30mm TX)" + desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle" + id = "mag_oldsmg_tx" + materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wttx + /datum/design/rapidsyringe name = "Rapid Syringe Gun" desc = "A gun that fires many syringes." diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index add4c667b0b0994b11487470c298a6abc3e77173..5e43710ed5f84abf66c20e841007d7af100ee7d7 100644 GIT binary patch literal 19498 zcmc$`cUV+UyDhkzj6^|_pbY||A{mK7lR-fcQ8G4?QF4ymBtZm4Q9uM~f&xmCoM|#5 zIp-uGIp>bE`F-C#Gw06SnRDiO=9xd5-l_Mls$I2Kz3*B@^g~@ux(k;t002ODPfP6) z06-egKU5UpkvsfVo&Z3y6!6&COU>5P+QZS!%hA;Z0Q^$Fd>U|>6ulH#)M=o$wUx^y zP|-pz%{*f0xRurvLOtN7d~dQ?0WTc?^ZpeDxDVxEk~Nlygqk%xfXyNO{q7sZF?7Cg zn8ci>3J?9!*-jpdd2tCCkL0l~zIu<`ot1b~Mkp%oQBZouSw-%9sh-ObQD zFJE7L^)Qz`los5e(g!y#ogV==&<&lcXBVYl!$r!%H}lNcuch#0a$HO13FEky1ev%= z+xZq!TO;b}&&wJqY2j(a&NQ0VbtCuYC+2=*DRpZT<>lq7%gdx3kI#U8hmQ>0?={W< zaYt|?0o?F7-$({GO4hcW5TiE?*t~eM_QkmzufE;nvbW7i9kG$gQ!rW;EqVRh9rl|2x!G%AmLb|aeE{Ca`XaUIXZOE+2gUM`P!w-dPUq-%m z_}d@Vg`~c(KFXMhY6F8bAzhW@A^WZ?5E{;VQ`4SrIan^_bj=oAb=uO5Rf1A+>e})61ljU_j*GA z!B1 zk+#eZa~5xk>fVGlBUxs z>==zJOim-EI^??Nzeh?fY|48xP%?fW0sX~QM8zN+r;yEDXE)(lXtnw3J{zk8F^PQV zC9nLmn)xj^wX^2J(8@LZ&@BrEMLr}T@3I+*?;-L605@Q;TA-{X;t6XML0 z_&ptx=n%eN{0q82O_{21RtB^ge#I(1X<@&DV|oz@vN z+R%;JE+1`hVC0TqRQYKAYLkRfg^EYq5@1rH(r2RJ=80hBfA)XgiSOQ}-jH0>i!~NV z=fHo7V6>8=L$yf0u;(TUQiF$dA(ooqYBq7E5BJ5zhme~5XlJM$1uf}1p z>zJ;pA>yp;g1+YxhqAbeZFcWJC zVB2*I8}xV9wsE{|XOV!VCsXOvIn>Z{qq?qwh8WvdT7OP_**<&S>cgt8)}`r^Sl0TD zMLh$-U1k9J*)%joTISzfo`N9L zm#5KB6YDjvA#`_0#7oQ`bm6^f)mP~)nRwIz4BJ>?fnp_m_F1F;oGZph3!fVV`E<)j06p{cw>_cUWz^ zTs9A?PWBS~<`R&aqt~KPEhR9iO6C`&}4y{)@4r^STZ)Z1HAYr&| zMcC_RMPDO*0lNH81w5AJju9BLtDel3J)O zwx{{EoR}e82l9!&J6T@3;BGOKb~R=zKz)g~B=$H3g5Sd;_xn#65pvC`vPqV`soEqc zj@u#e-ULCk@h0p^BN^C_W1rLFW=il)tMbs=fZDs^wJH$qzyq^jf&k8;UyH9~dvRhS zu05#?!hRPd&ZN7C3g8QHqMh%pb(P4!O?n4iAhUndq{}uN7KGOBj5sK#CkRo<@_*-q`3_Oa>yfi%Cq6l-JJE{kgOA~Mr9nS`*M#! zu|J+&_4h}o8@@sh^FGfR`dg{{RIld1OzrKZo8il<3yvtB4%>Gq)d#dzt`)RZXkuF8e$<28y$#ahX?0H{;YsgLiu^zM}Uq zRxXf9Y4p4P4F|Cow3Zv~D|c?kZ3P7GNun3`T3>H^B(F)opnXj^#TgO_HW*Y|A|z;w zqq`=9@xYD*xgM;z5!oD(R%Et$X~TyWp_q0xY?t=9lf7T{;UE5i{9I=1BRW5RcKlr> zyyU9~s=Z%Yd=2!RidL?`d_9713p7)rXfACnzXPm`v=|j>h=3qs@O{vEhWn z1LOgW>BSp`v!ZB=S)B@)X}9S~KvLB}!z=3$0^_DsS&<={%=GpQ3Zv5zAe*g4!>=FP zKoY9|Pk9%wL`h7FyucdG6dm*scPV`4JErkBuLe&?2aaCSI6~(@<)Of?E0T;r6dB3> z2*Y{3^3y|#GG!rGu1^z21M+M5qeeh%XPp4YE1_(c@=enhxg{DeWeUpvFlp95Q$~u+ z?6c947N|gGZy)(I+}LKQh>p+{l=3@5{_9r-22s}M^w104UJow&{kty;;apYZ%loD0 zA2^1`J&*fK3fBhN2T{{sqg;?gChf=Jpx!R`6mw5hU z{p5sJ5e2Au_)^(*x#FT7S~M%*7uiG3X;H0OJL4iqiva06MwM5Y=T}ACp#Enk{=c~M zwQYu*O6+xvPL<4j6Z>}PJ@h2PN~n(Y22Z{DSLLA5`JGgTc`-F3>cOH4l(AkjxWxoy z2`XdODw~UpLPF3?lHm@wEHNX8%(ApH6uCPV=RgQNtjI6vv){I$h_%2eZliaU(wW3B zVAhfr;EJc3R#v=LdAL=hDZTub-7F=}%bZx9lv2z0w!CjZs?9~W{v2$j#6QP=NXXgg zWAmN1i8=Md5O5#wezs|3wd`3?H3ccU_{GjmK+pYfI zHs+h1DK{_!fg1=Z;6&|IrZ-u@X#gFQJfx8W+j#qfoyG6Yl&gB4MBk_K5d0lcKO=`s zgi3sJIn2`$iTJ5BULt8@dz#~Y2IwU<&+H-GPe#iLxHx%I$&Tg~3g9L0Z%EdM80roMWX{T-S!s{r`zf-_z zxDiD~e!s~usjT52`o>-1B8QsBzujLrM|?XbkM1J_u-03z-*h0EyX7%E*8$3`Q(F8w z=AP545F8laHw;>!L3Lib3GR3u(?9WYRk)aC8}2)ocRJEzL@H$e)1|HD z-a_0r9m6xM;0GP#ZrNO+-}p!Ed~#oG+Y~uF&G|bYmbx%36X14OM$}(iRd&u|KWya6 zTHF5;$j3xTtNyoTd814>?!8eCx0);{0OKY^V;gL!>d5F8jMNO zZ&Q=_qK&_}`?$k{oJj(oViw5wLbiLiYUqIV+lQG^;T6!5?XN!|%JHq{Oc#{u!^AgqfkVwX7H#w% z!F!H_dHe-5|Jtx%^{z_^A$v#<_Fk`9sBylq(V@3e>@sFe`ZronNwq(e5kCM|AB9&M zm(AE7=4}a#w#YX#Gqr!a+`67VR!$MT;{b4qp6ZAEbFK;C<0DD>eAxA>Vm}M4L@~v` zVhAx@WEBXdTDKYjz6i!lK3XLZPwzMX*LLD}+kR5(C(MipV$C(z=BXL_}S{EJ2v-}d|9PFTx<8Nx{4{p&KT z)7^zn(ymV}Cr1m+R28l5xCiuL_-O0|`F$-C8LqdD2j8@lDAJ;c>}xqF!qUM3H@gZ` zdg0zl=n8!l?-HdWd7r{b>L4N6b2b}AsKRfOJaA8IfWfDaL$rS@vx(1$57ffj#h%rlsf-5jM0}+X^9@xDMmA6(ftBXQTVXAlBH;;lgNfA_ zM%Vqv@W4CNO3~s@Ri~W^hgZ^eh0PiATfj4Lo^ehD;5Jh9^g!>0Eb|T3uTd;yQBONxnca4$U^ZVXGOvzDL=#AN zp4wHzss?jlipXy3kN|SOnY(7c4lirQ@mquj^y_deGNcJZ=hv9ryie_0H@B;_7Ct0E zxD;kc8*$qY>tF1EMWC7??z`yyvhQA}r(+lg(UYW$2uJkWJ*~8kDAZE`;AzEDf6!bC z&b`NritHTE9|b?%lpVHxPP1D@Ex0_r8RSSTy`%5L`Hg;%{LMym1U#+(1!^eQ8;<305Mh z0_4M<5uW+AeWU$_r-E-IXnj|0`)i*ad3-jZz+>amw$~OZyVod2(Go#tW`jrA{yU~x zyXBQ+rpPqmi+j(cxQJOO1nj#UfwEPWBDazx?7Q=?Q0uWCa>ALl3GWyz4IVP;Pa z)7aRiZzYORm`<(wn)=i4(#pEMtUjTT&{jgB|RJ73O27iI?zue z)uQ5v{Zy;u8rb;lB@B2Wm^!~L!?BQ4iuj=UfdwHaE*KC=+d%|Fj0F5mPevV?riHu! zSsSwVzZW|8V3;*M23Qd|TrYiHJf*}R=56auoX_tVU`9~&$+&uB4WwCzu3 zt>#g(V$r@VKVqk31$G7RPC5UhsDO#HIlJKLB4l19cY?>}Gx2jzJDh8K#MWIT=3AFh z#7BED+!4YT59y(G(7hNlHp<`bT|zribw+Q&q{rzy+vQs*!-1T)qEjM)grO1WNx9My z=cV2hX%SK9jnM)gRPi5*Xbnv14pVcW6HST0tfdZ5;NI0KCL=0giw2eMRIxiYlc5Z6 zjSZ;>&L5%cH~%pqfjkZQ$S8`wa%vdJgazZNy+cVtS{A78!fU)7=l%WIlV83^>=X+% z=K71uk(CO}0y}q7)Nk{!o1cw4NdX}pi%s1e2BFJ>5fcfF_`|NlC~)AH*P0vtSktpc zHd8irrylssSA%z?<`Wcco8t`Ah*#K)tg0~z6hzS}_lbG74=Y+2*gY$q5cSmcb~9P6 z9A|hrh7{crHqu)5ZCjasga_mO`&e5MBrndLJbe}~gTVQ5`JI%!JGrl|UF^MKs9gi= zIkeZSgUni+(FOyrd}H13G~ZHA-#Lvn;qt3wqAA)xsU32yhrTW%o(Dp;Gj9*}4^*?! z1P%IqnhWoeJ}|qR_c{@OUF7|E-1U^8amu_+^1!IBqrx(1na(Zs2u&DZj$S@P&fX-M z;}i(suQDx)&|qP+`mR2s@9ILNea(Q5{Of2Gj@ZCI48k*8QAB>BWS?faNh*Pd1*oXr zGci$#GbZ%{UvD`nlq21nTOdGjN~-sI zQWBpuALdmOu!~319{G>dZI)hLJk)Oebp-VUeuxsrpyzpx4D?>QkqU-%*H>Z9_z86+ zc51T5ZD1zrHVp(bVosF9zah2QldT+f&y8%?z!;48X=i)`Fzj8qe^j~)>e#=1`}T8c zEAQx}AeXEKpOPlno-ze1&G4TbNi0*lc2+=}VRInRf~k}v<82z{#z$Lf0oezq@RFb2 ziwCB`rOZCHSEN!N+~@z~gve99F@d`!gjDI~-Uc4K3E7#yIic*H+jqY42jH zBz9k|l^UQR7o{_Ff6_y(^MOIuyrgCU_2+jQel?W7{ctk*R9hK3Yz z9i&k$7d?)=z^;g~%Wv+X}$-A!Bk=RwI%y80ep0GxaDBP{Pqnz=8aFS!q1Zj z;F(PUzN_pZjuB6(Wx43bw|oH6@{Je-=0m5RR(`7_1$)m*_hrhDTYCJ5r1UmV?j8=g zCc+XA>blvZGGX;Neae4;Rre>&M=<*RuLivT5f}3*q@eNs#b;Bf6@E@Co=B#l8Sc@! z8e?;>lU&82l_!e!o%~6wNgGK`3(R?Bqa>P0;giClhwr0O<4@z&Q=!T_=>AjL zTM@}8$jrF_;-a3*r56p==B7Ut2}>I8ZRJw{aNHweIU$nzdG><&ag4Jg=P6$R;q0_0 zbD@>P9KSm?eO1d`&0DB{m*ySC+|I^_8aZv35G}Mf0g3Ny$^7cT1t@7yQDD1fDi>=4 zQzsXg2{9Q^ygx7LJF@0J{ke!IXxQ(q&{p+faE5%pa%Nflo9LlH6#Dp7pph*7t3&F? zM9ZJ(>nqYSK~^ciI1?Y@Y3+{qK#1o;MF*On4|KVoW4;YbHcLYn! z=bSiT0CsjPuGhtw?lm2F^DM07x{7Px8~l{(8ueJQKn28fb*JE}$;sPm6kq2|iRVv= zO>=|Tct=HI!#l`|YCABA^UDV!Y}W0uO~c;}ii5E}I-f)#%gf8-4Z(q^zRwr$|G>`8 z)#~_hn(iG7+V5_4#5oqt_$C95iQEvzxlf{c;oSKBZUY9#@(!4?Mb|xmKx$xvfg_g> zLU-kZtP(zz_(UYML4eaBMVT+UfRd4s(Y(LEzihVdm)CiPHLnrOGwW<6KxLJVGis~js#Bg_346*qVLa5Up0 zg114FA3f3qdw&Eq0vZS!x_60o?1yF>dKHWxXP7oOH^~4ho*b7)ZAk3;R9o@q#j4%k zD2nF3--+qlNh~VgS1SX~1ZoIb^o{>V8iDW0O8<*ShF08yc{AXJV4)w{Y4>j&QKW4= zv*iDAdd2?v-oX2;e%1bUu%o~=sQA|_0|*5m)#MW+I)EoH=)P~B7h;5omOjKXtd??3 zFBM&nd(C<^%&-E)Si>mGYlys+x%Fk&Va$rMDBtyXAu`)CvS3B{ynkR|t;uD~KqZq` zQqkLLeuuBboH$(4Fk@`H>k-bZ9{0wa=uT;=nl=4G;)fUa{gSf};BVuo*AEX5wbtTw ze35SaRNUE#=^Th;p{6FBVIMkn*>wpMcM}Nj$k2F8RbZ2Um6B!$lQkEF6zyaUD`_XQ zz49vaGb}AJJ(*zRL~W`-6i-6yZ_K?DemGH}Jb`#(77kw5+0V4;8Wc-trFNyR>M}Z+ zV*1%EA_3M${4e}?U%J^<3y7?wDA1^Ye%n;~5xx z=P1)hfBQfct^H=^h3Eyc%2u0*I42kn-6l1nd$*$&*MrYV8pZt)F^l!og{Vt8R!tvsD`Qk^ z-(GHLSj(BCMgFEpzlwN^xjvzOkMkB(h;_uFJ@;%P65)zhDH4?@^EE2EL6b~yy3dM?Mb&ScxqJUA(@W{YZ}$#=xqy!%XVfqZJ12*^cR*PU|M6sSQZ&VBi|fcv z+;b=D%c`JqAXagWG-r1I^5rm4kV|0=tIadI08}j}oG^~bBeYd$_+4`VG2a zhQ-5Y#8XN|CY{Ya( zmE*y6_o0#$mE-XOr)cNNx_hZ-*c12XnG%v9DAMu-aj>7w%;6YB?jH&_RH0k0QYrJE zel4UwBPW*;fx#F_d}?P(#AHVBE!u$qkmn-YGS}eUdcl@T)}Me@n3w?ai$eNDPHAol z9vKTpigxDI`(p+epXvG8Nd5u%LjJTt9t7)UH@2OD0yN zZa*h`4U#moxi z7?bG*#!WN`yUov$lB>4ou>MFzG>GHV+GWp^9BTZXFi?QKCL%xy);%&<0ADOoS4PQf zcM28%)k%6GhU`Mj(qP zNO4?K!G*Nh(ec9~oF+5KL+nYT?G~Ptz?z;v3Ku^mHe}IsC>AFDO{yon*=LZWV85zz z1O5h{Kf!Iq@j?4*NC_U#BOhdgjW&%yg@4-#?b_cE5(Sim@P=61B4id${|fnKE|m{C zx_fb*>Jv=bRT1~*88m%Pe;s$J_?)2D36?gMfK6rNt4RR%*?XU>1H7k3r*4#U9vIW~~vVGeB)-HmHZpZ}sN?q&4$CK>K#ujy6AfQ%rgY|Bo;upwZJuZ%+Oflw9U3;1mBtr(ytg zD*R!kIIUpj<~D2uuQbP+o{#|TuOwH2;rAF%zV%=8)+CvWIoWvBiyEz?EJ=4IrdBV!;Y}T)h)dwbKim+^=^`g(go>9 zx1=TzR*DNVNW;pI$0r+Vo(7L3Tq5to@OEd+^hzq-*JS{k$AlkP>U%~@Uw)}l@kD5~ zz5~;pR^+oj0(D!uHmIai{cnfND&yq$AB80+NVG*zGXp?J98~i~RL9_X@gu(SZk_{u zCZ7`|{^K*dWgQ4W`GY~r@ho>+fN$pC&Wisc2P}N+*LqZXr2eV~eVgK6@Z5|1pm6Sb z=q2Qug|N_MzjAvLX&y%g_3xrQ3qB4hG%`FU;Kz!@K$+2DUrwchl(ap`CzDhs;Xlk852@U%jZh1}` z{t-hqt`eE%YR|%?5ujm6J?3iY&>C$W%(MNmL9KN&zC%~`E9Sg-&#^=P*tm@w53xdPkg?{kmCepL0Je}kEiHKQq1?-X)6NBMSgDyJW#6<@$fyZp$` zz3*gT?3qs%4`zG8OA5hDATl60fSBkuH|ZXI`XB=vUi*<2y6#Tg(@^l^X+`yL2pa{vlh`z#Fcl+Z-iZ?FL=nO2mg(W#OR@9h4v2) zG8_p-EPtlMUc7iAF#~hmGapDBqk2C;+D9fJ-bY%u;;Sm3_A-syLdNgxO*TdV$E|6@ z&=s1vMl^M%njaxkOJex-TePRhb=p%Gsmh85CRU=mxi{}Slt{1mrT z?jhrTp%$-(3e6mx|W8iCGF)J9%?e zvjKx8)xaFeEB4b4eTp&1b_aOHN`_{E{>3%rxE#vfQTnROQv5OYk07arRbIV)GFElB8E2`WoMqX~~Li{tY~k(Xl|>Z+=wrefTUTV<${_Za<@(15 zU2+3Azi_A?HNJ3iQnR+^y?ps{|M0L)G!zi8b!Hz-AP@Q+o)+me|Lfs!{fcr=t#dB6 zs>=)MT+eV6Rr}CrQFX>0y8hM|g?$lExlLoZjb+=NpPpgt39#tF<{h`AlW3S5C1 z`1%IY-WGpO5B@Vf^naqEy`?$Z67Idj-a z#D~7V#N5gAJN@}W1jp{_ZxO>d2vcUu{Sbm1x`9yXZT`+9!Ai?CuxcAo*I*z%fHUnoR1-AWs zqLz~?^k?*_cv`tAoFFd27p(@aS(~-jL zV7pBhwS_%?)Swtu;uFNIJ0kcx)(mnCN_01+f$*JzB`-OBW4~=yX2Xb(bwqs7ZDP_g z{upq=9cTL{+MyHDQIVF*nPFklU{@3gM#@vIyyQ~L-`12K&Pg10gXSOwUF#gI7yXN zRFDAEF246)TDFE;9^S`)SwB%xnIFGNnW}3)?+MoX&T`{B0xpJCAu|HSC!M1UazMWx zI>BkW>Y~6wUrQ(MVAs)~qb?z79&08Q4cnZvzHf1f3sGHN%`WA{e)lS<@kG*bMov$g zFD)%`OGuRVu|F#r+|f^euVVSw{TVme6?#g*pXc$T13ObJ^FN55s97=Rbi6siyq^vx z(UKJcrA&2GmAayt-R?+o*J4noYjo0%@WRi|0eM|^rA=#I&5L`7)XFJ6b`=c_oYx=R zrbV%8<0UNFR!86Ty*Te&JCD&()d_4_AOQhxn;&_1lR+JCsD_mH>}dN}4x*MMi;Lco zpdJ&lG75Mv(+I86*E`MHTIB|ET@YiUxxb?ldZX=K;awYVQU#$#I!+f#@zR0iEe#Eq zm<7U|FzdCIAZ}h}M#aVziW-HV-6$Qk%TXC{A@nCjI^Z45gRf3qbq_Bj*lMoj`XYVuc+4i_ku=!Enyg>5_bJ$Uj?yxkrmee+ak$Vaa5roc#Vz*Ole!w+7SGdP4UjIq! zvvlo&yLb8vzMmprI$BDvwWlg+RZbUV=+KjMQ{GF@yJI&kM40dTMIlPI>kTLfD;)wB z3ZgU6=-=|(Ka7k>Mn(wKdC%@GGdGOEd^U{*%MJxV6a-%e)m<36{VfVXgbQ6cC>bnr zG@TD&n>U~L_VLLqEtRmj3@rWqd+d1S`shHg zu@R3<2O}}Cs~VuaNkr!ufd0tFtn!81&&9G>PQ_crk zA;uB>kFv)25!X8;A%72ex>j0V9v!(+U);}%t0Y9r-TELF@p#|<>_Wc{7O-_5Ykcp| z$Xmyjm0n6RW6Byy6$;YB?%7>Nl3#sWVvp#6)$RR-O%phJCuQrzU<;m|KrjkrosWEu z6fGflNJb9+Q3nD9t&D2FA(RTvZAgqHU%q_dDY%RG|617J+pA0UZ1WkQ3LM(lS=F_K z(x=ePaB%SKbeItj1Fr=kS1E(ebMjZ?C_!zS5dag+q)nEioqv8{vld$3ShpQ6=X~7) zQ|c*go3f?qPoA(G@618PgEz;E6H{NM>Ja8xjgU@!7v8z;COz(&X36c zu5%?+Jq+QE%hCHXT2ouQ;8Qy=F~K3TW}ykY_!NCDwtEzw-x^$%wkakyf>*m*(lHMx zVRuD=dED%tbY4gLs!RxPZoQ_^o$V{HLp0 zjmUw~l9H0f1G)`qV-M`LCwMTAW5rt-Zh7rukmak6MP)E)zv&~t=@XbP->>rz9YoW$ zfTq%OFu`1WAA%O_|6MEs1_z8PnJv2jS+6(c?;od6&Uu4_%YX#5l~LXEq2(k6y%8#p zsQ;I?>;K2h(Eo*1`+xq;J?iUv$+v|YmaJy$#baCQvIKbCt?vUqNVlY6sI5it6};nW z->+Yd-M^EqdZ%Ua2=q@GMk$@o#y7f%FX*g3hp;LtSd1adeib6YtUYDs9EC&{zPaPR z1~u?=`ER7oiI-1i$4bkUslxw2J#C$rS7P<+U4W{kcZ?rt?bJ%(QSox4Eei>b=R^}NF7 zCq}AHNasM5rB=i_`~lq34%nT|%~lECK(~<*+ia|W?&lkCgM)NPL&#~^UKMRllH+9o z?NOp2GLV0sffzfnfh5>^s%P}Q$>3;wut@WMY$%kbB!t$LCKX&=QiF_kJYoP|73o}L zSAhKLB#!_hX(6VZp``*4Bj)KjJevW2;ea^sOLM?@rM=+v^~W=0|CzPqX!TxcT|#yr z@muN2YwbM67y-mt1O?zb>zy-RNraA9u3UM5oC~ht7!xrG-2lCnUVg&%aH@<94{J@8#=D z3jF^4d;Tck{rmT!uU}sPVbp4+_se*tD^yfg0e8UG&6cLa0L*K`Fc$%28x6n!!?{gj z!>Q?;3JZlVUAhE{&ZIaVN#cGNov*Z{q~&y#JA}uJP6`FheslE79oFC zpC(btzb#uh$dbHdgB7)UMMJkLRZf5aUNs?!6iP!O-M1SzD5keUYDrhO#b%(2MEe&h z5MZ&__kJ>w0k(@38^oRM6c)9W%{2@KpG~pF?4QiGG~AndFYR^X_wOz;Apdz#PGCo- zh)v>K&L|qqxX7-x*3mgU{RV-dwT4Q8uc`I%pj_=0V7~WP2t`DYr>eFmse2Dic~)ceka!1P@}Wf`S4N@tS39WTBpr;qh@Qz|U(^^6uae>0yJ^=lQcSNjhGQ*ww|3g_h7UjYSVIEtsGx2zk7i zkZ82~1aS35JFjC-YA%OjW*odLNMy!H)BAE*Hed!D%89GW&$1iyRYLDRXwh_jy0jcH zu)vf(27?C5iGBaZ3Z}Noc$6v`c6}Nbjx(>w{*s;m+iD7Tt1OVe2PyJa_h5wx70`1O z>Bi-=n;1r3PN9i$Qq%3OG9WrY;bcysw> zc6PSXw}%!M=P@IYG4uHQ_FS#Kt7RXti4sbyGu9QqP0$MRI^=c!J$&;I7(S5$v>bnk z%InGnXsP(vpIcXeX8Z}4V(bWT^-dG)ht0>_qP#JH8~Lc=bjyi&IKwPpHGD6ra|4+M zg!l&5TAmMPb6AfCf?zVA)aF+G`~jROY||3%qI2nLP|#>pg%pEuk7riaNYvX{CxZ(wo^&w+q-WG2Ac%9aK>qf?O?ZBuHR*=e1zO6oYZCS%(2Zpio z-Q^ROMFr};?|9frl)QYJT`IG(vPe~^{5Uz?t9%2mus_2sw!q?8?1Eg&;&u=xwTC&? z$o-|xi&r)vJb>c?de-Wsi1+ldF_BckW()?hpei`3pmjnqc|_`G)N@*I?!>X{$(H|4mj-!O4fij7t1Fxm8Xqs536O4U+)(wKW%iz307g z`*tG%A9x3h*H8!*3f^y~Ay1x^wjQnxK>*FST*~@;4==GWw7uum1c0F&J?U~#M!~EZ zjp+@>eWX?jUPPYED6mTtniY5AIFUTF!M<^hurNzvVjRPXKeDSMO6Z^~jp)88qNcCG z_E&bc)cHv4^h)dBD z>_T$xw#t;kUC&i@eRGz(VAHNg`$@7y0ln0wTq|fpRsTzPz36Sxo?Aq^57|e1ph8!W zMs$my$e>o+bh%Tr9m6s~u(_dHM(B1>^jh1j{xkTa?@u&bF$2>0#dqfB@fMNtc*|dN zXwJ91{7)Vne+!sz3?+3VKm|l^^$teqKe?l=gYtCQ(VH7TLI<#~?(`%}aK3y(-kiG^ z@=p^{A~qKYLQrTsUC4Jrb8}cD!`*4Pv9Tovx6$QST)=F75a@Ov$SRR=Cm9tcY9R!Z zkbLNbE@BMLRR5?L8RZM78^VW86E0i(aZ8mRXPWydOWhS?72Y^)R%SI=VMv(7Wj`ukLz_*?>nOt>X#)lRB5+ihL zuCA{)$Mb_LVx%Xb5AZvRQ?VOKx0~L@(sF(O9(tg>_}kKsKs!m|^_=nOs66*{i`nft zW7M5jeTsWzCF13c8zX^pO|ff3`i~xk{rGW9C+#i=_IRsBF1&^+?1W(YxsPPmh+vST z+mMO)*hyX+i(VQN8!8g9j$@En>TRx55wTkdP@OHc0&8hj zjpIG@&Nn8U6gahirK$HjTaXw(8SZ>{0v>yhGdypqE4=s^#lYy(%|pj)yu55FD7ktB~cCwsge%qyPO{3Tq>$7y^m62bk^D!YQ`U$jQ zNWpfH?<2^BKPF1u7j_rMF|~6XkBD=`?ItBcU8uw#PWiM;@;;kNhS{us_3JIC2loA} zmO_A;kJMGD1f6`2o~E;f#eDsgYYla|x3`0%BSaC$$iik3K}t!Vo}LZ>yE)O!5Uv>H zcA$H8s)M51M=kz3#{F0Xt=W{T z@8(}G)_3L-?UN_RD z(h11p3>4YEeLL~Qd3barBR7`{*v*?ABTCqrPM=9Q08e4=*IvKYO#fDWk?6Mr&I`Jh zRrK{QK7amPMe#-D)WE<%XibeAI0gH&+tES05!QdQ`ucTL^Fpq=gqgnl zS{r?seI|JI-vbdA55tw(ogOVC2gn#)>PM;VR~T_eJwYIZosZLhPHTv{?(;1iN&&#^ z7S~+RGswii+9l_Xh%oPm+&s zr_tSo66^OO>B8i=%1s?_s)1GK!pyfc9u5u;@Sx-mo1#KR-DIBA(ac#AS(Jxb@ByNq z*BIz)+|XBJ?J!5n#D{?ww}(stx>MU)WL)>}WoW1C^1pC~w6Q8)7-y>qSx=FGoZg-z zfW8P<;sT;Hk+>bFNPkvneesrI>3Rbp$PnYZRrL0`$yMrGEnnc(ZSTZCeSzKd_PR0;zdWy09-Mj z-;fI|SL@|J&mlgQmApt}$6r~s^)ss_bXxlE?^ky+!eAVJX9Ftkr>(cX9|#VK1kT#> z2I6-LpWX~U6Hw)_;R(c(MiVI(pF>C*SBlWLmX4rl;IQ^kvq=}dDI%f?&bSM!|9);P zGlBUNk zM50LG$QThys8_la+;-jhjI@4ZJ_u>jfLoN({{0hl-;w~VxT&f}NtQ8~W%mxO5ZH8) zk8u`p*^%hcdi^>^4YU%V)<#A~Zit95)VVx=-n_feGB7-RX}|jS@B5G0jAHy$wLozg zT(d`Y*VU0(X)ZJS&bf~vbq7vw7zG8)ed7!Q&j#4kz$GumwE^FL){s03#v{)*%wV)F&$E14YO7zCI`*Y;!$%99~(=iyz-mQpV#;il_u&mBi|MPVZgJZRC^Fc={ zXfx(se-CpFnfV4!0HlrB_q#)jEh@0OgWDpbV8-4?-x zNn%QQ@2`lTAG-FzX8rA(q$-kr&kFMLz@>lYtnpOtZy@L0`8&PHOARU>wR`_sHWvZW z`u}2wZ+QZfIq6&e5tKpm>ha&i-DfVQy|b|d7eJE$1m;G=%}c<~!vF_EEM$JhLSE<~ z@*n-v1IOp?r|B0T-wiGt))BhG;kV@jnk8bQjzNM4zWxan?Wb70Et@dN56cKcd2}FadU2eubJ$F;TMliuZv-!=a zS^OpQy{eh3Uf$jr6$Rl4%+RD>Y`9P(nK5$1>f9X8rJm58cBvs|g^P?2ScxSfDX1(=_9?j&^HTwGcq5m-l6ItJh zs|A;(DCll2Yr+}9rQ#n4nTpXkCR3WQgapI&ZwJfJO7cW>Y+}{bI?!o4-vx8|FnZz0 z7v|kLxcKMw1uySTFyKIr;0+6idY>cbt7f8N6c<~5{uz=9SmFz4eV7WHrUY_bHzFQ* zkplZ3C7`tG!kOT;h6aSJ`$)RHB5TUI#puWWf(KUg_FSaIk>WJMU+lA) zJOp@CAoTBPkQL$lm4i0U@A!o|Y3i}!TlpPU&uj(LUBA_~-0~hw--!S*YG@z$EJfe| zD?}sYoi~YBhv9+#g~6Zb8uH^0!aAS-P`nG(sbvP<8JW@lJKDe6G832=M}OL2LSTcf zs;tuM+RrhJ>?q&6cSlYRr#b)k?_Ui(o*G552R4V}hU=4q0CB=^Vlv;2@Bo*_IsDP) zhp~HGgwKlpB_)W7E_lVxvvB1 zT6c%CX?1rHrbh9@3(21cnxc}nlIn3-Ys|jEqYdi`LKI;mBNu;{F6=8A*ek#VDA}k_ zq@d=<_k#g6@z#j>;gKNufMsI$Ivqj;A!8H-@m)H@};@d)Q#eP_J58390^nrX0sezo&-4p`Mc1aftM&B_|4-=@i|Gjc|9L?v z2ROa?x_i$W_Rd~lCKl(B2M+T5|N8OE{;*HSUYjuh=LMI=f4x7yZgQ0DUop?u{~w9G z=~KOUXt4vQqGos9^lx)yq>GAjZWL|{DC+dknpnUvZ{=#^MKXoP^^Msd_%Hg`&-#@L z+`Rw0u~^Z=V~vVTgZQ*55`ld?Dzn4w{(jMZJ^kfSD zbZdm`+qb4T+M*CIv#vo=-eJqwfFzd zf8}3-c%3@zF5k^F*V5JwjE&Kanic(s>uJRwtFYgPH=bIb+4)~$K_9eo6QxU zcyG@?xY<80-Rt}F1l{&okE9rXXy2Xi($uv1pZ?#IkAVv>>@%|_-TLadKL!|pA3Wav z3cjmf{rB`Y=4Yk#Zq0&IZT^1xTPV*`eDK3Vw;zw&fa_TQ2Tu5M+UeV`?YHtvzpDo_ z%Ynkn@}6}`hx-1>EuKHK8-e@RrB8ct^40(7lN1O zh5fks*YiwM?1GjFQ=0D1KcZ2g8}RF8KXV-Sm8kmY+dJ2#mDLL^?yzP!FK>3{M9~HR zdas}H)uzs?fQyh$e<&|KY5BBqi9TqV)e@06|5V&21~88#|Ze`aq4C zK%slQPG)aT0QZth+O#mp%1u3v2PpI?9YznQDq zD^C(|T5=(uK}=M<6F4Jq;I(r*-`BtCzRd!)`wzS=TfAwL5HQIUwofps1GU*a5)UxQ zypTVA`gCA$a5Hd}jcu8!i3!WH*D68|UOyy(ryeM^GVXR@Pg>C6vE_B3CUAuX(0qY% w2BBuq0=5p33Mm$#OR*gdgg)OyjIv4p*_r%L>MKpp;$Z*+Pgg&ebxsLQ0Jcy_%K!iX literal 18874 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 delta 16765 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 A00000 From 7830cd215bfe19b9f7ffcdb5c01f07da617733a6 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 3 Jan 2016 04:03:48 -0500 Subject: [PATCH 02/23] shotgun --- code/datums/supplypacks.dm | 6 ++--- code/game/gamemodes/wizard/rightandwrong.dm | 2 +- code/game/machinery/vending.dm | 2 +- .../game/objects/effects/spawners/lootdrop.dm | 2 +- .../projectiles/ammunition/magazines.dm | 2 +- .../projectiles/guns/projectile/shotgun.dm | 26 +++++++++++++------ 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 54558f0b654..23f4dbbf7c8 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -301,9 +301,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /datum/supply_packs/security/armory/ballistic name = "Combat Shotguns Crate" - contains = list(/obj/item/weapon/gun/projectile/shotgun/combat, - /obj/item/weapon/gun/projectile/shotgun/combat, - /obj/item/weapon/gun/projectile/shotgun/combat, + contains = list(/obj/item/weapon/gun/projectile/shotgun/automatic/combat, + /obj/item/weapon/gun/projectile/shotgun/automatic/combat, + /obj/item/weapon/gun/projectile/shotgun/automatic/combat, /obj/item/weapon/storage/belt/bandolier, /obj/item/weapon/storage/belt/bandolier, /obj/item/weapon/storage/belt/bandolier) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index a417c839a7e..d0c6f059f26 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -45,7 +45,7 @@ if("shotgun") new /obj/item/weapon/gun/projectile/shotgun/(get_turf(H)) if("combatshotgun") - new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H)) + new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H)) if("bulldog") new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) if("arg") diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 0a87b6c61fd..0a1e3a1c1b5 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -853,7 +853,7 @@ vend_reply = "Remember the name: Liberation Station!" products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2, /obj/item/weapon/gun/projectile/automatic/pistol/m2411 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2, - /obj/item/weapon/gun/projectile/shotgun/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1, + /obj/item/weapon/gun/projectile/shotgun/automatic/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1, /obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2) premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2) contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 4301da8c5a2..a916172118a 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -24,7 +24,7 @@ loot = list( /obj/item/weapon/gun/projectile/automatic/pistol = 8, - /obj/item/weapon/gun/projectile/shotgun/combat = 5, + /obj/item/weapon/gun/projectile/shotgun/automatic/combat = 5, /obj/item/weapon/gun/projectile/revolver/mateba, /obj/item/weapon/gun/projectile/automatic/pistol/deagle ) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 4fb8564cb57..e72a2519230 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -49,7 +49,7 @@ desc = "Oh god, this shouldn't be here" ammo_type = "/obj/item/ammo_casing/shotgun/buckshot" caliber = "shotgun" - max_ammo = 8 + max_ammo = 6 multiload = 0 /obj/item/ammo_box/magazine/internal/cylinder/dualshot diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 7c001f0203b..9a85987c442 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -76,13 +76,9 @@ // COMBAT SHOTGUN // -/obj/item/weapon/gun/projectile/shotgun/combat - name = "combat shotgun" - desc = "A traditional shotgun with tactical furniture and an eight-shell capacity underneath." - icon_state = "cshotgun" - origin_tech = "combat=5;materials=2" - mag_type = "/obj/item/ammo_box/magazine/internal/shotcom" - w_class = 5 +/obj/item/weapon/gun/projectile/shotgun/combat/New() //freaking map freezes + new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(src)) + qdel(src) // RIOT SHOTGUN // @@ -237,7 +233,7 @@ return else sawn_state = SAWN_INTACT - + /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog name = "\improper 'Bulldog' Shotgun" desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines." @@ -273,3 +269,17 @@ ..() empty_alarm() return + +/obj/item/weapon/gun/projectile/shotgun/automatic/Fire(mob/living/user as mob|obj) + ..() + pump(user) + +// COMBAT SHOTGUN // + +/obj/item/weapon/gun/projectile/shotgun/automatic/combat + name = "combat shotgun" + desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath." + icon_state = "cshotgun" + origin_tech = "combat=5;materials=2" + mag_type = "/obj/item/ammo_box/magazine/internal/shotcom" + w_class = 5 \ No newline at end of file From 97527dddc6be59d2094a632cd8a9698a22367588 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 3 Jan 2016 20:34:40 -0500 Subject: [PATCH 03/23] tweak --- code/modules/projectiles/guns/projectile/automatic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 69ea9084a26..2c3760e2d11 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -104,7 +104,7 @@ /obj/item/weapon/gun/projectile/automatic/wt550 name = "security auto rifle" - desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Automatic Rifle." + desc = "An outdated personal defense weapon utilized by law enforcement. The WT-550 Automatic Rifle fires 4.6x30mm rounds." icon_state = "wt550" item_state = "arg" mag_type = "/obj/item/ammo_box/magazine/wt550m9" From e9d5c67371b92bb51c11d9f76ae33a7817c69021 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 3 Jan 2016 21:02:48 -0500 Subject: [PATCH 04/23] securer crates --- code/game/objects/structures/crates_lockers/crates.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 7e37c7a8988..df48bf96d7c 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -234,6 +234,7 @@ var/emag = "securecrateemag" var/broken = 0 var/locked = 1 + health = 1000 /obj/structure/closet/crate/secure/update_icon() ..() From 44d46bc4568ad56239c85fa195913f2dc640748f Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 3 Jan 2016 22:42:59 -0500 Subject: [PATCH 05/23] map fix --- _maps/map_files/cyberiad/z2.dmm | 4 ++-- code/modules/projectiles/guns/projectile/shotgun.dm | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index f92570d1ce3..b304b87d7c0 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -152,6 +152,7 @@ "cV" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "cW" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary) "cX" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) +"cY" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space) "db" = (/turf/simulated/floor/holofloor{tag = "icon-carpet2-0 (EAST)"; icon_state = "carpet2-0"; dir = 4},/area/holodeck/source_theatre) "do" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/prison/solitary) "dp" = (/turf/unsimulated/floor{icon_state = "floorgrime"},/area/prison/solitary) @@ -550,7 +551,6 @@ "rP" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) "rQ" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/shuttle/gamma/space) "rR" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchenknife/combat,/obj/item/weapon/kitchenknife/combat,/obj/item/weapon/kitchenknife/combat,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) -"rS" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/ammo_box/shotgun/buck,/obj/item/weapon/gun/projectile/shotgun/combat,/obj/item/weapon/gun/projectile/shotgun/combat,/obj/item/weapon/gun/projectile/shotgun/combat,/turf/simulated/floor/engine,/area/shuttle/gamma/space) "rT" = (/obj/structure/closet/secure_closet/guncabinet,/obj/machinery/camera/motion{c_tag = "Gamma Armory Entrance"; network = list("SS13")},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/turf/simulated/floor/engine,/area/shuttle/gamma/space) "rU" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space) "rV" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/turf/simulated/floor/engine,/area/shuttle/gamma/space) @@ -1297,7 +1297,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaq aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNbZbZbZbZbZbZrPrQrRbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNbZrSrTrUrVrWrXrXrXbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNbZcYrTrUrVrWrXrXrXbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNbZrXrXrXrXrXrXrYrZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNbZsasbsbsbscsdsesbbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNsfsgsgsgsgsashsisjbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 9a85987c442..f69b903b3be 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -74,12 +74,6 @@ if (chambered) user << "A [chambered.BB ? "live" : "spent"] one is in the chamber." -// COMBAT SHOTGUN // - -/obj/item/weapon/gun/projectile/shotgun/combat/New() //freaking map freezes - new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(src)) - qdel(src) - // RIOT SHOTGUN // /obj/item/weapon/gun/projectile/shotgun/riot //for spawn in the armory From 59a3a5281e7a5e8d55be57662bc80a0b8d418a9e Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Jan 2016 02:10:47 -0500 Subject: [PATCH 06/23] Vox Tail and Vulp Markings --- .../living/carbon/human/species/station.dm | 5 +++++ .../mob/new_player/sprite_accessories.dm | 12 ++++++++++++ icons/effects/species.dmi | Bin 21764 -> 28317 bytes icons/mob/human_face.dmi | Bin 78896 -> 79068 bytes icons/mob/human_races/r_def_vox.dmi | Bin 5334 -> 2042 bytes icons/mob/human_races/r_vox.dmi | Bin 5334 -> 2042 bytes 6 files changed, 17 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 056425a0966..be020e8dd67 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -173,6 +173,7 @@ default_language = "Galactic Common" language = "Vox-pidgin" + tail = "voxtail" speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. @@ -199,12 +200,16 @@ flags = NO_SCAN | IS_WHITELISTED clothing_flags = HAS_SOCKS dietflags = DIET_OMNI + bodyflags = HAS_TAIL | TAIL_WAGGING blood_color = "#2299FC" flesh_color = "#808D11" reagent_tag = PROCESS_ORG +/datum/species/vox/handle_death(var/mob/living/carbon/human/H) + H.stop_tail_wagging(1) + /datum/species/vox/makeName(var/gender,var/mob/living/carbon/human/H=null) var/sounds = rand(2,8) var/i = 0 diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 3043d929555..1a411b55d70 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -937,6 +937,12 @@ species_allowed = list("Vulpkanin") gender = NEUTER + vulp_vulpine_fluff + name = "Vulpine and Earfluff" + icon_state = "vulp_facial_vulpine_fluff" + species_allowed = list("Vulpkanin") + gender = NEUTER + vulp_mask name = "Mask" icon_state = "vulp_facial_mask" @@ -1589,6 +1595,12 @@ icon_state = "vulp_facial_vulpine" species_allowed = list("Vulpkanin") +/datum/sprite_accessory/head_accessory/vulp_vulpine_fluff + icon = 'icons/mob/human_face.dmi' + name = "Vulpine and Earfluff" + icon_state = "vulp_facial_vulpine_fluff" + species_allowed = list("Vulpkanin") + /datum/sprite_accessory/head_accessory/vulp_mask icon = 'icons/mob/human_face.dmi' name = "Mask" diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi index 5db54c968858e9b524e8e913f66732a76ebb21e1..e339fbbdce173c45b710dad5d7b80d752c42aff7 100644 GIT binary patch literal 28317 zcmd42byQSg_clB<(nyz-h%}0TNJ~mfcbBxZ)F1+ifPhLj(%oH>(j^^3cgGOJaNdK@ z^Ly9#{rRo+u5Z0-!JIiU=iIUPwfA-1`-G{f$l>Eq<3Jz~{5SH_>JSLZ^8G(HCV0gE zZ)+^LBjBT{>n?5OX5sqI#r>VL69nR&68lrxse_j&Wcq|nwp>O_{%sL=WkFCO=Q7S% zej?E)3yt}(%)BGiEH%x-3Tvw!U+2whXM&@>C|BI>Tv9YW*2qv=ZPfz#pkjYqArTv< zcW(~$p?WW)(ilEd%@M@9$I2D33zEFyD)~gK&Ge4bbDiPyMliItQuz5SrlZ7@qIJQ! zM!T%h!kyUFQ#x2Tg2Ib` z7X8;Zbv|EA-_0!6@gA)j{-k=KTV@O%Bs9?!JGG5pM<(&QfN*PN}J_N z=CQdBF}UW+|m!OI-WVPgDThOz8< z?t9A@0wsjf2k%R)9T=o(j9xweh5xOU_g6dO%XY-eDv7_JFF&$mWlDPg@kz&`H!#7P z&%aXWCB|1Uf%LgNc(Pca>6PQEIvD`u-=yxp5{mu1vF}!J<3Cjx+n5vJdju0|JGwh) z84;Ts9VMa+HKPozph%yQcmNGSU|;b| zQGOU(iQZuNhDNwC+wYNfEj{G?vk}~?`U|0cw)^$Ej4oa$uhLS2mA5BPkX?LeRxh1# za1Et0qgZ7z)L33mH}GtI0{F|LKQDFFR@&AJXE_Qv?k+Q7ebP&E)gw+=-2MuEAq@GD*l^6W=-EQSyP2;Y+EpKv%6h0td6a|}&Yi<{GeT<@Cuj0q z7)fWH=d>_TGPwC}4Jb||A+~c`Ie%LXzkTA_C(BIz7#q7xQjisrj`5OE?0sjfxj@Ai zwR+56sQ9M)dso-nOAG7}d){Q-E>@@d@ftdeP_t&VuylF}vcM3kkBu3*;^fxog^(*0 z7N)23gc$sP(I@olqKVs+GD6kVG_2FN8}j798OtC3B96pAz*`2p1$`?Z%F&+QbfEtp zQFmwTcUWuhNKD-y*ycHaETx-6&T(DZr=alRS&(62`gVsdP9CG^ilqk8ODL*!o<~TS z%bNPgW(Y9{4CHAXqs*9QVpAWmKF`91lVtCzpa0+WAGR^w%=9=6rwp{_Oj z2USH$*j3<%OmS8A^7L>SHr)7mivW?D9%!P*_z-1BOr!c;%TutkU#z=wDsl*H@;1+> z*|7!wW;9OuUKZyQYB3WX@8h9$@^Y{2|9Rf}L(kIvz_cvk-Q|jhFxn^t8v+%pjc7R0 zobqx#(6tId=9Vgnlun*2T}7-2YtIR)a~T22s4fCOP

!agA8DgAW*;QO^tK5!LB) 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 E0MnmSZ2$lO literal 21764 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 z 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 diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 34f7669cc857d987746050d8c735b55ba081089f..ffecceda82e351b6fc7e920597c14640c1e9d9b3 100644 GIT binary patch delta 14855 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 delta 14775 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 literal 5334 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 diff --git a/icons/mob/human_races/r_vox.dmi b/icons/mob/human_races/r_vox.dmi index 5bf9cd8acce13d8508fdfe522a2d335ab68fd2e7..a839aefb4d972139aabed9c4abdc1c168f1ef3f0 100644 GIT binary patch delta 1846 zcmZ8ic{J1u8~)9V8S^p7lDJ}`WVu3RsqB3u5o1Y;#E^X%B}>t7vZRa*L)TG4lC6@h zhFnZB3EgX%W^Bboqby_6Y;KvE%lDo0oqN9LpZAaVeV_B5_kGU$FbsYu6sTW-0RRyF z#Ls6lIAPp;oG28E9~KpVRUs@v9)DXA8!PuLf1hh=;SSNyq#&)~r;fR}J;5I8S3=O6 z9ou)numDg50G|4QhK7c<7U1qHyUDQRDiCd^A&Fk@-hlnWMB%Pp5b@B((ZMIBjC~)H zykvyBp-~yLkNuv#Dv{7le1x&?N_F(>{lc{XPN@`9yG>=PZF!U7e;Af2W!e3kgulGO zdUEz=0>MYg{eax~tmmwim{$c2y?@Eq&6ZwOT~y~U%Xgj@26SQfv{;;$s78&Wqjz;} z1pELWjw}3!jZ$>9+T+EgMFR4CQ+3hY9k-;0^W7;KXok_%9v!(^9 zb@@ldcU=2(r9XjJh0?UanDo9`I`>T+0O4d34C`R+7e!@OO;86LneZdbJHMSI-jv<20*~SuHSJO7Oa-z* z*&Bh}NVcqI&e}0Hr$*omXjFb9FQ))oLIME1j2lL%Y-<1z=uB5_3a&}U~XeooLF2fIE|b) zkwsmjYwF~}_kw&)9Vg2Y&%F#^?H*2Hs(*4$-kdRwpNzbtZcilF_5^>r7y07?-sMb` zduT~f63w{8KLRKv{RH3pDBNTi=x0t|w&HVQ1al;lua6K-0=O#129GuCuKJig8|z0; zOHwm;xm>eeF82yZI*lVnGGHg zRC`1Rd8uKgXBdohO{?hDbxn8CSAM|F__J~@rfvMX zS30`__wB5LXZ^zH(>qSJyy=wZZ&6M>`$b;rFf1_@R$auP>b2*^Z%3jordV zHMut+sJZ7jtUq4Zkh(^GYG1j4rLl?KlkFM*5ES0rOw=~fur76L9RWJ?^nUfXpbV}{ z?O2oRJ~0}n7}+6uJj+yk^Lh8%%mwIj+6qy6242A&7z?>;n11{ZSz9npYp4$>A_)#uZsmlHkiHn z8@GTra;&C;#Vp6QQLbu}UAOlLk<*4ZXEZDtjWojj(#5`JX6f;H--}aYdiJk+pO7TJ zX^XjTD1KYx?YPw9g3^Ru>Z29lp8v_Q&& z^&(%0nlm+*^^+1}00rnIbrODD9X5olOwz>5;XocR35>$}*sP7$A$4?d8{-mLwX%?FG{UY-t! z`DLJPJg*Kxo)v%32`tx*%}M0^I4}L^Rx8WcD|6a14H+i7lAt8;j?zn>kKwF9l64Ua z!_L^2JzWbyOA8dO%AHx$ao~;s&kb>8vB18TnK|A_rjJPY283CYehFu91(7|=yV}Eg zD-QQ+Dcv@`(D;n(a(j{o=HbqQ8uYEq0)tRw&r5CHz#ugNfN;J)&9RmO{40!I9#0E9UG4ZW&91zg=~fZ literal 5334 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 From a7d1bcce4ec838df3f9083ecef83c06fb66b7fc1 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Jan 2016 16:42:53 -0500 Subject: [PATCH 07/23] Restores a Few Object Verbs --- code/game/objects/items/devices/PDA/PDA.dm | 4 ++-- code/game/objects/structures/stool_bed_chair_nest/chairs.dm | 2 +- code/game/objects/structures/window.dm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 85a664ad9fd..a9e94d6077b 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -955,7 +955,7 @@ var/global/list/obj/item/device/pda/PDAs = list() if(!silent) O.show_message(text("\icon[src] *[ttone]*")) /obj/item/device/pda/verb/verb_remove_id() - set category = null + set category = "Object" set name = "Remove id" set src in usr @@ -972,7 +972,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/verb/verb_remove_pen() - set category = null + set category = "Object" set name = "Remove pen" set src in usr diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 53abfd17216..2b5b1bd3ecb 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -49,7 +49,7 @@ /obj/structure/stool/bed/chair/verb/rotate() set name = "Rotate Chair" - set category = null + set category = "Object" set src in oview(1) if(config.ghost_interaction) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2e38ae54079..edb48070d39 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -273,7 +273,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/structure/window/verb/rotate() set name = "Rotate Window Counter-Clockwise" - set category = null + set category = "Object" set src in oview(1) if(anchored) @@ -289,7 +289,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f /obj/structure/window/verb/revrotate() set name = "Rotate Window Clockwise" - set category = null + set category = "Object" set src in oview(1) if(anchored) From b69eb0a40856b0a5f2b79991e0066b74d2efcf8e Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Jan 2016 16:53:35 -0500 Subject: [PATCH 08/23] better checks and fingerprints --- code/game/objects/structures/window.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index edb48070d39..b49d491f1b4 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -276,30 +276,37 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f set category = "Object" set src in oview(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if(anchored) - usr << "It is fastened to the floor therefore you can't rotate it!" + usr << "It is fastened to the floor therefore you can't rotate it!" return 0 dir = turn(dir, 90) // updateSilicate() air_update_turf(1) ini_dir = dir + add_fingerprint(usr) return - /obj/structure/window/verb/revrotate() set name = "Rotate Window Clockwise" set category = "Object" set src in oview(1) + if(usr.stat || !usr.canmove || usr.restrained()) + return + if(anchored) - usr << "It is fastened to the floor therefore you can't rotate it!" + usr << "It is fastened to the floor therefore you can't rotate it!" return 0 dir = turn(dir, 270) // updateSilicate() air_update_turf(1) ini_dir = dir + add_fingerprint(usr) return From 51851e9ec50c5d6d7afe1265e0b8dcfe5e2457bf Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Jan 2016 18:23:41 -0500 Subject: [PATCH 09/23] Constructible Chem Master --- code/game/machinery/constructable_frame.dm | 10 +++ code/modules/reagents/Chemistry-Machinery.dm | 84 +++++++++++++++++-- .../research/designs/machine_designs.dm | 10 +++ 3 files changed, 95 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index ba75e86b005..f4c6cc90c57 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -466,6 +466,16 @@ to destroy them and players will be able to make replacements. /obj/item/weapon/stock_parts/console_screen = 1, /obj/item/weapon/stock_parts/cell = 1) +/obj/item/weapon/circuitboard/chem_master + name = "circuit board (Chem Master 2999)" + build_path = /obj/machinery/chem_master/constructable + board_type = "machine" + origin_tech = "materials=2;programming=2;biotech=1" + req_components = list( + /obj/item/weapon/reagent_containers/glass/beaker = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + /obj/item/weapon/circuitboard/chem_heater name = "circuit board (Chemical Heater)" build_path = /obj/machinery/chem_heater diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 0e7199645c9..e306157bb81 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -14,7 +14,7 @@ var/energy = 100 var/max_energy = 100 var/amount = 30 - var/beaker = null + var/obj/item/weapon/reagent_containers/beaker = null var/recharged = 0 var/hackedcheck = 0 var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine", @@ -123,15 +123,15 @@ var beakerContents[0] var beakerCurrentVolume = 0 - if(beaker && beaker:reagents && beaker:reagents.reagent_list.len) - for(var/datum/reagent/R in beaker:reagents.reagent_list) + if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) + for(var/datum/reagent/R in beaker.reagents.reagent_list) beakerContents.Add(list(list("name" = R.name, "id"=R.id, "volume" = R.volume))) // list in a list because Byond merges the first list... beakerCurrentVolume += R.volume data["beakerContents"] = beakerContents if (beaker) data["beakerCurrentVolume"] = beakerCurrentVolume - data["beakerMaxVolume"] = beaker:volume + data["beakerMaxVolume"] = beaker.volume else data["beakerCurrentVolume"] = null data["beakerMaxVolume"] = null @@ -385,7 +385,7 @@ icon_state = "mixer0" use_power = 1 idle_power_usage = 20 - var/beaker = null + var/obj/item/weapon/reagent_containers/beaker = null var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null var/mode = 0 var/condi = 0 @@ -483,7 +483,7 @@ P.info += "Time of analysis: [worldtime2text(world.time)]

" P.info += "Chemical name: [href_list["name"]]
" if(href_list["name"] == "Blood") - var/datum/reagents/R = beaker:reagents + var/datum/reagents/R = beaker.reagents var/datum/reagent/blood/G for(var/datum/reagent/F in R.reagent_list) if(F.name == href_list["name"]) @@ -499,7 +499,7 @@ src.printing = null if(beaker) - var/datum/reagents/R = beaker:reagents + var/datum/reagents/R = beaker.reagents if (href_list["analyze"]) var/dat = "" if(!condi) @@ -562,7 +562,7 @@ return else if (href_list["eject"]) if(beaker) - beaker:loc = src.loc + beaker.forceMove(get_turf(src)) beaker = null reagents.clear_reagents() icon_state = "mixer0" @@ -695,7 +695,7 @@ dat += "No pill bottle inserted.

" dat += "Close" else - var/datum/reagents/R = beaker:reagents + var/datum/reagents/R = beaker.reagents dat += "Eject beaker and Clear Buffer
" if(src.loaded_pill_bottle) dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]

" @@ -759,6 +759,72 @@ name = "\improper CondiMaster 3000" condi = 1 +/obj/machinery/chem_master/constructable + name = "ChemMaster 2999" + desc = "Used to seperate chemicals and distribute them in a variety of forms." + +/obj/machinery/chem_master/constructable/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/chem_master(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/console_screen(null) + component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) + component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null) + +/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params) + + if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B)) + if(beaker) + beaker.forceMove(get_turf(src)) + beaker = null + reagents.clear_reagents() + if(loaded_pill_bottle) + loaded_pill_bottle.forceMove(get_turf(src)) + loaded_pill_bottle = null + return + + if(exchange_parts(user, B)) + return + + if(panel_open) + if(istype(B, /obj/item/weapon/crowbar)) + default_deconstruction_crowbar(B) + return 1 + else + user << "You can't use the [src.name] while it's panel is opened!" + return 1 + + if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) + + if(beaker) + user << "A beaker is already loaded into the machine." + return + if(!user.drop_item()) + user << "\The [B] is stuck to you!" + return + beaker = B + B.forceMove(src) + user << "You add the beaker to the machine!" + src.updateUsrDialog() + icon_state = "mixer1" + + else if(istype(B, /obj/item/weapon/storage/pill_bottle)) + + if(loaded_pill_bottle) + user << "A pill bottle is already loaded into the machine." + return + + if(!user.drop_item()) + user << "\The [B] is stuck to you!" + return + loaded_pill_bottle = B + B.forceMove(src) + user << "You add the pill bottle into the dispenser slot!" + src.updateUsrDialog() + + return + /obj/machinery/reagentgrinder name = "\improper All-In-One Grinder" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 8caa9af8b12..fb97c2b693c 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -152,6 +152,16 @@ build_path = /obj/item/weapon/circuitboard/chem_dispenser category = list("Medical Machinery") +/datum/design/chem_master + name = "Machine Design (Chem Master Board)" + desc = "The circuit board for a Chem Master 2999." + id = "chem_master" + req_tech = list("biotech" = 1, "materials" = 2, "programming" = 2) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/chem_master + category = list("Medical Machinery") + /datum/design/chem_heater name = "Machine Design (Chemical Heater Board)" desc = "The circuit board for a chemical heater." From 4221d033ab1fca891445f5c1a5a0416a4eba14fc Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Jan 2016 21:22:59 -0500 Subject: [PATCH 10/23] Slipping Refactor and Floors --- code/LINDA/LINDA_fire.dm | 2 +- code/__DEFINES/misc.dm | 6 +++ code/datums/supplypacks.dm | 6 +++ code/game/machinery/computer/arcade.dm | 1 + .../objects/items/stacks/tiles/tile_types.dm | 24 +++++++++- .../objects/items/weapons/gift_wrappaper.dm | 1 + code/game/objects/structures/janicart.dm | 2 +- code/game/turfs/simulated.dm | 28 +++++++---- .../game/turfs/simulated/floor/fancy_floor.dm | 12 ++++- code/game/turfs/simulated/floor/misc_floor.dm | 13 +++++- code/game/turfs/turf.dm | 1 + code/modules/clothing/shoes/miscellaneous.dm | 10 ++++ .../mob/living/carbon/metroid/metroid.dm | 44 ++++++++++++++++++ code/modules/mob/mob_movement.dm | 3 +- code/modules/reagents/newchem/medicine.dm | 8 +--- .../chemical_reaction_misc.dm | 9 +++- .../chemical_reaction_slime.dm | 33 +++++++++---- .../oldchem/reagents/reagents_food.dm | 16 +------ .../oldchem/reagents/reagents_water.dm | 43 ++++++++--------- code/modules/virus2/effect.dm | 15 +----- icons/effects/water.dmi | Bin 2464 -> 2920 bytes icons/mob/feet.dmi | Bin 31256 -> 31433 bytes icons/obj/clothing/shoes.dmi | Bin 18237 -> 18477 bytes icons/obj/items.dmi | Bin 99884 -> 101837 bytes icons/turf/floors.dmi | Bin 322043 -> 337232 bytes 25 files changed, 194 insertions(+), 83 deletions(-) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index 837c3795b03..f82cd83d3a6 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -118,7 +118,7 @@ perform_exposure() - if(location.wet) location.wet = 0 + if(location.wet) location.wet = TURF_DRY if(bypassing) icon_state = "3" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index ba730797ce0..0dca37a8a35 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -174,3 +174,9 @@ #define MANIFEST_ERROR_NAME 1 #define MANIFEST_ERROR_COUNT 2 #define MANIFEST_ERROR_ITEM 4 + +//Turf wet states +#define TURF_DRY 0 +#define TURF_WET_WATER 1 +#define TURF_WET_LUBE 2 +#define TURF_WET_ICE 3 \ No newline at end of file diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a0aaadd6e51..1bd2c794ee8 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1233,6 +1233,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 10 containername = "replacement lights crate" +/datum/supply_packs/misc/noslipfloor + name = "High-traction Floor Tiles" + contains = list(/obj/item/stack/tile/noslip/loaded) + cost = 20 + containername = "high-traction floor tiles" + ///////////// Costumes /datum/supply_packs/misc/costume diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 17ec358a4a8..14fcee521f8 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -39,6 +39,7 @@ /obj/item/toy/toy_xeno = 2, /obj/random/figure = 16, /obj/random/plushie = 7, + /obj/item/stack/tile/fakespace/loaded = 2, ) /obj/machinery/computer/arcade/power_change() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 207a046446e..4bbdcb4fca2 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -70,4 +70,26 @@ throw_range = 7 flags = CONDUCT turf_type = /turf/simulated/floor/plasteel - mineralType = "metal" \ No newline at end of file + mineralType = "metal" + +/obj/item/stack/tile/fakespace + name = "astral carpet" + singular_name = "astral carpet" + desc = "A piece of carpet with a convincing star pattern." + icon_state = "tile_space" + turf_type = /turf/simulated/floor/fakespace + +/obj/item/stack/tile/fakespace/loaded + amount = 30 + +//High-traction +/obj/item/stack/tile/noslip + name = "high-traction floor tile" + singular_name = "high-traction floor tile" + desc = "A high-traction floor tile. It feels rubbery in your hand." + icon_state = "tile_noslip" + turf_type = /turf/simulated/floor/noslip + origin_tech = "materials=3" + +/obj/item/stack/tile/noslip/loaded + amount = 20 \ No newline at end of file diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 194a69608b4..b92b9c593ba 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -116,6 +116,7 @@ /obj/item/clothing/under/syndicate/tacticool, /obj/item/weapon/storage/box/fakesyndiesuit, /obj/item/toy/crossbow/tommygun, + /obj/item/stack/tile/fakespace/loaded, ) if(!ispath(gift_type,/obj/item)) return diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 9d8ed7ee3dc..d50ca6b08d0 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -80,7 +80,7 @@ handle_rotation() if(istype(src.loc, /turf/simulated)) var/turf/simulated/T = src.loc - if(T.wet == 2) //Lube! Fall off! + if(T.wet == TURF_WET_LUBE) //Lube! Fall off! playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) buckled_mob.Stun(7) buckled_mob.Weaken(7) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index ec4585ed46f..44650579eaa 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -17,24 +17,32 @@ /turf/simulated/proc/burn_tile() -/turf/simulated/proc/MakeSlippery(var/wet_setting = 1) // 1 = Water, 2 = Lube +/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice if(wet >= wet_setting) return wet = wet_setting - if(wet_setting == 1) + if(wet_setting != TURF_DRY) if(wet_overlay) overlays -= wet_overlay wet_overlay = null - wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + var/turf/simulated/floor/F = src + if(istype(F)) + wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + else + wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay spawn(rand(790, 820)) // Purely so for visual effect if(!istype(src, /turf/simulated)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all. return - if(wet > wet_setting) return - wet = 0 - if(wet_overlay) - overlays -= wet_overlay + MakeDry(wet_setting) + +/turf/simulated/proc/MakeDry(wet_setting = TURF_WET_WATER) + if(wet > wet_setting) + return + wet = TURF_DRY + if(wet_overlay) + overlays -= wet_overlay /turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808") var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src @@ -94,7 +102,7 @@ if (noslip) return // no slipping while sitting in a chair, plz switch (src.wet) - if(1) + if(TURF_WET_WATER) if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M.shoes.flags&NOSLIP)) M.stop_pulling() step(M, M.dir) @@ -107,7 +115,7 @@ return - if(2) //lube //can cause infinite loops - needs work + if(TURF_WET_LUBE) //lube //can cause infinite loops - needs work if(!M.buckled) M.stop_pulling() step(M, M.dir) @@ -120,7 +128,7 @@ playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) M.Weaken(7) - if(3) // Ice + if(TURF_WET_ICE) // Ice if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) && prob(30)) M.stop_pulling() step(M, M.dir) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 1523cf91f63..c1a74d07973 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -82,4 +82,14 @@ /turf/simulated/floor/carpet/burn_tile() burnt = 1 - update_icon() \ No newline at end of file + update_icon() + +/turf/simulated/floor/fakespace + icon = 'icons/turf/space.dmi' + icon_state = "0" + floor_tile = /obj/item/stack/tile/fakespace + broken_states = list("damaged") + +/turf/simulated/floor/fakespace/New() + ..() + icon_state = "[rand(0,25)]" \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index efa62bc17cb..e48770a177b 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -54,4 +54,15 @@ /turf/simulated/floor/beach/water/New() ..() - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) \ No newline at end of file + overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) + +/turf/simulated/floor/noslip + name = "high-traction floor" + icon_state = "noslip" + floor_tile = /obj/item/stack/tile/noslip + broken_states = list("noslip-damaged1","noslip-damaged2","noslip-damaged3") + burnt_states = list("noslip-scorched1","noslip-scorched2") + slowdown = -0.3 + +/turf/simulated/floor/noslip/MakeSlippery() + return \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e8a2ddf2aaa..37b40525275 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -4,6 +4,7 @@ luminosity = 1 var/intact = 1 + var/slowdown = 0 //negative for faster, positive for slower //Properties for open tiles (/floor) var/oxygen = 0 diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 46db0d5e139..154526cee3f 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -57,6 +57,16 @@ put_on_delay = 50 species_restricted = null +/obj/item/clothing/shoes/galoshes/dry + name = "absorbent galoshes" + desc = "A pair of purple rubber boots, designed to prevent slipping on wet surfaces while also drying them." + icon_state = "galoshes_dry" + +/obj/item/clothing/shoes/galoshes/dry/step_action() + var/turf/simulated/t_loc = get_turf(src) + if(istype(t_loc) && t_loc.wet) + t_loc.MakeDry(TURF_WET_WATER) + /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" name = "clown shoes" diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 96680de98b8..265a8c74202 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -925,6 +925,50 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 if(!uses) qdel(src) +/obj/item/stack/tile/bluespace + name = "bluespace floor tile" + singular_name = "floor tile" + desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + icon_state = "tile-bluespace" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/bluespace + + +/turf/simulated/floor/bluespace + slowdown = -1 + icon_state = "bluespace" + desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + floor_tile = /obj/item/stack/tile/bluespace + + +/obj/item/stack/tile/sepia + name = "sepia floor tile" + singular_name = "floor tile" + desc = "Time seems to flow very slowly around these tiles" + icon_state = "tile-sepia" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/sepia + + +/turf/simulated/floor/sepia + slowdown = 2 + icon_state = "sepia" + desc = "Time seems to flow very slowly around these tiles" + floor_tile = /obj/item/stack/tile/sepia /obj/effect/goleRUNe anchored = 1 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 214c6dfa3a9..22a41279401 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -236,7 +236,9 @@ src << "\blue You're pinned to a wall by [mob.pinned[1]]!" return 0 + var/turf/T = mob.loc move_delay = world.time//set move delay + move_delay += T.slowdown mob.last_movement = world.time mob.last_move_intent = world.time + 10 switch(mob.m_intent) @@ -265,7 +267,6 @@ var/mob/M = L[1] if(M) if ((get_dist(mob, M) <= 1 || M.loc == mob.loc)) - var/turf/T = mob.loc . = ..() if (isturf(M.loc)) var/diag = get_dir(mob, M) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 8d6294b4156..432461bec93 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -1016,12 +1016,8 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) if (!istype(T)) return src = null if(volume >= 1) - if(T.wet >= 2) //Clears lube! Fight back against the slipping, and WIN! - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - return + if(istype(T) && T.wet) + T.MakeDry(TURF_WET_LUBE) /datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm index 99f6e60a5e6..7b2cc0615b0 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm @@ -196,4 +196,11 @@ result = "lsd" required_reagents = list("diethylamine" = 1, "fungus" = 1) result_amount = 3 - mix_message = "The mixture turns a rather unassuming color and settles." \ No newline at end of file + mix_message = "The mixture turns a rather unassuming color and settles." + + drying_agent + name = "Drying agent" + id = "drying_agent" + result = "drying_agent" + required_reagents = list("plasma" = 2, "ethanol" = 1, "sodium" = 1) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index e4726c4779c..4257b1c9be6 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -450,11 +450,25 @@ Z.loc = get_turf(holder.my_atom) Z.announce_to_ghosts() //Bluespace + slimefloor2 + name = "Bluespace Floor" + id = "m_floor2" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/bluespace + required_other = 1 + on_reaction(datum/reagents/holder, created_volume) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace + P.amount = 25 + P.loc = get_turf(holder.my_atom) + slimecrystal name = "Slime Crystal" id = "m_crystal" result = null - required_reagents = list("blood" = 1) + required_reagents = list("plasma" = 1) result_amount = 1 required_container = /obj/item/slime_extract/bluespace required_other = 1 @@ -489,20 +503,23 @@ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") var/obj/item/device/camera/P = new /obj/item/device/camera P.loc = get_turf(holder.my_atom) + var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film + Z.loc = get_turf(holder.my_atom) - - slimefilm - name = "Slime Film" - id = "m_film" + slimefloor + name = "Sepia Floor" + id = "m_floor" result = null required_reagents = list("blood" = 1) result_amount = 1 required_container = /obj/item/slime_extract/sepia required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera_film/P = new /obj/item/device/camera_film + on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia + P.amount = 25 P.loc = get_turf(holder.my_atom) + //Pyrite slimepaint name = "Slime Paint" diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index 42c15938f2c..da3244cbda2 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -281,21 +281,7 @@ if (!istype(T)) return src = null if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.MakeSlippery() var/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 1db18dd1d41..1db08c92c7d 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -31,21 +31,7 @@ if (!istype(T)) return src = null if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.MakeSlippery() for(var/mob/living/carbon/slime/M in T) M.apply_water() @@ -91,15 +77,7 @@ if (!istype(T)) return src = null if(volume >= 1) - if(T.wet >= 2) return - T.wet = 2 - spawn(800) - if (!istype(T)) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - return + T.MakeSlippery(TURF_WET_LUBE) /datum/reagent/space_cleaner @@ -350,6 +328,23 @@ reagent_state = LIQUID color = "#FFFFD6" // very very light yellow +/datum/reagent/drying_agent + name = "Drying agent" + id = "drying_agent" + description = "Can be used to dry things." + reagent_state = LIQUID + color = "#A70FFF" + +/datum/reagent/drying_agent/reaction_turf(turf/simulated/T, reac_volume) + if(istype(T) && T.wet) + T.MakeDry(TURF_WET_WATER) + +/datum/reagent/drying_agent/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/clothing/shoes/galoshes)) + var/t_loc = get_turf(O) + qdel(O) + new /obj/item/clothing/shoes/galoshes/dry(t_loc) + /* /datum/reagent/vaccine //data must contain virus type diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index eca8911f6ad..ef21731868d 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -556,19 +556,8 @@ if(istype(mob.loc,/turf/simulated)) var/turf/simulated/T = mob.loc - if(T.wet < 1) - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - spawn(800) - if (istype(T) && T.wet < 2) - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + if(T.wet < TURF_WET_WATER) + T.MakeSlippery() diff --git a/icons/effects/water.dmi b/icons/effects/water.dmi index 10e698a34ca63ee40cf485b353a0d13bbfe278c1..1bccfad7773c233039fbaa8ac350f717acec5b2d 100644 GIT binary patch literal 2920 zcmYk8dpy(oAIHCI(-2V+9c(LNIdUl}EYq4>Zn@3f+&bZ*rt%kX)wZl3b2k za@~+7*Cd3(+!jlQwv5?+>v8J$IDdR@kN4;Kd41lW_vd!&yp@T#=pUj00EnBJVr>Ow zoFI7$?-b<2(a~mt;z6{%QyBI_s85Lhl`#LH%K#9SbNx<>XuGDAG5u5VhM!~l8~Bxm z+s{mIu%*vwJ{PwKzwMlv(0_%L(j9`*^-uIKcd|8e3omvZE`rLYTsj+Y%R^a{t#500 zv);_0;O2e6xDImQjc%b^`kI!EruK8KrWmAWjwwg8Nk%q$y|2pIU(6`yH6!{QAI5ue zVtkSkmN8kSdOEk_qd5-%M2TkDGxkwA%eieqa?T1=0y_$Iz~Cx&$Hdf}%t;ny@7-1;K_@U>e0sv56;rM$eQ%lBAwk^j;6c`u(gPERe(j&=?4 zs5KkthWeN6Obg|GBiiLw<3lS@zGSt8YvR z0m2e7v(5oo3k?dskJNess%nFN)?W+p?TmRKMgCDma(fpa0w63>I6XKNY~@>K&n3NH zMdtE$NP|_%RY>ebvYSDE2Wkho1+VUiA_DedlW>RObIJaYE6l@0?!dJf71SDkb{}C- zksk%g2Thg)xZ{ z%dpP&K;w8++qDH`PWnJ?8dll@w68+bl6gnf=GI3Cd9@=0KnH zt7*cyjl7YA@(tihE*OZriA=3Bk&`>NP5k@97*ISg*zZcl7)$}D`nlWO&yfSkxjOD? zqnM{ikC@u3)o>`;aswP%yFOBxHsB~C*joh8Mnq*Y)~1=|=QEqKyYWE zT5>@Ca6mHT%$FU2g{7rJ14q6%%$*)Mk*C130&Jv?c4$Vm2knc+N+#{5O~5u1E=^S6 zX0SHeVjYqqQ;2IGl91a>lfQ3;xf91;p4JYx+z{{3RBEr>*NPCv2rRJlaCg!z)OEJn zV4zOS$b4>3$F?1W8vN;YOAFHiW$>`?FSPDb#B!Kk9~e*y`ZNs!W@>7{Jw3K+BkQ`U zPc1HsMCeVSB&>^>;~trZn|s!4%C zM5)2j(myQA%X*Ej@{o1SpA1Td#{mF(;>XZTB2?llasVE#_F~&NW@~m2XXyFEhZ8n= zLB$!F3}~IpXE0e|o)bZ>zN0cR!Iw=Zr@1(Da1ZExAJ#&a^CQGy=|R}5lV6>1+i%%y zxXB#ey1a~w=w843VQnot(PjBAH1>4&y0~>Ds2@nf?R7880U^qj8hv?hgB}Z-$M{OX zvxis@X*CFKwUUjIY;mRRZE-c6D^M=bGYCg4?3re-h4d0N+9~84z2p;IcbRU!sCi87 z5rnA<(L^t+0Su7|L8(7;6l#bQ$)xW#EQl&A_5P#N$3c1s342lc$auBPq0_6f-lyy= zx=$jiMZrg5(?6ENSe9kHvt9>#+}3waiG2+Btbj6I9C}rwK`l7xEecwRYmUEph+Chu z^1SqssyrmvQU9iobf~0k*_XT2)I7)Jh{#BC;Nyk28dW~dIxQvrgKb$u{64nMO*=c2 zl*ax)t3P$mhpf-_d=J|>-b#kWE$ls4c<=nDF;1TUV}3Yu;`>uQ6X-=N60`iQI|=9O zJTM<}qxxsx8I97=uqzASMabbLjL=jyzJ6v; zp$NJ7_&fGC3((FyuljKRZGHWf>>`delx+3?-d9T))rWev8r;5_Bu#ZZS>9rR{M4V= zs~&bA1?Lp014(Yp1J35tQq*9R%M4KebP9%w_mSm4%b1pGrR#> z%L4>k^LNyGOsDs%e%IEleiskeS%lsJql2~XI`dlgEVgcFw~;+BZh zne9IRpkWhmU>FWcTz&xO0Ux(!tF}SsxA!47nJ$NVsF z6V{}O>QRz*)u_qq-%7~EVl1E9RDA$@t`MngsIYgOp(CEA_3@WhTzQx5*PjMMmdUAl z+F@i^sQ==N%ac*@TeI2f9GQ8EY1NEZh6Kn5&r@sP$BqkTe5@J`5EqG(^EM$iDyetc zcu}x1IH0+`$C&1k)V%piNH8ALt_>pz;|FL!?g}~u5&(Mwgglpm2H3w_IIm4GWN}U_ zP2gf%a&x=D$?->(1D=_V2P>esroX(T5iz6C&o%ho#J2&ciOcG2Z; z-*`K&60V7k!42ELn*ej4+bS3!tNYelv+l#-oVFhwa7yTYdF@b3Qmm&wC3Q6 zhXZ-9kaw=fp4NdUp0*OqA#RZyt>(2(HS+qp&T!6Ecjh>K4Yo-W&$&{y0nT^H*|}!& z-^hf==;{#MUfW7c_i$M8SN?sBHaRTQY(+V7`^5Ar8^{)Sv*uWgOnJbC8OL}KfLN<( ziX_k%?iT0Z(LKRAEGDhP9SEY2hRUDxk&Tk}65MiOy0VliG_b^B#qu-@{DOn`hz(&~ zZ@^@X{u!uTaXLjv+O=z!wcby?PYd`vFq*~ph1dTuWQ=?j$rebO+|UcW!ypXZO~c|Gqxp4a<%eX`wL>=n1}*a`rEqQg(8 zJtP?LePm@M?@VcenFL7JJbkX54v7tli6C5wh>ik)#CupTLQLG3H7tR@{*S(+k^b;YGB=UO~(9rW1ZB9Nyrv&j7Fmlu>JhL!1}aA7y!t=b2x47 znKVQNsm~~SGK>mT z554#L>x_fG@&Ix~-y?RZztRKIax;c@eT+tdq+Xwb%)pnzDp0O3SSx|Bub&EQl`Kl) zBJ)!OF7fdR@tNQ z5!a?HL94p>BnJa@D77E2VaAo;?!*Lh^(JhR{Bpzxc_~{+T2Jp-j$ieW5z|6E^KAw$ zMgDVAHLxty#SSSv=&;$o4|8w;-=x5J=hULBzV#C3oX^Wxv<-tTP0D$(9YT^4Iyeh{ zDP=!NG$m7qe&gGevR#jJFtORl=^_7Oj`$)4ut!1oW7xeTj+1g2kt^GmEPM;;?&`d$2r`&hqm#E>hr;?T|9z8 zN@YOV-D={q=W9K(`mLH9Ao%B?Zh;o&bu1Uj3JTM$D= zzCgrLcZh02bFN=iK3^OPI>U%a9{q43T-eYl41b{gL4%x<&v%A_wF|npySqzCN*aOeki{+af4w_d0795TDBczcErY*3e`s5Y;7xxgjd+mOCJx zV^uLJdv?uv+7ck!gx2qm)cS(y4EEt&b2Q3C`Q&x}Yt>@jYt=pM;(&@ZS+ln+6`q+{ z!DUBs3WLkB>a(>hHySUO_jn)Ks)E&8aIvrVaeLI47VK^8`7?ruuqnoMdK*9e8BsPm zThXxizDc`w(E8``?jUOy_;`pvbJeFH5@tSBUx1iSb!pZ=%kk6tVES-oL)NX3W|6fR zT-Z3pdNm7+;3w|l@~tmt4O-xKX$3loA1*{NDLc`voMcfopTC}+oek~H?OgvfFQsWQ z12bn}0xj}iuDT%XvouG;h-%Xs(wh)ozB)=~yp0NL4E9~Lf(iS{>^+|eS8H>sY;qS+ zB&BH$sZApXqr0@6~nWL1bVw15h}d#f+r6eraDwH#Fb8@`;tIYpu#;I=5iO4-z>e~C>K9+ z$kn9-V}XjL*VfK!TTbqvw32(h8Z&ggP?j+ISWd#l$gWiQiI^w?Z)IxAw~9GG*c;e% zRMJDlld4L{=}+V7IyYTi1Ok#An5??7kr_#{^i11uJQ z@6+OocWn0ZmUl-b)$)1yjg&@zU*2SvZj#SykjOG>%ECQzEvSS0+`dC}8a-RYN-)6S z)0WR9r}h22PG*sZ4Gp1U#l0QHR5<9hw*yDz*d<#HMt!dDu?uBUkbCb^mm&CiOKYxL z!!PU0^-CrBZEf~-tE+X3YM!P=KEWTMw~Fxh%+onuvbGemua?xA3vYoar7(vXSc&gY(t@7l3Lq(WW&`VA4* zpGwmCpSE-$cw3J~4=??lZK?;a6a1Z}x%H1@CMGNEZv=wo&!3|P5j|5=4UBWNx`hm$ z-G9#d!{0hpRpX&yVQ`PRc__X3sio8+)Wf^BHl@BNCQhsOA`?&^#nLZB!D?9?WJ1p%ja_jKZ)Nq?f#s)26P!{%F@=1w!AxVwP}T+`6@F zmkgAL8@b1&N0K_^iFG3BS0Vs0EO?GZR+xMArd=@Gw(mtw<*RyvB&>LZjvuw+xWCe? z_T9VXe;sDlK6WjzgcHhedkmsx=Lh2}B9qf<_PbAsq|qOtV|iYE06!5-H`-l3b6-DC z$+(8O!bR~q-Z*l(bY~~0dj~=l9!F!~j0qLYNaYVVhKL+JXnOl3#*(&pZT}soV{iq9 z-%V?V12+`Aux}i8l@4BU{P&YQRabD3%;#2;EOZs6z!xePPm9A_8Eeg1u#@D{9D(nC?$$}zzkDbQ8 zP+DFCOQquUU*BDRH<796z*td$0i_4+7*4SlReZe4c!d02*9hv6oyw)MY3BcpZf$k+It!{73>Hn5WOOSkteg3saMRwdsi+Nfyq4MU^Cchd zBPSc!y-NSzB?2D%O?%llRTA2Se0ckM%P&by_?@IrMFV8%3y59Af6_5k;4-kre~{TV zN~1|He|!=y$^1C)xs=06u9^DR+ce*^OI(JJWk_oK*#H0`J2IvY8qQo9CuXivwVBNK4+Op=i_WAh0>s@ z9@EY@1a*T;@A0zMGWJ8)F~w5Ew7v)TUW|B44GD)&*HP!03*auN3uQmwlFX{VL)10< zR#gaoa>SM8B~(~SnR+X%I8V64|{JJtkzf1<~-j5pK%(lutWGh zad(EchA`KS%omfnCq)`3uV>F)QSLBJI6hudBoVb;&sSKHz5IeyTlx}<(Z(T_$qy~$ z{t5HjSR%88RspAZz1@3zr|3oE@{Yu@t5-0}S!$O@?P-cv?>O1(uD~y+xH|HLw`s+$ zk@vG^QB~X&ET?y9{>+}sm{N1VCn!r;!)jEoTRhb=R96fCh~N z;IHe`Ovmp24~h7@NEh*mh$ARjuM*sFJ()F*kP}HUu@|B2w^%#%&4eO+U$vfHwC5n~>{$ESw=jf}`&DDb~pz+{SjO>6Q#?@Ua z`pT6nfm9ARS+ibAtbauaA^5pAM)o21rRXcPN@1@66Ggh|1*EH=;eHWMnZYCdEFVpZa_m z8P4|(o|TY%SJo=N(l2{dcuPzS^}}uRWky2ZM1{?>pFe-*tz>wQ!nt3G^y<7SZi!ia z`R^wwsV9|&M3+7Iw{~u&;O15tht@7JELyxnr3iGh|&NvSO&mG&3O8uR-Rp)hT`gEfBeK?1YY0mAT)WdH+=%R2@}wxnJHvXV430 zY~~&ja=b|G5yK+3DBihAaJzC}@uM30V0|ix3j5$vC3Z>r-1p4wMr()J(bm-O-3IR? z`*=#0*anB0m?GGdVvb)SbK1@pr{>GKnV`d(??iMIY-nS1$JEqR093~`u%&DrO=~Wf zle+Q4T5wW&m&^Ms%bVsL8<(8#w;k>3^3YZ5^Vu~p+hjDWm(=I+AgXnzpBxK)A9sgz zF9o)luAwTuH2tN^oIiv=Ne*5yIs_|_#ktDW6cEEwAT5W|7O>^Mt*F)hKnmNe_gJO* z-W{PfAekYB(II2cHNN_i1;?Ki!m?O7)YY=}F4XN^SxPjf%R^fo`}X|GU%ZNn`NVr~ zzKcsUZ@U*Ofz2p5yNwIYzK(9h_T4{r9I)n5QSIP;vpg$jXZJj|C1B!ZDd_w5%Qj@D zzEj6g?lTHIwDTC-US?FEX`0{P&+MRBeCl#}{-#Rn#Z!dt(-Cu)!f<3{Bx$UkhQ^K1 zl-}c}H1~@^DaD-F`xNr&8Ot*>GwW6E)W1uB6MQY%&$3bd{vyN7yPmvOt>&e!%Y`KV-;Ca_-tny6ZjGRZ7@exK z3?J#&m6ge|$=GMBrbORvUW`zkUXK$d|5L(pdJnr@Q|v1H(uWJmoc-KvbF;p|NOu1X zDbsMkz)mUTPp0@ewC%D&U%k}gF)@_6u&9<=M;V!9_aqc#;EMJ^yd;+fCVt2oDdZSwKCfOz^kP zfX`IujKM}_=c5$BpLV$nt?`#HUmjplDN9P++}xCcf`X0`X}D0TN`81mgql`xSM@1| zIUM(S`*4+fR`L2iW^gUjle`uhts7=_q~;?+-aUJNr75x~{Hn$qbL`F&J6g?H|3f zv-4ADrS-8=v$0A$rr*DRKUEUZGTL8TaH;zH>g$3*ksT{Ldv^WW5bwjgj>f_sLB#@$ACFo*(v85;)MtXc4uAg~d&vtZZiH&-eB1(LZ8sDXtV0_cf zcH+ku8{d%k7XC1{^qxif2FAU!Dq?|G>1$dYR=<{OR3VknMfM6LzLB65y zGx1TGkmO|gAC;BX{Ywmwa`PhBg9rs-vvyJiMa7fCsL06XXa?cuzB{bJ_savw!*aCI z7|Ad-^Bx9a%UKp)-q1~Vxi4SlS$OTAW(Z2pq6M1qwiUuVQ`fJ@!saR>*FCtJzn>r7 z#L6woE;kXh97@I!P76jQ6EeMDMvl=7*)=sQ3q}S8Zx=dZnNWx~70kMetmVTQjFmG1 z9#YrQYg`#$dts-q1=!f`=mx}zvLlM@+C@LP-G-XaGiOuZa0~x`n3Io7a{01?v$GHY zn^G9@yTQd}gCEvriq=g}O|?DFzao8|;sS@*Ne^7ZGen;~qJj^Hzm-HBzaH{Gl_)xX z43KGGo`^h5{@1H2jwyTP`;Q(q9?`si&pKt_5#{DRAQ{jyM=42uUE#Ef1(&#W$(aq@ zAP-SY?p}J}^oZE`pPTu!^yuhlQuzf-bMs^&At8m)#T$zgo7}g?FKa)UU7&gjUf$!f z#Ac~1L9Q!C2>bN2ZCJMcd)V<*JDu%>rLyp{pyVI#9=IpQg;Y=L^IfE4i@QDd_nAO} zOGMc@1)o7+*N5)enj8gPteC@e^!~of;>rr4kE)-a%%7p5QqMh0`P~MknaRTpa$C{3O)#SdVm5jg~Zn+J%%GmS91sHpN1(Z9MIohL< zNfw##{Um;2END0kqm4x<5?S5znPcl_8qf`>D%PXznG%d40GpFFNucz=Y-_SCe@)mC zK2Gm@jyXFzYmM7jRL!vpGB4cSbp~+dv)3!u2rx-|=TXmL&C6?&p15+_Y}~Lcne~sa zUvEQl(*B8wbQ!L^yu1adx(*^~JEKbFN_l*Sa?ro6h^qfzt}c5*7+#Tp69>>L}RKa?&Qt49-UEAipu#}8hamWpFELwbrmVp`lfa15T8WgVuh_kLPFR$Iq~ICwy2N7RuE*> zmpW+K_Tt40K2I5*Wc1LVKR-}(QTWin-@nm6e%uAPk^A}c!95wcf$(D5_0;nV3r@#7 zCavx5*>X zYOQZ0aDFw8f2kEeRIM}HiBg*QZW8pU&ucBIYv#_KJA;FRS<*?C6)!7%S6|oiG@drj zIqrK1@K>eRPbMQ9Onb1e8Fr-e_wOsaiH3lpP+a7L2LrwyHcUMSyy2LdZ-)_>iA!&M zNt*R0f6OaajE(8s;N;Azsdn8W*#5~OyieTaHxsD;u2exGSb6no#9JmY!#(`8 z`UJbb)q|}n?!G425{Dk-;O&W+VWyt@#qR#9Ad6A`CZPJXb*P{X2V37)Usl~j*yp4=};No&O^2y`4MMomv z$>@0(2}RHVWoG7HIuNjIz@z%|#gyIuS}pSh!F~sh z4I~J&f zt@;$UzUsT4@T<_SA-Dh}w`BkzW*+x9Cc6Z+BZxR$&_{MGf~>T4V{38G|Tiu&{C zMXBRlb7mzMKfh{cN&1e56p+|vusaGja88#zJv~hi)<^1Mrt%rS0hUo$QVR9hcX*@& zYg#II1?kOMJ018soOaGRhF{%u%bnch=Du}bL*u<0=e(o1f`$go<;RcX?5h?OYo%A! zo4}_08=y4`0FD#rI_9*KIj278e8!hV(#FZzSvnan;t2>$h_r#RyR(y0H-U?z!(Q3x zQG}aR^k1v67B|teVQp=#v%epexCSq;tZ+z6 zGpC3-h~7XZs~k{~C35sd~AxQ4F}?T+U;fw>!6PjV`69b3G~?6dOISw0(0zT zfPg}tY6dxAwLvjGCzECK%?#vq&HdTto-TUda#{dCL;0#59W3y*{bOLt-YLs9uz>L^ zcHLt;@J`aZrH?+NN*Dxi0(>>ko}XJ~wtY4rrhkc}t*MCvtp_}@oP7E64L4 z54S?}oUj(i|FGK`U^B%=tQ{aZlUG>piFz4?mX^&u9aUBCnX zj2I-z4}bV(oX3h4662WBA-b63lGF1NB$Dt%D%tS$W|G`y(o`{p<@wg=27DOurLeHD zVe^9gvi+);Sw3BmU(Lk#ggHGUzbXUjveWi~$4Q zpArT16#p1=yU{%BGk@>}?TlErRXZ(w_deP(uIN_=EchuUB_5F7x!GA&Saj8VJ_9af z=vDqoF6KC ze%|93FW#yC1GHfG5!>p)tA`#UWkZ<4kMUz=d7wtqQn?v|oQcJTDO%ZHO1h}FeBQ6C zXZ~0RHCLwTYTtlA4M%dmMh$(|73{pcz2A>tzkdDwWf6`Ug*hKVv)lm^*ug?~id~*T zGzX6mxlLdMtilJRIv@-K`2$3@(*+bQIt%zNnpskGm5j6%5a24K2WE0;csLkDq)PoT zr#8D^SG)e5DQ>KlCkvPaR@%0y3b(Gtw|uw6u#nDJ-Rm5;6&NoxmZT0~N%`1-^Ar*?GJGgFG}Ia+H}dZZurI0) zjLDW$o;Efya+X>kN&CJmt2Nv&+8PG_#Nt3>2pOG>_50D8^Rot;f4aAj&5bj-X@MeY zM=i&3cle8O=nWzL63fQ2^76Jod=g_oTNV`+6##~6%y-lu(dmQAgwVH+t_&^Mb@31k%_4SS?*6;D4#AEJDs;N(xinl>*|;< zzE6dSLn&I|EAd1n*VAPGxt6dTa0B{Y^7XQ4%H}&af)t+m=H_Of#ITSMgBNj^B#VdE z_Q&1yPEBbdNM1cL`nPA84-YZy>k5t|oa09v92^x`e*Q>}xY7%=iGjhhi{4lPK^E9Gq(AlEQ236_$A)iKi5{X%B%Jj*2E!tEag3#<8W8`Il5Puf>aS}pg&toDGc_Sc3ge2Ln-UOmvi z1{rH8T(aa;ZMr^XSE<{jE^wQ@dBwLWZ)U4thsaJKJvlCXjzh_KJ6#$q*8M1c!s(CY zmQ4%jS3xDIudQtylzr`Z5C0*L&*12KvfV!^ig`fTt`^OZ?_ZB4EQjCa8=IQ4EBSce zQAqc{+1l1*T6$@7H20h-AtY|xb~KW|1oe$KX`AFGW~OSydgL@4Y!H|p8hf^F)7=rn z%=AO_JK{cgggJS$VhnUK7>oOq&PeGk4tCNE(VjsfqA7Ria($8wrk&ppot^6O%ZHIG z>gdn|!Tg~YuLSF3Htfc}H{Bqd0RqBXFGaOF$vw%#GEw(#Qs@G8=5IcglQ-jlW*5Jx zUu^!Cie5Mv>Q(>syLUy|?VE!$XD$zSB;ncVc}p@fF$(y!66x^J0dMJjQc_N7)?DO# z5?vi%q~R?}5N!~)>U{u~<5TS2toq_ns~!9rSmj~De23Y7r%AP>U6vcIb*|bR6)3VP z#a;`2gkGpfNViSswUqars8)G0pc<8ZU}xh% zsrTL}Nuu*}bM>9Qh3H3%4QwPlcXRvkww&oQf%Oak5$FOi+grL4xJo<-A~EnxQtC4h z+@8Q6129#AEaE4p;=J3YNNf)!*#C?eJ@Pq(*1=x;t!xUa!6%Oq+mu;vg1?Jxu%*nQX}tRXP{3HwH9gK773 z`5kVJ<3Zx^9By+9ha-$_#)lfGrM)u|jToxML*#JUNUg+s86T=Y-+l5lJZgyGk#DVc z&W}}BwU_%f^nyO(p`?t#zM7f^B}IyQ-b}w{(sdR`IHAq29)FK@qA$lb&a$z|P_!`J zpT5i}b>kAyE&+R=!hSm{U#7b26cZDZ&yDn=!1MG%uPBvBVV2^}l@C8SWMr-b*FyZw zGU=yJpD0;aU<=7niVq(?Ow72wc_R$kc7VVw0PMz0-#kM;;~pRh`6_c~RnvhiGu{;S z@CL8A=Q_<9;yR2(1S;0ze`$E|9xwG;53cV@A|hXPo25NTyYW=C6G!~HUO+K*qMxUO z3Y}sJ4IB;@x+hhHB*X8NSVEHDc)3t_!gz9Ej3}xN_vHFdsj;D{d#aeeeJ?B{pp75m zZ{Lz73$T&*Du23wmO5?nRwwG4nX4agBzcvGN?{6ivBjZf%whB4ls~@Q-qG@Y2%KAil$dzCINIH$YTQA}?pA zUz72npPQSTC~5?{Q3T`eocKS5>#3tK$O`~9HPffE@$o-!3;BZ%fKzHLnsVXl_OED$ zKZ|Z#ANlqHBUoZsHv#m3>$&%(#O+==Wo6|?RTG0QTF(oz0x)6H34_Qt*hs4te7kj{ z$P|I5m5N_v#+OdcL!#X$e`#!*=-=y1=A{b`Q_id_A~W(k;mmuM5_&=8Ns?^)ZmjRL ztDNbc!)+xEiZ(YuIJ%mc+Q+{9c*c#m{SCKso&ueyb31V3a13C8d%6$W@&haifxWSL zn6H0xG9S4O6Wv?D%hdKQZ@?JQ1>+4ODW5(8z8pu!k)UZLLSuEW0smG;%Y|TMPt@Pv z{n;e9NyRZST0X(?P)3Yi&2HvZ|JsL*L+--@xP;EQI+rO?;tZ!IXAcvZoC$NuI|A#*mivSz|90CSNro0*kNTqeHKBbd; zH&={}j~ukhP!OC|l{T2GjQ~sJ_wUDchq*O16Zyw~koUqb@X*ix0f&5oi*2b;)53yt zQRdQ~&8>Zm(QX50L7>ddGubmZQ}l|#<|)SEevGs?&XAj5Fzv&}h8XE6*z?Q1h}z$m zt@#ny@aILP%ZzZLEvIGY&tR;ha|~^h6#k`}z+INsiOGq9fw5I#Ov#JPV|R>Wyopf| z8?ay`6R^}TypR43PO!>GnBP4)kFX7@w`&^nb4P}s+1m2>X&oAk-MX~vkiqXP`}g(l z2H*N>+M7LMA9s}2kH}!;g~o-GY7||-11Zxuv{B!r_LID&rumRX_1f3Az95mEzcTy< zlfYP>J{Ul1_m%_kvxQ`EAOXwahf=4_dwEvaO)97J;n$G=fg`iuX%iu^oW=I8;zIWI zXeA#l^`P@+?PotfHc;-0K#N!Ftycv*d(T6@UoQ@lBKJ~)J4UOT;E%Qm@pf@1NZ~T; zR?X|mM5Mu2Eg;1q^>4}fkte}ZiF;m`WYWyq9P+}NBn2<4zf(c&yX*OiaIU$$bvLE) z6P6~;=qsIHe6>)2P7N9M8*wadhSYf<8b8oabvsx=dkBDC1WR-u=%lSE6X-xa94195 zfnDl^an#y)i9G+PN$;^b2-e4+`ua$nC~2ssUxEtKrHENn>!}=a{fxYg0CW$;!XR7` z{`PIih;`kfTfU#C5sT1v$@lL9cmK*zfNnDb{8?lQbS zKYrQ0ux)3aWR=kvfON(7c)YgJZsfPRqGxB9UZ_$;_-QYkmFw_KbX`Cs2tG{^H?4ki z@cdH>inJb{oM~GLbAF z`w8oa-k~j`MOO6UC>ijfhvCu9;Co+AMu(Ri0pT=#luzssU1eHv>q^8zyY*QexB2Rl zm}3ZC2x&-<;(T?fj$LFc(?XHXpV!SPBy=#n*7@lQ0@ei&0-|?FyVPJ*#cF0|#_#u+ zN$wvi|AP!6yV;r`aPR8gZaf-td567M zDz_2D&`^7DnxQmw1ZQrHl_TZIx7;#B?7D=%m21hJ1!_knF}%aYIBp#ZlxvZal=H(! zKEuPahET@H@T@SyjQ`kFMLwSl&S;D4)ydBSl`_i@uRXBv!BzUb;NbG~k{FVN$p>+| z@Nn+x;#ImEz&oTmU`{Bt_Wj>L>P0{mxRts54t+o%ApaDHUsU|t9xSzPn?k)QVyaRe z%8WAKzTo_)j6#`dGIl^0TWnVP7nYg0&I*MkD(lHkQ5hrGTJhvVGlgWD21H5MUePI2 zur!Vxe-ZaOhS>9a#C|qR+*;fyMXNi>xcn7iYN&M^9@SV#WWm08wDlSO1s_E|{3S?y z`^Yyl7Ln@!xg69JEHimne|5Rjf|7dX|7L1-7a!5k(%$Mt-bHh=vr9c_cxd~#8eQ{o z03@>>EE_5Im1x%SHOc_Fz|xD*LjtZHXVn{d;~x7VD^93q<>)H@+m6P48c^e8cX``p zgOP*IgIy9Mk=_(oO!e1QmKfO>rYImy53h;QIe3S$0$6&Wh*QmN&JDz@q|J|C=2}Ub zY^*`88^e{esb<%k(AC9_aXUGaE<&AJHyJ~ZJv{S?fXKQt|6N~*HPKv#X4s9?#Rqn< zn+}u~DUNc&xl24hTP zK3k8LPP7?jX7p03W z6UhBJsXih$)UA{|cOD|VFG~)>Jcai>cFNG2X>k@$p=7IBKf>MLW%%7Nn~yfsDTy?8i<&!bPy@&RW8w$GUuN zP2r<&sSE;Q4c-T`KGjls=bb*+q34r6G}~=q9Be|DA)s<0NAoRepb6UH*z>&TPeMBGkU)G@OKQjL z??KQcjti~q$HNoI|LGYnO`;D3Rc{bhnYH1`j;c_i9-qq*+}=t=p(38dwmpE_Lk?xJ zAMcv{{67E z_0ITzDvqN}ZlGr7^$k6MGu+12=vBRCT1(SD+HoyHz93q)v9rZBv=yAj!G-+L9ytHw zb^_NsqWN8#PRbw6UWSL}SS~q{JMyOo+O&Gge)HJjtN^4T^mMV_k^D0`?1&Ob2Td)_ zSD#gzoFsky`W1r2qFH>pY(YSpM210D=YKK^it%>)u1Cu%Kt)gHO_N? zoK05$k?gUEFS|=4AV6J~DRPlK2cX+5)z1JX+*Zl`A9r{P}ZeS};pz&lRfWc<{u)_8U99qB3e@6_uEQjsvec z@EMI=)OH?4jzMf~6nisE7bAvMu|}+x{W2_Z`=eLwm?cUQmynQ?mb&EK=awpXqdwYB zGzAP=>bjwoaBcvCWFUxjyj>ny4Sjc6`*R;F2w&yX52xl*p=V4wIkM|MNQ8w5K*DBS z*t3FV^((CNDtWH-K$z{TLtR1rRIZrqm;lwQpX;I{qob$i!@?2>R@fw9!uW<}n-B&caKHqtfbqk!$Nq$fHHX*;SdCKcDK0kvy=kiq}nqL~?o&5FO9$yA_vW2V^ zmrouM4+b^79rrwZunNzDsE+O$?P?H(40kBm`fBtwY3rS;js>5lCn0RNCk5i1wag9U zPQ-Q{V*HErsy=P$)jSO*XPVgbUhHZN5BpwaKV|(#HkcPaMfg-7E6D_7Ud|CDAo63k zub(GgCLzIxG8VENQm6zQNKQ~QiDuZh=#e~4T-$6yH zJ65Id>be*7;X^uiB`;mvIQiH>ae9ADw_5*vCy(;ikzy?R8EAL!>p#cL8h0Fl&Lg+r zh86EL807w0FCN*anJqDbwno*{upKQ0$&s{-fl@Qdk-JVD9(Q^ZZ1~yt10x?d!JP zjpX^nEaWlxFRm$T&Ww;BRE||9Z}12jH()k-^zA3Wx`6I6k}E3BaCQn`<$XFFg0_*} zhH}TB;9SXrt#4S7JqKHCK(Set1aib{aPuAVnh|6w8r+^zroM&lMJ%g=P} z@-{2G;>8E2UD^DyF-+iCL*(_>IzI5DK@J>fqgLT>gLko!k(cG?4eU+`YhsYCsapP%v=gyV9_tvdep8?c z8nr5CG;-jp$6PbB=!w<>e7XxTc(5tJ1Dw zl`UWhqOkr2g*I+5la`Oe(YzVng0j?OyC-cZmSIwyS$qM4y|amT*WZsuH`QjKnr&km z6Z=(XgFdnCcoC-9Bcj-<5|c`u*<%Cdo@K#2C!n6jF3PC&v4R2~yNHNuW{TWh<6{w;geC{?gg$FwxRecV3S!TmK0Z1_ z*!N42eirOF&8zVWMqpPfP&{eGl=KKl6;HGH>2m5@ZTKX98FSCJA+~A^UzJ=S96Xu@ zKYcgQ9cDE%?A>HNOQ>ro`J@-RVoTl)zmWw9p^q?aW<`e~CUA z85~N!0vBpg;qP3W5w;y86Mu7P12yjTOWSyvTcASx^|9w~+6^vAfn%TavV4q&CE8J( zlVFjYa>p%R`P>30Y88}~Ic$&3AvycLKR7>ky7)bwK#d;{gB*YA>ooXD^Mm6UUSEvx zlQ$J2!ap*G7!baUqmjM>R0$16Z?aFJfDvk5%HvBsNldheGnaAB{KiR!|AsZfR7y;} zqqCLsSjAs;MV8~!I%9mC_*MT;)H@t^w23iJA5I{j*ec{qqt&R^t!NI7DKe~k85N(F z#!JACocdT;r>FR0ltT{QKVI<9Jk$z^#(nGBgJyD$R+`x0)}P#W&ZyG~f(N-REG`oSXmaFFNpdQS|@*NU~pnk!J<9YA|it7}rV&qr~4oa+1Ajp+sn zPg`bKC`((RIaL_ENXoLdo>y)3rD7PZ`f8x+;_+jwN~(B(7BEbpSFLlQUKUQD|MwVZ znFqGRi0+>A&Bv}-%??yT`7>~Iw!FMNBwle0EZb?t*2@T3r1jUQd1?a^tZW&x;WUMK RQal9y9x19Q6hANy{6ATDm>&QD delta 12538 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 diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 36ec05a86f99811801732872907eb17dd69cbc51..cab7cc16e7c28702fd9f0a3217e99912835505f0 100644 GIT binary patch literal 18477 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 M>FVdQ&MBb@09B<|JOBUy literal 18237 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 diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 6ef95efd7e849636353027024fe8e045227b60b2..a5af5cd486d3c85ff89dcb7f42f84f0c5686e1ae 100644 GIT binary patch delta 5092 zcmVK51)3bDan*PLpM2V~W>ZgCxXcLE@ zZf~@NSlw6a+nYAfz_GfozTDnuHgu@&tIu~&zq2q&sCyUe>(c8PXqs`zQVm(M1Y)&k zHhGpQq(J@yOs?~!Y#Ez&V@CEtY>Ig_xGmed;U!;Ouw!CRYMUp=V7HR8oT}5unF7PL(BQ1Tn%yUT1!kW_ z3asv&xt__LGe!1x&J-Cd!P%=BE5X?kVlcSg&hpU-DadQzLx}!zV9V*Jw{aZfsJu{fK7=5uw^H1l|Pc2jqEra{zD!}sgD=4 z4r1~}g|;O2PgcnRiqC95!_{8YmLBr1U<$+7w)yqqhdmp;v;d!89PO8qE4Q$RHy6TZ z!B$bwy)zog>1S|0sc*&Pi^x_2*Zh#gcB8}|GUB;^2w+O6lbF1tIvTh}DzJ{mM?~F@ zO=BET`gOEp)6*~jyT6kbuu$5RUzkqXv`}(Aqdw*-LowEg8pECfP()7xdkMfwIwO?& zx)%+=nR9v5yA-`k)qS=3aJRlV4n0ZG2X0(Sz<#-)S7`dtlhtYj%I%)e7p}L-`o5j#0nVM&L|SvHuKPCc^?(U#V3k6Ix52yw8RCc zErm}fHVtg^DUc_zscsC?dOxv1T{)pV_>|wn6N{CW6Ki=)f$}&0L?bohL}Eqb#DZ0S zpyx0Exw7wFa(U|gIhz-|RZxB9#dF;T=0{+IdbGR?q_#Dd@&6 zc}E8Y7{Izl8#94*?R#f|6=1P#N$MXsI!j1J{zTSeo^?RyEjS&Q^1|m>zBCF>$5p;I z3Qot>Ck)GHWF;BOjLpwx2IuEAgYz?go54l%`%(gb&BHx&K4Qh5Ijzp`ZJ>ankUyj+ z6tzMbm-4CQ6T8pfGe_2iPC)k9ZUf@h^RP9^cZOpAU>;d#&_(P?g5emUrod4IM-5Y2 z%(ho_s*fm>Va)OU5h<)`s2U9Vv|Y*A`xHj zet8jSu{tC6%&B+z+V=>PeFYnT2l_aW*aj$uCKxlt~P)6a^1|R5D2nV|RZN z!}au8E5>RH+X}kalNhc+tP4m!c0`feE{WmVNY|$VW5J6giD9S(m&7pGflFc-ZNMeB z2f}f32k`kO1sVrJ-oHn*H#U0wMQz3wzp2e+^Pyx01Mg}x8i;8#8hBgViDsuLpNpKp z8h8r zitHudib`U5)tHgr)ckYx{r7Lxx8Hu;{vXO1v+Y3>4cmh#2e&8(0ft}#AON?pX93U{ z4GKk3s43TreFzGLqDYsGfB}PlbwFEYpUgR-1ht`BF0Gt_mGWF!(^~oew|B0waa3m* ze$LG9cDJX&>AlyWPkPuQui$D-WQKd!|v{iqEq(W^?{vcIK1Zu@a zDuNbOL6vALC{WSQcK*vdFe>m`pBraY;6#I(HH%t)ql2UdgkR+*tE0uwq1OF zSE#Sl{Fl>OqqPpVKlp60X8rr_xK;<(vn&gx6t-<+SytGlVzG$Uno`N7P$=O0KE;yD zuK)DbtiPjY>!P3k{W~9jS=R3dK@e6p3l^f^TZnV1dkkW2;j!f4eL7f=o%P#g`H*=z zW$T^m*0ZO)AN7~9=!?GSFRlKwJ+{7mV+`Yfd=#K{@DHFA8c--S%Dj#y@QKg%*t!-I zdhz*PIu?sD?E$=>vVXc1V)&DJ8e@D+&ebdc1hi1334V6?HZ{PRB^^TscT1==Q2y-!SAJC17 zk};nUu0wY31;GCF$C1yb)L;JcyZ`>JTz}C z?W?yHS4pN)P~Okwa-k7aN|8*Z!tLRg zUYh#Z1tO*k5sSq_^BIdf#GMA>P6G{zMiPxpBpRD&NHpR!B+TM8;5begC5^>upJga8 zpO$4|+jh9bVzID&!G5q^`E!CG2y-#7dE8rwL#%Cv`F!_(>)Yx2?!9KGmC|>wxRh7k zd?&KMbbqvNJzIJYFgiL4m@mX^gwY?-7k$x>NZ*7!`SOc?(#Kyi<{a-@bi20Gl^&2H>ebKF)PlTw41l?y2zPlMD_H z0?|f)L|^npKU#gI6m2QvMbph1trcx4g~le`Vu6Bx_GVC8lS!4MmUZ|vsx)v4$aQzK zVaFr<^P=;(cE=;+vRM-q4I-r#5z|B>QM0~N9{3p;KF4v0$K%8u2RjzSj>U+@|h94y;5d|9ZqZ;jN@+UMtpr;L)tfc{pWHJd#(cjD)lVQP*I(rLoQmIrJ3H|uJ*L7e%D*>`-)5od|$IFsj)0YI^~1wlWy|yHMBM8ekL9z2i1m3;$ZX7JzrlNv};uCnEdg*}wn2sH8++ z^hJLe^nKrS=gg1ztZMYhk3d_C#nBOeMaL=_8rGznH2GmoTdU&h6VTNRXbWnLf=)A0 z!FD+kT1`VDVWOUZu9Nu+`gvBTx-H8>SvK1Drgsx48^0hG-q7I8b?H;0+E@mQ)_R7~ z4B9GvKm|cqhTkmQlwiID9AKh zXx}B%3ck{`w<;`KVb!@Mxm=F^zP>qMpPZbWGN0uENOeiUS40*A^BG{-F*5+DY(#C_ z#r!N%d0yi_@+;z>k7R2~KmcipuuQteRxnTJ8aT|ZbReYyV? zb^jg7EA)}EHzWDxU5WR<6j&B0G)G6EH3`Q@p{>Q|_^6`28S*2LZi1nIVQ60kN5`Qh z4R#$Jr~>->`lbyqDijK2v)O6U&_rV+6B844)19l7k+SU2;3=iRvQZV$$m(^ynJwxG zi1`!*;gnEckDgqrhsC0zkt|t&oMY$j4TRs z_0``2Oe!#{=#S{nuK&S*2R>1mua&63+|Pf{8?UP<4R93qZwk@dw0GthJ=TZM)QEG- zGKNe0pnZ*{0i{7hQ##9$!~Hz>s#nu&NSCZVN87fIRWZnDAu7ufxvtB59}g^A|2OyC zq}QBv7LARK*s&Onf%c*L5itiBgQz7Vs z*3)}nMd?Rn1giC;G$7UbN5;HJ4bW`*5bZNqNzXrO?P~p{=GZ8-rr_8Jv^7KigrdFG z)B#=91V=_So#lvsXfmx)^{B%HB$G)qu&83Tqq&S|Hk+mI(4la@)>@#2LIKY$Q7V~K zJ6dDeHcmO(8JNJp{JE}+=elJR=u#+5)}#-FhO$y8=wljC`C2e5Q!pcvAPB--oYHg^ zvz25DXy3iN=Ej@~o;Sj#O*gS+%iWAcsyx4bR7PMn{Xn;WBYDM=*JPbbKML)+^rJLk z)%sBzz-s-d&1ZD~|IFJd-J(#+6rTrZODTL`u_|fK$uyf0^O+U^MUCDsWNd5)vh}SIO-VSPeqe-_ z(g@Cfryqq0olE~G`ZA7;y{VQv~}56afJjxMF@{Q4{9{a;TVRZga#-IW70sWx-@ zrd1~W{H<2g^)uPxqqQR278sw}%P;|CG8yvud^ppQ>1t}Cf`vlCoK#MY2j;V0=4*0t zGBk6x@6RZI6qIQSrtI`R56?6GKz-k@O9V83h-L-@qJq@B=Xv3=Al)9ARVl$F2*Sy5 z(gyUyzOU7VxlRp)<};hmLm~l(4+BIt0105#zT8 z&*D@2wTyrdxMb})GxURqWA$L9#>Pf}#>dA)6V`k1tD5zHc-^YjWwWxAPB-Y8!@1QaOP6qA)|sI2!bF8g0KK$Km|cN5ClOG zgh&wsDhPrg2!bF)iWpEq5ClOG1R+wyfC_>j2!bF8k@9~CX%@Ap-(S@L0000JJTHb{akzc&b=rk;ST_eyslU z^?%=ftG@jDZMEkR#o6kv`tYxJtDA%9)K_=a`|awcXX*Mh{fUWx5?6QC55Lf86NevG zH(Elh?yAk|rVTW3tnR8$s~gRRj@4cD@%G_&6($LF?}B|kfV_P@8NGZ-$7tY? zchH2@u5I(E4Bn7`O&szby0Up6UD@r+?8ocY-rk;nGjS)ju6rh(_uRxL5(BcNX&{@# za@`v73qtR%25xSj{gzc07(J6JFux&7R>tAYjDJvAVEThhf#F(ca8|#W-4}fYW?w`K ztnQq7JCi$SitO#2DKb`qvu|ds1ZPW(mEdfNvBNR-LCl+f*?ZAfVDd$zz-n(O4)kV5 zpVbxEe3mFMIf~hHcr%mF>IzIgOO%+Lg4nKhdk%(z^23j*s>G1&L2t5M)n+zzmo@2>hr~{ zgP43#p)HC1i&b)f;wziaaJ3h;qx-xon8Gl&ZGOG@{=h~rEx?CoNBg?(d`pER;6o7p9XoEtFhOsP}owP>gk=#;~UV6w#BwK?1On&IqNx z?nMJ|=3L(NE=BKBbyscQ-EJNohn^(pBR4K3V81+~*J%3DlhtYj%I%)e7 zPtcryZi?vq<}BzC6f_9Vs3(n2&y!v+Xny~sQ#O;e`gLU}Q3s_`V@ymX_pYwr-H5ce9Zr_01s35#mZ;5thsg&LQ|n_A;G(^N^=K6>6;Vrgt(*a} z$U&_9_iO$XPFz0v4PwQ1_1=xDe{J)B5G!D0yP`;F+s;Fqrn)gm>;1w4b>)Qe;8T7NPb^kiPORlI1pin=WJf=PC@mR7teJYm`}h4^=Nq)NbPDY%1%y7w< zSQA}jNhGUdLhi#eF9wRxJ#$*0--1B;z^QD19-Kpu)jivMx)yup^yeQxW0Oh+A`zc& ze|i>Zu{tC6%&B+z+V>2TeFYnT5BfNe*aj$uCKx7!Dw!mPvAaKs z;d=V46=OApT?Jk2NetH@)&(RVJEO>Lm&9;wr0Y|GvEW6L#4yx?OJW%8z$Gz^HsF#w z0O2^fBlvui0*wP9@82WZ8yh|TqBdiT-_&NZ`A{;0fp@hT4aBq=4ZN-GMYB_s&qXd^ z4ZMYb%l*n0|92Ppk3$%Vz=57!5_Erd%)fAt)3Ig`xO! zX3q{Wp~f~zCHXziV?VD;e@v{re^037%kN2^d~>;~t1F?tU{_Xs_0?ZJeGw7yu9EKo z9lpDkbUOXeW3`D7?ZvlFIPdq_&xOMI`=(zE)mLAA=lUWd;%!9-(Ds^pY`gytK>jvw za2NpJ^|y_Go6?NmXCDoPIdtfKI(F=|0VdT~U;S0l7ZDNfD>^(5f8SjTYt}z9d|sY? zgW#Tn**kUI+taphoWW@r39yD6PfUw!pgL0?2fyszjEXdv7| zAlw4Lr8VpGj~_mK7=UOr3P9i2y}Z=6&Fm?-Q>REI5`aUyFY2qWzH@yM5%IL51L(%V zK|)hgk38Pr-%m6ef2F^_AAs)t?-|_z9U2?8dV2Z*I1n4BXVH7n)K_2qC%Z2qBHmZl zhmib!e|{(Q_ba1zZunfh1L}l$JkEG`wizD0B{+yfA{wtV>_WEBUenNf7DlBeV6q`M8vy_eh4X% zTCkG9=SM!aKk5CJKvx&N0|T5q`YO*q_?eSOn;H7@Iso6tr>nf&td1Q!?Y(7ygZEPnXO1~}Hx04FA>JJcj-?et-58 z^9EhJmg3BJf5*XwefvHz+RpdS90v>bz3EV2$M34+udi*hlk*pi3}J3Oei0Foa#^$K zOj$p;wRw~MS7#@4uIif_1Pc2m2av*kaz0~p09vXKW}gE$J^!ZLg?$kbk(F4{02-Q_Vwj~* zwQn38tjL1OmC5`|Bod*qv61G3jWWVH)#k4^M9tf zxuT0IM?4;9WaJ75VtxDyB-0sd!0)rW41FbFf3d!aoxoy!6GP~7{der`Bb-IcCpwRqnxzyBusA|m2#We=d!H)gG^&6{i>KYTXL%|T5K+`bK9>;p&u7cN|2 zcp_%Cw}$M~8#Ztb*p9i=u%-IdUV~eY-_&V%w;sPKtGzEGBHp&59nk3;vlhU7?taCW ze^b8UiI|nUt@r!vNx#o-N@uL(e5rr=5__?)jYWQ?(-$Yw|=ldce;(cXb2UJ9)(sUhA5s}r& zlRKayA|fKfC?hLdMnWPx>tscUNGa>2vXdlxJju?=N@QkN$WAy1*?VQCV{eY_ z9A`X#PxXGiKd;aC_x=8HI$gTR^Zq!G`@G(72RF<((8cstfb?OUpbl_74SQ?H@$e`X z@F#X6Kw_;YgHv&7MZq)Nn1jpk1fTK5UH6)YzlGJ_xsac-K3$`c zA97L?_JP<&c1Aih|5WSki+%Mr1`|tLvP8>CC)t60@n5*ogEx;ZC`KuIkXN*x9b_J4 z92}(OKe~|ea7K7HJT7jF7nr8wjcL%HqvGr&&pC77rAISS$mQ+L^X(1-E*&?|Ydsfm zA<;VD?jjKJg1f`d<*GeqrQRg!SWPQ=DfHXCLkJlE33{68Q3>5c z2(sn-FP*S5<2!v@n22e?D90Ls;MI^kA*&hz+DEMKVuGh%-VSSyfmcjRHcgS+GWxcj zx7H}T$u<~#r$r=B3)|APe9nJt*DMru?WnTXM=zYaUP>>P)Gop5?z~SB z79PEodAPxlJ`nOysyrEIsPsq!*IkO5jh@y=|O9p+(-H2 zn@n0W;d4g;VTJJ?h#eivp?{Q;{)F(s4vOfG@#QQcO;rcFGH!_m(1Z+I0ESXt)k z*0SBR9js-NscM+;9X&Sx^xhO+tm5c*wL$L-OvQH;V}3LB0x+X|l>gPu-uRNDfBumE zc(a42g;33SBTH3U(0KzXikJ~9vfKAwmgZkA%UZow4sz#zch(cT`ssn5;vSk!)c#Nx zY-BDtPZLZN*}WCg8d9^PX{~121Tcs5)>8C7W11dGs^eE^fF{CZ*2!PV1YyEol zlWMr{%a!ZC&!LwC^s=!txI}LFIL_zog9UDZ{O^ts8hD}hOPO}#!`i{cv`01P+C(x+<=CEGigRzP^()jckey++ zflJeJK76H+<2J9?sOc=g2wd?<5)|`DS`;%G@x3QYb+1oLG7m5%*_Yla7xSWCiPf{P z4tkL~`#RsVxjU+)TvcR#yQt{%GkPN`gK?%BMgbR-i5m?uQIFp6eA!(W;TSJSW|VDB zBDWs%ily^QKRS(j?9x1^rV!|IExqx8I|_QHW?jPV z=jgF@*jLjht9yK|TPBtto!Z_cw~en^k~{Yxme>7-tvyFVzjoQ`=Kfa0`mg(`*qR-9 z1rLC*MFF5Wp3Z6RJKT-z6aSZ>2NYosC`h5#DdBB?ZgduxN(606{K2bWPTIZ86K^jp)1VCRr}f9b zXrJjcO5+@g$iHkR)Mb=rA6{u`K9sA?z$6?CZ3fu3WCDE~8zLb0_ z$ynX`w7QY8#Z&tp*jnp4UOGDJ?m1puPo_IcCpN??8Oaldx^z&h;uhaqS|eH0^Wbm` zE-wP14TpkLp=5yMV@29SFca7Z))Wb0JU9twTz(C+4%!sZ9A;gF-b(h+3WUOS=aFvY zI=)W-;W+wMOy{jyTrau(e~?bO0Dz&3VH6QP3^ocE$a2Rry_6#?c%> zUw7d``r;d`orPhCB+pd6GqVZGZ2SC?z`*2IZ*T92vpbsky-eAmYn5sA@Fkc0{DS!g zTdNCg*bW-C$1V*m#^}DS=W8`jvtq9RxDRhe*WLxf69Gd4WZfjOWT$#G{`7 z2E67biJCi+yW*d~=EeRpg2h~oMW=h;l@~9a9A$Hssrv{tVEI|=?LEA-35khcM^^Su~YSnJN-)&{{6fCH0owd$Y;ccHRz8M zD_~xzZ&N4)W_Z&;Av%$}GyC%$VPmGj@gvvC%!@Su`WU7_oL&JhW9zDsj(C?Eq$4rs z4rnn38^c&n!bGQ!k<$o}Ho>X_m_UP;c^rh~P9%@-7(Q~QKp_B7d-Dt}E;CGWX~Z5u zCiFfv_04c=m9aqI;|OY#>ID1N$ncexsNAT&`?~SnKUmcy6cwkMYd947+aFSqsAnmarFtYc&|{JI$?_CL+D{ge!Yj#8^F$PZR+3k%VW`Agrx|^8*=zO(jL<$wSHSOw-nFe<+0 z4VE~4vuFf+&0o#s8b}-G@#W)Pe3h)eU*(2a9eK(BK8+7<`H|amz|Ilyg-sDj)Y|9< z1LU)2-JHOWm=Nr;@0KPQf@N*-=ta3 zq{T??0Nrz_QeyYqpRf=*WGxE)K6O|yXh-6;Nr&C+e>;hUk#t zrJ-s})ZCsIVoTc><0JcZO9V)wHln6de|6zwg46}ByLp<9)1iZ6#QptBL!F9<=d!oC zH>CKM?@|q36F2=p!YM-CXjK+Mzti^E=l*S_^t87+d5<}NNeED#YUaJ6N&9sfhsg*N z67+w}W0Hc=#7-&ge+EC|Bj@Ut(BJX3OYk=YSBdYfrT0JIH1OIq7`fOB$c8#$_|1tr zvzbBH?hsFJTkLsQ5Y6{sEQ>(!I&%GZnH?#Ov&|hl;<2(LPArB+ERO?}bFp?<(P-c% zMIX}OPb9Tlv>6iyB4Ba+9`8LfobxT5*y|Vu_e>iN`(;T7yPlp>7ecR|N17JDPNyE7 zl%~*W9ebuuA4?$sFo^_fQ%>CJdX`I`qbGc~s{(f+VGf6Q*u^^Qm`Bx2zv|US%5o~V zWlt%XK3MgRh(7~y2c3fQ9t0SO)-(T{Yn*t?zY}ROXM%rq+pi0L|xznn8&aBZ)QPGhSj@*Z5Tvj`zoWnR zFpT$O?=X91mdv(v@S!+Q=5LJc5bGEai`Q*$zXo!j)`6P z85@I`t-{M0nODEamLSt-Yb1@L0OYZFB$Q+5&cnb*)KeFO<@w(Bn*TPomOX2qM)x5F z-|i7wP2Jhle>Zs9OISz&V1?NR|9Erz^A)=3wZgTIhtbJ%_S5&npI%DuEv-ClprMPc z?2GA?#5&Iu*ITyPOJ^ ziGuw1|C^7$XWQaq`juuZl4<;?h!Vg%q$F18nt3A9A96kM*F0LJ(ZlPnE`FseqqWai z5Qcdt-tvFMq8%&$K&YG&uOBEFkD**_+Edy)TRfja!_{j_b&)>8-dNEmn=wrcU=aIR zq5pkRASZ>PZlv@X9`gM)_`R~ zO8>;P@7N(aII~$^&3A0kxfvw}@?nYuvkvv|USw=&UMal<-)IV&xU83cV@kxAkIcnD z&db6>MUmc=5@wS_(wZsNFtfqrvC&8!xUUpE8vN)`*#4Xp zR``Rl1_U_yQNmrgZxcR*L!KoPR*-s7{e;=!?^74w91p+YNVg;+#GU z9+Tpowj*;I#e)C_LUPkzN3J6bvL_vXs(|HGsf`EuNnx_ar=&1NuGztj36^H5?wCO_ zzE7Sx>+sQ<&}zfXY|MN;ctbILOuf58x~(w-%T=W!=+#llujp z9wpSFaS$}x6FPeQf>I(PGl%M;1}-ox&iL~^_UM~aXm^JPj?>gh-c%Vf!42;goJzZU zTt6jIN3UFo$rZqomC=@CFGs=O0{6W~0aaqi&fi1_?D2#XRKpJ!a|RrM^3S^Sc?_oW zUc_1b?Lf>AGa|(gWCfA($3Mrk*yH*AHweY2h+Z$#2&j)3>%IPjpnbS3XbJsF@z>&; z=h)|f=?)?PO~*9ki$DYXRmKl^!e&D`xu%55;$T z;Jl~04dl^(F9i7i-N+awFA=MzNhnc{P!L|^F5r2kA4!njn@kk@Upyj@Uq=7>vQvVe^7Ll(yC}<<&v`UC73rrtV~H_TI8$=*22h(eknK z;kc5W1ViS!bPBL2jA!ZOdLcXItS&6+m(jik*f5%y*g9e?B}lGfQ@d)ls}A6vs{q?^ z-S`gmBX*(}hU%3~Q_YRaY1808KMXZ{?SUsLlpRQ12VE|MIbWdk+yC1z8V2_%YTAvD zWjZC?nB1`WFf}(bS3H$i^m8*~=z-S@YuZLHqL!H7FVYQLE{FS-`aE~ieQkEVWfKWs zXO9wiaC04VQ)sPTq#oWM*puoz?w^}L-->#^L)j0TcdfKo5g~K3{b~1V<9&FGxK07t zM4}OqdX{w=T~Cab2F4cqWr!4Df!T!@&Iwt~$H*xWAYfv`|uDk>1vq681iBe}uf=s<#^$p5YDIrIv z{;dT)_YZ)IaPOT~`x6&@>McrF(sLlgA-{&Fj7C+HS6*RQYFdpGPN#L|K`9DgYNP$v zvOliJ)hhXJz6Y%^TD`!p16V!2&ig4E!;r%Qu6)oJS67fETFiSKbnuG<^H8Jvx1q9F z2cC9;*M0)5_%XR3zmN?&z^d7i{h*@a+Qa){t;wr*Z&^$gu@L-E@%5ekJ3} zjMsZ*&5wTIg6hl7JPJ|WOXPkvKJn$4gHRW{Qm4_nX5SaqG1!Me6;(Mj^L0y5sB+_B zb-tnq^ps`U$h*UN_`_J(RNwm7y;#M7bap{Sk^Jnt32eGb-%meEpDnytxvD7Rn-f!7 zbyILV#E(s2`+6JZkWCio{kDoy`H|12Ok9w?YOy!gR{YgIJe?uIluRu$CdR~yz}hC> zhVsI4ctHUQwcCRwU=Ez9Wd;&xa#`Y@P4N!>rstN!=l*ccoVGvH;nEVeGYX4h2c>NcFgwa; zh?C#gizr0hwe4IrsCUFq!wB^m+fct5Lk6D0$S=XEiBx0Y6GNib1CVLiIY_T^QOy&$7CGkoBv&uZ|#_;CY5sI2F^(laATO8hh$l zA++uck953=2z2bcZ5|IotN^&cdi*17#IC}6HV=VqZRI`qX%0*J#rq2S0*1-jqqu+J`HlX9Nu^kJ<~ zXTjR#?yewF*AT3S>8^v~MM|*YJokmKiR3YMb1MjNu;TS4uL2k-r_3&*UaCFzJ#LKsmByqpsif<{O}H8jpfG|v z&@goK-Jc{3z8?YO#K3k9&~LjG9kPSS#`RU&T;F*3*eD?JFyiLxJF`ARAF`M74lLd+`S=lezh8$*~n%)Yzq7G8tlI7t6yA+PD-qWr5V+HcVE_j_luoi3X~iO-H{gpMu-tacu@lIaCnqaej(T4*t`k-N~YihbDJYG3|MjqMO;XmOX8b()>$-y7_IWRYF-`#=kE}; z9)b;1Ag9n9Q(?8HrD6Z(nh;NQk!5l!A+h|cT1s; zAde{7iR{CVx2fQ2&4j!DV4jn5xD3xH_!z*SW7n1a42eJPf!+px2QPMDWF0I_1`Wrc zNxAMIt6;Bl1N&IV@%fjnLtn&%VIH!2(oPY$LflXj%V0>$WY)?64|>0@$EX_OmC~Rq z`?zVY<E}+mCLv5i_uWi<`mc4bCJ~Y)TTvyCC$V`UL5km}^HG2^`HlL`Ye|ST z-C+8Tl}!4t5+;ka96mk$sSjiI(~-Gp7KJVjg9Utodlf3lnNy1!ItPuNgO*s2VXW@e zG0{&*r7x5wOLNOM!&7~Mz3LASImY$}{O)Ara)uBU)3x3!7pjOicy84$A8(N$j^ea1 zO|HwwxBDnd&4ts51>AuDH}pQ*Zy~OERZAHx8Lk`6T;Ih(t=Sf07?|NVp(*fyDAuZ$ z#s8h@+JZB%gLK4Md-6@G`wLG&L-?D37YmcM_-#}#uT&8|l2no6?dmF(B-g(;mv;dox|yGU zI;6=)ET%$TEyOJ6>Z+kBdu|an1pDp;h7s~}8o1OZd+}mL=uNjU=VT#4zUc{^Si9jB z;19^%*Aqp@a*s6C4!W218~Est}*EurY3&f0p;)_UL&O^F=Y&2;H|<$f2o*=?QsHevw9 z0Qe{N?J4KJE!w9%&Gy0xM6AIh@VG&s=nqteY8e5Vxmy1-b3F#?Y`+Y1=Y*tC-$jfm z@bUAr53`+1Ql@c|O(K3()|V9(!(Uet9-p97$X^w3XIp_zqE+6$Ui8x`!!!ixf_!M| z;q!T~yubX=ldFm-gqe>9GS^7Fw3aW}uJ^KSgtQLY_ZTU#@X`_o%pc5H#2VZDH*ius=S8}y$GIuw5c|Awcrx~V$9 z?5Jc=Ilr9COqHL1KBqR0EP(48%PD%h;>onLqR^a6g(N42>;v$dSl4I&C*q}>Q~zfuxa0S!p3wM`*o&A%D6UG)BhTuRFrlSDw0!sHRBfIEZ7ZZ zRcx0_`QIw@ssFx+Is@D}hFWhq1l{T)6Q2WTe6Mh`h&G zE~CEdq8>i`?%&@8e3nzI46TZOTggJI(XQ~eRXjdy!}a*qvMI=j-)S@uCyi!DePhs9 zD2p(x{qke#nQZTma-THGs^Yz0S~tHi{w9Uhr9BrnC4(2=pGtGP{h721!)0q_zK3Q+ z$$&%KjH_wmNCSNNChFxW4ZeGkAwBiKp5WEh-nL_YIDj7yfKq|~*);rT-|_SBzJmd` zyh*wt(6DuTNP$4j+4B2RMJ$svd)^Rc%vtt&gE{HN?HDRpdUDeq%mKgf#m@bmbgkC; zM>X6pMa%RKFZaWgw4bR^HpuN29-uxi?8GXM*5{o*Wg7kB-EB3IBx+Uq8?UHD0JU7& z+*|o;3*^gU#p^79w|DBz9Max=FGS)@id%(R_|}fp*ncpq?hhyzsqA!@!NPk=mkylM z19C-OE+C#olf=doa4q6t0C+4O_RoR=>e0U+K#i7bG`xlAwcI9{H~c%7vErTxqD5C_ z+Fx&f!s*z@07$Nr6QP4YQ2=!8jg2$dvmg7_HI1cbs5;&*lotQ8Szdle1&ZLHMgyH{ zsmF-^GI{jQgD~rIEf?afRlJ^S+CJ*DQq}j~-Jwn<|6inf3P|^0oe$z%9KUlh29^uX04KkQTFuIW(TI*re8ex5T=}*l50Bd(1~Sj60K|#)FA2*fTs18u5@< zPL9ZmOp3GIMCq^qjP`X^l)m9N1BT<4gY6cDqG9HT;^ttM7P0tQy9RVf5Z~Qo5J5&H z{7r^1?!TwZjK8{x+O*6rPH$K#UCL6{E*Ww>tCiPd$S1PK;P41pG(I8Yjru*f5&m_Z zb|z~VCbF76{=4HNrs2`@^g6Vu9AX{xS-%e0f24c53&~QS0PWBH#S{HbE^q=sWQZ}0emP{OtgKZPcA)+z#k%y~| z7U6*j+;HK!|Ks4px%=-#s7RUNOSHi(tuRz*+U@&T^RV!-HiM>?Ng}U*+$%9tmd9 zQ^uG3ByZF{%{Hq4W+~TwZSUi|cL6|Yj(+Coz*)7?YK~v74lD-L(y1JueXjJHUsS)c-=L z^d`kdaLYMo8%PuR*%V$|2)dUsq2yb=!6#x2h- zciLwD4p*q(#Gqb*YDEyRfeF71z!Y81vid04C0h;c0HKNV8QG;g4dGTIQRS@)>uoBl z=A~t6g{n%)H)vP6*x%P>S6pN)Vgd0Tl<3I`=a)NqHz5aEU4$8c z0W0)px{s7j@z&K|Y-^Vno-T*VQN}vF6YujASp9duR`pN61`dldD~SW}A=P+~{D+Uv z3$mnRpO;$14(X~!m68@Gp2-5DWh=7Z`;^z|y>lG#^-_yBQ^4`LAp6T3XFIYv68XI#c>aRed|JhGk@`{E%m&h-N~g+H z`4#yWvz}bv?JnjMI_<;bMb6u%LxfuC5eFI98;+-tPOk>9K@hwIz$OPmt3J)`ZeegR zj^Pl_x*Hg4zK9Q@@rAnobBN_C!sq)U#-hyljc%Z015OTYRy6nF`dC-T|2A#4fA{i{ zlgNoX8$Zd`d@dd|yq)errZ?~&bH4DYYmyRw)^46SYF=0SV^lw3x*@=OUpxhYU@fm; z1Lr~E#b=2VA@~=^ zly1a$q|nI%BN|wG8htXVITfv{zD&c!ivEYnqvhiFSg&p`EOrwviC_6IUjI9eG2(wO z78wxr4UQaVfEM!*+fsB{65=fG$m}bbjl;D6Yoxh3L|Z z#o|)9^>QF=3y8MN+>Hd+oSw7;hpXrj9zrCu${v8}Ra#;e0VMnup$=KX)SHY_g zC?|wPz@j{Gpd4~<7BOV;{Z+)@or2d&cG$6ZTTZM>SKV*_lF~{vZXoFbXzM@2?58}> z>c1{(Uhi2}T6yc_PG{g6;C$bS>L3~(N`N42;tAugYdb<=92hTE4sH+uQ>36JKstgYk7>Nyg{cEH%dj=ba!9K>4eRvB!~~}YD}w2@FESYMGRm>c!YQEbxb+HDyZ-XMS|U%_F2r!I z?htAa{xS#K#TI)%+?5G)sh?A#diryv_EUg%M_;hj%xSe)01bcdB(#^(ZtLyN8Kd?^ zYWLHg3l@v*BS^;XBhN7o4o{5=I2hpc= z7+4Wc@6hat7lJO!f7v$n7&f%@E`ZfFDcoGcgbm=?qcOT>zG zAbI_va~(hr{6od~;h+|@UKmB{;(tBiHSZWLvGehwHL`S5fqfjwdioY$ku%bJgDwi$ z+Idxs!-L4kmiBZLrp-oyqay>qe0v5`J_Pq#Vm7EJDd#uu)M=lsE4can8f}14mxfzp zhEQ*isxTluXjeWeoqF3B<;+1E3$xvM;@m%{)!lqvQ=7_1-(lU0JK*iOJ$ar?)|uvk zs5YS(>C1h{3;s~+z5kDyIgpukf6dHZCHeji?Kk{={fc~&>bAjS{IbDSuIrZKl3RG8 zm-~`ihdegK9|J@hhUoiGXo>Hv06WfPJ7GH0nm+Ymd%0e2MaIyJ>;qO*R^bo(H0wD# zwrEy^QRgE@sF}TdjHoKKv;{bugFT0S>?tR{x%nkYvM-q}t^I7{hd75kW=nk!h{2U_ z;}+rXi0$c6Z7zWV0W3KH%)6klr(*}~6auE)23;m5co*7IpU!?D4geDa7+$RHQH`;$ z%K{#XOF16g^Yn8u5|F);@|}|ay`&QFDu-y|!=9;6sP5FWkLP#2yB;#BXHZo}QqB(4i zUTV80u=V!V<0H1D&h$E}7*prEj47eCG{pUinN%w#mdL5dO)E3l>H5 zyFH;m6r|GHQ7?YtOLtnW4QI5mdx@@J-chR&>5PxZ92JAWf5I1b=>T|olAIM=GGCDh zNybI!J>_F`5pcQSjGK$K+#O{j`RX!tY9rjkG&d3A4@_ry?@%W;N8XI78r`Yb< zQns~!jizvXjb;J(f*8jjbW&Fg=^W3)YOkSUD8j5R#1eI^XrpRW&j!=mIO|?&pgxt0 zp10zpIJY7pa8^Bd)KhYnN>GC;ZXB00sPKlJ)gqGaHp`%nz+`{1B+f}Kc%S~`;#a%8 zJ31GGqte;ZcbebqiUV){=rUs!{}STDG0;#P@>ulw6JPz$)kj2qXyHew&1j0difPp6 z3RmV-Q%24BWP~l_>~4f)*J|nDbxzk&-lRXx*g?S;P9P0r${JWIrKpsRBME7|O4{9+ zGpH?0KWNo$s%aa3refprb@SpxHNLxJ)F=9v6M+=r9|JnZK!*P@U{7jtRdsMa7zP_w znN)7_h=j#8MK}@+wx>stN-oi*RW_xA;js4Z*L=&oiu1gZ_CF+^%B`Dg49@0CQz}hK z%y`AE3=9~n;vZ`17R{xQ<|WkRC-d4fe#^@KuyeWYmd!hWe?t9z2vowRINyK7cQ=YR zBhUWVn7_Q-Vjaayyz`3Wb5a`h^(LMROXMgqq6UR{$pNg%!wig{g8<#(qI0W)=wYcF zb-aF*UsITscEv(J{Xpvd&$CCtd1E5fG7MnU2T9ZZ#31C8oYtk5=wnM#C)(bP9=(frn~Fh3 z|51?hgW5 zG_y#wx(W3x*zD|=M}MLc{VS{er>-3w!`A-PwRt*C%5AAw^maDM`knfcZnh>Kp`K^+{r`W5)0!b+I*ft|Tl#4!B(t4^box)Va*qj$S%n~{IiNXNHd{n$TErJqvlHJk$EI~EW6I|u?EI0)2roiH7a zdqnkN(qEIz3u*e2O)$PMXNWIm4W7RE=UNTS=X5U)s?}KbM6e?0XD-g^+Auw6KE*ldGC)Vxs9!<+-JeN$&h3y9NFu zM~Ai(4kz0QXuSJZsPGSJa1aytkpV2cZ?oArVhtqE1It*vaY zRi{AEZU zW<1RrQUZcFfJZd!55;LYp*V6~c%lC}H)q6+aXExnnb2W&7BdxF9oHjHmN>7_{T>?B zRjVP>lw8x-OoJU?HFTnHWEndOjBhbA#JOfANd}UWBuaM2$78;8p^p425YJ5qL(7$YRkzBbyS*%4O-fslU*u-dauCdr&G;IcvhGh70elO8e)=?<`Lw_BZ= zv(F&R{&yt$EAfeLbX2fa#ir9s#B^Al&r_eYbJ6G{xt#s>(MK{HSw)eb-qj>;&!2IT zc)gPUV>ag%6{C%%W?$ktr>!_zT}xSiB!KT80+9cx#UNxpZ}cbZ7XDY*8Ga#qOmx5j z{O-tzbMyMz^`%1Rg`d5BefcnxCBksiF4&BEukJY=nKKu?^%263OMRu|;a8tW&o1mf z6;MdIMLAgLF8%R&vH*jaTi4Ap(GwXSBUGY_+Ogs}J9*k-k%tRc6z zs-9+rOrjzPT?;)2wGIjOyK=Ocl5UhLCg>RudJcss>@94#K^3ib{uBK`R`Yn^T~iJr zffP%7=}XN(CRX_6{)Us9#@L3Il;kr(ci!L|-rQ=AY7#h&%23{LuJ`)7?<-|>qvtNa ziW|-mL(seMp1L?>wGs(M@BcM;<7ViT@bk;|vOQ+{A(vjRK&4X@aWcQ2+WxdxRo3DW zas4bNXb5D@{6e-3d{6E_d+tv;J$m%L8In6F{DdXXvGd%p*W?eUC26~|d<_bIbf85> z@QnyeI_-OgXH3$k_KXZNX)evhEvGesEC{2GEi?z-Zhu^XrPERNj_S~v^4acn!{d=! zV}|N;DleEIIf!@`X!I{v=RZ+@A`NE%I{HxD)7Y;U-q1d}U+sQ+D%Q`#;k|E(4Wh3< zSF0bj$0753FXzB`GFJfI&*SCn5o|sm`vE^KSF(c@GUX~QKLDQG{^&5R=oQq`e>J*d zwPt-47yAkCw3UnIktRkD19QJ|?w5nULh6YzM*@f9U}tO_Hk@)rvpb@q`+GUyAB^@Q z53W>8)arj@L-8fZF8ziok?I>E&0OWF)|UjNwN~TjKPu8sx#Mw8xGU@AZj(X7;{V6D zIiMWA_9urk6Vx?eEDoBB~R|H43E|tQ61BH}Xa}o?vhg`G7QQu!n>5G9_~OXu;Kd7FeIE3srt6 zNri)^`>>x#mtDmRhkgx0ixqX0EqbN&%k~K}uyBTjWnSmJ5Kyfr%^K10|5cj)Rha~dy@W$V=(ks^L$ho! zHEb(zP`#xb`$WXq_uvXR(s+P$$ z5!fDC>B>4Aa@!2<(ub=0b`^LFzt)~d3^XIoUj>g^WAhNW$n8bI_7QLnfxTC}u2?r1 z#walr3`YuJ2%>b`CC*-{a!3k?yDy%Q*@%3_o=Qs#l3=&{oypLncZS90Vm;Sp-oSPY z%1aDM^njt~%tiPGfn+@1V#veloi=2xdt}P0urE@rQ0+DEQ)gr#Ou1Ff z>CM{yS=@)uGyS~2nbQr*!StRP?Z?GaS27;lpuC-5kS|~Rk{V9k%q#G0BU{b&y$e0L zogR4u;bsu8F(zZ7meq2>744IKcTh=#9K^_>+DZvIbR570Urjz%1O9_nGwOX)!cc@QNQ&Fh4=TY9wtx8L5q5s^%%g!NUWNOMcGzG)w5^3Ddv~eq&?q`tBS*+NPU> z7a7kVv@ZEu=da~BUe7-XlXd{7@+u?~8)!0MC#$!>Q}O6}oI%8ph&SrPxm+XdU?y#f z&!9fu3Hw>E_hVJ_UjD}s_PkTgS#dLB3~Kb!NAyM?lisNBkFL8_hEDDq^UWE({P7uk zHCNzlkIe&S3bG2I|K-{B%>9iwt_)h)FME+saB?K8Bc$B9SM1~)UcK1_oQAJWjR&3< zUvNWhF`?5iCSq$J8X|)^*F(GK;Wb(bxH?h0%o6grC$^ zB59WKcw&Lcnb!fO(*cSGz?H8*1CkVNQ$9BpHBbl{=vaDo${*Y6`vlCCArF08pJgLrR?|uZ0P9= z-wJb;o0Wc$Wuf9wG;Z*+5m7OsVs8$P#{ zHciPdrZ}3z&jav}pNj_#R*tqmH{;jy7(LA~WFrnzas3n1I5<_)2XTLn%y0WHzmEsh zH-38fc!N6q;(2HFbHBCtkPsZiW+hN9p`5qhD8G>4pq8iEFyLQmV>Ky*zthb;R! zC@SaB6R#aI4KJw#?2EVv@!D0MVm*5bV%XpD)a{Xb!dV3jh^;w{PxGr(%b5_-L53SDuymxjK{KOewvSr0T za4xMxJINuewBNHHK8dA`J{v0-_J z5gw8()_hFy%Y$Onxw)BOD=$TtR3vQUH`Br-j@UkLyKWY&v$G(Q_A@@u%kwZaUxB9I zpY5voTXR%svZd()?Zvo^)eB_<&CbW$Z%mqKF8%_lP9X``F-y#zFPWRI-+!R6>EEug zBt_z{XSQm-SGa3U2r<)JSLo$xtqPs#W9#e`>@~?8zH+6>1d-*nSmSB#cdO!iT??0* zQBf3&{}T?S)3(Hk>)hVMckyxriY?r+ZBe>>YZa^^)OStu`KG@_r=d zJk?!s=jYGa3g}d;Oa-6GQvIOs-?Q7=ye6Zlb%Fd>S$UL@>BV)@5(@&m?%r2~=Dvw7 z;>S?hBPX&g#B#e-SCk05QW zuI_4}fp*e*ipNK6g8N}-=u3}iv}w7o!8Czau2kjcu+%Q5G)=jEtxEJ-Xwns6>I`S_ zf}6C(o>q7w=rxXmMGmjyY9_`D6lA6ukrABHE%yg?vh8~djg@2XbdAUT0oR*C6M)$h z2wa=fKO5W$zCNYa)vOqbvo4Fv3dI6-4T6+7upEZ$wpX`jTG$sS$?7QwBPhn(cgC4AvFuIpT2KUfA2- zERFR~-riv0Jzb~b>twRMXdvr37mD@sHf;RGBzOOGB+cut*X@3E&COSy0h?!R4D73w zzk#pq0hVPZ53zgSh~G8~+3`sg`RB|UPMaVooUu30o!Yv7F4K>_#JM>|*^_v>36dE+ zBD`zN{A8#sR+zSbMpi(zSDp8pEyI%I*J{D{il^795wm8uZ5{1Z7Pfpu&B6FA1!XBo zOh1gy7DWm>rh(J(gcYaz00VRV*p^IG>}YBxaaQDK4MvaQr8oPM?deh?!l#$?M`JPo zD)?mDeU&z#M$S3Ud!1i3DKr+5{&2f;w5O+!o$|Ry^3rcwaMvdv`@#9aQ$PL%5dVX@ zMCpiAJ9Z+3(XQBDn!Ts5zu@Na4;{g_%#0LGVa)-%7cZ>>r+d$70OoY3b@!Hrhw6nH zbzO_mra$J=Za6+jWgXOEGs`45rPA;7;tkKNkhc}l{r_mX%BZN`uPY@3NC?v1El4ZE z2uPRFY7n4cMXxPtE8K>{8`hP`La`3urY3C-I2J@Va@o3-8;zVT*Yt_=dr_IJCUIX;7 zloU>isNinqJx#ZvfyZIG$o!}yXyS%7>B1Js=a*;ylztQ;EBde&)-c+Cl;VTw9XVd@ z^x=?tLwqr&s0l>lt!6hU~rd-el#$BlNIc`szgEY+m0RPdCKO zVE1esx8p}}x~6n+c&vcm#VsuYxHyp-3P2r@YJwj`EU3=&7>zdCQL`-VUa%!pW)o;F z?ks4H6NH(j$K^!y!TIoLfpitJzx0O>*8A@4Sv2Q+(sI)?f!Y$~u6k!za{R+9L&?b((>O8DEGmBkHME>x8mT(|~C*}EK+&&@gx zFlKAO>UkV`{#n#Hr)Br&oa}!CgFb)taUQyH`SY@oer$WJRGV3r7czN2chUYC@-mr~ za_v}dI5vrtI;wQbJOM%{^-JV!*GbMNv{hPfBf2mKlO(}@KFnecXU{Tr7VjEgWdPTA zdoJIxPi+t)p@ML}ZFvi@G|9@(=*QY_3wLoQoG25I-)QkbUc4LW*p8sbaZLEbRefs9 zh~v=%)w!ijdoqILAHH0bH2$w%^6iVN(!tKfZxHtaK#o+I?;NR-7m=N$zs9*xEjJ(x4<+Rjcq?Iep^bICKt+gnLy!^VyF#qe zY>h1`Dfzw<&<$L(L8DxSBJ||yt;+D_rO1_k?!H|^BM&Id_ieDfee41^q04nEatY&x zulcl(shG!5W2G$kmdLu4O;h^JFL8K--f>=8|wmmPyvSjo#6 zd{{w*o;8QSds2Erb9>>MzRivbFsHQ)_lK{-cV>{x$qTQ8Rzs{?Cnnh}U5@M8&aXf8 zf`ujxSrj9Z?TQR514QU0nQG3W-(VM`Z)wr{!`T{>!qmqjn`;O0rnLdM?N9X)F#KoK z0Z{;2;(fDdvvlL)P5$NN{{45Ia=}N2qq0XH2`(GVCD|rpFB>gci29+vXDm(G)Qz)n zZJKD+mQw#};qtWDo0X4qd`k&Mq4a)fq#J(L@0p&+RLrLIf8D>?ZglhJ4>W+gJk*@X z`ZLI+)ok9oJ?lo-#9v^@%=9G6kor+YTKd_i2E8)Z*b34+F0{d_Nc@J zt|dBlTtWplMmRdIj4B-gXOK6zlXlC+k^A==e`{0q%NWZbBcbVuD(SKhX<^nl8GD3C zvz3s8%mj_Q0aRse@8Tkj=IdGm1AGZ#{U@jx@FXI^OxZ_8`gWAGY2EECf4rfwF{}*h z`bLz1fB=0>dwYAIzW#!iB{eJ*>j^jPeK#m$k+MDh7WQa7$D$0V$;yo)Go^u2i<};` zb7aMlbld{QTOO!6kqi7))Wckb9yV~z@)t&d(qBDkVBMWxS=lKuB18_anOQq1y4^)s zJ5WkrO@g=NQ0FrpTWgN}@YOT}Ov7qDypNHcoh#);Ij@{-9?gka`29Y!c|;e`&)KtP!R2hc7Wd$pE}+hBk6?a;k$srO!7>pAv{; zDn6CG;qL8rq?t3^x|I%YiZ!cdi4YupBP2{>^~I%Z|M0?5Tx+`b%ki)`da^zIWB)K) zblFvv%t9%_Ccb+K_~!B=Ig|*CEUfz;o2|TJycS&GsR8`3ZL^8Qj(vcKd5K zXx*%2a5#Y7XW0$cXO(w;SvT@*JTGkN%dH5*jREQ;1&sJK`~|UTg6PZdjFZ&Mn6yak z?36+mQy-s9CeUU*S}C8Mo!xU2M3eA1?{Z?~ExbxEFiksfi5Q@_g)Mx-m^*k8JpTk> za+d}_@Rr>!*RJ;bPTY)y{YIFzRr}cm2|QQ)0^HhdACrCkO8(X4#Yq(u@n;K>nV%bT zM%$j_MxTngYi*MvCv~<8-SNAiG0GD^X+uAV8OKgZsP3?EXZ2_$tI{+e&t|H<(R(i>;Z%yajt7s8X6vkQ;i1|auMQ}kb z_;MV$J#1y&GaGzTpo(PiZ)wacn;K_-5$Dr=KZhjfdqnV?)+ktbs@T!JY+j z-)CtNfw)tf(S~F^^5vq#oxlrmJK1$k)-WO*)Qg@k-D)A}{bv+@b6@y@b5BhQ zBBxfBOUUPMe82U~Ee0FK??byUa5POrQ!!23YHod?&>oF%@Vxeh-aCo{5i@aOBQIFB z(@!^@>Gy(Akb@V@8LOtI2e@qyJRN&d&@$CK2cbZU{N*`3!h4O8j}Tghf&`qqPfQkN z?C3ArJQfs{WM-z9C2d}PM>mOQoTB&YS=HGN?Swzuh=}vfV8=e{FY^Dnwu3 zC94KrlL5oVB@IY{2VMG-m@BBe?D<_L-s&Zx>j~XgC~ouh1{U;!90|P{dshKRWCBu@ zdw$;j->ZqLT!5y_FG4^QMU@j?G3SRR3J{*d(z_;-YX5cRo@yr@q}r>7GQq25enQOI z=5LETB_{vU8kY3>3>#eiED!SO8()OCywV_R;m6}_JGw>p9&xh}Bk?>8^V=F+ZD_Sg z`;<7U=|Gb>0yvk53GQbHs;3h_@eaz~2jO-Cz3AK=Ak254E2|TDWzYE$fy_Qc(NZM8 z=?I-pq+=^fIr`N=`GDn45Sm81c5_xF+>BW=hVjEEo}B6m2kxXi;ux`$X9mN&VaxT2y#qXx6FE5Tm&r z#vcka|3$beb)(#Y^JUIdu7=ciimKCav;eIjKkN6=ExD%3=0#bH;KqNn)F4s>NN%gBis{n$g zXK8h66SaG@nmL7vw~b7uq`yR&)P@6>6g_3q*Yd$9YkX&&sP=U-Xk!>j*iq+W8LHAm z_ZRQLkqcN{Y@-CErymRjcU*RghfhY(?OU}^AxSBM|2GY%r=13K;{qAi1mAeh7RQ*! zi~ASCNMJcz%uKshDH$H1)xx|F7!#1v*KRjRes&0)OWB47KiHxB0NA++@sGgkWu>zd zAC3u8py9o6{K;JQBjts}txiS~O-$i!;9GeQ?%>9Hu8CR<}{_?$)n7n9F z#n&c|nWe2{3bD33X#mKY& zeifLe77-2_?3p^#mA560xf!hQ$(4!NQ1ET$+PaonvX-2 z#zt7!RWA5RklK|$uYJLRx70sdpVoJk;)Qb**j3>Ku2hva*BUtW&gcqbDafDB(Q?$b zv=9#23TvBshks`>{9KePq|oQnQRL{IJA6rBL8fE_&M^OA6}ZZf7=MK8jQtk4(%e_!WtWg zh2oPSMcS`|gvsc5ysycx{H30U=j7xdme$&$o4mrI(Dqcr*`~U=-zX?5&PM0%CUSkB zbB^@^7cOLma=9-F@Ed1b8M2Xnut6Zlvqf`((_d0!zyE-|l#1*|h`aBaH=u2-lbCwq z>bLDpPKSWQ5a5ZJZAs8va@U3lt^W-;s*KY^yTfL zH54>j?_}PfWnJvv&e-n+qt!5Id=PrP0!f(977?O-5*(!EN89_?(h&-*B{B8bZ*5{R zdL_auN{UsOlPet1S_*>TDa!>`zWTWxw{74rfp0G`f#~EaMh^R7TrkAZG#{jp5&S5y zkg*3$KSb-OhV7Y6blkm;Fw^^L_-JPS(-lnwF9z>ufw#!0kE;E}4{99!hr4#z{MF{y z4a;vP_FV|Nug1pxIpVl}Uc61TDy{Hs4sql_OQ38dx zlHkL$Y)!ka6ZO;9vY_S?1swG>&a`j-)Ku4`L;JL3~n!HLizC}?!+r%4F1 zpBC-yBrLwP`{RQ#yzAZFNZejHc=0y=M7bRHyTNQtMkSvtu55mxO@81eE4QMskpuXz z%S74$2p-0V8_2#2Ieof#0>_`QNSZ1q#wyfk0JDvTUqr&IcCTSi^_G3qJ@QL?1w3pa zo5sbrb;v6Jf$g3U_8<@-btN@0d#&+Ir1up3l2=P9WA_cKfvL#Mr(0}Wj8V?94h6aa zVRsh!Mpb7!nF2Z3lyc}ZNV=a6u&eI*Zg?t;8&JLQ4rVJu<|q{Glq-1YEgeLECShsX zo_e*laF^MRJ>*?SJY&TMK^z7(6;DGe(er<7bHd zA=%?xf(65HCeXraG&;V~`U|hwOch`EKd*9rf?kNiSntu_Cp~*E{)d0$O0PwlQp4st zOnVzh9D8P)9-H|aB2Y)2erX?vyjE}Hd{vJP42)c6X#HixGal2>GLy1U#D23SR=l3? zlY=nuKjxQfRvT?xx4QpO&!y8`OnsX4y53Pos3KXSbocWRM+G1(^72{cV-RWa{3Fn1 z7e=R#zOJ6$@u(3CLa`$=JzaOj#DvgOtnDB#RX1Bec=e{s_o=|HsZ&fLGp%6RO zNbfMUauI!sayJ0y$uyC~F$*@~#{+AH{quuO=Q9@W`ypkjvu!)Sj>n z_}Lt{hl4HiIVYrdg2aL(Nr~+&h;jU4m@r}LxbY0}2w?6emVG_GP)jU|8sMEGMwo=J?>Ep%VLP?GHM!qDGx)$KT5I0X1Cvb>{@|#sy9< z6f1PQoA|FgDFlTI@kom63XH`=%~ibAnFX?|`;;`aYwTvX z+0Q@#*M!ouowjdDFDUwwI~Fd)A>rCE>@4mXeua9AG~5aEYt`~yJ~DzTc75ZHY_l$? z+H$QxS>O{IV8Z<+a@yvLa98kB%BUjee%H|sxXqcM#1^`u{ju&nasE@rExFfC+a7%K zkB7}15>C9@PHIJvSDA#AIR}qayeOyvy_7e=GFLqlt$W~w)jr_L*NjiHwl4Uj{T}b* zcI-!kS$6$p%2XqIupY7ve)hh$a&8}orog}nqhzcL?4ia|lC`%ghFkY0vcm$tb_nNK zhBBQlU5=C_uBjm+1u?YfY&JMf$&ulk0zHwN@AGb6=k3zsVg^d~94)c6U`<`zB6$IN zhEKw>pR{VVC>uh0ttEWgV5>S9C-WKWn-w9Ry@ytL zJTkAc%~#4f(vz!b3^X|>w!bF%(;5SX*-ktPitJaV)}Bf~9LiM1*t4qbQyd(lh6d~0 zhn~lwsws2m^6@_eJ=d(>DfIk>3ygnT9Ana&#BXtH*QY9hheLyLQ8z<|h#3#|V+M8O zrvS>Yr!rarz70@Dyec-W#iHShUNB7cZVx};&?-cyB5Fr?zLIYK#2-t%ehV;kF|JF9 zbuor$v!yB@x8D<4LwzVj*{B$370GShsJzM>U-7BgoWFds_R4%iK}Ii;Vc)gBe72uE#blWAgS$d)~sJS(tW1G~cdYntmsKfc7DD>%dD&)kHjvHhKk zL+RXE1s0wT?mdd=Ifu@k349)8bXz!6WTqIF>tvZTa}4pWY}&>Qi%bA`QZ>w`<(L1# zyG~4Q6{X-0ZARZX#}MuxClD^)2#GZ&ssUq%PqNuJc`YY!pRNZd1^{s;j*U`r?}V3W zS2%y0$JsO40FxlUV^HSEo4$U8I=NuSG;&2^{!~v8=Ckt;yNloL$5WaWsihG0#GZUb z#wr)K2H&EFI4RkP+yc7t&iNrhwFD6p#m4Ya#$J;g_MzV(X;rSXA#}4BVg#24#0}Ftgt{ zhUshKjSwb8y0HcxIuH8*Y(E2vm};4IC&wttYCoG1;cJ#nbb!9<900MQhwhV0VJHWCf*EUC)n5&Svwd{D!}Sf*^Om!-t8{~ z8sQ3#+i*xwz6#~YflW9z$8SbwKe28wc$GKwXFvygC{SUDtzp3K9FIWzrSui??CF#P z`?(yeBSb0L6Ck&5mgB8fZdX6|%QXJI7pdb!l!hIecmQ7KUE`~_Uct_0j!q+NZ~5eR zYn!^z_T{ax^x-)?9H$G}hhOc&uw!ylJdrDw>rD`0?th+U7dOJEhF=J4eq6jyIo8^b zHW-pAXd4;c!i4|+lQ6;yDAkS#)H z)F>N8n+yt`Kp0i;>OOP<2;~xC{e)H)@u<%}QfK}3nK_$p`@>Vn5#)##%wR@a1TQPcU1MY;ur+>^9i;IIu0KHrt*jZcW%`mFE|p zB&+9?r;%0a3kwU!?BUL5$d~tcu?3SPDVLxvU$#60cD-5~iWu(2sY1{%q=lT*)Q$MC z*v7`TgOANlFO0b+9DQ8racgJT4zeD+ht;kDbi$Zk^p%6YunD9@`>VBksl7H+LGqLW z#+Fr)M6>!5@x&yO+HPSbvXys(@s)pstaO}{!Pi&d$TS7&`a@qK&IxqDC2gZ=h|7}R zWdN;A<0}ESN$E$$X>7~b!6fEOVwH-DZSbz>uuz~a&Xd5njeSf)td&r{!R-! znSCe$Z!m86I1)Z79*?5L&)<;Ssr13^ds=#MAUWxF;9U!ieydTtY0(}O`RGQBJ!jH+Di5>Gj$ zMH`N;$ePs4L8}}aE?o;)dEymeiruME*k$=3vBiZwh7wtuSzn9?BwKl)5EvAbKI@|N z-H?~}fB(aZ?1RBy5mDART}?N|+uX2x`lu+JakF0+^ZkDI7*9T_tye{0 zSy`DcP=qDv5gac&UdPi*VQtB|9(R;#YajBj{ALU^U;A`sCV_q2e}E{`jK@fE94uM5 zp6pd%cEw5K)kR(xiN;cjBm#tz&3w2(6n##2&J?0IQ!Mu*=cJLUhIwKSQ*2PEE^% z?Ab$6B2V|AQDT!*S|dNB@VOu9pqg=Pr;&}Mwm7duCYw+jlqed;pu7D~SBxQ=(idZ* znW)40y$lm%-vB32+ZyO>dsII8Ibl&t0*1oY*tW5qdPCg5hQzO6~H_E`1l41Me`9<|uK@}O}Q zF$kSGa~kTwc7JC(LxzyQxeFgcS;eo-d5Zo>BqnITTO^>^{IWg$!5Lp!so_Y6>j{Qd8H_%rhbBGmXa z1Gx{Y+>(H6&HQHcKvG3qs^dymE`a0&Z|i7&dI|hxsvP7a!sR&Xoi_7?>w{@s?~1M4 z06Ogop66n+#W}?iQu6Kz>-r3Mb@;P%D9Jx`s5i+(Isd)Dsz62g)kk4rUs^gQOA+m%H_>m3y9~&HJCW+fvOO}$Cn>}l{!^|3A z_g&#eDT*BCx)`R?rk_6YJGK)7QTQbGJ?)H7(>f_&_UUO+dgL8i?rXm-exH=(YnS4Xt+?4!e9GF@|@d2X{AHKxTpmmAg9eB5v zJ1%U9ozHJ38ar!JOq+6kj$pU7rJOgc8>_B^yMm3xd3ND<|v+S}*943_Xglr`09~y_{$W@1KC_6)C zK~pjP#>bF6fZTzbz4;TfQ@c@c9fxn_mShI~(b;GH2XfodZH#y}Q15_bQb@$nu<7PJ%hWQj2I5h@Lyd$4>$ zy>a}8xLg(*W$1p}lANwnso7Q^HL47tFA@;_tdsi7G&~Jk{_M}W}WO_d{HifEk}(5ntkFR<}y|0+Et^^BFMlE|ao-Zfr|Gc=W$N6XDfRXw)yJ8F`-=X(>`wvfRHjKZ9BlGvu`I&<2VA7;bG z>i4GmLmJ9Og!Z=eE#U`SbWmu+Zny34!%#X{j%~s16YN5c{1-v~Y`kwm(g^Y&>4_u* zGj6CU8tR?d_#JJs56sxvYNbYr^L-o;iJYM9Z$`l{*c~U}qvVka_Byp^9Yw4`#+}_= zuITAMsxGG5M1B{|9C875_bZP<3r3L zq4t)UHNuT71{AE}#>N0R(vH?YHvod=AG4C~stpcGY5gV;;*RLfAXNobl`~%{^8Yij zAQkk<`>WtkjhFtf&E(4Ht+Q7kH=FEl&Bd3|#2F+?W22s{xA0D0gh?Rtp0<)L*?T7M z`@@rv@Lhm+{U&xcNrmHY=D>e+MAK|s^Vxs366!(lgjf}lDBr{`;cuu7IDxEb2UiNF zQt13mrZsvtQX#^hV0(E^4R%Ufe$teX$HI-G!x5#-*hb=bD)c?853$(UtRKf-de3eV24f}r z6qb}Y7h}vwF1rY_n^J9Dq#yY&b8W&t08z`hk{Iw}+a}nClLdHh5=g6FX)5Oc)5)(| z-)%X~-gDV21MZlSS7zW}Ho(~s!9P^sOY^02^@f>^64q+@15_t8VCWlyS2XhAr$k2o zf#=vyPMiiWJXtM1)rmoOTxAr;yn3n1ig-Iyomue1BEU~YdiSw2@Y4?3G*drIc+`gn?jN!>m5*!yv?Il_T_ z9RJOPu5XRrSt|{)`}Kd^m&b8axZ|qZiE&gl#VT4lO=0wKvRw1iTp*4sHYWVJj^b&rUvG&A2s<|;)Lmd}9$HJdh!fG14$3Jyk zQ3|2J)ald{Tkd4$Dg!6CrK~|^Rfc&BX0jCH5iadM>VY$|*p07+(s{V`&uOTPBty5l zc@?o3T6KgV>BV$P5|Bw|Tbz`L%2uoD^SkiWnI#b~A zLpvYHoQwCbui)2rhk!{cNn2cPk<=&Ft;!4_0_sO)Dp_;eP-X)!GUH8t2DzC2VbSLw zK~iP%sm_X=PMS3%8hCfs{hVN^u4oU6Zk8uyN$t6|J>bDgJR3r<)B4oeKxwiHN6g8t z!+Y*Zg~~QUN+K4v*LXZ76?3$3(;QCet_1(i#6VyA1UX3ZnJ%bc;otiFV-z^J2?k^W zyyN4jd{>kt!|qUR1;A9}?%n~{^s4bo%E@P5^crgMNbIP27+71Vt(p`r{K70?7eph16dKSbHG-L>a)wpvg@v%6 zI*#_HkV=}$d@z673JjdZh%H~k zHRAq`FRym`4(N;-T(i{i3IDY#(JFkgaiB!|ETcb#lsldrqt2Dtb{*k@fiSJ(Z(XN* z7;>>jW*WwzopBGhsGUkdF_zo&8+BV0eP8U?s8mkuwi@mkk)8U|Ng=Y&`lF{v&MDte zrv0{gy!m^>?noh!NNpDlkb+OnsmUcqWCvmRI8DMuD68Wf`YHRM*5vh2rfFy+A?oNp zw&~>nE3JqDvqX?#fe}PoRp-c-=P7cS`hz43UL#Ysnohc4UV33ILRwB=c0slLv zG$VGUkCWvHWhI9hW=}Y5aA=Dd(KkMuZ{uJ4F778RDN_7WPe-{3hd)kz5DjEJ zy8r9@qPYy}&3ToXB(r4}7olAk;U~?ndbW|U0e-k+E;R$d{quKD@$$1j#KTcG{X_70 z_=g)0u04uBYq1E}vhd;Kkp0cL)*}M@m@Q4J1aMtToYRuY&G`K2Zh~I7{>NJui>_Is zx53@XLf_KPSdZ&o@q1%!<?j|`xsp7z3L+-#i1iKNFd7qG` z(BQKG|3VW$1B%Zn$CoQ2@qVb=dF?Yv8-=P40~33=iGPN}VIwG&r-J%$Gc#n47@jBS zC1u!Swcn6Et-?njE>Nhe=z%_#?YZ60twgpO9E)e4i*_8uIAJ#@^VJpig0Fd~ctFo* znbIRC>57fHJ~BJPR}@!jUNk%n^6XzXtHN`|?vn$aN@GS?FIm5_rPFMilzULH$az7oYQnWBW9pL;j`41jq7pKAvnIWY~>ixEbgKbJXq;76NVPU(d zR5=6mHajimiX}Qtp9QJ~lB>6Gk>NW3ZFa$CS;WdzVIM=fj>_WZ;=sW-XLiAxxy0Iz z*>{SE1k^R3|c zoj13e2_@Z7M{$Ip$Vk>P9%NFO`Xm#5jw;J5pLkCRxUix2g@@E`#bbcOf47mnHf(Xkh0+zV$dI*Uf0l_~leJ0eWb`6Usz?*g!?D8EUw_wdaC{Kv1T z;*tgzKVGRRd>-qPp`wW_#&tOU(<0WDm@c)e7xWQ`o*U_S9)MA5Tr2chEPyjDR$Gm$ z^Gzrnny|wFXPlDm{RIaLpSL*rtgeQjA=cj7zwS^njCPmkR7JIvGpt(Lo1Q=g9kIvc zD&+G&HC#{hLRm#Ktn!Qq%}zrB9}WXyd`=tDPoJJeYs-7A|Fpag+wE0`sp%G^mwuT1 zNSdT^;g)f=i!(CkdP91z{_jh(^!Yv+8~BgfqH zSFblV=W|ZM z`zWN`zLl)PuKe@)l)6>BazvwRsMLL`UZRaWAvJ$>ZKBp}vGiCt=3WzJmTUZc{CLSD zvl?Xv|MTklWKOLUDRmtTSkoIi1cJK>FpHg-OX}z{?X5vytFdI?)$qP`eELVLDr;D! z1TRru-%q3iy983lmu6oeCtvqXCOYkVL3+W57gu1D*#b*W<2J7;m)j3aaUX0cE}?LC z?B4pZ2;&34fFBe&uhGd*6X({a0(nx%(sMush$l|Z|Hl*DNzqdYq|01<2~Y4EXWa>V z^XXykXIB4Ur0FL?@B1fV1+=-B3Xb6|=mlP6M~Wk@QDJs!uOOd2O_J~Q$O<{1RLx!( z6Bi32qfGQUswopJy(+hS^aDLbmLSu(%*|B&H3eA{8=cpI+?!H_PrDMA-xhI(y&uV$7fPA=`b1_ijIh$;doh(6FSji$Svc(8Iow}SSh}hR6bnJa zVCJF)ud-2(dy5Mi-;E#Ey)(AYh*#{E6N_<3BOA^8s6d4PUM!8O%5#y8NqR9H)nq-A zS79&*bCd(~mP-ql`KeEBDA}GUPf?NzR;+bHjDy4RQnLApG_3UMG&~&Qg_ml-)iZFa zDC7A$%r1ew+F=kHgn7J}Y<<#Yu-Y1s4fiPlb(u1QIp8Y*oCf-EYl5bJqZITul!gxv z`D#L#CIIaDkeFghY!3Kaq3mM4%4DTdw7W?{o3)rNS7Ow;Cbl-|E@gQO*{N6X4_Nh_8{xzUTCTjw&<{$3B(O=82xFyQ5EN999M6<=3AF(2HS1hG|~|ILPOKd*=w<-Vl}C8cc- z0Iu6px~M7sk{jgBzuDFxh2TX9Jr93%j+>~Tx`{W8_^PMS#$js5@Yl`iGi^i~DIS5^ zaNQG90DWfS^v1?J?pNj#pvq&;9J-~(fx+R62T1nFcZdFxMu(fCH%Xu0_rN)Y60aL3 z5CAt)H96bzX~-V*e&tg>mUF`O+&~H`Fq$$py-xX(LE)G-+#aQxTnR;4%lBf7|BGXr z9YO(tM-DES$W8Z$WAsipv)X&&^%`$q3vkDgw*=+U)pzBdI7N$@q}Du3lT>%L_XC=N z6|vpLcyB>=5T@>6Ax08!CtpESSj#%_izPb}=!bv+ zTw_~WL>sH$K2;SD6=EM!`aX167~^-iXafv%Nf0ZVF7jA;Cq?h06I~V~ z586P?zPodQ!AIF_c{Y5$GG#yvkzC-~hl4P|xAV$x|7euPGA9I?D-%d2Gl5_Ae!TUH zYT#auh&#CjNh+h`WKxH-nz0eRW&gNzOIE^By!kvB?4&W+`FBG%?l+yvJUZmT`_tr( z?N3_+mBSemq%5f3COhpdZaUIO)t3el?wObJP|*tABJl09Y8>=-%u9jC*~tt9rj2le zs_yxuVKRxdr|+cSsFzr1tEJfsX3V7hOQOz0T_$jTFSXi7gRAF{A2bhNw!YVjJGLDA zG_neUhi4cipmh9^481ZJnHdTAur4Y3*5KbqlzCw5%M-lApf&m&wAR5g(v=^WBS)i8{w!rL@wM}*!XY32To(*=50u3#BV>Zm}785d{7<{bj zT&Vn_8Cx^I`p@gGPVyc^)`=Hgb;IjRiY@qnH(+urAJX6^!=C#ZmvNIRzd zryc(98?K&bRofjeSWaG#;Rz|Li{UA1peIx1ew#faW@qq1=NB&E)@}UsqCZUtvy%p{ZX`ZOoQL;EhLFXhI0nd*&taDn$iu?8Ut3 zA5MlxMA-;I6>fBEhhBhsj!t7Lbq6h#EjXgHkFwPsmpnsTtB6q=322&m&rhPcldG!^ zc$9_ng^6KJaCj|UY8B4VaOCk1^jidv#IbSi zwNp!OYRMHFZtWK z>C}erU!W%|Uyq2Ho=6frLj@z}?vX?In~QD|^CTU<8m=fYt~uCt>wD4E3pB7>vd^ke z@pkdKJs#aPwo#$s7MaO-xwZ-vg%Q7IMvrOtG^|7k(ssw>eQnV@03Xwed6kQaBmvg-UWuxGA}wP=uTP5NYT#|ImA>3_Ioz6PE9BT-m!c0Cf^664|acESAl@=&|kc z(K^?;Ay5&Gqn8w!wh@uHKL4l&p&SlK6e%>2sml5eIUN%R(_;Qp$9 zy+@5);UX+M*7`N>!1s?^uA0!EMySd(BDk430jKUcl}7fpnCZmW`*>1=?|pa7@+fIg zwde+WnvkHW*x7aqlyTspdQxz_X7y{JY?jhz{lIG?DwN^dxL-PeGVPPh$}bTM<6sSM z2F;LFF64@_-=hIVN@GRG+;$rFQ|tBGG?v50_PP3bc=YTbO$B9J2v5oB^B2g^wrD%F zx|jT8Ua>J?{xZiUK=c~!3&k1nqU+!yR;uk6e=V&qzTj?lE3=ieR^Bx}_tfmBOO(Fa zh}}{nCT```ecTd|A&(A$Em)fuqT>BrN6JM)pqILP@r7e;~Xs258}dcwK^& zq9Xi<5w7_X#xJ- z24q{^S5TB3E!$E(O}dF9!I$Bb-gL1eiVkVsR;z}%i64M;nS|SObIT@qp;K-O=1aq| z-@T*2jO7${$?8;N9P@trw1gk*%nsIP#CBEsP48NXaLJKM_~*SQflvk8?Nv&3_DclT z5Z2+u?y?`O5$k68_zlczS`XG@1_ISn)L?D-g-Y4E**_-AJN+q<-RFiK$sFC7+C6M% z`g&qxg&5#8XnMZg?Uw)N^T6GUM?IkpVV>uM{hBrP70n_}xW@}lrvpfeHR)%h#q2e@ z7T7XPrdz*Esie#{KH5b9Na=imjt-hRhRA8%V3fX5$3ZSmsf{cVo&83!*t>agtj3r7 zG>FSzT;Eo<>wG$LFH%$0C~aKnax{jpjHfEtSZo2yVY(|l+Cw%>P;U}Js*YNfNt~6z zGaFS9vvRTUlTX^VCFQgKwmr~dqUgQbXHii~WjbsonTCF|d?RnICfj1vLpUTI7p>dO zIUono@iiI4yp0r&bcy%&9h|H2*|f7RZwY#$n5SD(UlJB_NLn^SYsa(SP#!3%J(xYG zIk5z0nVBhe*AB12a|0J0IBP>Seuf9m<%p7B1!tM8g&(%FDY)O>@vuhx<_1gc`D4Lr z7k}jLHw*>vnQK1x??QGzSAB=QHiD@2MjW^(HgAy_TO*QHvw*5!=KYV`AOTQM7oBCQ zteo=0g@!WPh>f!$#vw0?ntuXGdGR)aq0>LNeZt#N7I@Fcp1s3=&JejY+cThFpbd!o z{Ruw(X1!$}p8H43PQ|)ZBmtuEon$GzPayr}L{u^1fl!#-TCHH((~e-Zz6uxJ zauAPNTLm$KfBZ1k_H{5_{ArvA+~-T*Fc!prsaVzbfgBcI^cd)kmJ^k!E4R~QKJ=Wo zcSwA&g$xr2riEC`ovO&E4ENrWK>$kLu)aOf8>!-#H)ypNkxa#RzfEcQxZu{nD_iYgz{kmrDM(Avyi$8Pm zf@xo~Wg4wExr9Tj-6m+a@dBS#tx7&=VM&W5;7LiRQKQ}QQDK1JYS8in+RY}eYA44F*?2)IxSKo!>CZPc5IY$lT#oB#mQ4BHMg)C|5sXI96F=EsN-G$ zaS#{*%uJmEWY?OlwRwfUSunMvMhK$-3IRgQ^Tl13W#W_1Jj3>#JNe`@&+yTwpEhCm zmnaLYd&|K8aPdhHf)5v;vbZ8QhKP4P@x-#92BTwR z-9QY3kT(iH-Uk)S?|)(Xy5cWa28};x88rW^#lKWLd#kp;TU~C3`ybXT%vP&^B%=X5 z;kx)?NWyjLcxM0QVv9@X&Yz2d)<7ne#8c*dE}bHkN&!%-&ndi_RMOx{i*}>Y{cJfl zGvykogoEX{SlYPpW;1E(jV7VjB%N?UfbF<=GJy&ejaHLvCeuBCt7Y7mvgtH#v@X!} z%|e&oX_HQxy{*3QwT{Jet*B;|2fa|Ip>}^hdFaU_w(Lf@7McvdpnO%26&QBGn{>TMjvpL zBRuaPUctjbD)o5?Nb}w}HEM}+G#=S08~pvY^76Zi!WH+*y7ynwZZ3e%k!;UY?NQBA z?gxt8c2Y`s6?89(ErNpK7exgpb!(nvYrY8V&aLR4aHBTGkKNB-LHH~^lYxd8;kd~|3x9*# zODsNJluy=&0kYe@MNc=<@s$8af9kij!$Z|phg-K=`?Eh<9cKA>(7>_Pz5eZW+xGVR zwO7~WTSk~s<=Q7qicNIngpZc%FPb!auKPv;E+pM(;O?4pHql34wO1bQgoGb*tujxE*4S1v6N{nVaJ zI_-W}BS(c4Mci5K0dv6_34)!iDz{eE)itCTgY|C zQC-*x8`@Q!v5Eshn>y7onJ$--FNiAewhz_f<1Gc%F1gQdALkzqelUL3K5XWbabmWF zrPFx(MicrZ4d}xtrzQ2wV_tcmad8Q%Bo%Mho1U+3whS2}-ww>Y1qAOFZ`41QJ5T={ zv}S0#-2d)s?rx@$vhBg5Y2O@`yG*)2A8_agXPx(aqjTKp!}FkvzH$2ulb#ZYG8aSa zT)a%a-W|;ZFt@H$dXQO46;p2s-M%&Mhmdk_Oh8ETY#sn~gd*-8%Bqy-Xs>R6cHh+N zrnd`+8Z!`KHuxfIitoo2n-k~k!SGiver{04DD~x(B(!ywLIn2Lha*23Y^Um)QX&o| z>$h0W8mVyKD|yzQ@N{;COwFY9mt6Gi+mAXJXWo1rZ#>RjQ2nSRPXD~;Zh&l9)#ck) z_j5hjW%zQk8DR1HzI@5=uAfctgM~}M?$G4|T@FshqRb|zI#l(T>sjJT)-+D>J@mwm zYVOpz+Dz|?dq1jm-i?2l_q$q52p=#1_SkK$(L4Gh@E2VENlcWtK_RSSzuY3r9}|}i z_hn1G$?ZM&*^cRP~`C(;QP)DbXnV9fv&)=qt&QXcFk(S)2o?z z$6%_4!6Rvn`?d_;mR4vec6(}ESDCigF&`01_1gXU^QJtjM3mV5$75{I>Wc2?Hz&s5 zc?>V!T$befWsHFSewMAXlpqKvE8!3BJo(D@gm01gTelCRUFwDK@}HTXZ{e@rk$R|v zf1-N!hE<_V+QsWi-SWKYswIJia=e+UC81(I&&ICUh+WE=y^wAcWTs_&N9v83jM>0F z4gC+7uh$VH`898r3Wm56NAYDNNl0uZ9t}v-SuS7EPshyx&5_ajW1{ynKo=u)G1W%z zXC8k6fIE}t%xY#-IH~jxgH1#=UYni~xdOe{+NU|^Z;33ooN$$U{%i8V5tO<(f+Oy7>v zmdNqmDQPetRQYK?_{j&qcGH!JEiw=3pPmfb{s3$b63qvf(C&chm=ev=W8$$9;0B<5 z$!%>~{QUeM3jkbC&g2+g0ZFVE4|S)#*cpr71ks^us2U^iYgq_)9`&WMP64h4b)S5T zHoh~{gY+jikCoxK^OV8y#roBDYXG^uJ5w?MOz*5NY>m&svzzgMzVve<{jRI+Jg}$`lv3Q z&nO9g^NrT(lAECt_KTM8uMv!&o#Z5M#=hOUNndZihVHU@PIm!vC$KkZhPF<2q=q5% z2U^1r#+p7(oet4L0K~7TP%veHRhXN@dQM+sB=(!d&^mo&eG@f7=Pd+IP*86|*EVtU z@P{PtWxN&z=MIcht0Prqn$?DG9=rP{_l}KY7ksE zSGah#piiBX(bj*s34q;dXE+V~pqZg3r#6#*DC#8OXqKT(21-qZyzLJraUwv+0qmv%4s8*iKr^YLcs=6*Er zSY2!Ogu#;R%Wk`6Erpf~2Iv?aPv=NXo3r)jtxZ>|Y1*!>GLUQNDZ;9KPcq)LfM8eg z+0zDm(V^VadxmDoS2!shR3sh#WG-nC?g~QQJ%{N=?rwTaWr1{!RoZj=K_VyYFkSd0 z>|DUcgFV-%qDN!R%b^cF=&;APldJ&zGJqLF`cr1+@fB1JX3IOkaNMo0pellMWez({ zL<2aF_vi##!%yhBm*>l*7|wVXEi*@Rvgz)Vtc+M&sg&w+$=uFC!@RR!%@I;PIe?q% zi;EJl%5VPM=$V}1gS?vR68kdkujy+rIDBD+Sr}z?yHJfl#V(=SNmj0Pg0+0%*DNXC zN}p!&`hXS1zaX!HT2H!8y1sb1X@%kl$Y#Qv9)kHKTII_*Y#Q2|w$^-R6ta* zJe!ulY99R^csxOeDVxm3CAMp22FnN1@ zVe#i|i)x!vp0=C z6g-P>0?f$T&^2;<32+uz0+Rl*PcilEt!)ZtpgX;OE~dqM9Q}x@S_0%Omfcw;TWxwT zCruNrznM~cTR4|Ha#$oTTv%P|uSk?-1(%tMMk0hnjhnT_L~*IO*J)5A^a zSwY;pePN&TwQq1#yi6I@nlz(h88to`_@F4@Wy%%&?)Ak*c|Dv`i+m6?@6;!G?n z>Hd%e5FZK#&Q;!Afxku{{MVCwNHOHrJcG@oigj8fnc^7Pg+54kqP5`NRv-&NN00QU z%?x2FWGrC^GeNH-H9-FO5l9=Pp>Bn)ZgF?}&W?1UBk^GAR&6* z8zFnR5M4rR=-&&KSr4_0R$o>IICqDAsq=@5lhHqMZT4?T8-({c8Yg$N4+$4YUFu7q zvWxI@NS8cN^64`f9J1Ip*r+PKdCKGpZu9KzuOba8#=!D7as6^?Ia#Z!d@r;Ad)he2 z)qxRWQWk~2aY9m2zL;u9QXYoCL4Bj=ETf+ObJ}R%ZM5TRUIWdG;BP_SiB2Wq)Vy2# ztwpvkQL}G>pMJt0c>YAoQ^(16yCFxe<=Ld44G)U-*30g_7fca<9&CFIxF+c3X*7F) zN?*DZ6TD=ifOw*ln|*UO8aw_deIVKS$KoQD@u~UHX4=Ycn;n zksQpqKpRM<@opeAi)pX7bs>Mnl>+1BAQTuh`6qgz+J>1yc-* zcNJq$5|8Y%fx^KPH6Ku}Zu}FE0s8ZOWb5@OPp0siKs>GCKlR6n{U-UkIWl_az%0j3 z$vV@4!op~@kMt4lH_6pBxF?5zI|zSlh(^ zrXbD!O}v+O`5NL4N1RUWaDJElA!$Mj1MWI#xrQ_|9p6+q9ud35B4`=kZg*Am`6$la z<(8{;l)h>V=4e#Iu_eFZ%X61z`dE2_j_Jl;L&7{FUDRHYM7GV#D`+Cyx`co1J#0#c znS_wUuQdW6iVSG|tR=$se$70M$$gSlemu#`=;J zY_n2_(3PDRk5qUgx+PyantUW}Z#Zr&Dk2l64NeaN+1rwTrVA6TPBv;jS z$(Za##WG(0-<7rQ)8D$YcUMZRU{m$2Ku}Q7ud%TU*V}}FM|KbVqDOpOdJx{zcGc2D z9NE)iTvIuC2x8s_u-NwL>6g>+1Q*cH-|u5XW#onvvvcGfrvew@^|4L=0wiShg@521 z+P&ou=u~i@{KAXgxeV)S1Q?sy&w|J4|9{p{eh(Tvh~8~o9jo&qh&FptcAin6m;>9@ zbl;cIPXjqW{~)=-Jb=77IC5_9AN1#X*8J}uxT0OCsqY@j`k`LAhjv`-a+8%T#* z5KoT*xwhkzf_K|Ypy0l=jFJTD>A-JeY8-MyjQ%BWmk0brsx(%m2NXq>;@Dt$&0enu zFQ|b_MN{)&HzuU?rlkVo=F-_RU}^+KpEJYMZI^+*Vo;g@rbisD3VcNnaMF6r>lJtx z=a)siH_bb?4_wT92ozQ2f&H}%8JnP^acDmDlf+h(uPOaJl))G#cUZQp0A6TA^~(^X zrQ8NC~^}pEO`#rxD{0L+%IBpa{&L!c`ibsE^ZpQo`g(9G;SVH3z_*gF7rnE z&gE@OU!`Z+$oLO+D{{LC6^fKv(DJcd+8jzJ7ng9oc)1t54~VC~90QcMSg0~xhM2ZO zV2QR%O}A-525mCw06a+6PZd+y>eW_uTmCKZ*HC_Ri`=WX-B5_2*|*V{ouomq8P7+- zq5!amdAQ7;OPh=N-rZ_d1BnoQcs9LSnP{#*v;KvC6m|y#VEZW?cd~uo-E^{6%U23^ z2xvOl89J~#HrpQJb%Qj4^c2do{>0V5P~NhATt+MlGBB z%RIX*SXeJf6R<&v(p03f)iyX|(Cju1-dKM|N-0!7clgx_6~dA|`JRZBn_SH|tSvRy zH!BfCOP3t7JB(W{MDX#>Ux^lpW2b80vuWmi18r2E9ODksmxv=w&OthG;35IhdYjfm z`WR|>@$urLVYD}Cwf!ksp@!zxNO#}e17UzWg;-1Xh@p)wz^{Z8RjOE=9S?3@ol)gn z9n4k5WZsq!iFGaw9)&F1w#8w*f^xpd_sgFK!O3$Bs|W50-WJU4pIhIdPqI&Y1TUrw z>Ki2exVYi!K*MdIp!^G2(t8`R-7!cid8LV_8KkERTW8PxC(IIe-audmv1tu@t`!cBFL($L3bEm zBbZiWoJV;fzk`oQ=Y;N%YcE1R4IxnE7`XEj3>`(6&^-RL;sEo> zZ6a+UrgX5MzA=p5KsWR(zg;E@d=5mMQILEa9$0pj6ZvT$tmi}xLNh&d@<|z3MJe2+xAouM)u&_kSyFW5u!pCR)JPC8oS`N58hRi}5A%kek zO@Ctmzk>zISPx3=An?Ev$UW~F^jK|Iu(nWdCZRUbi?+leYde7G(DOBZwtrpciK2Z-67DMLplsqNfZw5+>7xO!#WhXxgs=8RUa*Y*M^ zg-=J{5;@9(YJ!Ac(NB%b(|f1=F}bzO_xMQRwqx*xY&sx|)2GsN)zR{$I*X6y1P=e? ze=1JPSx?WaJq!VbHu;65DV9pQ(QeQyFtn_9Rv{@H6dfDRz!)fA_WFJ4*$U6%S z=?U2bL_oP%LOuNYh*rQ;S}LgxBY=$HcE+ai~wKG{7VM+ znKhh3j*W;6>%vA0kx5{+N8VH%Q32!9=uTu0ooZ^}{f6gSBRvSX3+h(^^gsg}Yq5KM z&wf3b<-F7y)JpSQ76%Fa9?HNiu*lbQaI-9jX~9P3<@LrYW+eGYy#C^yk+v82w5Ic7 zUaoUa(6fuso|-C1%XKS-!Y`a|xdphSQ2)2+i-0Z^GANHfO&tB4GuTuDTHOVYk&TVK z(H;x<#=?v_PsccbjWNp8ST1AkK;{wATkM%=Y_oqf5qY=Y*gFB==pFBB?kCgJNlDD= zxsctShdDjzeXeK&z_y)8G$zzj@w8@vM*5J69C(Tbu38aK7BA*P%)}%&YuDPNl~($b zYu)W|fF=+;HCjj5+ykW4uAdK3-Bk$^i7r|ofl${w8?;^Nh$N9U!Be=}VOd7&+b&X#( z%O38>vXmwu-ca}Q5-7Wk9wk|&qJ0iUnSMCmS8;7R`;fSe%}tgdn}-f`m8r6X(VPp9 z%?(k8Geq9o`Se@#TQsd&0KW~y@RxL=U66(Fa2}th+lWMngaRnbf7;V-EO7@*BxC(4 zwSAz`$M%H=V#A34)>@Mv_BDZ&-i1;2_l8pox&vK`mh$`^tc&SO1haiCpt3*VpcFVq z_?SZ_5C(1-6|E0r7~-S6Up-Pp&MscgKS(E}-IvnL&2D|x4>ZOeYg$JzTCcY+z(3Jy zHGvzX?5frhRa6k|2`;G*gQb(p{svn;%|nZZucVm|f(!Im`@DggLZk-*C57y5JiXOO zSp4)G{*ZjrL9ggmA8`$OV<0YIj?gVFNn7?8 zt#13hXVE^C@73}=ENt{Uq zo{mR8<&}yAtfOxu3idD`usAe{Psmo-fUsDVpm>@tUaR3>1t#nV@(dkd)S7lvvX`j3HrEcEd;N3j`R46;iBcQ+NES2UC>~&#hhk3kE?Tt4eV%(+w8`i4@D3?o zMOeC(PUsOS7QBH?$!*>)@u*&dh3*WU3trl29}{iob;l+efd?^a|8lliBGtPPR|EH_ z(YB16Ao>;qEROXp)^{Q0L$IsuIl$UhNG%GxjP$414|tCyHPD;4g1}N=G9WFJIp|m% zaa>7gY=ft2m;bB1m+bjqcLy0^+m4Q~yKLb@+sR+o@Jo|#J>4kZzh7C*;%dbfrfi}e zEeL5^>7~vRxty4lQ@$7PzujYKB|J>^(MLou-XJAFWye`d+MQMo6Z6eTMLXWy3XDE;doz$bs4@2!`uD1@kEzdXa9IIu-jEcOWT~Im zk9giZ|I`d+wDy&+)UB-f%_FXAxit@nk$qGpIquyGZ2hHYb8%|e*M0A{G~M;#5mtZ5 zQtM6g^0iHmHmozPOwsYvr}yyfIoSwpF7nvsn2+ppuG9L9y!%c}NrPsqWm+`173h0* z|FF!pbhVm4jTQVl-5v9*QB{ZY_DNf@=U=%`9Cga*aVj0Ra7s5=#Ei`VvlXW6sPH3E zuPaB!NT zRdh#1|G~mVe!k}ltvx-7#yG2*%yuH z&IqofD$GS%0a8$l2i$@vU`N&SX^`DmMAKKaXFYWwv4&NjDd?!?OAi*)Ndo24j)xzoUXCHU6Wphb} zm+1Or4DkoUn05eRae+qd8Pu3Ih)e>kcZ{iR^O&&B z2L~z;G3(o0&7QIEs)`w$VuS5beg#jZU~=uGb4|T*>IZix4CG#zoJi2|4V6$u?+?3# z=-KO9_vn^}S%@c)r*6!lL`4!vRGF8}ZQRzG7grqLU8Q6vx{AG2C_+FZL zZ_R{++UK56I=}{_FV)-8wr;z27NQVN0Lh63RI5#YYx*M|b&U_2kKP5>2hqJXlY{7n z=fGb(!%yiqSFzRq!~0wPHNg2fY!!>ApxH$B8(-2{Pl2H9A8MxRT3YXAK|T+|jfHJ) zb>=_~>Re+n3cO5+seCnP(eIgb8i4WV%?2pk5)FEagG)zr;XV-^Y^rGHm!F5?%jM6V z6Uq-@GaqDzsN9ThhcH#b&aF2HFQ(oW_;zjL*VgVr4D!JHz-F#6xn+kqr$BmV zb@j5xcPMTzK)dw#jx{7P-5~u8rYVaF`JCyQ;r+_$nb(Ov11ONk#?S!Y{}3qHzXXb1 zCwg(bj*GA(su~a&Zz3wxR@i`wRBJE*!*v@b_y)g}*(w40&f->iqV=uHM6unmB%6q# zllA?(%e6`6pgIw9fZ-PStI-qZ0aQzy`I%;U$IO+>FMt5SR=Kfz;LQyPO4o(1zC4V^ z1F-0xGQOAn^GWrHNiK`DOnXl01k?G#l&?i+`TL6UXM<~};7RRaR*zp^Ovd%uS2C!M*R`s-HH4}V>q|PvPZ@? z(iQ(D7{O%#4H3@(G#N-b2L>L$5)Sp7)X6vBEfRI%qgF3OB*kx&bAGHCX1$m@i%+nO zMvZ~T8?u0U*-HN5()jZ=Jv$>7iBL0W#kZ0$hX~gIKkf3aCNST3T<)RbzHTCzYJF-Y z@TJO8I3q{itxK~ zd3{3sltrn_3|5Y|*U|ZZh4@xC(v$dNOZsJ5#2dfm1Jp1925H?~5y{Q#^Vs6eBzNHR zWAc;xLBi)&ur`1K^^DAd2L`#viJ=Al=I->5_eh8a^M%R2_q6xrPMn9$AF{tTk?>9d zVk=ZN*{AM*@btOA5(?_g#BLTShb?yksD37|AQ3x~`Lz3|^s&(Mi*_qEDuq8#%KKZB zJ~4bfe2BTntL;hM$^Gc4qkNVfeP6K0Rj=y9{pz&^HWlJ!vX=aH8>6g-}fZdx&Q)82-)&RT0E!ITm|C037&-r zQcNkZ0A)LPuX8$n{frj}7>J_dHi_f(KJv^890G9A%qPZ%K2H8`avR=(xm-X3GTq+6 zL^?A-F$pRT-#-~ZVdX@f6zO6<-KS~dj(?_{E@gfIAoRppB#s=Zu3`#xQx36Y8n8&L z#T&09RUe!%<&u+|Z1jHYYToX5$;O|GAI|{<^Rz2qS$-YIc7*u)M=tfPS%fa}{2OO#DmX14DbwIR2l+(}hl9VLZ*CoOwyt z<3%P()^z@M`G#H=?HY4lLvO;(lO3r#qOABpCtf>+iL^GgvJnyoX&-}~#KuBo(D9Pb z9!mWVGPW<+s3kG}<+o)>;bhJlvs2_e}$M03I9iH{$)6+8$5~9-M!j{$vQQS^N}gU*$L_wFlEn`bYBs zvygB$;rx`=k&zQ&oAplG_gd!_8htbu_8|h=@k1DMk^r`^j~n`zigpwS$M;j5|`523hegS1Va z2pZ6#Kfls^gM4!vv&<}A1od&Z;y1p~>ozS2KRkd87GjVT_^A{6^Q)e16=ff&a)7UP zU4vlZ?fYI)Fw%QxVStLg|Zz=ETtdrQ%Qjq16AwuMcjFnuj_TP%ehCl*O+jCl$X|v-F@eM^fnh zHqpc2d~wR;R>;K%1^Fq_8zvW-x!(xs3IC8ja0&x#S9nE%W3_ANy75X0L3Sfb0Lc3i z7}$k+QL%%L%z3}i6@%oMR%2uO`rwej=hF4^q}$(&=@ZI|4_7$H%KBX6P++PthY>jE z5v&Q)^Hyhy5b%=7wcCd*Km>h>ci0A}H!)mX9;2M32`0Xt-5|Gg1~*6`j; zo75n_#{<{Xy~pyhk(6J$S2KFQ`;hQ08}D{==}TR@b)=SwdSaq%7KIp~%{LuIog$(v z7wK;RU)oJ&*ylWOZbQG3_mS{24$@WZ{?e6BuQGPD2b6Ds92=bq#!a-a!TYTDjYymp z$j=n|FwBp*L)~mw!CD5dWJ#c8Wqy)b49gF8$l^;1<}%qsX>WcjGC-^62cJ_ zo!8|f-USm6uG%}?Td9_e4Rg$W$d6G4_|RLG@YZ`u46*7C17^v_wu#~&F{e(k9v0Hz zYDqW`kQ=6w`mm2^F{S^*GT>^EV!+OGfM~QhO-$@&AsTn0Zkz91)hV@+bbQQ4b@`8& zpa_AV&J%33GQe|9f}iI;Wt24sJKMKUpPG8{6kb;z0|#6DYi)p3!mDkpvM9A32^BMjFGRbcO5j&8CR%-!Sqy*C{P z?G>bl`k9<`e4Ceef$HFrhc4}XFR%yK5iP~Pm(H+nOe39MTZkd6D9>I5Ke0tiF zw+OX>O(SUme(pu|?Kg!VR2$JQ=q^4>$bqm?)y*J^WVhN()wS3!!CYn9t1ryk%Cgc6 z!16D?)gNTkuSZZOqzH*&-U6qg5$`u{F2)N5OMP-~-}U^zL=5#>T8JUU{5l% z0)cSHeuvsAUZG^JZ??h_{hxfUh6mn%L)U`@2~T(6pZ*fvlpQRAjBx{u=-=#w6g}}7 zE~wn)FP!5}iQ?7L#n%Dfl!r>dfa?H0;DbR|bScs{Nf@eP+(2!<6Qx=Rw9J$h(uq`cJr_Ro zHPGqP%G-K7$4!-({rLp`4)2V)+v{E7aU1Y3xS83avSQ{_<$&)s1+SY)gcv-V2%J|UOmbI#>!{LUKpy5vpiH_2x zprSn60AEC`_x=>qP^_*mCiWn|Or=548-PnlqWhg^E|dOIgIC%U8(uAfRW#I726ZP{ zswL$!o3=fuCBc4;RJitfs#a_9CJwW~BYw+$UnTWG7*{{SS~e)w!7tA2X^iyN9u0xzs{K#koO1%9 zDeN{hpo*uyXUa(4Tc4Sco3820tgNsXS z=33@rO-^=pVb*(`Rzsb+!a5EkCW^O9QX;~{ts(gP9TGV8|62!xu=F4sC@3)B(dPv| z7p2QBYxHUTMn8P7Hkz{=Na7h{ai@rdPVNjdyN8xsG!o+h8&JpYgX#K30@}49r4w^VTwv1DCgP3ZR76}Z*~IVp4=LRTF)}>d z%yC&vJVlV;>Nw5%*FQc0Sh94GF}!(Dni@E$E%5S8*^Ef(fAu*3APLGOo$~ht^OS&p%y&ppMdg0Z4weqPsk84K!bJJ7e` zwOA?BtA5;9x=R+!>?HK;{$JthKU!e4+A=owpHOd|(qN9*U!|Pg6|ynbJ9nn=%bAz0 z$Z+-}cV6$X+4i7MN%n-j+IL>4m3HPO({D!hsA2vnt^!x-2mu&8O2|j=+!HT;A~CWECG$pp2}$+>5`BBOiLfh8g==l;F5pQAAz zVj0|k1hbyrkIfV6%yQbV#srdHrfRNnoH0AlJI^l}10~g`d9j|(j)ha4I>nE;I^INe z$mTVFXGxg;uht2g$o;+dp4hgmjI8jMDFC0*>#20*H(IFl3)+Ipw#-yZ<3V~*Tp7jC zLJWqVcJFdDugAgIHq(EIf7}!y!}M*Nzn{^Znsw$mWvzY`!@66Lvi|bxBiQ@aIpI_H z{ANdJP$VZ;q%?nnD`r}{&iwpkuRD0=+8?I^R^dhe!%pl;)lhlc|E(bJSc#q)h+x|n z?6BDvDyiu&IAI+V>GjFqh>_OcX49fAfNL7*{4J7ET#y3R;Y5n*HJR7F%wfgPH7YH> zPs64#xhEYhycR0tsXgVwr^HJ_Y#RQL5El5$ij4lf?|*Z-+)6a)Im;U+8YToQp}wm` zW?VYnmTsy!_d(BChIlyqP4(2IksPpt7BiB9M=zUSWLR=}5IuR3U+!a0HW}VE3VX%T96>pMJ z!=y^73kI3|Xw!_jOHnD1)vJ2qQ$!Ejs%86j!VAz$6y3%DZUBIa=U>CWVp8m6HAgtt z$c$^vpdVhbOF4Q|e1otlR?IsNaq^9;We40tk*5sYXGh{kgT$C+5<3DvE(+bQQoQ8| zyY@y1#v|~tV#MVA?-6F0raDaRczDxd@WX75d#yjtE?=$hoj*MHan_npJBUrCjr~WD z57g4#ocDH+L{@n9Pwke`R%H1?{kaD2cSpw^oJr&lMI}8F;(hb^8-3tNyvrE3yT-h? zH766EpKETX*=bdx%J zw?_9j_H_nUSVPL$B^Baz|rTuROE zcnK8)e)}jS*kuR%%sKvx?=(^jC%RtNMF%#P*kDsEXt4j=x>zxMJV>T~w|*JhxYN$& z4urz4S=!20vcTG;aOZ;*f8Z|Es<1I%rYj4CooI<>6um$wuuj(oK{T9@g5>Yp34M8`WfeEUI8d;Y*sUR|BLWgWJxTB!B zux>sRyvy)V@`Yk;anX|QJ=43<{Fh@NP^6SEOz~^um=9+Gx}PWT)0@HycLhSt1Q_5+ zIvKwz-)Yu8bt6jQn7hX!2mT^2yY2s|HUaFOV14;X=qZM0^Y^u4pw=K-q!rQJ81TM7 z;K<1-R*=3vT~9RA^>0IWdnd|A03EwD;kwUfg?Dg z2D>Bcc9MS~8kodRd)Ms(yYCB}YY#7r18Zb|8w#J2LnS#~A?$O`z*p?fZ*L6t+cqsk z1!65A0%N8_GKPr>=90cbKW43VDB!McB5rdz0((g$CMKq?8J+a^MWQ<@CoeuZ+sDW9 z_Q-_vGe|ajeh04!ago5k@7q9JR4rOq)l>i z&(LxPU}f}|GhK-0j3Ecn(|haCA&WuMrjUQey^t_duIZ^M7<4`Xo4|K5uiyu!k3DDb zmDxPB(VN25=nhYT<+aINv>1k9npL`+y}pG}i9iR~sZyV8CF$6qn}3a${kWm}*zjHI zs}^W8i4a&zK#@l{ZDn&ZI*<-650Z@;3Xa~%yR6N1T0KJOqYVW!fM3Eo;bg1Kk{`6c z9lGWc9W2l0bC8Q0a2U9r%mvN0xSGVo#ClKu8k=A{CH;ucrW<>jc{6k5P|@bdXeVHQ z-Rs%P&R!SF(dYZ7%+j}5AQ6#Jit@vI zHH%BKP1x8EXZcK0hr%QYk+6OH4!^Y%zg#Y)@`pP4wQc28Ak#fjq3EX6TBCLQcIDIL z2i`_cNNjq-$!8xuzh0TE^jzb#6yuvCLQlhQgtXdOZ*#t@tqdHlEvGHIJmUEL9@W8J zC68Nk0xq`Qe@j&gv0$q|1bcm_scGndb}P8WJ}^=#ciiNVW)vP?2*|72&lv0dS;sjV z&EKR(=$wBon|8RKYw~ID9)ZFxHlpn4s?gOaGJjj)%KZI{~YAv3;U81EnXnliRAsLUkVOG5)^vgbi218?qHaO89QFs zovPd(173#SP-dwi;N;Q!6VC;XF&iPm`t)GzPm^DWlw3@m}??T0`YS7{rwX^Yz!PWt~|5=w5%q6&NNl z!V2E@23FF2*Bh4q_Ht}(m-`s1I08h^;_~+;)>4|}2AFsI9u{0=b$DX~3*!ni?fqEE zW@#szbE>PN|4<6wh<~ZUch#j>I80}ztAp_HOOEe4q966pEETKlo`{t`$R2#>)P;k$ z4w0X;!7f9TjLAQgj685HCB4&YiN%v1uk9SIpAxDRfAW;@U};@Jg1FL)o7jn$~lMgQcH#P6>=geqm^DqHok*L%eZ9XnE6e@Wl;>q@RRJ)Yq2#&TmH zhF>f8P-#nUPN+v|=&87k9{a0ey1d`8TXcheEO|_}ma_mjaG3EF#<0Cbx*%fctMKzw z6RK2~j9}7J+$A|!4o*FHY%YGit9-oqg^rP=(MNOjLMqI28QW|*bI8u{_Gz$!e2|s3 zB>%pLF;}K)1U*+4edMt0^J|?w8RGUzfS*-Z}1aCYr6lN1?F0 z4jmfK1MFTsF)*rN#RtN^BOIq8zC=?k+cqsb|A1^)azcB@H#;tFhe`{#{dd=?sS7#H zeD6%w$AUiOAlp4;?<)oA&t2=3Vmqp-*>OnIL5S-C1W59;-=Oz_EiK_l#(d5>RI|Cp zdyBRUkC(IE!5wm6Z1W-tdIta~L3fe!{!m8AGE(={r_@L0Oe3y-~rWWaZpa`ju?In=PQ%o;NmfkV`|8;WV{b zytdI;^Hq)bQ!5a*%Orck2Xtg0p{?tuWKI1MyQjZG^^H zE$P^+XdwJ?Tbl33_>Kbe$`jgY8m)>_C&PNYX9GF$2wb~m3x=+3j~rVXwzNwt>OYZi z1&RL8?OPBG`{E;oOD?>OqdsdLPdEu6GFqOQYC2@H)w?qtRcF2T`YD`2?AINR)HBz# za0q^6gpj&McAkSsavZaZfOd&1kA812SA_b`M}P0P$6>Nv&8>@!1xJ{*12NN|SJBe+ zk6*Gdch8nSaf6tdc9BI~?|+QTjDxwnFcPKvqoq2P&JCU@?A_-j0?fDH#I@?+c;qE> z4z{Tw4o@eOUWUIvc<5F41DTSE`vT*m*N9$$Y#H+5XGI?_Ig+kI`U|N;Lc%N4z1eSp zF;ZkUU(W8*_Ivi<<%W>97PAyG{RR-(68ls1Pak5b9!Sn1%uMkgCSG6u#I(#GuYx(B zV??_sapp~mx9&KQE#nh9Od?QQHjN2hA@DqlV-AUt9XH*}*jP2xJnSD^@;cVAhwIt{HQ3ZU#@70ymH}$FaGV$`k;C6c$`t1YmjOg5sY{X7_h=XoIjg=a!H;1}}(zx1rRa9yE(^FZ%|B@Cwr`eC=gC&sD= zQZZDu+BbQ|5MwpRi+WKje(`S(vo&~nF+mpbq^+&(o5@m2C<%f!+d#nb7BnSNR#L5{ z3%^0CsBEDT%1paEIm$S-1`l#|!hP2?Wl@^&PzeaVh+L4l_>Ut`3o(V|Ojx6dXE-A` z<@O1Cb|tm8#U~{u8RR_*-`^_4YLQ05+~7J1$s+bBqWV3G2W*l?sDI2QdBlB=vz!FDVqXcq%6B5jXS7g{tHuYPjtHP%$eZTA@WqeE%B zy1Kaef0DATvdKY4o;3uUfDo^fP~*H%l(@Aw_ZDndi20>f|B*+s8-~Md zzf*yzq}n5qpjrU`ePN)iWtm;nA2)TCmQB1D^6s^wB#Y9OC+*+rUcO|{c_880sc>#? zr_+^uxh5NS@7pNb=yRA1L?NB-LE0Vb6STJE;htf)KB35Wab425a+0G93z&1xp5aM$g@>iUip7s$Zwjz#!en_H~CajviNF>;EG zF5TO?aH9hr`CiO|Tg?j0Rdwz49a!QYELFYB$q1rWIht&Ah-07+_XU@bniC@=xD*v2 zpWI2TyFM$z&wka7SH$Eo^dwtw#F3`xjev1AAvzhWpkS%u1@zczTXFJr)dA^3{n>); z?3_rozDGZ_U*!)Q~VuvXgH}p#5}tu`*4>;P<&cH&ttvkQIXG z5NArHVDxlj)oeg)Fyi)kk!MX`d;!`}5+(XxQA+42q`#1&ijn1(5E__|DUrDU|J-SZmZtgS!nht77ywINKN}Exiw0+1Qp8X9-e91`_08!`ti#^7NKNZQ-f>0ZgSU z88EaBf1>mbDlUT^RPTe3C5>J}1=gORoC=R#_9;_1xS1>XZBMGo;k;7ssHdqE=-W~e zxB-Q+`!vt6p63H0?SpUXIyPJ!i;7LS5wq-p#)riYxq$213hbcRnNF)~ z>2vFExbClVfQ~Je-0NPCs+KJ-qDH@dJ)4;LDtV(ZjpY1jZt(RN&(Vhw>l~M#7__(s z=>zchhrBP4cXzAPSeNBWX4+5K)-wR8TrFu@TR#|1+ z$1kJx^zb^Y2>5#$NBO{`RNIx@>Ri7r;p^;H{L-zH-XRhi* z%u`V>m?W9sE8E(9RZZ|~8JHS4En642;oPK1vHaxlBG8fB>>n{z{nEeo5&VbSqb#r^ zuRIH~3?{(=-0ODat?f1A-M7Gvy{^5@vk5sRW2&y0A#YRy#u-N+XkhhAlD`0m*U+3pkd2+8K0@{%zGH)ZDY)D%4658P@9HQZ>0 zpq!dQSJa2)4=(PALDoq9PZtAY#g(Yv=OF+;Z!DV@_K933`w~|xgl#Csi0GIgMKW*t zS3)3^)!S~geAP9<5~O813AYI{)igC3%J<4ptzeuSE*#+AsU9$0>#~bok*D}xEJ4F? zN~VoRANm!&Sb+V8kn28vDEilaLDvGdgNgvU=QXs0Ki%|eGGbRa$-eJC?OSHw4jI>TNXY)#t2A)LAM`AD%hX<;$Utn8 zLho%ec;AN~QVyyV+6w=pD7c!3uh^#iZ>6Ej2js%}& z7T4;<*hK)%2kBrH53LwHEX+-)Fl+U=Wx+9z;FCZ69M4btmp3G_!ZQG8jqu~lW1SD4 zij*2!#hkWuZ`rR@mw3|T-?iT?{ZS@kVG4Wbccct>y-q`P9Z?ZBYy~2Nt zi^nG*FS6|3g^^Ja;arr{I=KF1$MCtopIil9i!yoTY}P&tUg!h>h1-5FXP#py>%Sq{ ByLSKp From 550aef34ba802a1475c210673957ef67bb128c77 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Jan 2016 21:54:47 -0500 Subject: [PATCH 11/23] less copy-paste --- code/modules/reagents/Chemistry-Machinery.dm | 32 ++------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index e306157bb81..f9c8dead1b8 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -794,36 +794,8 @@ else user << "You can't use the [src.name] while it's panel is opened!" return 1 - - if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass)) - - if(beaker) - user << "A beaker is already loaded into the machine." - return - if(!user.drop_item()) - user << "\The [B] is stuck to you!" - return - beaker = B - B.forceMove(src) - user << "You add the beaker to the machine!" - src.updateUsrDialog() - icon_state = "mixer1" - - else if(istype(B, /obj/item/weapon/storage/pill_bottle)) - - if(loaded_pill_bottle) - user << "A pill bottle is already loaded into the machine." - return - - if(!user.drop_item()) - user << "\The [B] is stuck to you!" - return - loaded_pill_bottle = B - B.forceMove(src) - user << "You add the pill bottle into the dispenser slot!" - src.updateUsrDialog() - - return + else + ..() /obj/machinery/reagentgrinder From 447be6f9fdb8622fd77452099a5994e4cd1af1a2 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jan 2016 00:41:46 -0500 Subject: [PATCH 12/23] binsult.ogg --- code/modules/mob/living/carbon/metroid/metroid.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 265a8c74202..d62c5775d5c 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -928,7 +928,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /obj/item/stack/tile/bluespace name = "bluespace floor tile" singular_name = "floor tile" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." icon_state = "tile-bluespace" w_class = 3 force = 6 @@ -944,14 +944,14 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /turf/simulated/floor/bluespace slowdown = -1 icon_state = "bluespace" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." floor_tile = /obj/item/stack/tile/bluespace /obj/item/stack/tile/sepia name = "sepia floor tile" singular_name = "floor tile" - desc = "Time seems to flow very slowly around these tiles" + desc = "Time seems to flow very slowly around these tiles." icon_state = "tile-sepia" w_class = 3 force = 6 @@ -967,7 +967,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /turf/simulated/floor/sepia slowdown = 2 icon_state = "sepia" - desc = "Time seems to flow very slowly around these tiles" + desc = "Time seems to flow very slowly around these tiles." floor_tile = /obj/item/stack/tile/sepia /obj/effect/goleRUNe From 38ee27898b53142220748749142da2924eb055d8 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jan 2016 01:34:16 -0500 Subject: [PATCH 13/23] structuring --- .../mob/living/carbon/metroid/metroid.dm | 1048 ---------------- .../living/carbon/{metroid => slime}/death.dm | 56 +- .../living/carbon/{metroid => slime}/emote.dm | 146 +-- .../carbon/{metroid => slime}/examine.dm | 86 +- .../living/carbon/{metroid => slime}/life.dm | 1104 ++++++++--------- .../living/carbon/{metroid => slime}/login.dm | 8 +- .../carbon/{metroid => slime}/powers.dm | 454 +++---- .../living/carbon/{metroid => slime}/say.dm | 0 code/modules/mob/living/carbon/slime/slime.dm | 576 +++++++++ .../carbon/{metroid => slime}/subtypes.dm | 156 +-- .../carbon/{metroid => slime}/update_icons.dm | 2 +- .../research/xenobiology/xenobiology.dm | 474 +++++++ paradise.dme | 21 +- 13 files changed, 2067 insertions(+), 2064 deletions(-) delete mode 100644 code/modules/mob/living/carbon/metroid/metroid.dm rename code/modules/mob/living/carbon/{metroid => slime}/death.dm (93%) rename code/modules/mob/living/carbon/{metroid => slime}/emote.dm (96%) rename code/modules/mob/living/carbon/{metroid => slime}/examine.dm (95%) rename code/modules/mob/living/carbon/{metroid => slime}/life.dm (96%) rename code/modules/mob/living/carbon/{metroid => slime}/login.dm (93%) rename code/modules/mob/living/carbon/{metroid => slime}/powers.dm (95%) rename code/modules/mob/living/carbon/{metroid => slime}/say.dm (100%) create mode 100644 code/modules/mob/living/carbon/slime/slime.dm rename code/modules/mob/living/carbon/{metroid => slime}/subtypes.dm (95%) rename code/modules/mob/living/carbon/{metroid => slime}/update_icons.dm (96%) create mode 100644 code/modules/research/xenobiology/xenobiology.dm diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm deleted file mode 100644 index d62c5775d5c..00000000000 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ /dev/null @@ -1,1048 +0,0 @@ -/mob/living/carbon/slime - name = "baby slime" - icon = 'icons/mob/slimes.dmi' - icon_state = "grey baby slime" - pass_flags = PASSTABLE - ventcrawler = 2 - speak_emote = list("telepathically chirps") - - layer = 5 - - maxHealth = 150 - health = 150 - gender = NEUTER - - update_icon = 0 - nutrition = 700 - - see_in_dark = 8 - update_slimes = 0 - - // canstun and canweaken don't affect slimes because they ignore stun and weakened variables - // for the sake of cleanliness, though, here they are. - status_flags = CANPARALYSE|CANPUSH - - var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside - var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 - - var/powerlevel = 0 // 1-10 controls how much electricity they are generating - var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces - - var/number = 0 // Used to understand when someone is talking to it - - var/mob/living/Victim = null // the person the slime is currently feeding on - var/mob/living/Target = null // AI variable - tells the slime to hunt this down - var/mob/living/Leader = null // AI variable - tells the slime to follow this person - - var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable - var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with - var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place - var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target - - var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting - - var/list/speech_buffer = list() // Last phrase said near it and person who said it - - var/mood = "" // To show its face - var/is_adult = 0 - - var/core_removal_stage = 0 //For removing cores. - - ///////////TIME FOR SUBSPECIES - - var/colour = "grey" - var/coretype = /obj/item/slime_extract/grey - var/list/slime_mutation[4] - -/mob/living/carbon/slime/New() - create_reagents(100) - spawn (0) - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - real_name = name - slime_mutation = mutation_table(colour) - mutation_chance = rand(25, 35) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") - ..() - -/mob/living/carbon/slime/regenerate_icons() - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - overlays.len = 0 - if (mood) - overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]") - ..() - -/mob/living/carbon/slime/movement_delay() - if (bodytemperature >= 330.23) // 135 F - return -1 // slimes become supercharged at high temperatures - - var/tally = 0 - - var/health_deficiency = (100 - health) - if(health_deficiency >= 45) tally += (health_deficiency / 25) - - if (bodytemperature < 183.222) - tally += (283.222 - bodytemperature) / 10 * 1.75 - - if(reagents) - if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down - tally *= 2 - - if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow - tally *= 5 - - if(health <= 0) // if damaged, the slime moves twice as slow - tally *= 2 - - return tally + config.slime_delay - -/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes) - if ((!(yes) || now_pushing)) - return - now_pushing = 1 - - if(isobj(AM)) - if(!client && powerlevel > 0) - var/probab = 10 - switch(powerlevel) - if(1 to 2) probab = 20 - if(3 to 4) probab = 30 - if(5 to 6) probab = 40 - if(7 to 8) probab = 60 - if(9) probab = 70 - if(10) probab = 95 - if(prob(probab)) - if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) - if(nutrition <= get_hunger_nutrition() && !Atkcool) - if (is_adult || prob(5)) - AM.attack_slime(src) - spawn() - Atkcool = 1 - sleep(45) - Atkcool = 0 - - if(ismob(AM)) - var/mob/tmob = AM - - if(is_adult) - if(istype(tmob, /mob/living/carbon/human)) - if(prob(90)) - now_pushing = 0 - return - else - if(istype(tmob, /mob/living/carbon/human)) - now_pushing = 0 - return - - now_pushing = 0 - ..() - if (!istype(AM, /atom/movable)) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - -/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0) - return 2 - -/mob/living/carbon/slime/Stat() - ..() - - statpanel("Status") - if(is_adult) - stat(null, "Health: [round((health / 200) * 100)]%") - else - stat(null, "Health: [round((health / 150) * 100)]%") - - if (client.statpanel == "Status") - stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") - if(amount_grown >= 10) - if(is_adult) - stat(null, "You can reproduce!") - else - stat(null, "You can evolve!") - - stat(null,"Power Level: [powerlevel]") - -/mob/living/carbon/slime/adjustFireLoss(amount) - ..(-abs(amount)) // Heals them - return - -/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj) - attacked += 10 - ..(Proj) - return 0 - -/mob/living/carbon/slime/emp_act(severity) - powerlevel = 0 // oh no, the power! - ..() - -/mob/living/carbon/slime/ex_act(severity) - ..() - - var/b_loss = null - var/f_loss = null - switch (severity) - if (1.0) - qdel(src) - return - - if (2.0) - - b_loss += 60 - f_loss += 60 - - - if(3.0) - b_loss += 30 - - adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) - - updatehealth() - - -/mob/living/carbon/slime/blob_act() - show_message(" The blob attacks you!") - adjustBruteLoss(20) - updatehealth() - return - - -/mob/living/carbon/slime/unEquip(obj/item/W as obj) - return - -/mob/living/carbon/slime/attack_ui(slot) - return - -/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (Victim) return // can't attack while eating! - - if (health > -100) - - M.do_attack_animation(src) - visible_message(" The [M.name] has glomped [src]!", \ - " The [M.name] has glomped [src]!") - var/damage = rand(1, 3) - attacked += 5 - - if(M.is_adult) - damage = rand(1, 6) - else - damage = rand(1, 3) - - adjustBruteLoss(damage) - - updatehealth() - return - -/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob) - if(M.melee_damage_upper == 0) - M.custom_emote(1, "[M.friendly] [src]") - else - M.do_attack_animation(src) - if(M.attack_sound) - playsound(loc, M.attack_sound, 50, 1, 1) - visible_message("[M] [M.attacktext] [src]!", \ - "[M] [M.attacktext] [src]!") - M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") - src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - attacked += 10 - adjustBruteLoss(damage) - updatehealth() - -/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob) - - switch(L.a_intent) - - if(I_HELP) - visible_message("[L] rubs its head against [src].") - - - else - L.do_attack_animation(src) - attacked += 10 - visible_message("[L] bites [src]!", \ - "[L] bites [src]!") - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - - if(stat != DEAD) - var/damage = rand(1, 3) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - adjustBruteLoss(damage) - -/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - ..() - - if(Victim) - if(Victim == M) - if(prob(60)) - visible_message("[M] attempts to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(90) && !client) - Discipline++ - - spawn() - SStun = 1 - sleep(rand(45,60)) - if(src) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - - else - if(prob(30)) - visible_message("[M] attempts to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(80) && !client) - Discipline++ - - if(!is_adult) - if(Discipline == 1) - attacked = 0 - - spawn() - SStun = 1 - sleep(rand(55,65)) - if(src) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - -/* - if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = M.gloves - if(G.cell) - if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien. - if(G.cell.charge >= 2500) - G.cell.use(2500) - visible_message("[src] has been touched with the stun gloves by [M]!") - return - else - M << "\red Not enough charge! " - return -*/ - - switch(M.a_intent) - - if (I_HELP) - help_shake_act(M) - - if (I_GRAB) - grabbedby(M) - - else - M.do_attack_animation(src) - var/damage = rand(1, 9) - - attacked += 10 - if (prob(90)) - if (HULK in M.mutations) - damage += 5 - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - spawn(0) - - step_away(src,M,15) - sleep(3) - step_away(src,M,15) - - - playsound(loc, "punch", 25, 1, -1) - visible_message("[M] has punched [src]!", \ - "[M] has punched [src]!") - - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to punch [src]!") - return - - - -/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - switch(M.a_intent) - if (I_HELP) - visible_message("[M] caresses [src] with its scythe like arm.") - - if (I_HARM) - M.do_attack_animation(src) - if (prob(95)) - attacked += 10 - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - visible_message("[M] has attacked [name]!", \ - "[M] has attacked [name]!") - else - visible_message("[M] has wounded [name]!", \ - ")[M] has wounded [name]!") - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to lunge at [name]!", \ - "[M] has attempted to lunge at [name]!") - - if (I_GRAB) - grabbedby(M) - - if (I_DISARM) - M.do_attack_animation(src) - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - var/damage = 5 - attacked += 10 - - if(prob(95)) - visible_message("[M] has tackled [name]!", \ - "[M] has tackled [name]!") - - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - if(!istype(src, /mob/living/carbon/slime)) - if(Discipline == 1) - attacked = 0 - - spawn() - SStun = 1 - sleep(rand(5,20)) - SStun = 0 - - spawn(0) - - step_away(src,M,15) - sleep(3) - step_away(src,M,15) - - else - drop_item() - visible_message("[M] has disarmed [name]!", - "[M] has disarmed [name]!") - adjustBruteLoss(damage) - updatehealth() - return - -/mob/living/carbon/slime/attackby(obj/item/W, mob/user, params) - if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma. - if (user in Friends) - ++Friends[user] - else - Friends[user] = 1 - user << "You feed the slime the plasma. It chirps happily." - var/obj/item/stack/sheet/mineral/plasma/S = W - S.use(1) - return - else if(W.force > 0) - attacked += 10 - if(prob(25)) - user << "[W] passes right through [src]!" - return - if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? - Discipline = 0 - else if(W.force >= 3) - if(is_adult) - if(prob(5 + round(W.force/2))) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - - Victim = null - Target = null - anchored = 0 - - spawn() - SStun = 1 - sleep(rand(5,20)) - SStun = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - - else - if(prob(10 + W.force*2)) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - if(Discipline == 1) - attacked = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) - SStun = 0 - - Victim = null - Target = null - anchored = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force*4)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - ..() - -/mob/living/carbon/slime/restrained() - return 0 - -mob/living/carbon/slime/var/temperature_resistance = T0C+75 - -/mob/living/carbon/slime/show_inv(mob/user) - return - -/mob/living/carbon/slime/toggle_throw_mode() - return - -/mob/living/carbon/slime/proc/apply_water() - adjustToxLoss(rand(15,20)) - if (!client) - if (Target) // Like cats - Target = null - ++Discipline - return - -/mob/living/carbon/slime/can_use_vents() - if(Victim) - return "You cannot ventcrawl while feeding." - ..() - -/obj/item/slime_extract - name = "slime extract" - desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." - icon = 'icons/mob/slimes.dmi' - icon_state = "grey slime extract" - force = 1.0 - w_class = 1.0 - throwforce = 0 - throw_speed = 3 - throw_range = 6 - origin_tech = "biotech=4" - item_color = "grey" - var/Uses = 1 // uses before it goes inert - var/enhanced = 0 //has it been enhanced before? - - attackby(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/weapon/slimesteroid2)) - if(enhanced == 1) - user << " This extract has already been enhanced!" - return ..() - if(Uses == 0) - user << " You can't enhance a used extract!" - return ..() - user <<"You apply the enhancer. It now has triple the amount of uses." - Uses = 3 - enhanced = 1 - qdel(O) - if(istype(O,/obj/item/weapon/storage/bag)) - ..() - -/obj/item/slime_extract/New() - ..() - create_reagents(100) - - -/obj/item/slime_extract/grey - name = "grey slime extract" - icon_state = "grey slime extract" - item_color = "grey" - -/obj/item/slime_extract/gold - name = "gold slime extract" - icon_state = "gold slime extract" - item_color = "gold" - -/obj/item/slime_extract/silver - name = "silver slime extract" - icon_state = "silver slime extract" - item_color = "silver" - -/obj/item/slime_extract/metal - name = "metal slime extract" - icon_state = "metal slime extract" - item_color = "metal" - -/obj/item/slime_extract/purple - name = "purple slime extract" - icon_state = "purple slime extract" - item_color = "purple" - -/obj/item/slime_extract/darkpurple - name = "dark purple slime extract" - icon_state = "dark purple slime extract" - item_color = "darkpurple" - -/obj/item/slime_extract/orange - name = "orange slime extract" - icon_state = "orange slime extract" - item_color = "orange" - -/obj/item/slime_extract/yellow - name = "yellow slime extract" - icon_state = "yellow slime extract" - item_color = "yellow" - -/obj/item/slime_extract/red - name = "red slime extract" - icon_state = "red slime extract" - item_color = "red" - -/obj/item/slime_extract/blue - name = "blue slime extract" - icon_state = "blue slime extract" - item_color = "blue" - -/obj/item/slime_extract/darkblue - name = "dark blue slime extract" - icon_state = "dark blue slime extract" - item_color = "darkblue" - -/obj/item/slime_extract/pink - name = "pink slime extract" - icon_state = "pink slime extract" - item_color = "pink" - -/obj/item/slime_extract/green - name = "green slime extract" - icon_state = "green slime extract" - item_color = "green" - -/obj/item/slime_extract/lightpink - name = "light pink slime extract" - icon_state = "light pink slime extract" - item_color = "lightpink" - -/obj/item/slime_extract/black - name = "black slime extract" - icon_state = "black slime extract" - item_color = "black" - -/obj/item/slime_extract/oil - name = "oil slime extract" - icon_state = "oil slime extract" - item_color = "oil" - -/obj/item/slime_extract/adamantine - name = "adamantine slime extract" - icon_state = "adamantine slime extract" - item_color = "adamantine" - -/obj/item/slime_extract/bluespace - name = "bluespace slime extract" - icon_state = "bluespace slime extract" - -/obj/item/slime_extract/pyrite - name = "pyrite slime extract" - icon_state = "pyrite slime extract" - -/obj/item/slime_extract/cerulean - name = "cerulean slime extract" - icon_state = "cerulean slime extract" - -/obj/item/slime_extract/sepia - name = "sepia slime extract" - icon_state = "sepia slime extract" - -/obj/item/slime_extract/rainbow - name = "rainbow slime extract" - icon_state = "rainbow slime extract" - -////Pet Slime Creation/// - -/obj/item/weapon/slimepotion - name = "docility potion" - desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle19" - w_class = 1 - origin_tech = "biotech=4" - - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - user << " The potion only works on slimes!" - return ..() - if(M.stat) - user << " The slime is dead!" - return..() - if(M.mind) - user << " The slime resists!" - return ..() - if(M.is_adult) - var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) - pet.icon_state = "[M.colour] adult slime" - pet.icon_living = "[M.colour] adult slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) - - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname - qdel(src) - else - var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) - pet.icon_state = "[M.colour] baby slime" - pet.icon_living = "[M.colour] baby slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) - - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname - qdel(src) - user <<"You feed the slime the potion, removing it's powers and calming it." - -/obj/item/weapon/sentience_potion - name = "sentience potion" - desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle19" - origin_tech = "biotech=5" - var/list/not_interested = list() - var/being_used = 0 - w_class = 1 - - -/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user) - if(being_used || !ismob(M)) - return - if(!isslime(M) && !isanimal(M) || M.ckey) //only works on animals that aren't player controlled - user << "[M] is already too intelligent for this to work!" - return ..() - if(M.stat) - user << "[M] is dead!" - return..() - - user << "You offer the sentience potion to [M]..." - being_used = 1 - - var/list/candidates = get_candidates(ROLE_SENTIENT, ALIEN_AFK_BRACKET) - - shuffle(candidates) - - var/time_passed = world.time - var/list/consenting_candidates = list() - - for(var/candidate in candidates) - - if(candidate in not_interested) - continue - - spawn(0) - switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No")) - if("Yes") - if((world.time-time_passed)>=50 || !src) - return - consenting_candidates += candidate - if("No") - if(!src) - return - not_interested += candidate - - sleep(50) - - if(!src) - return - - listclearnulls(consenting_candidates) //some candidates might have left during sleep(50) - - if(consenting_candidates.len) - var/client/C = null - C = pick(consenting_candidates) - M.key = C.key - M.universal_speak = 1 - M.faction |= "sentient" - M << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" - M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." - user << "[M] accepts the potion and suddenly becomes attentive and aware. It worked!" - if(isanimal(M)) - var/mob/living/simple_animal/S = M - S.master_commander = user - qdel(src) - else - user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later." - being_used = 0 - ..() - - -/obj/item/weapon/slimesteroid - name = "slime steroid" - desc = "A potent chemical mix that will cause a slime to generate more extract." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" - w_class = 1 - origin_tech = "biotech=4" - - - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - user << " The steroid only works on baby slimes!" - return ..() - if(M.is_adult) //Can't tame adults - user << " Only baby slimes can use the steroid!" - return..() - if(M.stat) - user << " The slime is dead!" - return..() - if(M.cores == 3) - user <<" The slime already has the maximum amount of extract!" - return..() - - user <<"You feed the slime the steroid. It now has triple the amount of extract." - M.cores = 3 - qdel(src) - -/obj/item/weapon/slimesteroid2 - name = "extract enhancer" - desc = "A potent chemical mix that will give a slime extract three uses." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - w_class = 1 - origin_tech = "biotech=4" - - -/obj/item/weapon/slimespeed - name = "slime speed potion" - desc = "A potent chemical mix that will remove the slowdown from any item." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle3" - w_class = 1 - origin_tech = "biotech=4" - -/obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user) - ..() - if(!istype(C)) - user << "The potion can only be used on items!" - return - if(C.slowdown <= 0) - user << "The [C] can't be made any faster!" - return..() - user <<"You slather the red gunk over the [C], making it faster." - C.color = "#FF0000" - C.slowdown = 0 - qdel(src) - -/obj/item/weapon/slimefireproof - name = "slime chill potion" - desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - var/uses = 3 - w_class = 1 - origin_tech = "biotech=4" - - -/obj/item/weapon/slimefireproof/afterattack(obj/item/clothing/C, mob/user) - ..() - if(!uses) - qdel(src) - return - if(!istype(C)) - user << "The potion can only be used on clothing!" - return - if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) - user << "The [C] is already fireproof!" - return..() - user <<"You slather the blue gunk over the [C], fireproofing it." - C.name = "fireproofed [C.name]" - C.color = "#000080" - C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT - C.heat_protection = C.body_parts_covered - uses -- - if(!uses) - qdel(src) - -/obj/item/stack/tile/bluespace - name = "bluespace floor tile" - singular_name = "floor tile" - desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." - icon_state = "tile-bluespace" - w_class = 3 - force = 6 - materials = list(MAT_METAL=500) - throwforce = 10 - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - max_amount = 60 - turf_type = /turf/simulated/floor/bluespace - - -/turf/simulated/floor/bluespace - slowdown = -1 - icon_state = "bluespace" - desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." - floor_tile = /obj/item/stack/tile/bluespace - - -/obj/item/stack/tile/sepia - name = "sepia floor tile" - singular_name = "floor tile" - desc = "Time seems to flow very slowly around these tiles." - icon_state = "tile-sepia" - w_class = 3 - force = 6 - materials = list(MAT_METAL=500) - throwforce = 10 - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - max_amount = 60 - turf_type = /turf/simulated/floor/sepia - - -/turf/simulated/floor/sepia - slowdown = 2 - icon_state = "sepia" - desc = "Time seems to flow very slowly around these tiles." - floor_tile = /obj/item/stack/tile/sepia - -/obj/effect/goleRUNe - anchored = 1 - desc = "a strange rune used to create golems. It glows when spirits are nearby." - name = "rune" - icon = 'icons/obj/rune.dmi' - icon_state = "golem" - unacidable = 1 - layer = TURF_LAYER - var/list/mob/dead/observer/ghosts[0] - - New() - ..() - processing_objects.Add(src) - - process() - if(ghosts.len>0) - icon_state = "golem2" - else - icon_state = "golem" - - attack_hand(mob/living/user as mob) - var/mob/dead/observer/ghost - for(var/mob/dead/observer/O in src.loc) - if(!check_observer(O)) - O << "\red You are not eligible to become a golem." - continue - ghost = O - break - if(!ghost) - user << "The rune fizzles uselessly. There is no spirit nearby." - return - var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem - if(prob(50)) G.gender = "female" - G.loc = src.loc - G.key = ghost.key - G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." - qdel(src) - - - proc/announce_to_ghosts() - for(var/mob/dead/observer/O in player_list) - if(O.client) - var/area/A = get_area(src) - if(A) - O << "\blue Golem rune created in [A.name]. (Teleport | Sign Up)" - - Topic(href,href_list) - if("signup" in href_list) - var/mob/dead/observer/O = locate(href_list["signup"]) - volunteer(O) - - attack_ghost(var/mob/dead/observer/O) - if(!O) return - volunteer(O) - - proc/check_observer(var/mob/dead/observer/O) - if(!O) - return 0 - if(!O.client) - return 0 - if(O.mind && O.mind.current && O.mind.current.stat != DEAD) - return 0 - if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - return 0 - return 1 - - proc/volunteer(var/mob/dead/observer/O) - if(O in ghosts) - ghosts.Remove(O) - O << "\red You are no longer signed up to be a golem." - else - if(!check_observer(O)) - O << "\red You are not eligible to become a golem." - return - ghosts.Add(O) - O << "\blue You are signed up to be a golem." \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/slime/death.dm similarity index 93% rename from code/modules/mob/living/carbon/metroid/death.dm rename to code/modules/mob/living/carbon/slime/death.dm index e7cac39a36c..6e951320bdc 100644 --- a/code/modules/mob/living/carbon/metroid/death.dm +++ b/code/modules/mob/living/carbon/slime/death.dm @@ -1,29 +1,29 @@ -/mob/living/carbon/slime/death(gibbed) - if(!gibbed) - if(is_adult) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) - M.colour = colour - M.rabid = 1 - is_adult = 0 - maxHealth = 150 - revive() - regenerate_icons() - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - return - - if(stat == DEAD) return - stat = DEAD - icon_state = "[colour] baby slime dead" - overlays.len = 0 - for(var/mob/O in viewers(src, null)) - O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist - - update_canmove() - if(blind) - blind.layer = 0 - - if(ticker && ticker.mode) - ticker.mode.check_win() - +/mob/living/carbon/slime/death(gibbed) + if(!gibbed) + if(is_adult) + var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) + M.colour = colour + M.rabid = 1 + is_adult = 0 + maxHealth = 150 + revive() + regenerate_icons() + number = rand(1, 1000) + name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" + return + + if(stat == DEAD) return + stat = DEAD + icon_state = "[colour] baby slime dead" + overlays.len = 0 + for(var/mob/O in viewers(src, null)) + O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist + + update_canmove() + if(blind) + blind.layer = 0 + + if(ticker && ticker.mode) + ticker.mode.check_win() + return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm similarity index 96% rename from code/modules/mob/living/carbon/metroid/emote.dm rename to code/modules/mob/living/carbon/slime/emote.dm index fa7e5c07466..dcc0b066487 100644 --- a/code/modules/mob/living/carbon/metroid/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -1,74 +1,74 @@ -/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null) - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - //param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - switch(act) //Alphabetical please - if ("me") - if(silent) - return - if (src.client) - if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - if (stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - if("bounce") - message = "The [src.name] bounces in place." - m_type = 1 - - if ("custom") - return custom_emote(m_type, message) - - if("jiggle") - message = "The [src.name] jiggles!" - m_type = 1 - - if("light") - message = "The [src.name] lights up for a bit, then stops." - m_type = 1 - - if("moan") - message = "The [src.name] moans." - m_type = 2 - - if("shiver") - message = "The [src.name] shivers." - m_type = 2 - - if("sway") - message = "The [src.name] sways around dizzily." - m_type = 1 - - if("twitch") - message = "The [src.name] twitches." - m_type = 1 - - if("vibrate") - message = "The [src.name] vibrates!" - m_type = 1 - - if ("help") //This is an exception - src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate" - - else - src << "\blue Unusable emote '[act]'. Say *help for a list." - if ((message && src.stat == 0)) - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - //Foreach goto(703) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) - //Foreach goto(746) +/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null) + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + //param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + switch(act) //Alphabetical please + if ("me") + if(silent) + return + if (src.client) + if (client.prefs.muted & MUTE_IC) + src << "\red You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + return custom_emote(m_type, message) + if("bounce") + message = "The [src.name] bounces in place." + m_type = 1 + + if ("custom") + return custom_emote(m_type, message) + + if("jiggle") + message = "The [src.name] jiggles!" + m_type = 1 + + if("light") + message = "The [src.name] lights up for a bit, then stops." + m_type = 1 + + if("moan") + message = "The [src.name] moans." + m_type = 2 + + if("shiver") + message = "The [src.name] shivers." + m_type = 2 + + if("sway") + message = "The [src.name] sways around dizzily." + m_type = 1 + + if("twitch") + message = "The [src.name] twitches." + m_type = 1 + + if("vibrate") + message = "The [src.name] vibrates!" + m_type = 1 + + if ("help") //This is an exception + src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate" + + else + src << "\blue Unusable emote '[act]'. Say *help for a list." + if ((message && src.stat == 0)) + if (m_type & 1) + for(var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + //Foreach goto(703) + else + for(var/mob/O in hearers(src, null)) + O.show_message(message, m_type) + //Foreach goto(746) return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm similarity index 95% rename from code/modules/mob/living/carbon/metroid/examine.dm rename to code/modules/mob/living/carbon/slime/examine.dm index 67ef5770103..826fa93c22e 100644 --- a/code/modules/mob/living/carbon/metroid/examine.dm +++ b/code/modules/mob/living/carbon/slime/examine.dm @@ -1,44 +1,44 @@ -/mob/living/carbon/slime/examine(mob/user) - ..(user) - var/msg = "" - if (src.stat == DEAD) - msg += "It is limp and unresponsive.\n" - else - if (src.getBruteLoss()) - msg += "" - if (src.getBruteLoss() < 40) - msg += "It has some punctures in its flesh!" - else - msg += "It has severe punctures and tears in its flesh!" - msg += "\n" - - switch(powerlevel) - - if(2 to 3) - msg += "It is flickering gently with a little electrical activity.\n" - - if(4 to 5) - msg += "It is glowing gently with moderate levels of electrical activity.\n" - - if(6 to 9) - msg += "It is glowing brightly with high levels of electrical activity.\n" - - if(10) - msg += "It is radiating with massive levels of electrical activity!\n" - - msg += "" - switch(wetlevel) - if(1) - msg += "It looks a bit damp.\n" - if(2) - msg += "It looks a little bit wet.\n" - if(3) - msg += "It looks wet.\n" - if(4) - msg += "It looks very wet.\n" - if(5) - msg += "It looks absolutely soaked.\n" - msg += "" - - msg += "*---------*" +/mob/living/carbon/slime/examine(mob/user) + ..(user) + var/msg = "" + if (src.stat == DEAD) + msg += "It is limp and unresponsive.\n" + else + if (src.getBruteLoss()) + msg += "" + if (src.getBruteLoss() < 40) + msg += "It has some punctures in its flesh!" + else + msg += "It has severe punctures and tears in its flesh!" + msg += "\n" + + switch(powerlevel) + + if(2 to 3) + msg += "It is flickering gently with a little electrical activity.\n" + + if(4 to 5) + msg += "It is glowing gently with moderate levels of electrical activity.\n" + + if(6 to 9) + msg += "It is glowing brightly with high levels of electrical activity.\n" + + if(10) + msg += "It is radiating with massive levels of electrical activity!\n" + + msg += "" + switch(wetlevel) + if(1) + msg += "It looks a bit damp.\n" + if(2) + msg += "It looks a little bit wet.\n" + if(3) + msg += "It looks wet.\n" + if(4) + msg += "It looks very wet.\n" + if(5) + msg += "It looks absolutely soaked.\n" + msg += "" + + msg += "*---------*" user << msg \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/slime/life.dm similarity index 96% rename from code/modules/mob/living/carbon/metroid/life.dm rename to code/modules/mob/living/carbon/slime/life.dm index b70075a084b..1e3d901755a 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -1,552 +1,552 @@ -/mob/living/carbon/slime - var/AIproc = 0 // determines if the AI loop is activated - var/Atkcool = 0 // attack cooldown - var/Tempstun = 0 // temporary temperature stuns - var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while - var/SStun = 0 // stun variable - -/mob/living/carbon/slime/Life() - if(..()) - handle_nutrition() - handle_targets() - if (!ckey) - handle_speech_and_mood() - -/mob/living/carbon/slime/proc/AIprocess() // the master AI process - - if(AIproc || stat == DEAD || client) return - - var/hungry = 0 - if (nutrition < get_starve_nutrition()) - hungry = 2 - else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - AIproc = 1 - - while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim)) - if(Victim) // can't eat AND have this little process at the same time - break - - if(!Target || client) - break - - if(Target.health <= -70 || Target.stat == 2) - Target = null - AIproc = 0 - break - - if(Target) - for(var/mob/living/carbon/slime/M in view(1,Target)) - if(M.Victim == Target) - Target = null - AIproc = 0 - break - if(!AIproc) - break - - if(Target in view(1,src)) - if(istype(Target, /mob/living/silicon)) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - return - if(!Target.lying && prob(80)) - - if(Target.client && Target.health >= 20) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(Target in view(7, src)) - if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them - step_to(src, Target) - sleep(5) - - else - Target = null - AIproc = 0 - break - - var/sleeptime = movement_delay() - if(sleeptime <= 0) sleeptime = 1 - - sleep(sleeptime + 2) // this is about as fast as a player slime can go - - AIproc = 0 - -/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) - if(!environment) - adjustToxLoss(rand(10,20)) - return - - //var/environment_heat_capacity = environment.heat_capacity() - var/loc_temp = T0C - if(istype(get_turf(src), /turf/space)) - //environment_heat_capacity = loc:heat_capacity - var/turf/heat_turf = get_turf(src) - loc_temp = heat_turf.temperature - else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) - loc_temp = loc:air_contents.temperature - else - loc_temp = environment.temperature - - //Account for massive pressure differences - if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc - if(bodytemperature <= (T0C - 40)) // stun temperature - Tempstun = 1 - - if(bodytemperature <= (T0C - 50)) // hurt temperature - if(bodytemperature <= 50) // sqrting negative numbers is bad - adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults), - else //so the ToxLoss needs to be 300 or above to guarrantee an instant death - adjustToxLoss(round(sqrt(bodytemperature)) * 2) - else - Tempstun = 0 - - - /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ - if(loc_temp < 310.15) // a cold place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - else // a hot place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - - updatehealth() - - return //TODO: DEFERRED - -/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change - -/mob/living/carbon/slime/handle_chemicals_in_body() - - if(reagents) reagents.metabolize(src) - if (reagents.get_reagent_amount("plasma")>=5) - mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% - reagents.remove_reagent("plasma", 5) - if (reagents.get_reagent_amount("epinephrine")>=5) - mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0% - reagents.remove_reagent("epinephrine", 5) - src.updatehealth() - - return //TODO: DEFERRED - -/mob/living/carbon/slime/handle_regular_status_updates() - - if(is_adult) - health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - else - health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - - if(health < config.health_threshold_dead && stat != 2) - death() - return - - else if(src.health <= config.health_threshold_crit) - - if(!src.reagents.has_reagent("epinephrine")) - src.adjustOxyLoss(10) - - if(src.stat != DEAD) - src.stat = UNCONSCIOUS - - if(prob(30)) //I think this is meant to allow slimes to starve to death - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) - - if (src.stat == DEAD) - src.lying = 1 - src.blinded = 1 - else - if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. - if (src.stunned > 0) - AdjustStunned(-1) - src.stat = 0 - if (src.weakened > 0) - AdjustWeakened(-1) - src.lying = 0 - src.stat = 0 - if (src.paralysis > 0) - AdjustParalysis(-1) - src.blinded = 0 - src.lying = 0 - src.stat = 0 - - else - src.lying = 0 - src.stat = 0 - - if (src.stuttering) src.stuttering = 0 - - if (src.eye_blind) - src.eye_blind = 0 - src.blinded = 1 - - if (src.ear_deaf > 0) src.ear_deaf = 0 - if (src.ear_damage < 25) - src.ear_damage = 0 - - src.density = !( src.lying ) - - if (src.sdisabilities & BLIND) - src.blinded = 1 - if (src.sdisabilities & DEAF) - src.ear_deaf = 1 - - if (src.eye_blurry > 0) - src.eye_blurry = 0 - - if (src.druggy > 0) - src.druggy = 0 - - return 1 - -/mob/living/carbon/slime/proc/handle_nutrition() - - if (prob(15)) - nutrition -= 1 + is_adult - - if(nutrition <= 0) - nutrition = 0 - if(prob(75)) - adjustToxLoss(rand(0,5)) - - else if (nutrition >= get_grow_nutrition() && amount_grown < 10) - nutrition -= 20 - amount_grown++ - - if(amount_grown >= 10 && !Victim && !Target && !ckey) - if(is_adult) - Reproduce() - else - Evolve() - - -/mob/living/carbon/slime/proc/handle_targets() - if(Tempstun) - if(!Victim) // not while they're eating! - canmove = 0 - else - canmove = 1 - - if(attacked > 50) attacked = 50 - - if(attacked > 0) - attacked-- - - if(Discipline > 0) - - if(Discipline >= 5 && rabid) - if(prob(60)) rabid = 0 - - if(prob(10)) - Discipline-- - - if(!client) - if(!canmove) return - - if(Victim) return // if it's eating someone already, continue eating! - - if(Target) - --target_patience - if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention - target_patience = 0 - Target = null - - if(AIproc && SStun) return - - var/hungry = 0 // determines if the slime is hungry - - if (nutrition < get_starve_nutrition()) - hungry = 2 - else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends - if(Friends.len > 0 && prob(1)) - var/mob/nofriend = pick(Friends) - --Friends[nofriend] - - if(!Target) - if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to - var/list/targets = list() - - for(var/mob/living/L in view(7,src)) - - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs - continue - - if(L in Friends) // No eating friends! - continue - - if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence - targets += L // Possible target found! - - if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men - var/mob/living/carbon/human/H = L - if(H.species.name == "Slime People") - continue - - if(!L.canmove) // Only one slime can latch on at a time. - var/notarget = 0 - for(var/mob/living/carbon/slime/M in view(1,L)) - if(M.Victim == L) - notarget = 1 - if(notarget) - continue - - targets += L // Possible target found! - - if(targets.len > 0) - if(attacked || rabid || hungry == 2) - Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care - else - for(var/mob/living/carbon/C in targets) - if(!Discipline && prob(5)) - if(ishuman(C) || isalienadult(C)) - Target = C - break - - if(islarva(C) || issmall(C)) - Target = C - break - - if (Target) - target_patience = rand(5,7) - if (is_adult) - target_patience += 3 - - if(!Target) // If we have no target, we are wandering or following orders - if (Leader) - if (holding_still) - holding_still = max(holding_still - 1, 0) - else if(canmove && isturf(loc)) - step_to(src, Leader) - - else if(hungry) - if (holding_still) - holding_still = max(holding_still - hungry, 0) - else if(canmove && isturf(loc) && prob(50)) - step(src, pick(cardinal)) - - else - if (holding_still) - holding_still = max(holding_still - 1, 0) - else if(canmove && isturf(loc) && prob(33)) - step(src, pick(cardinal)) - else if(!AIproc) - spawn() - AIprocess() - -/mob/living/carbon/slime/proc/handle_speech_and_mood() - //Mood starts here - var/newmood = "" - if (rabid || attacked) newmood = "angry" - else if (Target) newmood = "mischevous" - - if (!newmood) - if (Discipline && prob(25)) - newmood = "pout" - else if (prob(1)) - newmood = pick("sad", ":3", "pout") - - if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) - if (prob(75)) newmood = mood - - if (newmood != mood) // This is so we don't redraw them every time - mood = newmood - regenerate_icons() - - //Speech understanding starts here - var/to_say - if (speech_buffer.len > 0) - var/who = speech_buffer[1] // Who said it? - var/phrase = speech_buffer[2] // What did they say? - if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us - if (findtext(phrase, "hello") || findtext(phrase, "hi")) - to_say = pick("Hello...", "Hi...") - else if (findtext(phrase, "follow")) - if (Leader) - if (Leader == who) // Already following him - to_say = pick("Yes...", "Lead...", "Following...") - else if (Friends[who] > Friends[Leader]) // VIVA - Leader = who - to_say = "Yes... I follow [who]..." - else - to_say = "No... I follow [Leader]..." - else - if (Friends[who] > 2) - Leader = who - to_say = "I follow..." - else // Not friendly enough - to_say = pick("No...", "I won't follow...") - else if (findtext(phrase, "stop")) - if (Victim) // We are asked to stop feeding - if (Friends[who] > 4) - Victim = null - Target = null - if (Friends[who] < 7) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Target) // We are asked to stop chasing - if (Friends[who] > 3) - Target = null - if (Friends[who] < 6) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Leader) // We are asked to stop following - if (Leader == who) - to_say = "Yes... I'll stay..." - Leader = null - else - if (Friends[who] > Friends[Leader]) - Leader = null - to_say = "Yes... I'll stop..." - else - to_say = "No... I'll keep following..." - else if (findtext(phrase, "stay")) - if (Leader) - if (Leader == who) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else if (Friends[who] > Friends[Leader]) - holding_still = (Friends[who] - Friends[Leader]) * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I'll keep following..." - else - if (Friends[who] > 2) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I won't stay..." - speech_buffer = list() - - //Speech starts here - if (to_say) - say (to_say) - else if(prob(1)) - emote(pick("bounce","sway","light","vibrate","jiggle")) - else - var/t = 10 - var/slimes_near = -1 // Don't count myself - var/dead_slimes = 0 - var/friends_near = list() - for (var/mob/living/carbon/M in view(7,src)) - if (isslime(M)) - ++slimes_near - if (M.stat == DEAD) - ++dead_slimes - if (M in Friends) - t += 20 - friends_near += M - if (nutrition < get_hunger_nutrition()) t += 10 - if (nutrition < get_starve_nutrition()) t += 10 - if (prob(2) && prob(t)) - var/phrases = list() - if (Target) phrases += "[Target]... looks tasty..." - if (nutrition < get_starve_nutrition()) - phrases += "So... hungry..." - phrases += "Very... hungry..." - phrases += "Need... food..." - phrases += "Must... eat..." - else if (nutrition < get_hunger_nutrition()) - phrases += "Hungry..." - phrases += "Where is the food?" - phrases += "I want to eat..." - phrases += "Rawr..." - phrases += "Blop..." - phrases += "Blorble..." - if (rabid || attacked) - phrases += "Hrr..." - phrases += "Nhuu..." - phrases += "Unn..." - if (mood == ":3") - phrases += "Purr..." - if (attacked) - phrases += "Grrr..." - if (getToxLoss() > 30) - phrases += "Cold..." - if (getToxLoss() > 60) - phrases += "So... cold..." - phrases += "Very... cold..." - if (getToxLoss() > 90) - phrases += "..." - phrases += "C... c..." - if (Victim) - phrases += "Nom..." - phrases += "Tasty..." - if (powerlevel > 3) phrases += "Bzzz..." - if (powerlevel > 5) phrases += "Zap..." - if (powerlevel > 8) phrases += "Zap... Bzz..." - if (mood == "sad") phrases += "Bored..." - if (slimes_near) phrases += "Brother..." - if (slimes_near > 1) phrases += "Brothers..." - if (dead_slimes) phrases += "What happened?" - if (!slimes_near) - phrases += "Lonely..." - for (var/M in friends_near) - phrases += "[M]... friend..." - if (nutrition < get_hunger_nutrition()) - phrases += "[M]... feed me..." - say (pick(phrases)) - -/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it - if (is_adult) return 1200 - else return 1000 - -/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat - if (is_adult) return 1000 - else return 800 - -/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat - if (is_adult) return 600 - else return 500 - -/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else - if (is_adult) return 300 - else return 200 - -/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing - if (hunger == 2 || rabid || attacked) return 1 - if (Leader) return 0 - if (holding_still) return 0 - return 1 +/mob/living/carbon/slime + var/AIproc = 0 // determines if the AI loop is activated + var/Atkcool = 0 // attack cooldown + var/Tempstun = 0 // temporary temperature stuns + var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while + var/SStun = 0 // stun variable + +/mob/living/carbon/slime/Life() + if(..()) + handle_nutrition() + handle_targets() + if (!ckey) + handle_speech_and_mood() + +/mob/living/carbon/slime/proc/AIprocess() // the master AI process + + if(AIproc || stat == DEAD || client) return + + var/hungry = 0 + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + AIproc = 1 + + while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim)) + if(Victim) // can't eat AND have this little process at the same time + break + + if(!Target || client) + break + + if(Target.health <= -70 || Target.stat == 2) + Target = null + AIproc = 0 + break + + if(Target) + for(var/mob/living/carbon/slime/M in view(1,Target)) + if(M.Victim == Target) + Target = null + AIproc = 0 + break + if(!AIproc) + break + + if(Target in view(1,src)) + if(istype(Target, /mob/living/silicon)) + if(!Atkcool) + Atkcool = 1 + spawn(45) + Atkcool = 0 + + if(Target.Adjacent(src)) + Target.attack_slime(src) + return + if(!Target.lying && prob(80)) + + if(Target.client && Target.health >= 20) + if(!Atkcool) + Atkcool = 1 + spawn(45) + Atkcool = 0 + + if(Target.Adjacent(src)) + Target.attack_slime(src) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else + if(Target in view(7, src)) + if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them + step_to(src, Target) + sleep(5) + + else + Target = null + AIproc = 0 + break + + var/sleeptime = movement_delay() + if(sleeptime <= 0) sleeptime = 1 + + sleep(sleeptime + 2) // this is about as fast as a player slime can go + + AIproc = 0 + +/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) + if(!environment) + adjustToxLoss(rand(10,20)) + return + + //var/environment_heat_capacity = environment.heat_capacity() + var/loc_temp = T0C + if(istype(get_turf(src), /turf/space)) + //environment_heat_capacity = loc:heat_capacity + var/turf/heat_turf = get_turf(src) + loc_temp = heat_turf.temperature + else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) + loc_temp = loc:air_contents.temperature + else + loc_temp = environment.temperature + + //Account for massive pressure differences + if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc + if(bodytemperature <= (T0C - 40)) // stun temperature + Tempstun = 1 + + if(bodytemperature <= (T0C - 50)) // hurt temperature + if(bodytemperature <= 50) // sqrting negative numbers is bad + adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults), + else //so the ToxLoss needs to be 300 or above to guarrantee an instant death + adjustToxLoss(round(sqrt(bodytemperature)) * 2) + else + Tempstun = 0 + + + /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ + if(loc_temp < 310.15) // a cold place + bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) + else // a hot place + bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) + + updatehealth() + + return //TODO: DEFERRED + +/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost) + var/temperature = current + var/difference = abs(current-loc_temp) //get difference + var/increments// = difference/10 //find how many increments apart they are + if(difference > 50) + increments = difference/5 + else + increments = difference/10 + var/change = increments*boost // Get the amount to change by (x per increment) + var/temp_change + if(current < loc_temp) + temperature = min(loc_temp, temperature+change) + else if(current > loc_temp) + temperature = max(loc_temp, temperature-change) + temp_change = (temperature - current) + return temp_change + +/mob/living/carbon/slime/handle_chemicals_in_body() + + if(reagents) reagents.metabolize(src) + if (reagents.get_reagent_amount("plasma")>=5) + mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% + reagents.remove_reagent("plasma", 5) + if (reagents.get_reagent_amount("epinephrine")>=5) + mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0% + reagents.remove_reagent("epinephrine", 5) + src.updatehealth() + + return //TODO: DEFERRED + +/mob/living/carbon/slime/handle_regular_status_updates() + + if(is_adult) + health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) + else + health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) + + if(health < config.health_threshold_dead && stat != 2) + death() + return + + else if(src.health <= config.health_threshold_crit) + + if(!src.reagents.has_reagent("epinephrine")) + src.adjustOxyLoss(10) + + if(src.stat != DEAD) + src.stat = UNCONSCIOUS + + if(prob(30)) //I think this is meant to allow slimes to starve to death + adjustOxyLoss(-1) + adjustToxLoss(-1) + adjustFireLoss(-1) + adjustCloneLoss(-1) + adjustBruteLoss(-1) + + if (src.stat == DEAD) + src.lying = 1 + src.blinded = 1 + else + if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. + if (src.stunned > 0) + AdjustStunned(-1) + src.stat = 0 + if (src.weakened > 0) + AdjustWeakened(-1) + src.lying = 0 + src.stat = 0 + if (src.paralysis > 0) + AdjustParalysis(-1) + src.blinded = 0 + src.lying = 0 + src.stat = 0 + + else + src.lying = 0 + src.stat = 0 + + if (src.stuttering) src.stuttering = 0 + + if (src.eye_blind) + src.eye_blind = 0 + src.blinded = 1 + + if (src.ear_deaf > 0) src.ear_deaf = 0 + if (src.ear_damage < 25) + src.ear_damage = 0 + + src.density = !( src.lying ) + + if (src.sdisabilities & BLIND) + src.blinded = 1 + if (src.sdisabilities & DEAF) + src.ear_deaf = 1 + + if (src.eye_blurry > 0) + src.eye_blurry = 0 + + if (src.druggy > 0) + src.druggy = 0 + + return 1 + +/mob/living/carbon/slime/proc/handle_nutrition() + + if (prob(15)) + nutrition -= 1 + is_adult + + if(nutrition <= 0) + nutrition = 0 + if(prob(75)) + adjustToxLoss(rand(0,5)) + + else if (nutrition >= get_grow_nutrition() && amount_grown < 10) + nutrition -= 20 + amount_grown++ + + if(amount_grown >= 10 && !Victim && !Target && !ckey) + if(is_adult) + Reproduce() + else + Evolve() + + +/mob/living/carbon/slime/proc/handle_targets() + if(Tempstun) + if(!Victim) // not while they're eating! + canmove = 0 + else + canmove = 1 + + if(attacked > 50) attacked = 50 + + if(attacked > 0) + attacked-- + + if(Discipline > 0) + + if(Discipline >= 5 && rabid) + if(prob(60)) rabid = 0 + + if(prob(10)) + Discipline-- + + if(!client) + if(!canmove) return + + if(Victim) return // if it's eating someone already, continue eating! + + if(Target) + --target_patience + if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention + target_patience = 0 + Target = null + + if(AIproc && SStun) return + + var/hungry = 0 // determines if the slime is hungry + + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends + if(Friends.len > 0 && prob(1)) + var/mob/nofriend = pick(Friends) + --Friends[nofriend] + + if(!Target) + if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to + var/list/targets = list() + + for(var/mob/living/L in view(7,src)) + + if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs + continue + + if(L in Friends) // No eating friends! + continue + + if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence + targets += L // Possible target found! + + if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men + var/mob/living/carbon/human/H = L + if(H.species.name == "Slime People") + continue + + if(!L.canmove) // Only one slime can latch on at a time. + var/notarget = 0 + for(var/mob/living/carbon/slime/M in view(1,L)) + if(M.Victim == L) + notarget = 1 + if(notarget) + continue + + targets += L // Possible target found! + + if(targets.len > 0) + if(attacked || rabid || hungry == 2) + Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care + else + for(var/mob/living/carbon/C in targets) + if(!Discipline && prob(5)) + if(ishuman(C) || isalienadult(C)) + Target = C + break + + if(islarva(C) || issmall(C)) + Target = C + break + + if (Target) + target_patience = rand(5,7) + if (is_adult) + target_patience += 3 + + if(!Target) // If we have no target, we are wandering or following orders + if (Leader) + if (holding_still) + holding_still = max(holding_still - 1, 0) + else if(canmove && isturf(loc)) + step_to(src, Leader) + + else if(hungry) + if (holding_still) + holding_still = max(holding_still - hungry, 0) + else if(canmove && isturf(loc) && prob(50)) + step(src, pick(cardinal)) + + else + if (holding_still) + holding_still = max(holding_still - 1, 0) + else if(canmove && isturf(loc) && prob(33)) + step(src, pick(cardinal)) + else if(!AIproc) + spawn() + AIprocess() + +/mob/living/carbon/slime/proc/handle_speech_and_mood() + //Mood starts here + var/newmood = "" + if (rabid || attacked) newmood = "angry" + else if (Target) newmood = "mischevous" + + if (!newmood) + if (Discipline && prob(25)) + newmood = "pout" + else if (prob(1)) + newmood = pick("sad", ":3", "pout") + + if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) + if (prob(75)) newmood = mood + + if (newmood != mood) // This is so we don't redraw them every time + mood = newmood + regenerate_icons() + + //Speech understanding starts here + var/to_say + if (speech_buffer.len > 0) + var/who = speech_buffer[1] // Who said it? + var/phrase = speech_buffer[2] // What did they say? + if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us + if (findtext(phrase, "hello") || findtext(phrase, "hi")) + to_say = pick("Hello...", "Hi...") + else if (findtext(phrase, "follow")) + if (Leader) + if (Leader == who) // Already following him + to_say = pick("Yes...", "Lead...", "Following...") + else if (Friends[who] > Friends[Leader]) // VIVA + Leader = who + to_say = "Yes... I follow [who]..." + else + to_say = "No... I follow [Leader]..." + else + if (Friends[who] > 2) + Leader = who + to_say = "I follow..." + else // Not friendly enough + to_say = pick("No...", "I won't follow...") + else if (findtext(phrase, "stop")) + if (Victim) // We are asked to stop feeding + if (Friends[who] > 4) + Victim = null + Target = null + if (Friends[who] < 7) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if (Target) // We are asked to stop chasing + if (Friends[who] > 3) + Target = null + if (Friends[who] < 6) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if (Leader) // We are asked to stop following + if (Leader == who) + to_say = "Yes... I'll stay..." + Leader = null + else + if (Friends[who] > Friends[Leader]) + Leader = null + to_say = "Yes... I'll stop..." + else + to_say = "No... I'll keep following..." + else if (findtext(phrase, "stay")) + if (Leader) + if (Leader == who) + holding_still = Friends[who] * 10 + to_say = "Yes... Staying..." + else if (Friends[who] > Friends[Leader]) + holding_still = (Friends[who] - Friends[Leader]) * 10 + to_say = "Yes... Staying..." + else + to_say = "No... I'll keep following..." + else + if (Friends[who] > 2) + holding_still = Friends[who] * 10 + to_say = "Yes... Staying..." + else + to_say = "No... I won't stay..." + speech_buffer = list() + + //Speech starts here + if (to_say) + say (to_say) + else if(prob(1)) + emote(pick("bounce","sway","light","vibrate","jiggle")) + else + var/t = 10 + var/slimes_near = -1 // Don't count myself + var/dead_slimes = 0 + var/friends_near = list() + for (var/mob/living/carbon/M in view(7,src)) + if (isslime(M)) + ++slimes_near + if (M.stat == DEAD) + ++dead_slimes + if (M in Friends) + t += 20 + friends_near += M + if (nutrition < get_hunger_nutrition()) t += 10 + if (nutrition < get_starve_nutrition()) t += 10 + if (prob(2) && prob(t)) + var/phrases = list() + if (Target) phrases += "[Target]... looks tasty..." + if (nutrition < get_starve_nutrition()) + phrases += "So... hungry..." + phrases += "Very... hungry..." + phrases += "Need... food..." + phrases += "Must... eat..." + else if (nutrition < get_hunger_nutrition()) + phrases += "Hungry..." + phrases += "Where is the food?" + phrases += "I want to eat..." + phrases += "Rawr..." + phrases += "Blop..." + phrases += "Blorble..." + if (rabid || attacked) + phrases += "Hrr..." + phrases += "Nhuu..." + phrases += "Unn..." + if (mood == ":3") + phrases += "Purr..." + if (attacked) + phrases += "Grrr..." + if (getToxLoss() > 30) + phrases += "Cold..." + if (getToxLoss() > 60) + phrases += "So... cold..." + phrases += "Very... cold..." + if (getToxLoss() > 90) + phrases += "..." + phrases += "C... c..." + if (Victim) + phrases += "Nom..." + phrases += "Tasty..." + if (powerlevel > 3) phrases += "Bzzz..." + if (powerlevel > 5) phrases += "Zap..." + if (powerlevel > 8) phrases += "Zap... Bzz..." + if (mood == "sad") phrases += "Bored..." + if (slimes_near) phrases += "Brother..." + if (slimes_near > 1) phrases += "Brothers..." + if (dead_slimes) phrases += "What happened?" + if (!slimes_near) + phrases += "Lonely..." + for (var/M in friends_near) + phrases += "[M]... friend..." + if (nutrition < get_hunger_nutrition()) + phrases += "[M]... feed me..." + say (pick(phrases)) + +/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it + if (is_adult) return 1200 + else return 1000 + +/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat + if (is_adult) return 1000 + else return 800 + +/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat + if (is_adult) return 600 + else return 500 + +/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else + if (is_adult) return 300 + else return 200 + +/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing + if (hunger == 2 || rabid || attacked) return 1 + if (Leader) return 0 + if (holding_still) return 0 + return 1 diff --git a/code/modules/mob/living/carbon/metroid/login.dm b/code/modules/mob/living/carbon/slime/login.dm similarity index 93% rename from code/modules/mob/living/carbon/metroid/login.dm rename to code/modules/mob/living/carbon/slime/login.dm index 8ca29bf4818..d3ac320f2f4 100644 --- a/code/modules/mob/living/carbon/metroid/login.dm +++ b/code/modules/mob/living/carbon/slime/login.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/slime/Login() - ..() - update_hud() - return +/mob/living/carbon/slime/Login() + ..() + update_hud() + return diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm similarity index 95% rename from code/modules/mob/living/carbon/metroid/powers.dm rename to code/modules/mob/living/carbon/slime/powers.dm index fdbe54a9220..494bb6eb6df 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -1,228 +1,228 @@ -/mob/living/carbon/slime/verb/Feed() - set category = "Slime" - set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." - if(Victim) - Feedstop() - return - - if(stat) - src << "I must be conscious to do this..." - return - - var/list/choices = list() - for(var/mob/living/C in view(1,src)) - if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C)) - choices += C - - var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices - if(!M) return - if(Adjacent(M)) - - if(!istype(src, /mob/living/carbon/brain)) - if(!istype(M, /mob/living/carbon/slime)) - if(stat != 2) - if(health > -70) - - for(var/mob/living/carbon/slime/met in view()) - if(met.Victim == M && met != src) - src << "The [met.name] is already feeding on this subject..." - return - src << "\blue I have latched onto the subject and begun feeding..." - M << "\red The [src.name] has latched onto your head!" - Feedon(M) - - else - src << "This subject does not have a strong enough life energy..." - else - src << "This subject does not have an edible life energy..." - else - src << "I must not feed on my brothers..." - else - src << "This subject does not have an edible life energy..." - - - -/mob/living/carbon/slime/proc/Feedon(var/mob/living/M) - Victim = M - src.loc = M.loc - canmove = 0 - anchored = 1 - var/lastnut = nutrition - var/fed_succesfully = 0 - if(is_adult) - icon_state = "[colour] adult slime eat" - else - icon_state = "[colour] baby slime eat" - - while(Victim && M.health > -70 && M.stat != DEAD && stat != DEAD) - canmove = 0 - - if(Adjacent(M)) - loc = M.loc - - if(prob(15) && M.client && istype(M, /mob/living/carbon)) - M << "[pick("You can feel your body becoming weak!", \ - "You feel like you're about to die!", \ - "You feel every part of your body screaming in agony!", \ - "A low, rolling pain passes through your body!", \ - "Your body feels as if it's falling apart!", \ - "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]" - - if(istype(M, /mob/living/carbon)) - Victim.adjustCloneLoss(rand(5,6)) - Victim.adjustToxLoss(rand(1,2)) - if(Victim.health <= 0) - Victim.adjustToxLoss(rand(2,4)) - - fed_succesfully = 1 - - else if(istype(M, /mob/living/simple_animal)) - Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) - fed_succesfully = 1 - - else - if(prob(25)) - src << "[pick("This subject is incompatable", \ - "This subject does not have a life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]..." - - if(fed_succesfully) - //I have no idea why this is not in handle_nutrition() - nutrition += rand(15,30) - if(nutrition >= lastnut + 50) - if(prob(80)) - lastnut = nutrition - powerlevel++ - if(powerlevel > 10) - powerlevel = 10 - adjustToxLoss(-10) - - //Heal yourself. - adjustOxyLoss(-10) - adjustBruteLoss(-10) - adjustFireLoss(-10) - adjustCloneLoss(-10) - - updatehealth() - if(Victim) - Victim.updatehealth() - - sleep(rand(15,45)) - - else - break - - if(stat == 2) - if(!is_adult) - icon_state = "[colour] baby slime dead" - - else - if(is_adult) - icon_state = "[colour] adult slime" - else - icon_state = "[colour] baby slime" - - canmove = 1 - anchored = 0 - - if(M) - if(M.health <= -70) - M.canmove = 0 - if(!client) - if(Victim && !rabid && !attacked) - if(Victim.LAssailant && Victim.LAssailant != Victim) - if(prob(50)) - if(!(Victim.LAssailant in Friends)) - Friends[Victim.LAssailant] = 1 - //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator - else - ++Friends[Victim.LAssailant] - - - if(M.client && istype(src, /mob/living/carbon/human)) - if(prob(85)) - rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU - - if(client) src << "This subject does not have a strong enough life energy anymore..." - else - M.canmove = 1 - - if(client) src << "I have stopped feeding..." - else - if(client) src << "I have stopped feeding..." - - Victim = null - -/mob/living/carbon/slime/proc/Feedstop() - if(Victim) - if(Victim.client) Victim << "[src] has let go of your head!" - Victim = null - -/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) - if(Victim) - if(Victim == M) - loc = M.loc // simple "attach to head" effect! - - -/mob/living/carbon/slime/verb/Evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - - if(stat) - src << "I must be conscious to do this..." - return - if(!is_adult) - if(amount_grown >= 10) - is_adult = 1 - maxHealth = 200 - amount_grown = 0 - regenerate_icons() - name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") - else - src << "I am not ready to evolve yet..." - else - src << "I have already evolved..." - -/mob/living/carbon/slime/verb/Reproduce() - set category = "Slime" - set desc = "This will make you split into four Slimes." - - if(stat) - src << "I must be conscious to do this..." - return - - if(is_adult) - if(amount_grown >= 10) - if(stat) - src << "I must be conscious to do this..." - return - - var/list/babies = list() - var/new_nutrition = round(nutrition * 0.9) - var/new_powerlevel = round(powerlevel / 4) - for(var/i=1,i<=4,i++) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) - if(prob(mutation_chance)) - M.colour = slime_mutation[rand(1,4)] - else - M.colour = colour - if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! - M.powerlevel = new_powerlevel - if(i != 1) step_away(M,src) - M.Friends = Friends.Copy() - babies += M - feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") - - var/mob/living/carbon/slime/new_slime = pick(babies) - new_slime.universal_speak = universal_speak - if(src.mind) - src.mind.transfer_to(new_slime) - else - new_slime.key = src.key - qdel(src) - else - src << "I am not ready to reproduce yet..." - else +/mob/living/carbon/slime/verb/Feed() + set category = "Slime" + set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." + if(Victim) + Feedstop() + return + + if(stat) + src << "I must be conscious to do this..." + return + + var/list/choices = list() + for(var/mob/living/C in view(1,src)) + if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C)) + choices += C + + var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices + if(!M) return + if(Adjacent(M)) + + if(!istype(src, /mob/living/carbon/brain)) + if(!istype(M, /mob/living/carbon/slime)) + if(stat != 2) + if(health > -70) + + for(var/mob/living/carbon/slime/met in view()) + if(met.Victim == M && met != src) + src << "The [met.name] is already feeding on this subject..." + return + src << "\blue I have latched onto the subject and begun feeding..." + M << "\red The [src.name] has latched onto your head!" + Feedon(M) + + else + src << "This subject does not have a strong enough life energy..." + else + src << "This subject does not have an edible life energy..." + else + src << "I must not feed on my brothers..." + else + src << "This subject does not have an edible life energy..." + + + +/mob/living/carbon/slime/proc/Feedon(var/mob/living/M) + Victim = M + src.loc = M.loc + canmove = 0 + anchored = 1 + var/lastnut = nutrition + var/fed_succesfully = 0 + if(is_adult) + icon_state = "[colour] adult slime eat" + else + icon_state = "[colour] baby slime eat" + + while(Victim && M.health > -70 && M.stat != DEAD && stat != DEAD) + canmove = 0 + + if(Adjacent(M)) + loc = M.loc + + if(prob(15) && M.client && istype(M, /mob/living/carbon)) + M << "[pick("You can feel your body becoming weak!", \ + "You feel like you're about to die!", \ + "You feel every part of your body screaming in agony!", \ + "A low, rolling pain passes through your body!", \ + "Your body feels as if it's falling apart!", \ + "You feel extremely weak!", \ + "A sharp, deep pain bathes every inch of your body!")]" + + if(istype(M, /mob/living/carbon)) + Victim.adjustCloneLoss(rand(5,6)) + Victim.adjustToxLoss(rand(1,2)) + if(Victim.health <= 0) + Victim.adjustToxLoss(rand(2,4)) + + fed_succesfully = 1 + + else if(istype(M, /mob/living/simple_animal)) + Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) + fed_succesfully = 1 + + else + if(prob(25)) + src << "[pick("This subject is incompatable", \ + "This subject does not have a life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]..." + + if(fed_succesfully) + //I have no idea why this is not in handle_nutrition() + nutrition += rand(15,30) + if(nutrition >= lastnut + 50) + if(prob(80)) + lastnut = nutrition + powerlevel++ + if(powerlevel > 10) + powerlevel = 10 + adjustToxLoss(-10) + + //Heal yourself. + adjustOxyLoss(-10) + adjustBruteLoss(-10) + adjustFireLoss(-10) + adjustCloneLoss(-10) + + updatehealth() + if(Victim) + Victim.updatehealth() + + sleep(rand(15,45)) + + else + break + + if(stat == 2) + if(!is_adult) + icon_state = "[colour] baby slime dead" + + else + if(is_adult) + icon_state = "[colour] adult slime" + else + icon_state = "[colour] baby slime" + + canmove = 1 + anchored = 0 + + if(M) + if(M.health <= -70) + M.canmove = 0 + if(!client) + if(Victim && !rabid && !attacked) + if(Victim.LAssailant && Victim.LAssailant != Victim) + if(prob(50)) + if(!(Victim.LAssailant in Friends)) + Friends[Victim.LAssailant] = 1 + //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator + else + ++Friends[Victim.LAssailant] + + + if(M.client && istype(src, /mob/living/carbon/human)) + if(prob(85)) + rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU + + if(client) src << "This subject does not have a strong enough life energy anymore..." + else + M.canmove = 1 + + if(client) src << "I have stopped feeding..." + else + if(client) src << "I have stopped feeding..." + + Victim = null + +/mob/living/carbon/slime/proc/Feedstop() + if(Victim) + if(Victim.client) Victim << "[src] has let go of your head!" + Victim = null + +/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) + if(Victim) + if(Victim == M) + loc = M.loc // simple "attach to head" effect! + + +/mob/living/carbon/slime/verb/Evolve() + set category = "Slime" + set desc = "This will let you evolve from baby to adult slime." + + if(stat) + src << "I must be conscious to do this..." + return + if(!is_adult) + if(amount_grown >= 10) + is_adult = 1 + maxHealth = 200 + amount_grown = 0 + regenerate_icons() + name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") + else + src << "I am not ready to evolve yet..." + else + src << "I have already evolved..." + +/mob/living/carbon/slime/verb/Reproduce() + set category = "Slime" + set desc = "This will make you split into four Slimes." + + if(stat) + src << "I must be conscious to do this..." + return + + if(is_adult) + if(amount_grown >= 10) + if(stat) + src << "I must be conscious to do this..." + return + + var/list/babies = list() + var/new_nutrition = round(nutrition * 0.9) + var/new_powerlevel = round(powerlevel / 4) + for(var/i=1,i<=4,i++) + var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) + if(prob(mutation_chance)) + M.colour = slime_mutation[rand(1,4)] + else + M.colour = colour + if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! + M.powerlevel = new_powerlevel + if(i != 1) step_away(M,src) + M.Friends = Friends.Copy() + babies += M + feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") + + var/mob/living/carbon/slime/new_slime = pick(babies) + new_slime.universal_speak = universal_speak + if(src.mind) + src.mind.transfer_to(new_slime) + else + new_slime.key = src.key + qdel(src) + else + src << "I am not ready to reproduce yet..." + else src << "I am not old enough to reproduce yet..." \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/slime/say.dm similarity index 100% rename from code/modules/mob/living/carbon/metroid/say.dm rename to code/modules/mob/living/carbon/slime/say.dm diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm new file mode 100644 index 00000000000..1e229b853a3 --- /dev/null +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -0,0 +1,576 @@ +/mob/living/carbon/slime + name = "baby slime" + icon = 'icons/mob/slimes.dmi' + icon_state = "grey baby slime" + pass_flags = PASSTABLE + ventcrawler = 2 + speak_emote = list("telepathically chirps") + + layer = 5 + + maxHealth = 150 + health = 150 + gender = NEUTER + + update_icon = 0 + nutrition = 700 + + see_in_dark = 8 + update_slimes = 0 + + // canstun and canweaken don't affect slimes because they ignore stun and weakened variables + // for the sake of cleanliness, though, here they are. + status_flags = CANPARALYSE|CANPUSH + + var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside + var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 + + var/powerlevel = 0 // 1-10 controls how much electricity they are generating + var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces + + var/number = 0 // Used to understand when someone is talking to it + + var/mob/living/Victim = null // the person the slime is currently feeding on + var/mob/living/Target = null // AI variable - tells the slime to hunt this down + var/mob/living/Leader = null // AI variable - tells the slime to follow this person + + var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable + var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with + var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place + var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target + + var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting + + var/list/speech_buffer = list() // Last phrase said near it and person who said it + + var/mood = "" // To show its face + var/is_adult = 0 + + var/core_removal_stage = 0 //For removing cores. + + ///////////TIME FOR SUBSPECIES + + var/colour = "grey" + var/coretype = /obj/item/slime_extract/grey + var/list/slime_mutation[4] + +/mob/living/carbon/slime/New() + create_reagents(100) + spawn (0) + number = rand(1, 1000) + name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" + icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" + real_name = name + slime_mutation = mutation_table(colour) + mutation_chance = rand(25, 35) + var/sanitizedcolour = replacetext(colour, " ", "") + coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + ..() + +/mob/living/carbon/slime/regenerate_icons() + icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" + overlays.len = 0 + if (mood) + overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]") + ..() + +/mob/living/carbon/slime/movement_delay() + if (bodytemperature >= 330.23) // 135 F + return -1 // slimes become supercharged at high temperatures + + var/tally = 0 + + var/health_deficiency = (100 - health) + if(health_deficiency >= 45) tally += (health_deficiency / 25) + + if (bodytemperature < 183.222) + tally += (283.222 - bodytemperature) / 10 * 1.75 + + if(reagents) + if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down + tally *= 2 + + if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow + tally *= 5 + + if(health <= 0) // if damaged, the slime moves twice as slow + tally *= 2 + + return tally + config.slime_delay + +/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes) + if ((!(yes) || now_pushing)) + return + now_pushing = 1 + + if(isobj(AM)) + if(!client && powerlevel > 0) + var/probab = 10 + switch(powerlevel) + if(1 to 2) probab = 20 + if(3 to 4) probab = 30 + if(5 to 6) probab = 40 + if(7 to 8) probab = 60 + if(9) probab = 70 + if(10) probab = 95 + if(prob(probab)) + if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) + if(nutrition <= get_hunger_nutrition() && !Atkcool) + if (is_adult || prob(5)) + AM.attack_slime(src) + spawn() + Atkcool = 1 + sleep(45) + Atkcool = 0 + + if(ismob(AM)) + var/mob/tmob = AM + + if(is_adult) + if(istype(tmob, /mob/living/carbon/human)) + if(prob(90)) + now_pushing = 0 + return + else + if(istype(tmob, /mob/living/carbon/human)) + now_pushing = 0 + return + + now_pushing = 0 + ..() + if (!istype(AM, /atom/movable)) + return + if (!( now_pushing )) + now_pushing = 1 + if (!( AM.anchored )) + var/t = get_dir(src, AM) + if (istype(AM, /obj/structure/window)) + if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) + for(var/obj/structure/window/win in get_step(AM,t)) + now_pushing = 0 + return + step(AM, t) + now_pushing = null + +/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0) + return 2 + +/mob/living/carbon/slime/Stat() + ..() + + statpanel("Status") + if(is_adult) + stat(null, "Health: [round((health / 200) * 100)]%") + else + stat(null, "Health: [round((health / 150) * 100)]%") + + if (client.statpanel == "Status") + stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") + if(amount_grown >= 10) + if(is_adult) + stat(null, "You can reproduce!") + else + stat(null, "You can evolve!") + + stat(null,"Power Level: [powerlevel]") + +/mob/living/carbon/slime/adjustFireLoss(amount) + ..(-abs(amount)) // Heals them + return + +/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj) + attacked += 10 + ..(Proj) + return 0 + +/mob/living/carbon/slime/emp_act(severity) + powerlevel = 0 // oh no, the power! + ..() + +/mob/living/carbon/slime/ex_act(severity) + ..() + + var/b_loss = null + var/f_loss = null + switch (severity) + if (1.0) + qdel(src) + return + + if (2.0) + + b_loss += 60 + f_loss += 60 + + + if(3.0) + b_loss += 30 + + adjustBruteLoss(b_loss) + adjustFireLoss(f_loss) + + updatehealth() + + +/mob/living/carbon/slime/blob_act() + show_message(" The blob attacks you!") + adjustBruteLoss(20) + updatehealth() + return + + +/mob/living/carbon/slime/unEquip(obj/item/W as obj) + return + +/mob/living/carbon/slime/attack_ui(slot) + return + +/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) + if (!ticker) + M << "You cannot attack people before the game has started." + return + + if (Victim) return // can't attack while eating! + + if (health > -100) + + M.do_attack_animation(src) + visible_message(" The [M.name] has glomped [src]!", \ + " The [M.name] has glomped [src]!") + var/damage = rand(1, 3) + attacked += 5 + + if(M.is_adult) + damage = rand(1, 6) + else + damage = rand(1, 3) + + adjustBruteLoss(damage) + + updatehealth() + return + +/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob) + if(M.melee_damage_upper == 0) + M.custom_emote(1, "[M.friendly] [src]") + else + M.do_attack_animation(src) + if(M.attack_sound) + playsound(loc, M.attack_sound, 50, 1, 1) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext] [src]!") + M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") + src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") + var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + attacked += 10 + adjustBruteLoss(damage) + updatehealth() + +/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob) + + switch(L.a_intent) + + if(I_HELP) + visible_message("[L] rubs its head against [src].") + + + else + L.do_attack_animation(src) + attacked += 10 + visible_message("[L] bites [src]!", \ + "[L] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + + if(stat != DEAD) + var/damage = rand(1, 3) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + adjustBruteLoss(damage) + +/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) + if (!ticker) + M << "You cannot attack people before the game has started." + return + + if (istype(loc, /turf) && istype(loc.loc, /area/start)) + M << "No attacking people at spawn, you jackass." + return + + ..() + + if(Victim) + if(Victim == M) + if(prob(60)) + visible_message("[M] attempts to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + else + visible_message(" [M] manages to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + + if(prob(90) && !client) + Discipline++ + + spawn() + SStun = 1 + sleep(rand(45,60)) + if(src) + SStun = 0 + + Victim = null + anchored = 0 + step_away(src,M) + + return + + else + if(prob(30)) + visible_message("[M] attempts to wrestle \the [name] off of [Victim]!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + else + visible_message(" [M] manages to wrestle \the [name] off of [Victim]!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + + if(prob(80) && !client) + Discipline++ + + if(!is_adult) + if(Discipline == 1) + attacked = 0 + + spawn() + SStun = 1 + sleep(rand(55,65)) + if(src) + SStun = 0 + + Victim = null + anchored = 0 + step_away(src,M) + + return + +/* + if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/G = M.gloves + if(G.cell) + if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien. + if(G.cell.charge >= 2500) + G.cell.use(2500) + visible_message("[src] has been touched with the stun gloves by [M]!") + return + else + M << "\red Not enough charge! " + return +*/ + + switch(M.a_intent) + + if (I_HELP) + help_shake_act(M) + + if (I_GRAB) + grabbedby(M) + + else + M.do_attack_animation(src) + var/damage = rand(1, 9) + + attacked += 10 + if (prob(90)) + if (HULK in M.mutations) + damage += 5 + if(Victim || Target) + Victim = null + Target = null + anchored = 0 + if(prob(80) && !client) + Discipline++ + spawn(0) + + step_away(src,M,15) + sleep(3) + step_away(src,M,15) + + + playsound(loc, "punch", 25, 1, -1) + visible_message("[M] has punched [src]!", \ + "[M] has punched [src]!") + + adjustBruteLoss(damage) + updatehealth() + else + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to punch [src]!") + return + + + +/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob) + if (!ticker) + M << "You cannot attack people before the game has started." + return + + if (istype(loc, /turf) && istype(loc.loc, /area/start)) + M << "No attacking people at spawn, you jackass." + return + + switch(M.a_intent) + if (I_HELP) + visible_message("[M] caresses [src] with its scythe like arm.") + + if (I_HARM) + M.do_attack_animation(src) + if (prob(95)) + attacked += 10 + playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + var/damage = rand(15, 30) + if (damage >= 25) + damage = rand(20, 40) + visible_message("[M] has attacked [name]!", \ + "[M] has attacked [name]!") + else + visible_message("[M] has wounded [name]!", \ + ")[M] has wounded [name]!") + adjustBruteLoss(damage) + updatehealth() + else + playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to lunge at [name]!", \ + "[M] has attempted to lunge at [name]!") + + if (I_GRAB) + grabbedby(M) + + if (I_DISARM) + M.do_attack_animation(src) + playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) + var/damage = 5 + attacked += 10 + + if(prob(95)) + visible_message("[M] has tackled [name]!", \ + "[M] has tackled [name]!") + + if(Victim || Target) + Victim = null + Target = null + anchored = 0 + if(prob(80) && !client) + Discipline++ + if(!istype(src, /mob/living/carbon/slime)) + if(Discipline == 1) + attacked = 0 + + spawn() + SStun = 1 + sleep(rand(5,20)) + SStun = 0 + + spawn(0) + + step_away(src,M,15) + sleep(3) + step_away(src,M,15) + + else + drop_item() + visible_message("[M] has disarmed [name]!", + "[M] has disarmed [name]!") + adjustBruteLoss(damage) + updatehealth() + return + +/mob/living/carbon/slime/attackby(obj/item/W, mob/user, params) + if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma. + if (user in Friends) + ++Friends[user] + else + Friends[user] = 1 + user << "You feed the slime the plasma. It chirps happily." + var/obj/item/stack/sheet/mineral/plasma/S = W + S.use(1) + return + else if(W.force > 0) + attacked += 10 + if(prob(25)) + user << "[W] passes right through [src]!" + return + if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? + Discipline = 0 + else if(W.force >= 3) + if(is_adult) + if(prob(5 + round(W.force/2))) + if(Victim || Target) + if(prob(80) && !client) + Discipline++ + + Victim = null + Target = null + anchored = 0 + + spawn() + SStun = 1 + sleep(rand(5,20)) + SStun = 0 + + spawn(0) + if(user) + canmove = 0 + step_away(src, user) + if(prob(25 + W.force)) + sleep(2) + if(user) + step_away(src, user) + canmove = 1 + + else + if(prob(10 + W.force*2)) + if(Victim || Target) + if(prob(80) && !client) + Discipline++ + if(Discipline == 1) + attacked = 0 + spawn() + SStun = 1 + sleep(rand(5,20)) + SStun = 0 + + Victim = null + Target = null + anchored = 0 + + spawn(0) + if(user) + canmove = 0 + step_away(src, user) + if(prob(25 + W.force*4)) + sleep(2) + if(user) + step_away(src, user) + canmove = 1 + ..() + +/mob/living/carbon/slime/restrained() + return 0 + +mob/living/carbon/slime/var/temperature_resistance = T0C+75 + +/mob/living/carbon/slime/show_inv(mob/user) + return + +/mob/living/carbon/slime/toggle_throw_mode() + return + +/mob/living/carbon/slime/proc/apply_water() + adjustToxLoss(rand(15,20)) + if (!client) + if (Target) // Like cats + Target = null + ++Discipline + return + +/mob/living/carbon/slime/can_use_vents() + if(Victim) + return "You cannot ventcrawl while feeding." + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/subtypes.dm b/code/modules/mob/living/carbon/slime/subtypes.dm similarity index 95% rename from code/modules/mob/living/carbon/metroid/subtypes.dm rename to code/modules/mob/living/carbon/slime/subtypes.dm index 3b7e0107abb..35d38e31a48 100644 --- a/code/modules/mob/living/carbon/metroid/subtypes.dm +++ b/code/modules/mob/living/carbon/slime/subtypes.dm @@ -1,79 +1,79 @@ -proc/mutation_table(var/colour) - var/list/slime_mutation[4] - switch(colour) - //Tier 1 - if("grey") - slime_mutation[1] = "orange" - slime_mutation[2] = "metal" - slime_mutation[3] = "blue" - slime_mutation[4] = "purple" - //Tier 2 - if("purple") - slime_mutation[1] = "dark purple" - slime_mutation[2] = "dark blue" - slime_mutation[3] = "green" - slime_mutation[4] = "green" - if("metal") - slime_mutation[1] = "silver" - slime_mutation[2] = "yellow" - slime_mutation[3] = "gold" - slime_mutation[4] = "gold" - if("orange") - slime_mutation[1] = "dark purple" - slime_mutation[2] = "yellow" - slime_mutation[3] = "red" - slime_mutation[4] = "red" - if("blue") - slime_mutation[1] = "dark blue" - slime_mutation[2] = "silver" - slime_mutation[3] = "pink" - slime_mutation[4] = "pink" - //Tier 3 - if("dark blue") - slime_mutation[1] = "purple" - slime_mutation[2] = "blue" - slime_mutation[3] = "cerulean" - slime_mutation[4] = "cerulean" - if("dark purple") - slime_mutation[1] = "purple" - slime_mutation[2] = "orange" - slime_mutation[3] = "sepia" - slime_mutation[4] = "sepia" - if("yellow") - slime_mutation[1] = "metal" - slime_mutation[2] = "orange" - slime_mutation[3] = "bluespace" - slime_mutation[4] = "bluespace" - if("silver") - slime_mutation[1] = "metal" - slime_mutation[2] = "blue" - slime_mutation[3] = "pyrite" - slime_mutation[4] = "pyrite" - //Tier 4 - if("pink") - slime_mutation[1] = "pink" - slime_mutation[2] = "pink" - slime_mutation[3] = "light pink" - slime_mutation[4] = "light pink" - if("red") - slime_mutation[1] = "red" - slime_mutation[2] = "red" - slime_mutation[3] = "oil" - slime_mutation[4] = "oil" - if("gold") - slime_mutation[1] = "gold" - slime_mutation[2] = "gold" - slime_mutation[3] = "adamantine" - slime_mutation[4] = "adamantine" - if("green") - slime_mutation[1] = "green" - slime_mutation[2] = "green" - slime_mutation[3] = "black" - slime_mutation[4] = "black" - // Tier 5 - else - slime_mutation[1] = colour - slime_mutation[2] = colour - slime_mutation[3] = colour - slime_mutation[4] = colour +proc/mutation_table(var/colour) + var/list/slime_mutation[4] + switch(colour) + //Tier 1 + if("grey") + slime_mutation[1] = "orange" + slime_mutation[2] = "metal" + slime_mutation[3] = "blue" + slime_mutation[4] = "purple" + //Tier 2 + if("purple") + slime_mutation[1] = "dark purple" + slime_mutation[2] = "dark blue" + slime_mutation[3] = "green" + slime_mutation[4] = "green" + if("metal") + slime_mutation[1] = "silver" + slime_mutation[2] = "yellow" + slime_mutation[3] = "gold" + slime_mutation[4] = "gold" + if("orange") + slime_mutation[1] = "dark purple" + slime_mutation[2] = "yellow" + slime_mutation[3] = "red" + slime_mutation[4] = "red" + if("blue") + slime_mutation[1] = "dark blue" + slime_mutation[2] = "silver" + slime_mutation[3] = "pink" + slime_mutation[4] = "pink" + //Tier 3 + if("dark blue") + slime_mutation[1] = "purple" + slime_mutation[2] = "blue" + slime_mutation[3] = "cerulean" + slime_mutation[4] = "cerulean" + if("dark purple") + slime_mutation[1] = "purple" + slime_mutation[2] = "orange" + slime_mutation[3] = "sepia" + slime_mutation[4] = "sepia" + if("yellow") + slime_mutation[1] = "metal" + slime_mutation[2] = "orange" + slime_mutation[3] = "bluespace" + slime_mutation[4] = "bluespace" + if("silver") + slime_mutation[1] = "metal" + slime_mutation[2] = "blue" + slime_mutation[3] = "pyrite" + slime_mutation[4] = "pyrite" + //Tier 4 + if("pink") + slime_mutation[1] = "pink" + slime_mutation[2] = "pink" + slime_mutation[3] = "light pink" + slime_mutation[4] = "light pink" + if("red") + slime_mutation[1] = "red" + slime_mutation[2] = "red" + slime_mutation[3] = "oil" + slime_mutation[4] = "oil" + if("gold") + slime_mutation[1] = "gold" + slime_mutation[2] = "gold" + slime_mutation[3] = "adamantine" + slime_mutation[4] = "adamantine" + if("green") + slime_mutation[1] = "green" + slime_mutation[2] = "green" + slime_mutation[3] = "black" + slime_mutation[4] = "black" + // Tier 5 + else + slime_mutation[1] = colour + slime_mutation[2] = colour + slime_mutation[3] = colour + slime_mutation[4] = colour return(slime_mutation) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/update_icons.dm b/code/modules/mob/living/carbon/slime/update_icons.dm similarity index 96% rename from code/modules/mob/living/carbon/metroid/update_icons.dm rename to code/modules/mob/living/carbon/slime/update_icons.dm index 8902770055d..2310f32a76e 100644 --- a/code/modules/mob/living/carbon/metroid/update_icons.dm +++ b/code/modules/mob/living/carbon/slime/update_icons.dm @@ -1 +1 @@ -//no special icon processing +//no special icon processing diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm new file mode 100644 index 00000000000..a0df8e2740a --- /dev/null +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -0,0 +1,474 @@ + +/// Slime Extracts /// + +/obj/item/slime_extract + name = "slime extract" + desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." + icon = 'icons/mob/slimes.dmi' + icon_state = "grey slime extract" + force = 1.0 + w_class = 1.0 + throwforce = 0 + throw_speed = 3 + throw_range = 6 + origin_tech = "biotech=4" + item_color = "grey" + var/Uses = 1 // uses before it goes inert + var/enhanced = 0 //has it been enhanced before? + + attackby(obj/item/O as obj, mob/user as mob, params) + if(istype(O, /obj/item/weapon/slimesteroid2)) + if(enhanced == 1) + user << " This extract has already been enhanced!" + return ..() + if(Uses == 0) + user << " You can't enhance a used extract!" + return ..() + user <<"You apply the enhancer. It now has triple the amount of uses." + Uses = 3 + enhanced = 1 + qdel(O) + if(istype(O,/obj/item/weapon/storage/bag)) + ..() + +/obj/item/slime_extract/New() + ..() + create_reagents(100) + + +/obj/item/slime_extract/grey + name = "grey slime extract" + icon_state = "grey slime extract" + item_color = "grey" + +/obj/item/slime_extract/gold + name = "gold slime extract" + icon_state = "gold slime extract" + item_color = "gold" + +/obj/item/slime_extract/silver + name = "silver slime extract" + icon_state = "silver slime extract" + item_color = "silver" + +/obj/item/slime_extract/metal + name = "metal slime extract" + icon_state = "metal slime extract" + item_color = "metal" + +/obj/item/slime_extract/purple + name = "purple slime extract" + icon_state = "purple slime extract" + item_color = "purple" + +/obj/item/slime_extract/darkpurple + name = "dark purple slime extract" + icon_state = "dark purple slime extract" + item_color = "darkpurple" + +/obj/item/slime_extract/orange + name = "orange slime extract" + icon_state = "orange slime extract" + item_color = "orange" + +/obj/item/slime_extract/yellow + name = "yellow slime extract" + icon_state = "yellow slime extract" + item_color = "yellow" + +/obj/item/slime_extract/red + name = "red slime extract" + icon_state = "red slime extract" + item_color = "red" + +/obj/item/slime_extract/blue + name = "blue slime extract" + icon_state = "blue slime extract" + item_color = "blue" + +/obj/item/slime_extract/darkblue + name = "dark blue slime extract" + icon_state = "dark blue slime extract" + item_color = "darkblue" + +/obj/item/slime_extract/pink + name = "pink slime extract" + icon_state = "pink slime extract" + item_color = "pink" + +/obj/item/slime_extract/green + name = "green slime extract" + icon_state = "green slime extract" + item_color = "green" + +/obj/item/slime_extract/lightpink + name = "light pink slime extract" + icon_state = "light pink slime extract" + item_color = "lightpink" + +/obj/item/slime_extract/black + name = "black slime extract" + icon_state = "black slime extract" + item_color = "black" + +/obj/item/slime_extract/oil + name = "oil slime extract" + icon_state = "oil slime extract" + item_color = "oil" + +/obj/item/slime_extract/adamantine + name = "adamantine slime extract" + icon_state = "adamantine slime extract" + item_color = "adamantine" + +/obj/item/slime_extract/bluespace + name = "bluespace slime extract" + icon_state = "bluespace slime extract" + +/obj/item/slime_extract/pyrite + name = "pyrite slime extract" + icon_state = "pyrite slime extract" + +/obj/item/slime_extract/cerulean + name = "cerulean slime extract" + icon_state = "cerulean slime extract" + +/obj/item/slime_extract/sepia + name = "sepia slime extract" + icon_state = "sepia slime extract" + +/obj/item/slime_extract/rainbow + name = "rainbow slime extract" + icon_state = "rainbow slime extract" + +////Pet Slime Creation/// + +/obj/item/weapon/slimepotion + name = "docility potion" + desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + w_class = 1 + origin_tech = "biotech=4" + + attack(mob/living/carbon/slime/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + user << " The potion only works on slimes!" + return ..() + if(M.stat) + user << " The slime is dead!" + return..() + if(M.mind) + user << " The slime resists!" + return ..() + if(M.is_adult) + var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) + pet.icon_state = "[M.colour] adult slime" + pet.icon_living = "[M.colour] adult slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + else + var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) + pet.icon_state = "[M.colour] baby slime" + pet.icon_living = "[M.colour] baby slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + user <<"You feed the slime the potion, removing it's powers and calming it." + +/obj/item/weapon/sentience_potion + name = "sentience potion" + desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + origin_tech = "biotech=5" + var/list/not_interested = list() + var/being_used = 0 + w_class = 1 + + +/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user) + if(being_used || !ismob(M)) + return + if(!isslime(M) && !isanimal(M) || M.ckey) //only works on animals that aren't player controlled + user << "[M] is already too intelligent for this to work!" + return ..() + if(M.stat) + user << "[M] is dead!" + return..() + + user << "You offer the sentience potion to [M]..." + being_used = 1 + + var/list/candidates = get_candidates(ROLE_SENTIENT, ALIEN_AFK_BRACKET) + + shuffle(candidates) + + var/time_passed = world.time + var/list/consenting_candidates = list() + + for(var/candidate in candidates) + + if(candidate in not_interested) + continue + + spawn(0) + switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No")) + if("Yes") + if((world.time-time_passed)>=50 || !src) + return + consenting_candidates += candidate + if("No") + if(!src) + return + not_interested += candidate + + sleep(50) + + if(!src) + return + + listclearnulls(consenting_candidates) //some candidates might have left during sleep(50) + + if(consenting_candidates.len) + var/client/C = null + C = pick(consenting_candidates) + M.key = C.key + M.universal_speak = 1 + M.faction |= "sentient" + M << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" + M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." + user << "[M] accepts the potion and suddenly becomes attentive and aware. It worked!" + if(isanimal(M)) + var/mob/living/simple_animal/S = M + S.master_commander = user + qdel(src) + else + user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later." + being_used = 0 + ..() + + +/obj/item/weapon/slimesteroid + name = "slime steroid" + desc = "A potent chemical mix that will cause a slime to generate more extract." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + w_class = 1 + origin_tech = "biotech=4" + + + attack(mob/living/carbon/slime/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + user << " The steroid only works on baby slimes!" + return ..() + if(M.is_adult) //Can't tame adults + user << " Only baby slimes can use the steroid!" + return..() + if(M.stat) + user << " The slime is dead!" + return..() + if(M.cores == 3) + user <<" The slime already has the maximum amount of extract!" + return..() + + user <<"You feed the slime the steroid. It now has triple the amount of extract." + M.cores = 3 + qdel(src) + +/obj/item/weapon/slimesteroid2 + name = "extract enhancer" + desc = "A potent chemical mix that will give a slime extract three uses." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + w_class = 1 + origin_tech = "biotech=4" + + +/obj/item/weapon/slimespeed + name = "slime speed potion" + desc = "A potent chemical mix that will remove the slowdown from any item." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle3" + w_class = 1 + origin_tech = "biotech=4" + +/obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user) + ..() + if(!istype(C)) + user << "The potion can only be used on items!" + return + if(C.slowdown <= 0) + user << "The [C] can't be made any faster!" + return..() + user <<"You slather the red gunk over the [C], making it faster." + C.color = "#FF0000" + C.slowdown = 0 + qdel(src) + +/obj/item/weapon/slimefireproof + name = "slime chill potion" + desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + var/uses = 3 + w_class = 1 + origin_tech = "biotech=4" + + +/obj/item/weapon/slimefireproof/afterattack(obj/item/clothing/C, mob/user) + ..() + if(!uses) + qdel(src) + return + if(!istype(C)) + user << "The potion can only be used on clothing!" + return + if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + user << "The [C] is already fireproof!" + return..() + user <<"You slather the blue gunk over the [C], fireproofing it." + C.name = "fireproofed [C.name]" + C.color = "#000080" + C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + C.heat_protection = C.body_parts_covered + uses -- + if(!uses) + qdel(src) + +/obj/item/stack/tile/bluespace + name = "bluespace floor tile" + singular_name = "floor tile" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." + icon_state = "tile-bluespace" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/bluespace + + +/turf/simulated/floor/bluespace + slowdown = -1 + icon_state = "bluespace" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." + floor_tile = /obj/item/stack/tile/bluespace + + +/obj/item/stack/tile/sepia + name = "sepia floor tile" + singular_name = "floor tile" + desc = "Time seems to flow very slowly around these tiles." + icon_state = "tile-sepia" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/sepia + + +/turf/simulated/floor/sepia + slowdown = 2 + icon_state = "sepia" + desc = "Time seems to flow very slowly around these tiles." + floor_tile = /obj/item/stack/tile/sepia + +/obj/effect/goleRUNe + anchored = 1 + desc = "a strange rune used to create golems. It glows when spirits are nearby." + name = "rune" + icon = 'icons/obj/rune.dmi' + icon_state = "golem" + unacidable = 1 + layer = TURF_LAYER + var/list/mob/dead/observer/ghosts[0] + + New() + ..() + processing_objects.Add(src) + + process() + if(ghosts.len>0) + icon_state = "golem2" + else + icon_state = "golem" + + attack_hand(mob/living/user as mob) + var/mob/dead/observer/ghost + for(var/mob/dead/observer/O in src.loc) + if(!check_observer(O)) + O << "\red You are not eligible to become a golem." + continue + ghost = O + break + if(!ghost) + user << "The rune fizzles uselessly. There is no spirit nearby." + return + var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem + if(prob(50)) G.gender = "female" + G.loc = src.loc + G.key = ghost.key + G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." + qdel(src) + + + proc/announce_to_ghosts() + for(var/mob/dead/observer/O in player_list) + if(O.client) + var/area/A = get_area(src) + if(A) + O << "\blue Golem rune created in [A.name]. (Teleport | Sign Up)" + + Topic(href,href_list) + if("signup" in href_list) + var/mob/dead/observer/O = locate(href_list["signup"]) + volunteer(O) + + attack_ghost(var/mob/dead/observer/O) + if(!O) return + volunteer(O) + + proc/check_observer(var/mob/dead/observer/O) + if(!O) + return 0 + if(!O.client) + return 0 + if(O.mind && O.mind.current && O.mind.current.stat != DEAD) + return 0 + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + return 0 + return 1 + + proc/volunteer(var/mob/dead/observer/O) + if(O in ghosts) + ghosts.Remove(O) + O << "\red You are no longer signed up to be a golem." + else + if(!check_observer(O)) + O << "\red You are not eligible to become a golem." + return + ghosts.Add(O) + O << "\blue You are signed up to be a golem." \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index ddc9a9720dd..a5325a0933e 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1380,16 +1380,16 @@ #include "code\modules\mob\living\carbon\human\species\shadow.dm" #include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\station.dm" -#include "code\modules\mob\living\carbon\metroid\death.dm" -#include "code\modules\mob\living\carbon\metroid\emote.dm" -#include "code\modules\mob\living\carbon\metroid\examine.dm" -#include "code\modules\mob\living\carbon\metroid\life.dm" -#include "code\modules\mob\living\carbon\metroid\login.dm" -#include "code\modules\mob\living\carbon\metroid\metroid.dm" -#include "code\modules\mob\living\carbon\metroid\powers.dm" -#include "code\modules\mob\living\carbon\metroid\say.dm" -#include "code\modules\mob\living\carbon\metroid\subtypes.dm" -#include "code\modules\mob\living\carbon\metroid\update_icons.dm" +#include "code\modules\mob\living\carbon\slime\death.dm" +#include "code\modules\mob\living\carbon\slime\emote.dm" +#include "code\modules\mob\living\carbon\slime\examine.dm" +#include "code\modules\mob\living\carbon\slime\life.dm" +#include "code\modules\mob\living\carbon\slime\login.dm" +#include "code\modules\mob\living\carbon\slime\powers.dm" +#include "code\modules\mob\living\carbon\slime\say.dm" +#include "code\modules\mob\living\carbon\slime\slime.dm" +#include "code\modules\mob\living\carbon\slime\subtypes.dm" +#include "code\modules\mob\living\carbon\slime\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\emote.dm" #include "code\modules\mob\living\silicon\laws.dm" @@ -1818,6 +1818,7 @@ #include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm" #include "code\modules\research\xenoarchaeology\tools\tools_locater.dm" #include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm" +#include "code\modules\research\xenobiology\xenobiology.dm" #include "code\modules\scripting\Errors.dm" #include "code\modules\scripting\Options.dm" #include "code\modules\scripting\AST\AST Nodes.dm" From 65e2a7fdff4869028d8a51eed67b3cb958031f99 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 5 Jan 2016 02:20:03 -0500 Subject: [PATCH 14/23] Updates/fixes instrument ui to be a nanoui --- code/game/objects/items/devices/guitar.dm | 10 +- code/game/objects/items/devices/violin.dm | 10 +- code/game/objects/structures/musician.dm | 137 ++++++++-------------- nano/templates/song.tmpl | 87 ++++++++++++++ 4 files changed, 147 insertions(+), 97 deletions(-) create mode 100644 nano/templates/song.tmpl diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm index 546989c3c6e..9a3b4dd6901 100644 --- a/code/game/objects/items/devices/guitar.dm +++ b/code/game/objects/items/devices/guitar.dm @@ -20,17 +20,19 @@ return ..() /obj/item/device/guitar/attack_self(mob/user as mob) - interact(user) + ui_interact(user) -/obj/item/device/guitar/interact(mob/user as mob) +/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!user) return if(!isliving(user) || user.stat || user.restrained() || user.lying) return - user.set_machine(src) - song.interact(user) + song.ui_interact(user, ui_key, ui, force_open) + +/obj/item/device/guitar/Topic(href, href_list) + song.Topic(href, href_list) /datum/table_recipe/guitar name = "Guitar" diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm index 02038717aff..9c4d5e9ddb4 100644 --- a/code/game/objects/items/devices/violin.dm +++ b/code/game/objects/items/devices/violin.dm @@ -24,14 +24,16 @@ ..() /obj/item/device/violin/attack_self(mob/user as mob) - interact(user) + ui_interact(user) -/obj/item/device/violin/interact(mob/user as mob) +/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!user) return if(!isliving(user) || user.stat || user.restrained() || user.lying) return - user.set_machine(src) - song.interact(user) + song.ui_interact(user, ui_key, ui, force_open) + +/obj/item/device/violin/Topic(href, href_list) + song.Topic(href, href_list) \ No newline at end of file diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index b173ece5b0b..367208bbfe4 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -3,13 +3,12 @@ /datum/song var/name = "Untitled" var/list/lines = new() - var/tempo = 5 // delay between notes + var/tempo = 5 // delay between notes - var/playing = 0 // if we're playing - var/help = 0 // if help is open - var/edit = 1 // if we're in editing mode - var/repeat = 0 // number of times remaining to repeat - var/max_repeats = 10 // maximum times we can repeat + var/playing = 0 // if we're playing + var/help = 0 // if help is open + var/repeat = 0 // number of times remaining to repeat + var/max_repeat = 10 // maximum times we can repeat var/instrumentDir = "piano" // the folder with the sounds var/instrumentExt = "ogg" // the file extension @@ -63,9 +62,6 @@ continue M.playsound_local(source, soundfile, 100, falloff = 5) -/datum/song/proc/updateDialog(mob/user as mob) - instrumentObj.updateDialog() // assumes it's an object in world, override if otherwise - /datum/song/proc/shouldStopPlaying(mob/user) if(instrumentObj) //if(!user.canUseTopic(instrumentObj)) @@ -113,68 +109,31 @@ else sleep(tempo) repeat-- - if(repeat >= 0) // don't show the last -1 repeat - updateDialog(user) playing = 0 repeat = 0 - updateDialog(user) -/datum/song/proc/interact(mob/user as mob) - var/dat = "" +/datum/song/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] - if(lines.len > 0) - dat += "

Playback

" - if(!playing) - dat += "Play Stop

" - dat += "Repeat Song: " - dat += repeat > 0 ? "--" : "--" - dat += " [repeat] times " - dat += repeat < max_repeats ? "++" : "++" - dat += "
" - else - dat += "Play Stop
" - dat += "Repeats left: [repeat]
" - if(!edit) - dat += "
Show Editor
" - else - dat += "

Editing

" - dat += "Hide Editor" - dat += " Start a New Song" - dat += " Import a Song

" - var/bpm = round(600 / tempo) - dat += "Tempo: - [bpm] BPM +

" - var/linecount = 0 - for(var/line in lines) - linecount += 1 - dat += "Line [linecount]: Edit X [line]
" - dat += "Add Line

" - if(help) - dat += "Hide Help
" - dat += {" - Lines are a series of chords, separated by commas (,), each with notes seperated by hyphens (-).
- Every note in a chord will play together, with chord timed by the tempo.
-
- Notes are played by the names of the note, and optionally, the accidental, and/or the octave number.
- By default, every note is natural and in octave 3. Defining otherwise is remembered for each note.
- Example: C,D,E,F,G,A,B will play a C major scale.
- After a note has an accidental placed, it will be remembered: C,C4,C,C3 is C3,C4,C4,C3

- Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B
- A pause may be denoted by an empty chord: C,E,,C,G
- To make a chord be a different time, end it with /x, where the chord length will be length
- defined by tempo / x: C,G/2,E/4
- Combined, an example is: E-E4/4,F#/2,G#/8,B/8,E3-E4/4 -
- Lines may be up to 50 characters.
- A song may only contain up to 50 lines.
- "} - else - dat += "Show Help
" + data["lines"] = lines + data["tempo"] = tempo - var/datum/browser/popup = new(user, "instrument", instrumentObj.name, 700, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(instrumentObj.icon, instrumentObj.icon_state)) - popup.open() + data["playing"] = playing + data["help"] = help + data["repeat"] = repeat + data["maxRepeat"] = max_repeat + data["minTempo"] = world.tick_lag + data["maxTempo"] = 600 + if(!instrumentObj) + return + + ui = nanomanager.try_update_ui(user, instrumentObj, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, instrumentObj, ui_key, "song.tmpl", instrumentObj.name, 700, 500) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) /datum/song/Topic(href, href_list) if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained()) @@ -185,14 +144,16 @@ instrumentObj.add_fingerprint(usr) if(href_list["newsong"]) + playing = 0 lines = new() tempo = sanitize_tempo(5) // default 120 BPM name = "" else if(href_list["import"]) + playing = 0 var/t = "" do - t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message) + t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message) if(!in_range(instrumentObj, usr)) return @@ -220,13 +181,9 @@ lines.Remove(l) else linenum++ - updateDialog(usr) // make sure updates when complete else if(href_list["help"]) - help = text2num(href_list["help"]) - 1 - - else if(href_list["edit"]) - edit = text2num(href_list["edit"]) - 1 + help = !help if(href_list["repeat"]) //Changing this from a toggle to a number of repeats to avoid infinite loops. if(playing) @@ -234,18 +191,24 @@ repeat += round(text2num(href_list["repeat"])) if(repeat < 0) repeat = 0 - if(repeat > max_repeats) - repeat = max_repeats + if(repeat > max_repeat) + repeat = max_repeat else if(href_list["tempo"]) - tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) + tempo = sanitize_tempo(tempo + text2num(href_list["tempo"]) * world.tick_lag) else if(href_list["play"]) + if(playing) + return playing = 1 spawn() playsong(usr) - else if(href_list["newline"]) + else if(href_list["insertline"]) + var/num = round(text2num(href_list["insertline"])) + if(num < 1 || num > lines.len + 1) + return + var/newline = html_encode(input("Enter your line: ", instrumentObj.name) as text|null) if(!newline || !in_range(instrumentObj, usr)) return @@ -253,16 +216,17 @@ return if(lentext(newline) > 50) newline = copytext(newline, 1, 50) - lines.Add(newline) + + lines.Insert(num, newline) else if(href_list["deleteline"]) var/num = round(text2num(href_list["deleteline"])) if(num > lines.len || num < 1) return - lines.Cut(num, num+1) + lines.Cut(num, num + 1) else if(href_list["modifyline"]) - var/num = round(text2num(href_list["modifyline"]),1) + var/num = round(text2num(href_list["modifyline"])) var/content = html_encode(input("Enter your line: ", instrumentObj.name, lines[num]) as text|null) if(!content || !in_range(instrumentObj, usr)) return @@ -275,19 +239,12 @@ else if(href_list["stop"]) playing = 0 - updateDialog(usr) - return - /datum/song/proc/sanitize_tempo(new_tempo) - new_tempo = abs(new_tempo) return max(round(new_tempo, world.tick_lag), world.tick_lag) // subclass for handheld instruments, like violin /datum/song/handheld -/datum/song/handheld/updateDialog(mob/user as mob) - instrumentObj.interact(user) - /datum/song/handheld/shouldStopPlaying() if(instrumentObj) return !isliving(instrumentObj.loc) @@ -329,14 +286,16 @@ ..() /obj/structure/piano/attack_hand(mob/user as mob) - interact(user) + ui_interact(user) -/obj/structure/piano/interact(mob/user as mob) +/obj/structure/piano/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!user || !anchored) return - user.set_machine(src) - song.interact(user) + song.ui_interact(user, ui_key, ui, force_open) + +/obj/structure/piano/Topic(href, href_list) + song.Topic(href, href_list) /obj/structure/piano/attackby(obj/item/O as obj, mob/user as mob, params) if (istype(O, /obj/item/weapon/wrench)) diff --git a/nano/templates/song.tmpl b/nano/templates/song.tmpl new file mode 100644 index 00000000000..66a2832f332 --- /dev/null +++ b/nano/templates/song.tmpl @@ -0,0 +1,87 @@ + + +
+
+
Playback
+
+ {{:helper.link('New', 'document', {'newsong': 1})}} + {{:helper.link('Import', 'folder-open', {'import': 1})}} + {{:helper.link('Play', 'play', {'play': 1}, data.lines.length > 0 ? (data.playing ? 'selected' : null) : 'disabled')}} + {{:helper.link('Stop', 'stop', {'stop': 1}, !data.playing ? 'selected' : null)}} +
+
+
+
Repeat Song:
+ {{:helper.link('-', null, {'repeat' : -10}, data.repeat > 0 && !data.playing ? null : 'disabled')}} + {{:helper.link('-', null, {'repeat' : -1}, data.repeat > 0 && !data.playing ? null : 'disabled')}} + {{:data.repeat}} + {{:helper.link('+', null, {'repeat' : 1}, data.repeat < data.maxRepeat && !data.playing ? null : 'disabled')}} + {{:helper.link('+', null, {'repeat' : 10}, data.repeat < data.maxRepeat && !data.playing ? null : 'disabled')}} +
+
+
Tempo:
+ {{:helper.link('-', null, {'tempo' : 10}, data.tempo < data.maxTempo ? null : 'disabled')}} + {{:helper.link('-', null, {'tempo' : 1}, data.tempo < data.maxTempo ? null : 'disabled')}} + {{:helper.round(600 / data.tempo)}} BPM + {{:helper.link('+', null, {'tempo' : -1}, data.tempo > data.minTempo ? null : 'disabled')}} + {{:helper.link('+', null, {'tempo' : -10}, data.tempo > data.minTempo ? null : 'disabled')}} +
+
+ +

Editor

+{{for data.lines}} +
+
{{:index + 1}}: 
+
+ {{:helper.link('Edit', 'pencil', {'modifyline': index+1}, data.playing ? 'disabled' : null)}} + {{:helper.link('Insert', 'arrowreturn-1-n', {'insertline': index+1}, data.playing ? 'disabled' : null)}} + {{:helper.link('Delete', 'trash', {'deleteline': index+1}, data.playing ? 'disabled' : null)}} +
+
{{:value}}
+
+{{/for}} +
+ {{:helper.link('Add Line', 'arrowreturn-1-s', {'insertline': data.lines.length + 1}, data.playing ? 'disabled' : null)}} +
+
+
+ +
+
+ {{:helper.link('Help', data.help ? 'close' : 'help', {'help': 1})}} +
+
+ {{if data.help}} +

+ Lines are a series of chords, separated by commas (,), each with notes seperated by hyphens (-). +
+ Every note in a chord will play together, with the chord timed by the tempo as defined above. +

+

+ Notes are played by the names of the note, and optionally, the accidental, and/or the octave number. +
+ By default, every note is natural and in octave 3. Defining a different state for either is remembered for each note. +

    +
  • Example: C,D,E,F,G,A,B will play a C major scale.
  • +
  • After a note has an accidental or octave placed, it will be remembered: C,C4,C#,C3 is C3,C4,C4#,C3#
  • +
+

+

+ Chords can be played simply by seperating each note with a hyphon: A-C#,Cn-E,E-G#,Gn-B.
+ A pause may be denoted by an empty chord: C,E,,C,G. +
+ To make a chord be a different time, end it with /x, where the chord length will be length defined by tempo / x, eg: C,G/2,E/4. +

+

+ Combined, an example line is: E-E4/4,F#/2,G#/8,B/8,E3-E4/4. +

    +
  • Lines may be up to 50 characters.
  • +
  • A song may only contain up to 50 lines.
  • +
+

+ {{/if}} +
+
\ No newline at end of file From 492045b163d027288490da1544d2f166c8b8b3d0 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 5 Jan 2016 02:35:56 -0500 Subject: [PATCH 15/23] 3120 Changelog --- html/changelogs/Tastyfish-PR-3120.yml | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 html/changelogs/Tastyfish-PR-3120.yml diff --git a/html/changelogs/Tastyfish-PR-3120.yml b/html/changelogs/Tastyfish-PR-3120.yml new file mode 100644 index 00000000000..d5be092963c --- /dev/null +++ b/html/changelogs/Tastyfish-PR-3120.yml @@ -0,0 +1,35 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. Remove the quotation mark and put in your name when copy+pasting the example changelog. +author: Tastyfish + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Instruments now use a NanoUI." \ No newline at end of file From beaa8bab9093801a0e8096732796535c8ad50f34 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 5 Jan 2016 03:11:30 -0500 Subject: [PATCH 16/23] Slight changelog grammar fix --- html/changelogs/Tastyfish-PR-3120.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/Tastyfish-PR-3120.yml b/html/changelogs/Tastyfish-PR-3120.yml index d5be092963c..e5b28e0d983 100644 --- a/html/changelogs/Tastyfish-PR-3120.yml +++ b/html/changelogs/Tastyfish-PR-3120.yml @@ -32,4 +32,4 @@ delete-after: True # Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. # Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. changes: - - tweak: "Instruments now use a NanoUI." \ No newline at end of file + - tweak: "Instruments now use NanoUI." \ No newline at end of file From 691393f30eee1bc31a162ab11ba6209951e63b17 Mon Sep 17 00:00:00 2001 From: Certh Date: Tue, 5 Jan 2016 17:50:36 +0100 Subject: [PATCH 17/23] Fixes some air alarms --- _maps/map_files/cyberiad/cyberiad.dmm | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 4f5befd34ef..e8f41ed182a 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -459,7 +459,7 @@ "aiQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/permabrig) "aiR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/permabrig) "aiS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig) -"aiT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) +"aiT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) "aiV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury) "aiW" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury) @@ -562,7 +562,7 @@ "akP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "akQ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) "akR" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay) -"akS" = (/obj/structure/table,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/processing) +"akS" = (/obj/structure/table,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/processing) "akT" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/processing) "akU" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing) "akV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/processing) @@ -640,7 +640,7 @@ "amp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/processing) "amq" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/processing) "amr" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/processing) -"ams" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) +"ams" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "amt" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/crowbar,/obj/item/device/radio,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) "amu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/armoury) "amv" = (/obj/machinery/computer/prisoner,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden) @@ -1026,7 +1026,7 @@ "atL" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/maintenance/abandonedbar) "atM" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/plating,/area/maintenance/abandonedbar) "atN" = (/obj/item/stack/rods,/turf/space,/area/space) -"atO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prisonershuttle) +"atO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prisonershuttle) "atP" = (/obj/structure/closet/secure_closet/brig{id = "Cell 5"; name = "Cell 5 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 5"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B) "atQ" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"; name = "Cell 4 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 4"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A) "atR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A) @@ -4131,7 +4131,7 @@ "bBw" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"}) "bBx" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"}) "bBy" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/research{name = "Research Division"}) -"bBz" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/lab) +"bBz" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/toxins/lab) "bBA" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab) "bBB" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/lab) "bBC" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab) @@ -5888,7 +5888,7 @@ "cjl" = (/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/medical/medbay2) "cjm" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virology) "cjn" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2) -"cjo" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) +"cjo" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology) "cjp" = (/turf/simulated/wall/r_wall,/area/medical/patient_a) "cjq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/biostorage) "cjr" = (/obj/structure/extinguisher_cabinet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/wall/r_wall,/area/medical/biostorage) @@ -7233,7 +7233,7 @@ "cJe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/engineering) "cJf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engine/hardsuitstorage) "cJg" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/hardsuitstorage) -"cJh" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0; tag = "icon-alarm0 (EAST)"},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) +"cJh" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whitegreen (WEST)"; icon_state = "whitegreen"; dir = 8},/area/medical/virology) "cJi" = (/obj/machinery/camera{c_tag = "Engineering Chief Engineer's Office"; dir = 4; network = list("SS13")},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_x = -28; pixel_y = 0},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cJj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) "cJk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office) @@ -8973,4 +8973,3 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik "} - From 8831a6c2551703a450cdfcc525a910065e2713fd Mon Sep 17 00:00:00 2001 From: Certh Date: Tue, 5 Jan 2016 21:54:25 +0100 Subject: [PATCH 18/23] changelog --- html/changelogs/Certhic-PR-3122.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/Certhic-PR-3122.yml diff --git a/html/changelogs/Certhic-PR-3122.yml b/html/changelogs/Certhic-PR-3122.yml new file mode 100644 index 00000000000..2259255f75f --- /dev/null +++ b/html/changelogs/Certhic-PR-3122.yml @@ -0,0 +1,6 @@ +author: Certhic + +delete-after: True + +changes: + - bugfix: "Corrected some air alarms so that atmos computer can access them" From 9478fc078c7ab431b4aacd80f2ed2ec4f347f7ab Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jan 2016 19:39:19 -0500 Subject: [PATCH 19/23] Fixes a Few Vulp Typo's --- code/modules/client/preferences.dm | 2 +- code/modules/mob/living/carbon/human/body_accessories.dm | 2 +- code/modules/mob/living/carbon/human/species/station.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index d82d029a530..e8d01ac9f8e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1135,7 +1135,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts ha_style = "None" // No Vulp ears on Unathi m_style = "None" // No Unathi markings on Tajara - body_accessory = null //no vulpatail on humans damnit + body_accessory = null //no vulptail on humans damnit if("speciesprefs")//oldvox code speciesprefs = !speciesprefs diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index ca94bd49baf..901f43345d8 100644 --- a/code/modules/mob/living/carbon/human/body_accessories.dm +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -100,7 +100,7 @@ var/global/list/body_accessory_by_species = list("None" = null) return 0 -//vulpakin +//Vulpkanin /datum/body_accessory/tail/vulpkanin_2 name = "Vulpkanin Alt 1 (Bushy)" diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 056425a0966..b0b5c271d04 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -111,7 +111,7 @@ /datum/species/vulpkanin name = "Vulpkanin" - name_plural = "Vulpakanin" + name_plural = "Vulpkanin" icobase = 'icons/mob/human_races/r_vulpkanin.dmi' deform = 'icons/mob/human_races/r_vulpkanin.dmi' path = /mob/living/carbon/human/vulpkanin From 44fe32136680d95fa772d97a8d069ca1be32331a Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jan 2016 20:14:10 -0500 Subject: [PATCH 20/23] cleaner --- code/modules/reagents/oldchem/reagents/reagents_water.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 1db08c92c7d..eea7dfad6c4 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -100,7 +100,6 @@ if(volume >= 1) if(T) T.color = initial(T.color) - T.overlays.Cut() T.clean_blood() for(var/obj/effect/decal/cleanable/C in src) qdel(C) From 75363180e321758d71797c3ab5c80dc4033abf86 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 5 Jan 2016 21:12:53 -0500 Subject: [PATCH 21/23] Improved striped css class to be usable for divs, etc --- nano/assets/nanoui.css | 3 +++ nano/styles/_lists.less | 14 +++++++++++--- nano/templates/song.tmpl | 22 ++++++++++++---------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/nano/assets/nanoui.css b/nano/assets/nanoui.css index 456fa31733b..638e6a0043b 100644 --- a/nano/assets/nanoui.css +++ b/nano/assets/nanoui.css @@ -758,6 +758,9 @@ th.misc { .striped tr:nth-child(even) { background-color: #404040; } +.striped:not(table) > :nth-child(even) { + background-color: #404040; +} .itemGroup { border: 1px solid #e9c183; background: #2c2c2c; diff --git a/nano/styles/_lists.less b/nano/styles/_lists.less index 42300262662..ffa69af116e 100644 --- a/nano/styles/_lists.less +++ b/nano/styles/_lists.less @@ -70,6 +70,14 @@ th.misc { } /* Table styling for Med Scanner */ -.striped tr:nth-child(even) { - background-color: #404040 -} \ No newline at end of file +.striped { + .striped-base() { + background-color: #404040; + } + tr:nth-child(even) { + .striped-base; + } + &:not(table) > :nth-child(even) { + .striped-base; + } +} diff --git a/nano/templates/song.tmpl b/nano/templates/song.tmpl index 66a2832f332..43ab61b75ef 100644 --- a/nano/templates/song.tmpl +++ b/nano/templates/song.tmpl @@ -32,17 +32,19 @@ Used In File(s): \code\game\objects\structures\musician.dm

Editor

-{{for data.lines}} -
-
{{:index + 1}}: 
-
- {{:helper.link('Edit', 'pencil', {'modifyline': index+1}, data.playing ? 'disabled' : null)}} - {{:helper.link('Insert', 'arrowreturn-1-n', {'insertline': index+1}, data.playing ? 'disabled' : null)}} - {{:helper.link('Delete', 'trash', {'deleteline': index+1}, data.playing ? 'disabled' : null)}} +
+ {{for data.lines}} +
+
{{:index + 1}}: 
+
+ {{:helper.link('Edit', 'pencil', {'modifyline': index+1}, data.playing ? 'disabled' : null)}} + {{:helper.link('Insert', 'arrowreturn-1-n', {'insertline': index+1}, data.playing ? 'disabled' : null)}} + {{:helper.link('Delete', 'trash', {'deleteline': index+1}, data.playing ? 'disabled' : null)}} +
+
{{:value}}
-
{{:value}}
-
-{{/for}} + {{/for}} +
{{:helper.link('Add Line', 'arrowreturn-1-s', {'insertline': data.lines.length + 1}, data.playing ? 'disabled' : null)}}
From a10d7d1bd20c49f071d1eae372b871b50e4b9204 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 5 Jan 2016 18:46:39 -0800 Subject: [PATCH 22/23] fix lightfloors --- code/game/objects/items/stacks/tiles/light.dm | 48 ---------- .../objects/items/stacks/tiles/tile_types.dm | 16 +++- .../game/turfs/simulated/floor/light_floor.dm | 93 +++++++++++-------- paradise.dme | 1 - 4 files changed, 69 insertions(+), 89 deletions(-) delete mode 100644 code/game/objects/items/stacks/tiles/light.dm diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm deleted file mode 100644 index 3cf7bd35c68..00000000000 --- a/code/game/objects/items/stacks/tiles/light.dm +++ /dev/null @@ -1,48 +0,0 @@ -#define LIGHTFLOOR_ON 1 -#define LIGHTFLOOR_WHITE 2 -#define LIGHTFLOOR_RED 3 -#define LIGHTFLOOR_GREEN 4 -#define LIGHTFLOOR_YELLOW 5 -#define LIGHTFLOOR_BLUE 6 -#define LIGHTFLOOR_PURPLE 7 - -/obj/item/stack/tile/light - name = "light tiles" - gender = PLURAL - singular_name = "light floor tile" - desc = "A floor tile, made out off glass. Use a multitool on it to change its color." - icon_state = "tile_light blue" - force = 3 - throwforce = 5 - attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") - var/on = 1 - var/state = LIGHTFLOOR_ON - -/obj/item/stack/tile/light/proc/color_desc() - switch(state) - if(LIGHTFLOOR_ON) return "light blue" - if(LIGHTFLOOR_WHITE) return "white" - if(LIGHTFLOOR_RED) return "red" - if(LIGHTFLOOR_GREEN) return "green" - if(LIGHTFLOOR_YELLOW) return "yellow" - if(LIGHTFLOOR_BLUE) return "dark blue" - if(LIGHTFLOOR_PURPLE) return "purple" - else return "broken" - -/obj/item/stack/tile/light/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - ..() - if(istype(O,/obj/item/weapon/crowbar)) - new/obj/item/stack/sheet/metal(user.loc) - amount-- - new/obj/item/stack/light_w(user.loc) - if(amount <= 0) - user.unEquip(src, 1) - del(src) - else if(istype(O,/obj/item/device/multitool)) - state++ - if(state>LIGHTFLOOR_PURPLE) state=LIGHTFLOOR_ON - icon_state="tile_"+color_desc() - user << "[src] is now "+color_desc() - - return ..() - \ No newline at end of file diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 207a046446e..b42dd419ad3 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -70,4 +70,18 @@ throw_range = 7 flags = CONDUCT turf_type = /turf/simulated/floor/plasteel - mineralType = "metal" \ No newline at end of file + mineralType = "metal" + +/* + * Light + */ +/obj/item/stack/tile/light + name = "light tiles" + gender = PLURAL + singular_name = "light floor tile" + desc = "A floor tile, made out off glass. Use a multitool on it to change its color." + icon_state = "tile_light blue" + force = 3 + throwforce = 5 + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") + turf_type = /turf/simulated/floor/light \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm index 25a66394504..8149dae593a 100644 --- a/code/game/turfs/simulated/floor/light_floor.dm +++ b/code/game/turfs/simulated/floor/light_floor.dm @@ -1,9 +1,19 @@ +#define LIGHTFLOOR_ON 1 +#define LIGHTFLOOR_WHITE 2 +#define LIGHTFLOOR_RED 3 +#define LIGHTFLOOR_GREEN 4 +#define LIGHTFLOOR_YELLOW 5 +#define LIGHTFLOOR_BLUE 6 +#define LIGHTFLOOR_PURPLE 7 + /turf/simulated/floor/light name = "Light floor" light_range = 5 icon_state = "light_on" floor_tile = /obj/item/stack/tile/light broken_states = list("light_broken") + var/on = 1 + var/state = LIGHTFLOOR_ON /turf/simulated/floor/light/New() ..() @@ -11,58 +21,63 @@ /turf/simulated/floor/light/update_icon() ..() - if(istype(builtin_tile, /obj/item/stack/tile/light)) - var/obj/item/stack/tile/light/T = builtin_tile - if(T.on) - switch(T.state) - if(LIGHTFLOOR_ON) - icon_state = "light_on" - set_light(5,null,LIGHT_COLOR_LIGHTBLUE) - if(LIGHTFLOOR_WHITE) - icon_state = "light_on-w" - set_light(5,null,LIGHT_COLOR_WHITE) - if(LIGHTFLOOR_RED) - icon_state = "light_on-r" - set_light(5,null,LIGHT_COLOR_RED) - if(LIGHTFLOOR_GREEN) - icon_state = "light_on-g" - set_light(5,null,LIGHT_COLOR_PURE_GREEN) - if(LIGHTFLOOR_YELLOW) - icon_state = "light_on-y" - set_light(5,null,"#FFFF00") - if(LIGHTFLOOR_BLUE) - icon_state = "light_on-b" - set_light(5,null,LIGHT_COLOR_DARKBLUE) - if(LIGHTFLOOR_PURPLE) - icon_state = "light_on-p" - set_light(5,null,LIGHT_COLOR_PURPLE) - else - icon_state = "light_off" - set_light(0) - else - set_light(0) - icon_state = "light_off" + if(on) + switch(state) + if(LIGHTFLOOR_ON) + icon_state = "light_on" + set_light(5,null,LIGHT_COLOR_LIGHTBLUE) + if(LIGHTFLOOR_WHITE) + icon_state = "light_on-w" + set_light(5,null,LIGHT_COLOR_WHITE) + if(LIGHTFLOOR_RED) + icon_state = "light_on-r" + set_light(5,null,LIGHT_COLOR_RED) + if(LIGHTFLOOR_GREEN) + icon_state = "light_on-g" + set_light(5,null,LIGHT_COLOR_PURE_GREEN) + if(LIGHTFLOOR_YELLOW) + icon_state = "light_on-y" + set_light(5,null,"#FFFF00") + if(LIGHTFLOOR_BLUE) + icon_state = "light_on-b" + set_light(5,null,LIGHT_COLOR_DARKBLUE) + if(LIGHTFLOOR_PURPLE) + icon_state = "light_on-p" + set_light(5,null,LIGHT_COLOR_PURPLE) + else + icon_state = "light_off" + set_light(0) + else + set_light(0) + icon_state = "light_off" /turf/simulated/floor/light/ChangeTurf(turf/T) set_light(0) ..() /turf/simulated/floor/light/attack_hand(mob/user) - if(istype(builtin_tile, /obj/item/stack/tile/light)) - var/obj/item/stack/tile/light/T = builtin_tile - T.on = !T.on - update_icon() + on = !on + update_icon() /turf/simulated/floor/light/attackby(obj/item/C, mob/user, params) if(..()) return if(istype(C,/obj/item/weapon/light/bulb)) //only for light tiles if(istype(builtin_tile, /obj/item/stack/tile/light)) - var/obj/item/stack/tile/light/T = builtin_tile - if(T.state) + if(!state) qdel(C) - T.state = C //fixing it by bashing it with a light bulb, fun eh? + state = LIGHTFLOOR_ON update_icon() user << "You replace the light bulb." else - user << "The light bulb seems fine, no need to replace it." \ No newline at end of file + user << "The light bulb seems fine, no need to replace it." + if(istype(C,/obj/item/device/multitool)) + if(state != 0) + if(state < LIGHTFLOOR_PURPLE) + state++ + else + state = LIGHTFLOOR_ON + user << "You change \the [src]'s light bulb color." + update_icon() + else + user << "\The [src]'s light bulb appears to have burned out." \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index ddc9a9720dd..87900dc097a 100644 --- a/paradise.dme +++ b/paradise.dme @@ -690,7 +690,6 @@ #include "code\game\objects\items\stacks\sheets\mineral.dm" #include "code\game\objects\items\stacks\sheets\sheet_types.dm" #include "code\game\objects\items\stacks\sheets\sheets.dm" -#include "code\game\objects\items\stacks\tiles\light.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\weapons\AI_modules.dm" #include "code\game\objects\items\weapons\alien_specific.dm" From 61d120737a3718ea0da6b6514babdca2f72763d7 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 5 Jan 2016 22:16:45 -0500 Subject: [PATCH 23/23] Blueshield briefing had wrong position as their boss --- code/modules/paperwork/paper.dm | 4 +-- html/changelogs/Tastyfish-PR-3132.yml | 35 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 html/changelogs/Tastyfish-PR-3132.yml diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 1cd4d014532..723f4a2147d 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -563,11 +563,11 @@ /obj/item/weapon/paper/blueshield name = "paper- 'Blueshield Mission Briefing'" - info = "Blueshield Mission Briefing
You are charged with the defence of any persons of importance within the station. This includes but is not limited to The Captain, The Heads of Staff and Central Command staff. You answer directly to the Head of Security who will assist you in achieving your mission.
Where required to achieve your primary responsibility you should liaise with security and share resources, however the day to day security operations of the station are outside of your jurisdiction.
Monitor the health and safety of your principals, identify any potential risks and threats then alert the proper departments to resolve the situation. You are authorized to act as bodyguard to any of the station heads that you determine are most in need of protection, however additional access to their departments shall be granted solely at their discretion.
Observe the station alert system and carry your armaments only as required by the situation or when authorized by the Head of Security or Captain in exceptional cases.
Remember, as an agent of Nanotrasen it is your responsibility to conduct yourself appropriately and you will be held to the highest standard. You will be held accountable for your actions. Security is authorized to search, interrogate or detain you as required by their own procedures. Internal affairs will also monitor and observe your conduct and their mandate applies equally to security and Blueshield operations." + info = "Blueshield Mission Briefing
You are charged with the defence of any persons of importance within the station. This includes, but is not limited to, The Captain, The Heads of Staff and Central Command staff. You answer directly to the Nanotrasen Representative who will assist you in achieving your mission.
When required to achieve your primary responsibility, you should liaise with security and share resources; however, the day to day security operations of the station are outside of your jurisdiction.
Monitor the health and safety of your principals, identify any potential risks and threats, then alert the proper departments to resolve the situation. You are authorized to act as bodyguard to any of the station heads that you determine are most in need of protection; however, additional access to their departments shall be granted solely at their discretion.
Observe the station alert system and carry your armaments only as required by the situation, or when authorized by the Head of Security or Captain in exceptional cases.
Remember, as an agent of Nanotrasen it is your responsibility to conduct yourself appropriately and you will be held to the highest standard. You will be held accountable for your actions. Security is authorized to search, interrogate or detain you as required by their own procedures. Internal affairs will also monitor and observe your conduct, and their mandate applies equally to security and Blueshield operations." /obj/item/weapon/paper/ntrep name = "paper- 'Nanotrasen Representative Mission Briefing'" - info = "Nanotrasen Representative Mission Briefing

Nanotrasen Central Command has dispatched you to this station in order to liaise with command staff on their behalf. As experienced field officers, the staff on the station are experts in handling their own fields. It is your job however to consider the bigger picture and to direct the staff towards Nanotrasen's corporate interests.
As a civilian, you should consider yourself an advisor, diplomat and intermediary. The command staff do not answer to you directly and are not required to follow your orders nor do you have disciplinary authority over personnel. In all station internal matters you answer to the Head of Personnel who will direct you in your conduct within the station. However you also answer to Central Command who may, as required, direct you in acting on company interests.
Central Command may dispatch orders to the staff through you which you are responsible to communicate, however enforcement of these orders is not your mandate and will be handled directly by Central Command or authorized Nanotrasen personnel. When not specifically directed by Central Command, assist the head of personnel in evaluation of the station and receiving departmental reports.
Your office has been provided with a direct link to Central Command, through which you can issue any urgent reports or requests for Nanotrasen intervention. Remember that any direct intervention is a costly exercise and should be used only when the situation justifies the request. You will be held accountable for any unnecessary usage of Nanotrasen resources.
" + info = "Nanotrasen Representative Mission Briefing

Nanotrasen Central Command has dispatched you to this station in order to liaise with command staff on their behalf. As experienced field officers, the staff on the station are experts in handling their own fields. It is your job, however, to consider the bigger picture and to direct the staff towards Nanotrasen's corporate interests.
As a civilian, you should consider yourself an advisor, diplomat and intermediary. The command staff do not answer to you directly and are not required to follow your orders, nor do you have disciplinary authority over personnel. In all station internal matters you answer to the Head of Personnel who will direct you in your conduct within the station. However, you also answer to Central Command who may, as required, direct you in acting on company interests.
Central Command may dispatch orders to the staff through you which you are responsible to communicate; however, enforcement of these orders is not your mandate and will be handled directly by Central Command or authorized Nanotrasen personnel. When not specifically directed by Central Command, assist the Head of Personnel in evaluation of the station and receiving departmental reports.
Your office has been provided with a direct link to Central Command, through which you can issue any urgent reports or requests for Nanotrasen intervention. Remember that any direct intervention is a costly exercise and should be used only when the situation justifies the request. You will be held accountable for any unnecessary usage of Nanotrasen resources.
" /obj/item/weapon/paper/armory name = "paper- 'Armory Inventory'" diff --git a/html/changelogs/Tastyfish-PR-3132.yml b/html/changelogs/Tastyfish-PR-3132.yml new file mode 100644 index 00000000000..88e27ab1992 --- /dev/null +++ b/html/changelogs/Tastyfish-PR-3132.yml @@ -0,0 +1,35 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. Remove the quotation mark and put in your name when copy+pasting the example changelog. +author: Tastyfish + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - spellcheck: "Corrected the blueshield mission briefing."