From 0fff33d196648f565f5dbfd29eea03378d0399d9 Mon Sep 17 00:00:00 2001 From: Rendo Date: Tue, 24 Jun 2025 18:44:49 +0500 Subject: [PATCH] Debug zombie spawner --- assets/sprites/atlases/atlas1.png | Bin 39237 -> 32323 bytes assets/sprites/atlases/atlas2.png | Bin 0 -> 5122 bytes assets/sprites/atlases/atlas2.png.import | 34 +++++++ assets/sprites/gui/ButtonBackground.tres | 2 +- .../gui/ChooseYourSeeds/FrameField.tres | 2 +- .../sprites/gui/ChooseYourSeeds/Grabber.tres | 2 +- .../gui/ChooseYourSeeds/InnerPanel.tres | 2 +- .../sprites/gui/ChooseYourSeeds/LevelRun.tres | 2 +- assets/sprites/gui/ChooseYourSeeds/Panel.tres | 2 +- .../gui/ChooseYourSeeds/PlantFrame.tres | 2 +- .../sprites/gui/ChooseYourSeeds/Slider.tres | 2 +- assets/sprites/gui/EmptyShovel.tres | 2 +- assets/sprites/gui/FastForward1.tres | 2 +- assets/sprites/gui/FastForward2.tres | 2 +- assets/sprites/gui/FastForward3.tres | 2 +- assets/sprites/gui/Pause.tres | 2 +- assets/sprites/gui/Selection.tres | 2 +- assets/sprites/gui/SelectionGeneric.tres | 2 +- assets/sprites/gui/Shovel.tres | 2 +- assets/sprites/gui/pause_bg.tres | 7 ++ assets/sprites/gui/suncounter.tres | 2 +- assets/sprites/plants/Spikeweed.tres | 2 +- assets/sprites/plants/Wallnut.tres | 2 +- assets/sprites/plants/aloe.tres | 2 +- assets/sprites/plants/garlic.tres | 2 +- assets/sprites/plants/pea.tres | 6 +- assets/sprites/plants/peashooter.tres | 2 +- assets/sprites/plants/potatomine.tres | 2 +- assets/sprites/plants/snowpea.tres | 2 +- assets/sprites/plants/snowpea_projectile.tres | 6 +- assets/sprites/plants/sunflower.tres | 2 +- assets/sprites/sun.tres | 2 +- project.godot | 14 ++- resources/animations/plants/snowpea.res | Bin 867 -> 875 bytes resources/animations/plants/wallnut.res | Bin 766 -> 774 bytes resources/zombies/basic.tres | 10 ++ resources/zombies/buckethead.tres | 10 ++ resources/zombies/conehead.tres | 10 ++ resources/zombies/hobo.tres | 10 ++ scenes/debug_lvl.tscn | 38 +++++--- scenes/debug_zombie_spawner.tscn | 41 ++++++++ scenes/entities/Zombies/bucket_zombie.tscn | 4 +- scenes/entities/Zombies/cone_zombie.tscn | 4 +- scenes/entities/Zombies/hobo.tscn | 4 +- scenes/entities/Zombies/zombie.tscn | 4 +- scenes/entities/plants/garlic.tscn | 2 +- scenes/entities/plants/peashooter.tscn | 18 ++-- scenes/entities/plants/potato_mine.tscn | 7 +- scenes/entities/plants/wallnut.tscn | 5 +- scenes/gui/runtime_gui.tscn | 8 +- scenes/level components/field_controller.tscn | 4 +- scenes/level components/pools.tscn | 2 +- scenes/prototype_survival.tscn | 82 ++++++++++++++++ scenes/sun.tscn | 16 +-- scripts/DebugZombieSpawner.cs | 69 +++++++++++++ scripts/DebugZombieSpawner.cs.uid | 1 + .../gui/choose_your_seeds/GridLoader.cs | 18 ++-- scripts/components/level/PoolContainer.cs | 2 +- .../level/zombe_spawners/ZombieSequencer.cs | 63 ++++++++++++ .../zombe_spawners/ZombieSequencer.cs.uid | 1 + .../components/plants/PlantEyesightLimiter.cs | 2 +- .../plants/behaviours/AloeBehaviour.cs | 1 - scripts/components/zombies/EatBox.cs | 1 - scripts/components/zombies/ZombieMover.cs | 1 - scripts/debug/Cheats.cs | 6 ++ scripts/resources/ZombieResource.cs | 8 ++ scripts/resources/ZombieResource.cs.uid | 1 + scripts/systems/GameRegistry.cs | 91 ++++++++++++++++++ scripts/systems/GameRegistry.cs.uid | 1 + 69 files changed, 564 insertions(+), 100 deletions(-) create mode 100644 assets/sprites/atlases/atlas2.png create mode 100644 assets/sprites/atlases/atlas2.png.import create mode 100644 assets/sprites/gui/pause_bg.tres create mode 100644 resources/zombies/basic.tres create mode 100644 resources/zombies/buckethead.tres create mode 100644 resources/zombies/conehead.tres create mode 100644 resources/zombies/hobo.tres create mode 100644 scenes/debug_zombie_spawner.tscn create mode 100644 scenes/prototype_survival.tscn create mode 100644 scripts/DebugZombieSpawner.cs create mode 100644 scripts/DebugZombieSpawner.cs.uid create mode 100644 scripts/components/level/zombe_spawners/ZombieSequencer.cs create mode 100644 scripts/components/level/zombe_spawners/ZombieSequencer.cs.uid create mode 100644 scripts/resources/ZombieResource.cs create mode 100644 scripts/resources/ZombieResource.cs.uid create mode 100644 scripts/systems/GameRegistry.cs create mode 100644 scripts/systems/GameRegistry.cs.uid diff --git a/assets/sprites/atlases/atlas1.png b/assets/sprites/atlases/atlas1.png index da6a360c500fbfec098ba64843b5c81db179499f..58c7f1ac562e3defd18ded93e5ed77b431a95a2d 100644 GIT binary patch literal 32323 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 FcRM_;_}0JS?~qnZko?8$xtq_w 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

-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 literal 39237 zcmX7PcQ{+`|Gr%sO07^c)T)u9rE0HMOBHR6l9-{bO-1ZIDs8DEylthe)=F%#H?iA_ zy?25Td;WaBzkibJoSasJRfPMXg&DJanKfHPZK3X0T!Pjob2BA}ZMfFsve7TZl# z2|{(cEPEb!ot7-dPv87>#`uSex`{n64eE{Z62(M7<@GGkUIWHW_n)bV@fDHvQtlrr zLNQDWvOxyJ4Sz#sBzW@H} zf7$ybva1vKZfenk9(4}@45w??kIJ1PUBM?~V%t)W6-n`^Kr6fsD1|+9>gpQKUi+Dl z4LXMNzVZp`OdTdxc^7tROIZIwiiIqb%V7^EXv>`F8|Ko#uM z>dNR;)i!rm>Bo#ob6Rl9NZ?C7_dCA<2P(&uUw`nPpL@OI>n&|Ji(S?b^Ac4*!#M#3 zQV&lm58q}pfOG)AbQJFi*o+sP7JV{$|0J3eEmzm>2roXHIM$((YJV{NA)O%#Xukfb zAE-r-zS&&@e4XB3nPwe|VLr`XrXgVfqmg*lL~A{;1Lu)TNyk&SUy~76H}lM88?{;H zFtSk!A)~JuxYaJb{%F{u5)Mm*qNP-J)==ALOECAL9jS-HqS&M^9)W+!7|!aEbCl7m~ezN4DJ&k7eWilk55MefwL0=^>J7C&s+lb!%Kf&iWLBgvEqEG?PZ8Mfn!O`7!fnZV z$NTU7AJ0E4t%UZB&-%Yra+32q9dysm2-vFa2-GV@y@iE#q|Wcu8+7eJdgq@m$k%ap zO9{Q~M9O^V2inDIyel5_zj5A&?3JZV&8(QGHILje!4G2)E$?RU8(2 zCH*U2Y0_;5GVLiDC!vZcdqPIwZqL_mRVwZikH;Q~r%Oee^GcpF-4n$om^!?ZC{O(Dfn<~^TRByuiG|4-3E!qKPUJw)YVsRC*7v-N^grs85=qI=2a=n^ zECpUMs&1zeWsf`9z%rdNGL4Y#l7g+l1Dqk-{J#3P-EigenENAI2!^VEI*2sx&WE6J zk;ECFB2uS=Vr3tuZvnZu1FqWaEm_#{waMxl907n~cw|ZD%7dPp5I_M?onuE9O!kkq z)kA0+ych7ao)Y=80+_{mdTssQlINI7B_=i&;N!MF3}PQERUwPF>wLU=-(CYQR!;@m z%eJc^mwbXDX$PnwfY1| z;7^S=AhfB2(x&cMN?7*<_O*SPb<(-VSS|U47=hIt}5Aj+f=0TaN1kt2g;fb(-#<%+(Yo;824mn<+p{zf8z25QZZ34t_l32{w6uno!mV3&rpxTC%?8OoST9_gZ{vKEWMD(izc9Vee4{r+=R^QIY+$V-5$7 zF^5Rjqp!igo~rE(cMOd(B|LNU_D=85_n%+BN5j#2`r>e7V6he1lro3;GQStBc8h- zE8B4H28dd<6-~HAbG_%MNwidi!4L=`-Bqb9-so(=rdgw)pEgrdgAo=qs9iCFAyF(40bzaR^D$Hb#X8C znB!RE{mleR8iyndV5c|{!YEBFXXlk0clC=V?_%*%0ckM_$Cn&|~_f zFrr)=K#(nUm71(Aq(V1G2Zd7x&Zk~B*#GC(k+4{!z=`h)B__V*ZpAFK1q8zL&D&@b3C^-bfB>n{sS|xxRtFH_p?N zK48~t?4`de9EIWecJ(P`;@?2r!p?#X7o&fuSEq`tyME??*maFpD~e#bqRVigh6IQ~ zm!34?`cwDoaqeuCqU0nfxH8qZQ$4VOJ`TKq4>`~8DM&w^?Fyo{Skq+*_lde zx?}Ef!|1=wofmy9n*MCi_m4@kG#)~)rhmeBu3ZFsb#j-W5TP%X(w7V7UTcvjMij8f zBAIWJ#%}t0aA{M2W5bb2#+hcv2*Eae@%$unWxm#wMV2&sN8cc`YXMBCjJE9Qc1Us{Jp$j9^Lscjd9&WN^sT%l7GfbvYp+U z=5`9@0|6LU>i1?0Z*!n>g^j9XcFf+rYxVKZ+^>IIGI<}?ko#;T-7%LN>R@p+&$&Sc z{O9O5{CL#KTeYwed$sZe+A-MGz_U{xhw74wJQd;gJgfp@T*TC0H)zO7fqi-5Z8UyS z1P`~Q$T%2Len|o+oQdhN{$~~=cD_82sqVS(wu8`#P{INQ(ezI@xt;1AcaOT%OUxhj zz}V#j@(nMibrXaW%(rMGgscpT!aSeK+>XB*9$HiQaa0d<`;6`55Xah2=|Rb=!4od+ zFWk_0ZEHgNSFY-Yyv+qh zEs;^`UfZPN!4oDW2z~H+&S{E0;plDRox@~-3nwK7Wb&4bLp6c8m71_O0PJ?-TW6vi zCv(q(Yzh=~U#xRXdz=&0l#ge`)GZmYkyPun6n_q!?7NHliP1TGLN3vGd+Z2l#W1`i zSs&SNvtrjCt8}Z%nHE!^sKhwXQt}s}mp2IC(j!qb{RJMvdS7`)$CBrg#8$UY*$gi` z4Ju$ar*F-iPW$-9tYIu8lA#P9O-ArZy=|d7`MCw&IIkT8)Sb{l#dgbCjM^vAD&bvM2t-S8!Te!PSRQFma(k@F22cbFvMhUna|g@d5b=7 zEt3D+fs-k3FOpvpOxQNU(}nKu+=?Em1UWU4aBO)cdn=}8sS0m2LHNS`|&14^Dtlui#I@5>JtgcDvwJu~j zzKCcymgMJz*tF;LL@&~^U19CNS{@SENCKL%!0bJ>Oz#l`$0>&pPB01L(SEZFs4dyx zO2U`=IU2?ww0*5f^${OUeS!p~P?r3EC9rzy9Y7(K*-`yc4l5mNQn?F9Aq=6015D_F z!MA@3!$<7ZWDE}$k^waGQK*-Ugx1GN1sl0buZKGjsKJFR_yVfQO4{?{?L zQJS~0=XM3vZ&Q44lDs40L5m&ur&65_Ype&=I@~3TxCx@HP|CCjxqEkE*dd13>y7MZ zF$Iz_44HRF*bu#MVWl-*dE{)&H+CM12g5bZ9egQ6;dd8Tu<{AI@12`HKY^NVhgVHA z6)8u~;CRD69Y4Nlm-Y^q6^hqJzf5!GZZSfPM7ogSBY>7l(0Haml{0k#p4tATv^%xB zFv%|*@E-~~ryd}Pp||4Y;veYhxP7}5>ct#5--S83w5e;zRP8y2d@x4 z_I^H1_4Vr|=U#dwgH@}eE)JaGwp~1X z3vS+W1{9#ebo8dP-R+J1B^nc;kBCkyyyn|u^GXioSQ^L;yXhOmTGJoy#XkzAsIgEY zPRA_BZzoEe6ZSZL&Gt5T=6d#uoAfF8tl`JwqN-OBu@_86YL zD_Aj>j!(7ixaV+Bw4wQFar_-E4A##z{n;sTbbX+iXH;$P`?Y6=M;|_gbcXtwrwGC4 z(S79t+XK}qA!6S$?rXa=uHBGqxGhqd3)12Au^HpEiuFX7wIJoy^|dT`rP|I)!iY1c z#v!lMrh{4>x?cLHJNOkZnONDAo{OnuY+u4_n0NZ;8=n^qEKCrnYh|POz4YfJlq{6zw zoy5h;KQOotkbQ$LCzFWLCp+J1jx)+jWTOAq@n`Zr&f@+O)O$kkKl5%hWn@-Em?>=5 z<2PleXB~{w_Fyp~bS>)f-C=pe@~WS>QEiEVO|1U4IahL2SF(~3 zNbg7zg#0Au4K{#(D^o`T7XYNCxaVgR-;412!?b;K{)MV5Db8^QZuC;ZQuc&-uQOWD zN%dbgj}%vDM?EMz)FO#2l333AAM8+-1;92~Zj)uy&M_tja^d7yzv@%P@k=;4Gva|A zkNLG_!H4{M>XG&Fc;fv1@hqp@gMj(s6T6;W(*><3oTs|qI;G*t(?KpR8f$p3JGcB$-J_^16GTAi_ zI6U;srTgIIqx+2n$lq(`O+a)>R$szo2oUp5m^MY*!}VqHpZoITQ*8$s?8d!r*NN^t zV}p=QXEdN&yu9Hfm(_qz@A!*ARUi4LqmOe=`t(*T9>cJ`Cnd!2Itys}KU#_L{wSC$ zU(%cmrXgXnZu*voY!~o)a3Q^IN3XsqelGkoAW)CwmE&M^n|`97OAa(%slml<`qyMN zKZ=kaY}|KT`K3(SDkf}Gka+Q^wrZ(crdg@E%wpEd6CL7xn6^3!+!Al+40om`moY9? zmEW-M--8R)M{)ys4#F4ZYsge1Jrt&oWCymG6ev3I(X>}r?&mZP!5@^$6mBspT2Gv3 zerK`bNwIWmMDr4|m=ckKsL}>Q9j3DFo2;|JIqm*$D_gue^k_!IJoh$T0ZZ-I2l#At z+!{f;+=-Xi+gz?I65~u@jEhD=?c$&76ip4$GYEHJZq&*lz1SyMrrdt24cK#AUaR|a zFKpW#f*{&K{oAHlG|i<|D_D3;w5j`W|9C|n zOEC^{fCa&UOZ3GZj()~q`7R&A`mK5~c58?{YF-g_m0vKZH$^t|Bw zP)B=qllC(Me?*{k!oP$)IcKDOYe<#tt#IcyyZDY*KVHl)cZjh=rb0()z-e5E++!@J z!J9Ri2NshV{@B||^Tn(t2UtF;C&Q{<&m3-23O2-&v+5MSd^vwr<=Z$XdS8bxVY&EE z2;SshWee-q85VTN%W`shugoc_GiS{d2G`6iVU$hVr~2eYoG=>L;KPEIwqU@tvZ=$m z>v7H{MrJ%p# zV4tpb*9B)|eS@-BJl?tcP60l;f5Mc{o&PV=UgB>Esy)R%OI3~XWLvKD(JD9esq~CS zmQ-pr{dj-NQ%T)_NEgPW!$jQr)I+b@mALWXP73ZB(dk=)4M@(}LSko5_oIAYYN_l5 zYstptqG3{#q5p*7B%>yikCVndjewn=gpY8D)#KUWtcL|%;4CBMJrn^ZYz561}+o0#kJ0$6nsjW*mm%t-}2a_`ub5? zj6U(fMkL}2;4rBcQZB?aMuN1`+SJMt-?pgGGqej`6=-D9r#uZ&cFQ<$nU6=~CqD+d z<+yRj`2PBsUJd_-BdGt|^7e$m-SF=|Vb88Dha8YnyQ8}FIpCL?9n>JRP{1ksqbd`-=0?YAcQhPXXU!k;k$a)BTXmr}2jBg-cXbNv+!Q zYCl4k2@7Hqp!$<)^`^nUbBMcWr=+F2_}gTRrDfhTvlwCM$#^Al_sQ2DaD86tjD|#m zyn0K&h5uyl9lQXw;^h=n- zT_>^VT?a4SzrstMksA(4x+`(OQM;8}P?z}2sX7w+WAe1x2N*(oNzWm(PbPHj#OZ9b zV6D@rweH<4y_uss2rI9XkHQ4(_J{!mqICr)CuOz!8waRoYO3(F0+9ExR3}9`qy4ln z=JTT@(24qn6d(e8t;XkT|wJx9DoS!X}N$ShPE--Tpdqy~xVnuM&gw z>YIQ|Hx$LYVn%par@xgb1$k{y&scpVU#W`8Qfjl}4R7K<<#}|KHE?Fg^T(B=ZR9vz=}pUA_LT$4edy(Hv*;fzf}s zcl&{8t0`OpLyIXd~3 zt4pv++Z=RefDGA}1;krR;z2&Q&>dC>&V-8*&KLpGoGq2Tc zjLv0u;0{&yYOQ_dw^=1op}TP)ktmEMXWG*{Iqe<|c6p*j%wet;J0fRoOq0@~Bl@Iq z_}`S(XOr&V0PFq7_zJ%^snTRU(oy-rc{;o1WBeq91(wLsyS@HB++wU6v@Xrhwpf>i#KhQhVC^J^(C+lk| zXCY&$>^gc2l0WG+sKPX`c#X;| z{_{)tldS{61|=^>mz7cbf@=NoeJ}3BiN~s-i>TY8<>uFHQ6U@O@P@$$_3LneaALkd|9Qq9e{9Ex(v3s(k%fkY?LfQ{qj;#uH(q1NYDA)+(uBwv-!w+j_ zFLZfAn>34x_p*Xc{T0w9NB&w1;}y;kwEIGWH3}O4R)aIsNB=VtsZIIonQeJZ@1K1~ zl2-;Yd2-C3eHzpw)7?wzY@F9Jl4w7$TWg6)gm5OV-9c~N;$%jIzd|1~1?QB9_-~HCh$# zcOm~fV0d-Lj4@38vDT`N+3J(0{t^Xfq(0*)D)EZj{;l?6W5iU25GS+#8t$4>t-t;( z=mtJ)!TH;Vvv70He{pU+^+Qa_ys}p)l0LWSjVxZnv;Ex2o`$4xYZuqo+vY330A!H3Y`<-Zip8X&$rbtmM_4r3l z1H0*?jkd^TYad*R0iCt{fNbntSSsbsM-2+6&hoA10^7M9^HuGQEW5m&N<3_%R~j4B zzr{iPFEYvk+Uo|XaYL;Jr!%@k%8K1XPJa~=;SCUQ!v&5;=O%FI`)SkjiTAV=Nstgm ztw(|PXu}QD4yL*F+^XsL+kzT_#0iSDPcZjQ45&vnzhpfiYVZ~RwF|`BhFRV(e~+xF z&s|oXg4H05`|CD_X6E;CrA>kpNYD>IG#RK;GP_TkcjKV)Z%Y$r=tG3(_U^vXox$Uy z!-x^fYA~1dREE8JHgH`ke1*tuo_rndbXyVpA8*%|xi9i9|zpjT{>i zZp(c-^Ez#RZl%k96dDb*{Kyt)uIa`7z|hrVj`jiF1P|*z`-5P=#;yV8tUoIFotER8 z$EsMa)#EP@53y>`RnW}4znBpLxq6U$L^X!ZY?&OQiN*D z#>sA(MpAp8lw4HTb9&woPGzR?(3*nL?f;U*7g_~y^p@it=y1^TXdLx7D_8cHna^L1 zbs>%2TtgqG5$iTvcD#FVztkUN>AE!6yxRoG{QT;#%Cd|su9`iJXg0)N`H}Q^D*zGJ zI^ZxDy7ML6{T_asoQG;{N-@XE&RRE1AMA&!S;r?|DNU~Y#*gY<;1XD|ri0V3zK!-y zH@T``GPt@a*Ux3`u2%zhO5^?dh{9tsv$9I_4Az-+Mt6 z#o>AHL`FL=kJYoM%ce^39o9hYcgHg^R6vXD<&K@!#V$ub^vCSquMp@*Nyu9f04!>3 z%AgedxVD+aXQj7Tz0qzd#aaK~AK-slI|Wk{Tz3$c6Anw1@eGM4iJ9R(IjU94+VoKD ziccTohu5t0sM{-*XnSZ_7JE=l~i8x`t*bXubo~O6w}ZsoNQTgna8>k{i466dc|0k%Hx!gIQSr zE~|2XkyP`y&D4MMF%E0mJp=X@yw=^fe#q5LJ@39fuQhokH(%Pt{`AhG2r2of2~US2 zCU)1KhXnrlXSQ7z`&xolDMW)3t-4)r#%|liK#MY_ogif$zHD+jB9ieG&5z%HN!YVf z<$rvHzdKnO*2UDjlhLfpv%Fc^^%%G?`N*HLH&^9zh$MD-K@bxA5;*29Fn9m&I$#pT ziwFH+a?KhVs@(Ik##0jVZiJI*_K%JuxuMP860|AI^9W+N%lvXo%%u_KL2H*E{4tpt zFpu9}&@Pl{l+GoQe0KLKnhdi`#r_tD-EHIP-7|@uXf2_H?9CP&MVD#0EGu$E<^hx* zEPgEhDjy=6$yYwjWrxwP)zxs=$qi$sn*0~)<$Sv4bu98c!=Uj9%bZH5rhzy!zsrnc z5swLZ-dYD&2Hh2y7NCgab!}E#$5?}Ry0B5Js?m%AC4GR?WBU*N0<55Q-Mgm~OV;>b zu`u7sUYX`Uw1N%LK!$waHej^NNit_|qFIU3Z;AG#*j<9o7!g=?t}>83W26*{Pm#oe zq7i+jPaMqh(uIqBa?GiCogsn8S3hSAwoHL1Kxw)>38ZEPkEyQD>33Qnj+jW4fFnI% zIUZNTtKC=&=ME>Z40I`+uG_ zZnu9CS3u3DD?bGDADJ2Dtgi>=t2+ba)K&GeRffUKAtwrgG!jm=Vec4m#C$eJn*$)i zvCaBmIrOsv)H!HS^>E6|kiQm_PA%|Tcc+7PQY{_-6nxRit>F(!Va)KZhikxBk5fyM z_Do>`#SY60BG*qvea`H768MTDywD{Ssk1NZpA5WUu0!0>(tGduhi@Su+v>9V8DnY4 zbjeR#{e>;l9Jwdtk>5t}XT;9(s_TaNypJK=WbFu<{R`ezcznX z0*-Vo+bl0_YjS-4Z}+?TI+Kq(Vq_lM|K6Q6V);1SXw(<<=IeCS-bv1x9q%+hOVYHe zFSgh`egsLPVl?N+u_Vm=i9Z@~IJJhD*VA<_^;Vv6i6qQCTmTdiUtiVJ*g5SRiof_y zd-l6&VZ)_N+NZRiMw}x|J~69cGveic0|o;^q{#Klaxz^klPlLsKK-qo`FH$zkjG^b zYIJvL)p&zyuCPwr!stfWrtcSNjQM(0pqIHw!_ij;$=b`!Ce?=$*j%C;-#8OQ*v@<> zYUv8n9MYYt8Ncy6)9|`E#)&e{xd|$Rnr&YR-x62cfkf&oXSP!Ng>4`87B+(%mTjzp z_ii5xE-A=4yLzMD-?t@%JZSl$W#qcG_7?`)yEqo9m@^Eoh6Pp2!E?Jg6-Jzed^_d= zG+4Ic+*RV+L4^1o$N?|*N&qT*l>2DI(OYX(C4P0tiE=Q2mr&>}Y5Ewosyz5A6rKYq zwEZ~b)koetR-*l^>~>zGd^9%>`1^lVP2v~J%Y&{0`j|R#^P0~lMLvq9|T_BwN&N+m`*lb$pn>3{kFPS!#kBa@jyeyT%wUi!NWQ62C{(8TM zv|@EBJ{LG^GB5|5Zp0VvOC6jq`~6p^5EEIA8{`W;{8gg2Tj@QU_w4A*@Lz;ipeo#Y z;k*kS?N@}iei7QF=Hd5K$~L|1lW5nD(N7n|MjPW8-$14dvrqsg^snaI^%I+loM(k! zQDQHMK8*ACL#@_zzvFT4$$JCZaQl%Dp5VqR9-Uvj%P7U{s4C;n1EF3?OXl3qpN5ZT zQgWLbklP|xDF>1lB34iMzN&^?g8q-7_%rX&q^giq+!_)a_Fcf>)oOi5aLulH>BA;F zm|YLCrRUQ*SYT7ukXA`Ot!vIVocUYz+tB~HwODf02w*5P_o;uwS#&%84~lp~EK2TA z`e|oT#JjT$Di;)~sG3n|*WsF@juMc1@VRJh!d9=Z%?v($Y8$m~Df@{l?Ul9Se?_$wS+3g*);s>jI*CMPsBBY;v{{2_U zWl%n)d_ljba?$jjH{r(3*NPQ4dX4`>TvR5zo$?3dG6so~&b2MTS-HD{@IG@yJq5pf zbI3s1r>?VYK6zZ3T2{m4$~vP2v9XkTBKEMm6nW0(p9w{HW{mqa1HiFQO85?K#;^Q~ zKkM}Vo(rP)#}#iz%47w#z{eDpTxLt1p6B1WxyB}WHCcdlS~0b4{>lPW9^fPavQUoc z(4pyd&NPs!Hgi%AvIU!WT+`D*?6jEZ3J9n?Xgv2@M+3!K9(LNV);5XXgto8vG)l2S zL%r9uytKy-r*TLQh@^BV%)8gTh$3bQ=yOl$yGPdR50x5E=?7cP{Ze$5vQ7*Au_`|{ zotWNORyQ0#PG)@}>SK>b!w2al>zkjt&$ja5NOq8m;dY}aR1Zt|dE0sdkt(hj!i<=Q zCDM?+V8Eh}q=OIV9yG|BvHNeeiFR4SRODuyJI@KR)bg`o&le-f(%OZ0wCRdH9BcqO zfsaQdMBnN2=?_hi77w61&xM>e?ZaGQ96)kF%Y+UX+}{ zD?#-P2At#l_(1}_05ECQH}Qc>*9SFwb8m+YPWgX;akEMSj+7F}GtrTX2fDW=(Kzw? zpdOjGLJjOQL;guK38dHKFr|ekpphGa9<0GFI1e$_vdaPZUK*tkVx7PGtkBZ>4(BN| zpDBGK!;VR<&QE$|XiK@O3q(Nw)oX&eDjrZ$i>jzcWBsIW4Q?dkAxw5elfTcLS9?KJa&)7fgkw8Dn>c* zqJ%y`aHtfPNRFl3j7VwJ>Nb+P`Z z=uqQ+9$>RPf;8hm?OhPUl}Yu$DHe=K!# zvBus+>g*a2PK{mWctz~TDr#b!zlwbFBg*~d9`W$YR^yzMUAldjBN_CI{WiG1@l@-^ zm0;IahfTWWuzpwP`#|s4j;G)*3;q$nIvQ7W#wx}0Ei_WD;Q~NK)7Lb6`z7btZj!m9 zYq3LDBoJn-xKe(mQYVY}g{e1%%eJG#cQX!1J`0uOa%yePg#9#21G2gHsi}0E@V%azP#J&37n+9Jh;VUVbR$ z;7xk=K_&{(M>YJ&|92!FCo^|yI1XqKFomBsYD()qMHDAdbvrzTQ(8+xfw-ma5ZaA_L-n;a*iF>V)S9~H!iqDJ$Y(Hj+Jowq`v)oZ$EkUErn9^5TKaWi$EL0 z4F%}B6EXTnjV3Z_wjv3oV*%^9Fmnr=DB$U=zU+p*Dp~E3*2^d0T#rr%;N1SiIjwm8 zm616KawGjZxQr10WjNc#&IcVH{Wy6(txbDw59ux)4f^s@nP5MuBwYV^%l}^DYBVai zk_&#P-aYt@EZ@>DAL|UG-H84dbfR5(YnE;|V?p%|Q+V-OI4l7Yei+vZFc~3W`ORIF z;!%+1x@NSy)urS)=!zg>C`G+^>de>(#WuNI8Ane%T#VmXs7E);2ur=7CCG?9?i$JP zu-hkvo1z*cOP<~)32XYYmIwZr8VmwjavvV+*iAaf(lV!zyEtzd@iyLWip44iX1 zyc4Y?H2ys^Zv==JRg=AUhr_Z{oPHr3Vh~ar(IxH{cb+$A7@VnT#fi&c`v$W33n}1 zLH?P7K!Ap9{c@r+QcmLJ-H+A7(ubwImaELns)f8b;n9JIt&;_a&U~}hbmsq`KM|l} ziAY)-wJ^OOl6KX%t=X9X(g4zA4DRjSXzQz)PkODK|Hf+;VTS>@L@SDXGYu4}*ZP>m zs~OPo*!KgT5aRRg{rECSix9c?0s*Q>vM{9XTYSJ3PBM9aNo=>fdt6*hX!E1rR?+p= zR=mdG9+qsT5w;x2kK+tsWY+c9#-y`C=oxO)m}m^6$Mq6fXJKEVtc1>y$XxxB7_adH zBGq;GlGr>xRw(Gv)2Bm%m_AlPVVf=qbd>>p;8^{U2x0Nn!eoJ7C#DAKp^Zo*QBB2= zCR}86@zguT!VRo5cMQa8oQ> z7U^FaMFM@abrZ9A(JPB-F4ug;QHagVx#Q`(YqbB6&TKAxK_5z0-8RuNJ65%{RZ;|o zf68DF&uT56>q%(il7|rxH~g{_8+9ITixFMdjzD|iN~n=3kP2a1lvy$l8|%z1-rytQ z|7BZ{l;KEvH3yais~h$Z?t~r@vFyOzr4jv7>DIP=Zpf3;C}7A9P*r@*wpvTh9+f1W zRW+eVR;Ti*IU39@JMpwM-fP%uy^fE4Bxxzn-RF*7*?_``a_L8BKI1Jm$=|u+NSHnT zDlImU_2IiuoM$s5c+{<>ui=w($)w@ z^S3&7)e&XF&f|EF105Bsz@Fu|!pX;fqleV2VJ@clufi3#U#09(#jHFBa$n2_C7&d}r-v55(ETr6hGQJ<#&hfloFG@tDamr2Uw>%LY z1GXW?wQW6s$5K4lD(2OPcgRs%MBWo3{<-y^9jv-AHacJ7euxEE1xe<$s020(0IvT@ zFKhMRjE!S?t-`m-Yt@0IiozT@kKq`WssH5@3N~7#N(%sCWv6W8UTP(uNGs~m*Yc2a z2ytihJEI5o7-zH=&Y+l?h0U57SDg%%Ead(17c=?nj?nsxB`G+ji|l8|7ItH{0E4Z(HDO~y|x zzHiMV_r5!rr9p=8*QZ+UoEHXED&MyN7SObnob2TBP+>g<|KNh_;1hPbsI#8?>i3U7 zusu&FUVe0r+j%AY_Y+98PK?)ou&^vzNatywwD=1#9B%O|>FAea9cM|5O(&keX^L*H zCg1EML+>}{*aBvi4(jK`qfgQV?Y?qC(yOXypWI+TwV9y|M+C>r=A?Sl`UyU$imU56 zE(yx0ZOl$&@Ui7mWS2Q(A9Nq;mXSGe+V3BH;QUC?L-uhB4!6}IaCF*}($+e7d0jf< z0m69g`s6C77Z1*VQil2BEf5-P_KA0#mVNrF9m~Z`8CtGK+3X^AN09baZ-Knb1=XdC zX0ae!T?G!<&H#fez*q+QkS=?kmWAypSgx@uUL+4Eb$0_j4vE`Z6u5lwWSbuC73HbY z0@^D#=IDN7*N|{~k;{d;+@fa4SL6z}A)oMk4(cHwe;Cg_k|$n+?=(Ni8f*TcFqgf4 zWcI6X&#uXG{k(vA%hCbfa|h<9ZTFUz-R}CZ?mf`$MwZt)PyIE2x;6qd4g60dS7TuG zA*xc5T)=NEP>SKuF|R2)xt4BvARs^sqilGj0^#8dktzreccKL@o(UuCj?za}tdHkI z4F6|BHf&o&<<`T>zp&Bphm5iZ8Ve?b1XISU=7!@a50o6ZM?RKeuyIF3nOvgjPJWv& zAX?;h1=L?USHbuy3bA8Obx^Z_s;Gi^NcHXR)>KZeR@B|22W`l`nXkOkT;5A#ew(eVgAkxXiqlWK%nAJ+OaWrNvH_p%_^EJ| z4yf}#TjxJX&))q`SbpXMi~aCZYuuMyq)Yv>6$j$Cb7rJrf<4hc% zezh?{QSZ@-!M@5PpqI5xoIgB4$5{Wzq5}P(`Ur$hN!?pXS*&82Qkydxk&NsvNG3(Q zaV@H-H!+#|OVoa}b7U^tQV-ZWN3IVxZ9MzR9C8%Vdn9u+Y3AkJk3gDJs!5-TZkez> zR%rVbx&U9JA#cioyNZ}GL*JFD8P2~=-F(bz{drU9Ui_e+)hiRlsDe7Vzc(SzpZdSx zUVdpw`T6%Ro_`+l%iK;iT|P8=$>kQ%0Jnr86;NdCu=y3Hsi_5M)>e{R{~b0KEO8Hk1ly}a4&a?;q8VD-pyEWVn{n(c*yu6?w1hz<#$v2}1)#bg4Mpb;VWG+y8DR5a>2rhfZ)3+78 zoV{(zNGXp?oc3IVag8|3SAUerSGX1{AtchEre!molyfiaIfP)Ca05bBwOW401`u4ObRK||NR=yTgz-0}q z>)v9uG&6J@XALmXX1vsuI_QvkB?B*7OsxWqb7=j|tsK?#@@TfVTDXKvxA{{D~=m=HT9R7 z7#IJ+7+_w6qwRbCl_7s(k#Dhg_d3Yyt#mzv`nbXZ`c$T7C1sm~vVQMCmnV(0jUveN zn5>N6eOG{=$${zOM^^h?`g-jqyF%Qu3q6b+ufiqTpQ%e`uPJ#EqQ)YE7}levUJpZj z##NUqB5>&WId}8L2iZVZH0G9np57fP^Vu82t}zgwF}nZ9*joog8MI%+v>+hOg5=V@ zE+|MyBPb10!UEDr=?Y7ONQac9G)PHz?9$yJl1mCmcc<^o^ZdT|eZTLo?++Aq_uiSg z@0qz~&UMb2R@>7RD%n*nWw*m|NsHgE<{@Jz`)*BxT5$g8CD*3auWN6Fwk%vVb^nN~ znRz>Lw}A_R4F+TYz^$}eD{fodehyo7OBflWVfCAME>RL+!CdL@CvDA!yZcj@$Laj zxNU8jI%>81$J8T&7K;lAof)g#&LqapklkRp*<-=)u?swhCA`S#ysMpu;P1d~1&0dv z&&Z(Y|Gst-ecQ|DKkbgVlla^zvYQPK^1Ic0X2r%`5kg979v8TA#*ef&!S8oadd?r- zpXmW;qY&})X_f=wExM7r*-IFriY&bmmxSrrHYfxvdLb{%^)LsW?#?ZRP)Vz>-FEn`0|I}JQk+Q8z?^@hMw z1&d?bQ?xxgO1R34N!B)y>cTeWZ>*CK{9F8h!&J$?zHWlxg({l2f78}1>83e8*Jcl` zt>STIr3@51ZEy%fnj54MnoOp*#vbu&RI*RACSZ7!CM4{M8q}YzTV-F$$$lrFOZu!w z_Fn2>H_AaT0-Lun0LvD;(l(zv_Ve*y_U6xMYdVQ&_3GrMm%>ai=|Z)>QitFN1JO;7 zYNEiCekX|JwcTt1D?>oo{&;2ZWEO+cgpL}&l=!#*l`MK02st*gCBy#)kGew$vW6mL zO&z8J>C0igaH2_*y1nV`EDQ6LxcNLZ>Fv9JZSV2_83)?aG9LI|b=6Ui55^Uy4TaQH zCDG7U_!?qQ_hd} z{`Q?ToAAAF^po(%s*@ z=bK@81eK`*9l5vdPLjQ<5mNh^*45eD+S~ z0!W`J5wLX%IUhfMz5#OWGl9V^MC9ioRFpbPYc&r66c021(>AGW2)!8Sxz$U*p~%{J z1%NG_F|<=#xM=OlUcJJS5MxAH5%FVoCPH64Je17r9CCOqny~p|y|^gcJ4Wv3h(Mj( za?K1Z8X2|w)x5VAE*4)>W7=R6|tstWg0inAO)2{Bi1I(B)T-EKAHjYe#qVUzhXdrY-YVDryF07y^e6Qf0b3mrtS)-Lo(2C3HCI(x#+#FVZCY6+Y$KiZdq+7LY@lnAw{;`<=M-6<;IP zV?-5orv^$%We2~-lNuNAv*j7EFxe7o@Gp;4qWxjbY-i)$P6QDnz0UL%U?nBkSGJXp3 z`DkF$>-2UZ{c6nYu-(RRn*~}OhFOuk0i<%Kxq>KPmkve+QWvKX^R7fe z&u-eXSKVWZQV6jh7c3eNws?vdsdN{DK08D?p+{#Qn-Mvra*_^foa2%9_iNdhzauCi zDd%^rOJxrrRUUcmy#zHUForLcil=5Y?nknq#dW#2v5-#nOi6`-ox02ah&mrZkUM|+ z@}+JMWz#ili*D!sLf^uw*2*dJ+hzJP^$XHYLu&wldJ?VY41Nx8`YM7tDe4-nT2vI+ z*zt-y9ZEwK)_e7={s&!lXq+Eq9gsL9vjWS0QRbQ;hk-kJDl3`1bPrm21_a6t^dp4s zb)XH5uOZ#LwX>uY)e4$=Y@n_rw1J|V4Cq%%BUy>^GOp+^G!D=;%_hczGo~>BgO8aK z)&^=`6bt}d!O^U-a;6cxL&CvoQ7B ztH6saK=fV**m*FvkdaD4V3y6)(gK%8@OT**Mv=-E3tll(3Ozvr&IB2K3X_xmbdzRY z*JwS}(&j6}Z+4{(rK#hkyrDx%kI0lBSjgRD^`AI8QZfhZx1V;1_c(NyCockYGH?KX z4v8WZ5c2$b{LKh!rs<&FHC`L(cC(TJiZkxr1M<1Ewo`ba79tUvZl5-_fFEtQK!DFF z$24dbwhwPrDdXfovavT|7%T|n*3mQ23#0Q8wZXfCRHFi2pUBXZK-^=v`aq2v4TDsG zKLV=uKU0=LQ?7P4*VVw+dUj8%fdfdhA2ogs$=o4_lmey%5v#rMDO%&+~9*7m!6 zoIrUY_9t<8P~6z}?6t~CfZ$NpKm8YT0PwndrhRCVl^Zuw*l=5@MpY11D~?@GyCCc< z`%Wm<&2i`3qs0;$lc)J6UUpC-OSOsNs|y4*1z@2hPwafSfe|7rDkjEE>P-kK|Akge z4C3&O8%-S53AKRzRs-@7vLT3#KV#&)1m*$cF`vdCTY$!OL`rilKquU&@EhJalA9gl zt|y9Y6T|P#cKJB&EA$w+Al8!1I6}@NJefUCm$wmNtmFYa%oBc8nfU(Kt_unG|9dhe zxNkmQqgyo_8-ckg+C@ApD-mC*j7oP&VJgz|rqOhPc7aFcy2bb4JG}UN#*M#TqPZ;_ zYMy183b?iG9Q(W)Z?DN9E;S^S7!skD3k8~u5A{j7TW=GNYU&5C zTQ8YMie}QIdvg$p;0cu~FN&jj@W{ikIT$Yc7HwKV?`TPHK`8AFJ;Loxi6rf7`)-m*RU=gBO6`56X6+N(|l7a53l@zw>2O0?NqD69Lza z6SM3((q4Bf(ALGT&`&USE2=~SUKz*VZ&>x21Ru8(en>>WIGbh_Y1+kYk!m>X^3}pw zdX9xfbXe1A0h*a#e6i~IE#vCY*CgcR%TGrlZhKI$!uXo!9A~(VwTh(iVXP-k2dldQ z%y|dDVy;+)X+h_T&XBjo;m1m>vcTeHw(HHZMMmA7ny58{iqPngUw{QDJG}lNaZlv3 zUuv<0s}6rNcPah&aDSxNQHKMtmqCh@tM8+hL0_Y!ZtC(^2h`uVMY$gqiaW$rRk{BegDl$Sq&AU8uPL}~DsY^;B+ePBm8|3=NiCf*%b`xQ zy${xK;ht;8DPc=q$|{Jle;^oBt8EMXyg?aqy(fq?1cf-NgspP}^0OQ!ukokpH@Q;$ zL2~g6?o8Xdf1OK(u%J)qaSPAmw z*4e~;=PGR}VBGg?<67_R9|O6rBdtRl1jI3GamfMNG#UV6ehyWT6Izf~%;6<}Q`JaDv z@(F3v9z;*ifdw0*VIh0O>b{OK-tuptWu?TDNY5j?789jXcDAOZ$X6dtM9MV*^_qLf zsjp#V*QOkw+>hB;`W(O0r*Dk7C^#i|q`ttvTr%?VfRhiEj1nk#k!&H6TTH|JWeB|e<6+&TLgFvF{v(!8NWjpFC*P`J&;J3H-0S`9DiqGGi+2XB;t`{A zH{CECOC&d|Y|muAe8C&zSNP5zcZQEAG%cHC)6(iPj&m`eChz&5kd^QQ4Fo@!d+*`H zOe!UnoR&S$7Nj~DIe277fA8%gkbun_4aMC3qAxCo>1C)j0DtvLp643x=7^^cOrE&b z+7cz2O}NFVM}0pPq;II&F#`TXbp+AIVfz}U=eS{IIBwL}D#lFFh9_fPIo)pBkNr+q z;1-F4yyNJ&BuZCYz~l^{Ebg@gR^%_cD%2UlV?Oj7mQMxmt!>aoYFd_`%8y9<|B&M= z*}E%wnEx`b`b?hqaV08k4k8XsR$xFROGN@B8A>mVzkiviW8JBBvyO|rqKd>+g5168 ze}wFO?f11gxks2p+_|nVUT@w&O_jrQ4`Ddw1h`rmM0wjDItS4=CM*CRK_W%o8>%GV zQx7Oc`18u@|9oM2^7YbXV~fmE7t4V(g#T{s5iP8H>aK^0dcO#Q=B#xP=F3|1t`=ge zD&$Myd?T#r(RK04Tl1*;Mc#d#h$@9p1KlI(=P{eawi#Eapdq3*C+{!E1ij;zOvjo~MFTunp}B<$5k5dCp(9o1n)@UA$q3TR-?bMgGz-55NJP%SFm0yYS^*-|st6W=+Q#U>fQgyu<0EHjE zNjN{NyEWFVO*Nu%TTO~LCP^QSzQ(W80c0LT5XXmdRwC;!YbaqB?%~ZH9LVt67n=uP z%^oqAMUciVBvGE@;wD1f`y~}JTTbF?HVq}+W>uWi6dYcw*vvG$*HE-;ai%27CO58S z7Ok|oT9>aP;(^6=6fvzaFTnc*BX#sQPyZ0kz$oMNUJkSN=m%|63MpV(g5(gErdD+& zCueQOJ#YRUcHT#v$RYArv%858Q!2RUnAI8{g#r;Qi9%Yg2%P7uyzVvWv zewqrdS;BjY^CJ-o$*bJ<`~7zF)YM(x>w54+*3sMm*xOr1mkO@9IElT#5~@w4cCn)o zIo=p1mF@XT8m?$CkU)Rk%DFf9uXNit3u*apD`P0Qy>@$&eG}k>BpDqIsZWYMiuP6z z!Fvs96vE&|dGXO^{8|FQxx{BT{7^nvw)bp;%Ki;;ojVk#x$!8q8Ja*FEL#}dcMZNR z0)l!QIFPk0wO0SP{&ExLeEe#Ap!w6}YJzfUn%8CKIN+Ux*fsJ$dOhRaj$G93-OWia zR~)-j_jdMnkLiQaEdnqlCfap4M9xr5wX>g zK;+MY4SgC@w;uEh^lf&a6V&Y&PeW?$c`T-^<-y3M)o<#?i6bV{?4e5`i9U#_N^EsP zD-XJwD!^6~Tz=NaQCmWDDp`~iM znVnEg*}MdA5rVe6;^tyxS6hYEXL;CrQsFXZ+uNfFpCsld-87f^#f%tdZ#0`@!G$-@ z4AHJOUIJ^iQy^)28{xifa7I0ardk-L^vu^6$!*H}`OPRz8vFC0W|?z53&N(8Ai-Fi zaUbJ#l#8%Yy>C(PzIwYl z2#WxQnXO;#vLXcJpL34WA>E0440kwq?=Eoy>o$k%j3pclB)j}XN|voee`k0LO^1{4 zJO0HU@on1~ICd}-zquLx#&+<701m99xOygKQnqT37az@;!=r*Z5K~ubgcp1v@BBilcUbAoMmPcykH{|5ToavL)`UwAC?-Bmb?R zh9SZ%^M=2$5$<i7=)G*+lyCw_wKex{)KiWhMR3zfd0I8_Z}0!E2o)U3r8>L^a?DInx@WE zv_kFFBJ1}lrgEtV$Y>OI&ifTX1DHq&<|mPZkj7^cXS*UJ5+!ZlSP4aC{RMT_B)l!R zlXh{7(l>Xt5Xdh*uPJ6ul@NjY^d$j_U$(kx2x=ekHpjtuo8kc z*^;VOxL(Tn#2fl;|plFgFo}@qI3?497+aVE}%=xSb^#S8qjKZ<7}o4Hsw1 zJXN9g%JE*(#$3&8iu#>LD^UcDyxdwnk&VxQMZjZ1NZ?cUhCzWY7Q8L5&b@0YGs1-r zmkV9dzX){|Jo0B?cWtd0l_=v6-c}-PO{%~~dCJ`Np|iPZ9!SF@X0zmaHHZi5i1j1U z?{1hz&G_c3PkgbWigf8-q3~SqxhlB(=?H7@x$otm^&}EvE&AQcRnF~F z!HQb0mj_T1+qFpu9Q&Qpxb((E^Muy8yqVCend{hHua+}d@R*qwyPniu_a1go3~L0U zNjB4Cg0i744>z)xZ#47yet+vdn(5zwPsJ3rU7xU8cFYv0$lYk@`ARocxsxf-m)>RHjIrT5Q zKDmhcY=)L`;eddh-0a)IDl@wr0T*BDTC+FooG#KZX!5ckoetXAauY}jG+YbU6cZE- zykz*DCKJ*HBnM_DnAsbt=MG{YD%*IcjNP^~Oo2p-FYU`3MfmVCCU6JOs6`?g=qA7S z^0L!zi+D3aX8jI)%|54Od7a}SsLDU21E}ho%d4vZ0~0Hs@Es@746KOHJ7$al-`1WC z>r=*=n4u}dIHYa1Vq+8Zy+*|(-_AVb9pC+uKCVQ%H&|Y3@O2x{qv;Eo)xtO2jqTNG0 z5R@VSBw4)5S?{=F1`mm`kkRT%;Y+rb6kj{w|Zzgzf?y0mrJ zLuxPSqTcS89`ubYxbQS$#C8!qp;6Yu>o3^leC$#CKBfu4p+n=)8vo+!Tw(!Q=Ua@n zKn(2Hn{Jii#RpQSqssBwz-Qut`MNm^#_?w?sSNGEy zapCM#=CJ4VS_QW5<_k)*4L0?co|tTBvPrB!UL9n$vTZv0#sPMGGTxbsKE0v=G8 zu=7Qf0P-Awr1vE*mS7`#w|!2#SJqF$sf_VU6ZOc+7mQ|bp)wsNg!#|6IMw)i5Ppi* zWPsYHs59~lo*SQDsD+OBtAZEICt|}sJ#+&VPhfT5913QAI|Y<$o=ps!wUfruYv>t& z?+=@ooGg5={(3{&UX->JSS^&cP5g@|R$QT9@ zcrRH*_yJHeOIF(dLdqb_?7P! zSbeSma2-s?0c8-O^`(M z2XQ_f8UK4(;Sy341K3-uFzpic73KbH0$v z0Nj<#fhW`t)^cE=7~gSxZAK#Dphp^KVpyi{`$!soOUgnYyYSC@6ry@}4-$z~K)I@z z*&1lFm2r>?Cj>uAUe8ezuSEm3`@>@VU^XUpw&EMBf^jX4OBen&X+quc=Q4^Y0rO1z zQq&M(^@H8Y-IKDm_9?sdYj4u_sZbYLGS+o(YFWMqV?+?&Ssc;i364s_G2%W)l>$G9 zaEBFrzXGd1fs0{-ZOr0}$D6x`UiX;>xIKfEDx&3|<~N3ajWyBl2!DXc2b-I8;ox2x zvw6v^V$JEE#k*BoIq*cD02-b9 zCLjQxjGRl}P`@Q)d_wYJlP~_{ehx2NlPpm%poq;;Lrl58y9ghd7mJ_2hqQ%U__Z@& zbH%!I^6)Da56s-US50Ie%-`~**u5es+Wkj(AB@Y3VImxZ-ljtNS$tdi zG_r=;*Jaz@c9tw`{4T6)@*$F~XYg|L`EHF%CVd`=Uw>M1Rx^KIblRm62Tc;_LcP6M6IW~xIoq50ibL`Sr`q5MdGw#!i;#eU&|*t(;1D7Nev~y z&IIdqY3|n~Ex^dP+2^vCl3V&SRE?~8bC!X^$_*3ww45IBQsR^_O}q8I za_d zcDBQYIOj;hy~L!I++L+kS*{1-Pe?u8@foF{3(%LKQ)`bqs1yeXiAKPd|6O@DKm*%P z3UK{Ch6^6Ug;~7&^aJF~)|^H6I~wyPV9imc>*kkeJQ#d{1p(Y{N9El>3NRpxYwpC^ z-NTI3`Sq8eFWuWAmC2)Njzo^Mh<=l}Nuc!-Vf-k|ffy6X1Uxgo1Y%CpsdltHqAe-V zm7|D`0`^O%4qFK@HV!3QEKMH*9uA}vv5$S06k}}V23-tu(y>Ymz;VD|4Ou0nu@i?% zvMrbJT0>ifh{%)Gn*8S~_95JIgBg^k+z^5SkFbbLp^RLT_RU-=iaYi+6HXj!jMmUf zsDs$v)|;$8%2|KJ3?kP3b-{cyF}QQ9Vp&d*vx6{c?W?6*6A+VRN_T?pJZQEbz351p z_}cbMCumB`8p&YkDc5cn8p?-MTq5DSX{ps&j+)47ThRitS)S==BFKhTHZ@q@-q!|w zR@0S00`=_WE8|>0{jAVT0&6|1QnPdm)aRp9YmGkexr_cvJFn>DnRC#*rMMl{aWy98 z#k&2sn$n!gxI9{bI3b1rf)r&w=3P#cGPko9ZIJQkQHfu5Cj;_{_C)O|9>fVhy`dZz zZ`qIl21(4B)wD5xYt8tE$oF%k2e$tQGFnxLH>iUf$vsf}afcVPhl zPk}+Q0n-_b+L7jy8i!c90e zpnmE00=f+Yag~FN-87-q5_gADDFD&5)i|tzD0xA^0(9Vb2ql0d^_^isasZS6$g0MK zxC7nO0f&?|e#HlXI?`|pzYN3&zT$A9e+}FU2_eqqPZ^%?KVrTL1!k3P%fxN4`S~o; z#4utC%z-lh22%z^!wSD8ZL_$+GtaUK{~iY5DGz_Oi8el2SzGCc{{X@BO0jln4aEog zuy~tdji8h}hg>sMW;7}pzc6M3>sgqKbpUgGyfttW&M|W%tbb1sqmNIX;uittS4+gD z%Dli5qI^iONZe^=2=`0)9?^40AZG^9{w#Q;C>Q9*Y5)oTAiWJw;}0GrVK5p&|lYkKfMclu|6v*SF^} z!yr^=R9Rb=6qsAA<-Bd>QQ>0%+T!10q$M?Swq8oiZ(O<{=sIpbT2Z*T3~#T?;h|P2 z;4i#yK+x;MT_Hucrq#Fgz_ZC~r$d?wXamX~qB6_xyOxOBM{6F&aFP9*k#-?e!wjsw z83m*&msb8Y-&v3y1Cq1=dRMasftIV_xXVYeXOowQFdffIPL|C6w$8c-kOFZQWBL z>j`+JN@WT$8+8mz{vf?l-`?K2)X&uZ^*lRQmF6Q76JD&90;XfA1tl&kvz>AbprS^A ztM5^J>xd3V8Jk`bC^=0r+06tfd1w&6x*b^~-Q((K3$4>e#aV&STl{3&hK zhp;S{M)W8FT_n%jgCJL!k}Y-~w+k^@E8@-ec0?L38n6Rz6d<+1`@FhWH`2iw5qFYZ zgat$a`@LPK>!v?tanY*=wcaB^KkXcv#uuL4-O8Yp2mjV$;1;;(}iZcU?F z@J|W=W26UQkkq0s>=YW}b_5Ld@J^~~G%cL$PL@x%K`w)|kOp1EzWa6K&Yu@Gm_JuR zl>?2*^SD`(ZR*Wvk^Tx7=BC~wSx3MIA$j2+YAGjhquIPtkt`jgG8rYR1nIxsBV?2i z1&qbQ++neX`5?5=-SW1AhSxRqyrl6pOY6ulA|O>;HR1?w zaiQFnB4;OobGy!d`|5=6Zh@uDTa?M2H*R6`%xbxuEAQ4tw}qaG1H!Jnolxe{3!Trv z0S9$U0zLoUgPW7OFYZR_^OBtWD1C1SGm`HQ^%;-I0~zyS*Y|xrARtjq_bK1)FZren zDOqIidgut7NwXHOU`i=|Fe{OZ>ATG%KeZ}RD5GvmYF2MwZ%aJ0pl>SLHU0-T-ax!{ zr-a0GAjUEthOv2~DX)lFV(xUY76tA;QsIQ64b)U~nq}hS=7?=V{~(xH{6ca0Ov5O^54@$kNg?3e?rFdHS0 zP^wvtPSdm^K4cr;K1LPtY#@q62_kq&k40315xfMaD}aEUZB6U&t|9LM6Xptl&D=oK zBbY*vE)qBRP0hobEE=Z1acFTIv|HT2r4@2dC2=3ucf+*kAyn74XDF^Ss;(SV+Q+a= zJh(mbJCCgl1Gh$FsU)Aa5miLhW-7}mdGOyWedAzvF@ZySpGfafxCCQ*(yofsdTM!`alM z-H-2b_@n3PH)}5Ln!K?t{R^~A$!It?+LxGUL)=qIF4x3#eUL%f?-de{y)Ymhg_gjS zB+ul`f?{J6E<9KpcpvcY`x=7{qK?3;1>E%f(ak6$g=9ZZrJsJ5r(6NV>Ctf<%<5Ap z2u%qX%`&${8;|CmXuZMgqLR5JCg4l__Qv48iX>uG#_CG?_HkYExTN!zF)-zgBzJz#^n@glriW#ua(*Lg zxT-%ux6YaiXZ!3I+JrYnMill;^LcJ$wUsKHyE%4pj|MT&AL)QrbV@`YgvGZhmvyNH zcSAcHX|D1`pLV&v!;nO#5OyZ~@f?iu{Q&=a++r932}>HCEiS8U0xtU-7@${7sq2A> zGx?hT%Zy1Rt3SG$CZ<{F z1+GkY_n2Mg+~ZTMdTw_;NqmZcDcXn@@MzaDv`$g{WYx(FuSIAoKC0LyiZN%p=uEpA zSmwXp*CaYzr$U#`y^ZisRWaxL7Vb#GtovXRSR4cTTdIGQ=YYs3CDrG!q)Xy1^ks3H z6yo0tjt5LPp9|v{;k{Wk$fup(8MzqiM^CPnkZjn_f}@#s`Bt?R0!4-(hQBdLt* z_nd=%D7bNDl>c0y=MU3_e&si(1srLIhTB0>2wX5F$VXVsvWR% z>BlfE#4R3~oCrMlB6b~=jb6Lsv`h0mip`wx{4l3-{A9+ z?Vby${qcJtYqdaM;fg59_k^keC``x7%AJaT_LsXMdUEVf6R$OKLMaY$<$xp6MvEPi zd-a#Dn@s#k`u&k?fF3B5M(Up3@R8`=a))*dH*5WJSlMmc>XV$3Ti0mx!9%Fy*7@>% zwETD(35#K=7GTYPr0uvUBIS&g@Mr&%qnqzN{ zU|{_-orr1<(epY%B{SDDZ4ODf8bEPUM-H~pVzVEX1NXnXQ$qr(Z4>cA0Cp4H-LQT{ zV$Otm_!t=50P)n(@okQTU*4ZMLq#200Vlb%+LM{dpKHwdDi4cICWgt5dGmdI@3p+Sj{wI% zVh$EQ%(%86E;v!f9Dl1faeZC7T7v5{9A%}(U_&xXHDCI!QR2|UKADYpc9wG-ab0k@ z@HJ3*;V7)nB*Qxc{vH%J31K|RleG!m9mdGA6eZd6x-CO+Mn^ADlInixiPnTS?aaax zN-aeKEp&llLR!d=ie^>PE$hh&iNb z)zGiT8RUeYJ4U4X&b-{r#h0^j5`T|a)I|7!{zgl?`VF112;2iYcM96?0M7=-9yvKW z@BY$8PM~o#gkO=Itj z0w$peVX7uvibSMudyA;_L&|o4ezwdaass^e34cuC{Q!OZn_MRFg(af(`T9Hj3gRw_ z%nMzGjA^=nTA#}vV0irP*>>spPU@eRB8dvOP-Q!0!%|w8kg25>$pKdyXc)eTKGp{c z!E?4Vox;PZY#O|fwW5tS>n~w~r)e`C{LLcE;2?azrfgR7Aq>Qj z8Q#e$xu|k;6n>H)No)zA-g#2C1(Bo$BDy_Sg9blqk&>ShHpT4P4L__hPDEi7M!&aH zL;mdVob}tyQ))WPBJ+%x%r3aDFZ(axjCo=sIL4_H#jYKs7xGSMi>NHIj;C)Y?mLW< zdRA91CizU$>gTs8bviQATz5qZ+0zpSRs4x@*ZUp=6I5GP5Uyg;7NrTA)D3AQ{!F(( z1I%Amy_e$z0L6sXB?u(d0(rv$j!2HJKd4Q}Bo;bcIPHmncK^-=0G{w@$`lPL4JGm)T!B=1b7JpL6`u`w&ubeotj*DCoeIP9!)v>@Fu1VG z=`HHazc%jAkA|L#de6H%MJ(VqBR(F2e&Z%{Cfe1PKPvZ&$TNiJ&Zlb6V@s~qP+2^i4MC^{H|i>HwaaXFYd@H zEETM7-vW4g<^4=6JPS-P7fUQf8;HOQ$JM}Bt3Ms2xOxIe&3|Yn2K`o5ZxE4`X|^A1 zZO)}-W)-F09CEOGGVu2G{?i*t-opOT;op8X2Mb@5bA0}E!iyzUb4wsMc5T&8E2Oiu zW_cjiawQj3nn#`ZPK3r<8fI^X~k|F1W%$^fT}kJ%L35ee=O_p{|Ie=;E4 zb?E$nSKn*>;sw4sHR39YGr$I`bF@Dz11}ZyR#^S#Y|LAZfDJ}Ka%Gmfky1dz4-k^G z3sOX307hpGC6l2w9>WEUw7EKXI}gS}xnC+PjRr|aDn0V6sI5v0VP2+!0Y7G!8i{!K z6ES|p@Be&>FsrD%Z1Ol*uojWBQ8G89M zZMU$056jX`0d!x^Q5JYsxIMucC9lpJQ);0X#!s`+jbcU3a4c{IJ7)pdtj8W^FbaUYVGq^K*k$(yZXH&XsScsF4#$#sjSa&#H`MewbR)> zb4aeMIWM{3@bQ;zRxB4lzv2L#VCOI|xv^by-^*a5Q3rXI!qF9xm16Z8K`enyPu8F8 z6AI2+nkaMq=b0Dx1oN*CV6*@SHNt%iKe4a4*;OvSa99w>+c5K;trQkxEmyzx_)k3z zD+QhkNrfk--mR~x$3}|W{!Q;9meBnvT)dx9Hlnh!ooRG&YTeIXOW~oKJ}unH@;gWv zZGZi}zL|3(ofvI@urSGfB4)@CW%ql2ANHFpyYKE~yK@$*EnuGUdnSJ^oAx^@p%(D% zAHx+DDZxw_SGAKR%IF5jDkrj-SIq?_SkZw%;Pt?Ufj?-IoACuiD&Q1+k_b8z$>Gy_ zWdnO@U_lvh#)-8-4;*z2<@inj5qy?7bT&~1jUohBzU*am&pI&pNn^t_8+sO$G_?&_ zXXdhSsHHXMku9nOOxd!oKdYPB{}C?Mn7P{k)K2n##0JS0NuugE0?mv;?a`*c8!~%v zK8}G-SUR?H2J2rkJ(ytMuzsOC*&N}=(PIv}X6P|N|L1zBT(~z6FwBYkCIK=~`+APi zQ_#bIO-8(%tc7Sv=tnF58dX@u%AL(I#GLnUjapA6lGRr?g#fBR6*D^gW5c zp5G&xP>d`0*Zwwvx104L=cQ83q0mGkIt7Oa8kr*2bC)ymprnQJ$Z#y)X7k+T|JJ#+ zJrD#M0q#{h+Z9<|_RS?iGxPRl<~cQZrt9uY#D&Vj;GMpi?aV>*O3mbk?5IVHwukoe z`9GtLjk#%!=D(7_8P#JgB?M4LY93Vmhdh?`>@8gL9cjRLsy%2ClGJ@Omr;_a^Hvyt zb}bn=Ve@6mZF-n4jNt9Bu7)wIjA6PLu_}CFdZ<;#wdtLYTmdwX!pRl{$Lqn9fJ7V) z`Po|?Seb5~JM5F?9N77=5^F3uhT4Mm0Uy7E&Gp-qy>phE#t__o0b5VU;$MfXz*OvR zU=#!bsWI7se%TfaGVFl*1$+@CuLcBvZPm~*f=Kp;S(8BjXA@`Gk82~fiUnU!p`~Ugk|KA@H zj_=@86Tj(9TiaMI-ZlKTJ;{xZbGK&&RkK@X4CbU&?EX$$q$+5kA7Yv8hCh8Z(O5W@ z%rn(xhtZt=##6!pJ&KSDs5PlUg^86(byYFl4Q|$|drkYsnaiGxWEt+k0BTv8??4G) z*nb4DIy1kS8{&@<&v3E{SV5$Y^5E|U-GP0nB1G4vU)Yin-5co8H^X^s!&w`cwWv0K z32U8#J!pyA`mI^xX#X$2-{tVJbV0iQ{}kN$pMvM6OaSD9?;&u{R+zT~R=eyM*ClKO zMd49q3&fDy_XlP=`S#j*Xt!gz0a0WvX5*}yz?m77XPT&G;}`T1x=_4@zu0v#hr}r3 z<8=DAoVt4|sV7QhyY-MV`){KNFolmzG4VXGGRDSlij)_B!r;YVx4oK5M|Z|rFoySJ z9$~;yJ)bPx2xqo4po$UBGxmK%Zv5Yl;D6=q23gdMw9v@6r_k`FjW#iICaeFD$o}^s zI(pVeEjf3sA1#dcWZyh)v@vAP<&$ZePI>BAd2y=%my(^lm63%`m&Z&b2y}!z-9r^x z;7E2l?h+lBfO3aWg@#)j2A~(nll-PIHY$e~YS(h_$%cj3H$_h+gw)14C_PkBOMdj( z2yoMM_1T|3C;d&8HRmz_Cl$LEgLa;%oK+Jf?@ph@x>6ftn1vj#)h=lM<>eKcD*DDrW3eUd%ke})ie>C+$gxBc0q!m7E|-^ zF`{|xvg@#S`OV#9z>lN72Gj2&Uy4>3XRZj_P1e-AIvM+0VOf<#q;NubAPv8s!?lbk zM*t1WX<(vRvRqmvOvAX7yXn)&*>?v;OYwXa#m@VRCrTrjMGKV(GzuhG=TOLbkghLPKZz^L%9OdVO~&;1o?1tzAkFB7B-UFhz{MfYU0yO?mf6{3 z2a%5RjSbq%5nVTm?0_aYf&RdUsmzK(xgBE}52y3$GWXxNj`byeE`_{&1!;ecVDtjZ zqy^}B2kHmTtIC~<9mD$*C5PPQF6NbgpA7T@=#$FaaH;Uvxax`ji3+v~R1MWB>mSx{I=bq{^X!&1S}2IY6LKPXEy(c@Rq2^!#3=G3;e}uZ?uB z_}SN!?wSEFW>gowx?Y|kxxf5j-_u=oVydm1RqAuq%*MD=G^2P$>#6mLj`eRq$G(vh z&t&7@(N8$-*R6ZWYO`j3ZZ445Re7tSERZ#wYam7@tawCYHx|e;q_R6qr3U${*Fx6C zwvTse2d&^;glcR_Ag?Dy#k52qRXduKB(0`PsGCkpPo)w%jxuLWKfB-J96rMb94&e$ zN;{>baz9O03P}Dr9{_alak-0R``^{-{RW5DH|#2lBHlH#=J8C$$XEaxYLXP>DIgB! zitzQzew6^g5>}ea2-j3vKX5IvcEPQbFqU&sGeM41HtFaYZjM?fWv9*e$}GLJzDnnf zflJTK=$d=IY6%4ZMz$>g*symgnT-E9%hw&J(z|{6X>c639;v%C0YLpQ>fT@I*Tui5 zZ-(rXHGB%5w>0q+y^ks%mITsPB0EI|f3Kl~liKCmrQYugB6$<-8?y_RgB;oygUCA# zgTnEnFyQBne2x##wTL~$zk9jYXd(08aUQj+KAYLAiE+)+%t}fbDXcZ~TvvgpI$^Te z${q8yP>U@r2P@W;{JbeAw2k`A`}>;+)Y&H333Jy3SvWeS+l)BuGZQr?iBmYAbz*gJ zlAC{7XKb%D^k;Ehf;F3Zz>q^TWW4+Nw|c>&1{5h> zwj}^*aA{LdzU{)pezSiJM7!xG3sg-!<^}*;!=7R;(!)-2kEd~TRjx<`q~|@*^k@+D z+jH%g$Ori>hMN7Z>-jvPg{*$cew~KBf(#z7-S0Ydgi$R~70L|YpIiAE^QBs5apZTI zvCwo8?QrXquFMOK2AjC}GN-SlG0%IjUy5`yBlMlYc zaSb3aHzm zaA&t!*6;`Cn=oLk2hP~T!dW;--v(>ebV+hG_s`VueS0V6NJ?nzkSeAieJ<0Jm`i%* zgOZmCK+FejOu7^m%`F5K<={<5U{DhCpWfH=?d`mwDtJ#gU(bl%A6-HD$Yab) z;qux;34RfEpQj4yO&Ff<90vAqkoXpim@Z}1+rbMw=J7b#f-U+IsFd_0lDq(2bSxGt zUNf=Cv@nyU@9FiX=gz-y=B-Ygk#zzB75fmydHX9s1^K*Dw*5s;dF6uz?_X+UCUuaW z^Ie0X6&eU596)8Mna>8<0Kesw4w2Oml-;V~Y2!lUH?{9pmP@|hoQ6L+|D z(YkyZ$S~93aN`rGzGJw0!~vit8UY#`XiL%-@&u(b*2O~)xp5);qOjn5NXS4Nt2DCC z6tKuj#Tc2Hn?XgL`qJo==NrbcxB1Q5E1}b`I?EV#OT;ntUYtFEfRMVA4wgB9Z>4uI zg-*zl4=$J2{sNxX`)Ds|VWK?$9?j`=+PA`p*mpWz+5`G<|y_NnGF5!t;Q$(~{F z;i518av=OP?v_*)q13y`KU^*~THSYY=>-*HQ244%fK3cIc|QMKR9xBKmTuf=x47fS zqm+pJ*&9ujhN1A{sqVx;eU@hk@uIqr-E?K+m%ksPH6!{)fL#(S34kyRzMqc8xZUIi zBSN1XXod=aZ6uC{R_Iv%-s>4^0cZvf;meUA=3Z+Ba{_$k2TzB;Frd%&dV(543utvL z!Z&M=E>pSQicEn5kPtFYiv9l9bf3)mU#elWF^)I{GHxsIIDi&FGv6D~!_;!&nN#Yn za(VvG7hwhQbZkm%EKRuv?=yd;R7--+Az8@CAM#S4=d46lL zvT}l2^9ZR{AT_iLm68u+o)_Yd!CnA9<8Fv0N2qAhzY7;1v@5DtLD8wAB6ANtjdYd8 zPB1lJyu`q_PP=n16upy$IC~jgs}ZXWe-8t_lqTu^OSU3D>re~+g9!lh3(q@b1&~$xH{k&;$bZkTtP-?w z|1S!_11}kf94`vd*j%S#7QNw}1;$8X)8gJ%v^eg5H4}w;td%kG{t7cxf@9-xSCy&=;>dO^NIE zbBmMtw0olqUcVNhw)hKJX6qtRg5znfQSUVV{u3#P*a_i?Jt<>|WSjk6o6 z&UL&zm=39w+*O~UBUKb%;H1%AP7W`7iyyt=H0T+e2wllECC((P<){Mezq##n1vp5ZUw24Lb0xiVWSkAt0R$rr4WZRHh`nxy&tK+S+WnnV8O^>^Z6XSJ>i~Zj z?nQz;eptET^PNcFRpNt+&KLHeYqPE zf(UB5P^>^f&JD+W1F$X9=M_IDWJ(XQ6VR_V!w{a;YBzlNW8oc=&ti}O9O`RZPy0^f zGX-x)RoHjp(&R?VUMo2a>b9%tWkGvK=LgU$~-ii8xwP`R%~cNoQ!06ps$hMs{Y&# zd69e#9%*Ds_Hj&1N4K%h=5a<=hsq)V?FP+IvUDnk`py%TC9hU$-0o7fuPl_hA$g}y zV_mX^w_(hBrM4X)2fCMnU7&NTj=XIc2T+yA^wiYXihpLzKMq))x363756~kV3I=&G z9lU}rZ=`l?z0y)FgwF&s%exQ?oOliJH#4p*a?#T!7oHO$Uk_|+L2jz;RIpwilZN_% zSh1Y}2|awg-II8!-UNH%T4RQlf%TQ8?LNjJ*Zf=f{AV!-vOE*2rA;5C{iq+cBvclC zkh(4Y&g?hqlBhxTS@jO(G69dK+RhTIXDiQcDeB?%36HX17HDsO2Y<8d>m#<;g>0Q3 z4~NCo*6rmFm4L)<0QBBX86rC=vlys&0Ng(|P_6gke%&}@x;7ir;%>&OO&n(|wVF$O z24a&<$(BAe9fG0|8Hec`Q3R6qxFb9Q>_@A+w2-FnZHtJ{rTeG*H==Y$U#5+mesn;f z^lTogX-ndDhh@{7YJutjcu3b_Wa&4q5v)j-GF>IRkD%J`hmw|q?w4IT!c`NBDS0hG?+O1;P zCw!*VpK(i_G;|=kmyw&Cyj??+_TQRcbL8B1wnKD4PT}A^S#toTWKzlsq~y@*OCVbb zA(odLvuzrB8K84eKz^C3t@vEm&%BHoE1Xx~Kn7>^yrwBcm#YF<}(nHOHXXZNe9VJZ^~ophe75tw))S0j0IpQ24Dg&bOVIt?r+@%%7j!Ko1{Rz&= zA|`NYu%&F`YzgkU!O#M?hclhB6*X^>?Giba;s~Q=0`la^+@vkM9CORR)mV!2hEEvt zCq^uI-d(~Kv)C`WtAwGXN)}I7xF>lf3h0y7vmJl`{&Ym<`mYv*eiy0n_i#9aUf-?= zWU|{A4SFspO>a4)Q;!bKoxLu?vDHj3?0c$A_a0L`K3WRpJ$@iY2YpBp zkKnv}c`_qN5PcDBTIb8%78@GX9SCnpAHtiRp1958Pua$-bft3i>c|JknE1C5uiYQXu=MW{0~ zbzpDj{`Dd6j<_Z0dVXThs2N6U*dZpvq v_mAD)(6VMtoARNfqvLR}yy|FZNOuAJ&jfybHg*uL#igGY_5z@>s#;}P>%H5}&C<`A6 zk*0LNCxkuKVtl_|=-3vr@k8@Nm@P+__o!Y@ zvw%FV{pFQw@`Jj|$LgGIAvc_FgoQe)ZXA1&dlf(T=t1&>isN=iRUGNP_55Ak13b(TlA5!Vb0R^ z1OUi7PucV-On$tm(NkX3tgF5J7mi;*Ic{zFjJ~UT@W3D5)WiRp_MYg6ieYUDZ|g%| z^)rN%YcZ?hL37r`$nvKSZtNzJ*&=C=b@|??1bE!IZfBnnB=Al6dO=9c+g_XYW=#AE z*Z(E#>gmPKjf3fR!MC!~d7&wY>)(TcJkc2L=F)eF%y|ic?+V`w!Y93a;R-AZ=6(v# zC`TfUqitbyHn9`ylqijTZ}53MfC_7H9@;8C>1eYb1zfL zmq*kZ3CJ)`Ju{2{O(E1VOukG#Rk2b9eN*BDr(>oj3^v&S@TBNu9P38L+0tf2>L^`|22PoMOoNZoDg`k-eLu5%8s)umg8!22rfN>0?Z}2&Im} zKsEL72+X**O;!Ypf;_%$m4q4M1)n*89q*iHc8){ZptAEI+UyG?-e=#n1sw=!3(#r} zxsAxvw5#<^Qs@}w3(7LMCwvCrRQLd=zV@0Iv~=c#CHLq?t}E(ecchEAlt0t>;XudG zJHh71M%4VY+$JjUbaGZd84dt%DsCI-)xxOizHzJ15AG}ppnXilxWtiJ8f69FPS~3N z9Zjf4w1*A|t~l=@yl_QaK5t}RLd(wJx@z}C zs{^-6seiYTsVJAYp(@q)yZE~%qS9w}>gpr97GI)rECNsH)AmCXg;>SgFE>u~_$>Xn35y|pZm#g~m`gr|Ra-=8H#J1ib+IC~1sild^ zqcKA&Fij{8Sv&xgAu_6FzqXrtu|62}*V&63#vm*hqqs5bxq+dS04?)TuX=2X@2F~n z+nE5ZgC2W5pv<7xslkHWY;t}L#K3B@;0o$V@Oo}C$NZ?fyfZva_FFqxM^g7zvEhj8 zLRr)xr_@_j^E_pTNR^Sp&;fuP&*%ZK?od(SBhKfw!-0rpwEdmnu;YjL4qJd*tDgHA$M0soWD~1~naktZ?&6biuFUM|$VpBHcdX{_TzJK8_8}|J@4s#}_CyCCF@54(0X}zg&FfhFs;`E~#wV)JM3-Qfw~S80Vd>?Fvu(l6j*! zeiVbAZ&w5p;Oc{v=`3#m#Q< za4{U!+e0l_TrZBFLTMbJx4fCF8}45h?5TvCtUR{gTxuB)N~?Fqar!KlGP#z<{Yt;(lWrC+{RsAEI;c2fB9bh7SBrBP#U5*n7MOlDKjAyN9+fdB+i?Q` z*5HjVCK*zmhfTALC*D21{LF^Y^gv25&b0{p+)!tM4`hm+IW`_d!PK;Hl=uCyy6_7G z+KLV(*mCSci!Uy8qiteDxoeA$WnU?>#U{o}qd-K*c+^&~s-ciqvw4>?RMBx}cxgbr z<8Dd~3C9mnQ^r1!_@D<)Wt!rr#TZg%1Z?meh~~!0+q8_aW;x?khgsgnO$E{~ezsx$ z?jJ5MZ_}QMQoW}l%$2cDvGztl>$iFD4mgw(tHV;)!?#4tx1GdKM9BR{IhN=pz53?- zAC%4YLrc09QPPw*NR;=VYBbIC`{8KxE?zfb>$gCF*STj86GghkGuy&!Hp`GD&SU2C-_}YDR0C>f^qRPwQ zK9leg`EQo4)B5k;EYS=V5&~hi54LChqOG|Fcb2>*>ggWId(dt z&GUANJ_^?IL#~3H_A_RT-nzmXh`DB+!i(ce{t9+jN!3yv=!R9hRWE}0(naq-WbkSf zQrXsQ-vh^00DyI^5>z>Q=ttMoJzQzX(mpWrcpPz4#&%*jS7=7@9kr@HEDg};hV9x; z%{w0Iwilbft7`{LwWYD+xv!#qB5GAL;se=%9E5-%Sc^*6NK-pmeYJUFV zxWK7+X_jm_+bqJCQ%k!-GDD@QeCnnMGx=oDrH;L-F!n;b#Mrtd=%-0lj)aeIw4Dqq zzdxFBUA-D?ne>VjnPa~u0$)is#j|!`b!LR100Beu2N*Cib^qiK?$I)Mris(ut1%tA zB{72nOtZ^(aN|s#DzD+7r(KB1EZ){QC=KTvRO_;j$sT2YQ&tNpBxGIM3RwP5fiGNm z@b;!%xS5xJg#Int^K;26eU;fA4s>nJ4eJ@{l%lD&OEgRm7cO~nu1k>X5=DV{F*Z*z zm~wcdv7Zz?)EgA}xl zxA)$P%{!eSs=$jFIIbtQS@0pWoIyd-NUTr8ju%PQNB#1I@wQI!tX^loQ!8cho8NI0 zRod&c8spIG^%O29YEc7d9X~PfD0Mr>RccuWs_ZGtPSZ57qt?&=z0olzu9hu&fuzd2 zpMt2n8}1UT@3BWj^pC(7d+dZl6MLF&cLb@x8W;1UTD$|8;W)N2Xzp3QZE)6srn1J; z%WYoOo0)=42W&4tx9024+0qF1>aU~nU4BZtfQajJrzbN7TGmy!Ew)(7Dva<_K8)Uo zbvrMPdLZB~_43sglmJUpr^K`F93L1c29OXRq@^2VR1z%dp8n4OoWCign+)^cjowx4 z;dzPk)}GfLn{TfJX(Kn4)x%n0jG2>@1URAsbG}9{-U4XC+^yqqPi+l}9`C*=178H@!^F6}_J*1x zpooVW5+qqo+l>x2&0tsn;LmeUY$p$p{eHXlP6Z5bY)!`WhDH;Bsm*^H!gc-9jP$9jEg1`14-? zpy~a=I94wvohwaRcy7zaNJ?CeYh?*Cdx>j}*xd+_44v;CHS~U?A8Il|5-cwz5v2E* zki4nKj};fbT9ENV-_6f4~pVYh%+mRRtMyooFD z{?Tl+#4eCAZ=P7iZQFy^Ns_-E_9IOvRVqw$7PRQjAz{ceQg%|!?%jP?I)Wf6VBB(G z*QO%M8f<(iHMX*EkYC-it(Sj~X-l0h%i``8FAA}n#glR{3mXPE-!Lj`L@bb+caKMr zuin9>Nn)s=J`UxF-aqphbFG6a+;&05emiZ>Yz8x4w^_QT_%?L{00ijSTMJEH9(N*~ zLiODPiySqg);I^6OUgR_cY7nxGg&H=)vvWIj;n!k?R4|gPo}n(hZt50Bbkq*ZVHIF zzpH`Te|%K^FaJQ)=mATLj2KSY%ar95{Q~>1Iz}!@;U~rP_b7t|ebs%;#Vp#SdH&Oy zC2>Zzd_*3+5-iY`Z`f3453!0ixbY^5V5dXo>{MD-X~!uvIqpP%Cg za(qXJN#Tv|@S`QPj~U!6=Rv`(stpW?N)Uv+nl~c*YCek}=82ge7=mKQ5`O(662*)V z6pS(nie=#l){5>WQ^mrpg;yswM;wNQq_s0lX54z$@W`)85nP&#s90;u2F>tOrsC#g zf;O?9w>G}HIwXVufcx!h5+0Q==?Wz(#1kZfWIK4RhN=qk)PpsTx;Jx@7xA`!c}68N z;V*`T=jUYIk;T-}^>vev^0J20Pf|N}t&-thPA2FX* A>;M1& literal 0 HcmV?d00001 diff --git a/assets/sprites/atlases/atlas2.png.import b/assets/sprites/atlases/atlas2.png.import new file mode 100644 index 0000000..fd870f8 --- /dev/null +++ b/assets/sprites/atlases/atlas2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c68mrfs4wb81x" +path="res://.godot/imported/atlas2.png-e622880e29243d7232ebeb6861d4288e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/sprites/atlases/atlas2.png" +dest_files=["res://.godot/imported/atlas2.png-e622880e29243d7232ebeb6861d4288e.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/ButtonBackground.tres b/assets/sprites/gui/ButtonBackground.tres index 894b3d3..ebf162f 100644 --- a/assets/sprites/gui/ButtonBackground.tres +++ b/assets/sprites/gui/ButtonBackground.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_i6oyj") -region = Rect2(0, 300, 36, 36) +region = Rect2(177, 40, 36, 36) diff --git a/assets/sprites/gui/ChooseYourSeeds/FrameField.tres b/assets/sprites/gui/ChooseYourSeeds/FrameField.tres index 8dd131a..d04d0b7 100644 --- a/assets/sprites/gui/ChooseYourSeeds/FrameField.tres +++ b/assets/sprites/gui/ChooseYourSeeds/FrameField.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_es82j") -region = Rect2(115, 300, 65, 65) +region = Rect2(296, 0, 65, 65) diff --git a/assets/sprites/gui/ChooseYourSeeds/Grabber.tres b/assets/sprites/gui/ChooseYourSeeds/Grabber.tres index 8770209..9552558 100644 --- a/assets/sprites/gui/ChooseYourSeeds/Grabber.tres +++ b/assets/sprites/gui/ChooseYourSeeds/Grabber.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_bv8ko") -region = Rect2(113, 414, 15, 32) +region = Rect2(270, 77, 15, 32) diff --git a/assets/sprites/gui/ChooseYourSeeds/InnerPanel.tres b/assets/sprites/gui/ChooseYourSeeds/InnerPanel.tres index 7f72826..61831dd 100644 --- a/assets/sprites/gui/ChooseYourSeeds/InnerPanel.tres +++ b/assets/sprites/gui/ChooseYourSeeds/InnerPanel.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_vi2yj") -region = Rect2(113, 402, 14, 12) +region = Rect2(296, 65, 14, 12) diff --git a/assets/sprites/gui/ChooseYourSeeds/LevelRun.tres b/assets/sprites/gui/ChooseYourSeeds/LevelRun.tres index 4f75580..4dcd26d 100644 --- a/assets/sprites/gui/ChooseYourSeeds/LevelRun.tres +++ b/assets/sprites/gui/ChooseYourSeeds/LevelRun.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_wytrb") -region = Rect2(87, 382, 41, 20) +region = Rect2(512, 221, 41, 20) diff --git a/assets/sprites/gui/ChooseYourSeeds/Panel.tres b/assets/sprites/gui/ChooseYourSeeds/Panel.tres index 63b22d1..0b987e1 100644 --- a/assets/sprites/gui/ChooseYourSeeds/Panel.tres +++ b/assets/sprites/gui/ChooseYourSeeds/Panel.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_ugykr") -region = Rect2(87, 402, 26, 27) +region = Rect2(244, 77, 26, 27) diff --git a/assets/sprites/gui/ChooseYourSeeds/PlantFrame.tres b/assets/sprites/gui/ChooseYourSeeds/PlantFrame.tres index 45d5200..c9ee1aa 100644 --- a/assets/sprites/gui/ChooseYourSeeds/PlantFrame.tres +++ b/assets/sprites/gui/ChooseYourSeeds/PlantFrame.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_44qhk") -region = Rect2(38, 300, 77, 77) +region = Rect2(219, 0, 77, 77) diff --git a/assets/sprites/gui/ChooseYourSeeds/Slider.tres b/assets/sprites/gui/ChooseYourSeeds/Slider.tres index fe971a7..3ac3137 100644 --- a/assets/sprites/gui/ChooseYourSeeds/Slider.tres +++ b/assets/sprites/gui/ChooseYourSeeds/Slider.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_auh61") -region = Rect2(129, 401, 13, 13) +region = Rect2(285, 77, 13, 13) diff --git a/assets/sprites/gui/EmptyShovel.tres b/assets/sprites/gui/EmptyShovel.tres index 99dbd9e..0fee8b1 100644 --- a/assets/sprites/gui/EmptyShovel.tres +++ b/assets/sprites/gui/EmptyShovel.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_i8m7w") -region = Rect2(341, 67, 51, 47) +region = Rect2(0, 174, 46, 46) diff --git a/assets/sprites/gui/FastForward1.tres b/assets/sprites/gui/FastForward1.tres index 97b2140..ecd8ce8 100644 --- a/assets/sprites/gui/FastForward1.tres +++ b/assets/sprites/gui/FastForward1.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_r6k0p") -region = Rect2(45, 272, 18, 20) +region = Rect2(571, 221, 18, 20) diff --git a/assets/sprites/gui/FastForward2.tres b/assets/sprites/gui/FastForward2.tres index 90fb247..a4c2fd8 100644 --- a/assets/sprites/gui/FastForward2.tres +++ b/assets/sprites/gui/FastForward2.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_cq0f1") -region = Rect2(81, 272, 18, 20) +region = Rect2(589, 221, 18, 20) diff --git a/assets/sprites/gui/FastForward3.tres b/assets/sprites/gui/FastForward3.tres index b8b9065..6cac34a 100644 --- a/assets/sprites/gui/FastForward3.tres +++ b/assets/sprites/gui/FastForward3.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_xsjda") -region = Rect2(117, 272, 18, 20) +region = Rect2(607, 221, 18, 20) diff --git a/assets/sprites/gui/Pause.tres b/assets/sprites/gui/Pause.tres index fa448d9..b1bf3dc 100644 --- a/assets/sprites/gui/Pause.tres +++ b/assets/sprites/gui/Pause.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_qlv5m") -region = Rect2(9, 272, 18, 20) +region = Rect2(553, 221, 18, 20) diff --git a/assets/sprites/gui/Selection.tres b/assets/sprites/gui/Selection.tres index aabf63f..efcf2ff 100644 --- a/assets/sprites/gui/Selection.tres +++ b/assets/sprites/gui/Selection.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_safs8") -region = Rect2(300, 60, 41, 56) +region = Rect2(514, 65, 41, 56) diff --git a/assets/sprites/gui/SelectionGeneric.tres b/assets/sprites/gui/SelectionGeneric.tres index e208465..a4ae600 100644 --- a/assets/sprites/gui/SelectionGeneric.tres +++ b/assets/sprites/gui/SelectionGeneric.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_sqfv1") -region = Rect2(156, 365, 25, 25) +region = Rect2(514, 65, 41, 56) diff --git a/assets/sprites/gui/Shovel.tres b/assets/sprites/gui/Shovel.tres index 3ccba3b..8c78421 100644 --- a/assets/sprites/gui/Shovel.tres +++ b/assets/sprites/gui/Shovel.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_s2rs0") -region = Rect2(0, 145, 51, 47) +region = Rect2(46, 174, 51, 47) diff --git a/assets/sprites/gui/pause_bg.tres b/assets/sprites/gui/pause_bg.tres new file mode 100644 index 0000000..416d5da --- /dev/null +++ b/assets/sprites/gui/pause_bg.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://c1pe4mfmeaoq7"] + +[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_laeru"] + +[resource] +atlas = ExtResource("1_laeru") +region = Rect2(0, 0, 177, 174) diff --git a/assets/sprites/gui/suncounter.tres b/assets/sprites/gui/suncounter.tres index cae461d..dd0c343 100644 --- a/assets/sprites/gui/suncounter.tres +++ b/assets/sprites/gui/suncounter.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_deojb") -region = Rect2(80, 120, 49, 27) +region = Rect2(177, 77, 49, 27) diff --git a/assets/sprites/plants/Spikeweed.tres b/assets/sprites/plants/Spikeweed.tres index 9875f64..080c189 100644 --- a/assets/sprites/plants/Spikeweed.tres +++ b/assets/sprites/plants/Spikeweed.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_h51va") -region = Rect2(201, 37, 49, 22) +region = Rect2(170, 241, 48, 22) diff --git a/assets/sprites/plants/Wallnut.tres b/assets/sprites/plants/Wallnut.tres index 7a875b3..3de1b22 100644 --- a/assets/sprites/plants/Wallnut.tres +++ b/assets/sprites/plants/Wallnut.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_rqu4e") -region = Rect2(104, 12, 41, 46) +region = Rect2(84, 241, 41, 46) diff --git a/assets/sprites/plants/aloe.tres b/assets/sprites/plants/aloe.tres index 688673b..92f93aa 100644 --- a/assets/sprites/plants/aloe.tres +++ b/assets/sprites/plants/aloe.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_rq51o") -region = Rect2(302, 6, 52, 50) +region = Rect2(262, 241, 52, 50) diff --git a/assets/sprites/plants/garlic.tres b/assets/sprites/plants/garlic.tres index af97d2a..6c99598 100644 --- a/assets/sprites/plants/garlic.tres +++ b/assets/sprites/plants/garlic.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_el55x") -region = Rect2(356, 16, 39, 41) +region = Rect2(314, 241, 39, 41) diff --git a/assets/sprites/plants/pea.tres b/assets/sprites/plants/pea.tres index 685e585..7571683 100644 --- a/assets/sprites/plants/pea.tres +++ b/assets/sprites/plants/pea.tres @@ -1,7 +1,7 @@ [gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://dq0mul65hevtt"] -[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_soyv1"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="1_l6gbe"] [resource] -atlas = ExtResource("1_soyv1") -region = Rect2(2, 130, 12, 12) +atlas = ExtResource("1_l6gbe") +region = Rect2(0, 88, 12, 12) diff --git a/assets/sprites/plants/peashooter.tres b/assets/sprites/plants/peashooter.tres index f32f59d..42cd8e3 100644 --- a/assets/sprites/plants/peashooter.tres +++ b/assets/sprites/plants/peashooter.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_vhxkc") -region = Rect2(1, 10, 42, 48) +region = Rect2(0, 241, 42, 48) diff --git a/assets/sprites/plants/potatomine.tres b/assets/sprites/plants/potatomine.tres index 933736f..8e504ca 100644 --- a/assets/sprites/plants/potatomine.tres +++ b/assets/sprites/plants/potatomine.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_qntd0") -region = Rect2(153, 17, 45, 42) +region = Rect2(125, 241, 45, 42) diff --git a/assets/sprites/plants/snowpea.tres b/assets/sprites/plants/snowpea.tres index e26344f..694809a 100644 --- a/assets/sprites/plants/snowpea.tres +++ b/assets/sprites/plants/snowpea.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_pt3id") -region = Rect2(253, 5, 43, 54) +region = Rect2(219, 241, 43, 54) diff --git a/assets/sprites/plants/snowpea_projectile.tres b/assets/sprites/plants/snowpea_projectile.tres index dd33464..9977fb4 100644 --- a/assets/sprites/plants/snowpea_projectile.tres +++ b/assets/sprites/plants/snowpea_projectile.tres @@ -1,7 +1,7 @@ [gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://dn4l67snkx5mr"] -[ext_resource type="Texture2D" uid="uid://dvldjlg0nr355" path="res://assets/sprites/atlases/atlas1.png" id="1_ljncc"] +[ext_resource type="Texture2D" uid="uid://c68mrfs4wb81x" path="res://assets/sprites/atlases/atlas2.png" id="1_kbnyt"] [resource] -atlas = ExtResource("1_ljncc") -region = Rect2(18, 130, 12, 12) +atlas = ExtResource("1_kbnyt") +region = Rect2(12, 88, 12, 12) diff --git a/assets/sprites/plants/sunflower.tres b/assets/sprites/plants/sunflower.tres index 9a974ee..edfba46 100644 --- a/assets/sprites/plants/sunflower.tres +++ b/assets/sprites/plants/sunflower.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_x8dof") -region = Rect2(54, 3, 42, 56) +region = Rect2(42, 241, 42, 56) diff --git a/assets/sprites/sun.tres b/assets/sprites/sun.tres index 4cc9c24..0eea91e 100644 --- a/assets/sprites/sun.tres +++ b/assets/sprites/sun.tres @@ -4,4 +4,4 @@ [resource] atlas = ExtResource("1_wwp2c") -region = Rect2(84, 147, 45, 45) +region = Rect2(177, 104, 45, 45) diff --git a/project.godot b/project.godot index 0493d5c..f4e5722 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Liberation of the Neighbourville" -run/main_scene="res://scenes/debug_lvl.tscn" +run/main_scene="uid://c1335fke4thpm" config/features=PackedStringArray("4.4", "C#", "Forward Plus") config/icon="res://icon.png" config/windows_native_icon="res://icon.ico" @@ -20,6 +20,8 @@ config/windows_native_icon="res://icon.ico" LevelController="*res://scripts/LevelController.cs" Cursor="*res://scripts/Cursor.cs" +GameRegistry="*res://scripts/systems/GameRegistry.cs" +Cheats="*res://scripts/debug/Cheats.cs" [display] @@ -32,11 +34,16 @@ window/per_pixel_transparency/allowed=true project/assembly_name="NewLON" +[editor_plugins] + +enabled=PackedStringArray("res://addons/floatmodifiers/plugin.cfg") + [file_customization] folder_colors={ "res://assets/sprites/atlases/plants/": "green", "res://resources/plants/": "green", +"res://scenes/": "red", "res://scenes/entities/plants/": "green" } @@ -63,6 +70,11 @@ primary_action={ "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) ] } +cheat_zombie_spawn={ +"deadzone": 0.2, +"events": [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":4194332,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} [layer_names] diff --git a/resources/animations/plants/snowpea.res b/resources/animations/plants/snowpea.res index 2bb2ac02013b638eec7bcb9ab1b3c7b194ade189..41ea17c73da834bda15158726d1f843f39947c3a 100644 GIT binary patch literal 875 zcmV-x1C;zyQ$s@n000005C8xa2><|70{{RhwJ-f(6bMZk00!c6KoH9|9RLu0T37%^ z000>N$D^z4sw&&=^zk9vo_n{)&e%&^S%4-=5kiL#9GL@q;tRNC5-56uj*N`lz_?7@*lwe1V{Pk*dT#}$%Ox#i{{RihXUiH%ROlFALGA=^9Q|>L;~`O z|Cujc4bvcRD;RgDK~WS%QPea|(=<&~zL|B4xJB-C(YTyU;l)FArN-OJLe`khD7lw$ zmLe)Gkh&$?Nqch3Tux)H+cNkto*k8&Nv8e3bJik<1=jy6=7LbwS}T~p`qWxdYlVN8w-Cg z`w}rpBAFRFT);q4vEd9PCnBSiUO+9a)Ra38QdCkJ0S6PQ9&^w5#jMvG1pbqIvSPKI`UNOGa8{WhT0>8 z>1wirc<^*M8_nk9{b0es_~>i6bHZxyTc293jq3`4y{K_jGb1vhASp;eGK>L$0+E@j z>IM?P6Cu@NL^DDW1v9fCNu9#98?R!$q%GBLC?pG?qDWzwQ3V-`fW5TeNkq0F?VAcg zo85y^&L0LeSbp=(Z8>O77Mld+_z~JYvUGlDcacc~5MUodMFGm{VU6gf8LUp}V9C9Q zZx)n$XaKeQqkl@kfhoavrh@FjZTa3av#vvK_ftzl{?B0tv?LCsp^NOdVI_0$1t+9i zH5FB_#jvLvX%UAyZpf>7((Lf1syTL+IiSobBPc_49B{dP&N=L|VW1Y`JBM1$8#vcN z*eht3Vd!yGOy89dV$6qCOJCES7S`q zyt+8l#XBP({5%i+tiG4_`AZ(Z4wy$mb3L+aD;)0MhA-&HTNMR{tj+|yG^cJrZE3v* z5KpCTswBeNfJ7HRFwlIx6Wb#U-hXEM2CGs<_*eZ)u9m5_;ZqciuusLM<{~0{{RhwJ-f(2nY=t0H$GaKp@FB9RO&J5i7t5 z34ok<{}C(#LPCO?=!v}V-tD0?_R>}Y07-F2*{4^Bsl9FV1^72`7vBXwGBo2u|Ns9_ z0ayT90Ac_SA2kZ(?SBKDI77}T78~0(iyOw->>}m)-*b{`GHEvl-16*Dd|HR`$sOa! z;mqw6kyPAo%FurR{}GgMcwQo47->0a?mT%VFuq>y!IA$J|2zLR|2KaVZKiamDWu~O z|1sZQ4bvcRCm7T2qN=K@sw#@2D2k$5zL`-<;uN`4<>GR3!vG)k%I#z!YuqzR?pd5A zsV4;!P04n)##*;!@L@c=mYYd#`k!;wB8SNs1J`B!2f17iK($s7%Mbe0DpKnNk5lGe zZ%|z0zeMIg#JSrRg2<~OhP6ek4?n^szH7;6^SC&bDL`9+p+51kIk<+?z%mP#VEmO9n?lt4Ph5#7LWuO>T( zh7M<=$!IuE8!Q$WUq1?WMpz7f>r<fn72qBBLNBDP$P~kOGkzDzXg{00bq| zf&?=nA{5Nbf+Tf@y#udeJ=r#VA2r#FWsD-Z;dG7#K{86&AzC&_4?FEPx9_xWzZjUC zx$!$S$Dq7y)4e3F2$|ON|K`u;AX8BrO#A~Jj|3`uYa@ZjXf~@G@4NHu$<2n+RR)l_ zBl=eu95P1qz{h~K1|LZn2)N93e}l7Z{So_y z!S%kuZK#5a)Fc#lnO@rN$>{sSfv6AdsJ{iNOLLyTQu?lfyBm1>yhx| tjQ}~<}@0ssIgwJ-f(p$H`x00!P=Kp?HCH31q>7X|>v z03;yT0GI&)6(LD9wv;?_%jxULklemhO;hdwDq)BVFe5fFHxQB4|G^BJk!Tp%I+UdC z6ixtE089W7qw(5*;+S#UMLDiB>Qa96{mDSB&w>) zv|+?e7%3Sc=?J(0KpKfc7NCmH=kuYkh)mlIbZ`{dAfPcI1Eb{ey#K`VClG(~@c#6N zta#o#g9;}(RlG2xU58U$FqsJq=8di9w4&Jw>(w}brl>((Lo*|zBq^w*F|Yy=86x8b z62QY4VS|JrGJ!}ik;ueRUbPesQVALiHG ELjlTHSpWb4 literal 766 zcmV<}*0ssIgwJ-f(l?de)04CjIKroHe8UT)9162it zXGDNZM);^-s#U*kDaquPD+v3F>9FfF*xuG^;{5$c_#J`q*BmQ;x$KhXufA3$&KaYQ*|JcS&yBj~q;sC!V zb`o9~Vfl(=bB2`N$rWX$ecqJV#tL$~DJ5L7?43|j%fb#$sMDn)g+x_Vl{Snx2_>kK zQ%67s0F03+bOEyXd_Ervi^#Oiz=ubH4gwqlHZ({c&-+a+Zvycq5ARL?2#e>vGpulu za}h7hXxHIX7fgmCgSlWjwi*+QW+x1Qr>J3BLNgJ`R+*N<0aD2tV|!vilAFPqDJYOya71;=DKk{p3xu0IE;!SsY9t1>Q)Err z!t-xN8Ol1+^ka)>$ra7bNhy*M_UGWe-nhqvI5Q;k6cl=yp-^VE&5P&+#r?Sujetb0(RHUyN4(Y}{{<}e<+WkG?T$IG8#02Do`U;( z&DGu}=ppUK%ZMM_4YU;D%>h0m5*P=;HPSrlvJ3fl1b6nr7eiqG$<_Xi{%dtwqH9T6}ti%8rFHe+0-0dO~C wFi+x#8{p_AU;vm@6d!Y?U5L~@F*nnbe|gLn1Uvb%;GLzPEl&j0`b diff --git a/resources/zombies/basic.tres b/resources/zombies/basic.tres new file mode 100644 index 0000000..e26d47f --- /dev/null +++ b/resources/zombies/basic.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="ZombieResource" load_steps=3 format=3 uid="uid://buvacn56kyy2p"] + +[ext_resource type="PackedScene" uid="uid://co11v3w8hbwgf" path="res://scenes/entities/Zombies/zombie.tscn" id="1_c2mq3"] +[ext_resource type="Script" uid="uid://cqxj7o8hdm82n" path="res://scripts/resources/ZombieResource.cs" id="1_k277m"] + +[resource] +script = ExtResource("1_k277m") +cost = 1 +scene = ExtResource("1_c2mq3") +metadata/_custom_type_script = "uid://cqxj7o8hdm82n" diff --git a/resources/zombies/buckethead.tres b/resources/zombies/buckethead.tres new file mode 100644 index 0000000..6971f02 --- /dev/null +++ b/resources/zombies/buckethead.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="ZombieResource" load_steps=3 format=3 uid="uid://dkhjlu7u0vny6"] + +[ext_resource type="PackedScene" uid="uid://xu4i6tmkv00a" path="res://scenes/entities/Zombies/bucket_zombie.tscn" id="1_lhcag"] +[ext_resource type="Script" uid="uid://cqxj7o8hdm82n" path="res://scripts/resources/ZombieResource.cs" id="1_sngfh"] + +[resource] +script = ExtResource("1_sngfh") +cost = 7 +scene = ExtResource("1_lhcag") +metadata/_custom_type_script = "uid://cqxj7o8hdm82n" diff --git a/resources/zombies/conehead.tres b/resources/zombies/conehead.tres new file mode 100644 index 0000000..8e9bc33 --- /dev/null +++ b/resources/zombies/conehead.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="ZombieResource" load_steps=3 format=3 uid="uid://nceohd32fkxk"] + +[ext_resource type="PackedScene" uid="uid://hhjbqkjqpt7x" path="res://scenes/entities/Zombies/cone_zombie.tscn" id="1_llf5l"] +[ext_resource type="Script" uid="uid://cqxj7o8hdm82n" path="res://scripts/resources/ZombieResource.cs" id="1_sw7hj"] + +[resource] +script = ExtResource("1_sw7hj") +cost = 3 +scene = ExtResource("1_llf5l") +metadata/_custom_type_script = "uid://cqxj7o8hdm82n" diff --git a/resources/zombies/hobo.tres b/resources/zombies/hobo.tres new file mode 100644 index 0000000..309bb06 --- /dev/null +++ b/resources/zombies/hobo.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="ZombieResource" load_steps=3 format=3 uid="uid://c38vfdw5b60xw"] + +[ext_resource type="PackedScene" uid="uid://bgqmwsb6ynm81" path="res://scenes/entities/Zombies/hobo.tscn" id="1_4myt6"] +[ext_resource type="Script" uid="uid://cqxj7o8hdm82n" path="res://scripts/resources/ZombieResource.cs" id="1_u5qpq"] + +[resource] +script = ExtResource("1_u5qpq") +cost = 5 +scene = ExtResource("1_4myt6") +metadata/_custom_type_script = "uid://cqxj7o8hdm82n" diff --git a/scenes/debug_lvl.tscn b/scenes/debug_lvl.tscn index b4cbd8e..d3fb90c 100644 --- a/scenes/debug_lvl.tscn +++ b/scenes/debug_lvl.tscn @@ -1,19 +1,20 @@ -[gd_scene load_steps=11 format=3 uid="uid://crxsvv7drckpw"] +[gd_scene load_steps=9 format=3 uid="uid://crxsvv7drckpw"] [ext_resource type="Script" uid="uid://bndu1h5kgcde8" path="res://scripts/components/level/RuntimeLevelData.cs" id="1_i3bf5"] [ext_resource type="Texture2D" uid="uid://b0tb2hjum40aw" path="res://assets/sprites/background_summer.png" id="2_vmxhy"] -[ext_resource type="PackedScene" uid="uid://cg8713v6c5w15" path="res://scenes/level components/pools.tscn" id="3_jv7x4"] +[ext_resource type="Script" uid="uid://bso32xkw738sy" path="res://scripts/components/level/PoolContainer.cs" id="3_1y18w"] [ext_resource type="PackedScene" uid="uid://dpxxjfd5lv5sv" path="res://scenes/gui/choose_your_seeds.tscn" id="5_5e78h"] [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" uid="uid://cslqjdd5wq4rc" path="res://scripts/components/level/SunSpawner.cs" id="6_lkguy"] -[ext_resource type="PackedScene" uid="uid://xu4i6tmkv00a" path="res://scenes/entities/Zombies/bucket_zombie.tscn" id="9_u7o5c"] -[ext_resource type="PackedScene" uid="uid://hhjbqkjqpt7x" path="res://scenes/entities/Zombies/cone_zombie.tscn" id="10_q4fsb"] [node name="debug_lvl" type="Node2D"] +y_sort_enabled = true [node name="SummertimeSaga" type="Sprite2D" parent="."] +z_index = -4096 +z_as_relative = false position = Vector2(500, 200) texture = ExtResource("2_vmxhy") metadata/_edit_lock_ = true @@ -26,7 +27,28 @@ metadata/_edit_lock_ = true script = ExtResource("1_i3bf5") SunCount = 999999 -[node name="Pools" parent="." instance=ExtResource("3_jv7x4")] +[node name="Pools" type="Node2D" parent="." node_paths=PackedStringArray("Zombies", "Plants", "Projectiles", "Structures")] +script = ExtResource("3_1y18w") +Zombies = NodePath("Zombies") +Plants = NodePath("Plants") +Projectiles = NodePath("Projectiles") +Structures = NodePath("Structures") + +[node name="Zombies" type="Node2D" parent="Pools"] +z_index = 3 +y_sort_enabled = true + +[node name="Plants" type="Node2D" parent="Pools"] +z_index = 1 +y_sort_enabled = true + +[node name="Projectiles" type="Node2D" parent="Pools"] +z_index = 4 +y_sort_enabled = true + +[node name="Structures" type="Node2D" parent="Pools"] +z_index = 2 +y_sort_enabled = true [node name="GuiLayer" type="CanvasLayer" parent="."] layer = 10 @@ -50,10 +72,4 @@ SunScene = ExtResource("6_ay12k") wait_time = 5.0 autostart = true -[node name="BucketZombie" parent="." instance=ExtResource("9_u7o5c")] -position = Vector2(729, 257) - -[node name="ConeZombie" parent="." instance=ExtResource("10_q4fsb")] -position = Vector2(729, 313) - [connection signal="timeout" from="SunSpawner/Timer" to="SunSpawner" method="Spawn"] diff --git a/scenes/debug_zombie_spawner.tscn b/scenes/debug_zombie_spawner.tscn new file mode 100644 index 0000000..5026776 --- /dev/null +++ b/scenes/debug_zombie_spawner.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=2 format=3 uid="uid://cubfkr2mkgxjc"] + +[ext_resource type="Script" uid="uid://dac0bvlhho7u4" path="res://scripts/DebugZombieSpawner.cs" id="1_m367a"] + +[node name="DebugZombieSpawner" type="PopupPanel" node_paths=PackedStringArray("label", "line", "spin")] +initial_position = 1 +size = Vector2i(200, 100) +visible = true +script = ExtResource("1_m367a") +label = NodePath("Vbox/Similars") +line = NodePath("Vbox/Line/LineEdit") +spin = NodePath("Vbox/Line/SpinBox") + +[node name="Vbox" type="VBoxContainer" parent="."] +offset_left = 4.0 +offset_top = 4.0 +offset_right = 196.0 +offset_bottom = 96.0 + +[node name="Line" type="HBoxContainer" parent="Vbox"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="Vbox/Line"] +layout_mode = 2 +size_flags_horizontal = 3 +focus_next = NodePath("../SpinBox") +max_length = 16 + +[node name="SpinBox" type="SpinBox" parent="Vbox/Line"] +layout_mode = 2 +min_value = 1.0 +max_value = 50.0 +value = 1.0 + +[node name="Similars" type="Label" parent="Vbox"] +layout_mode = 2 +size_flags_vertical = 3 + +[connection signal="popup_hide" from="." to="." method="OnPopupHide"] +[connection signal="text_changed" from="Vbox/Line/LineEdit" to="." method="OnTextChanged"] +[connection signal="text_submitted" from="Vbox/Line/LineEdit" to="." method="OnTextSubmitted"] diff --git a/scenes/entities/Zombies/bucket_zombie.tscn b/scenes/entities/Zombies/bucket_zombie.tscn index 7464be8..473b39f 100644 --- a/scenes/entities/Zombies/bucket_zombie.tscn +++ b/scenes/entities/Zombies/bucket_zombie.tscn @@ -16,8 +16,8 @@ shader_parameter/amount = 0.0 material = SubResource("ShaderMaterial_wdi07") [node name="Hat" parent="CanvasGroup" index="1"] -position = Vector2(-7, -83) +position = Vector2(-12, -83) texture = ExtResource("3_0nlp0") -[node name="Armor" parent="." index="8"] +[node name="Armor" parent="." index="7"] _maxHP = 180 diff --git a/scenes/entities/Zombies/cone_zombie.tscn b/scenes/entities/Zombies/cone_zombie.tscn index 54dcaaa..e8588de 100644 --- a/scenes/entities/Zombies/cone_zombie.tscn +++ b/scenes/entities/Zombies/cone_zombie.tscn @@ -18,10 +18,10 @@ _armor = NodePath("Armor") material = SubResource("ShaderMaterial_sat5k") [node name="Hat" type="Sprite2D" parent="CanvasGroup" index="1"] -position = Vector2(-6, -88) +position = Vector2(-12, -88) texture = ExtResource("4_qdhik") -[node name="Armor" type="Node" parent="." index="8"] +[node name="Armor" type="Node" parent="." index="7"] script = ExtResource("3_5s7in") _maxHP = 60 diff --git a/scenes/entities/Zombies/hobo.tscn b/scenes/entities/Zombies/hobo.tscn index 45f26a4..390f5e1 100644 --- a/scenes/entities/Zombies/hobo.tscn +++ b/scenes/entities/Zombies/hobo.tscn @@ -174,12 +174,12 @@ material = SubResource("ShaderMaterial_w8pya") [node name="Can" type="Node2D" parent="CanvasGroup" index="1"] [node name="Sprite2D" type="Sprite2D" parent="CanvasGroup/Can" index="0"] -position = Vector2(3, -40) +position = Vector2(-4, -40) texture = SubResource("AtlasTexture_w8pya") [node name="Sprite2D2" type="Sprite2D" parent="CanvasGroup/Can" index="1"] z_index = -1 -position = Vector2(1, -63) +position = Vector2(-6, -63) texture = SubResource("AtlasTexture_5selg") [node name="AnimationPlayer" parent="." index="3"] diff --git a/scenes/entities/Zombies/zombie.tscn b/scenes/entities/Zombies/zombie.tscn index fdbe125..d14e135 100644 --- a/scenes/entities/Zombies/zombie.tscn +++ b/scenes/entities/Zombies/zombie.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=27 format=3 uid="uid://co11v3w8hbwgf"] [ext_resource type="Script" uid="uid://dildme6epx8l4" path="res://scripts/components/zombies/RuntimeZombieData.cs" id="1_qq3f1"] -[ext_resource type="Texture2D" uid="uid://bwwbkybryi6k0" path="res://assets/sprites/zombie.tres" id="2_4pdxh"] +[ext_resource type="Texture2D" uid="uid://bwdqbrnn7ygtr" path="res://assets/sprites/atlases/zombies/Зондби.png" id="2_4pdxh"] [ext_resource type="Shader" uid="uid://d0eo5uuj222c4" path="res://assets/shaders/CG_color_blender.gdshader" id="2_srwwe"] [ext_resource type="Script" uid="uid://dqyony6jxt2p0" path="res://scripts/components/zombies/EatBox.cs" id="3_2aulo"] [ext_resource type="Script" uid="uid://c5vfccegyy01t" path="res://scripts/components/FlashComponent.cs" id="3_rao3m"] @@ -103,7 +103,7 @@ material = SubResource("ShaderMaterial_63ls2") script = ExtResource("3_rao3m") [node name="Sprite" type="Sprite2D" parent="CanvasGroup"] -position = Vector2(0, -44) +position = Vector2(-4, -55) texture = ExtResource("2_4pdxh") [node name="Hitbox" type="Area2D" parent="."] diff --git a/scenes/entities/plants/garlic.tscn b/scenes/entities/plants/garlic.tscn index 15c9b6e..338c16f 100644 --- a/scenes/entities/plants/garlic.tscn +++ b/scenes/entities/plants/garlic.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://bes4e6sksax67"] +[gd_scene load_steps=14 format=3 uid="uid://qq0cw8xtcoj3"] [ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_5i0e6"] [ext_resource type="Texture2D" uid="uid://dff73m8ahamaa" path="res://assets/sprites/atlases/plants/garlic.png" id="2_w2jbi"] diff --git a/scenes/entities/plants/peashooter.tscn b/scenes/entities/plants/peashooter.tscn index 6eb42fb..dd01d96 100644 --- a/scenes/entities/plants/peashooter.tscn +++ b/scenes/entities/plants/peashooter.tscn @@ -3,11 +3,11 @@ [ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_pyk3o"] [ext_resource type="Texture2D" uid="uid://cksryh4w5dbbx" path="res://assets/sprites/atlases/plants/peashooter.png" id="2_14qlx"] [ext_resource type="AnimationLibrary" uid="uid://bv1dl1g4dmbho" path="res://resources/animations/plants/peashooter.res" id="3_8lrhp"] -[ext_resource type="Script" path="res://scripts/components/plants/Shooter.cs" id="3_a4ew1"] +[ext_resource type="Script" uid="uid://ceprqkraw3v6m" path="res://scripts/components/plants/Shooter.cs" id="3_a4ew1"] [ext_resource type="PackedScene" uid="uid://b2hrv0aqbui7u" path="res://scenes/projectiles/pea.tscn" id="4_saxds"] -[ext_resource type="Script" path="res://scripts/components/plants/behaviours/PeashooterBehaviour.cs" id="5_7qiua"] -[ext_resource type="Script" path="res://scripts/components/plants/Eyesight.cs" id="7_2bki8"] -[ext_resource type="Script" path="res://scripts/components/plants/PlantEyesightLimiter.cs" id="8_nl4jc"] +[ext_resource type="Script" uid="uid://bdk5iqtw4xbkl" path="res://scripts/components/plants/behaviours/PeashooterBehaviour.cs" id="5_7qiua"] +[ext_resource type="Script" uid="uid://dn53jvpjyg63l" path="res://scripts/components/plants/Eyesight.cs" id="7_2bki8"] +[ext_resource type="Script" uid="uid://hccb0aee0x0o" path="res://scripts/components/plants/PlantEyesightLimiter.cs" id="8_nl4jc"] [sub_resource type="Animation" id="Animation_a2y0j"] length = 0.001 @@ -26,7 +26,7 @@ tracks/0/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_ipp6b"] _data = { -"RESET": SubResource("Animation_a2y0j") +&"RESET": SubResource("Animation_a2y0j") } [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_34v85"] @@ -68,8 +68,8 @@ vframes = 2 [node name="AnimationPlayer" parent="." index="1"] libraries = { -"": SubResource("AnimationLibrary_ipp6b"), -"peashooter": ExtResource("3_8lrhp") +&"": SubResource("AnimationLibrary_ipp6b"), +&"peashooter": ExtResource("3_8lrhp") } autoplay = "peashooter/idle" @@ -87,12 +87,10 @@ _timer = NodePath("Timer") wait_time = 1.5 one_shot = true -[node name="Behaviour" type="Node" parent="." index="4" node_paths=PackedStringArray("_player", "_shootTimer", "_sight")] +[node name="Behaviour" type="Node" parent="." index="4" node_paths=PackedStringArray("_shootTimer", "_sight")] script = ExtResource("5_7qiua") -_player = NodePath("../AnimationPlayer") _shootTimer = NodePath("../Shooter/Timer") _sight = NodePath("../Eysight") -_libName = "peashooter" [node name="Eysight" type="Area2D" parent="." index="5"] collision_layer = 4 diff --git a/scenes/entities/plants/potato_mine.tscn b/scenes/entities/plants/potato_mine.tscn index 7f0e2a2..88b75d9 100644 --- a/scenes/entities/plants/potato_mine.tscn +++ b/scenes/entities/plants/potato_mine.tscn @@ -2,9 +2,9 @@ [ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_dj7ul"] [ext_resource type="Texture2D" uid="uid://c77o6ba0mw7a3" path="res://assets/sprites/atlases/plants/potato_mine.png" id="2_sneas"] -[ext_resource type="Script" path="res://scripts/components/plants/ExplosionComponent.cs" id="3_2hd5y"] +[ext_resource type="Script" uid="uid://bhl6o2m3fn4xg" path="res://scripts/components/plants/ExplosionComponent.cs" id="3_2hd5y"] [ext_resource type="AnimationLibrary" uid="uid://bjlbdvr6f0r7e" path="res://resources/animations/plants/potato_mine.res" id="3_7tqmj"] -[ext_resource type="Script" path="res://scripts/components/plants/behaviours/PotatomineBehaviour.cs" id="4_twx65"] +[ext_resource type="Script" uid="uid://c7qfh4py0uulo" path="res://scripts/components/plants/behaviours/PotatomineBehaviour.cs" id="4_twx65"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_6uutc"] animation = &"potato_mine/explode" @@ -70,10 +70,11 @@ _maxHP = 100 texture = ExtResource("2_sneas") hframes = 7 vframes = 4 +frame = 7 [node name="AnimationPlayer" parent="." index="1"] libraries = { -"potato_mine": ExtResource("3_7tqmj") +&"potato_mine": ExtResource("3_7tqmj") } autoplay = "idle_unprimed" diff --git a/scenes/entities/plants/wallnut.tscn b/scenes/entities/plants/wallnut.tscn index 72d177e..35a0a56 100644 --- a/scenes/entities/plants/wallnut.tscn +++ b/scenes/entities/plants/wallnut.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://b1hjjbdwf1rtc" path="res://scenes/templates/plant_template.tscn" id="1_fluxn"] [ext_resource type="Texture2D" uid="uid://dstqh1wc5dvmo" path="res://assets/sprites/atlases/plants/wallnut.png" id="2_o5tda"] [ext_resource type="AnimationLibrary" uid="uid://0bdesb8j2mbo" path="res://resources/animations/plants/wallnut.res" id="3_xl65q"] -[ext_resource type="Script" path="res://scripts/components/plants/behaviours/HpBasedBehaviour.cs" id="4_cjtyy"] +[ext_resource type="Script" uid="uid://btkmd86pn828y" path="res://scripts/components/plants/behaviours/HpBasedBehaviour.cs" id="4_cjtyy"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_ds5ry"] animation = &"wallnut/idle_full" @@ -34,10 +34,11 @@ _maxHP = 1000 texture = ExtResource("2_o5tda") hframes = 12 vframes = 3 +frame = 3 [node name="AnimationPlayer" parent="." index="1"] libraries = { -"wallnut": ExtResource("3_xl65q") +&"wallnut": ExtResource("3_xl65q") } [node name="AnimationTree" parent="." index="2"] diff --git a/scenes/gui/runtime_gui.tscn b/scenes/gui/runtime_gui.tscn index 5297503..2fe6d95 100644 --- a/scenes/gui/runtime_gui.tscn +++ b/scenes/gui/runtime_gui.tscn @@ -2,7 +2,7 @@ [ext_resource type="PackedScene" uid="uid://ky35veswaytr" path="res://scenes/gui/sun_counter.tscn" id="1_le3od"] [ext_resource type="Theme" uid="uid://b8l285cjcgeyi" path="res://resources/themes/GameStyle.tres" id="1_xf6ra"] -[ext_resource type="Script" path="res://scripts/components/LevelGUIElements.cs" id="2_5fonq"] +[ext_resource type="Script" uid="uid://cwa1eydeiy3y4" path="res://scripts/components/LevelGUIElements.cs" id="2_5fonq"] [ext_resource type="Texture2D" uid="uid://bbh0uwloi87tn" path="res://assets/sprites/gui/PlantPanel.png" id="2_eg3hk"] [ext_resource type="PackedScene" uid="uid://t0vpmycj6c8j" path="res://scenes/gui/shovel_button.tscn" id="3_bheea"] [ext_resource type="PackedScene" uid="uid://cgm7td1hgs0rr" path="res://scenes/gui/fast_forward_button.tscn" id="4_66uy4"] @@ -48,8 +48,8 @@ tracks/0/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_myv2j"] _data = { -"RESET": SubResource("Animation_c8fnk"), -"flash": SubResource("Animation_ffxdv") +&"RESET": SubResource("Animation_c8fnk"), +&"flash": SubResource("Animation_ffxdv") } [node name="RuntimeGUI" type="Control" node_paths=PackedStringArray("SeedpacketsHotbar", "SunCounter")] @@ -134,5 +134,5 @@ metadata/_edit_lock_ = true [node name="AnimationPlayer" type="AnimationPlayer" parent="FastForwardEffect"] libraries = { -"": SubResource("AnimationLibrary_myv2j") +&"": SubResource("AnimationLibrary_myv2j") } diff --git a/scenes/level components/field_controller.tscn b/scenes/level components/field_controller.tscn index ab06bf3..ac09786 100644 --- a/scenes/level components/field_controller.tscn +++ b/scenes/level components/field_controller.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=3 uid="uid://devn21c7luf45"] -[ext_resource type="Shader" path="res://assets/shaders/greyscale.gdshader" id="1_d73yj"] -[ext_resource type="Script" path="res://scripts/components/level/PlantField.cs" id="2_84bqh"] +[ext_resource type="Shader" uid="uid://mt7vheq5modk" path="res://assets/shaders/greyscale.gdshader" id="1_d73yj"] +[ext_resource type="Script" uid="uid://bj7rw2f6qu1lg" path="res://scripts/components/level/PlantField.cs" id="2_84bqh"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_0miwm"] shader = ExtResource("1_d73yj") diff --git a/scenes/level components/pools.tscn b/scenes/level components/pools.tscn index 81df8d9..eeb93d8 100644 --- a/scenes/level components/pools.tscn +++ b/scenes/level components/pools.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://cg8713v6c5w15"] -[ext_resource type="Script" path="res://scripts/components/level/PoolContainer.cs" id="1_31ggc"] +[ext_resource type="Script" uid="uid://bso32xkw738sy" path="res://scripts/components/level/PoolContainer.cs" id="1_31ggc"] [node name="Pools" type="Node2D" node_paths=PackedStringArray("Zombies", "Plants", "Projectiles", "Structures")] script = ExtResource("1_31ggc") diff --git a/scenes/prototype_survival.tscn b/scenes/prototype_survival.tscn new file mode 100644 index 0000000..f42552a --- /dev/null +++ b/scenes/prototype_survival.tscn @@ -0,0 +1,82 @@ +[gd_scene load_steps=10 format=3 uid="uid://c1335fke4thpm"] + +[ext_resource type="Script" uid="uid://bndu1h5kgcde8" path="res://scripts/components/level/RuntimeLevelData.cs" id="1_tnxdx"] +[ext_resource type="Texture2D" uid="uid://b0tb2hjum40aw" path="res://assets/sprites/background_summer.png" id="1_vafkg"] +[ext_resource type="Script" uid="uid://bso32xkw738sy" path="res://scripts/components/level/PoolContainer.cs" id="3_6128b"] +[ext_resource type="PackedScene" uid="uid://devn21c7luf45" path="res://scenes/level components/field_controller.tscn" id="4_ibntj"] +[ext_resource type="PackedScene" uid="uid://cfnmspei3k4p7" path="res://scenes/gui/runtime_gui.tscn" id="5_iotae"] +[ext_resource type="PackedScene" uid="uid://dpxxjfd5lv5sv" path="res://scenes/gui/choose_your_seeds.tscn" id="6_btfw3"] +[ext_resource type="Script" uid="uid://cslqjdd5wq4rc" path="res://scripts/components/level/SunSpawner.cs" id="7_gnb05"] +[ext_resource type="PackedScene" uid="uid://bpekho7leatr5" path="res://scenes/sun.tscn" id="8_8nyym"] +[ext_resource type="Script" uid="uid://bsuw5lvnr3kol" path="res://scripts/components/level/zombe_spawners/ZombieSequencer.cs" id="9_8nyym"] + +[node name="PrototypeSurvival" type="Node2D"] + +[node name="Data" type="Node" parent="."] +script = ExtResource("1_tnxdx") +SunCount = 50 + +[node name="Background" type="Sprite2D" parent="."] +position = Vector2(500, 200) +texture = ExtResource("1_vafkg") +metadata/_edit_lock_ = true + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(481, 200) +metadata/_edit_lock_ = true + +[node name="Pools" type="Node2D" parent="." node_paths=PackedStringArray("Zombies", "Plants", "Projectiles", "Structures")] +script = ExtResource("3_6128b") +Zombies = NodePath("Zombies") +Plants = NodePath("Plants") +Projectiles = NodePath("Projectiles") +Structures = NodePath("Structures") + +[node name="Zombies" type="Node2D" parent="Pools"] +z_index = 3 +y_sort_enabled = true + +[node name="Plants" type="Node2D" parent="Pools"] +z_index = 1 +y_sort_enabled = true + +[node name="Projectiles" type="Node2D" parent="Pools"] +z_index = 4 +y_sort_enabled = true + +[node name="Structures" type="Node2D" parent="Pools"] +z_index = 2 +y_sort_enabled = true + +[node name="Overlay" type="CanvasLayer" parent="."] +layer = 6 +follow_viewport_enabled = true + +[node name="FieldController" parent="Overlay" instance=ExtResource("4_ibntj")] + +[node name="GUI" type="CanvasLayer" parent="."] +layer = 10 + +[node name="RuntimeGUI" parent="GUI" instance=ExtResource("5_iotae")] +metadata/_edit_lock_ = true + +[node name="ChooseYourSeeds" parent="GUI" instance=ExtResource("6_btfw3")] +metadata/_edit_lock_ = true + +[node name="SunSpawner" type="Node" parent="."] +script = ExtResource("7_gnb05") +SunScene = ExtResource("8_8nyym") + +[node name="Timer" type="Timer" parent="SunSpawner"] +wait_time = 15.0 + +[node name="ZombieSequencer" type="Node2D" parent="."] +position = Vector2(823, 0) +script = ExtResource("9_8nyym") + +[node name="Timer" type="Timer" parent="ZombieSequencer"] +wait_time = 5.0 +autostart = true + +[connection signal="timeout" from="SunSpawner/Timer" to="SunSpawner" method="Spawn"] +[connection signal="timeout" from="ZombieSequencer/Timer" to="ZombieSequencer" method="FormSquad"] diff --git a/scenes/sun.tscn b/scenes/sun.tscn index 4d40d07..f39a8ac 100644 --- a/scenes/sun.tscn +++ b/scenes/sun.tscn @@ -1,7 +1,7 @@ [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="Shader" uid="uid://bk8uy5se3fo0" path="res://assets/shaders/shared_outline.gdshader" id="1_jcu1f"] +[ext_resource type="Script" uid="uid://qgeovvluk8yj" 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"] @@ -73,8 +73,8 @@ tracks/1/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_juv2v"] _data = { -"RESET": SubResource("Animation_jfrge"), -"main": SubResource("Animation_rvj0j") +&"RESET": SubResource("Animation_jfrge"), +&"main": SubResource("Animation_rvj0j") } [sub_resource type="Animation" id="Animation_t53pt"] @@ -108,8 +108,8 @@ tracks/0/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_p7c0n"] _data = { -"RESET": SubResource("Animation_t53pt"), -"main": SubResource("Animation_xyill") +&"RESET": SubResource("Animation_t53pt"), +&"main": SubResource("Animation_xyill") } [sub_resource type="CircleShape2D" id="CircleShape2D_7hl7x"] @@ -144,13 +144,13 @@ frame = 2 [node name="RotationAnimation" type="AnimationPlayer" parent="."] libraries = { -"": SubResource("AnimationLibrary_juv2v") +&"": SubResource("AnimationLibrary_juv2v") } autoplay = "main" [node name="FadeAnimation" type="AnimationPlayer" parent="."] libraries = { -"": SubResource("AnimationLibrary_p7c0n") +&"": SubResource("AnimationLibrary_p7c0n") } [node name="CollisionShape2D" type="CollisionShape2D" parent="."] diff --git a/scripts/DebugZombieSpawner.cs b/scripts/DebugZombieSpawner.cs new file mode 100644 index 0000000..cbab253 --- /dev/null +++ b/scripts/DebugZombieSpawner.cs @@ -0,0 +1,69 @@ +using Godot; +using System.Linq; +using System.Collections.Generic; + +public partial class DebugZombieSpawner : PopupPanel +{ + private List variants; + [Export] private Label label; + [Export] private LineEdit line; + [Export] private SpinBox spin; + + public void OnTextChanged(string text) + { + variants = GameRegistry.GetZombieNames(); + variants.Sort(Comparer); + + if (variants.Count > 3) + { + label.Text = $"{variants[0]}\n{variants[1]}\n{variants[2]}"; + } + else + { + label.Text = ""; + for (int i = 0; i < variants.Count; i++) + { + label.Text += variants[i] + "\n"; + } + } + } + public void OnTextSubmitted(string text) + { + spin.GrabFocus(); + } + public void OnPopupHide() + { + if (variants == null || variants.Count == 0) + { + return; + } + + for(int i = 0; i < spin.Value; i++) + { + ZombieSequencer.Instance.Add(variants[0]); + } + + QueueFree(); + } + private int Comparer(string x, string y) + { + return LevensteinDistance(x,line.Text) - LevensteinDistance(y,line.Text); + } + private static int LevensteinDistance(string a, string b) + { + if (b.Length == 0) + { + return a.Length; + } + else if (a.Length == 0) + { + return b.Length; + } + else if (a[0] == b[0]) + { + return LevensteinDistance(a[1..], b[1..]); + } + List x = [LevensteinDistance(a[1..], b[1..]), LevensteinDistance(a[1..], b), LevensteinDistance(a, b[1..])]; + return 1 + x.Min(); + } +} diff --git a/scripts/DebugZombieSpawner.cs.uid b/scripts/DebugZombieSpawner.cs.uid new file mode 100644 index 0000000..3f2c794 --- /dev/null +++ b/scripts/DebugZombieSpawner.cs.uid @@ -0,0 +1 @@ +uid://dac0bvlhho7u4 diff --git a/scripts/components/gui/choose_your_seeds/GridLoader.cs b/scripts/components/gui/choose_your_seeds/GridLoader.cs index fe9e145..81b04e6 100644 --- a/scripts/components/gui/choose_your_seeds/GridLoader.cs +++ b/scripts/components/gui/choose_your_seeds/GridLoader.cs @@ -12,19 +12,13 @@ public partial class GridLoader : GridContainer { _plantCard = ResourceLoader.Load("res://scenes/gui/seedpacket.tscn"); - string[] files = DirAccess.GetFilesAt(PLANT_RESOURCE_PATH); - - foreach(var file in files) + foreach(var resource in GameRegistry.GetPlants()) { - if(ResourceLoader.Exists(PLANT_RESOURCE_PATH+file)) - { - Seedpacket slot = _plantCard.Instantiate(); - AddChild(slot); - - slot.SetPlantResource(ResourceLoader.Load(PLANT_RESOURCE_PATH+file)); - slot.SetHandler(new ChoosableHandler(slot)); - } - + Seedpacket slot = _plantCard.Instantiate(); + AddChild(slot); + + slot.SetPlantResource(resource); + slot.SetHandler(new ChoosableHandler(slot)); } } } diff --git a/scripts/components/level/PoolContainer.cs b/scripts/components/level/PoolContainer.cs index cf490c6..1f22d52 100644 --- a/scripts/components/level/PoolContainer.cs +++ b/scripts/components/level/PoolContainer.cs @@ -8,7 +8,7 @@ namespace Newlon.Components.Level; // Is not pool in traditional sense, but named like that to prevent repetition // -public partial class PoolContainer : Node +public partial class PoolContainer : Node2D { [Export] public Node2D Zombies { get; private set; } diff --git a/scripts/components/level/zombe_spawners/ZombieSequencer.cs b/scripts/components/level/zombe_spawners/ZombieSequencer.cs new file mode 100644 index 0000000..66ada13 --- /dev/null +++ b/scripts/components/level/zombe_spawners/ZombieSequencer.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using Godot; +using Newlon; +using Newlon.Components.Level; +using Newlon.Components.Zombies; + +public partial class ZombieSequencer : Node2D +{ + public static ZombieSequencer Instance { get; private set; } + private Queue queue = []; + private RandomNumberGenerator rng = new(); + + public override void _Ready() + { + rng.Randomize(); + Instance = this; + } + + + private void FormSquad() + { + if (queue.Count == 0) return; + int count = rng.RandiRange(1, queue.Count > 5 ? 5 : queue.Count); + + if (count == 5) + { + Spawn(queue.Dequeue(), 1); + Spawn(queue.Dequeue(), 2); + Spawn(queue.Dequeue(), 3); + Spawn(queue.Dequeue(), 4); + Spawn(queue.Dequeue(), 5); + } + + List list = []; + while (list.Count < count) + { + int lane = rng.RandiRange(1, 5); + if (list.Contains(lane) == true) + { + continue; + } + list.Add(lane); + } + + foreach (int lane in list) + { + Spawn(queue.Dequeue(), lane); + } + } + + private void Spawn(string id, int lane) + { + RuntimeZombieData zombie = GameRegistry.GetZombieByName(id).scene.Instantiate(); + PoolContainer.Instance.Zombies.AddChild(zombie); + + zombie.GlobalPosition = new Vector2(GlobalPosition.X, Utility.RightFieldBoundary.Y - (lane-1) * Utility.TileHeight); + } + + public void Add(string id) + { + queue.Enqueue(id); + } +} diff --git a/scripts/components/level/zombe_spawners/ZombieSequencer.cs.uid b/scripts/components/level/zombe_spawners/ZombieSequencer.cs.uid new file mode 100644 index 0000000..7f38459 --- /dev/null +++ b/scripts/components/level/zombe_spawners/ZombieSequencer.cs.uid @@ -0,0 +1 @@ +uid://bsuw5lvnr3kol diff --git a/scripts/components/plants/PlantEyesightLimiter.cs b/scripts/components/plants/PlantEyesightLimiter.cs index 1b1f628..60248d6 100644 --- a/scripts/components/plants/PlantEyesightLimiter.cs +++ b/scripts/components/plants/PlantEyesightLimiter.cs @@ -4,7 +4,7 @@ namespace Newlon.Components.Plants; public partial class PlantEyesightLimiter : CollisionShape2D { - public override void _Ready() + public override void _Process(double delta) { if (Shape is SegmentShape2D segment) { diff --git a/scripts/components/plants/behaviours/AloeBehaviour.cs b/scripts/components/plants/behaviours/AloeBehaviour.cs index 6233e8d..323f8ab 100644 --- a/scripts/components/plants/behaviours/AloeBehaviour.cs +++ b/scripts/components/plants/behaviours/AloeBehaviour.cs @@ -37,7 +37,6 @@ public partial class AloeBehaviour : BaseBehaviour if (PoolContainer.Instance.TryGetEntity(checkPos, out RuntimePlantData plantData)) { plantData.Heal(3000 + 25 * plantData.MaxHp, GetParent()); - GD.Print("IM TRYING"); } } diff --git a/scripts/components/zombies/EatBox.cs b/scripts/components/zombies/EatBox.cs index dd05bb7..474371f 100644 --- a/scripts/components/zombies/EatBox.cs +++ b/scripts/components/zombies/EatBox.cs @@ -25,7 +25,6 @@ public partial class EatBox : Area2D public void OnAreaEntered(Area2D area) { var parent = area.GetParent(); - GD.Print(parent.Name); if (parent != null && parent is RuntimePlantData plantData) { diff --git a/scripts/components/zombies/ZombieMover.cs b/scripts/components/zombies/ZombieMover.cs index 891e193..f2cc17f 100644 --- a/scripts/components/zombies/ZombieMover.cs +++ b/scripts/components/zombies/ZombieMover.cs @@ -21,7 +21,6 @@ public partial class ZombieMover : Node * Utility.TileWidth * GetParent().LocalTimescale * _speed.GetValue(); - GD.Print(_speed.GetMult()); } public void SetSpeedFlat(float speed) diff --git a/scripts/debug/Cheats.cs b/scripts/debug/Cheats.cs index 701fb4f..6aef97a 100644 --- a/scripts/debug/Cheats.cs +++ b/scripts/debug/Cheats.cs @@ -12,5 +12,11 @@ public partial class Cheats : Node { RuntimeLevelData.Instance.AddSun(50); } + if (@event.IsActionPressed("cheat_zombie_spawn")) + { + var spawner = GD.Load("res://scenes/debug_zombie_spawner.tscn").Instantiate(); + + GetTree().CurrentScene.AddChild(spawner); + } } } diff --git a/scripts/resources/ZombieResource.cs b/scripts/resources/ZombieResource.cs new file mode 100644 index 0000000..6c6e217 --- /dev/null +++ b/scripts/resources/ZombieResource.cs @@ -0,0 +1,8 @@ +using Godot; + +[GlobalClass] +public partial class ZombieResource : Resource +{ + [Export] public int cost; + [Export] public PackedScene scene; +} diff --git a/scripts/resources/ZombieResource.cs.uid b/scripts/resources/ZombieResource.cs.uid new file mode 100644 index 0000000..55244c2 --- /dev/null +++ b/scripts/resources/ZombieResource.cs.uid @@ -0,0 +1 @@ +uid://cqxj7o8hdm82n diff --git a/scripts/systems/GameRegistry.cs b/scripts/systems/GameRegistry.cs new file mode 100644 index 0000000..b677a9d --- /dev/null +++ b/scripts/systems/GameRegistry.cs @@ -0,0 +1,91 @@ +using Godot; +using Newlon; +using System.Collections.Generic; + +public partial class GameRegistry : Node +{ + private const string PLANT_RESOURCE_PATH = "res://resources/plants/"; + private const string ZOMBIE_RESOURCE_PATH = "res://resources/zombies/"; + public static GameRegistry Instance { get; private set; } + private Dictionary PlantDictionary = []; + private Dictionary ZombieDictionary = []; + + public override void _Ready() + { + Instance = this; + + //Plant init + string[] plantFiles = DirAccess.GetFilesAt(PLANT_RESOURCE_PATH); + + foreach (var file in plantFiles) + { + if (ResourceLoader.Exists(PLANT_RESOURCE_PATH + file)) + { + var plant = ResourceLoader.Load(PLANT_RESOURCE_PATH + file); + PlantDictionary.Add(file.ToLower().Split('.')[0], plant); + } + } + + //Zombie init + string[] zombieFiles = DirAccess.GetFilesAt(ZOMBIE_RESOURCE_PATH); + + foreach (var file in zombieFiles) + { + if (ResourceLoader.Exists(ZOMBIE_RESOURCE_PATH + file)) + { + var zombie = ResourceLoader.Load(ZOMBIE_RESOURCE_PATH + file); + ZombieDictionary.Add(file.ToLower().Split('.')[0], zombie); + } + } + } + + public static PlantResource GetPlantByName(string name) + { + if (Instance.PlantDictionary.ContainsKey(name) == false) return null; + return Instance.PlantDictionary[name]; + } + public static List GetPlantNames() + { + List result = []; + foreach (var key in Instance.PlantDictionary.Keys) + { + result.Add(key); + } + return result; + } + public static List GetPlants() + { + List result = []; + foreach (var value in Instance.PlantDictionary.Values) + { + result.Add(value); + } + return result; + } + + + public static ZombieResource GetZombieByName(string name) + { + if (Instance.ZombieDictionary.ContainsKey(name) == false) return null; + return Instance.ZombieDictionary[name]; + } + public static List GetZombieNames() + { + List result = []; + foreach (var key in Instance.ZombieDictionary.Keys) + { + result.Add(key); + } + return result; + } + public static List GetZombies() + { + List result = []; + foreach (var value in Instance.ZombieDictionary.Values) + { + result.Add(value); + } + return result; + } + +} diff --git a/scripts/systems/GameRegistry.cs.uid b/scripts/systems/GameRegistry.cs.uid new file mode 100644 index 0000000..3ee6738 --- /dev/null +++ b/scripts/systems/GameRegistry.cs.uid @@ -0,0 +1 @@ +uid://b66j681wn5tjn