From 63935d5978dad6f698e375eedb5c661318c9296d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=91=D0=B4=D0=BE=D1=80=20=D0=92=D0=B5=D1=81=D0=B5?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2?= Date: Mon, 16 Sep 2024 09:57:11 +0500 Subject: [PATCH] Sun, Shovel, Fastforward, GUI Improvements --- assets/shaders/shared_outline.gdshader | 23 +++ assets/sprites/atlases/atlas1.png | Bin 32845 -> 13868 bytes assets/sprites/atlases/sun_atlas.png | Bin 0 -> 890 bytes assets/sprites/atlases/sun_atlas.png.import | 34 ++++ assets/sprites/cone.tres | 7 + assets/sprites/gui/DisabledEmptyCard.png | Bin 0 -> 558 bytes .../sprites/gui/DisabledEmptyCard.png.import | 34 ++++ assets/sprites/gui/EmptyShovel.tres | 7 + assets/sprites/gui/FastForward2.tres | 2 +- assets/sprites/gui/Shovel.tres | 2 +- project.godot | 5 + resources/plants/Peashooter.tres | 2 +- scenes/debug_lvl.tscn | 18 +- scenes/entities/plants/peashooter.tscn | 1 + scenes/gui/fast_forward_button.tscn | 11 +- scenes/gui/plant_card.tscn | 4 +- scenes/gui/runtime_gui.tscn | 6 +- scenes/gui/shovel_button.tscn | 17 +- scenes/gui/sun_counter.tscn | 8 +- scenes/sun.tscn | 174 ++++++++++++++++++ scripts/Cursor.cs | 28 ++- scripts/Sun.cs | 31 ++++ scripts/components/gui/FastForwardButton.cs | 31 ++++ scripts/components/gui/PlantSlot.cs | 16 +- scripts/components/gui/ShovelButton.cs | 39 ++++ scripts/components/level/PlantField.cs | 54 +++--- scripts/components/level/SunSpawner.cs | 28 +++ scripts/components/plants/RuntimePlantData.cs | 9 +- 28 files changed, 546 insertions(+), 45 deletions(-) create mode 100644 assets/shaders/shared_outline.gdshader create mode 100644 assets/sprites/atlases/sun_atlas.png create mode 100644 assets/sprites/atlases/sun_atlas.png.import create mode 100644 assets/sprites/cone.tres create mode 100644 assets/sprites/gui/DisabledEmptyCard.png create mode 100644 assets/sprites/gui/DisabledEmptyCard.png.import create mode 100644 assets/sprites/gui/EmptyShovel.tres create mode 100644 scenes/sun.tscn create mode 100644 scripts/Sun.cs create mode 100644 scripts/components/gui/FastForwardButton.cs create mode 100644 scripts/components/gui/ShovelButton.cs create mode 100644 scripts/components/level/SunSpawner.cs diff --git a/assets/shaders/shared_outline.gdshader b/assets/shaders/shared_outline.gdshader new file mode 100644 index 0000000..374e3fc --- /dev/null +++ b/assets/shaders/shared_outline.gdshader @@ -0,0 +1,23 @@ +shader_type canvas_item; + +uniform vec3 line_colour: source_color = vec3(1.0); +uniform int line_thickness: hint_range(0, 50) = 1; +uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_nearest; + +void fragment() { + vec2 size = SCREEN_PIXEL_SIZE * float(line_thickness); + float line_alpha = 0.0; + for (float i = -size.x; i <= size.x; i += SCREEN_PIXEL_SIZE.x) { + for (float j = -size.y; j <= size.y; j += SCREEN_PIXEL_SIZE.y) { + line_alpha += texture(screen_texture, SCREEN_UV + vec2(i, j)).a; + } + } + vec4 colour = textureLod(screen_texture, SCREEN_UV,0.0); + + if (colour.a > 0.0001) { + colour.rgb /= colour.a; + } + + vec4 outline = vec4(line_colour, min(line_alpha, 1.0)); + COLOR *= mix(outline, colour, colour.a); +} diff --git a/assets/sprites/atlases/atlas1.png b/assets/sprites/atlases/atlas1.png index 5bf7eaaccab3b24a8de3b6c593bece0b7fa559f9..7e1c4d0bbe239096a697e9d0fee03f78a8916a04 100644 GIT binary patch literal 13868 zcmaibg;&(i7bx8!EiE7lUrIt^=`LvyBozci8Wxt2jzy5}-lZE+aw!oB$&Yj`C?I@T zghg0H`uThB4|sFVoI7*po;!1A=H4^+&dgh5Lv3mbHVQmEJZfDX4O2WkeB8e*Oh)(* zL*U$U@eknpn`*1!HBE8s{j0bcKQY(*2OmC^R^ro^5Y(1XGE%#*X(_00FK*-i&{kVM zNYTqjUES#UbDww0cJCkA=BSyWUOe4@s=wv-RH5AGxXS)E-DMf!a@*#Ux^6dp>vOvu z6dsvFqw+t&8^^S9gE{T(}X%YU8mK}`+K@NWOVsp7~i1rP5Yp00+f zc~H?o@mt4D6paeo0b~yjx)o7leeljy51D$gQ^=Viw>+B($-%G zzC_p?O(z_DE=LiMIQDr41 z<<%A&5VJ9t;Ji-J`%>bIn5=_&I!&EdO+;8&xzza*-wvT*H)&WI(aIJEiC{_SiIj=w zsEsHpzy(yLkc?VtRoU!LREnBcw7e47x9(lbynGX`z-2PebhP#Do+VKDzzog5LukAa zv=H_|FmaNI7Vh>&Ogc_{mzx;bE}`_;4O3M$oJJT>dGJ7Hbcy!}xwTZVgODE1~?O)t6^19K%QftVEXS3UcG+k|2zG0crfuzth_nvDr#V!FGHch)rc+1a zl|H<-eY3>N8GdBNa{5;g;dRjQg=0<5?|=_O=l>85+=h{|7D4JReQ62|Bl5PQu7j>L znNVK>=y7!I{oYEb8nNZVdlESOT6aOja~UpM7HD0*kRmB42G^RE*0x^cyKF+Z?$Mg7j@)*F;Ew_X}yjh#P_L6qBt^lKN z4veoIJyWY}S_Y}}^%MIJ76P8%Y((5r8-}GMi$CAYuMz@+o&c$Cgwq^>4qY<3ph{@4 z?A7_nE)+u<=7ZrtWlDou-yGgWck}I!2Y1{9k!6KOjlg4ngi=FXX=Wrt1ks^({a$=9 z445MbHG;HXMX+QpTiAD!O6HorO;DP&u3HK#NutvRT+I3|FOp z3Zx2+KixqC8_jil_yNvnNdzB#Y?FO6g&qGEq{LQ3ksQsu=UxAPA>Osh_flR$20+59 zXip<73of!>dwx==SSPT9Df9VzuFD0yp7NGF>P4m&R&@~syi=sTSh(;d-&u)BMY8Vz zn{G9$R6rd@=y<*Pvu!)pv%s*}JWh+IFBCtn`6f^nOq8qZbfmd$D#r+7K5(;`MZ75B zV#H8EBxL5Ek$`34l?(al?O2C%;4K7a+Qr8H8ge(X+^yfp#DNRNDOaW>s53M&c^AR5 z7W$-yBU-e6<#GLAntyWnO^<>2H>_l%)JMPC} z$VSBtRNiYxWLPPCc<=%U&Q1wd!$@U1vOdZgf=k03y}YH#1wGW{l%|{($Ku}84a5Pb(FNzkHMn}R5gO| zlnkXwQ&xjLTdXuZTuYBC(eAs1Yol@P-=i+HVpC{1vbS@(OafXic2wb)$<36Cu*4+R zi>Yc!{@o5A1DUyTFOW@ca!h(;@k`UBJSnHt1S2!5(*6}jZ(4>6YUXAGIhz!`cxzq^ zRjinr{HIZM;Ub_F@g%t`UALTvP4MWu=sqoj-9Np;<20b*VQU0^j+chlVp2YAR3rFK$>kPEF6Q%g)#1T=@mKan*674~69EGUcmbEsh86(( znxTT;ooh9vWwi_t4fr|S7KZI`ey%SJbWE55x$w;UN27+mXQ;)CL$EAif>F$RWHN}^<^UHutFM>tt_?c>lL#&7&Wo!uKZ-dCm?;x>v zwM#zWBCFU>rY)L~r+ZDg1ORm9N^FCC3|`tE)A8%I zU_0wz4XU=Y``w+^Ua^F8RRC)UYWiw|D5J(ljbl*tu=Z0{@JS20y@0g&iIKG@O<0Hj z4;-C&{Nn)3b%uGbS|=L{->!DTDRpS$`GzljN>=#QsBmV^V{&TDX}l5%^*U=w023`TmI=n9o6YInyi3-oEKr^b`w<@i6I*J&KqLO zEyXUHZlp8Y6(%Ejw?hI~{F3hOiS^=|0tSx}`i7wBw*faH^uLA5&&9icgSAu6NUE(d z@m+r~SNhE3&frKezrwqkG=vaF9LG~DS*ZyU8`yY@eWNtAGYa)wgl_eF)4^WutAncm zv(FAaG?GfujttdAA=^^>o#9jS)o1iIjo1kHs{fl81+}cu5e_3t!0fSf;~oLDf=kug z`{98|;955)S*$Yh^a0HU{Mj^bx{>j0j4AqabDW$gRfvtJoocD!9);6_;);XdEa#_6P^Nx( zhC7@hav`2CH(qoWJnpT^8xd~F|HnN%g$3bljdaIM!DeGPi@6^@x|N!2uXIRSWT*UKhgKl`c=;#+32S1;sMJ=PDVdd+=sb#yRRB8C24fc zQ4pd$_pTL4X+~yo@i{?X54sv2gyfjj z50~sb=vB{f`!b`Q;D28~H^b;ox38c-^9e(q%M%}ca_AjQ|4;A}+aqv?7CATz0|p=& zEDkT)Yp$vq?dAHG7z+{Y_N{!}#HeuNFS*4Nbn?mRpUI_k)*B)pAP@gG5f%l=TaB%-dC2 zjJu)Y*P@!&)l(c%x+7u&2_o~_IXyEkF~tQvUUM52&qp8f983E3G%;Eo%5j|%baK<^ zV|>;9n_qD=4~)W^_F8A~?*>J97DkyD2hi=!u{6zS2h)FKS zwQDt`f=f9&v*3rf^B2@=8}|cjZ&UpJ6q->l>8*ryelT4U_SH|TwN_32Meb@AR2kA< z-E&5zg}5`@G;MC|yUvG`i&E9s@srKV0-}Z!Z10*lz$@AQL6HEAZu-r|E zsg=m$QQL`9jW4%h$P!BOCBz_1XS{+T*tF@w#@gG%gGvG(ftvc0HWA@`x5Z$Uv(4&I7})A2sjr4*%USFszd?ebi=k{(;W?aNTgr3JBRI?MRb@`4-4 zHVp2C$>qi6h)vVW>rHRoQbxrHsQg5kNsS@Z|7!|)olIsIA#)c;=T3e&&vE2I5ZT#U z&LO+qh{bjgxl4AmQ$hk=tB@V{u`CylH3-X;$Te4J zBz>2Nvnn=iWLme$zFibj5CDn@M|N$8su=i5Ti3!r!rS=ZbBDU+ z&?UKxAT`zX(8H-NWsXzPoG({CopiY27%%y9M=(U$DuTzXxBm$q+En|9C{*$hv~fpg zB?wD%86$WZG)rT)e{P2?%-$me5umrXOQA~0pr*(w!s!K#tMmvDQgUY@e|CvG4bq^1 z{?qp2CK4D(>u)3g&Fi!Q3%MrV>o0p{@AZC@ORuoeqtp-OeMv6WRW0X~hxx3p)Gu;c zud0Cg2pPx6Ni)6jiJCFvR7F95A28vJ;h7Q{Dr1o@bS2USlJ3a9~bZSUB zKR|4;{qAepVwQ>Kt3D(72~bmL@K}Er3`SGrIf;!c1CxEM4_!Fv}_1fA8NuT+%qmy+Z9X#*+>juuup z{`y)pdVRakqSkS}_uXCJ6HDzW7tKE0_-oko6Mj*Z^6 zNgtXnS00{f${DN;r2h=cT%oq6NU8GOoiLgA70i#o`Ij9>=(V)UGlnOW4vbGRP}zsuAnZe0zWSF7L|Ieh(T5{ zoDwX0?b=9Dy;yH6Ths+B%}$YAPjlX#stIh}z1S;_kiLBvkdJkUH7a1dzW9ukv1Wuq z0ARdkkeGDDL^5GLFdp@E{NFa%zrfeWi;NjX=BlgZYFY7}%B#R$AF7TN9np>jakyW~ zQbkz!0*xkc-OH<3+TMXFixX{|P5Cg@e#L;nRXADE+w;{` zWfNa-G1Oz6R%+gVcObHd+$+VDNSTLsuN$=Wd5#XAz9(N#JU}s%jkj~BR{ub3VJMGZ zCd$`_&|kQ{`=Xiwcxx0RTP1rDeoeba!#l+d;U*q#M6JZ4DzI@9rs28L6m72KGN|$c zT)N!~6?5;0hb=0%y9Pp`+e#S(Rq|deJL*s6`*k_WnZzyGXTj zNlWDjZLkT7JmmTn!1-rzp!~)qEv9Z9puNi2Cxw#=0Ldaf^F@ZulmhYx>1L!7*`z)EOvrmH z)C*jCW(b7E2hl{q<7D9B?glcG5*0gz$*)=ki=I8i40eTz0FB5FWiK7@R9%(Z?CTS2 z%BA2&k+_^}QWyX|-tfgYuKq*-y}l-uA=5nxHvru%76*3@39h#pufO~zu&o_067LVr z_u`Q2rB50VRhJo;^QiGB2@9z$IV}47c`1_z0jq*GVH}T$f5JTKM~D=k;tDI>aWRwK&6t4b zbGz4j*4yb*pUGa8gE9#qBU@^g~pf z!QR!hza>nj?@neaBncf(qS7ZiZ}E1pSS&3e+M?MS(T#Wp#H8i&qh*d-=kLPUxxC3* z?|*vp9JFg8j@0p|=2Xj4b6fWSHAZt}#cZ-Z83fj-AD*fk2Bs0^(~^Y!vbT9nKyYtn z(hFQcxvJ)F^+3<*qEI>9gB%E2r;U-oCzYYP0%2s}yxaS9M!m@lVuRQx!@)Z+_B80iI*$ZpjJdP!u(KQ@%yKlj{*5dr zBTR1PKH>ph)+4L|?2pb!@Og%#@@o?U6Z1+t{xe6=>I^m-Fu3u8hxwr8TgrX6buk*b zFA~TQM-;Ye|9p%^Y1HQH9ZEfw-(4H zCKhomfuyudDPPr?%gu=Dm&EbN9Eu-)t~A2BQV7Vndew^YV}kvP(;BTv*Bkb_oL`8G zc`&&}70~=qqzbbH`z6wZIa~s2vetL-b!V}!*Re;?5_4v1zZ7Ir!42iL;C$Ri`QTy3#}-yUDl3!*gVLLau<+>W0bzbaBy9EoVxY%-Xo zrevNK!^w{=1BB`Mmyvo_nl%mkA(Z8l;m8dGKMEZ_<_r22+h_Ii61i8hw8qc8V5@$V zKu6o)zoEX)z-V>Dc#oJG&55UzUi_W>IjHzE%9E)8(dY5IN7$ImbLN9 z;h^rVlM1+&bNZET^D}kwUfzwqpS9JF1(Vq>0FxJ(6Y&#Rk~fy-9lJ_fm%QN~BYfWf z!mqWil(_g4X#vd_)%iA0hhI+#0!YI4#jDFdQ1d(2aeyW*+p4hCB}K4aamPzeUhcgi z;jMz@OfcQ^CVR%?+_4>eQaj}yW(*hfG`Nx?fVenMroLDMO<+0^rrANF6nDIFc6PRN zy>Yh^@0yVe&ZXdVUG$Ob zWjMi7VOBc*Et}X;p&3+=W$1OstM!d>CV`MPJrx=L3v*4Kxwm~~qGcY8xLcL=TTivD z7drJ=6P-7sM{jCD^F61fk8;$4v1`UYm7%VFujcue$`h3M{H>Ty9YNjzx{H~wj>rig zCj@ET6oP$60}Zes2kWD6yb${u_tj8YaGoDLv$Ks&@@q0j5*hZsXC72v_Xto%cSC%@0w>rau*bn$@nRwpqcsP?rp{rUTyR8!w9_o*> zM}PYqV{NJAuk%dHkD{X^pOiE4w5hx9m}A=yw0`Pb`8?NoSr+6vWd@;l)Ma4TFygI6 zqH@kS1y;<9QJM08Eg1W`$!o$L@4T`<+wVCKq;Sn#K)u#AIWV-jrZz%I9#T0Ga=xCm z608jtp`!ZK!KpeMFhH=|^`5cQi8VZfM?BeAXJk#~toAH6u$F8>&<;&E{Z=iP`YDeFItIjmvVo-&@Ut=s2C zFD#43*#Bo>S)~{`Rbz%5eRE(rLmftkqUc}6W_OdZ2QM*g%mQ*gtQUkeA*SDw!@Rqf zL;?&-cM~rxVVcDc#MqRlo@jMh&FbU+#o$+S@@LXF694V-D|+PCADUHZkV%d7Fk5kv z0Bv^q@q4k5uI6-<;hap5ua?Oz=A|LF1gjKTC8Ss_Q7jz#(`*q~Btk=*+El#_6W%nd z18+Vy5*3qK22`Hfa-J95JWzwpdAo0P1w>FHEm>>j>RF#=`CrU73K&@0+itz~5Cpp) z7r>l0^at&t`(|6+Q^JJQoBxYWX|4ApQp9C);)=$8zt4CIMZbo2&lO4f4Ug&Bz$^_M z%#}{@LI9lTbVrkxlX&>J5b8ViNI#dU);{}cP`(>*btcIfPeOt7)FUi8+DjH0@he8|5}PFkb5NZ3AF6HypGW5n$}{iVkG_@{ zOgLkf!Q$^SOQ`Iw7=2GtQfHaG#U8GR5dGJB=ftCTs&d`vZ>5lJ zQzA!~%REUKbzRfJ<-*4kah#{;Fd&W(&f-B{2U~a~k$Xpe!eW7;*nIPV69S;YgELJT^oje=k2 zN4Q7S4HL=1jOf$bFi#0!RsOtv#fUzY0blT4X2)g|dM2Hdav$qs!wN zbG)v4-&}J|HV!OQR}9h5U{YA;q$(jy#s2{-KV8Jx)x?cZ3r$edjWN4z_e}!7$8%6;rXt z?|SGCF+E#x{Q6ADNMej+QlY0wk04wxPU=?-&xOk!%_08ysdOrhV#!o5p33svvJPR} zx}a%$Ef(YHSVQNF?iW)H-BnX~QBBQ_aSvrgS3E^t9l|%NY30=vs34~8*kWHWU2YqSJxra{#DBQFd)-gKBQieMK|mj#A%{sn)U zyL^qVg7W7%#qSj@7z4dlwRJbcnLw%Ba-iBjcNN2!7ubp&t8-C@8+uU7MNakkejxb9 zSzobNS-q!Yw>Z1Hjk1C2LYyaSY0=>vBq4VMy|XjvvzaDw0&$ntM4$&jgL|(R&?g2{~kQ9c~AeYK~O66HDpNqEWEKw zsqsHVQ^MJ!!|s)!XE|L;(I?{2dp7^wqO3V-NO2z^l@o7Eth|U=`Y|U?H2KH36v5p}Z)D${Wlw;0|VR{rn-mMK8QgfZKL2SJvjim;@mNXOWL{(49 z*z7NPHU11Wu&MkLi+q^L6`B3JUOOaF|%?^Z_W@u zn9~&!l7k{c{{j(+h=GUO_GMj0s;Sa8?i-$ytEms&)-To1^8T6&`=7{>CM@b>%vikr zn4wKzQ~}{h2I9;jAhK^aBxT9{Zj7+nq7d1CphFfRvvJdO|6C~*8eUQ9N&5h+LM5o? zT_&MO+Chsh1|J+VufDxv-!WZGw1)%KCm*17>y(hJ&53q*jNUQ>@Y_hdR17C^TW|UD zCVK(r^RbQc%$Z>fN*hAE_NSW%(Xp;_(Zqs#FI(D&VA$Y>ObFJ7?WCaQxVj$!{W`P0 zbr(YKJ{h^8T9>V5a0_WsXNT~t`XNE*P)b{IhR)23LKf86`(4w5<2+Iz!1v~ZG!SaC zII0eYMyD9~iwCqGBK90!?GH4D4h6H28?gKgx%`m4-E<&Iul0?(Ljhd3U_BS=go#2q z^cf2RZ5*)G7?R-8A`_PPvpI#ISihHtMQCE0m2fEwAKeee7h<}a0}NgL^CU4mxHm_| zbNnFJNgojG6#4}HleBBvKs|yOgRyuK(YEoEy1qkzlqR20@k47=)ov&@x@xz48g6d` zK40NHDFGS_I@EJL6(lU@Sep6P++fI0p}JvKpg1cxO0-HckMMNNZjSjh5@@8{MdYfh zZiH?O&yio`KE)1wwh@(rSzTwhpB$}zf%wYrOl0np7HfYa41;O2tBq)e-?{MHv+ewd z=qNlZ0j{rQuvCik+4=bBI!|e6Zt)b#eS~wa*H+O*UwVG}{W@r*e zEunv<-TvK>+hJC<)r5)4{|bpXpT@xEu%7Fo7IWB#=n11YVor!~D~gFw^+oBD*E>A8 z`^TS945tpDB0u59Knz!1ml;kHVtXIsqlYmvQgf|@m^UvJJO1aW4!@7_{!QOQ%b)kz zW2ff0x^i?);Nn@Y2iK{&m<>GyI^+Z1KauNcFW;8X7~PEt=ap>k=_ERlBsKXJ<|?{e zdZ_L?(G{kxa&mt4)A@#4EMqVL9kxsW_M$QFU*!OU0k8kOl>D|(4*uKkNW%`*JN`}c z+1XVEV%q3Pne9u^&*V_9%wQEoxSV#%oIY)r_~CWl87JRJerQ1oy6osR#5V21gbq$f zRtoo%lf{L`{Hc(Err0WSDh8KIV(rS#xTxI`q3X_0w1UEl2N8l!>-|xG=o0G7u{%N} z_fSQ?_)vJZtE`mvdOgT_kC5|yd5~E)wQo|7 zYn0Nazu92^*k*$TwVm!`=LyxiT8KMRNSmfpJ)g$Uyrh6&gscRqc&l%Xx)N1a5 zF2ddIS=M)s9gc`89JDyWZKzjUzjqU0kF#XG@?NqB|5A6RQe3dSy6y4oXtMb@;J-J)iRBSehd)`(0j~0|ej*rLM3o9ZEv$7D!vsqP=n2nM9 zI2YZ2K^P?q6XmFE2R%Uk%$YFQ5X5yJ_;cx?a^nrEW5T2(3m%xCGD44*Y1w3YX4s9f zy<+TRW-3_Fyr=l3Gl6R&p@osE1KUmkx3O}X_F||*dv#QaycKwnp8C$zYHUV(p4T zYFy}#`jgYBb)YZGAp~HQnj;7D%lJJ1ty?4)UBpw+@W-J=Q7Iv3{l0*1LqrePakpJ{VPl zn1qmid_<<45M9-*XgS-cTRQE@vq6Iab&sN; zFEEe^x|O*{anY6q*@G@u1@Tmk_?0b}sV%WJCI~8+3 znhos6gT(!!y(ZK!(E_W@kVYCn;Sd3QfcNyb+b_KUUs{&3aEhP#$nN9d1H)e&x(bd& zdo~mx7egUMToEw)pc?3=HZuaQaerz!+X9h zs@km^QFn+qUu(E==vyU$>(%0|UKaL>h8sbUm@7+Ag0)d@tzRj}KQ>L@%8X$mnV8RDcp=ahYV5+!CSyAxNv=YdQT| z3`8utfy2$T(e|pd_?KGl^7I=XQZ?({jX&X6p-Aisf>hLA2zN4$D{{GVkG;}Ix)%w8 zYt63zO$o?t4d$-RcmEzj=WQxr-PxNBtHM>0u*^Pkg8o$IO;j_6K`{ZU@p1j6y z`}Hfb`*D%Ax?Y=fpYQabTJu!QVL-{RJR;AAVBneY?7)ZF`IDo-UDb$FO0{^I{mO6KNkgGqvFVvc+?}}#M+#_}tA8K(R=>6Sc)9vBVUP^{G#Zq5$xOoB~ zKcR}ZwxH*aKT-hoX`u?Ys8bPXFE#L3O$malW5HdHr-}G2{xiV&2<6yq_31#v(*)O1HLjw1X{?K4xP{%n0vQ7e@@{pJut<|51x1b$W31gN~Eu zuZl~lafony|IL%Tflu{-I7TS#wT{EwY4C%T>2O|9G6I^Ve5cNXR(y*vUlH6hu^hON z{CH2eC;_1_2y$&__tos5bjvDT1|zn9sf)aEW6dyy<9&;%KrOe6(nS*#)b@j4Z1Wb(ky3*!lh!D{*zJ{S^@*6B}z0;M_v8k1M%D zL9-_z8Bg(v6G!)Tk=0%88&=U73DovO)#ebIcd;9F+D#$)@fyHsw1n35`a!pLf|g#K zQ}I?(#aF=PITX*XI^EB#^Or$LCCBZ%E6Fulv2y*JK(GoiJDv&#>*Lt6_Bc=?+*?Tt zUie8qbcHofj8t4(^gBY&Sccz*YmxO*iJqG{Upxc!IT{ZqrA`r)raKxfxxTa&Id`UZ!n1{*3N#ORGNuR~epRHd$155&Wp|UTY`D0?m zcw;vW;N(fHD6SXWkFBU`DTL* zU7J8vJZ-f*ZG7(wqEOE}&&-4I8nNi2XUo`4{vB-?$<>^wliqY|2s(E$mt?tS!+MeI zcf#{OHE0?c$l#YP^+E#Kp?@T=wy)HdqTDtCU+`yfg_D1p$^^Wu#4e-fS{9)*D1GbFNlpV)u zGd{c=Y}3WOMOi+_<7xeKX*%X`wvN9 z9(mF#_Rh(BzgIt3K^zytOqIGB6F>2GMwv{B4DgTFZxeQ8(5mf|YI!gVmcHsz{TBf( zJ(bKmiz~^Juyh1v-W`9qgjWB6t4t%q54U;oXFssW=Y)>tnH+8LCfa&|E=B$Dco-O z>o@)gmR=oO68PMYP1T!qNA$P?FdOgu>!0e)I;?lQ340Z650?Eu!j9Z(_*6VKICxh> z7EmMG;?<4MZ^63OKHB?1r>Zvr&3*MZRymEA;?D5%zVAO`b?c3Yi>dEOz{P>*I@v_y zniBf)-)PajS}#^e)ZUgiZAO_&dXJhj-g`G795&mwJt3(oNd@bjKXhE^KR? zGA4)Lb|a9pneWHKok4r@UyY2JkzQg}?gnS1{gnR8=uH{>{65L3i0AqCr_o#!0#8(3 z$3)d&AG0yNM2v`XyMSg19BjvZx+2^0UCD>w|L(t&aL897`^4P;Vm)*kR1^=N0;IA*_Tu<5%h6)B8}o&C@pi8gP+ba zA=#aCk=<>0nZP$^$7Z_%E>%~_lJhlzs?h{rX0=^>HE_82_TTkrQ??@AFlvC_II^iP z@AqPp1e#~d?AzUsHKX>^0_8zFcJ^F6H6O3kjMO&T)OHVBsCr9&FUFoVxsR_It+uH) z9}v3>=guDlkR%X(0bu=rJhFPSTgVwkev$$iwYRDB2rv$n{z{enketxA2AS~TL=?e!9}5Ob0QDv=cL3>d8rhA348Y_- zFyOxBxA&PNv%+7M9&$3P^DRB(dTQ;m({N-w$pI7rGLt3S{(KA&7IX)eWw+cerXJ@` zM!!6!mz%>`s~ZJ{G|Y@xuKfKca*0xp})Ri;>ut#}FWuuq0WWA&--lHYo z0rUiHAhrVUk~M$%3_RlG6t!Osr9dsNZ=Sn_R%2r4+jf@l`miRqY8}cBqRn<6p9;ny zwX)g{oU%VpT=lgJJYj(@+Ki=&SlBt6#j6!wbZQU(yt^a)OAQo#VMK1nra|}ln8c)& zV4m}5?W6U36yi_(MhT77f+oZST<56VFMnO*dDXIpW+k5IBPjTu=j%%cP|uoEydj*3beRuaa!Dh6?b>nA_a=O1TRt?in|juxZ8Vr@46q} z4`;DRNZ4o2?AbH_`Avk1k{l-5TQm>|gem_~Mhygly8_b(zs&IhJ{pyVzVYe|gNf$Zca;-En*DSv_IlLqwJEkq%G(ZGkwox)>^w+$O+fsoHL=e1>9*9f`7rMT8CxL_&^Tevx&h4=q>OP zNd6^?m3FXoDiICO%UHt9bcAkA-6bvNLy$kk5KN-Y@ghX{D`MHz<2hy05;5@YLm&-d zYQMG_tsP!sVbs>X;D$-jUKFA3@U~Sj@OFX@>7_xd>>pj5@77q!14JaZvn7fF39mgo zL=ml)Kk8lOZ4A+b5E#e(IVKxKy=^JtopFc7nAz%f!@9`VM^CYXk*C|EOkO zCTy4XQ4ROMhLAwfr!hfml6s-q90e2G3Prb3mtD1)RW7^@P?Bcs08x3kckiKPGfZ4r z^(=-dK#cpKE^xeMem047mL_hWB64;{+|My2Rd}p@bsg5a9H<@g4JC0CoIXa2KO5OR3N4+Vj2Vpu^lMlKYC8>C@u%Yq}K+rfrA6iq?$ zdx=_Ym=#vPtJCWTW1p}+oT_bHCApAo*{-%)=LA%*S+HrDkDNLua0vs0n?J^LxXWk$ z;EC3)#PV~&A~Dg1V|rIksgZRiaO9=Ecr&AAzFI=-8=UIeHxg;k=wUDTg?5;3=gG-;JOM=}!tP4k!LI(?kt}LC(6BCB zCh^z4y(^F1=)YBiNNQaOLF0C-!3-$kiz!yuRXD zJFiq!bIAebzrDYbKZWGhe_M9{T;(ajwif|zeO(Uz>f3=k{JPXCnArJIjhG{86~``c z=xfKVh~lMjkM$gb>P9SV0Lh`|)|CU>qzot)NOeuR3pHH?vm# z^StG4VCV31GbX%;Ds+3#kg3oxn0lXXuRXqg;=r#rD!x9x^z@g*K&dpkia|CqD6#+p zW65tK9PwQZLwiDe9K{Z7y-f6PU}S%5s*W(a)tDU1VMTn}+U$It-|r>$7Kay=N@GU7 zXghMX6>f683*d?KH@Q{#;t+5{zmn81S$o?bF@SEQltiKyVp4IzRQ-LTwp@%wrTWq& zM&d~}14^2Y$%GPRv$^Gk0Zox!AeEcfI)4X>a_E}u_8uErenhL#Ta|AovYEu-rgy9} zMjm?uLK+$x@%ad-IBpO+0Z?a1cJa-}Q9q5w6G#)(DvuW4gpsQm-x(B|PWCK36?pto zdkeAjq=o3Cd50DZwrke4N5sxz!~3f&46!g$TOmDCgqL8S+bNXm;|YZmOY-)ux0}hD zn<}}wsm}k#{zWMX?I)i^eD_}F9Vof$#8Y>|&y63Z?>6s;V;1f-eysbY9M=}^gk!*&6 z_AkQpZ{5!adFbhX@!*;edkaah*YQRxcE2V>6UC{Yf%|+$I;H(;*UNLg&hQDnGB0t) z|Fe;Bvs;ph+im8hfY+EOIj|#SrU$-HbAe4^eWKR<6cD-eDq2m=xPfbmz-|txxURX?S>G~A&ytM2UWPJW_v#r-A)M~!5b`2fNi&< zmT1|D6m#fpSq9ffogB8Y)zjXh58XZ?AtA^g4xuiYwTdYkhKWW31a6_qQqpa7=NKdjnHE$& zoBhdq5XwYr`C3Z}!>C%G;B-qI%h5ce^3Gi!pTPGw73mO3n0wt{dah5puq+#AGpVWw z{$#xqxrwM&lqu{V6&0g*xU}naWS~ib{AN9o=9MkjJoh$2l#sY)jLfQBKzd89d@8!d zOBeA-b`8EA;~%~G5X0wY)agWyLq7^#76bnKJnZm!z2xwz`ej1U{?qra^NgE?U(fW4 z9VU$ocXWGKX?>ZiFH^tgGmN%%&2?AKEi5cR{;Guyl8AZfVb&#G%=%h8znB~bri-=A z5YH(1f?vqi43f&>m$;PE_TFCp&EvRsX8g;!fRoNX zk?={zDDgNp%_xpXv?m1r2WSHB8)@$3d7E6STZmNL_{44D<>j*g;9|^QV+mcH2QO)q zYc_el4Z28WcAVGn!hjQ zwn{DMw#qctUT0WI!`e@6_ZnL$8-ghePhr-exnKVxY>0U_)|AUy{S5lvpNxmeT6C3v zVxgGz&zVNJ`~+PQ83zr6?jaRUe$^-cVGm0#{2%S?Ri1_zjt?2zI~;H`23_k55(GQ z;DE4T%b^xA=0-l%Vx0G?bE+GUFr4TLrB_^$?J0X_QyjH*t=f0C-8inV+&~hi;nXi2 zAt)*ie*6TAhusQLX$wD6EtJ{OxC=va)(6du+7XI!{*Dq-tD+MqsEhP>7_#H~KcF)}BN`cUmtpb zudE=%FZLWK!FFDlbMF|8=O#}@kcI58!$nGA)Ti4l^ti$?m-}rr$Lg2)SI8JPG59sd zOZMP9My?Y|M{>g9XHJ>=qG0>4tRMos6M998p1uftkUyallKAIdQ!FUoW$Jg+ z_%x7WMueE|8_605>mQ5g))bt`sHiHxq3MZTqKV5ajDz(j%-?S97kVeHrX&x<<+C26 zFuw!ha%MC`pv+xI67;O_Npj#fsw(7GDff5EbDOSA&KrW`qrAt5=u;D+*5%Wz!{_?E z&JD9^TBF2G@au2!hMu9?LOBQr|9E`*z)+p_Crc7ZA!qCbB5 zNnrUtR1zhXB3N=&-|tIZovfB+3!U88r3w@RyWjYvc9!i>Qa&)mo~?C=ldnHg5cP&d za!%MU+oWuyuTmvHSip_v)7))$m^}yw-vva%Wg1C+Nc-O>uBDHrcbe}*;>`NY%GM3m zFp9N=!wiYq#q2PNF%GZZIe_s$8wH=N>?%zX@ReMKv$?Xo$G80KPLz<2ATf)4WXJ9% z6zUVc#PC;Pz9gSHEm!4ps*os(*640SqvM86XHx0lwwE&9Cm+lamPFUnA4p{~rdWMH zt5*%yY{`E&?}~!JbAkydtUi0A&Tb1eo1lgYcWaj^T5nNo0WY583P;nvaOPAq^G~ah zoRZC1$Vw@RPvMaDo58rNGhywuWE{CyZMO0LgPZN2q33%06{YolWmUp?b`t|r9i9K- zxC@Vj#Z08?5uE zN1T>9xOCZ^FqtJgmbZ{RLYHEqQ1sWC0I%%?Tg!1aZ8u#0FKDB5#mbIMrY<{f^@Ld6 zG>3FocvgXT41~p62#tNWG84{Sp%i|eQ7b&j6yaQzHVZnwp^cF^75(&LQr&YGFP z<2mD*;8~TB2m~_9Cs)hK8)xZHK^DhH0DNP$C1M4Nm zei5Oo%+moEv0RP^n=s?F4zDZ4yV9d7iE2y1%F;!R=*ZrXfnN0oIJ%i>xxV1S!~DgV zqXuk$+3v8FM=Rx4c(25KuW9sO7sGMeS;xJ^DVzP-rR{EbK)8w_z7A&J*h<~y_#p5` z%r$89o7FPr_x(2#dizA*(SD^b68z`^*p=O#yRIxG7aLwqd z%<2Ir`_o^ua?6CoYK z+S&CGxr9=DJ&z_*{cqE>T*3*67hK%pIO|RrzPKb_Dr`O*()?e5tB+9F$|Pxf0ZIK= zlh6E)7j%2gmPq*3QJQY=xPVPkvBS%$SzXFtHfg=*iq%r@214Htx3;1m5nWi$da89m zz0`H=m#aCO;x4xoR)xX7(W@1Q@CDEP;fQVz$ZUDO^+7f*bEXp~ju9SCqhR#5k}Mxk zm@FyyeB_8W0+0Nl-*VQ2z-9-FRJE?Z2E~9=1%r%_oPd#7Qr6f3fF|SFIQds zj?e0G#`A~xbt+uM4q|4J_^Kr-WrjYv=X4)*o0lQf(rdvz-e;#;=q`_PdDcA~+@~(3 zmy1>iU49SsoNYSIL>r4Q9ZWhI9~fJl|MZ4NwHe>#+Yvvjn8GJ`vCnZiue+4iwiW#P z2h+}zZP535Ur2_%F7Yt+>{C+pc5S-wX%bGKzKhp*b@d+`rvz~y|(%McceA~(wgU-jNq{YX%)L$8$ZEOUcyHU<^}+Y1T36?4Z(J9uJtHU= zs?fCk<4w*$Yw1`;T9azMMDMtHLzY4}d`-*hVwsJBKD8}b@f?cJA6Y$|u#j=70!91x zL@?yyUK1SL*+_?{D_&opi(hu0=|GvKp0%b+j8altOJnR^)ZY-da(pbbZ-2eB>ge2@ zS86Z!Y6_j5d)lJgP~})MMG=e;7=d_=p0k{urrgI4Ij8kfz|%DV`PbVnv$`camB}dv z*Sw_JYH>~GCK#cr9Y))_3OspMQTgC(3>0#hrRsL}X1R~Q#7Bb7G8g4&g<~ql5#MEL zFsjXvOf+EJPtNUQ!*d0kI8eYq4jThfDclFA@&x~Thq)oKVQ)#EpuLe# zsewk2&t*^k6gwvxhRH983deaS!=5zJJ1~@U*a#fKpU7967;U-SX(4_}`vowj9g))} zvquD^^gE4?O)#-8l(I&e^KE`e5&`ku*R+MV4PpIuTFD$VnI0h5F`SPw7T= z-fhKr+`;_%eC)9ow4w_aQGMUY+Yw&x^W~=*G^#OP&CVSoW}%4`p?z=UV}t|O?dVby zXR|h-v-|ZS5vgM1Np}HS%eG`MOmhWD##{I={M#<<8{P5;1HywOgeiW%(|%sW`10pF zXew=WH$pplJ>4x!=zyqlqKx5?rxtZwd)&#z zv)<9i)o65kcT~G$L(3pERf@1Ds@^z~bB*b#OGsEevaYs(|JQ=%LgB$TrEK9jxD1>U z+_wDs2&d8Smm0s*U#kY2*)2@rn3SBHI*ZuwS*@V+VSD!Cu4e)la_QXX+c7`tw_tA~ z1Y0i`G2F$ghoV|fC3`h>LubXd0y;{^bCI6DB(zj=9MUSJ(~zMOU3>JW3yN7#_lTW8 zza0UK&o!;zm;lv0|Bs)=S|>|)jelk5Jb`mE%B|Dhu-HZ|`&~b=15ZSQwK!LSIpcrH z$F8=NppXe2X#I+;>9NMTOxyB_6NWW93s)_Z5u3elr)N48EApfH^@rM2M2flMH6UF7 zJRa#u&&Cq*SR_UAl3(yNHc+vw0UEw#c_ldXoQ6|~K6=d*(~QaZnTlcn zqyM?9?8(G{t`m~Eb>af;*V1#@zU$0`bIj}g&lF~vlazj$vfkdUzc!mUcIFf7@lX4X z&4Agmf0uu1u`FHePrRy&yqc*8O%v}s8Yx3j(GMq*7aH&hA09VtdR{kdu?Rp8O;;ag zBb8;CwT00|_h%Yq7zYy4qYO@HxS*o&Y=G>nLQD)@j1*c<6=*So$Nbwn>Z|?FW2{u& z$q?h+U~b*`1Nk)j5|4eiHj}TsqO4<X+3cvxxeDmy>S`qRyx8-ZG4Db9 zfBp{LNYbfaMlnp6G##hKvoE>4r+3+Z)=Pw_jhI0x+n>H`{p%tTkv-w|))c%#xUhQ#?U~>Q%x03dtsArL4^lCl z$~>nl?A|=lOD9J8WYI!PUXtghgH`5q?9(4l7Q>cnC8@Yd`dS`;?ro*C)i>$F+HnN> zfBjYfUq;T)kHGS_7YU8Ev@Gkob+N<<6@Q_skKUW}i)p<8zBF^hxQN|y-1qPxuiN6Q zmiqOz>2p|ukEAk^#9zD}#QA2Ym|MR}6vj^DpeEH50iRlMQ1Lp-yR1)JxR+E7lwLWA z%MF%DsI6I9IaKJYoE7x{9>I$5BL>_3b91mAqf+)45gDIwe561Dp^0}#kDEaDK5Yft zg$Qx_g&$g|W>*Ck=12VussY3X8jd1?<=jNvAb*a0Zy%HAIX{6zAPV)07Ty0;FiM) z9^83@ef;mbYm&%#A`WY{y~&6rX?Be{ZA9@ZF(s}8>Z!tG*gHQc0bvT>6uoNygxq%n zbtJsmTbT{(S!2~+&E&WKzQ1L$gO2y`+=)Ho#xbp~047I!cT{~+x*QVgUvzQNnDdG3 z?oz+X!Cqx$^t8W4H_8To$rS4^YaH|;Uzcg|8|)sNGLXd|n;OkFOG;u~-p{o$k5jyn zd~XiIbiN$gKR(89PZ+{$V5Kc`ki)QCqOkNPU=Ps!pC} zxvW1@aC6nl+E{Bw>=1S0XD&sN+ig-a_n7@`Tn^mevg4T5?F3hF=e5UEacGL(7j9=m zzau_=jcKa2AMbE_dHX7!tRFsK`VglCS)3;tKoPqN%t>V4NkfgJp2=posiY>r{M8BL zjjd)r;v)R@6h5j{Nt^In_k%L5WN>?`<<>hRkmuh*0v7_|IXfQzH0_E3vRVn?InU3{A zpcl)5X8Hw}q4DN^;v``ytuKP>cbds z;2HZ;lRs%LrXVh|xpxbijC~H5eZ2SRFys~L$SGlSFImKRiv0HUa5XU|f~w~kGvWCq zuUT_uJNEinXF|D1J!cweLKk+-l>V;&p+*Nzhx5feyfyZq!?uhNy)i32%6HUct>|Tb ze2ng}iAV@%oq#Wpklu@e2oOcNyyC%PdX}k<-k&>-!8(ZF2f0E1^oo2Nn@4X=h1cx( z+41#j1&G~09h8eSUneURa0EWooJ~*b(I}PA4ub>x$isDml;%X%iTo}6yX%2>4tdQ= zSp1eRKZv88W7K;U)bb&CLP6!oSnr9g&V|C2|6|^NUrS073~StyT`ha}<&@)f;&mk| zG7@dX7pyzy!M$>?5)}?qjpbztDdSi#9;~Z!G=)sDYr8UQ^9{UH&LK}}g9F3XSd8AA zmmHOJ5rR~Xt&b5t=)u{d4h!Pnko+GMR&`ep%S+e!d5LZ2BIo6hpIU1Rbtv2(xQ*YM zVu1>gck^w_z^gUASPR~$?N>*DU|PFVx#@9dGKN@MB~~$}41KKMFstb`Y-%7az6P%ul*hJvIF#Ct(tE(!^%?FYZ{X_Zen=)n zF>F5`i!yZ3H$SPLgwB;z042)xAz8h>bbEv|sX+McClQWyf%UY%3px%u2RqJ;M~hMW zFHk>Ne@{@R`&U42`S}X>T6N`i#FCJeRnEgNjNX`&9>@8|LQ7@(O>lduGHWCz;;WB4 z+>1pv!=eA8S?>!&Q-x#f5AJC;NOX-ik!#5TV+GD%lvSlZBn1B=A0Xdg@kl6vR+uig zmrSl<+Z2086eH_~jIo*wOvo>Isv>{E`z}7c;-4OG!!MCu=>oU?#>(V2?1TqLy;H0( zFz!c^hi6ErFQ;TZaci;a1wPt>%&s z!r=Dk#KbZpRpbrDndhyYZ;V{-&dtKQd&l3v6*c&JJsAru9^2ZzIBxjJU!3c!^-zzU zncfe2#7T8fmVC%XT!oF)MI{OLPu`uZgkjN1EG+6|5ieu~B`GG*9!GtI%dhfm)g@8v za`?tE*S>-=lOuIt=p)T6w9SWdrguT;ujXAOYkiSes=X>K<2@E|66)Qle9M=#0f`Ww zjQ+(KKu;0eequ{`bznbcfJgs(iig`dE-9U?V7z6FxS4{FzB8dzd28JBkn(ezN>=k} z21e3ZeGRG$jjGjZ(lJ%(^&Kf9Gf$FIkVlg#xzC&SQaR?mbGqqsKpITMDgG<6jwJ?Zqgt1gqJ3EH17 zg#4ZJobxcI+Y8Pu`l{$1?q7vqsf=iXDQ zwXb>0;NUaiA4P_$nk`iHG947O!?xH*{Kje@2tl9Zok5>;Pia)wJAD|9zN@l6D{#3m z@>g}Woe#T!pK zwN!RBD!-l>KK&fyn=6gOxQw73uN8w3iJ5BB@>Lz#(;oSm0G$Eh zyvmVYO3KIgqbKcp0f8YL1mYu#KaZ$#b0QGJWmn7pMBPM*y)p%77Z=HpeYz+Zx9X@b zIH9{?tLS%7ryqCGg5>;H6R3C=`296BJs*Kfl~IQpI$>p1?DFF;$EH296pkwye-=E+ zIse4;Z=C`HH-4aNoSs*ghISgzI0vY9<;AdMJBm0rdt~m@EYW5(PfhOte9VmvRVUs8)J$@t1O zNl$r=B%5hx-<%&O3s3o0Z^0PW*i<7!?28dbAE})fRbRKF-l&HP+w}OIhY*2H4R2;* z$5qwqM|i$`!Qa>-bj77fu#$a#!CY$G<|8>%plRk_F20z;l zc?Jzmu|XuHFq(PcxR^i7H>m!yE4tKHuWtyPMot&w;_)-yhc`1L9X1PP>|TCKWqRL> z<#-y@yat#4vn8Rlo`-LsDyP$DLc6Z+AzwLffsIt0%jITmU#l9ypI%alV99)fUMTg9 z=1gtU&4Y`G`fcL{CHd_(UZgP2BMqsxJDoTcghsF+D{0vYEYEL3kZ}fo8p!x@#kg!* zCO)Rjo6ybP$bH{bsYZ*}wU)4d<@$s{ap}PAWAc4ZP*kZmo(m&+FvXY75-|&;ra+}> zm+XD85$Em-|6a<^KokMRpIBQNzV|eQvi|t)R1&1KxuV|8R^xqDIq!tGI_=qfHjy$2 zoqca`8n6HU=c*(WDmO4G*#3m_^j!tKg(X87S9cILNpExepv2GGOlFu2+}Jo6ottRl7owc3#DlPdFPkMyPcaczaTa!w85^?QYb zyVuxqqqLA{?QYKxZa8^ED2QwL=aDTaZN56^jrD(W5cBdN;}gHmq_pu}r~-fe=Zk|$ zg!kNod=R9VJ${wJur0OKCu-k|=S-AU;jW!vfs9}jk|7#ua65$KLh;|qEDXsfrT)5P zpVR-We~C3iC_IhsO-X!AQhL4m^6_4kw+>mi_55rf`Nz8a5@9fZXO$})Jp%ashGu#Y zc@mQcu}@vF2yRg?l@T604QozKRAm&RVME+FoPcu9ail5MN6EAzK{L(_a!U_t+hoza zZ%IQI;?k0fmj_1zURf64;P?Q)rMFAZV@EddDsNtx8{b3^`D3pN5Rz>pEu%km`x86o z+h7qC=PUkAtxfx+g?xL_NG>V$^>82Ys?4J6#Nm^_F@sn80lzOwZu3 z8kuEibv7jXp`v`n51F!AroDB?MCGM5kFw#h@;sxMD;`*&N^h(z`<*fnsvuZBrefqsQg`DkKQ=}g72LVL@`zuJCJCfI1=RKM`szj0vE;{77@)}i#uuGpQ>bwr=3 zGrC6q4bGFqgdK$LG9i#-=;NIfk*y`W?ymi%q5CYq*{nk4zO0iZ#jo9c>Co8j*no4BLS@r%8vK}Br*+8QH>)(GqKl-76`e33<0c@s;qN89 z#s-1@i=O<}qphLQGO+vHtG~@r*CO8^;2QH z`p@jR-aY`Ul$MrG=I&%IpAT~Csginq&vC1_iW~b4AZtN};<*+8`J-B^LzW(1QJWB! z8unI>k@)eMjOE<5wgt1RCN$hbcJ)>g_scwXb6qu9i`zzZ`qj3jzr6n>k&SWaOHsbJ zfAC7n&{1+qN}1Y>dYmXL@mG$m&00IUy+iBI$0dZk!W<~7T3T;FEw{5$E05oP)cQn; zZSQ4}9YsG!X=w~JGW7y({4m(b%zQJ)Lhe=5ki0Sx+<7TKSJx7&+zGZ;G2 zyW*MR;Z^JjS+$bag-u8D#Qk|DNepptvlxj897;n19dysmJ zRU{M=GXD#Z^oY2Sc>%wCm|9giUr!$YJ5l~=1%6jjt?S02}Lppm)SqwtAFCP zNh)F4Zbi;)^Mjbks2uD2erS4x=vQ}u#Bu#;6-_;!Y9^w(+wAB z56QlWA=>2s-U zbyjT6p9ER;muzt_|Isc^X_3(Ih#Of_MJuzliuB9T9OB13Y@cvMu_VF!-W(QTL-vFa zKa@H2J}P`K?&xGf*VHlI*3eRHpxaA(nNDHSw&!`29h0W0sw}Q^&crePJ2xc?IB$Lf z+gjxtH92A*nR`jr39xIzEQ>$qUHO&8@*K9<}D4x}42=Pr>JuZU(#cUDm>C z&OC*1HfKB?h~x?YJN4Y*F`C@n)D4A=}M<4X@D|(I_WEr<9 zeSWs1a+2I!qJH#%dI&>j9-^JBhgf$UB(?RlHslhpd^x8(c~M8VGh&}%fu>oZS4NMh zL}~I8BL?7AxvjP1e*%pg%J53CX0`!s(!jAp0F@)D(lxLXnJ-qU2BEf#`~xkJqQi~uH<95caBkg&6(cy0T~B8sJ-J(zWwf2$RvPN-b-qBJA0wtIpN$7z(=RK z^uGl~2_}e|3F`5GlPX^|;C1I?9R~n8nSC!t^q8CTtqHwA6O9ObA1#gTH9LKvf9%xd zn^`dVw*nhg}#dOeW{B>O!Kq+!-}}G6>i0 znD@%$hx6jRAHI7IfI~z-ssUd3egc~-H_RfSHV^Y(b9Cgj!0!Lr_0~D!QEZ?LtKy^D zuSoA9ozHXC|tf5-4$h%Mxke}Dky*lj-elx8BvEt;(XtUhBwI7 z<8B)lq2@VVx4I5yWY_X@PRb4*wN^=;O)~?D?Y%}G{a8jb2cgQTZR*bC=#`yBKUv-M zRBd$7Q0E& zfB?$m+p{uHAk9*+W7rq|xrj-FjS*LxV<<(Rl`NMHU{~2~sgie1le%2I?A)lo)v(#e z4OCSFj3@ z&z=r7cOrg5@a-z6uMocOf*%Q47PpAc-^WtBW(vh22f+MhFFN&Z_PJF=e&V{;o_csr zc(AXdJbaaBpU$>KO|G~XRon#l1L>q5M6vyH&X?&9;y5LVQS&~|1W9a-=AO>i6O%l8 zi$1M`{Hd)T5muaksV8iq+46NUhKYG~Yg9nDHztt~I_u!2>8&W6KqyMI{gO)E-5>7(F{fbScL ztSF^krK-D61TNO7PApwA-+)Ll(!i?~d@s0XU&G;!=k%ZtUOkL`R^ z)O}mxA-i!j;RrEt_L$f>c+Ra8zUJ4x3rq6#Tka>3S5aV6fxqGc zgV2Ri+qxr>82GFJ&qJ&8$74fr(;PS;Zy#A zapk+(ar|18Xu7w@TbpzjG*b**R?D)O*GboCPmk9u|GJ?-#Q!P9qkglS-y(p$$el{| zcz{a}6#lZ=4$?t%zTOPzf{I;~uTwam_?TnRP;qVXvgUO$?d^typzl#z2`)!_ZXIi? zV0QgcHA(5~K(k33J&m(@_+Qo<*Em;b4zM0A&o`t4(ve;dy;e5r9Zrlrv9qko7z86$ z#z`;LRdc~l$W|`VP%|hyw4A!<{+pfZO zvm6@Lt(@RQ2tt^m2rfox9Wiop;>Pq_+bv-91C>#23C9ePKM*VfUa#92gTU+V$JyUn zyY99Ix~rMxDR?Hb_tKLZ1!8cOiiso=Zp0&KpNlK(shnJ# zj8AviPWUgKu;%1e)|({~5ew5>nu90eP$7$h#B`y;WHZoO zaOm<0wS&~mvy>oqEIZ_xgtsw9(a#>v6B)K*3zr028cOVz*IHk)-a{ z%MZ<6wu36P57V`9_;aGKMrCDwkxfN>=_lq7)pCm=Tsm2Hent(JH2dqVlnMvM3R$s@_4vUlJWH$V$&5W8)Aidg9CszS~7{*J9Ro}D;D zS2smy%2N@!D7bczve$|GoGs^tOEOPpKQuUq^mrM z@L&L)6H~0)s?&O~M!$Mu7^E^MZDqo)PbG5H1nkV+e&QdA^y4p>dcO@D)>`SFJsU3g z1GE&Q!on=?<4Q(+m+*`74njYgD+A+f@a!hzuFBgsJ<5w|L0p3GJkIL42dE^f>^M*j zCj<7`mP^N3>&EF1qH^wP9{)2m`8>Jw+Vf`l#3Ujf}^>O-(dy3gU?gmgsCOa%`k z)shzQhhQb)8c!nXNUHGfKm-%)#7gMNG#u1z+4*Fq91&z4zw*?yZ^3ntEiyc@1f(ID zd!P(6uGG#9rLbc9M;USadryiEyGVL!_l>+JhLzu`!M;q^aPbJG#PGw~xSfe~><4Or z9Q`6BzQI|{*x6cA6X;l|Nx;rWESsa`FL)4gEXr3a32Ke zGi1~7TvNGDDUc!_v$Qe$NDPi3!v+jnn(^{Gt4-&RYVtcBeI+L=3v5bUdmgBNDTND; z8RHiwT)LIJ5DZd~Kms@ZEtz^WBxlJ+#V4y^^2gtU@<(AZ@UGO7(8^2x>bKT-ZV>?q z{^~j&?4sJBQhIvz`z9994ph0(79oFTR(5{qeXZgLMWpsC#@UDL;k*)=#35HwNo4=D z*srt?`pDKH@x|%-)aY$M+9|zod5MewN@erxJJ)GCQ~o^0VFq&CSHX|}+0U*v)<1R= z7MD|^XDnMJO-Y~VT0DZ{Ww^RLtgz~3a8Li<;g5sW#!&vz*0234gbK^ zr`Hq0yE)0}FY{Y}6|~oRF5B=TjsReWSbaaWvaX>Qk^2^KI+q(Hy;UYr;osUuFBh~w zl)tNdQqu~V=Bl^=nn|5(&Z=LH9`rSMD0q1xGvnh*yE{YGaAP@?8KukYUWwoS`2MG; z6XC2jN`D{)*qn%YgQzrAG`nx5JUnWDo|CMxQCQdAcc0FTI)UnsZ)jLT`T&k>LH52I zU7|*Tew{FtJm%ryT4+xHXk?=?E@LPbJIHk;&!`+Qi*t`69bN>TQd>m`2d=u>2TjAe z9bDy955PPl=d!ZfA<%bxwgRC1+FCI@-1XID3QwH6Jn9Skz{m9c`J|8EX^;#}d!p!# z)a%igo2whig`KtxrT#~Z|3{_9#9X&*1ilQPZ!^*yb9_^RHV% zt();Y?#p(>a{~b=DKf}nFg9)b@N_|u0pXLg*{><}0B43d;l&AogEEN>{YgxIgM~45 z%B1Aos{QJBbBc;|xq#9ImmeX>`Ip87jPC+58i1={;ob z=2$(`5u7C?H2Y6*1p(#-U2~HLGRx{EV*O!rj{s&S+%sf^KK+qmjHML+K@+kH0S12) z?TcWJ28moXFmPb)q%`vf?*A21DU9W$O?#@;n;y-@pSNd}BV_QT(Y#QKJXWS+{#-JB z9Mx47e|-}3II6V!L6qTH46CTV8Ny>*{P%}QYLnY^v)e89JZ`SPtm52R@EO;3GYPZ- z(*qBR3o!gbr%$Eb$_g`eEaUM-_5TX1hl<{1U1U~e4HX)FL257s|L(p?K zSp!ZM&Oaz9{A2-XKq|mK34{cMG5j)yGoi9O_R4&(*EYAa+u?o>*RK&ZjDRulC;-*( zOmU%h7yX{#8}yPdl=?++Lqcvyp?QTx&`2 zD>IH~jUwR4a%f(NcM-x2Z#m1YYH37l7aWawmvhFY3w-xJA#YXU5hKohm=Mbh z0fxR7YHpHcHv-a2lO`2S(mv9aDGi`|nQS()Y*qY6gvbZeG03)Bu4;R5q-jIw_BN=i zt<4>-FQ~1h09;rWC_(=frv?yLxX7qW40i}1O?N>!OHr;C!3SR-s%B2WTGc!?N!3uu= zX^+$TwZo)smjIIf^8VLkvf2rcK^sBOf7-!-G;1KY}PL!=;9zKJw(K6b|U6=-RP;v ziEy!X5$?-lTxZCxerHb#ao#`*F{9Cp;^`qeITFzLw#9SdSIjmzwS_$HVfSYmizl9W z2>Bq}-oQN?7NJGF9lbc?H;0hb8j``@RIYhmD;Jfz<9^s(s;%5L%H}bj{XZ4}n16yp+A7+U$ERa zR{4STuBeMfq$DTZVZD=xAAExV8tu9lX$R_XP&csRH=yewCwD|x7BLf8X|C0{?h(2W z*_n6XaQ^qhZ8KBbG3z$hbg@NsjA()Y1b(r>2T-l>+={(s(U$T5O&-Ea05d3AP3{%G@iK;<9eWW1kQ3~>;p-2D zbceC@a;NK$ttDV^QJ^AEu2?dF>gZ|yiE<-ToB&_6VK zkf)m-Q{vZLdv^$B=&&|2zVY~4X7#?nMo#88Y&+GC4C{(Vlu=cAuhFb+dnw``kWBO2 zNr6dEcz;+_lB6xKrFIP~6?! z-Q8USCAdp){lk0j|GyS2CK(_%H*?R~_w0T4yo63(jk^n>FjGC>P%5n$qmmY7SXZ3Z zr4jE1j;@8*rBvMgl;K#Kjy4Im>KV|{ch|Mn|18D_i=o5gqu#3FLb59bycfGBsG)o~ z<6s?lpgW9<8F&XPo*}uwr9JV6Z!-oaI@tA#`l)WFKRcs0KK>!VG$X4trEvnSf+#L_ zd~aJD*RI$wx7`37Q=K0N_1tyN-~4Tg5aIOnflt&EF(*S_DQuOF+N)zl zE>$Sh?QN$XkFGz#nYWG|`PTAz>b86~(Fe>cWk^=lQ$Y53%SH>Std%nfu)>rc9Bg{> zdRnx!cgYWQds8LFcUp)g&(MihKMmb!$f$gXYQOXk75I!G5U?a{Vze7__Skq8yDmRb zQi2}DzNl|ANJ^W!Xq!nTEs>6~W@<((#NiN)&%b1+DCKgt5V_Emnx+n2!1X4ixL>Y% zcMmk&$+&o z@S6pfC4mdv@vR9bBY}m&LAM2zfjb{lCZLyY24T%=B(C>C)3B*#XM5w1S9-st@cx zg;6CK)k*9;oMP_fC262KgbVccDMu1lg~R^^x}!?~ABJtyJRk_YAMPXxb-Nt-wkG)P z1c*Iuo0G_YiBZ}FZz&WyIMs^oOP3OxNxFcq8vYnUl}h7aH)MKx0M`>VK!Q?e_AiWc!27M&y)v(vWrrqI+0Ou z`O7KYyr$C0g#wRWefc^G0di1fQ7a;mhQH%_f@DwkHx9bzQSs5C!)ObJXko@Uj7>k?GgO#h~_? zakR;pCi!XyFmQn3=f(GmP4;aDyDk(tv=nfJ*fxYo&N><)`p2rrR$@t~v;h_#z!APf zErrM+Ok>zDJej;|Sz<4*!d)4$TRd*Y1MAlm-MYLQNWT>0^t7P^Ygb& z$t=G@bvumdiy8xqXj|K_kL4L3fC1P)fF8Ppvfon--gO0GQ)3;xi3y(IB-A zh0Y6fbHITBir6gs*-wmF5rGNl7y(@$_zLJzAN;;A>ggY@$oTss`D3@{`eg^nR_tiT zORm<152Q5_n7BE3Vg&)$ZrMoW-?@x6N!D;f-=ac4G)K}oY@1nR)wB%t(gkn*lYuP_eAU=bn=%IMa2>IZl|MYB5>=m$d9zd$Hl>bUb_pP+6l2Bdpan^ zGayspb{j38Yb%R^=_6h`>xdBMmQz5ZpIFU^u!xW|Muv59MjWfj3bW2SU|d)5#rorj z6I<8uKcooI_eHCXfL4dCj{~Q^ka++!9K~c<^&{Osc7G?suyzFp=3Z0G01X49PHS`H z1CtGeoM^V?jyk1S)9XM7fw|IxK91x3{WiV96!%_MjX4I>9dSSKoi+Z%*b{@rwO_a}GN)7E>cEDF{Z9RY*BJ-?V3 zU;gWuA?p+D9}@)?D<`RX>c#O2dmvEh;*w07p8BV}LRvY(G@4Dc3mFCY;UrL7hoj(V zwL@se#QN2T_$cqsn&)F8jZ$ z!@HU}5!GkIzgDD=1^EE&t{@>{3cZMhXsya@>Nru*3#nmy}Wc=C8n|cO{@@6~1u~ zH4JXb5PE~yq&+o8tK&Z-I$`^n&_Y;@HA|#Bcj7n1$J)SAQ@d=P9ba<<>-3z1Zj*3+%c>W`P z3$*S5A_``JfT7m<)S3zfx(ti}X)@iT@&j7J&s_uHSQe-l1{nSC% z3A7JpC+~YXMqYDXMNu9lp}d~+TrpgSeR}DoXyZdK_SIYx!df4U8`0W0SAQH)P4BLb zE7%IPCIBpnI44@b|n?gSrZc!=zP!IZsD?6z2*R><+lI>VOY%o~+ST_dp*x7&Z)J@e7^BlV= zIlKSDl=M8BfX64vLxpJFXIQod%V;V8@lIy#Q)Cb^LthL9{@Ix$Y84bftDA2vPMw{V zcy@Rn@Q9H9M09xHXoi1s#s&SGg&7;pf4Qle=g{$W^1~H!t^jUFOsR^U!?i=4VJX#w*9o($8xN z^zFln%UgNORJm!_S_@aObK5j{@eaI_mF0g#)1y#6ou>%b)@UjoK$->N76^3rP-s9zFIc#?b7#RkH zTyc*Ca>4bG4r>-0g*kp954{KAvqf0O-nMSQiBl)!mx)CO?6S5)Lt``8+*+4J(L3*i z&f1q*#R^ zVoNEcU8|h6{`3Jl!rO6Z=2q2bDQo#RHqQJ4zW*p0ye6ooZ10aAks20Gxz?CayxR*A zOrw#TiJ46TR>xy(4)$1=&%3Qn$~aOVH2M7O>$4-@OUOf!Wia|dLZ)e0QuWg?ae$pMoE+sIkY(>)n9$Dm2(BLDPfDV9+mM3D6?(M zFd9`s1JpbNsMgrNI2Ud?dGD*^*wVFD$LK1mtjq&$77dvg31O|b4fnPp zO$_>0qY9w|uGm+`v(wJdFCl-PY6r?Pn&VE?v;!*R(?(GFC*_h#zaH3x#%0MNH%`dF z0Hau+S<>a;FNg1_z-@9w6Q$eBPUNE9DgA>W<)33;)9p3%$ELES2uyxJ$4D5~HXfSR z=Fyt+=bzf_eXg8}+M1P>iAfsPPg?LXo9|Uz&TBWqVEc^*vE1yHnI$9P$X7^ne!_0= zszo-ww|4fI5vgfd)!EIu`lCqfklx9@{>2AaT9?^3($nx)`1YPzt@y3;)vv@1`rD@Bcevf+=7h zl|~uoS@aoW#H>k{s4FHV9~zVxHx~9QI%CXDe((y4q6y3V`f^rZ3f0wQzCx9%J21j>oaWd>cd1Z!fSIaCR9B=3hNoF1 zeK1q_w>l;`WaJ9ls@3S6!?vX$|0Lu%X+x%FsTBgKU7c zAvp*m=K=(3Q{=c`AiUwt-N{>GN+qDg>xZ;oeYzRejaM^80*_9HeKj5Dm&*oMHIM0f zoY!IC@l)uun!ppeuco$cfKO$}CjP|TV!2jeOJ;{tp8kvzcS=H6#DvD1M-%dUeqQe& z5?vlC5(gpYUv=(w;3kUVDX;6Gan0>z53rIcuomB?9BbFe-QeXVHF}4bu~d zI^YchPzwVuoGE!IN_8IoxRC^k2s*>vV%Fc66M6UJzFgEXd0?1e{BTZ5<4p3n4O?`gT>CG`; z@)F_nN|e}*ZSMs9a^ZNQLbb}rYnB{c8Ncpw&wybh;PN$SbKjgmc*ay)Keol}e18DehRF*WKn%U|T)^ivtQKSh8~(!a zB4PUS@D^YZqSEwl*8L6TNzp(n+(X?0zKrq+T6ts0HGqqt{dulHE7eSAxgiGs+z-Q`K77RS zdidx#t)bpc_<=DyUOHRe@T6|t0753vRplv3{`ep%X^>PLSW)FZw{2HJd`!9HqtduJ zRv3i@w27{*9`z=S82R!Ww@c0LuPSOCl9Id}*tT#p?H(k4MqZo7)nm;pH05PqIO>kb zxavZdi1gtLdA(LDB#hxR6pH zmH6_UWk!te&G_Y0l$wRp#{u=oh)LmHgECG2_LSihmvrU5l9^rHYm<>s*TFtP(g6!^ za7>MEWtO2ROL6I$bXd-Q~pJlPU|5I|F<|RRcyWaNz=pjHZ32)%oWX#TyAY ze4KZOaz{BfseF#SsQ6#MojB!dDY!?vVk+RH;Ar#DOef2)U|hZ6g%f%IfD=mcqR-*} zS`gi8j4P5UPx*we#k%vRH`9?;DQGU9dfA-Z9T@^9%KmoG#@Y#pRg=yY&8yX8VU8zT zhPa4#asgm^RkyF3+x>57ecJvYRE=v$&cc^FZ#ovC+W~4MZi^xo!*b9!S3ogzp1rnM zC}(VQzoLoKzQd4X1-PVU?b}!c?4ApUGEf={U9)g{#jnWXC^pTCohI-Hr9zeSwp08k z;tdtq3HE5hvw}XdM43yiGHr~^QFco!6pw%rI}FpM6H6~dKZMv-&%)Hyq4m~D;~Nz{ zKuUU!aTKW-Mn}HFd7QC1zrN5^%>-y$c7=KUNv6*O5u-XINhI57!|7^RYBVY>5=7SLgwVS4D0U9^zWa;v^$k3@aG+kAtg^YKRAo+(dQJMJZG=>tIa z*?P${DrM_rJoEjn$9nGL)oC|bnm9vTIZj8}s1IXt_p~V@-SJN_6!3X^h;S>r5Pj$Q zwLC`>{^{62#O|C)e_p1_Y5{4P{#krv@Oh^!YE#-v2IGUJwN&W{U&Oz%2Oy;MUpDmj zyIr2Fz}lRwB>SgJO{2^lXb#n<=lEk^y_-Lf$I}h#B#(W!+ebxSMS>|LaN2zO&k9sy zGEse`)liPP;Duq|!uU)%VcLKe2SO`QX-$=2JT3NgP0{*3^W>$1Q>jrw;VtA0Kk&rp zg8?rRgadHny7WMd4qm-~^EW?o{IAYXalxDI@K@scz5f0F(wk90Zp>$n%x*a?G@3(M zmR|;w{0Ekq1ZXEL$QuK!0V}O_D82!4D+rY>g#Y+qXK>(muXgQMrLSLChdj&5TURX0 zV27}sh6~qMF|jT-O*YG+CxJ3CDc_Z9Wb%x;hCOb&(-rgv0NT8TLl)CSxh(3H>h?J< zz~BEwb~R&DZY3ShROc?ByJpht8C1k1iP(qA1UNh*aUye#0G@xq>*w|P7HqzzOqmI& z-o7mPo@E{xG201 zfgA9z8U@TV011=>w!I*hbyh^}dg$CbuhdOfAUaeah-Iu>mqK<};v?<+YCIS(v9OiF-~5jXyi@NH zDY+s8bn2BzrQnW+e}%{gl0h&Xs>j=c?_O;Zd*MzE^Y;LPtor8dQN-}9rI0I+NAR$H(?pYHpY1an@&{cZ+&c@%jbLr zPFFesiHwibO4Qjp7steW|Ll$ltH%J3p}dZP<*% zfB-k@2(hS%&T0gXPY>e{*K_KZw<3c@&b08n!%$cJX2Kv~2z^M^Y*`wTQ#bE-< zaY2>o`+s0CL!UMzAP_vj7jh4vBsptm@-9;px;>{8CjsH{Zg~^fBe1hB*e83`sWTOv zUhSem#wWH@w?feiufu!{gumN^O0y-EtK<=?6zfIX!NixH)6-1A4H^Y-#}4e^LKtyS zd^zs-czyV(zmy#=-QRmDaV{Pk;^jK=qy0XOTC_%_nOkV}1klcSoqajr4Uu0B?-j-k zX-fM8UFGnm2Dud9F?0{j$yY%|jT^$gsjZbkruhLU71C9k>S-98>|_13*DBj}9#F#bVv)rp8Pv;paW2wb|cXYWORW^{qJ}9zj=&(Dt%ABQZ}{pGanO$Vgevq{a9q z9`ELRU}*gbc@H3f2XMjBxHZ@>|BK_;sof}5D@PjbK>r5${{D*g0|w?8Ln!N6&v-f_RpnbRzbf>lBl($Bt`+qc#sOxh{H!;vJAiw0>`RL z8mBej1wlT5-E;DFtm7JTLndH!?xxL(B*Lz3D=2ucj!NzbZ)4dg+i=M_twJa5uz8u~a1c8O15Ng_s?p7#v5=eaa9%e*rY1 zeUBbvp{lMGA?drBU*m@8Ao7N50QZPjXfqQ4{z{#){9puF-~r@yj=`v3pcvYpLIKm@ zyP8SiPdA;98i0QtZy4R9V~@+KpVME}hF8Ju+}s9QdTV;D!Y7@Jc?pnVw{BV*v6^8K zzGCZ*@n`T+j4YL|klK7%39Cv7)`mk(({-4*GMh()-CXC1O2UJiUGyK=BE}s`jOX03 z6TpcUH#@)N)<+?w{2g z8SB}(dA@NjU!b`;2q^6HKA=8dXEh!jHkGA-K;ZmUU%=~I0x<8I@=q*;8d@WSJf2|8 zeA86i*k=hwTC0&vl>$_t?k?H^@KEEMVv9{rJ%S zx+%J(+Yvl!c?2jwyU3`zTP~1~Az*Aynt%O_r}D5i1=%ZM8%d7=f4b~#08Gm_j)XjgO#AVO%G63;u8vSAlOA)G8*j+vH8MRY!p6jl??P0k{%Do$sCS zXY(WF!wLbH5e`wpVDN0or*?Kkjws3Zsl5b6SR4)4o0nWNQ@HuhEiCNtM&Wa7n4Nco zo&R+C&KMVN`lwJ%&ZT-ZW}Js1b-&hMAH6=?amo|m-PF#AbHcMxqEOMsMLahbgt~Fu zRoc(}st~Xm#eII6>PdEqwdEjeo_1LC_Pi#0H80-kFQB^@6@-m&JjA^C^*hT;nmnc# zQ!}0inA-oSvNDTuW~y&t5vwE@+w?gGQZv%yk>;DC=2(X8K|;qbfNa&Pkfb!c$! zWz8A;>dEg;Dv2A$p>t0YZH$Sip&6o)Jf&{4B)%x-vJ%&3pR8V6! zsnpyjDut5kqfEQJ1uCIHE(@PT3gJR*ORMCG!#}ngcS`88ura5dkFNZ4__R7N=Z3=f zmUcFQK15^l)hD`gXDG%Q>$#F7I+e{L$tq=7i;9AeEAoDya!YqbiabW2+~eFxe6|Zo zXworpDL@qvOcJ3t#}Q#Uc9QQD8K%{&QzHej+nfeb+av5&g3uNY!K)|DnNVJtU~2g)R$n zB9@s3+5i5JBF0v#F%$MDZfpDgi_NK}$YJ9&&$IR&yjDsj2F3@8U#k(umT!tMr@g-a z!0!7OFsoM`P#O|)KK-{DIphyG``;vM9;KmO`1f~ahZJ31B)=(_(5*ik)Fmt)JSoeP zqJ%``S+>TjIw)4kU@i?Vw>{aOCb{p7x~6eKolaj6gr`T7?9-v6qjwXo70`e>sZ|Pi z_kcn{vL!weD>ueJi7d+e9EeX*&a2q7Yj^8r$AJUAtKheM7uwsldZG%gC^IQlPR(vPS=IpZz89FGrt=jaGa9fANspHT{mPwP16xR6aK<* z2ozlmq1LufAkhkIOY_&xRFt9mqN&t^5j)x8e!Sua>!L}g5V^!j6F^a zk7MZK7cJvlLcFJi$@IUD+1k)zo#Hv1xgdfb6PYk-B0KYaGiX1)%{0DEt@$(y%Up0` z&5mRAQp*EumC1(h&$~9G--Qp|;^99Gn5YPSE|(-{-$NTc7c=eEb+sx^KQ01>-XYai zDh4Zs){mPKMj`h*8SS#(w`XmWom~CP784xT8ZTHkPc40#t^_WMR7i|{1hcdDnm*zx zIVOTzFlQ3Dy#$NX9`Xl2tWde0FMjKP!Pg>Hi7Db57`8vpiDfS^1jak@oj>x_o{MC62|PUr9z}I{_~>#T z)yJg0>(CEJOfnr=d{U2-&$w=&D;t4)g)j$mfcD9(EEedGV7S9_M;dUj*)P(9bGu*v z;r^%NBO{;SVBOdX(FC}K9Vf+FlMY@%78Vt^iy=#n2%#5F&|S_EZv*|{X8FO}Pz6nB z7u3Ik`Kw(#Jx0r20pm=_ZpH#&ftNmq@VIJ^Rij6g8I7=}7|Q-YotRXV-;R%O{txsa zs5fUr_ORUVV)BI8q_|xh{OC}%Gvr@Fa$wLU;Jke^4#twT)k$6r3D$j#5~wa78>v^1 zFe*TqdFO=hK>Vit2rg5p67w=3uS`A~?Gh}_hqmOJ!c^`w2#M~?Lf-6|r@L5D&@!t! z40OD$&N@_xI$Q1=Og2`=E$#~&BLOkBCo{~ z@y#Ur>21TR#VU<0w>ECDP%JNKDGS?y@?BexXPKWLc*;j)FvfX01HvDxNU?DkQw7WxM{Hxd^dkjkUItYRv>M%MJC>qr-_2$@Xw#0 zqJro54H+Otm{%E(TTFb=Q5J{0iy%?aTKAjH*Q5XZyuaN4^9QRhW8wsMwjX8?;fDY6 zPUY#2L@uLwUsH)-^{TCa$UIn~j^Y5uzM%|aTleFo9F?_=yw`|(Vr7`0A-*s`-+~&g z&y{pKP%&m}E$$EB#83kv-??yL;KU^yr!q_ zk^!>`dn!`j(dQ0Hs{LF0o9`TKnv}Oqy94X)N?*1_MTuqC55-15wib^3L#XGw+xjh7 zDaNdZ>ND~S)j608bhkmbM_WgcoIDeTdAO@m#!VGw6ce8dF(-X5&Cf43mK5UlXJ-;s zvnXKZhws3^Kv)xA5M4OBR@uZ#AW4h+0)yc=)azLHe#%xoRUolFAsz1}`SqJWv7N&q z64xFlvV#FtRI$VBX@QmZ5to%k2^H0)<>i?WILcdp+|e|Z{v=SGhG0JlvqxY!AtK;f zoB*tD?`^lE-a8nps^F>BQRGwQIx1cykIIxn%8F=~#eduwW_n)2S~J3I@Z~zYS!&Ng z!GS#k#=`CQd&ikcY1ChKP%`T5(}52@=-K3rUWq3r!RCUu_kNx?iWkuOB~V}(i&}3# zsf6>4#MXez|FA^KeS4P1I`igpcZizEgN|fFpnS@OO$~d8G_X9P^Dk=^BYrK!#Fmj3 zH|-yDqQ6diNFiHg*|SN+rog9X?(fi_q!W=f>!%B!x&_?NI3qfiLwSyqi>S}+Xrxh> z$seVTJPv0X_V*>yLp}LG?XJKB7KNHe-?d!lMg_1yDo%aQ2>h?Ax}@@bqin+aNeKjW z@yM!)ZE2%<+$Yjs&(4=&=vp1F&3n!fE-y5nDr|VdBsG8_Gec9C8TPbpcMnKf7yZ*q z$_S=iZ&xLxct%Agi~wOf{--W^w#Cm#Am?G4JwI^muO0I>)kQ^Ctv(nBD{dWB5Xhs- z=rX-kt};8-cg+|GG1q%8jGT1eV_VAPNadcoYg?)p#zTgcTKv*LA2Os;K0%r4ax%A$TH$#KJ z@>tUdi*ew^HB=p-`cyaxFiqe5#eM__H@EhF?O4V{njp)Ule69}e@uUSZ#^}ut-xU4 zq9f+yVL3Le%1`isu`!XPDf*ZC1iV*&jRh1pGUkxTkb9teeh64|2cC)_ctT}~kX?Po zeXj~q1`jo6=O-1?5Auw#j613|jO}rddgmP-S*-}_Oa^7AFI$5Z`-G#o`mnP8dQ()*U+j?TdCRK zeET^}caW#6PRSqQajK~yoCRgj5$O>}ZvouPISOvoWjlcl|S-3$t@?(U-2w0~F z`J^*^NFFk~uRznIL}-WOU4{N>paH>saD;FA7Q)qRg?zkTN5ZHjJyfO89!nI&2>#6o z6LsJU0u6>J{~oRlmRw5|ecN99`lq)(u$_cvDLX9-?PJT4(*`ZRI38wiffMR!Xg)5~ zJTxkd*f^=CqXSMb?aG@Y3A|?(u3gD^pxy!3*(m@4nk_22Out9G{YuC^SMdXmSPyjD zBQ=Q|U#}UUblf$jmtmZ7QhM|*ZzfK+%P567aCC>$^=n@a(yn>MP=4dB2O6Y5R)V0| zMH@2w;3h6$mDg8}FTVf+ZK)&QcTcM(6I8pO=kK`Xl6LAbA}f*e7;j8dyJ%nZtaPuW zk}EX37;iupOKNBs+B5t(&$qCH=!g~?FWPm(k+abRf0e?ewG{#pf*lQIKZTWwiUC+i z=n+w67#LFyj`oN5J9UP5A0dM~!Gxr~I&`Rt;l@sbNE#ZP8Sn~!#%=Wu|LHe4w)YRr zmwJ{UQ{jwyB*ulvD7vdWH&iYK6%Ke3AplGBSqERU{cOV-C+Ns+g_HMo=CFkXkr9&G z9zg%z5frmAAH?6WOx?I+JyR8eZT2U&z^&+JRwN>!_6x>Q(@KB0FNwTPk}l+ksVlDw z60JkLxJ;Ky3Lop&rpvS~_alr>K_$TUo$L2|iFcb@-uNl8kbBJp}u&T2Ais zt@=4JZJMe zb{r%~3?qfr>eq+B7ctPWndioulurXureuB_GXZ8Tp`zm#nD332ma%Jb|7fg57s0|$ ziAVx)xd+jYI`3nsDXAHe3o+%DAEOq*X&aR1WCaK0!sX=oScRe+oRiXL~k7Nf9|9C+kS%hA2k2A5`r^Z{b z1cB63Q8mSQOZ4C0?OGA&kVID@dmhk`6#1S9v2&s8YBf&M-=Zd>eLHX`K@rG&P-Il) z&M+9>b(OaWGL=Uam_*PlL|bRuT-vzz=&^hYBjK{OhP1 ztEAi+7dNSn216I!-3CP5pyy!vz2*eXg;eCDKiIk9wNJ&Lwsnmy(W^z+1&3&kYwMgS zzaC2_^2bYM9oVr8@AQ6f#O)}_PYvES(qx`Bpmz`Bj#c zveUc#;gccBkyW~teD6o~ALiy!xl{Q8zeIg@thK`2Fgp$hYh(roTC%Rp>eO>qGk_f@ z_rt@#9_I^Icn7?Jj0d7Lmn)uYn_)puaU)lrLochu=Ho$=UQvu;hUfNYH6ZO+=yjqc~3vG$K#$md3m| z&tL^34x|y?dwNC#vg!erD3qN9r|4a?xvLx*{93JngI0;4_sw#{5@q>WnAu0Al&iI} z=_}dfc3uG2M#}xU`r4>T@U&Lm$UuMe=7sM4_L()zq_{dFx1JI0FCgJAAj) z7SfO$9DYW*fl6b_Xye*nfg|yhS7Be!rWortlnp|6ItHPOwa~31UD9a*+G!{y-IKN7 z(c0M}@2*`ra~poO;=?i&=Vr-)7zFaFD$lAB{=0GiJrti~Q8y<{ZpoW&db-UPCU(!ywJc{p zs%VCT5Kd@8$G^W%N@P5d%J3|Ix}7FIqW}_GG}1j#HHxbv%{%;DPAEZAA$~ zO>7y^NGfM{IK1+j;4>|mNEnZ%D|QpY*lt=zI}@IL7-2wSxuzCP&KQb6T&?(Qc%;WJ zmbtBpzXkjo>FrGL334X_f!?y~s^2DFqa2mIrr@!z-{ErD#j8bFT?s=#PDOv=1%WOd zFtB%i6ulF0HL{vW0b!@4}n(5gwf(OD@{}+ zVrT0A7aX#p$C@kK;m9O6XGOZ0OuP_dwNes)FVQ$Sk)?#TCw2ey`nSk!X7ru@mWZHbicCbvkokok#4v`W_^f{6*O z-d*UsP&uA5_z5(8wUbKYz(&F+IRKFlc#8dLT8U1G$@uxTEf@VTu1S?x`?M&?v|6Kc zP*jCHVqax6u*jVA3HS)%yb!zJvF~s_g?E@7xqP`Etq_kwbqYGkxp0lvq0Mely<#Sj z>G?2kjBGOSiYtgwdOSs;CABVhlvk(LN0Yg3L@vUo$|(583&H#1{N~E13}HR*JFv~- zQ9%x$ho4?65JY@?7v0V6t8f2aS7tP=%(@?Bi3_ng_~nx<}Lc4 z>nohvX0W0zY_=aMcCU+MS2nh2+cejIEWeo?|Hdz3m;xumgTuIP`DD%CuvS_1+gp!Q z?~Is0)vmXWXQ=Hh$kZ%@jfbKRoiubdUg)`W)>uWJw3yASC^<83fvuv>{Nl=Aj>vdI z=jFs*nC+6BxSfGrR>j>kCSH@6Va&lD{Wuqx@H}ExTJ0OS2N2S9XVY87oc;B^Bym9K4Oi+f36vCpty_3StgCoj5>%tK3#Eq6L^z?&uAv*V)a`AA!r z_bsCoMQ6F#;s$E&KR%2{rnCYmoT$Fd{|M~9(bewwzs zP_{X182-7h&tx9*?(h^{RPDXRc3Zlhl>_r&@7M;}?6w93K8`9f@u8CB@;BM7;B|CY z^0wIR{DB)zPLBvOt#Q{A=03Pr%%b;||5V7K`Q`}*Pt+YfiqY%3_wdGE~kbE@4 zqFwbq-~E|lTb{%{o9MWSYP^6@&l)hU+*98*7nnOJ-UJH@6?#D87E#esP^u&!JLqRJ zTkOdbilXlqIKfb5na{d_Z;3}F!G9uj{-(A1+g8=JP~4(X)Idu^7q}?W`Zyv{MR(8% zO3;&QO)5Yj!>MOq`M)|5>b*Zd*x-Ro!-z9AX+1SDf0J>uA>VO$J} ziZ^HsL{rQBz_UDydqkhVdxQ4;=lb5-Y+W(HfWjRDGdVPdew`=X&3&_ySY{m#kgBQ6 zWX3C^S~~x56l16ewa2zy`RQB$W1js4@o+<=JMJ6d2uUUb_nmw`hZS6Ij_rIq!^&5} z{0`(JJdNSo{#^^{?N+7m!D?J;#PGX0iGcmaD0ILj%58rU?qf=z-`xZS>DM2nIL{o_ z`eCAixQy$$&o@PiTD#3Ai(i8C`OUTPTa~Ka;ROpOuYJcAPKT=d4U|?kduk66-eNft zR^Ls1PgWW>HeNb9;rQFa@y3RW-65L$ziUPaJD_%%^gF|M3syii7CF3;i@f%fAb|O+!EF(WMqr z9Wi+h0D}SKs`MnZG!DxCx6LX26W2{!vH5=0MfnIaRcRJ$QPlm*1;6HF#roUbrDD76 zO8M!SCMQcXKP3Kj0Di!Lwn=b>h{5#%Yi-wM3!JgD!=6h$=+r#U6sd zZ1fQiaq#7?3R|>Z1?+v2&^S$**(ElJ1T|x+?5yW<=L)IT@|@-@-@E6%`ZEcMj~UFM zQ2)4033k1I@wOixG#w2*NmfvN6-4G=XtC7RgYW(#iqgt9Ul)3mH`|!aj$27Ig`L%> zq*E;Hj$Ixt`Y(`LGTEODysG;kvo6m}7`@E7^wwl$nO95<$~SwNpZiVJZZTa+!Ula(cKl=GQw7%Jev zYZAQVTH$tJ$g~(ftS;SaQd~+&#yDx?e};gJB_R9`X+B$3P~89I%4PVOAmz1xYj6Ib zMR-nz{XdKn-bwVI^o~thjD?Z*WQj%SaVtN*<0HR$WRi00P3yY&8T*p>w2_tt*782a zASzwH9-)@lu0P=wbzWYQDdg#+g3ew3TkNBSet-dB%)hj6s85f--fFpWgWNAWi9lQL z#xg(-a5|#OKs91w1x-^|s{lYKokWYUAjQ3pupsry^X~3}S^$v%Ag3+8faJf$3SVGo qpzJf2pCQ!GE|fy5A0R!@7nm-{uj=OPhM`x)Bqb&Px&G)Y83RCt{2nmumZFc5{G0vB!!18%c-@Ii8qg6Zz`~qWv9(~`*K5RWYP&^Skum^fHgyA6#U$j!^jfSU6C)~?3Y6BmT84zDt08)Qc&>63K4{5WB3@br?h%r$jI(oh6AaCX&+k#mT=xu~kG)VYuwP z*hHj@eh&e>Wuxgr8<%&EC6aP^3II;gLlLcUf{#K(TfyBd+zdfNLtOH#4qbruv)P3K zr4NY{y9el2+j)ir34_5|vg&3bnl7-1Yv9-4N$RpLQ_)ArwN@km9E9H7du|FubTgMd zBCQU9^Cm|vmlH%x+hvH4~^EtHCu*A0Ap{yO~qmkNZjVa`eo90TmTFXXSmzGPx$=t)FDRA_*cUQlmTz0sB`rKZR>JMkDu_&=V3e}JVfaT9CJAvi1GZz5B!_7tG zUaKSkOsBVQb7wH0KepZeu6>$FvnAUS*U1#cV&}O{(_l$*GOG)h?YXz= z=48o~r@gs=8gYHx5RU zt|Qfj@r+ZymY^%#Y&C9dlf{yf=($>euxA_-xhOhL6`#vC(E@{-`Z)Ihb9qrD+eFJn zgwLMtWXAD56p1BmrZ-cpw+~%JyHu;vRTxeoNXb0U))&2JU5z0f$AR?In@&D!KA7g8=B@T#CkpKVy07*qoM6N<$g381McK`qY literal 0 HcmV?d00001 diff --git a/assets/sprites/gui/DisabledEmptyCard.png.import b/assets/sprites/gui/DisabledEmptyCard.png.import new file mode 100644 index 0000000..ac3a262 --- /dev/null +++ b/assets/sprites/gui/DisabledEmptyCard.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxlr34yh0bqch" +path="res://.godot/imported/DisabledEmptyCard.png-7f5482b96bf2d482bb3d5df447102c95.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/gui/DisabledEmptyCard.png" +dest_files=["res://.godot/imported/DisabledEmptyCard.png-7f5482b96bf2d482bb3d5df447102c95.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/sprites/gui/EmptyShovel.tres b/assets/sprites/gui/EmptyShovel.tres new file mode 100644 index 0000000..3171281 --- /dev/null +++ b/assets/sprites/gui/EmptyShovel.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://fd6drk2su0df"] + +[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_i8m7w"] + +[resource] +atlas = ExtResource("1_i8m7w") +region = Rect2(355, 68, 51, 47) diff --git a/assets/sprites/gui/FastForward2.tres b/assets/sprites/gui/FastForward2.tres index f290aac..281bf4e 100644 --- a/assets/sprites/gui/FastForward2.tres +++ b/assets/sprites/gui/FastForward2.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_cq0f1") -region = Rect2(36, 264, 36, 36) +region = Rect2(72, 264, 36, 36) diff --git a/assets/sprites/gui/Shovel.tres b/assets/sprites/gui/Shovel.tres index 0b03406..3ccba3b 100644 --- a/assets/sprites/gui/Shovel.tres +++ b/assets/sprites/gui/Shovel.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_s2rs0") -region = Rect2(14, 145, 51, 47) +region = Rect2(0, 145, 51, 47) diff --git a/project.godot b/project.godot index b86019d..bc4f520 100644 --- a/project.godot +++ b/project.godot @@ -43,6 +43,11 @@ cancel_plant={ , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) ] } +primary_action={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":1,"position":Vector2(49, 18),"global_position":Vector2(58, 57),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} [layer_names] diff --git a/resources/plants/Peashooter.tres b/resources/plants/Peashooter.tres index 1cc275a..e8db69e 100644 --- a/resources/plants/Peashooter.tres +++ b/resources/plants/Peashooter.tres @@ -11,4 +11,4 @@ Scene = ExtResource("1_rqf2x") ReloadTime = 5.0 StartReloadTime = 0.0 Preview = ExtResource("1_rnq6r") -layer = 1 +Layer = 1 diff --git a/scenes/debug_lvl.tscn b/scenes/debug_lvl.tscn index 6be467f..1cfc78b 100644 --- a/scenes/debug_lvl.tscn +++ b/scenes/debug_lvl.tscn @@ -1,10 +1,12 @@ -[gd_scene load_steps=6 format=3 uid="uid://crxsvv7drckpw"] +[gd_scene load_steps=8 format=3 uid="uid://crxsvv7drckpw"] [ext_resource type="Script" path="res://scripts/components/level/RuntimeLevelData.cs" id="1_i3bf5"] [ext_resource type="Texture2D" uid="uid://b0tb2hjum40aw" path="res://assets/sprites/summertime_saga.png" id="2_vmxhy"] [ext_resource type="PackedScene" uid="uid://cg8713v6c5w15" path="res://scenes/pools.tscn" id="3_jv7x4"] [ext_resource type="PackedScene" uid="uid://devn21c7luf45" path="res://scenes/level components/field_controller.tscn" id="5_lwpg6"] [ext_resource type="PackedScene" uid="uid://cfnmspei3k4p7" path="res://scenes/gui/runtime_gui.tscn" id="6_0baou"] +[ext_resource type="PackedScene" uid="uid://bpekho7leatr5" path="res://scenes/sun.tscn" id="6_ay12k"] +[ext_resource type="Script" path="res://scripts/components/level/SunSpawner.cs" id="6_lkguy"] [node name="debug_lvl" type="Node2D"] @@ -19,7 +21,6 @@ metadata/_edit_lock_ = true [node name="RuntimeLevelData" type="Node" parent="."] script = ExtResource("1_i3bf5") -SunCount = 5000 [node name="Pools" parent="." instance=ExtResource("3_jv7x4")] @@ -27,9 +28,20 @@ SunCount = 5000 layer = 10 [node name="RuntimeGUI" parent="GuiLayer" instance=ExtResource("6_0baou")] +metadata/_edit_lock_ = true [node name="Overlay" type="CanvasLayer" parent="."] -layer = 5 +layer = 6 follow_viewport_enabled = true [node name="FieldController" parent="Overlay" instance=ExtResource("5_lwpg6")] + +[node name="SunSpawner" type="Node" parent="."] +script = ExtResource("6_lkguy") +SunScene = ExtResource("6_ay12k") + +[node name="Timer" type="Timer" parent="SunSpawner"] +wait_time = 5.0 +autostart = true + +[connection signal="timeout" from="SunSpawner/Timer" to="SunSpawner" method="Spawn"] diff --git a/scenes/entities/plants/peashooter.tscn b/scenes/entities/plants/peashooter.tscn index 1eddc8d..82c37e0 100644 --- a/scenes/entities/plants/peashooter.tscn +++ b/scenes/entities/plants/peashooter.tscn @@ -62,6 +62,7 @@ resource_local_to_scene = true b = Vector2(5.865, 0) [node name="Peashooter" type="Node2D"] +y_sort_enabled = true script = ExtResource("1_f4h5i") [node name="Sprite" type="Sprite2D" parent="."] diff --git a/scenes/gui/fast_forward_button.tscn b/scenes/gui/fast_forward_button.tscn index 1894c21..fdc01d7 100644 --- a/scenes/gui/fast_forward_button.tscn +++ b/scenes/gui/fast_forward_button.tscn @@ -1,6 +1,9 @@ -[gd_scene load_steps=2 format=3 uid="uid://cgm7td1hgs0rr"] +[gd_scene load_steps=5 format=3 uid="uid://cgm7td1hgs0rr"] [ext_resource type="Texture2D" uid="uid://bjsar1x67xk1t" path="res://assets/sprites/gui/FastForward1.tres" id="1_ta3h7"] +[ext_resource type="Script" path="res://scripts/components/gui/FastForwardButton.cs" id="2_wle4k"] +[ext_resource type="Texture2D" uid="uid://dfr5ofieigu5j" path="res://assets/sprites/gui/FastForward2.tres" id="3_fj838"] +[ext_resource type="Texture2D" uid="uid://qgmsoocd4p1o" path="res://assets/sprites/gui/FastForward3.tres" id="4_2wmv1"] [node name="FastForwardButton" type="TextureButton"] anchors_preset = -1 @@ -10,3 +13,9 @@ size_flags_vertical = 4 mouse_default_cursor_shape = 2 texture_normal = ExtResource("1_ta3h7") stretch_mode = 0 +script = ExtResource("2_wle4k") +firstSpeed = ExtResource("1_ta3h7") +secondSpeed = ExtResource("3_fj838") +thirdSpeed = ExtResource("4_2wmv1") + +[connection signal="pressed" from="." to="." method="OnPressed"] diff --git a/scenes/gui/plant_card.tscn b/scenes/gui/plant_card.tscn index c3bf4ea..e5ef501 100644 --- a/scenes/gui/plant_card.tscn +++ b/scenes/gui/plant_card.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=9 format=3 uid="uid://c8qru1yhnbbkl"] +[gd_scene load_steps=10 format=3 uid="uid://c8qru1yhnbbkl"] [ext_resource type="Texture2D" uid="uid://cabpf23ndlvx0" path="res://assets/sprites/gui/Selection.tres" id="2_5mpv8"] +[ext_resource type="Texture2D" uid="uid://cxlr34yh0bqch" path="res://assets/sprites/gui/DisabledEmptyCard.png" id="2_odd6g"] [ext_resource type="Script" path="res://scripts/components/gui/PlantSlot.cs" id="3_eer7n"] [ext_resource type="Shader" path="res://assets/shaders/gui_masking.gdshader" id="4_bryew"] [ext_resource type="Texture2D" uid="uid://dxyf557m4mq1p" path="res://assets/sprites/gui/EmptyPlantCard.png" id="5_2k0xq"] @@ -22,6 +23,7 @@ anchor_bottom = 0.28 offset_right = -0.200005 mouse_default_cursor_shape = 2 texture_normal = ExtResource("5_2k0xq") +texture_disabled = ExtResource("2_odd6g") texture_focused = ExtResource("2_5mpv8") stretch_mode = 0 script = ExtResource("3_eer7n") diff --git a/scenes/gui/runtime_gui.tscn b/scenes/gui/runtime_gui.tscn index 7787a43..9a4f185 100644 --- a/scenes/gui/runtime_gui.tscn +++ b/scenes/gui/runtime_gui.tscn @@ -25,6 +25,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 theme = ExtResource("1_xf6ra") [node name="Hotbar" type="HBoxContainer" parent="."] @@ -34,7 +35,7 @@ anchor_right = 1.0 anchor_bottom = 0.14 offset_bottom = -29.0 grow_horizontal = 2 -metadata/_edit_use_anchors_ = true +mouse_filter = 2 [node name="SunCounter" parent="Hotbar" instance=ExtResource("1_le3od")] layout_mode = 2 @@ -45,6 +46,7 @@ theme_override_styles/panel = SubResource("StyleBoxTexture_ps2iw") [node name="Seedpackets" type="HBoxContainer" parent="Hotbar/PanelContainer"] layout_mode = 2 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="FirstSlot" parent="Hotbar/PanelContainer/Seedpackets" instance=ExtResource("2_cjtsw")] @@ -79,6 +81,8 @@ layout_mode = 2 [node name="ShovelButton" parent="Hotbar" instance=ExtResource("3_bheea")] layout_mode = 2 +size_flags_horizontal = 1 +size_flags_vertical = 4 [node name="FastForwardButton" parent="Hotbar" instance=ExtResource("4_66uy4")] layout_mode = 2 diff --git a/scenes/gui/shovel_button.tscn b/scenes/gui/shovel_button.tscn index b147ab6..079a13f 100644 --- a/scenes/gui/shovel_button.tscn +++ b/scenes/gui/shovel_button.tscn @@ -1,6 +1,8 @@ -[gd_scene load_steps=2 format=3 uid="uid://t0vpmycj6c8j"] +[gd_scene load_steps=4 format=3 uid="uid://t0vpmycj6c8j"] [ext_resource type="Texture2D" uid="uid://cw73vihkrfenc" path="res://assets/sprites/gui/Shovel.tres" id="1_46afk"] +[ext_resource type="Texture2D" uid="uid://fd6drk2su0df" path="res://assets/sprites/gui/EmptyShovel.tres" id="2_pw2pj"] +[ext_resource type="Script" path="res://scripts/components/gui/ShovelButton.cs" id="3_u6gir"] [node name="ShovelButton" type="TextureButton"] anchors_preset = -1 @@ -11,5 +13,18 @@ offset_bottom = -6.8 size_flags_horizontal = 4 size_flags_vertical = 0 mouse_default_cursor_shape = 2 +toggle_mode = true texture_normal = ExtResource("1_46afk") +texture_pressed = ExtResource("2_pw2pj") stretch_mode = 0 +script = ExtResource("3_u6gir") + +[node name="RayCast2D" type="RayCast2D" parent="."] +enabled = false +target_position = Vector2(0, 0) +collision_mask = 2 +hit_from_inside = true +collide_with_areas = true +collide_with_bodies = false + +[connection signal="focus_exited" from="." to="." method="OnFocusExited"] diff --git a/scenes/gui/sun_counter.tscn b/scenes/gui/sun_counter.tscn index b16ee0f..034a2ab 100644 --- a/scenes/gui/sun_counter.tscn +++ b/scenes/gui/sun_counter.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=5 format=3 uid="uid://ky35veswaytr"] +[gd_scene load_steps=6 format=3 uid="uid://ky35veswaytr"] [ext_resource type="Texture2D" uid="uid://bhp3vuvwf7lak" path="res://assets/sprites/gui/suncounter.tres" id="1_e5x4k"] +[ext_resource type="Theme" uid="uid://b8l285cjcgeyi" path="res://resources/GameStyle.tres" id="1_vhhcn"] [ext_resource type="Texture2D" uid="uid://c47rflkf2wap0" path="res://assets/sprites/sun.tres" id="2_gugre"] [ext_resource type="Script" path="res://scripts/components/gui/SunCounter.cs" id="3_qhmb8"] @@ -15,6 +16,7 @@ anchor_bottom = 0.067 offset_right = -0.200001 offset_bottom = 0.199999 size_flags_vertical = 0 +theme = ExtResource("1_vhhcn") texture = ExtResource("1_e5x4k") [node name="Sun" type="TextureRect" parent="."] @@ -37,11 +39,11 @@ anchors_preset = -1 anchor_left = 0.122 anchor_top = 0.222 anchor_right = 0.878 -anchor_bottom = 0.778 +anchor_bottom = 0.815 offset_left = 0.0219994 offset_top = 0.00599957 offset_right = -0.0219994 -offset_bottom = -0.00600243 +offset_bottom = -0.00500107 label_settings = SubResource("LabelSettings_lxkq5") horizontal_alignment = 1 vertical_alignment = 1 diff --git a/scenes/sun.tscn b/scenes/sun.tscn new file mode 100644 index 0000000..4d40d07 --- /dev/null +++ b/scenes/sun.tscn @@ -0,0 +1,174 @@ +[gd_scene load_steps=13 format=3 uid="uid://bpekho7leatr5"] + +[ext_resource type="Shader" path="res://assets/shaders/shared_outline.gdshader" id="1_jcu1f"] +[ext_resource type="Script" path="res://scripts/Sun.cs" id="2_m8xcj"] +[ext_resource type="Texture2D" uid="uid://bkmphus5wjadi" path="res://assets/sprites/atlases/sun_atlas.png" id="2_phn3y"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_u0o5k"] +shader = ExtResource("1_jcu1f") +shader_parameter/line_colour = Color(1, 0.568627, 0.4, 1) +shader_parameter/line_thickness = 3 + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_n4y82"] +shader = ExtResource("1_jcu1f") +shader_parameter/line_colour = Color(1, 0.568627, 0.4, 1) +shader_parameter/line_thickness = 3 + +[sub_resource type="Animation" id="Animation_jfrge"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CanvasGroup/DownerStar:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CanvasGroup/UpperStar:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_rvj0j"] +resource_name = "main" +length = 10.0 +loop_mode = 1 +step = 0.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CanvasGroup/DownerStar:rotation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 5, 10), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 6.28319, 12.5664] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("CanvasGroup/UpperStar:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 10), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -6.28319] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_juv2v"] +_data = { +"RESET": SubResource("Animation_jfrge"), +"main": SubResource("Animation_rvj0j") +} + +[sub_resource type="Animation" id="Animation_t53pt"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CanvasGroup:modulate:a") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_xyill"] +resource_name = "main" +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("CanvasGroup:modulate:a") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.5, 0.986673) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_p7c0n"] +_data = { +"RESET": SubResource("Animation_t53pt"), +"main": SubResource("Animation_xyill") +} + +[sub_resource type="CircleShape2D" id="CircleShape2D_7hl7x"] +radius = 19.0 + +[node name="Sun" type="Area2D" node_paths=PackedStringArray("_deathTimer", "_rotation", "_fade")] +material = SubResource("ShaderMaterial_u0o5k") +script = ExtResource("2_m8xcj") +_deathTimer = NodePath("DeathTimer") +_rotation = NodePath("RotationAnimation") +_fade = NodePath("FadeAnimation") + +[node name="CanvasGroup" type="CanvasGroup" parent="."] +material = SubResource("ShaderMaterial_n4y82") + +[node name="DownerStar" type="Sprite2D" parent="CanvasGroup"] +show_behind_parent = true +texture = ExtResource("2_phn3y") +vframes = 3 + +[node name="UpperStar" type="Sprite2D" parent="CanvasGroup"] +show_behind_parent = true +texture = ExtResource("2_phn3y") +vframes = 3 +frame = 1 + +[node name="Circle" type="Sprite2D" parent="CanvasGroup"] +show_behind_parent = true +texture = ExtResource("2_phn3y") +vframes = 3 +frame = 2 + +[node name="RotationAnimation" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_juv2v") +} +autoplay = "main" + +[node name="FadeAnimation" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_p7c0n") +} + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_7hl7x") + +[node name="DeathTimer" type="Timer" parent="."] +wait_time = 30.0 +one_shot = true +autostart = true + +[node name="CursorControl" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 0 +offset_left = -19.0 +offset_top = -19.0 +offset_right = 19.0 +offset_bottom = 19.0 +mouse_filter = 1 +mouse_default_cursor_shape = 2 + +[connection signal="timeout" from="DeathTimer" to="." method="queue_free"] diff --git a/scripts/Cursor.cs b/scripts/Cursor.cs index 0159278..2e96119 100644 --- a/scripts/Cursor.cs +++ b/scripts/Cursor.cs @@ -4,15 +4,36 @@ using System; public partial class Cursor : Node { public static Cursor Instance { get; private set; } + + public bool shovel = false; + public bool plant = false; + public override void _Ready() { Instance = this; SetDefaultCursor(); } + public void UpdateCursor() + { + if (shovel) + { + SetShovelCursor(); + return; + } + + if (plant) + { + SetPlantCursor(); + return; + } + + SetDefaultCursor() ; + } + public void SetDefaultCursor() { - Input.SetCustomMouseCursor(ResourceLoader.Load("res://assets/sprites/atlases/cursor/default_arrow.png")); + Input.SetCustomMouseCursor(ResourceLoader.Load("res://assets/sprites/atlases/cursor/default_arrow.png"),shape:Input.CursorShape.Arrow); Input.SetCustomMouseCursor(ResourceLoader.Load("res://assets/sprites/atlases/cursor/default_point.png"),shape:Input.CursorShape.PointingHand); } @@ -20,4 +41,9 @@ public partial class Cursor : Node { Input.SetCustomMouseCursor(ResourceLoader.Load("res://assets/sprites/atlases/cursor/plant_arrow.png")); } + + public void SetShovelCursor() + { + Input.SetCustomMouseCursor(ResourceLoader.Load("res://assets/sprites/atlases/cursor/shovel_arrow.png")); + } } diff --git a/scripts/Sun.cs b/scripts/Sun.cs new file mode 100644 index 0000000..bba8a44 --- /dev/null +++ b/scripts/Sun.cs @@ -0,0 +1,31 @@ +using Godot; +using System; + +public partial class Sun : Area2D +{ + [Export] public int amount = 25; + [Export] private Timer _deathTimer; + [Export] private AnimationPlayer _rotation; + [Export] private AnimationPlayer _fade; + + public override void _Ready() + { + _rotation.SpeedScale = 1.0f + GD.Randf() / 2.0f; + } + public override void _InputEvent(Viewport viewport, InputEvent @event, int shapeIdx) + { + if (@event.IsActionPressed("primary_action")) + { + LevelController.Instance.LevelData.AddSun(amount); + QueueFree(); + } + } + + public override void _Process(double delta) + { + if (_deathTimer.TimeLeft/_deathTimer.WaitTime <= 0.25) + { + _fade.Play("main"); + } + } +} diff --git a/scripts/components/gui/FastForwardButton.cs b/scripts/components/gui/FastForwardButton.cs new file mode 100644 index 0000000..206edbe --- /dev/null +++ b/scripts/components/gui/FastForwardButton.cs @@ -0,0 +1,31 @@ +using Godot; +using System; + +public partial class FastForwardButton : TextureButton +{ + [Export] private Texture2D firstSpeed; + [Export] private Texture2D secondSpeed; + [Export] private Texture2D thirdSpeed; + + private int speed = 1; + + public void OnPressed() + { + speed = Mathf.Wrap(speed+1, 1, 4); + + switch (speed) + { + case 1: + TextureNormal = firstSpeed; + break; + case 2: + TextureNormal = secondSpeed; + break; + case 3: + TextureNormal = thirdSpeed; + break; + } + + Engine.TimeScale = speed; + } +} diff --git a/scripts/components/gui/PlantSlot.cs b/scripts/components/gui/PlantSlot.cs index f18302f..4537b5c 100644 --- a/scripts/components/gui/PlantSlot.cs +++ b/scripts/components/gui/PlantSlot.cs @@ -8,11 +8,21 @@ public partial class PlantSlot : TextureButton [Export] private TextureRect _icon; [Export] private Timer _timer; + private bool _recharging; + public override void _Ready() { if (_resource != null) UpdateContents(); } + public override void _Process(double delta) + { + if (_resource != null) + { + Disabled = _recharging || LevelController.Instance.LevelData.SunCount < _resource.Cost; + FocusMode = Disabled ? FocusModeEnum.None : FocusModeEnum.All; + } + } public void SetPlantResource( PlantResource resource ) { @@ -43,8 +53,7 @@ public partial class PlantSlot : TextureButton public void Recharge() { - Disabled = true; - FocusMode = FocusModeEnum.None; + _recharging = true; ReleaseFocus(); @@ -53,7 +62,6 @@ public partial class PlantSlot : TextureButton private void Timeout() { - Disabled = false; - FocusMode = FocusModeEnum.All; + _recharging = false; } } diff --git a/scripts/components/gui/ShovelButton.cs b/scripts/components/gui/ShovelButton.cs new file mode 100644 index 0000000..35a281f --- /dev/null +++ b/scripts/components/gui/ShovelButton.cs @@ -0,0 +1,39 @@ +using Godot; +using System; + +public partial class ShovelButton : TextureButton +{ + private RayCast2D _shovelCast; + public override void _Ready() + { + _shovelCast = GetNode("RayCast2D"); + _shovelCast.CallDeferred("reparent", GetTree().CurrentScene); + } + private void OnFocusExited() + { + ButtonPressed = false; + } + public override void _Process(double delta) + { + _shovelCast.GlobalPosition = _shovelCast.GetGlobalMousePosition(); + } + public override void _Toggled(bool toggledOn) + { + _shovelCast.Enabled = toggledOn; + + Cursor.Instance.shovel = toggledOn; + Cursor.Instance.UpdateCursor(); + } + + public override void _Input(InputEvent @event) + { + if (@event.IsActionPressed("primary_action")) + { + if (_shovelCast.IsColliding() && (_shovelCast.GetCollider() as CollisionObject2D).GetParent() is RuntimePlantData plant) + { + plant.Kill(); + } + ButtonPressed = false; + } + } +} diff --git a/scripts/components/level/PlantField.cs b/scripts/components/level/PlantField.cs index b690a96..aaaf5ab 100644 --- a/scripts/components/level/PlantField.cs +++ b/scripts/components/level/PlantField.cs @@ -7,6 +7,7 @@ public partial class PlantField : Node2D private PlantResource _resource; private PlantSlot _slot; + private bool _previousCanPlace; public override void _Ready() { LevelController.Instance.PlantField = this; @@ -32,49 +33,52 @@ public partial class PlantField : Node2D bool inBoundary = expected_pos.X > Utility.LeftFieldBoundary.X && expected_pos.X < Utility.RightFieldBoundary.X && expected_pos.Y > Utility.LeftFieldBoundary.Y && expected_pos.Y < Utility.RightFieldBoundary.Y; - bool _canPlace = _resource != null + bool canPlace = _resource != null && inBoundary && LevelController.Instance.Pools.EntityField[_resource.Layer].ContainsKey(expected_pos) == false && LevelController.Instance.LevelData.CheckSpendSun(_resource.Cost); // Setting visuals - if (_canPlace) + if (_previousCanPlace != canPlace) { - Material.Set("shader_parameter/amount", 0); - Cursor.Instance.SetPlantCursor(); + if (canPlace) + { + Material.Set("shader_parameter/amount", 0); + } + else + { + Material.Set("shader_parameter/amount", 1); + } + Cursor.Instance.plant = canPlace; + Cursor.Instance.UpdateCursor(); + } + _previousCanPlace = canPlace; + + if (canPlace) _plantSetter.GlobalPosition = expected_pos; - } - else - { - Cursor.Instance.SetDefaultCursor(); - Material.Set("shader_parameter/amount", 1); - } - _plantSetter.Texture = _resource == null ? null : _resource.Preview; + } - // Spawning plant - if (Input.IsMouseButtonPressed(MouseButton.Left) - && _canPlace ) + public override void _UnhandledInput(InputEvent @event) + { + if (@event.IsActionPressed("cancel_plant") && _slot != null) + { + _slot.ReleaseFocus(); + } + + if (@event.IsActionPressed("primary_action") && _previousCanPlace) { var plant = _resource.Scene.Instantiate(); LevelController.Instance.Pools.Plants.AddChild(plant); - plant.GlobalPosition = expected_pos; + plant.GlobalPosition = (_plantSetter.GlobalPosition / tile).Ceil() * tile - new Vector2(20, 14); + plant.Layer = _resource.Layer; - LevelController.Instance.Pools.EntityField[_resource.Layer].Add(expected_pos, plant as IEntity); + LevelController.Instance.Pools.EntityField[_resource.Layer].Add(plant.GlobalPosition, plant as IEntity); LevelController.Instance.LevelData.SpendSun(_resource.Cost); // Unfocusing and recharging slot _slot.Recharge(); - - } - } - - public override void _Input(InputEvent @event) - { - if (@event.IsActionPressed("cancel_plant")) - { - _slot.ReleaseFocus(); } } } diff --git a/scripts/components/level/SunSpawner.cs b/scripts/components/level/SunSpawner.cs new file mode 100644 index 0000000..6b29156 --- /dev/null +++ b/scripts/components/level/SunSpawner.cs @@ -0,0 +1,28 @@ +using Godot; +using System; + +public partial class SunSpawner : Node +{ + [Export] + public int MinSun = 25; + [Export] + public int MaxSun = 25; + + [Export] + private PackedScene SunScene; + + public void Spawn() + { + float x = GD.Randf()*9*Utility.TileWidth; + uint y = GD.Randi() % 5; + + var sun = SunScene.Instantiate(); + LevelController.Instance.Pools.Projectiles.AddChild(sun); + + sun.GlobalPosition = new Vector2(Utility.LeftFieldBoundary.X + x, -90); + + var moveTween = CreateTween(); + moveTween.TweenProperty(sun,"global_position", new Vector2(Utility.LeftFieldBoundary.X + x, + Utility.LeftFieldBoundary.Y + Utility.TileHeight * y + Utility.TileHeight/2.0f),9-y); + } +} diff --git a/scripts/components/plants/RuntimePlantData.cs b/scripts/components/plants/RuntimePlantData.cs index cd24cc7..fe72a3e 100644 --- a/scripts/components/plants/RuntimePlantData.cs +++ b/scripts/components/plants/RuntimePlantData.cs @@ -38,8 +38,13 @@ public partial class RuntimePlantData : Node2D, IEntity if (_hp <= 0) { - LevelController.Instance.Pools.EntityField[Layer].Remove(GlobalPosition); - QueueFree(); + Kill(); } } + + public void Kill() + { + LevelController.Instance.Pools.EntityField[Layer].Remove(GlobalPosition); + QueueFree(); + } }