From 7463a1bd6ee4724e1e79419d5a06c0b81bfa9da6 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Sun, 8 Aug 2021 23:28:20 -0400 Subject: [PATCH] Merge pull request #11368 from VOREStation/Arokha/closetanim Port of monster860's animated doors to Bay closets --- code/game/objects/effects/overlays.dm | 7 ++ code/game/objects/items/bodybag.dm | 1 + code/game/objects/items/poi_items.dm | 1 + .../structures/crates_lockers/__closets.dm | 71 ++++++++++++++++-- .../_closets_appearance_definitions.dm | 28 +++++-- .../crates_lockers/closets/coffin.dm | 2 + .../crates_lockers/closets/crittercrate.dm | 3 +- .../crates_lockers/closets/egg_vr.dm | 1 + .../crates_lockers/closets/gimmick.dm | 2 + .../crates_lockers/closets/secure/security.dm | 1 + .../crates_lockers/closets/statue.dm | 1 + .../crates_lockers/closets/walllocker.dm | 1 + .../structures/crates_lockers/crates.dm | 1 + icons/obj/closets/bases/cabinet.dmi | Bin 1904 -> 1925 bytes icons/obj/closets/bases/cart.dmi | Bin 1202 -> 1235 bytes icons/obj/closets/bases/closet.dmi | Bin 1803 -> 1864 bytes icons/obj/closets/bases/crate.dmi | Bin 1503 -> 1364 bytes icons/obj/closets/bases/large_crate.dmi | Bin 1605 -> 1606 bytes icons/obj/closets/decals/closet.dmi | Bin 3311 -> 3561 bytes 19 files changed, 104 insertions(+), 16 deletions(-) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index c07f783e9e..9669004bca 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -182,3 +182,10 @@ stack_trace("Directional light cone deleted, but not by our component") return QDEL_HINT_LETMELIVE return ..() + +/obj/effect/overlay/closet_door + anchored = TRUE + plane = FLOAT_PLANE + layer = FLOAT_LAYER + vis_flags = VIS_INHERIT_ID + appearance_flags = KEEP_TOGETHER | LONG_GLIDE | PIXEL_SCALE diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index b27ebc27c5..048d089fed 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -26,6 +26,7 @@ closet_appearance = null open_sound = 'sound/items/zip.ogg' close_sound = 'sound/items/zip.ogg' + door_anim_time = 0 //Unsupported var/item_path = /obj/item/bodybag density = FALSE storage_capacity = (MOB_MEDIUM * 2) - 1 diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm index 2c05f0cfca..8e65ac005b 100644 --- a/code/game/objects/items/poi_items.dm +++ b/code/game/objects/items/poi_items.dm @@ -65,6 +65,7 @@ closet_appearance = null catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor) climbable = FALSE + door_anim_time = 0 //Unsupported starts_with = list( /obj/item/weapon/fuel_assembly/deuterium = 6) diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm index fb27ea6977..7a91c6ad8f 100644 --- a/code/game/objects/structures/crates_lockers/__closets.dm +++ b/code/game/objects/structures/crates_lockers/__closets.dm @@ -36,6 +36,19 @@ var/closet_appearance = /decl/closet_appearance // The /decl that defines what decals we end up with, that makes our look unique + /// Currently animating the door transform + var/is_animating_door = FALSE + /// Length of time (ds) to animate the door transform + var/door_anim_time = 2.0 + /// Amount to 'squish' the full width of the door by + var/door_anim_squish = 0.30 + /// Virtual angle at which the door is opened to (136 by default, so not a full 180) + var/door_anim_angle = 136 + /// Offset for the door hinge location from centerline + var/door_hinge = -6.5 + /// Our visual object for the closet door + var/obj/effect/overlay/closet_door/door_obj + /obj/structure/closet/Initialize() ..() return INITIALIZE_HINT_LATELOAD @@ -66,6 +79,10 @@ color = null update_icon() +/obj/structure/closet/Destroy() + . = ..() + qdel_null(door_obj) + /obj/structure/closet/examine(mob/user) . = ..() if(Adjacent(user) || isobserver(user)) @@ -134,7 +151,7 @@ playsound(src, open_sound, 15, 1, -3) if(initial(density)) density = !density - update_icon() + animate_door() return 1 /obj/structure/closet/proc/close() @@ -159,7 +176,7 @@ playsound(src, close_sound, 15, 1, -3) if(initial(density)) density = !density - update_icon() + animate_door(TRUE) return 1 //Cham Projector Exception @@ -214,10 +231,11 @@ /obj/structure/closet/proc/toggle(mob/user as mob) + if(is_animating_door) + return if(!(opened ? close() : open())) to_chat(user, "It won't budge!") return - update_icon() // this should probably use dump_contents() /obj/structure/closet/ex_act(severity) @@ -481,8 +499,45 @@ spawn(1) qdel(src) return 1 -// Just a generic cabinet for mappers to use -/obj/structure/closet/cabinet - name = "cabinet" - icon = 'icons/obj/closets/bases/cabinet.dmi' - closet_appearance = /decl/closet_appearance/cabinet +/obj/structure/closet/proc/animate_door(closing = FALSE) + if(!door_anim_time) + update_icon() + return + if(!door_obj) + door_obj = new + vis_contents |= door_obj + door_obj.icon = icon + door_obj.icon_state = "door_front" + is_animating_door = TRUE + if(!closing) + update_icon() + var/num_steps = door_anim_time / world.tick_lag + for(var/I in 0 to num_steps) + var/angle = door_anim_angle * (closing ? 1 - (I/num_steps) : (I/num_steps)) + var/matrix/M = get_door_transform(angle) + var/door_state = angle >= 90 ? "door_back" : "door_front" + var/door_layer = angle >= 90 ? FLOAT_LAYER : ABOVE_MOB_LAYER + + if(I == 0) + door_obj.transform = M + door_obj.icon_state = door_state + door_obj.layer = door_layer + else if(I == 1) + animate(door_obj, transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag, flags = ANIMATION_END_NOW) + else + animate(transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag) + addtimer(CALLBACK(src,.proc/end_door_animation,closing),door_anim_time,TIMER_UNIQUE|TIMER_OVERRIDE) + +/obj/structure/closet/proc/end_door_animation(closing = FALSE) + is_animating_door = FALSE + if(closing) + // There's not really harm in leaving it on, but, one less atom to send to clients to render when lockers are closed + vis_contents -= door_obj + update_icon() + +/obj/structure/closet/proc/get_door_transform(angle) + var/matrix/M = matrix() + M.Translate(-door_hinge, 0) + M.Multiply(matrix(cos(angle), 0, 0, -sin(angle) * door_anim_squish, 1, 0)) + M.Translate(door_hinge, 0) + return M diff --git a/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm b/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm index 9075c87272..eb1ab2d780 100644 --- a/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm +++ b/code/game/objects/structures/crates_lockers/_closets_appearance_definitions.dm @@ -33,6 +33,8 @@ var/icon/closed_locked_welded_icon var/icon/closed_unlocked_icon var/icon/closed_unlocked_welded_icon + var/icon/door_front_icon + var/icon/door_back_icon // Create open icon. var/icon/new_icon = new @@ -40,6 +42,10 @@ open_icon.Blend(icon(base_icon, "open"), ICON_OVERLAY) open_icon.Blend(color, BLEND_ADD) open_icon.Blend(icon(base_icon, "interior"), ICON_OVERLAY) + + door_back_icon = icon(base_icon, "door_back") + door_back_icon.Blend(color, BLEND_ADD) + if(decal_icon) for(var/thing in decals) var/icon/this_decal_icon = icon(decal_icon, "[thing]_open") @@ -47,6 +53,8 @@ open_icon.Blend(this_decal_icon, ICON_OVERLAY) // Generate basic closed icons. + door_front_icon = icon(base_icon, "door_front") + door_front_icon.Blend(color, BLEND_ADD) closed_emagged_icon = icon(base_icon, "base") if(can_lock) closed_emagged_icon.Blend(icon(base_icon, "lock"), ICON_OVERLAY) @@ -56,6 +64,10 @@ var/icon/this_decal_icon = icon(decal_icon, thing) this_decal_icon.Blend(decals[thing], BLEND_ADD) closed_emagged_icon.Blend(this_decal_icon, ICON_OVERLAY) + door_front_icon.Blend(this_decal_icon, ICON_OVERLAY) + + door_front_icon.AddAlphaMask(icon(base_icon, "door_front")) // Remove pesky 'more than just door' decals + closed_locked_icon = icon(closed_emagged_icon) closed_unlocked_icon = icon(closed_emagged_icon) @@ -83,13 +95,15 @@ closed_emagged_welded_icon.Blend(sparks, ICON_OVERLAY) // Insert our bevy of icons into the final icon file. - new_icon.Insert(open_icon, "open") - new_icon.Insert(closed_emagged_icon, "closed_emagged") - new_icon.Insert(closed_emagged_welded_icon, "closed_emagged_welded") - new_icon.Insert(closed_locked_icon, "closed_locked") - new_icon.Insert(closed_locked_welded_icon, "closed_locked_welded") - new_icon.Insert(closed_unlocked_icon, "closed_unlocked") - new_icon.Insert(closed_unlocked_welded_icon, "closed_unlocked_welded") + new_icon.Insert(open_icon, "open") + new_icon.Insert(closed_emagged_icon, "closed_emagged") + new_icon.Insert(closed_emagged_welded_icon, "closed_emagged_welded") + new_icon.Insert(closed_locked_icon, "closed_locked") + new_icon.Insert(closed_locked_welded_icon, "closed_locked_welded") + new_icon.Insert(closed_unlocked_icon, "closed_unlocked") + new_icon.Insert(closed_unlocked_welded_icon, "closed_unlocked_welded") + new_icon.Insert(door_front_icon, "door_front") + new_icon.Insert(door_back_icon, "door_back") // Set icon! icon = new_icon diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index 3865641552..b42bbcb778 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -7,6 +7,7 @@ seal_tool = /obj/item/weapon/tool/screwdriver breakout_sound = 'sound/weapons/tablehit1.ogg' closet_appearance = null // Special icon for us + door_anim_time = 0 //Unsupported /* Graves */ /obj/structure/closet/grave @@ -20,6 +21,7 @@ max_closets = 1 opened = 1 closet_appearance = null // Special icon for us + door_anim_time = 0 //Unsupported /obj/structure/closet/grave/attack_hand(mob/user as mob) if(opened) diff --git a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm index 72a9188d12..0e7763e827 100644 --- a/code/game/objects/structures/crates_lockers/closets/crittercrate.dm +++ b/code/game/objects/structures/crates_lockers/closets/crittercrate.dm @@ -1,4 +1,5 @@ /obj/structure/closet/crate/critter name = "critter crate" desc = "A crate which can sustain life for a while." - closet_appearance = /decl/closet_appearance/large_crate/critter \ No newline at end of file + closet_appearance = /decl/closet_appearance/large_crate/critter + door_anim_time = 0 //Unsupported \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm index 19d3f8b452..d024a71582 100644 --- a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm @@ -13,6 +13,7 @@ opened = 0 sealed = 0 //Don't touch this. health = 100 + door_anim_time = 0 //Unsupported /obj/structure/closet/secure_closet/egg/update_icon() if(opened) diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 6ba78a90a0..2023737b8f 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -1,7 +1,9 @@ /obj/structure/closet/cabinet name = "cabinet" desc = "Old will forever be in fashion." + icon = 'icons/obj/closets/bases/cabinet.dmi' closet_appearance = /decl/closet_appearance/cabinet + door_anim_time = 0 //Unsupported /obj/structure/closet/acloset name = "strange closet" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index bb7b05c7b3..0e05016224 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -312,3 +312,4 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br //too small to put a man in large = 0 + door_anim_time = 0 // Unsupported diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 9b66918be0..c930b032a1 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -7,6 +7,7 @@ anchored = TRUE health = 0 //destroying the statue kills the mob within blocks_emissive = EMISSIVE_BLOCK_UNIQUE + door_anim_time = 0 // Why is this a closet?? var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils. var/intialBrute = 0 diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index f140e7380f..0bf549f06a 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -10,6 +10,7 @@ anchored = TRUE store_mobs = 0 wall_mounted = 1 + door_anim_time = 0 // Unsupported //spawns 2 sets of breathmask, emergency oxy tank and crowbar diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index eec6a8d892..bc178de97e 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -7,6 +7,7 @@ closet_appearance = /decl/closet_appearance/crate climbable = TRUE dir = 4 //Spawn facing 'forward' by default. + door_anim_time = 0 //Unsupported until appropriate sprites are available var/points_per_crate = 5 var/rigged = 0 diff --git a/icons/obj/closets/bases/cabinet.dmi b/icons/obj/closets/bases/cabinet.dmi index 236b164ca6efcaf049aac254340983f4fb938b26..a8c0261900d6382e4d3d21bf81d914a7e969828f 100644 GIT binary patch delta 1815 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 A9{>OV delta 1101 zcmV-T1hV_n39<>07Y<+u1^@s6)p~kK0001@ktJb&xSPlYDJvmDqayVT=FMww$j>}w zkxYq$_>hI8f4uTY2A8sG;nA|qvN)UYivQV#l;zQUp;7I&QHiFnQFkr<0JzCt=ynta zjsO4y%Sl8*RCt{2+`UfYKoAG;u`hjuMMVkS$!|b+4Wifz(a@M8($S^>i9A4%pr8eb zf;4G=C|w|)14}MIbO{X#qC&c6uHc;WCr6T9@8tadRRm{e*Pij(Sxg)fDhL8jza9(* zP91HVM$~}`f`BKJiLv;e=b;#KTDAv}HknN5%)f;sQ!?3a#un=Tf5Cl9Ljo5_IXvF!M0qiSW0@l{n zXn%iS>ogoi5nW$jYl~;v*47q3Jw0iQx4ynkcXxLpXP!aIs{exwu3qagMnw?IEiHNSQt_ovIwk6xsuha5vJDm=f#rq8NB|FYf zamPnDkvq7%yUSJIkMou9?n$>z-rsJwON;7XY!yOX{faCAqK_gd`~A&-&5e`Zp1iJV zTee-gbn=@r6F~{w00IC2000000000000000000000001hE_g;AYJ*}E1j+cTF~>s6 zj@lYW(yx@`V2$kq(f9<|mQR4`gfL&S)TB!tml3wVBBiVl>K;d<5}qbu$88s2o`f;f zrfg^HJOH-uJ8buzXLT$z5)OofF#uR+>O^qs?hw8XIcPW(fMrMk00000{Fi^k>NKWesn}{CU91y( zP0U;oFnXsgYDx9wI%QD)+bR z6JMY^n9sGzU0$YDqFrhUxi+}rIyIjwv8#!Kh&=btCQ}|_&F2uF`s2{6MPlaS$VsrO zE`0nz4)%U6|D9)`FogvPbVAw$X8x#ARl82!;8dODwi$ScGB&DuLbCUo7 zCAkpoC`pgkpL`ji;iSxcwzlsd8enM}PZA88X3N_^;xa2Urm8ah;t1PmzXt`Lq-d9gne{iiC-&i@**D>>`5gIT_OLkt)Hmjf$F`rV7x3`s7 zc9Ii=g6P_6{Y4vq8mA2yxCP3j4j=&lUEs`p|Ncd+IGK~Hb~TP*PvdZGEG#VxtbX20 z8D83QR&xkh8QO1RQ77OS~wO7HhAu|Sx^s0HZuAp98Yr`I_-IrGyM6&0zh znE72Mun7Tj{ictu{;oz%r@1k)l=0h0=Qb$Dhts0`~tn>a|zH z0$9fuuR=XO7&owWX+|iN;%~*#V~a>Sy$~99LIPthg;U8ES>%>jau*gB)>p$jVdW$p z!LBgx(4KlCSD-yM9lq9lBCh{vbIPpq%6>dNmUQUI7)LxeP_eC zkJ;v^`e3pZ!L=T`GqbY=m($h1WUw+O)0h4N^=#&ka;C7k4kPuIAJ`Soa;n(2{0Go*e8ML@=m3^Xjd<71S=kfddGZc&(<@8aP!^(-NQhOuG<~ zH-x>fO$a3{o)6svmx&M~@cz+CH}Kce($E4Pp&34kh@A-UTXmD_N!n$2gFcngmLML% z{EJROJy^fa2v>&)76D=F^ScM;z;9Y^$R5?dSi%FheSkOrzp{VR_m4yf21HD#lGo>_ z$%cU(*X=bsu6Fe@qJ4f=DBoAIv)UUlSt(1BN3->d`9H-Pd(m!dnnz2MI}@KuzPi;6 zU^LCcdETa^dStZE_a{G|vt2C39DFEmtF|5|$f&Wq=e(@SHFi4iPc72(8r(IFvl>3K zv1Pij|;rSUQD@$}JhQh0C-`;WMmY{kzhFCZ~;Sa~5F zMk9n|r-JKY7Q8D-`DtH2H73(s43CHZWwN$kS?8{pF;cBzBc;{}Q`^;gj=Ve&3VOxR zt^V@@LPp671&E$*0QH3NJagKroaU91)AR)sbOuI zlZtvv7V@W3+)P1PR)?ZZAv_+>f3Pp~RT-QsLThukw>t!-ZVv}BlqS!7&NoiQ&cQT4 zL#8!^npq1lEIbOi?d>Mb7K}F;?^w{|lWAeI6msNs!6*JNwl@g-z4CbR61ysD#&~Nnr4XTF`yb}LAeTCiw)S>x3W+i|l!ii7slT4@ aKau2jMpZ@aM1K64fQy40vDM!H+y4SlWK|dd literal 1803 zcma)7XH=617k(2Wi6QKSB_s?13DL5Lkbn|s5XA&S(aI_Wks(MKrHl|P6%gbLLIlJx zJ`7<7$`EP@Q%^)zKn0a)L6%Hq2uHDKe|-JT)~>YJj^VvzqN#o+YMNZ^mn9=)EjdUb~^ zvxRwrtGQ6FNixuPEm`n&nxLIk{9*BQ?5q1dA@o-Hsb41Ze{I7s+0|>UYo%)eg*)t> zexg>n$Qr8->I(x67il%uYYPC3agqZ#Q@Cr!@1o|te`b+b@X-)rgKp?|KS ze|p?EKk4xN2F=JZARwU2UxT5vrBVFHv$RwlbjEN|Vy?AxxmsBuyjCo)tis~%I)e|) z*?z;OEJfJET6iP@k*5K3kjvTzu-Om0d*Iidogn{)i&JY3H(VG^O{O;=`xZ9y8yl%M zUS3|?t)FQ|yLz&C&HrjWGf7mm)HSfP<+#XVb9-pVvPh!E#fraD33JQK8HjF?Wmqhc zXp`{KJ(UOk7-$HKY`YqzuZmDB%X&&sH*4oQgpJ1 zjGz|Q*3}q{swx@Fdf)h2dZtbE(z~<@X#e!7ex4C&Xk%0BZ==pSqbw;bY@U)hp2EPi zd2gJQDo!gykl)3OwT;Lj)(guJK4YV_u~B3i!W=am?i4k;9VJvn-ZiqVnaKiu6dgTa zwla{M%Tw++F*fM{vF7-T$80YP_rBOWXdbi`bV~wP!a33L=(nL*VQp>gK@~w2i*)o# zM8vZ#%VH}BLeb7d1khoHh$jGHb;^%aVIBVi2ds+0@b`Rlr}0mKK8hwIf6%@C(#6gf z7$65m#^wgb(1`XgY>m#OFcPN(t{3r4h8$>BQgSHQ*mzU;ZWLPymCHKOkv>0IMI>@u z(hfpBJT%F{QM?74o0hsz#FPd#G}sU7KCB<3YIeMQ0=t!&Sy}$teR)lIDYT#pX%}7a zR43`Xoo%Yyij#^}v8QfDhP4>e$%=~<8BaH-YF7D|F&uDTfB&0)4*E?2g4z4FGSSmh zR(5D)M8PcCWLoD4NzunQ{+?zQ?A3!?EZd&c=<0$Hbx%fEp|v3)U8pCQmQ2?c1ylP> zb5;%kYcf5Em8Zwp5MS83cvhc?mvLKTy3(VpnFUYS`e?Wcj?cV}kl99c7?cnhV>@eZ zR0(8ph}8PZGcM^12sjTlhQ@*Vl7Rmgi;h4RmpsOT?sqi-?84JmxAN*6GD6k;jPdPS zqwjpvdc-O z?`L=qsd0-SCZVBb_nqfXCj6+Nleu47>zcCZyYy9wgr+^OX0vggVR^@S_wu0o$51U1MDy{w$M2;KIpO^|EqL2mAYEI(osW%q_W0@SxF{aYJ3{}zF=cJSQ* NM|)=?@3hbLzX2V^HTnPm diff --git a/icons/obj/closets/bases/crate.dmi b/icons/obj/closets/bases/crate.dmi index 83500acb3bd132e9fe0c3439341fad805afd3f73..d83ac8da7beb823941d901501ce6383f19cbdeb7 100644 GIT binary patch delta 1288 zcmV+j1^4>j3)Bjb7)=BN0001>@^Lf(001XYOjJd{z`#dGM|O60Dk>^oUS67-n&#%_ z|Ns9C3=F)yyuiS~4Gj%9H#dsy`)L3G00DGTPE!Ct=GbNc005zpen@{wiHkEOv#1!z zH00t;D@x2wg|OiYiVG5pvWp2SD^JZyNlig0Gr_JbCqFrxup*EC9|CS~T8q!wl77vWNq8WedDC7zv#%cI=`RdH>byPtxOm7df(Fk0002+v(jof{*iX{u=8(rYg>Of z96ltzZd4g)*3JPwR5iBCqRL?B@OALOA=$&A@r3Hx<~}A*KLY>&0Dx|jw5B&obL|gI< z^!qp;IYg$Fxo}vA$+*y;g#N2GgSqIjC)3I-M8JVeD>J{YGMLntLE{FE579zY%|ND= zX}pT=)_wi+;FfiG>dCY+iy>zq)BCWoe9y(==E<}&iCBN06PZ?~@eJmoYCM@%H)uQq zFu0FrBH&D>)k!#V{qvyH%@np8G;jk;kE1Qu6{_*|krTOOX>GRJQ@U~n0X_U_RbBM} z-1OEor{QJ_df*oXihDVIWM zq5rwu(HegZ&cgK8(57K}Rkwl8>SQ=_veYp&5@uw{zjK96KMV_lP-0M&uWnUqZ z0uLv`pw9#T#uMNv{KF0MX%$askIh$fo=tyvwV7sd3rs^~fT?4$ppKaJI3a5W00000Plo6JQNA$B ywYtIol&^9P2KN{gds%b;2L-?S5CH%HG|e|gMwFdIu|uE$0000V=-0C=2JR&a84_mO@tf2p`2u_(J(iHkEO zv#1y-V93RpR+N~V3Sq;Qm8a&Uq^2O0nP69zlb@VTSP{q>L>U#IUyzzdoO#44O-d|I zC8&rflQQ#4Qj0S4i*PAaR&e!m0mldcoq2S5a3w4u000D{NklZkVw+A0Vwt2Py=J5i+ z@1o5&cL(-+5NBH32Jbp*t>uS2D{Sp8b$qm~SR(t~SZW(<$+rBvwO#O#TNd+VXERaP z5smhyA_eW37#(+UH|0o|*t>>}opY}1w)SvNvphGOUq|*Ue{s3SmP5#i#XfS9QDwO0=Aqc-<{of; z_V^S6AOYhVe*o~8!FC$}000000Pscra@mCxXY6-FPLc8O$X@1}tRUAbQV;j-NldN} z67{N!`N7uiW4n)@OOCdvM*8Dg1wKxZR6x@e{y#gU@jK0GtckadGwH>IW+Sf zZb^ILs{+WZ9c*$DDA~Q|Wy`PYSAa8){KaFyC~{+Qv~Qs5h!k~e7sr9 zM4)7s&UfC$NCYlUA+L8bY4po>iGZVxfY5gJLUuX=l?c$YOin<_UX6gqN8qf0ut?_w zTqt_;+N#ADsYa>>yz(Kvi0YI);ohwEWsXHOD1R?m1-! zV%OP!8V(eY?dM&lnKzyNSN`ex4cLFjUNF6J`wCd6OEDMMb+%5i|Eqvq1!P%aiZge{ zAo$OnXq(1{{@qbvd5Ovia5sJ*CRu*}VHF^ce~SHCrvULuQi%PNF~IIrFM#^>l9lHl zae>ANOb-TiO{>MQfFV`DZ9ggCxc*LVt$R?;FngQI|H9S8y?2r`pq99ETs`x*MV&WC>B5@ ze?NRP9@FFX9AlP(&~oqfuYY*4{%+FFp~$r^!q7Lo|8 z_Bew~pLI~>*=qv+Eu0geK9M>`faZ08#t5u-_Z1)|v-`TDcMFCP*_3W`eq$#?#w%WlV@_)`EEiig>iSXF5JnK$f%`NNGne7O$e>Pd? z$^ynhU2^zh1UTq%|5#ZYlmN4NcQ<{ie*S(X7k$cJR<|vbZVt;S^iuuZsu40I@nr>r zI^oS-LfYH8rV=j}Ppw))hs>*6y&JuBqg+Y#_dF1AJ9X6GKcR~HI{*Lx00000{AEh@ z_s3AGd_4vTxSJgTN$vHG(&cshBjyM^gU1U100000c$5DDt$|GG%(t~300000NkvXX Hu0mjfjo`5O diff --git a/icons/obj/closets/bases/large_crate.dmi b/icons/obj/closets/bases/large_crate.dmi index fd3400ed729febbec3843fa964f408c7e532e479..a8cb85d5ce2ddf7cc4536eb719e1b67d70688739 100644 GIT binary patch delta 1454 zcmb7>c~H^`9L0Yij2f(>i521*R_mBcc&v8dF``mxo}}eLC1$BhUU{rQ9(bS_W@c*P zk*mdK;)R=K;%%CD9%z zCIY=EzXJ1&orUU!vLdG^ql%ry2|uTph2^mq@l5~#bs$=ryF}dobpM#&w2e|iUY5VA zjlvKuwS1BlcJVsp_9$nbWp{oW&zKkrC@-=VwphsBuM#x{WRjhZKf(p2e?rGUy+aI2 ziQ}DeTR~dk+eYphpsp50?n;B0slKh*XQ}VnQ4}>bHJKIhgLyfi+6}l}uT~t{edvjcj$@tIzF(fdU(TSoS4QLW{1~!T%0et$t5CGG zqz6?^imJ2EcxCy=Cy5Ua4>!)XK~vEAeSRE@yMAXybmAJlUY*y)m((!Op$u6=6q_j% z9v)sW8}3Qg1o}L{=i;3n7uB9fj$s06)4FMgGi2Fqmzi}$WnG9y&KbTg_};@c9brol zdQ>FRYzvxW%+GfWn}~x=?qJ2i*-OjI%${2?WiX;kdu}Z%luoy|wzj^|*^#5wI(P*Ybw)%hXVq(dBBK!wSDng+S6xZ1?0f@E?h}Y#%~+xgo+tf#v{-E=vBws_w@HIo6o&Fbre>Lhr zf_W(k<}LkuvnqfLDbMq9HXMab6gtIYnyi4VqC_9Z+VLfo^4zZCvYupDA<9QA6Z8Rv z>l_i-2?C{$CwfA9k!?Xoa=Y}>w!t8y3E$7WZh6++o4XA|{Izx)frq_sgaDt8cKJ;G#eafT$}kEH-CVc-99#Wr0B$hf;jc z6#7p}Ler&I)i>gXaU})PrYy*UAGJn6em}S1xjmjqj=a9TC%Gh68$p4r@J8JW`^n>7H8s!$?4ZJ zD{%OR-4B21>E%TaApoBz4&wrJ4ju*HlN_$BtjK?LBh?92Ow%tqAJCP`j>B+F5I6rf z49Ug<{7uBHeSFeJIR-i+fQ5}4i3f4Km{h6)UB^w#jnI&vL~G1(BRnEsH9G@kF{?S? z*q4o#RqAH&v!E^bTY-u9kb!1MZH(=1B|@X!v}Jko%5By>{SZ<3x+jlu+HOWrcNCU< z`Afv?+D>*pQZBJ2b+dAb>J> z`5&onCNH!H!I8nj?Eb-}3bYg{Qamx58nVNrzuP<{1 d3dTzR!>nnvztP5(3W5(H5s_eT`P70O`xnINn`i(4 delta 1439 zcmaKqeK^wz0LOnn8`hI zJinGE|9W8}J3h>l#(%~8BYU*rL9&EdI}(l;vN#!9-mhlEng}-LdI1@CdK1X$H!gXe z;&jKUZ@v3|_H_GY?25fTfBZul%Ww!Ayddk?73@E;zFrK3ju(sr6ckK?hDi#WMHoqr zA`#1R^5`I2@2s~<@~8&hDiTpNB>JI{C?-bly_y>V&pa55{xNWmz|aL?5>)FfIa!fS z9UWd_yUIrB{Hdhe2+UQl*4EbS_5<1ti$HB4XVdJ+H7=57c8ApzoEn~Dqd;tbd7!uv zF`-oMO-NSnE1k2HEVO69UPKd*1=WF8DlkJ-$^QQGK5Ch{Za_CDp1^m6a|V0$HqvLOD&~yt~>-=Ee$LxDjFOd^m}~^pP$u7b$u7> zm|H)et=yfOlar$>FwZ9hSmcL?!mfB%^JqxtltQ6kRQf0RxKT%y%`;Im zGo4iF;dj9}|NU$(IYMVRzAv6sYdf`B?^F5U^h{4r&u|OOu0kmqs4+}04X?kmT%$YM z)TyVhzkXoDvW*|J1=nCiWZiJFFJ387JMT_QI@8U z=AS?IkaQ+pRZnOETP<3<{I~%SJGu0DhYCniW+jQJc{hrU$!B?uW{%#|yhqi!@{oIL zoA4PBWh9@>G!MlqwGlYb&(!|OWQ+xV!C5%xx&@XhcerV+Z-;}$4KJ4_hFPn920^5O z{KXx!-r`tBHU}v|Q-Sw5mKHytg{PygQh^YjIC>(Mb{4V-JaJK@d3J}OQleoLm@zg{1+oD9KTxEu2S9DL=yKc0B&T`;FJ)FgTi!L z)l99cHUx$} zz=NpRsQ)jAgg^%wj)|fIG?l`_LajXqnCGG9>Lx5l1k3Re114KKds`sTCU&Q#`j|rD&hTM= z@pb&Ndu451%zw^kRvc$R35O-l&decMmCviQ;NRaRO~j_os~>Fr);Zb{nSltfL}{0# oqFa*p`l7Hp&>#p{@GlG2i!`ir7a7d}0ALG%clUO?;Ywlu3A4eE7XSbN diff --git a/icons/obj/closets/decals/closet.dmi b/icons/obj/closets/decals/closet.dmi index a7bb7591b13e6570153d56d0b5c165e3e12af898..97e24b4f50d51325917463033a86e4b6d9f9a652 100644 GIT binary patch literal 3561 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 by+bpVgUy-Vd2_5M9AJ3S#Nf4_W9WYX7|}}R literal 3311 zcmai1dpwlu7Jg@@(HOVM$*tIvZYmP#f*9jkkwJ*$+EgTi+@moQN@8PgVHe|4yGCiK zJwkGs>LhX-#2D9+qRGr)yN+==(>`bKvpc``*?)Y$@B4o1UGMv?XFcm#>r1l79hO0E zKmq_{jvlc%4gf^_2muHQ@y$J?=$!cFX|$7Tn8n#pe8~CWu=7EI07T_dvYrHv=ty51 zTiBTpVbcH9gRXjfy-Kf(j_a-R>lv0;?qrnNk>caEEKR#}WG zuAS>Ui)^==PlqnX*`>eOnuB!a{X>cv;?Q7XH*>3P$HovFn!sJus0iN}_s=tNda~=) z;HJKTt;<&FNfcf~+&zbY?Mc};Qak@yiQpzmD(-j$l}VoO-(@{=oVmL}(sHMnKrgk| z1+}ftqhj*dtI_qL#wy9`VG~G`-^&>2Hu4b=`l3^*cK=FFB7_1jjv|l7CnJ3Ta(xaF4Vs` z8rK>SIc;$|r+4$MV~fhFnVTEVI41FvUns@w8nJwEOzP=}g^2$9^<9%zq2Xo1huR;W z1m&K8g^pvTm%fPfd93tv2eUi&zM1UZO!ibAh$rNQ)RgyHXuc*5na&Rj`6$`aHv*Fr zI?4`AuY>>qkh4cEOr4@~`2!|F8yi*LOeMbPYG#wWo~+BgCb6Vg@9eGcR^h>qIIOm< z_5Nq0ag~kx1tm5hEAYqn@68gOZYy!D$Q~*IJx9sJLQjV0Mb&{D`X@!c4QyZ1klZHw zy?!lPuZ4U%y@}E&6h4D6XNo)2fW54kL|XvxSpznu0FbZ_kaeH{Wd*=X1i<$A-aEu` z+MmbC(HX6^*jaEJG!_jdC�Js)L~(q4yj9!mucJZuM}2MTV1t3a{^O>mrkMQs zg(>{Opp^slRm<*@2*h1z@U8^=*UB1wLup;&9jygdsGZz1h7`ej7bQ!eUuMj~r(}2} zGCqF1x8Fd*vy|1PoqENl!sLV}47*}oJsa)8r`N>C!!GDbu#Fu}QR zfadTOLKvF-aUvo1&= zCglfnF$MeKjDQ2018^>8N05lQm>&NeL`}W7Y5n2h-A!`#i-Z7+x#I@0A#PCR(#GW;+Gz_O$fE@A_0%>)e@)% zz1+D?x(I;8(lY>)7-n~`NS-yo2@ zYDU57l+_!$E4svdstrZ-eud7?d)Ks_oSc03%aw*UiLEQ0>l~~-0pU5*di8rRKYMrn z(xmbT$qZ5IzdG}|Rb#?+InC?+_x90p?sxcQZ|wN@^XHYJ=hIG=R;Qj$5g`k5<{Wd> z6O8v$l;&X|;iB3fBB$3!jTPm>)qhhyj(v#~!;m7e#va$&S?lzb1pW@@|3&(nM%Pl% zaETOB>ObBo=acDHkm-2=R>B(hH>BXo(bM5U3*F4&^>M9?;RA)-Iae$sE>MlV3V5-^-ySu1FM{WoX-;J zT$_^wW%6c4)-_WZ9sF#bxiJV`+FdD+5=aln6|2vvuZ04^4i_*R5js=IItlzv%NFod zvA7c0CN&trBul`;5VG(1_ocea8_REWk#9iA%9mL4E&-L7!)A}Zx!W?*(xzKK(YJ)z z1sK_M<&iU?(=7TvPG=i|qyho@*@Ei?6PGpLiv=k3{A9)M)s~-NpxWRe4el^Bl7AKD zRw^~Tm`4VS!zh62{!)g{ja?2l<@vq4*|A(!?MmfD`M8%Tux>C>o-koH4thNEje;U? zKP|0Y@gQ`&;P~rZ+c7C0XCn7#8X3g3UKt{U$l)@KFa zek5kqX>jPE2E+EkZLR{C7FI{k3)J@Po4bQ4aw+bjv^g5e^vti^q-a3KrZ3HYYTqKI z?ldiQAB7)QA#9&>YE}MFX+Rjuyz)6F_95W8<(SgK6vetR--4%7f~kPBfE3-|SCn%E zHq=}zaFm?64XdoG`aC^!r5+RBJT&&~JA%Y2>)hPt`h^NiT`}t_mc?R45Qzh0F5vs- zb99Ok>w#AM&?8^?V>g=qdIl$@2HJ25As96zhjkYw6&Dxl;*Oo5vw4G!k3WXolE9Yp zNy1;xhDS&H=lh$~`^_f59jv~Dr&6ixMV&cQj~h8a=K^NkzK*wNesQBon4mfsq&eQn z#y}o#B0s_c&u*-gBoVBuSS3qryHQs%EnMpUZYV|=WCeH@ov+}$ zW}N4$uJi)okD?DQY+>(e4cLDeFs>d@QdFo#G%AQ^sQPfQyP7B}4^v_?ghB&nthu<+ zE48+@74IuDna!igEVWa9>4Se+sVe4-0r{o=3Cp8@t3D-bcs>Ei7T7c@C>ou9Hc(;I zb57?rf4I{de`+f z6}MMII2KWeRKNUOxYCD$+W0_ZpURSZy;p6Pe?WmHZipgBN>4<)wH)LK?_bKL<3U8} zw8s^5M4cXeqM4U0R^reIYsvXF7DqkCKnLfbo+xly5BM5-Aj;Syp&O)wQ#;9j9w)zI f|8KMAV>BdDH%iksfj1!jkpV|7aTX