From 0d7f95bf25764844f326a683aaae7ba6e554fc64 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Thu, 24 Jun 2021 17:39:40 -0400 Subject: [PATCH 1/4] Probably fixes problems with darksight outdoors --- code/controllers/subsystems/planets.dm | 2 +- code/modules/planet/planet.dm | 5 ++-- code/modules/planet/sif.dm | 2 +- code/modules/planet/sun.dm | 32 ++++++++++++++++++++++---- code/modules/planet/virgo3b_vr.dm | 2 +- code/modules/planet/virgo4_vr.dm | 2 +- 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystems/planets.dm b/code/controllers/subsystems/planets.dm index c9a4a2db43c..16fbe59d3a6 100644 --- a/code/controllers/subsystems/planets.dm +++ b/code/controllers/subsystems/planets.dm @@ -104,7 +104,7 @@ SUBSYSTEM_DEF(planets) /datum/controller/subsystem/planets/proc/updateSunlight(var/datum/planet/P) var/new_brightness = P.sun["brightness"] - P.sun_holder.update_brightness(new_brightness) + P.sun_holder.update_brightness(new_brightness, P.planet_floors) var/new_color = P.sun["color"] P.sun_holder.update_color(new_color) diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm index 293a64c9fbd..b7fd464c9d7 100644 --- a/code/modules/planet/planet.dm +++ b/code/modules/planet/planet.dm @@ -13,7 +13,7 @@ var/datum/sun_holder/sun_holder var/sun_position = 0 // 0 means midnight, 1 means noon. - var/list/sun = list("range","brightness","color") + var/list/sun = list("brightness","color") var/list/expected_z_levels = list() var/turf/unsimulated/wall/planetary/planetary_wall_type = /turf/unsimulated/wall/planetary @@ -62,8 +62,7 @@ if(weather_holder) weather_holder.process() -/datum/planet/proc/update_sun_deferred(var/new_range, var/new_brightness, var/new_color) - sun["range"] = new_range +/datum/planet/proc/update_sun_deferred(var/new_brightness, var/new_color) sun["brightness"] = new_brightness sun["color"] = new_color needs_work |= PLANET_PROCESS_SUN diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 96cfb548ac0..af6f632bdc5 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -95,7 +95,7 @@ var/datum/planet/sif/planet_sif = null new_color = rgb(new_r, new_g, new_b) spawn(1) - update_sun_deferred(2, new_brightness, new_color) + update_sun_deferred(new_brightness, new_color) // We're gonna pretend there are 32 hours in a Sif day instead of 32.64 for the purposes of not losing sanity. We lose 38m 24s but the alternative is a path to madness. /datum/time/sif diff --git a/code/modules/planet/sun.dm b/code/modules/planet/sun.dm index 55f739d2178..d2b61a389ee 100644 --- a/code/modules/planet/sun.dm +++ b/code/modules/planet/sun.dm @@ -2,26 +2,50 @@ var/atom/movable/sun_visuals/sun = new var/datum/planet/our_planet + var/our_color = "#FFFFFF" + var/our_brightness = 1.0 + /datum/sun_holder/New(var/source) our_planet = source /datum/sun_holder/proc/update_color(new_color) - sun.color = new_color - -/datum/sun_holder/proc/update_brightness(new_brightness) - sun.alpha = round(CLAMP01(new_brightness)*255,1) + // Doesn't save much work, but might save a smidge of client work + if(our_color == new_color) + return + + // Visible change + sun.color = our_color = new_color +/datum/sun_holder/proc/update_brightness(new_brightness, list/turfs) + // Doesn't save much work, but might save a smidge of client work + if(our_brightness == new_brightness) + return + + // Store the old for math + . = our_brightness + our_brightness = new_brightness + + // Visible change + sun.alpha = round(CLAMP01(our_brightness)*255,1) + + // Update dynamic lumcount so darksight and stuff works + var/difference = . - our_brightness + for(var/turf/T as anything in turfs) + T.dynamic_lumcount -= difference + /datum/sun_holder/proc/apply_to_turf(turf/T) if(sun in T.vis_contents) warning("Was asked to add fake sun to [T.x], [T.y], [T.z] despite already having us in it's vis contents") return T.vis_contents += sun + T.dynamic_lumcount += our_brightness /datum/sun_holder/proc/remove_from_turf(turf/T) if(!(sun in T.vis_contents)) warning("Was asked to remove fake sun from [T.x], [T.y], [T.z] despite it not having us in it's vis contents") return T.vis_contents -= sun + T.dynamic_lumcount -= our_brightness /datum/sun_holder/proc/rainbow() var/end = world.time + 30 SECONDS diff --git a/code/modules/planet/virgo3b_vr.dm b/code/modules/planet/virgo3b_vr.dm index f9cc58ca0ce..2700b69805f 100644 --- a/code/modules/planet/virgo3b_vr.dm +++ b/code/modules/planet/virgo3b_vr.dm @@ -94,7 +94,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null new_color = rgb(new_r, new_g, new_b) spawn(1) - update_sun_deferred(2, new_brightness, new_color) + update_sun_deferred(new_brightness, new_color) /datum/weather_holder/virgo3b diff --git a/code/modules/planet/virgo4_vr.dm b/code/modules/planet/virgo4_vr.dm index 3909b9e6cd7..6ac748f4218 100644 --- a/code/modules/planet/virgo4_vr.dm +++ b/code/modules/planet/virgo4_vr.dm @@ -92,7 +92,7 @@ var/datum/planet/virgo4/planet_virgo4 = null new_color = rgb(new_r, new_g, new_b) spawn(1) - update_sun_deferred(2, new_brightness, new_color) + update_sun_deferred(new_brightness, new_color) /datum/weather_holder/virgo4 From 525639a2be64c5cce78b82db9a3efa739c50d838 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Thu, 24 Jun 2021 23:37:44 -0400 Subject: [PATCH 2/4] Point lights at things --- code/__defines/turfs.dm | 1 + code/datums/components/overlay_lighting.dm | 41 +++++++++++++-- code/game/objects/effects/misc.dm | 48 +++++++++++++++++- code/game/objects/items/devices/flashlight.dm | 8 +++ icons/effects/eris_flashlight.dmi | Bin 0 -> 4359 bytes icons/effects/light_overlays/light_cone.dmi | Bin 19272 -> 35117 bytes 6 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 icons/effects/eris_flashlight.dmi diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm index cbcc45c1f51..679b83fa4a3 100644 --- a/code/__defines/turfs.dm +++ b/code/__defines/turfs.dm @@ -20,4 +20,5 @@ #define isDiagonal(x) (x == NORTHEAST || x == SOUTHEAST || x == NORTHWEST || x == SOUTHWEST) #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) +#define IS_OPAQUE_TURF_DIR(turf, dir) (turf.directional_opacity & dir) #define FOOTSTEP_SPRITE_AMT 2 diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index a037e7fab19..4e778d529ba 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -436,19 +436,47 @@ var/turf/lit_turf = t lit_turf.dynamic_lumcount -= difference -///Here we append the behavior associated to changing lum_power. +///Moves the light directional_atom that emits our "light" based on our position and our direction /datum/component/overlay_lighting/proc/cast_directional_light() var/final_distance = cast_range + //Lower the distance by 1 if we're not looking at a cardinal direction, and we're not a short cast if(final_distance > SHORT_CAST && !(ALL_CARDINALS & current_direction)) final_distance -= 1 var/turf/scanning = get_turf(current_holder) + + . = 0 for(var/i in 1 to final_distance) var/turf/next_turf = get_step(scanning, current_direction) - if(isnull(next_turf) || IS_OPAQUE_TURF(next_turf)) + if(isnull(next_turf) || IS_OPAQUE_TURF_DIR(next_turf, reverse_dir[current_direction])) break scanning = next_turf + .++ + directional_atom.forceMove(scanning) + directional_atom.face_light(GET_PARENT, .) + +///Tries to place the directional light in a specific turf +/datum/component/overlay_lighting/proc/place_directional_light(turf/target) + var/final_distance = round(cast_range*2) + + //Lower the distance by 1 if we're not looking at a cardinal direction, and we're not a short cast + if(final_distance > SHORT_CAST && !(ALL_CARDINALS & get_dir(GET_PARENT, target))) + final_distance -= 1 + var/turf/scanning = get_turf(GET_PARENT) + + . = 0 + for(var/i in 1 to final_distance) + var/next_dir = get_dir(scanning, target) + var/turf/next_turf = get_step(scanning, next_dir) + if(isnull(next_turf) || IS_OPAQUE_TURF_DIR(next_turf, get_dir(scanning, next_turf))) + break + scanning = next_turf + .++ + + directional_atom.forceMove(scanning) + directional_atom.face_light(GET_PARENT, .) + set_direction(get_dir(GET_PARENT, scanning), TRUE) ///Called when current_holder changes loc. /datum/component/overlay_lighting/proc/on_holder_dir_change(atom/movable/source, olddir, newdir) @@ -461,7 +489,7 @@ set_direction(newdir) ///Sets a new direction for the directional cast, then updates luminosity -/datum/component/overlay_lighting/proc/set_direction(newdir) +/datum/component/overlay_lighting/proc/set_direction(newdir, skip_update) if(!newdir) return if(current_direction == newdir) @@ -476,8 +504,10 @@ else if(!isnull(cone_hint_y)) cone.pixel_y = cone_hint_y + directional_atom.pixel_y = cone_hint_y else cone.pixel_y = 0 + directional_atom.pixel_y = 0 if(newdir & EAST) cone.pixel_x = 16 @@ -487,12 +517,15 @@ if(!isnull(cone_hint_x)) if(newdir & NORTH) cone.pixel_x = -1*cone_hint_x + directional_atom.pixel_x = -1*cone_hint_x else cone.pixel_x = cone_hint_x + directional_atom.pixel_x = cone_hint_x else cone.pixel_x = 0 + directional_atom.pixel_x = 0 - if(overlay_lighting_flags & LIGHTING_ON) + if(!skip_update && (overlay_lighting_flags & LIGHTING_ON)) make_luminosity_update() /datum/component/overlay_lighting/proc/on_parent_crafted(datum/source, atom/movable/new_craft) diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index da76144aef1..b48ca15f5a4 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -98,11 +98,57 @@ light_color = LIGHT_COLOR_FIRE light_range = LIGHT_RANGE_FIRE -/obj/effect/abstract/directional_lighting +/obj/effect/abstract mouse_opacity = MOUSE_OPACITY_TRANSPARENT +/obj/effect/abstract/light_spot + icon = 'icons/effects/eris_flashlight.dmi' + icon_state = "medium" + pixel_x = -16 + pixel_y = -16 + +/obj/effect/abstract/directional_lighting + var/obj/effect/abstract/light_spot/light_spot = new + var/trans_angle + var/icon_dist + +/obj/effect/abstract/directional_lighting/Initialize() + . = ..() + vis_contents += light_spot + +/obj/effect/abstract/directional_lighting/proc/face_light(atom/movable/source, distance) + if(!loc) // We're in nullspace + return + + var/turf/Ts = get_turf(source) + var/turf/To = get_turf(src) + var/angle = Get_Angle(Ts, To) + + // Save ourselves some matrix math + if(angle != trans_angle) + trans_angle = angle + // Doing this in one operation (tn = turn(initial(tn), angle)) has strange results... + light_spot.transform = initial(light_spot.transform) + light_spot.transform = turn(light_spot.transform, angle) + + if(icon_dist != distance) + icon_dist = distance + switch(distance) + if(0) + light_spot.icon_state = "vclose" + if(1) + light_spot.icon_state = "close" + if(2) + light_spot.icon_state = "medium" + if(3 to INFINITY) + light_spot.icon_state = "far" + /obj/effect/abstract/directional_lighting/Destroy(force) if(!force) stack_trace("Directional light atom deleted, but not by our component") return QDEL_HINT_LETMELIVE + + vis_contents.Cut() + qdel_null(light_spot) + return ..() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 62d1b4b9341..57e1404b9ca 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -210,6 +210,14 @@ else ..() +/obj/item/device/flashlight/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + var/turf/T = get_turf(target) + var/datum/component/overlay_lighting/OL = GetComponent(/datum/component/overlay_lighting) + if(!OL) + return + OL.place_directional_light(T) + /obj/item/device/flashlight/pen name = "penlight" desc = "A pen-sized light, used by medical staff." diff --git a/icons/effects/eris_flashlight.dmi b/icons/effects/eris_flashlight.dmi new file mode 100644 index 0000000000000000000000000000000000000000..91167e9f4108b9f6040e8e05fd9902ca78752b7a GIT binary patch literal 4359 zcma)AX*ksH_x{X`t+6j-30Vqb%NE&Yj1aQ#gR;w#HL{E_WS6Bxq!^_dMKfg2GPV$f zh%(k>$tYqNyPxm7|I7c2=Q-DT&V7~_=enPBopeicLssZnC;$Mg#zy+qrxN?$VPZJF zyO8b!ry>z!iw@WK4)eV27ZUCl90UMSPi^c&Zr`C%Z9@KS|B^A0m-#X{WJ9!598sD3 zDK}&)-EVoSsLcNyH2Q2h1WyRbFyS(>h6TVLeR>$SnQ4>XsBWX2nQ{8S(xg6`!4+mB z7SO2t({}OIE3bkjF57|vbdpI{P2$_q%*0HB6dzE#q-pZG>~Plm__LSm^~+HAQsN8y}NX7UiN&MJ%e*+NuLHns$lC#l3|voJ87UOy}aJoT-vT z;d5_`To{i2QsYtKoM*-`M!nAwrIprm5Ly@@Y1voH8mRU)MW91%JK-jKEv$rOtWkHK%#j4JoJ7^cM2J|K4 zZ~$qXL9UDOn%MhxyA{1;3woo(Q(xRUR8?yQyc~*~!#vb;mKcPFq!7ih;G0vW9t~_b zFY`?8>qGvcU03a~Dh#8VW?M!}kH-8G3`a?w0pz|mTYzl%@ZJ}7&dpkO1W@IY{OS{6 zJ6O`0>i6PPd8|2b-}+@@Yc$q!1k=c$*(1J}mHm#0mV;V>U2MKo&B3aB+Zx%^=Xpps z3Uf}e2<7o6aFXCzxeV<_(%#)Rx{wcOxrgJ;S}8RL;O(d!Vs?f{s{$ecT5yoZ{QcPc z>T5AkrW1PXV*sgZx3_7I4)={v@)izrk zdxh+)XVR#U-zGpXaL6<_3r{{$k~`tAmsc1&;tsZg+Euwe-ow3a6CpL9z*Y+g0~2NI za-phq@O3k`N8S#s8hAXy-`G^PUJ z-3Q6u|JYIp{Qn}Lh`eD+{##ng*ofkvk6ED4`phG2ga177 zs|H*Pa2CR%0!aAQK(h5I6Qs{Gxt7L_Z&w?WE5vJ`pYke~xW``Z9VLf$3r;7S{}66T z1p5Xd`v5|V>p01T1%{Ksf5;XH*U~C2{-1QJIM9tsAS-- zz2(Hee9VzsxA6+Kh?LUO7@_>QoaKR-J7T_fNqpc*@{l3E3G5AWiHjw4-dX<<%mpxe1rqq2)`Sv6dS`~$Lt5)LT zIj@mL9_nXKi-bhT^KT%2bUUs`XB6^n_|vfu^tzP(f^u-ih$ZDS&WknO zjOx0h+~*@Mrb11ZlOz&^uDYZX>*9{46&TfXcUAok#l}O}u9KR#UTq=9D8dV@2))&B z5Z|d_ag_sgKvi?+&(ur{)`pyBX7838omV$0<{6GC<0YKDuAp`p^@DbLVsFj6uu$WA z_0!>l_`I<#i;( zyVbwx8o|Jo5>epV+1{)NC@w+vv*P=wkc;smdkB5>wM54wp?D z2M?_&B<^Bi?XS1sIY9~Q*(}#Zj8@)%O$L>Ot_}2&)9b0NAXt$TU=&P3Ob5Wfr{L^kVFzkEJsINTv8(k(zdwY{ z4|G+y99#6%dtLqr*?BprVyo>d8H_~NU%*kMbjuT>QZ{{S%YYJR2evt-dGsDPp6S8z{(fR_%#$wyHI=5W1GB4$N55cr zSx}a4QTwtq+Z8CirTkJl@IlGEivD}-*T>{=ysG?(H3cy=qFT#47p)mHdk_56GBm={ zuQ}XKD2S%adL&XXkfWS7236EGIQF=32LDwfcuITymquyFka%-xeDh_t|kqfPC z;QqJ(r(WgV$-^8z&262Q1udoub*xj3_lIVeRK3y8gU_jG+l{4?)@ovETb z6q-7Voo4(xevzW#pLU^g_|IM>0RW9T<>Y6-%u;sq?r?q|=()3~e4tQn=98Pd;23Hu z@QC^&b}ZRh)?RP;NLwO`Nh*gmv*HS1NUA-Hmlm!PHrMJ4z6soaTd(8Pd-jNg(UQF{ zNf`6GFw;dWu+WW*Ik!3T6rK-;_X`YYw!+npK&w+7_RW zt97l%_6mL{p1u2_bPCss=tD@J2&Q$gFUH5@Wl0@Hb2BMsYxYKGib7}R?~qAfyWs_v znKrZAHFZgbVlYPjGNI!~eorG4w7JSJM{@Yxsyjd)I!w@Ukh+X;GkdBX%>l*o9dZk# zw*0(+Y^5|?C@HgAUt08S{#iEd`PE<(D%E2)^+a7}Mk496i(J4v_TA0~8dUCb)L^xc zL57Vq5Sn#+>=x8@S&puvc$67Wk$Qj(>WrtdJ{&Ftb0}H+GHdkOZ`X!|^GKUl0M3t+ zOLFkN!RN|b=iU47&nSq>&J?yGQ%+W1Fj27_4Cql}ky)Nk#y`58#a=g!5eCENc+ply zIM4#x0OfD^Nf)f4xqiVcqY^TQmj$VmeVFFzWlQ!LrK>?IjK!+(%GcC=#}{Xl58lsPRL}MJM3YT=wP(2R^=3VJlRTJWdqyPd z0@O{$%NbY)4wITsM+>$6zRP7f*^uoR27?uf@P!j(-a6w+?gS>V;04+H zf07jgv6tqFs_dwwd$vKuA1XJVZY&BthErglqQjqW{1LQ$O3`~?Ke@|G8iE(a*Ie_J z()-9S@m+xPeI}=}7C3*d-F>g&dn~Udv$j9hg*D;oKS^p63nlNyTl3WWdv#rRNI5!33n(BGN{e(OEipiml9CQbDFcbo z8!>kG{oQ;27~?hA=bZCC&pGFLzn|wMni%O&LYN@{0Dw|YSJMmt0K)%!k&zHSDH&`* z5Z=N<%pdz{K8HEKa`*9b_x1t+g7O|&`n>YToIdh7I{PDRASOKibK+5h#oZ~XwGGjU zheE?94Hga3n;SoM#~w}yM)@Qe&>EOQUqUlp-J6!ump+D>NoTgpKf0HkMEFp&U4A-= z7WOEa@cXT)j19BWnzetZ;Y-~{MtYM2M*?R5vg@mzkgdQsW& zZ!RAl{&|0}k&=l_lA45^$5m1o{@XAx-SX=vLp3h?mSPgH{{3_>w?tjN6+)sk4JkmhaPmGD&!-5#@`OiHnzXX9ZbZ^+XtyS$x7Yc`w@q2ch1@mFF-G$L(qYh z6&3OpZwk+V=6R~chuIC;CWYX#sE=5A#%zk-F6+~!IGrvzS9aI2*7A*ePAN`51xu2W zk{0PXz|NBFso4XBng zG4)lffUM>9l0}MHZX18pDuB1loLxphdVeW*_VPE-I4s|tXxq4SxfWf-_>5cVR}^p1 zn?QRN)HSfEteb~+j5r=*M~+g_5-_I_JRcjDz`M|<7af^j0+8J}8E#kAJ|=7ZDQU$= zXsEve;`sd?d8Ej9zJ-CYi4SMiv<}|TeoebJNwDr*Cp~<-!2hHjSo34B5}T9aI`(qf z?7juLxp^LE6^O~{l;%cuK}n13m(8b0uDXd|=74G5zfMxIyx220A$IbJ+6n3mxM1lp z_L6DX0A2+a7B(Wb0KO4Cr@47lQo~9fncE?y^GHb7dgwBnc42}jjj=(a;b5K&g#4x7 zac{T@UPVg?x|2Ea-LDPOhF%w={n-tL0;PWA=^0TLAX$c@H=G8`e<1342>RX^*FDN` zp%7@VxE_t}8v4T-A^5;zVK`0faAjL%t|fMv6=&d!dm0uYsanV-1T-MhJG3R{q*50u z4DPjpIDY(cCSlyqkRb#4S;c5#Dj7s*^{F6zaN_wpPy?|&SSz>&w3l z^njAJ`nSNE_cf87Y**pdc-hao6PT{#{{~5tTm{gk<3l?1JJ6@b;-5D~ymPUr2YrJu zd4$fr;NY2(*2n*Z!dso=5Xt~@e3w?NCz})WftJ<)+{9Mn4Rs#OdFpdnP zvIf>6DK$Gv#JA(wT>S^k*@cc+K&RE0`AbjZq(Na;p*KtSiih1)Ri3es;g>9liP(=%(BWtQ z^*ff(Z*c2GDkfr7LEy##wBmvj+?Qg!fdE8UbeqRM|C05b3{Z-Q5K;B|fHtD<@yOIh z%IPM1N|~CPN^%kcW@F;S0PYJ-ECIY6K`D24A=o_))y1!2zygt|uCtS8g=k@)nu#hG z$7yA+sT$z|&LDay6iRg80>BeJg!BH0@)+-Ul0$ET{Gs5z^OCSSmX>-wk*4$`CxBz= z3FT=W`cyZLYCwjnqTxT5W-}?c@a^Q7A8*EYBddksQ$HT8k(;e&mqs;<_jyzFYT{2f zai83A56nQDynJbqIzzVF^#kGcgE$dS^QbkMXfp!1=*O!a)dXKKOp<*IMck@MTT)vn zow?yc;jW;bi#tviU&T~KWb$)MKc-ZDh_!Dcc7w1>%(4W_ujf^Nv=-C00DMkmbUVLj zi=LB>8nxB1MIs>~on#lg9kdMtZmpbS2cdJy`WHVzqsXgS4g0jDsHf2%3PPEaiiC6f zip|t{ZliHYumk9tUJeh(U-Ccw4h#q}tT6dCZ9o&|M-wJsLzRB5rGGVqBV+|=uW)T` zmB)RqEQQ9^flrH6WR<=ty0ioL%qI?mD%g83dIiYks=!@;=RK1X@=hdjI9Gv_yz-3NDn}mjbkA+ z4wkUuIw15-q1>x+WY0`&$lkd8v(3)jzjF7qg+A@4l3BtQK|$t_?dvs6R2$uw=$8@r z2o3vnd4?=6`<4np%1>?VQ8{C{1Icr1-+rI*F}gPil4jjM)kXMQ%x5!o6!@qNOV$lqfc#zAP^(*;;PA{!V?TM?sJGVEg)vB7((uO_ zbBuRTjCZsF9CQ!)J((LzkC`jKC0x{AlHt25KYbZA?^C5xCJJkT9aK6OZYyY<0md0` z072~Sdi4W^t`}s379hy2?0a#q+9FtkKCac8-=fKbN%dv}jNg6jUefbE7Myo4BdK0P zs~4zq^sKtPTU>Z&Xx~5yE({p|O&o#YjQ<`?zzd2@(qPj8{EdkF2#PIr;34l<_1TW-RFea%3vLFjk-MV!|s0b7=bD5B)8pC}jjAY39~ z9LI2Yb*5&aT?!w+(}gJnM&y2bj>+TQGsKG^ud*k$<%MrOwZ~flR*iMpgVNLFee%1-<#c%xjlulJ4_d8`M60DYq=L^}*}I*>3MwGJ z!XSymx4tSIh>CfVPt^LB+4fD{Q2|leaH`vmh0wuR*uhw@1CP(YR;y_S_wVKRI`oIZ zb43k!;PQwP-up4JqgbRhrV2XMP#j_Lr#O1=)^2XEZ9WVE3Y!c?1ZV8tOCo?*Ar^BZ zdzdUO;FC!Yj6=n!_aHpi@D*}fi~R~1LK6v5cycTSSj5Kt+n1V5)jSF2Q)d;R(xdx! zH;-55KP=XtX?kWEBgMa`+-)IxU zeoL7LQv`=2U7{BuzRTTnE;wDGZK+EmrNRf03e3o@t|1O?i6zQ24M(XC+`jlA5S1k{D|reI}~S>AhU5r4{yKHvf^j z!WrRYz@-lFHsK|64?bdEr-RbYyj6gv_p?C4V-2nP?u=NYwcLD|+Cevd`<=woQB!E| z#g7T1RpM)fbdv(km6AcqTef`;UoK~FUk*-mLIW6l#>0sYV|sH1VVF5i6LcA6w9k{z z){;ncWI9De?JmL*;YtC@9CMDtD<@tyCiRZDZ!?CqTDzPhf@rXMsFj2$Ob{B)`e*4a zEn#$nuRrtPB@d@dUfpN}0Xq&S1mcEst`CD-d&WVHuXnwH4mulK2C#zKzdeSuH?7Vu zjpM1hk>8A*o-EJeHCGFZKF${!H#FVR$sP-3c6w31u(NVJ5@2Asv(iI^O&;$EBtrNV zm}z@R6hXM5r*C=XzRpl>n+`aYt~GW~@t)3;Umtm{sVSve&Rh2?V3-bxdL8)B!bWT( zY`Jb5R{stG%3>n#JO(k46TN0|I}fsXvuogMdY<+rDZsrIUr?%dB-kFNVA}?CH2`M* z_^^d{$PFvPmpx_WAd2`Ix~j4Q^%AHeH31%~5qW=(q;Sg>b0O9ww+#9t_c0%Lbs&6g z%s$?sa35}^jG#KrDoke2UGQp8;M^J ziN|bn(Ailw5I=7~Bn>tgwPFmwKb^UP%t}u}2+NlwB8oT9KW57-6p=Ay7H>S<|La_h z2m8OOHJY0Pqk5t9@V3JoW5i8dv*3E@sFDn^x zX>-u4B+)0Z(TPFvi?rhE-c^#DO4tDfRpi-n%v>lywh*iA8z=xT1l-VSm~7`54GgZN zkNkG;^n$`Kdlxj&ROI3TxLPB!@eVbrYs&lLh}bg2)Ss0c+nz{QXxA-3uF=O(in-Ay zq0hOotKnIP93N6rk5xH^fFjqPjoHxa4(_3eFLs*7$la&=J)x?wdg~0WF&u z^BMVbipBmP;rwGT=-Wk`sIzu&;!sy|jmYIODU7P0T`M}360#dc&)C4DDK_w)G#q2_ zycLxpr%A8r>;)_&y?!jp8H&I}JTKgxWp17$@)_SrZLm^A?)b@m{SBk(Qls(f{9Q}v zEu5M<{$71y`SIewSA22UjGPM%wvQRh#+nD)%r`=L!0{y5dm+`&JT0?JbXs`oaamTZ(VKBw&z5M)_yDCYO;&abKIYu8b0FriLa~1)*1h->`BA4%BMSK z_X8YC|GJfu66gT`GwDBJe{X9{nzOQTfRK7?YW_SZ%d8dGjgUIlWFf4EyOaw4Rbo!i?q-m%KnEa|@gGivTRaG(hNNLq^MJB2Fy=(0%4Yo&rR9Gjz_9x@1ij`sd=yonhH*9`*V^pSg)s(Vd7QfgrJK_9)GdZ zNeGBB{4FwTxWhj`)PuC;@~ZFE)>76|{A0efa@bPWwX)hONv5Za55mu|n*MT1B}QJ3 zE!F1pg2#&q&m?uNaJECjL5EplU~$U?z3##@ntCah{w;8W}MgiccsH+vACGv$p4DQnA{BmUXPP+__uoH?(O})e+}ei(N@?8*~p25!nlL zhy1piL_x&V5D`ajH1c!L-#a*mhS7n&_dN1og&?mszOfD&dXp}ip7fbQyGN17s(xgOe_bE_`!p_daz#b!`OkeX+Oi9|?B!{>#1*WVJ9k zrzlqa7j$ZaKq{94yb`%bszVJHm12sXUgldNHk(HdD0`(OjTBDZ-hu!<0Bl(LBtnn* z+%ZATj!0FFWLP*QfeKg;!06srabSNof&MswsP_~@ZhbbAY8s-BbTiINk6g62l`e`+=XoyqFvfW6+m!oJ&w~WGu%X{XJ4hW>qC8?x z+v`=6W7s6GZy&mz3InTe*^kERL#Ko5<{K8xS5&;^A&x zzzP~hd5hsXr8B>Uui-slUZ;0^LlJa4O)?{f=f^tBHB=)!s-(~lqCy<|Qr^T*msK;E zAqUD&hcmT%Ry7K9f9tpxmO9T|EUgNv4SxD=A_5=!)SbN5fbwwZ$Wdt<^}pZU+g5lP zmCDqGnV@@hAvRbT3JAd&N2w{~^029B^7$mBnNf7_w;F(&3fFj-fB2?RtlI(4c3DHI zogV)av^9fVH0FWNcm1EI3aH%W7Cz!Su|uRcV1h^@t>&MdU>5k1T2!!k1~ZY(`r|Lx9M2_} z_ZRe>`0Cd=QT{V0KjQ+2cNK?@w%Zw_h{^Fz-2(Bgw+R%%5`^*2Rn63%BtK7mPHOrS zI03?MXWS0wUGH}A8}}!t&lOvXdN$i_(iCAtVhUe*H7-W|>r?$C>({3qcclkEX?FG= z$)D1OJG&Q{*}8QWOc2k>dKyy+G)W|C+YQ>wj?o93- zbB+7=Vrb7J>1ACR=YPS`8_?PW50L_?_nE1Z`|Ef@`9*KYfL-#d4C@X>z!Y zuF6&yMWBHrRn0?VGaTU)R4WLzLR@zd)#mi7{rJ_xy9cV;d#5 zUV*EdR*wJWkyRZ1#lL&XRq3MRFJ3FRX*HEWcz{y>m`6>m6R)*qMSdp!AouTy;H_C@ z_+uQ_n2bnIUj=be_AuC+db#bhIoCxN;ozkB?bQaoUb$PmyiXt)ew$uIwwV|;Tf(tw zrIbI8;1Pt&nf9n1pHnbg1^?i)UopZiaZ*NFm+nBt)4%ptIoB|QN1~CX3e^1GKIQY6 zPR!LTHS3?1Q@6~Ve5cxAhJOK_WY>^S-4})aoxd$ZyT5G#udQNLPXlt^{l%TEc~?$q zvOx@H<0k;Cl-Fp1Fm@hFG%gEvyT7G&#E*Uvpe`P+sx>s zPc2|O^&f-fm`8wkgQ%Oqs=8E)V`YKNFF{kKNu)5yHoVgy-JP@&E-oY+${LWd!+a>Y z*4=14r|amZ3_z`*fM~A6vx{5Pzc_chcFcEzD`&2g{~Pd5K_(nGi!XC>07iAZZ&Gipm3-HQyx+@)Yp$ZBi9p!H3v zKE>F?C`l1)y&iT&w8lYTXoSb4m`81z1OZHot_8Vv2hCJ*TVaq3sybBXDTclds0O&E z67Ug5fh@MEY(NYmB&sF7~pe zRqTvmO$ih5N;p^{%-vm&2lRsMQ$&>Ck75saeU9(|!cLoxe z3vJcS;dd<`(jyBT(83M$WZ*SX@OM4 z7CRhvAi0(xlo~o3qs)L4%`#(Dd#)-d5yF7A?Zw>w!z(NtPcP|@2`7*n&Y(qa9Khy2He^Gk~cESjqz+ayz^}Z+2 z!uP+uFfbieY*JEI(el3P9w8W-MKV2k&*(j;N26?=3Quqzyj42N2p6^84*OAeE}_&e zZl;{ty4t})wJrAW;gL4_M?HV6RauS}B8adNXdFV(_^40n43G!&Chf`OUv+@2-H-g_ z5PidX-g(iGn-lIMD~ZM!p8ISbxX z;U!9h!vdS_2!-bxT=K8g1MtTmmg_6rD7m|j0tqd1uf(KImqgX1HG=~3U2duO+2^9Y zr6NUf@7v-tEa*fxgx zx`PqWZQlz%B&?}P-O@k{b7ctfDpe76qq1%vCZI>YAU)irZv}eNAD-v}srZW*!yvTZ zUrkIKmjeE{KcuFAQyO_{%|=LwSW0-)g+_d18nGP?;D|cpiE9ZVdJg)R-_Azo)#_#o zKNoVhYYX1K+5w{Li=S@O3`X2!zz%qN9Z2nUy!q4Kk}f=kmqukZ>DbHY-PvqHWVB%ZU~G_y}L1G ziTOKVA5#QBAH}u&-SgfifMIDrAUn0aFe%BBr}aHnCVDL*DPx@{Wwp#N>D;F zt#^Nfm`{oBg8vl$;C`RzYao@I0~A^tgNdNS$~ESH4+I!b?`?gYR!<^Ykfjd!y>(@9 z*Oo#xA$;uBvBKG-7jrHhk-I=qAP4Zq(VU_qCHavj>3&`)GuB`auOm;nKoE5Z%+*`< z^JZlQ6LS#SfuH_94iS64nsZrZT4WQc+q7-K{s4(7pGyDA`)1Rlbg#f{>z$!oxMNmm z?An3YT6R?7DH0z6y}|juU{`;MIb=I>xAzZXhH$M$AgP`)VhOeA$jA7*P!!t{I~GI8 zg-Lpn?vjuH0KI%s4#i%G!he{5!5xU9ab65m)Rz_lB8SyQr}T%ALp?N35t{nl-Avs< z!$;_(qp&pUc59(=!7z;J4+vq-;Fax4rgaYy`5k9r{)YZ(*-sdu*ap8HC1av(?EW~J z4YknTM)mYDG()}8*H$(7A*3jUSB3XS0YR*yTTO%=a635;Y=R9o6y1k9`2)tLY{|n` z)P2NH&jwB5FFvmQQ047NE97cVLCMOs7Z=CM*KZ2-uSA8t$fi6!X9`F-tKxBXl!`W| zcIk{a8rWBRv-l92@ZCKa;Gm`d`=8vBVY2?r>~y5bT%^~2_DH`R`TLs<9NJ|PB;S{1H6$Va{+hlIKe3g)3><05y!8g(C3;IPoQlVVGi=qv-sEH*4~b7 zA=@#1i7r5`?8XNhJEGpMu3=m3eGxGQn5##bs>>4_ZDNl8$|0U_?mqlnTwDy7|6soo zid^w@?02|ITK=6_S+zXg;fu0Ur7PMzEE zX8~wcDjH*L_(-9cb`BST zqJST+NFH7^liQ=A=8SuBvDasLyKR5>2y_V*F+#ThM&9i;Ff*0>CI9wxXFGTyBr3^y zO;Z_OQ7VxR?f~zxy7!(yhL6#%IFz3eJJnDo9Jd!y`_jt&cC!i8S#{_#8s^pG!enlK zi}6M6xTB95{iI)5^Yz#0dMR*}l0goZP#ugT(5#D69DUpveM3K?nrsmlyh^*=tFOPN ze{H8VFvR)U?6MfLH1(qws($Tkm@dd_&{^|qZ^o6SH#1)Kv2eMxsP<4W{uh&y$Nut` zg~(!v{fO#TUhWyPexPWYso{zDnb*_ z(gop*!;qG?asON0BV|P0{`!ZM?a9+tBp;R_42mKq=Pb*+iMMnqmS< z?;h$qK5B6#?zz0Sd%a80?uJD}R5{cFqmWUOvM!UxzzmlUOGq_^vnF-ehnBa{iXhK= z^;#P|L5%tw{azHj%ti8$Jgb@Va7n%HjET4Rc}KO3W`TIs=J+PbKe-IXFl&h0qUao* zNkCfu(`TVj3qq04RML#89dy?)uLRKQM)LCHVPTiU1c~9g$^+O)>OTDoXm4xq&o-`4 zb%2HtU@buyt)&_uqOobNecweNkY3bc-%GFOCbC_9YO0bw>piVo3lcm7 zei<2P4QYMgcA77IEg~#DPHE)9?^6eU8S3hG`{hSoGM8mOX*84YKUXzkPVaA)ytW3B zO19_BBNpp~iSlLl*^r7d7;*`_UmQ52q?>x~uO!kd47dx^6*30Bzt;dMb{%>My(WwV zMebS*D4I%D=D@y;3rCj@g7x4aBQFoCAs;?R;Hj7wKr zXi)}y)AYmQ=khyNdcdcjlKA@JR zH{C*KFOi`J)vfGz{?>Sb>E|#-9ttB6f`(0?Zr^w<)M4?hjx3T}Lv(`tuUiz6SNnY& z`#U@aij5!yM+kwl8BSE3CJ@?lqbYV|mfDpnaY=-gKtjeAO>EAH%|f9v4!o*HN~kg; zw5SouxI(TjsIv4;SBbmXtHgcTnunUXMfYA+u&Zkgko749D%6coEN}~gTTB>#kky*H z=(K_%>Bl!F3XL#l%oq7K@T^10c`9cKb0R5A z#&G>S+CTK8(yQL%1+>2lCXdz8*d6#}HH(BCwM@ zI@Fj@K2drxlaM*2qWGyMHSsFT<|7%? zE={*!aeEfpT3_-Y-S_9Fo0_%tgJ^N0UF6l3Kq$jt4D5hbsH{;dhv#|iUgaDaxUJ0rMX;eNwjJ?;1|ci-kmE;3xMFEB{7E}5j$sNVG%(I1|efB!>9 z9*lA0-#iUC51jeMzS)bYFSO6ltZgOXs52)=C(N#e&`Vn))i`G^;j)kI>hh$u9<4*n ziB}WdTyEn6QPMiG*miKX>}YfrF?mRBadY_pmR{6_K`*@Tv%8e zFy3(o)B?-rToD^PQ3R>@35gpI#$mBv+ixzh-2xjY0=m-a(Ld-kHU8yIW5#b0Sdre$ z9Pe1~Ib8`X_?IYk-P;tr|IvlA#`dyD`R=EmpXNFKwCm%t;%R0H>x>ELrzv;CsW!r`Dx^s)twX)! z9DCBEefK3{P~O}79ov`p_PZwGW5q$>8v27&%- z)J@@O-!#j{Babsxt%k$eS&tZmF)etl>!KzcO`;*M>eU(?qxsej^+q|W-B?K0jikn# zHYHNA$GbK>SS_2ZIpqxgM`#E3_4cz}Z-s5&+noX?F}+ZzSOP)u-1sNO%YMz>r;oT# z7O_OH>sF@h^*%b^BX&jy&gb}!nu%W(DYc8)3}FAyUXV=!)4n3;BP7v-Phsb!8RF0D zC*F6lu<*{6XppO-l8 zU@28EI#K6R?WA)isa+VaMg_rz@HO_2qQ-|8;aQy5^Bb32?%;UJeI5^o0Xyd-Qw?-= z3A}wCd6Ex-cQ$MX&quAVbJM zVGZlwoMaxgB5RcEAwOy8voms%zWpFidil{@xvaR}!tAoT>r>~^m73xk2Aq?rGk_4w z`2PfIt8_Dk`tLetJstWDj#?jord@)bB-IaTtw|F3&W0~Saaf2I|n@7xcZ|ldt4g$pW4og^ulwOh30H(ew0(H&DN-hwf;$3XV5|>;1@GYUDN*CW3$#)HsDC{_)RvIIf z3C}K8If=FEX~4(CX0^T2cZ2gRe@!Jfd{jENYt;iGkMUM|!Fbx65y;nPt&-m34i8@W zA(I#%=6Dos$nA24Z3^D{SqUjBE-v*MPyE)SyS9~isTY>f&=ze!(pzWzp8s`asS4@bolI>!6Z%?C4*gvJfbr1(4&-J=G$)xbdF0#ZjNWXM?1r{Y%Kfjg zMXC~`0r8x-BnH9-E4rW#okrA2yIU%MCz5aH0QjFaE=3W9GMPcHsK}_a(h|or28{&~ zI^8=a|7=S@a;5E6Tr2I1tpw$tUwu*IYXqZict*{AlaPHm*3-QI*DSSZ(G6K*2#w*> z&d8;U*0k83Clk=9R!PGb0jC6 zgtjuuNpu4NeY!j;h!oo|*5=Ggl zRf5*8Uf<9*q~=Qe2dww$_5F^AFDN`?e!Ng>)b~F6nBQ+<4w_PGfao%`pVu;d^Uo=O zf63A`aIZ*i{j?!Rj{hYy>@Zp%wZUr^fBdRoc;d5X#edMq$BLV2zY)c=<%Fr7GF~gZ z@>Yj_p)JmOk;7$uB?bOeFFP|G%K%}n>CvG5qg1+?2+@dHZquWmRIL19ASST2(erXe zgFPD5c^uEL2RSP0SF?&wqhFU6;#46GTTsAI889}9{ja6xKI7fQK`g_xg}h`cqn_XT z;t**Rh{X0M27h&_tAJfC@)9$nvg#hRV57_^eTU7OjSTG`%hVTLI1 zH~U*x(U5mOoVn~&PqY>CGiUSq_L>Um0&?mPNj5U3Pe(XOW$EGgsiU;qPoju4Rles7M+Ey z$^R|X^K}8;ylZ};@DurH@dWUf_LEv{P?Y0uW9nEOxbM=cpleRz$DqHNa2fN&ev7tj zlH*F4HgtIRs7rb*toN;5CXJ&Z(uRwN45y=@wBx^q$CLC^S)51)Tn(Ed}s=cTSHL)i&e^XPsWp+iT{Z zK#tD?eQW{eCB9rcD&wWP5EYNJw!|Gtm1vS$s zb}dpPmNtUiH5jr_TuvWs)I5gp>o&&UNzZ;ok3?{Y5P-es8`Mb55x_$Bvhy|6SE`>HN2d#G)E=ys2Z~LFz~-$rW>3JM^lg;Js(n z4^W^!?p4XBwy+$J%&>U!iTTg)u&m^wrFo@-`OiS`AZqT3pj`I z{|{b#ultYl!Jj@W^b|+7xuzT$eZ!NWQc+7?`xO57?#suJBfmI~?P$8C|5MfDmz-uqH& z+Hz~S0!S6eO)?LrkZmJLaO2_Fey!M>-t#DdI9l)O(6mS64rGTZ9;aUA@lUE%_59}k z39@u3h{NVU%I0)E=|eIyF7W@bf5j@+3~=GHn-Kw<5gh3@M&9qD`;I|-!K`QOQy6-1 z)`scx=8Sdm!ycZ4&4*LW#3o|D`Ku1qva!Y3b|dQ6QLqzlHA{M$N)7E0f(POz;$<82 zOK#(ai|n_5bOS<%S(Iw{fysEp)B~ZFdD>>$y5&V#Idb~6jQ+A<2~7NXwW8{+0C#(i zU}eiY1Z}K@8qZ5N-Z9+1w`}1vV;YCQAP{{7Kvh>5Zo^6TgVL-oGecd7y~alsY8+}u?4>PpK$`CZ)AYZW>+vAP6;a5&yxqLNQTeijp|)YE z568fxSXB)`Ep;rCdHrUAmrRwVON==Fia5FUFgvrlb-da)@;x}JO`p0KGbZ_S03%KB z^6`(xQ0|ZipxI%#*wAcbn?a-3pi;N5W*}UZm-wRvM}vm`lyZvPvw8pPuRU}}HZ|{a zX2N?F0;94%K_R`N^`c-(*LE^xtvthjpdJQ-O!`xU#JHKplkR4`+LPof9@Q$+8?&$*xR19!jXL%BrTF$>$JH6* z{m=x>`k~P%ULVwk>iienqKBi{Ic{7@jpVB1mrUc84QDWWZ3+Cga+&ArqA02yaEU_x zawDfRY0zibfmM_-V3m-*Sh>C`A^P4x9vP}U-XRdRENyVc^>ux`W8X>fyp@Ytdi8!o zYk8D_E(3ww7iARZ^Fg)T8iUJGXDHF)g1XxCjA>OC-*6T7 z7y_;IMaV_T5k=0RuH$L{UrzNcYI4VK#>H|P9^igErbiD;r)-Gj35OmQ0t)y26e9^) zMwn^aGR}~!zk1oz>g>FMwH|ixw0wF8fKkjJUnZntx$t?o1V7~}$@@ZfmG&f_;_02P zD93GOBS=lvV2TaB2m`>K{_`ueR-7(&5k=co?524&be!EHv94xB9YRG8aTMqYETr$s z1i?8=bg5|3M=42LAQg;c05uJ*F{CB4RZbyt?GTkO@)Y6k&k8d`QOzq($4^}x1 zNxs1JWjfrLu~KV9M;G;>Xe;B(h2>k{JbLb6VX+T0mSb7gox;4iY#n}(-9~rYp$Kk; zkTzrL3;;L=-*swNIqgV?W0OzE^%yc&>Lv3_zZHGN z@iM>UQjJtMiT!?pfX+v*gx2rMp1RQyH|xDW?_i(j!`9P8vsEQmqC;a@UPW;VveVWb zJr3I!-qE(cCSUo>=8olP$vGXBd&q+%;x4B8Q4Wry6=OEf zV?e>1Y6pF4dFlu(%httgyLtoQ53N1_*q+rFXFJp?-y&ukCs4rbCZpHUb@hS;F{8WqB0q@KW~Q$QVwz7xm35 z^)24rix&}|s)AZ+>djdP{Og$bQ(I#|Avl5!yN^W@e8^8wD+3zVT?vUW1r&c2np71O z#&Vc>Bo+*O!Sbo^c=CxB3}HR-rCXZ=uPK z7pf=8VCS{q=u(^tnCr?N-JS7$QeB^rkGrhZ(}E8tXzHevE3Mw;qpCBk$IQ}zg5J8p zH!QIpO}ZoPzwkGziI-pLvI*cv<8+LV^GFk0h2U-PZ?LHYaacjfwr~_^DJ2ya%i-{M zN0`=hcj3ve!yUGMD)GSJMCqe#@x$M}O}z+$QtGmB4@Ow7^oI;);1D=&uGo__I5uorbh^FZiyWAoSS3&`{t`@3$G zwqY-)hY!7@egcjwdMb2By;!j?Ei(_uvPE=-*typygf_!Zm?%pDH2^4|@2pKx7s* z*?S66V@G9G`=r8Lf$J$(z3ak!Imj@s=>j49uU-uv^3Grzc+Gw|N(k(G($XZ7O6fll zgB~a5VHX}`Dw~Md!-TGf#l%~>(jT^3^(SowQPu<6`r$EtY@93ffqLSH9)ud(SSUI* zG7H6c6lgJ)yx}lU)*qRBxSG9|u;pEg$1}UXDL(i#0puX8#0dpVaPP@Cx1n30cfui| zVV6(9&q;>?&C(4U7Wy%n>rM9|uSdVd(bIJ}7es;x$7s=^$!8e|;5<5GRg>(#5sepE zDB43>3a~|PW1kUk*0*<;oCUCSZ{m#91fbi;VGY!e>?8`~KR^?&;gDBnObzM1&4cwF z#hrs4>jcEoh+ePq-6FG6Kd9yPcFX=AcaZkwQ-&;|6ct}W??*Yar+Tmklb5*l3-~Fid<8qWoU-2VP77Feizci2Qphh(5 z9>>@G#S3d-+rB7m+~u;VpZlC&e&?`dw<#9iUk=CX-hC)|hZ{;R`Q(gcb2^ZA$rGjJ zLw$hPGCRuNuuuCE9k8*9>cR*}R=BPaT$BI;Yt07B9Vlvuta7dZayS%qMy}dSBP~ES zf3!GTuWh^4WC<=ufaxioOJl*4_J*vDJTfoz=xqLHCwBzTpqq!(4F6)nD1aMO1WOM$Qor+FLnzPaSNyuMy?C z0}dE6Oo|{^tppIWTpYAq0k}~Ag}jToU?73xbe0kISWyntJWM?$_&wtV$?}KH`z`3#-&U&$RsL_ zenUQybneWARdZewl`rxmqVzDW>Or>d$f1U^z%C^&#s(PXS3x8`mglc4StamYiput0 ze*@cuDUDJ?#Ot(>8?jh!vzG54IIq!sRP5IPF<)OM5#p@ai_i6SU>*}#S9>5uWrr$13&WeyekFl0R9EO0hN`!p+k)$L9%$SY z3SXxtd{}Cy+&le5=e0OdfPA-~YD#khC`(xICS1oL4eG|+Ts;0DXILD^s7HBeGke|e z76Jeb99l+Cc4|=j2%irT=RpHCn5Er%y zvg*vqJPNno(i?%dhd&Qc)}ua`-F<*eeahK+)L3}fhC(c({HIKh%QDnz=YUijH(Pq| zKiSMuJ%3C??Cue}BS?;Cohk}et&3zme<96J_9OM#7<0qlJQnX5nwhVy!&5CG0+m#4 zRcta-mye{Iut5dEHH)s<%^i%>R;6J3kxTP+H5c zcd;zx>+tWJs?M?EmM+qyU>`=kURc-`ZW#G8n7=A}QgW!XgJC|B5*r{q4%N2CVq!2i zu*OMK=yWoe3R|)zMa5eC2tcEzPaU+;V)3U`dNl7`p~g0ATBC~EJn+6D=U2_DjC?M# zKIln7(g?qe5^BTcEAES$x@4I> z3aRbN8$Eiw1rL04|7t%eW>XmwNkMQ>*tI@YG4WU`Y_kAfOKMD3qT5eDX zvE;RADEQy8<0lKt^)Gpo>mU6*FO(P8Zo6-gq|F}NT6sxoagg-BP5OhGgJ-Mp!6GY| z&zp>vk3Z){&P?#pBT~Xu8?v=73OwzSpUP4d0IBuQoqJul&OTa}>VTc0W751_Bbenq zI5{kR?X4hy7vlEOWf8}up?g3Kr|~4VbW~hJT_Ojw7buY? zSVY3kB`UX}S~F0)`IwjNCNb#N$&rf1!N{WqEqej354CcBj8ztoO{e&qErH+drFKi` z4bS%Pe2#oK>-(u^eR^>>hqqasS(B??-D1FFEA-28l!_K-pSw~<3Jv}1oQ5adXB&-! zB@?wO8w;t)xUNsGWJC{y38kRuIbrz1k8`!OC3?Y4Ers(zvEpH|VDjLjeF%v+o#?As zQqeS$DP`$Zx>DyKPRo-PWruPdYXC` zA5k@KRafE0Xj2U!vj`^G?o`RGx1pCY4Pl=3hiqmEKgDv`r1nLDEtZxD-zgo^#q1?( zxBJ;DZJtd%T1_yNQR~~^dl#Heq&s`GTf$a^`Y>6o1z_sMjT0^I^J3XQ2UwnC12m7e zm#&2UVhP1v3DB4FBZQKk_X)p+ut#oaSTKRM@sUMB?JAF!l>3h7FJ*@}Kkx-n9GeCF z^k;e|s+puSv#hwjgzp8M6YkLZCb`vuUSs8jnzSM6v#mNUA+Ty|OMg{9gOgWWXCnyp ze`HmAC1OpKnXfUQ;jgNH+hB6RPLW(*4ybNuHlGHBW=^eS`ZmJC9sa);fW4Ar11Qv6v)EnrW^Qt~OJP3|2vJH{vBc#;c61UlViD~ymYF94hTn2{$s*o{noAsp@{ayCd$jaJ zRs)MEsmz%}gc#4^d3-W%3gKK9az9_WDVdNZ05hJo z){-Dw2CpgULBAMC2L}s9JvsSMZ!oE+zSW%CTKZ{w6RaUJ{$z9G^jdZJ!Q@?kO6%2Q zq{o%YU43<+v#Ek`dwL7v>A4hJ>aNC0dCH>^9~Gr?vql^DM)c0rmusy!F`zf-{}A<- zaZ!F>y!H@7qjU-kr8KC7bhmUjh;)}UGo&Dm2m;b6HFUQq7&J0SBi+pa!^}M6?>YZ- z-rxJPd+oi~`mXDiSvdLhuQFOpWjShQXcx)dP{9GPB=YHZ6f%A z=^%Gj(~ZP!>0sjgboX#hYn%geGr{2yMdY+{ zIY}Mut6o+;EwF6cKpiH2M30#+HW>vnrH3v=imfiD#W|08T$PFBqO=B0^td#>TBa;A zvvcL*mjxHW|AxNzS$#-AbE|P*`vQ$oyG0mvkycf{_)eLoj5&>u8^}`STQXM|6QSya zw&Ol9_eGwlu<(&EYnVUSbGk((jh!=6+YqAykra}Pb{O0zEY#vXmmzD zR5$$Xdw(pzP1mdW?!BpLtw&=gI<_O{eOLg0@&)#4>;`jTrXo0Snc~|&L18B%m}o*?%HYN1JZA25(iW)wxD`}Zq&(!z$hL6A)9eYA)fej|G{-@-M2=uo-QW96< zbvB5MmLTeoSw6@kqxOO`s=)%}FfYYHZNWcsqJGm)(;k{C1h^9!YVD?_HCst6dyxNg zC6sWJ{Y$9V=SNfW=b|(lsH4UzRZK)eJIrt{Bc@Xdp!b^M{ydXv(?~KA*j)G4$7Ukr z#ES*~=%4xpue1aJK&2Jo9uMz8$t|cTV?JDw9go09=T0z8iO|5mZw{}IDRAxjwDgoU z2dd%LtCFH6w8g@P&Uly z6GfhC3Z{|)p|T|Q-oC%R;Ps-ButzU;tW_I!p=8f|>%RsNSVQKZWZU?=cfa00u5!sN zt&gVOu1?S`WOYE3u@vH;uJk+U?igY${oVgEAVVgP-uR3sV-g3VBO*#MuD|42P1U)l zWmIZrKNdM2gy!3BE%aP>mwiG@Zr^_C=+i6-SHj{CJ+YCxqi1=r>>1cNv*&!1sA50? zGoqGOc2y_+Y^)GvjpaiC+l&bFO7_+=)CB1O^yR`H+?-+39rfSCFs4QuOHmbza0Rif zs86!55}Zgz*>F(u)*4r7s)x!Z+X&rsyQFy*T9WRW9#a%GItBbkNKWBUt4wNTZOtfqWWcA z#a6!x&ujJwV-5Rs|7All@3)ST`BJg)!0zQf>10el79xwU05OUo*n$~%+pCXF8_84un7o=%Y-S75y;(hd_#A;3i5L8HMO;QT!Her94;!|AsMZTE`UB9`Izur*;1RJHAc--? zPp}5Uqy>>bvvwr>BRGQ_DXp_#`J7qyx%MfZK-%`PYg;`RTdSRQ%IYd;^OmKv_lr6v zEB(E9Jx06H`3M#uU_z)67Uvxj`}+f(gIn0p6SP^Y;a2T2_Dyy z$K-4c?GVn!)`G)5lR)=2>>~2fv!dAgc`@p*RJ7d3gfip5zFNe^!ld&YIH|pJ&o84g zA<#G_irj8oNxMOb>kFB|HfNji|1B08_AM;HiycRTD61&lD4XCThKy&b6d^SnHNhW* zEyI(yg|Za`ucU}y?9``KLHRMS`?Y?x7f-CB38UCd6DEEmRAKgsMO2ma86Bz^Q)w%7 zDZj>U8=bjY|DdqVR`cMYx<`Jo*}MbdZ!Lv$p)mn?{($LqcV2bqlQMC<$wkEIHF=lL z^R3?zP>i?}SLhv)oZ?SqoVxdTH8se_uE_cf?0$xiY(#3v3o&~ylrbw$ZNSiN)lbZg z>`6ulE{(aljJ;0P-~Padl1$?iDFc`0l;y)p6SdPv68sZsHk1WH;Wg1(l`dx z@gd4-%4s81Smqh-`5L=mJFi__a~3MOf&lI;b@+KkVJ33Uev?WrhRLgH{V~O9URlve z+-9Ye;9(%9xVRc z7ov7^niCf%3#JLX75VPVG8234`&O8H8=W z*w24FBid}2W)JF}BkoKF!}_Wh;YsGa@$bTIab-DxLiDgF2tLX`T~gQ{UqS#)=MH;b z(t6h!gm>x`%IuM{_A9XaHExOkE=~~8HWn@V`DR?EntPc; zJ>C85(ING+(La*W`Trpq>B&%_nmMqb^h7hl;t2H%u2?&J{7I7C1#=w2d#&l0u~!|* z0TlUVdmj3DB{Ba2hU78inxS3xd(L5}CWkDloBUE2q?;Ah)Qd5YZ^2%vF@rHy)mGes z-pgE%1mh;@?Egz8DhY}?#eksJvM2k=3T=u$Q&o%w!Y=@|rzY$&t;HWXTNkX$)v@aI z1=MOZiZF;C45lHzIBivs*kaI1Pm1E0*15uOJm)LVf7~LDggd=$opEI1wOKj6R|CDW z#JE++h{5syBN-_?zV}$qBE8mV&|KRIMwr8P&IcOuYoz22uy&`WWhqb#D;a-MuCRR{ z4iKR|EXu=rYA{C)E2ejBT(9p&yNtI}w(c&X>JoiAl_*f6G-)G%%l<~9fj362Pay%A zH_Zv}mEj*Hdq>IJ>lh~6$~KIalUSf;?DBl873eKONn z>mT=K6K!^Tg%r#04K$3orK)|bFk74z!=oZ7B0K$n-O$q;(@+~hi2BI^^v>C2;^LC> zpdma#QbG8!-{afPsQE46hb#sxy8c~yUM0Vdfi@LmP(BL%16~E&+y|=y`nd0KMlBky z07L+{DVaLJY95Q6F2L9agB7U@mh5@rMPBTYq9=`!Tt#BE6jMW`H)yF--h~}s%gfv` z>>ttnl*0C;3Z8>rQ%Q`bccT&bxy;c=v}JF|#jP-d^Avy?osb6Mv@z6oX$UdL{s>-_ zA8OSXU7j^L*|J#e^GF$UcKZdJ;ue^Y-4`k^|c@>gTRP9bM` zg2t`sdcW4mtsx24HTmd(ZLE)7njSZn-3i);dTLw2#!GO#UecXet66Qb#fp`A#Yly(!3E>Q@^lZ&UUlnu)mRb=^Ng0V z&3{H`t71fR<&YP-twl@Ffb2PE>wYr6}Z7-IdV)=vox8x`q3Zn9D z|28>~=!)q-3DCL>iFe1rfVcDDuYfed2*m1Wtd})Tlj0@zi?|)fYcI6qo9~n)=MtIx zQEXMruUR%3T1vL!!M;D6dF!U9xtqq%85i|sM)>=FaF;ImzGs`15z%rN5y<7#^;$8A z^Yi>A?zEV|rSiW0f#C0?ODYm(Ve03yc)3~q{O-RtOe6$;H_acnmC!!%axa#2HszjLksQR+|TLWW1<*aqXB38h?RddlSx6|$!^ARuVH-*t|^ zHv|7PMG?8#fHgF&RRwK=l>)Z#*{aF|f+X(3<_3Di6^t_-9DA8wapyoZL~0#Wt?h!`+$XLOno(b%l)( zMcr(w+;G$@n~X;5Vzx55@+EerUMZt3x4^ZEZd-E9kqd#Pn|wV*47&HGYNKWjO*lk= z`gHug^HLLcT~-Tvn(ciA;}cS~;cQ4f&E8>M82QHTPMTCr&^ z_Ab(lfqagt6oVXaU>x4n6AfAY9?Puq%g{I_=GE6rDy6!7yw@3Q>ApNybw8TZ-4A@Z zYwka80c|+%(I*%Qd)g}DOoTMJDR1IXf4b(dlSe< z;rR(eC>S96{?~wadxI;oM_HIdzDc8F{TR?rXg#1v0tXL=8`Hg(LJO-ytbz69wa5|3 z6K5hYFpTq_TKB_MKXbd&E!fD{Vjp7yg0n-$@NPUD=Q+mAW`o@ohz7 z@*fRRnhG@1D))0OCdNK`7hDvBxd!12xfGvcXZrYMXG+#FYKmoS`K2C^nz9x_maL*q zF}%bBw56%_lVrX^aEj8ECA%3yCp`u;I+#rb+VYr@b|UD1PkMii@Y;-8)lZWA1K(8M zv~oMbmHhgomTi=Hnvb+Bm?C&BB&P!IHd6d~Vnj$uo^o?zInXTQ zXXX1bCRN$#Q_KDI8I>&$IpU*?sUJg4Cfn8x^zh6d*OZZ*(@f5tn}}kdc}8mvQCIyt zzRyd<{i;X0pPHG|lRzDUMlaN3|AZ5uCyaKM=Bk2mjIchj)A6Y7 zWd{=#Re=a`^TyIAE{~p6)m?ej$vPl=@Rrz2(a@WPVDyqx;&JxxQ%H9MsA1m|9No zi2bKm4(PNHA4L@usf1Oh`y8BtYk#GAYV*Vtu7foJz{{}j6k^a?7ARR0>^F_{D#7`Y*KRY~M-a9}q(ALE zMjX_Q!4h1dVHhIQ57zpj4P7$o7PTe@2f_q=Y8JlCZwfLRHx~O&k#e^^FPl*CXJD1F zRvA*Ib?B;&{{(3ic2KVERe#Fx)#9bLztKC2oqHVr)*-Fth zQ8l;Ey!om8*G*q-E-q=Jw~}}7T7_v1-(wP}%Re1PlzG=?pQWvlw)8m`wPI4)J!@z7 z4jrofC73XoAM`9nk{AcYQ)@_XL#Y&f*W9 zCF`ZL<3Blm?6^doqNT8}E<&QV!1<1{EQC!+T(GA&+=A8@I>7*Vhn^?INas6^08M=k zJ~lsS^kmyGP(k!`(MRMsdF~JX%7h9c&3fE7>Ka7>O_c$d05`a%yiTN~Fh+$07Zd~9G_n_O%bt*}BKE=!c6&j|erJ+x_ z01mfH9A>}TUbS=F#6}Z<5%Yp;HWa9HfIIJbT?aqoO)GU@35N%sF86_|zXNmk=me{Y zC4##zL%-oEgASHU%l+(^uK8|&9@oezicL0Vl%G# zbNCtmT<|x~hc5UY2mgi|0dA?D@qX0YF_x&D?vytZH}_&Q5$M8`Y!P~~lne5vLWxSd zr&u5O$Jv_Ik7PBs7S9hhXt_?3qf@p4n%d`+Vd+*vM8uh zd_6Z}(9pV)g5u8&8umtv1(=&x9Y6XgVlP}VHV9`_LANcsi`JUI_9PiB`5woUzJ%J7 zv1R!&;gJRIV0d8~vO#X`_^Ly#;gWXj;2}XzKT)6cy91u;KSjp(%mi`QIjr~a-*p!f zdopB#))e>1XMqoRK$?ZHw%V=yN-OO=hYV{5PMxQ%zXy;vf&T+KX(Hzra2~{oMjSMu_MAZqUK-}2e zk#DzK@yi4X+toBSJ@0?+q|d{g%%tCq$M~A%$yKyo9zp2E!iqrdNoZ>31vKm7&jA&SrHy8#;x3r^jImHw zjC22`>Uvd_Iy^JHz;7dXze>8#(%Ihn#3anorGhYIqJ8*`g|__S$LG&IHtFA9n&&!; ziN0qvw|8=uh6Lek(mxa%V{1Ra(`q+8v0)Fve(KcqmwdDe)an+IvkC0cXxKb?-xG;& zoO%s4Q9ojyJr0g6vaCJ@<2H%+29Jy(r)f3!QlG?9aAp$!vLu%#YUA?2u%AlLkqEnf zP{*=UzrUV^Bxu6@9jg;-oW4-56uPI!>a#~%FtxD3q=4Koh9v7DHhTh5&wkR z@u)R*tCDtbk`{3*>8j^US%hnIdvvLd>)%p7$8fRL@uF0%$e9c>0X-#T*7DE}|Cqr$ z#(5;EKH=uhHO8vOsIJ)0bsZlx<(@SLpnYZ3w`1bu!xS#ia zGds*?4g4Y-_=ZFEt5^9P+d46kFM=PM9@oR=SyWr7fqX=!r@kE?;Co2J%<{YLii3a3 zGRq2LjCa>o&_x8Sr#7tq(n zuhB=s8K;5ux(96(C4v?ni+GGrsPK+WU%QK6*~U(7xzR2vhqFgvhG9l+BtkwYm=vDS zgW=m9w4{U@+GaMm@)+V5&HZRA`eFP!J4QD}p5Uh?!46SXA(>P>t8Kf}1iuN<^~Dnh zyG46$qXCPDV=@arZi+qV#N0DSU##my#LBIz-MB$weG9LGe)GYcw|8XZtJ4evUYAEb zh;(k{t#OJ3%_}3hc0*ICNQ_Zn_N|NAhha)&v2jPA%ghtEI=C*Bz9k8YzzK-fG`fUcV>Y=wSi_^(kB67G#CU*bd7dZ319Qx@_v!py;%jwe z`N~yGS%1s3epkb+5;w_Eyy8&xC$6{%@@#*HL4Hm1Ml*;Pu~}3{;Hd5cSeD}Tu>v;~ zqkQ6kD+rIBB?c{6+w430Xm83|N^|Mi14+Q}uiAi+=N|5!UHiC)wp8WZ)d!BuAElGX zGc86tl?#dQ!v6eBuH+slHVNMKiC)nz5kLCiL`nL0$@k}~=nG5sV0((2^B9Nw+8ONi zhhH|ZxV8*>`ti)9l$-8&QI``i^LyHI0Chdcy`x>J`CMm2$Jb5E35Kl z@L>cx_#}SFY{Dpv*_+v?R*0Kpn%*5!rjRyl>hc>8k}(l?$HxHj8(-E^%&TMliC-)0yYAlWN7n| zjYmQU|3~iR$mmTK3zOiQu`iFb85{ka#}gLv%0#ks813r&sddE*3wFw~tNmC$^l@D_ zC$*YNycQAQ zWarJ;9V?yZYAn4S@Q+&dCRSB2-cOX5W~7>CdnVs{#IihhSl@8s&ff2=YBRA!5&_1t z@n&bC3BN>e^y`K{oGj>%KXDHJ>>Tl)`^}VIDY&nNN7^3MKtC+xRgLN~XTLxjf9=7f zo{t8h^KjkJ$v(kxMS%M0Lze;_BCYVNW`p~OY?PY*xDTz4c!-1BNkF4ckJO`@stG#p8!uX~q zCJXf}&%Iuj1IjJMx2gmwGv!DLSSY5Z{}_uJE%Ft%eVKit=a~IJEdXKdR9=2lE`QT7 zlw#MAk>gm51Mdg@Q;G~m$L=>aynp=Y%{d>~;3+Z-Wx<6Q+n>_1{EkxcPxqK=V6>qu z&umZTGU8Me%;&7Jd7722X654{SQ{Jkvaa4+mX}D)>VZcMe%`SegRPaXiQj?pMBpBB zO7K0=PpUc_j{7x>Mum=6*-f)zB2;s<-cZvxb-dBQG~V6^VBiO(nyk2QaunLh9oMzI1fjf;OA4Rh^t5Y*_~w}I86PH zwo*DDt&sFXj}B$X(M@@k{3LKKj!F`MJL#BWPTj5n-0MUK;mSken)#f!Vw(D4J~7qxHAf z|G`-4)^yJ7#l!nw-cT;ovb4H)DBLJ6u=LoB3_SWrvywc=rYfqomiwv(y1?V8_1LN& zYiJzY=m~-0eW(+&OXLwD@=wULavF)*Zb?firK)QC{|QzLh_1p9UfhrKxE((8w(@}! zZ1=#A1q9QaS?Ci&8;A57?)bIGaD=!E-?Z4v=wQs5*1D92zYX{S!s-Z|V(4*C^%jugDhEqNiV%mL4`!QGP7@^X4yM)HYb{1_#zM`7T}F5Ic)a&s}Z_sW{yml(5~) zWlxep(MTjW*V4ub)cuR1&KtGhQZ&F))6*Ib-wZ}c(7N3od=ze2o+IW0F17ijwL-Pq zDDGcjiPHNF3Vy<{QGhm0D8Z@2eQwwcYW;fSHkIf=YyO*GDtQ%`p8Rj(Dmw0uxsd_6 zQI_(P%DDv{Jpi+5iZXFh4h?mp0hxt698%4858i9M=i)p5Rc$U- zbo)V2Qe8KqA}z*=#gB{Ef7WbMu~ zdR}CFF~P6QotZdnp1KNUrcrOVdAp~3ds&xp8wPm2Q)!BH2nUb#80T6##s)t?73vXULdb+n)c&7MYjh!SR~v3d{$IMv_`z&;?u*@E1y>N~fDGEL}mwFS| zL`_EhHr?{WYmrs3aZWBdc4T@KX%Y70Bucv#*76Rr7f zhU0a}Fsb)Wj6oHV2#U^=RJs_z+n=?suv~x~52%shV>GJ*1YxK+bF6}>&$0Fv@B0f< z39(StSAjLgi3RUrz}?%)-|q#i1`~mD>zd`M`O!>j_bXu<#k~?$E_|H0!mFktgsAWs zR_(zM+&645c|ks>1WO9lc5alSV?WLYg%_Nhg+IG70)NCnDB3EUdETCyPR);wcucJK z+WNo}Z%_fo+*)cU5~F!zZ_ZZZkf=y| zE4JZAV0)^o7<1XHN`1V_;N#rEG_^;Qo?kSMLF{3*t!%z>OR#|cNf*j3Xe7enI=|N&- z?P+h0lR^%=OInE?)NhOC$pqBFl6*(le@XvRc0wBGpk_GjZLuiHBrhI8GH#?!Y_cmV zBSYT`;IAx?|;7U4&P<)x)r!{OC5+#S>T8gl+J6#HIWc$O=lVl#e-Y~1s9B1-GqR4cS8R0R#75@Y{ z$?wr+o|P*vc5vv=SL#?~x4>RoCBl!<1*M0eQJDgvV^ZeUgg56ftT_!7N7$IB?c-?U z2i0V!ZZA2iM=Fkg1;pgVSc=h*17h>I+0bqzv7F|XLy*RY;gd<&g|z!wctQaP=b}H7 zwAQb3Wxmad)-iAxW7oUn_MA}~v7fBsHslHGKJ4396L*9;XC*&~h!2CaAdr(9lXQ{9 zSQ9r>&jMH+Duc&l2G!~yMhNpVv~0TCBeEp=-^#=A0A>!+rMIPXQxc5?EtP#oOZrQapfmsTMszc@F+Q#DOUyWA_vbWDJ2Ho?Vk-0_eE)!*!)A!ftAbUkw3LqopU& zW#a%Lr()}3N^Eo5wf9Lae$I|Mn1a!RB{Yz+YyUd4WtkOPE)DuEVYYmhfnz7eH(MnJN}u1=zrTmI@3Kn+$!~ z8o_j*v013b@qj^+7BHYh0Kl25ruKdp*+PHW`&Fp?fGT

Qcr7D3OulvGm*uV6m2V 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 OB?sXAJzG5@bN>P3h2ZZ1 From 1983be6a121d6d5c2d06f2648a40d435d38b7fdd Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Fri, 25 Jun 2021 11:06:52 -0400 Subject: [PATCH 3/4] Transform cone prettier --- code/datums/components/overlay_lighting.dm | 23 +++++++++++++++++----- code/game/objects/effects/misc.dm | 6 +----- code/game/objects/effects/overlays.dm | 14 +++++++++++++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 4e778d529ba..b6a812ce9ab 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -94,7 +94,6 @@ cone = new() cone_hint_x = movable_parent.light_cone_x_offset cone_hint_y = movable_parent.light_cone_y_offset - cone.transform = cone.transform.Translate(-32, -32) set_direction(movable_parent.dir) if(!isnull(_range)) movable_parent.set_light_range(_range) @@ -454,7 +453,7 @@ .++ directional_atom.forceMove(scanning) - directional_atom.face_light(GET_PARENT, .) + directional_atom.face_light(GET_PARENT, dir2angle(current_direction), .) ///Tries to place the directional light in a specific turf /datum/component/overlay_lighting/proc/place_directional_light(turf/target) @@ -475,8 +474,13 @@ .++ directional_atom.forceMove(scanning) - directional_atom.face_light(GET_PARENT, .) - set_direction(get_dir(GET_PARENT, scanning), TRUE) + var/turf/Ts = get_turf(GET_PARENT) + var/turf/To = get_turf(GET_LIGHT_SOURCE) + + var/angle = Get_Angle(Ts, To) + + directional_atom.face_light(GET_PARENT, angle, .) + set_cone_direction(NORTH, angle) ///Called when current_holder changes loc. /datum/component/overlay_lighting/proc/on_holder_dir_change(atom/movable/source, olddir, newdir) @@ -488,6 +492,15 @@ SIGNAL_HANDLER set_direction(newdir) +///Sets the cone's direction for directional lighting +/datum/component/overlay_lighting/proc/set_cone_direction(dir, angle) + cone.reset_transform() + if(dir) + cone.set_dir(dir) + if(angle) + cone.transform = turn(cone.transform, angle) + cone.apply_standard_transform() + ///Sets a new direction for the directional cast, then updates luminosity /datum/component/overlay_lighting/proc/set_direction(newdir, skip_update) if(!newdir) @@ -495,7 +508,7 @@ if(current_direction == newdir) return current_direction = newdir - cone.set_dir(newdir) + set_cone_direction(newdir) if(newdir & NORTH) cone.pixel_y = 16 diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index b48ca15f5a4..140f4e502df 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -116,14 +116,10 @@ . = ..() vis_contents += light_spot -/obj/effect/abstract/directional_lighting/proc/face_light(atom/movable/source, distance) +/obj/effect/abstract/directional_lighting/proc/face_light(atom/movable/source, angle, distance) if(!loc) // We're in nullspace return - var/turf/Ts = get_turf(source) - var/turf/To = get_turf(src) - var/angle = Get_Angle(Ts, To) - // Save ourselves some matrix math if(angle != trans_angle) trans_angle = angle diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 5a5f043ebd2..3a62216be6f 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -161,6 +161,20 @@ alpha = 110 blocks_emissive = FALSE + var/static/matrix/normal_transform + +/obj/effect/overlay/light_cone/Initialize() + . = ..() + apply_standard_transform() + +/obj/effect/overlay/light_cone/proc/reset_transform(apply_standard) + transform = initial(transform) + if(apply_standard) + apply_standard_transform() + +/obj/effect/overlay/light_cone/proc/apply_standard_transform() + transform = transform.Translate(-32, -32) + /obj/effect/overlay/light_cone/Destroy(force) if(!force) stack_trace("Directional light cone deleted, but not by our component") From 0f5e7db2d0d416786221f445e31f78aeba1df8f6 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Fri, 25 Jun 2021 13:10:13 -0400 Subject: [PATCH 4/4] set_luminosity helper --- code/game/turfs/turf.dm | 2 +- code/modules/lighting/lighting_overlay.dm | 6 +++--- code/modules/lighting/lighting_turf.dm | 7 +++++++ code/modules/planet/sun.dm | 2 ++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index c6a2728108c..467cc6cf344 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -40,7 +40,7 @@ Entered(AM) //Lighting related - luminosity = !(dynamic_lighting) + set_luminosity(!(dynamic_lighting)) if(opacity) directional_opacity = ALL_CARDINALS diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index abf3c39ba6a..45d4004dd9d 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -26,7 +26,7 @@ stack_trace("a lighting object was assigned to a turf that already had a lighting object!") affected_turf.lighting_object = src - affected_turf.luminosity = 0 + affected_turf.set_luminosity(0) for(var/turf/space/space_tile in RANGE_TURFS(1, affected_turf)) space_tile.update_starlight() @@ -40,7 +40,7 @@ SSlighting.objects_queue -= src if (isturf(affected_turf)) affected_turf.lighting_object = null - affected_turf.luminosity = 1 + affected_turf.set_luminosity(1) affected_turf.underlays -= current_underlay affected_turf = null return ..() @@ -112,7 +112,7 @@ affected_turf.underlays += current_underlay - affected_turf.luminosity = set_luminosity + affected_turf.set_luminosity(set_luminosity) /datum/lighting_object/proc/removefromturf() affected_turf.underlays -= current_underlay diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 59732b5d60e..d59a4d53157 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -93,6 +93,13 @@ return recalculate_directional_opacity() +///Setter for the byond luminosity var +/turf/proc/set_luminosity(new_luminosity, force) + // SSplanets handles outdoor turfs + if(outdoors && !force) + return + + luminosity = new_luminosity ///Calculate on which directions this turfs block view. /turf/proc/recalculate_directional_opacity() diff --git a/code/modules/planet/sun.dm b/code/modules/planet/sun.dm index d2b61a389ee..52172d4d5a6 100644 --- a/code/modules/planet/sun.dm +++ b/code/modules/planet/sun.dm @@ -39,6 +39,7 @@ return T.vis_contents += sun T.dynamic_lumcount += our_brightness + T.set_luminosity(1, TRUE) /datum/sun_holder/proc/remove_from_turf(turf/T) if(!(sun in T.vis_contents)) @@ -46,6 +47,7 @@ return T.vis_contents -= sun T.dynamic_lumcount -= our_brightness + T.set_luminosity(!IS_DYNAMIC_LIGHTING(T), TRUE) /datum/sun_holder/proc/rainbow() var/end = world.time + 30 SECONDS