From 1c95315496f23394e8df459497786efb04702554 Mon Sep 17 00:00:00 2001 From: cgandeg Date: Sat, 14 Mar 2026 12:58:55 -0500 Subject: [PATCH] beta-1.1 --- .../Under Construction.aseprite | Bin 0 -> 358 bytes Assets/Sprites/Under Construction.png | Bin 0 -> 141 bytes Assets/Sprites/Under Construction.png.import | 40 +++++++++++ ....~lock.Archipelago Game - Translation.ods# | 1 - .../Archipelago Game - Translation.csv | 1 + .../Archipelago Game - Translation.ods | Bin 18145 -> 19023 bytes Scenes/Characters/Player/player.tscn | 62 ++++++++++-------- Scenes/Characters/Player/sprite.tscn | 42 +++++++++++- Scenes/Debug/under_construction_block.tscn | 17 +++++ .../Interiors/home_01.tscn | 18 +++++ .../path_to_dungeon_01.tscn | 41 +++++++++++- .../Player/States/play_animation_state.gd | 30 +++++++++ .../Player/States/play_animation_state.gd.uid | 1 + .../Characters/Player/States/walking_state.gd | 7 +- Scripts/Characters/Player/player.gd | 3 +- Scripts/Characters/Player/sprite.gd | 9 +++ Scripts/Characters/Player/state_machine.gd | 7 +- .../Connectors/chest_interaction_connector.gd | 43 +++++++++--- Scripts/Objects/Chests/Bases/chest_base.gd | 2 + Scripts/Objects/Chests/item_chest_01.gd | 2 + Scripts/UI/dialogue_box.gd | 30 ++++++++- project.godot | 2 +- 22 files changed, 313 insertions(+), 45 deletions(-) create mode 100644 Assets/Aseprite Files/Under Construction.aseprite create mode 100644 Assets/Sprites/Under Construction.png create mode 100644 Assets/Sprites/Under Construction.png.import delete mode 100644 Resources/Dialogue/.~lock.Archipelago Game - Translation.ods# create mode 100644 Scenes/Debug/under_construction_block.tscn create mode 100644 Scripts/Characters/Player/States/play_animation_state.gd create mode 100644 Scripts/Characters/Player/States/play_animation_state.gd.uid diff --git a/Assets/Aseprite Files/Under Construction.aseprite b/Assets/Aseprite Files/Under Construction.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..322547c623e43403456d5297d5c036dc593844ef GIT binary patch literal 358 zcmYdeWMFu(l#xLI2o)HB9EKDiMgX7~NDwTK5TzdL8PKR-A6dY*vH;m)K+LWHwi3yb zEFhZ&%>`-i4$u1i$!zA+fUJE6=2P;#GxdYKRg7#b z?d?kp5}Km(9wyKJAAk1A>Dzz)|NlRG?e>-?dMmNKguUGHtpYGL_ zZy*n{Nr4$i!oYtZgPp-Au`;zt!O$GYVO4-g{bz#Ekie;!^ZW0~H~;e$(h?FH9^YS_ O1cJ&=JPZn~w^adzut#_R literal 0 HcmV?d00001 diff --git a/Assets/Sprites/Under Construction.png b/Assets/Sprites/Under Construction.png new file mode 100644 index 0000000000000000000000000000000000000000..59b115ff8b1d9c5a0a1a7494f4363d6fc78dd8b6 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|+&x_!Lo9mV zUQpyapuppBk)3ne’s difficult to get materials out here. Hey, could you bring me some metal ore if you stumble upon any?You won’t go unrewarded!",TODO diff --git a/Resources/Dialogue/Archipelago Game - Translation.ods b/Resources/Dialogue/Archipelago Game - Translation.ods index 7af8bf21f7428f2aaafe2aab55e9566506398e0b..195f655d5499de71098aa3bd9ab451bcc1bde303 100644 GIT binary patch delta 13603 zcmZ9z1yCK$qBXiV1a}B-!GpWIhhV{jLvVMOA&}s{aS!h9?(Xi8;O=fO-?``h@0{CJ zQ`5a>waoNXTdnmw0z451M)@KO{q8*o1P=nm5!l9{C_(?dK}eyv;QkkyB7;myAS3+; z3sMDU|A!Xy_fZP?{lB7yWRPcZM2IaI{$B+kfVuyN!TIkb8RUaF>VFmzW5^5#4-fxO ztu;DOa|r+NYB-Puz`);#4(LAu(%-m|ovpKptuvFmjrED=jWNp?{x`JCS{n%2>6A9_gMT`xCR>Uycj9E{i$GUCFrHAKP|{h z2bNQJHYmV$gH+`9-#__Z1t4+Q7Sx zteAjB%nD34JrJ3%{#m>d9FpXEj-#bKG@WBXYHB~hGHww&NJ2hgPB~k`s8jErq}?6& z$UZA27B-9D^tywRtaG+gk5VdLuD*Hf!#lQMQ3|8?I9jF5Z&E!o5z)qz4e0WXG!;mr z^Mj)TDwWLDam(OGFmg?^f@zwa5U!_EpzBFE%yn>aoZP#0*nw7aAz+Hn#IX50Vy5`E zLZoE*jDW||!@<#@OQiIvNx|AHpW{T7Wci$cpx_gMt)u>sOpG-~Pdr_ToH34%0g^u9 z-brG9E-F?e_E++0hOE_Mz|sm|+-E)IbXS)FcJWYD3q#j0-r~9|hjl?awb=S&%ZW}t zxq=37=4wi^x&v|*)bDI6CPu-xwBokA);<3wdyOM{u>NIXi8si{BcqAy%3yTn)`E7j z->A#dX2$53l>;AKWQ7#T4x)@H9@bX`q}mURt$ybQ76rPYB{3@!tXMsbj0;4wTzmZQE5YJ*cOC9pXn$nW@_$ zJc+M?+F||biA|<#5prM~{U_ZZ2pI)m#`yuh#EJjyX?4B+b>S)Cyzo@acQU;V`xanA z>lqq5zPUGKNgjVZ1EjbEF3h>`^%8XBV|QP1XEYnlFoAaFMZAoow=J2 zVues}c^dmek*jD7tW2Cs5jW)b+VyRtAa)}K6cOYdf_m?OaO!qs zBY7`$(GU~|f_WpkY;%rEny0g_srx2_A%ltKVj@1Ol@+!l zQVHpmN*ksbYce6-yL9@V&gWkLl^Btv#L)OiX!fo?jP~yoAtiMqXde|2BmH}S{dgxW za(}l0nv3_3re$p4+fiTd;ik6oGP-5TsDIONdVu>P3kTmv(hOw5fI!FiAkhEJHUA#< zA)T0nfUI2_3tsD;#s?aWO4ca9K0akMHMAnFBJH9EY%74ww(WK}sq*D+Ctdn(l5m4% z>%o*|?qw%8z|6j^+BE1-a26=MQaRZ)$oE+ICrtAmDc#e3;X4)!NjIpi9;|ylyxe?~ z2#E68B;?L4&|%|FDN|yeGYK^1ILXGGBp9H{ zxQLV}Z#7o)K6S3i$&)P>Dj-m4_76|!#c-RsiLd?&1JekmqMb%@ohwD8_Nd1K9&N^6 zgrNKzq2YloVwFG#oq(vfjoavO32l}Am#6O-s3+ipAG>5S-8@SJv=sO`9K&G(6txV) z0HVIqXaR>o=iEBqYgQy`y8>5IK1ReTx#v@soEz^m!=-ozYz1CWO-+Z0dz!N2Q+n|`FS6oRabYBVKP?qDopMXd)#^e~zReO!8K{m#a%TV~C(tXKy#>Kn^C zVjtgQK_Erw|J#QN@40}@h#%ZbI9cSf<&-ts3mRO}yO{h#oc9X+ zD9r9L?M}|lt`C<_Y@O0hgFM;W#i|eaagiS`3Zn+Mi;cA(FC-7Vwi;ylNGQ)37#sJ06_Wxmdp;DLjE-t8kD# zHd(%6Puqtctt?&%zsrI8N5)WW!(aB|L(ekaOdoL?$Sz*e3Yld>#u~-?vqsQwV)8Eq z5)2nh z6H6Cl@a{|L<)9>_-f2nudw1`D3C!3@fU@=s|8@+OfPYDkTabx5q%TA^Leu*WbLWU1 zZx0p5++EJ}9lreiUXYszt8Y|jc9zSqKRmQA+9Cs_H{%a&Kl?zTd?>9fpf+^)5He~x zftJMw1Mf@Wj8Zw9=518$(T2Pk0*Tct1RqsY%UQE3^@xI%UJi@59I zI;3M56UJ{Mn+KzNYU!M2Z)OMLi5Nh8ZztIsK26UC^ zt6Z2|pR&s%TQWBHtPRv3Q60bLKr+1{Mw0~*Kd4O#(NvHZTVSXhkV4wd3xn*gET6&w zkH1~D!s9NrhN!b&LIfrc1HTVl97GIWKuC5c#$yVjxn{a0xlQ#0He__)V7fg&gdCFC zGcGZzB*Qlk-jR7IHN6lPy7|eGpVvn;&>D~p9Tnvy`N9_4>{=^AQ!{SLL$yjV0s{I0 zSQ3Bm;t79AKD+Im9UTZ~>l@%x(1SyWV0yE{P~Z8M>cTZ7`;SD3SXMKv4@3_g?=^1- z8eG+mRB*#-=GV3Z{+40dgP;EFJYif&#QiuDgMW#wKGw)<`MF>`y=~^YKXUy$;}QS+ z3ndK)OgmXw#4wLCXiw%4R#S1^`2G(UWi;8DIlCh>n-98JK0CpupP{Z%5~z)7s_vb? zABqCuqYVo%iqbbmLZj9?HNXFU={;Tj!Ngk0t@IWztbO5v1X$%?T}=KeUN8AAe5b2M zx^xNbqN>gzTMn8Z4MU2UQY9c(!YWcxYbi=D*;8Bc_qEfodVUlgC#5N(^6hThb>)7B zjEDTos}%i*7QykRlc`=d;caFn`1&m;JF|8xbxK)I6_y*#;y#?kfA%fRpLc|B-*fjj zspGgU&~*lkx!X9{Uv;%Xe zn(J2h@Oj(NVQ-t}T;q~7nuJtrZXOeIEF$%+cq3iycxI|h7PR^|#W?xKyW{cZE4c_Y zuUCsB{jJmp7ulaTYl*IucxM<^PD{!-(l?8LZLIRt0ErI7YG*FUPu2!oU2__wdnHj< z1gr0y%;j@BsX*9YPzKJ&AH$O1rhDUXfAPPanEG}V5J_@fg$aSQ3TPdW>$4cP&}J_N zA9+l5^|>L^si(@K`on{*N9mNiZBFwq<9_Vgc01geMe#L4n^w<%H;i!by&7k(FMlU> zsE;5J(SPkAb;5ww?bW~VKNlVdVk<=exglU@$9Ru~Nr;UMi-U?ufPsLEgA0d6j`*G& z1^Xj19wjmXEfyg)76~gM87)2)Cp8W%#d~Bb$X7xl0H2E*|0B&uN(OFvRvu0UN^2 z^;znZERl?qxa=n>d3pIy@+$JmUzO!QeO3CbrluyTZXpdpBO+%~an$)_Zm8vMDCcRW zZed|*WaDmUZ)fS~->R{#S>Z)qxuj3S==N@hB76Q>H!ZC?0{9&yg;;0qvs`JCy z_`8dhzq@Uit6_w@afp{qfVXq3modcGA~e7&;k#w(ce50KtGFM|v4LI*A>OG!9nwRb zQo_8m!(9tvy($xY!@|OX!ehf@lj0(R;$tEb65@Zv<@zO*K$eLJfa18^n%Mm2_@dV2 zysFfq+O*>497sTRLRfB6cu|6XNpfImYFJKMVs%oTN`TBVK`r`QIa{KA}=n>hOq5XXuX5jfsKI zoLMz1LT_;%_-B@5XR}Bl;wSZuLuB^cs59Z`E&>ZF`InMHT7bgG5&7l$=m!oi7H=g? z|5*3UbLO6|)kzx{AMP0M0Pm~s4aQfmw#1kAjhohqr}hagS&IGQgg|N#XmSokWbAAb zS%VWaVk^b2GY1k7{DI8TJ7*0JL~mowYYV>{3f}Oty^A9W&q!YH*J3#C@EoAb(cs22{CP2 z&i~F~1Fv>VEX-t0KV^%;v^fVOB1^2aP^DnG^vsV2;MZ0p!i_nqfzdylO$B?`4yz&g zbwPvkK^k>1e&wE^N_giwsL8zMj*;hwiI2?9SmGe(3lInPn~X0%h4A=$VF53ng6AeT z1%;`-*Q>~Ky1yY#x0~W8FB00w#5W;ja+Sfm(Cr%iiyxO`X=(ai58>E-eUd+^nkj5T zwq1Z~9n^GMyS%o;2I!TYneH@?m3uSUqG8jpxR+1k!#E^ik#U3J*V}MHglgpqniFcf zjzwiU!pdK3tDPkcLp0_LQxAp`KG&;Og?LK}#MhiVnMum0|HjlPwYw;|*rQ$|+;N!? zA-2OQ+jK&*YO2y3POcd<Afae%x(t`srAJ!_dQDgx zrPi>31@i zxx&sit?M?d`BZx*%j#yu-xzG65}X0d_D|sVXmYmLa?)ECeQx2Vpr|%0W0u$atS<58 zuu+q-yv)0F&7>l@?(ZwiWU~d@6tFFn)tJGe-Q8O`KV8oTXUI*2|GvCK5-e*@M=aT6 z#$<@NXPYWKVpmpCVb?Ca=+~=pBySuvU8tK@i|J@^vWz0q`^a8NF}17(+@%4B+@`c1@iFhy6lLKM zL$O?yZ(S~lH-axce#rWozpiGTe35U6M9js!Helck@-_C&kL1Xkzq|ujSC#rPdDq>= znQT-+9Bd$!oa{yrY?d;l-WCX76om^o8k;e@j;l_*((oW39^>@7!_jwIp*nGB(STSQ zr|SjZ_&CNEP0@M`e|U&_?}W6+PLVjQ8qXcbS=%Cncz8A!HkWK@q=~{J#RUHAVL%EA@t`=abNb+ecAe+V^ z2kjDke$^$xsq+gV6;uBL*NW?)ajQSVs>!~Igg<*>QmBDHbL8~w=vXPrF`#d{D9*-* z8SJ;#pt$pRLdZoHm2k%*uiSD}XUnA4g??rBjY(f!FU0|iu}O0tMXxn7^@w5y=INoX zte(4GK<7>xpRp;V*%??aJ7^KNMq+u~De|^3HJe^rwM{p5dpD)=+&l)5e2=Rq}`ELqT^PYIybfNCqTmZlL=2`ZdD z%!{5`mOg2#Uu%p z9evOc#tU>?n81Fibg+llBCpUM*0r^7>|QP7KB_A=-_2!?_vYs2XvPD}Rp8d!0(~*H z@0JqbbUeJV<$&L!?dK|%q-A{qx&8VU!KdeG^O0xmQhUty!4-*0VRKA45nHh4TvSx`4Llb50D0x86_DNi+c8_7cQsPc$E$CXZ}1JQlGoGmIe@?I3x^3uCTyt_7uA+;*6*uMd)Ox3{aGH8*^)K3_J$9;4aFTp@_zdsX z?F6x;FLRCBfZCpcK%2nt*L;Enxh*m{NsKo(yhiI#rNQVc!?L460cwIKYjqHHj}&dyXM@sKh_Mn5F7kK> z1PcTGCWnqmaQNK%MlTFzDUtlrzjK8ku`zarA^OeuG;je0T~on1DX?0VK`HK+IF@PVhK5#9_FLAQBZs8P^&p)iw4$i~B~vl%4h1Zqg4~(Twpa<1 zwY^$>Dh`sNxJtVFSq)N8yg(P^gd8;j(w=kJB`ViimK_&pFpyp$+4z;??e-Mn*?N+a zSLN!O8N6?brDUD=PUhU8MXMb zy!+LdL=&_8Nw?;pxJwG2oH=dp9RWhJ_sQ8dLxTPU34#87{OJLfMb4s3I%42cdS@=b zoW5@X)Ml>NZsk?F2!a-2JhmDzAb*ohP`3jy#f?&wNoE`n67CkDbX*&ORTwjIyKKBq zHXK+HZ+QTD7NaBE1im z=ON_%x#APbfKZxCrS%$wEsR*iIUx4-xEgCEt8sZ9J>*d-Ez`Fp5b&i{rM`dtIy~zq zX`BLzXMDxLgQdy$lt*Mhuj7F>qkagzvqt13$QLQ=vsM?5Uy0gQELmp8*}>Jy#?+xA zZDQsr{^zNZrc?G>0k+rx9QF5>HQv}a_Y5L!1lg#X7QIpWwtG@*rr_PQbF<}Ew9i;Q zylcEjewulb2W;H?jaKLRV=7+W!=O)V9Oc?hy`8aWdIax%)1+1b_2z8zxzLFv*Ib+B z=bWsvSq8zm7=spkzI5dD4q-mXa%h;{AjA4;i)*e7DLk(NcPlyjuIA1TyY7_*slM3k zek@tPs^)nGofxjl*07k3-bF|lOjaOGKlbWshXDaSb#I@1f=NbwH!JI1`?0>oM{RSo z1G|V2{FZ*V?JWjCaiFItyH@@0X`D*Q<(-i6qwZ(yB8wt?)7%GbTGp+d6+!y(zU1(m z*oig=2Q-Il$jm^&B_)ucVCKumMr}jL?T{?j93F(bthq$xK|tm8D48(8R7@e=zvku?IGv(E0%&mLjV3KP0j?gl57eAa==V3b)`hBvY+C@9MG?lz6k$L3?NNlcfuit)} zn2MQA@(@swQ5^fMsA-2?nkxUuiyt-E@W7M)wkbzII{lEdVOqC*{Y6t}wF8S79}*KU z~T+AvSQ<0*Z}w+oSFWk`Ii^ zY6H(I@17Y6HE{*abYY%>M302i)h*gENcicN>_Q_bUaGS~YEyLWRaQ+~qeCD$yL_Pa z^u;hOG0$aJ{Cl3qkP<~jMX~PqndyCfL2J8k*%UBq&k(bJt)h>i>*|FUnXkfF%)c_M zg!@#hzYIgTT_c}p#a`I#+3~F5hG2~!oA4%lQATT{{Gh7grbn{h5#3sRNBXp4Mxq9D z_BP`|n$~K~`S?dn@~iw^L&_Qp;eD(pT+4TKkl#3*NMbbl+gDt32j?UG9^Q|dIobse zS2{p}AhHK^|HF94CTz0V)5M7*j!XNMbL2jh`kkGWzxzwkxNajR?(k3g-zWmbZ`d1U zBeqRfsR{yUBVGs1_B+soSu@3jO9`G?3tMfi-}99Rt0ah3>HGW@DQ1YJX_+S`*c9CEy3ot?SR6BIE#Ublfr71M_)js@5k&c zLx_K2ECM&@&g>NPY|vR*++gt2w?DfVqmRb@?}m0wYK|{Dj7~?UjjNxl?4UO^rl$~A z9=grPr%-`(HXudYQyRr8-MP5XOIXf;mvot;FptjU0%6!`i}_#P?w zP63S0p4R=T6l!CmIs`NgDSMGyVk;T)_{o>D#rP0DUsKD&dr$tMfvrELGVzh7)*U*a zW0l`9*SQIbYULg)w*_#-1^w#{9+?h`La`w_3!*Vt7f6QvMg8;c8-m+m9;fI56t**kkaX2B$xenCO? zxJ0SjQpj58H|)6?_Z~*7RDh1VlxZgaT=NVS`6~hg(=)c3Wfh6$T3JJ=)&_8#qNY_# z$EUOG5RmV?T2}VEcgAt<&(1FSg1dr{=I5`Zm4u&w+54k)`w|AFT^TyfY`&A`e(@0T z&*?{jaXhV$Rh6E6n8cn19WS?E`Fl*X)IA=ejH~LEM;MqDr|XB6X*ruOhsHluOyl6- zMxZYLIRiA+86Epdbez>ldEJ0MS)KjbbNMIPx>oj|eP~ul`dSu7i~CxQfU3Y0p{?2K zU;}j4G;v+P^=%9W(x^{MWTL{C*yYvI>I<&YHc&u<&q9v62<}%fnd04b#iZ~@*=-w1 z7t65nCp}OEK{=F|Gv9k1*#mscL#1dLyAlN+$W;iyY@piOgnN!5=n7P%YCHFAUfn@u z_isNyiFv1rI?vZdqEYVBFeUg!GjN;n7$FK4)H7T5bLo5}@l$nqmZX+6Vdb)G%prJI zBFex0=`oxA#9S{VxC+#=<#y@NsyECqAYG)Pq*u&SUgfdoy}1xnbzT#U+TH6!pIIhE zV5eIuJG0}$bn18=cmVXkb(M|;oH)Vrj>*7?{~MEM?l?a8<;ma0xz{aacEr}qRnivc zaF4k3lDd;00N@y1=#e=t`v$fK3$~ z%`?O_*g@FXvyL)4zP2{w<7|oM1L)Sf3n(HDgjC2F{aq|0 zL=7JzO?iOHl(UcDd9Rh)G=vfHDxOA=2u`eh&~{g_J8MccmZi+-SjB_`dHK(AR+*W$Au{%FA8*UAv9**xy0CIxa5a;PJ-*0e}iCP^sq3XjB*Te7*qbmG76~ z7h&~3%Gt-ycOTS>#Y4$l7J5IQ=6KcM@ zKL0d-EA`e<8ZTWs*l?Pgc@x^Iz>tBDF^EswyCf!PS)sUYuwb1zKeD#5)*#(>rei6G ze3<$7@abxpg;^v7M`qBB9I6Ml9R=joeNev9fOfu0aqe-4i;Bos?ytFy;AB;?oPO`b z$jIp;*N)MwATRrOBb8u@k00Rgn#BK&J}j&kY`LP1=P;&Gy|cnd;zt?!rx6>yTS#ge z$}pJ!E4e=b#i|yycJR->l29u0{YEHY+5VxmAGo=Z3W7;eQ&!cv4guM7eY2_Id{>CF zs?APqj-|$-_zHN(M2~YU7U@mPGsJJz3hhJ` zV7eH%&70c89{H*YYqM2y!iWzQD63s8rkJ3(;7IjKGl+4J`k@QTjj_2D#}DkzbQR%_ z0MAMoTEVwqdC1lpw;2Ujd2766Oo)l)o_YyRd1~9OEY({ncX7D_+h&(Dd2&nO$_^Nb zeo24#{;&iZ@S@A1VF$KKdKN3Ai(5orEEWbP7+x{EpPRG^Yd&c8S_JbFit-1 z=*a1lkZ$s-FLw9qeYVEN`e=namwsZI*wBJzull6r4Oj9>0lSLPbAj6srTrtSEOUQ~ zZHdO0^N6VUE|gi?#Pfx1PP|LqZvqbu`90t6$FDIc?4pj;Qjoy~K3)Bof*&F@0UH!b zu(%(cXdgN(h{cmBot>Q0lFg9SMUNT;J6(i#TYq0nl-I4hB*lnOq>?zw7lbw`nZ9S< zfLLGt%`MRf#B8&vheayV&`&cXTPbz~mDVY>pu<o5Uw7{bvz>cL2zWt7ZLb3;7Vjv1fQYQ5B)Ydd{6*eple*@tPatSfVSIvvnw#` z3Q8aPSy?z?in|v3p{MI@Ym&76${WpC0yYaA^+f_h;aFmKGJb3_ z4$B<>2|Eh9B}qE4$<05Y13u(F05Bmi?(3x8Rf;Q0CQ>pCA@NBfB&jBrci~(NW^(5x z-m%GlSFM;F+UkL6k=t2ArZH1tOO&PgboHPRHX=p5mYzL7eSJJZodOzma! z0v(-4(Y`lC!Z@nbQ|Pg695V2Qdv)-~!?rB16Bn&%q^;v=5q1fGfHQkl%Cv8x0IUnY zf{N03t4*^6^OvPE0`V%$Id07(wP>+Oe!xnp0H5>R^ z5_;du;3Ap6dT2z|;HEMcA?=tG+Z-f~t?A$&K33*z3Q_QyTcEqNGfmj}G(Gl{D(`2- zBNtuX{7?Q|+o;j?+|)X6M29h*`%D?pR@=Of9vjg2w1v{TGaG(vk&K4=u@1zR<)3j9)eF30*hop!9H zifylL1QjHez|+MFUb)2T;BUsYY$c}cclh5s@D$!=S!Rp}1`|V*zxlYIifM~BcbuEk z3YaF9F73CcS7i3*R(`9VWff$BGwTiNz*IK~mKdg76QUlsRekAB)mZD;favJ0;;CgA zo-My5TEn`y9_;b8CGOg~dPa;ZY&kX->s9!krrlM;0EHK|IWnc}=>HSSt-O;TK zJzf^+SxzvmxJ!jPS_P+bZx=YA=H@MM+S3lML*MTurlidh?ojcZJ8H|;2l=M^u4wVR%|tO@ev9f=S^9qyu* zL-g8sKye^%0gTy{v?K;a(CXU#* zmSJOk)hfTPUaVqex~jkM7=^wK1~(bk8pD0}3xhUrn@#GI2>K>9&Y3CNc}0?QN4^w& z<$D0VnepqeJnTi4_9@env~RtECDCvWs690J62N|?gv9kj_HMlt_Vsh!)>I*}8z?%d zLo}3wl&k8Q0L=#8!u)KnL)5pasi9ur2i;sm9U5vKsoJlZ!FV@Tk2}RnQdX<&O47*< z=*|o>yEW14-kiI=sUhFCU7tbfSHiND0P0zGOH~RDOC$|!?2#NiOd21}vcOX)fU&IC zJ7cyTgw*L%=6X;{CSsGW;;Q%}tXtB-B7M}qsWpIKkUP6gD;xM&^Qm3sM2K{{U8wL} zX0VP#%|Wi9*Cl?T;d5`$*&w{faNrFk`TiN)hg-Q`CZox53#T0=HHsd8Qu4Yya&RL5 z@l@-bmeYf{tFW@lbT*YMS@6I$@ah<#CfTeVR;0k^y3_USD$Y6H!J+dJ4Asae|AWqiTml4y6pJ8}_GQ3$Sa@ zro{p-oCuG6sy64B474nwXG9yDmQ@xX<8it~JANL=au?h*3QyVz))K4F046|Yzg4VQ zQ5r5PSZY(H!1ZSZ?JR!m+|&zxlbwwX)@MOLJcEdArRA=d-xOdE9AV;sUaC~ozE_^2 zjuPgPuYV%Yty_XXd4nnzP{;k4p!@`TOm}5Of*;QL+RHIV-8Wn2msQTG1oPBVX*iBm zj4ni15R8dwS<3+NhQ*&i1lf^n*vJ!O^?*6{%{f%mmFYXPPJB9R=agz__CM*ix%j1O z=vH>EZkoS~pg@FqCT^o?f4uzSn*!{fM{@S(!=SSgZ7Dw|sguaJn0m>|Cf^daZ|8e2 zU24{wqJf?BC&uO&=MYvgx?Dj=@V8)hSf;6QMn)Q}AlHp%g*bPB`hwmh{Iyi8$-$cg z!q|EEwiy?+gPaUKjIU3!BFwq3qN$v=`_3=6VrAa((&2;xoAB4IC}o3DHRT6IKbF{9 z0p3e|(&8-wPU7<5@IH8Z2hj1>_j?bL;2ICHTRgO*%Ow6{d_ljUIpK%Di{3}2q?R`Z zG~#gO8oxqy&kv(Oitib5Z%DP)+;7+o-N^{sTg34xTDKQ|$3K3$0EY_dq6?Q6rqrtU z2hYT9>&zI_auMw9Vx*TeP3wg%j8nY^_8`-yQe4$4pDT;vUQD$noGHhr;NmHP>$e6? zL@sabaT~@poclJ$M}4i8wnBN}Okc;m{oL_-qscDv`&%^t+B{OL5nMss3wC_Head^0 zeYP7@w@}w})+N&Ynt~M_{9Yre*hXt@vN`@BFUT z@nV~2e3$wdUsrnUAT6&IR~^sUMw3JyAn1tbcx`c88X_^`5VvJFdm;9TK zi3P`tX*n(6PHbquhyLi{IEU|c$OuGlbCD}ERmE>{gpE}NtN99Wbz9XEXE)ER^6?-L zOqdMtS4^PXg+@!8;f*#jSu~n?7Pb)b)^PoFxr^>JfdkSJ1r>4!jt&9_Nc*kQudO!xeA+vqA#0GF=hYACHE?8V-KC{@MX^~4k&ZxLOO8HzM zU5Qr7KOY>;9V6!xr?*e*#>S|^Ek%P$%fvu;8X>qs4+ruv8q6Tu>tK~=JMO*(Z-X&_ zc0)$0=cJRi#Ei-8Rn}$7C(ciLH<&R5Cu&d4zHAb1tsxSDAo2B4qeqbU^hac{1`rJs z%^ldfdJ;i)s4_q(ZVMqKd}63)5RpFXlOH(b`oWQQQs(K{FM(Z1W@lb9iU~^>a6N2a z9D-ky6uSh+k}kse?i}yW$$JpXI~`h~zkk6e@l8T;^6dz+fM+}8m;$JB0$N4An4oo= z$G$o?VU|Y*11y%-R&VF1^gq;(tILplXTATdIP5PLxiFzDZi%6}oU z)Xm*DZ(vM))t0_SF0+3;Ei#e{66InB{{JO~u6Y%42LH<_<0AGiXAR^)f)LU#_8uYv zg@FQwdJp=44jsrZ2|{oTL}zgeIPz%iR7|EJ1-Xd7S%>c44!>x06Fim@m9H|>A* z++33XWA?F?T{{~s0~5J(sc@+yg=^$+Pk#bwC-E~u-xNlsGySux)6?b>nB7e`h_q=!BKgU>O zCg03V)<`mvm6dN!#sjw^fe2q^AfeCzfDZtGT%JuVf+FM}1*U*tg#9lBJ_U08g~etP zgMUlFfBIMHKPF;u8W7`e^DknsmBdG|9q_|HrRjla|FN+A2VwhL8L-2C`0(Mc#%gsS z=HdRrYFXiVfuKJL9l*cj)1S1FovpKptuuqWjrEzviX#aJlFy{NtfcCCVAp9sMMI-b zP(6oLZ=!(}m{MAjFJdHhIzEqS-v&e~5QDhF7|O~4Ggh@DC#+Q52FT@K^O-Aj!It0P z4eId%bumq2H( z8<>f}5Fjv2edd`bG7gu+2eW0ZtY6~bF)ZCsj z1rYXk&qD~MDr;X{XqT>HR4uZ)l;C8+{6^8cJcRLmvm2vM)T+eYI&~yAyHvPoPOcrl z;TRVMb#CqvYeUQE*}+SBv-aLHmELYZnxEPvWrE8%B!`>P{=O|!b5=H5i%5Uj7SU*> z$f-KRxtZfc$pNw?UhDF(qXTr6UXP{~ySGm5!n0^VBYUVv5&uC8Mqgw{G!(6m3I=Gq zjpMem=IFsC(7Jli_~avpQP8JQ`ih={^HTWfKJhA;;`fS5eTJ@=euN2k*d2ItfKV_ za{Sg$KK=WHk3)Q^0c)Ptf=MkQ$-PPG&A$gn@57Taj0o~ki!PTW&JVxtdY~ zg@>)lvSU&N^24kaylj(Y8ng)E?#ZLS-~*CxX6fo%5h+O4_+w#qm@&$JG5HWMkqzMm z`mkMxP9+)#Is8zqszOGqkx23hcBY(Wn2Y-)9%|^Rdj}dz_TBF)vqY7s(&j8g6}EzA zf4QDm1Ij(rx3#5w4Dm-Q3Zvfbjx-{8MPTyUz?pTuj`Fj0vDs_58fk? zTch}yE|e?e^V?77f}QS10iyG}N7qBNc5M9)!q28j3!h!SnQWvmW`SliV{Qo+lO{X8 zvLFn3X;8a)QT;eD1J_St(z?UmnW%4 z!u*UJtcNwQR#W>0YBijX^^Z{wQ>`RQNXm<}LR@dcLRVM;ACzskUV097ZQpg{uw zp_l-`e^&MXF0^1-R9ujpUHTWawg+`04)v;PO$@q3Nj?=WGUf zy>c%8L0;Ww*kgv>`pw=EY~xC0Y6riLrX@eZ`)DSddNw5a-!EvKj0$RU{J9- zlg3k$^-02k%iK@klYiGXSYOjH^!2T^4;nFP6m$wx(+or_Q)C7Np^YImMs!5EyS=_v``MA)%+ zz32E4jVf*1Q71hbGr>?viJ^3fxW%5%lvzc!LZL10n2P3}Ef*?Cv!P%9wZT?a+jnKq z?Fmw*a}tK|!-dPXn7R2#@~cSJRcPD#%)o;gt6u20J|7qUIi!y(I2(2Zaz6p(>Jbw^ z`98m5CKKskJg!OfEck|8GyXM%a>#-PKY;*%JmmjBgrw-~5`DOEb~W^ZVu?CZro)w$ z)*`7gUxwKp<#`Yo-D5kPoSj{tu78tsNw5rY=IoZJJQc)85nUBU4?UI`Yd>F!9eM3E z%5dWlgMXrgvJI$6Y=pad<8l{Ufy5N8M}rbvR&x9O@nU+Tnc@6Zq` zw)oL&ub3=|jsQ|c_-nwEVGY7_o}=&e;QA$g$N;#!Or0VAX0nG6mWWrpFZk1;U7Y{T zSz7#9?8n~3ECZ~G);E|WoiD|}eDN~Ggsg2=n6=GW2qhvyrso|rCy4AKZ((2>@=p96 zwS@37=zSJ=w=1!GP`;9ks&xmID#X$!iRBluRd7ieFLi6lf5|oo%bvzo7MnlowN3EL zr%aKJ1`6Tx2i`o^DzcG#`W47IAm_5EF14l}wjWbOq!;D0hrGR$@PSPb`)iO4b&y{? zj=$KKLI)&;kEqWWIw7#w3*yNW7n@k_qjXxNAU_XzL+UDOAN(M<5Wx%-rb25iKrsb5 zl&3#)nh4l$Dux3(<|ryOK9iz%QUxDw=$w=eDJm(5XkxVjAF7ep8&|JJkJ4eYw&F`D z5;idv0`ybhbT)kZ5IywbEmr>`G#$&nI)gl8hj&j0KQToNm3~$?rw5f_uMxAzka>>) zNT3Ze?8-|84Z2(zLlo=MtE(V|>>f>lDU(awMoD%_EukzkOQqB-OWw+@NFL~~52p)h zZKc$~Jm01VbJ-^)#i#~2(S1V-UHqOl+LfQ2_JzgzRD`U$ASxaqYLAr9F1$~kOQG*E zSp)B#&Jw@?sRD#j`qo@fhd~?R59I0xDVlC67Qe;Lf^B>3D*5jNIY<{ISo&C&1dtwG z_isw%KUOjzaU?M-8^`}lvZjBP7I{CgI4p6f@c{&H-;`J13iSzE#|X@lDp#vybjX_a zBezh9H7=4uhgLF$UOL5&}JtE>&MeyExPic+hqKd=dK5D*f_<>q7<8vwfZ)= zK>7;r$gdEiSekH>yHrFl8E!p3v3P}jGedzd-@ z4qZiiRahK_aU(i}GKWkDQ}{3`-lUUejlPWnOd(J&qF;dcFgN+(l#(l(`VzsyMr9xt zf>S|>W61NGq8GD~_&dCZL}{#7>`?#`bH=nFjY^#dnPb|0YkT%!vy&AtU&FQzNdimMIQ;cDq}VTK$Nfo(cok z%WOG=sUDHZI+OXvF%7l64VN{K>X*ZTJ&%c;?jiNpIYwNEWg}fo1>} z`B`!Xxy>jT5=f#d>jj>_G^Ra4XE~xRjWIq0sN|Hlv8;tO2MCLHV((mJwe&f_5~b%# zLRlk2ZB`N}wI}KPE}bl!W52YY*4!-j$`~JUK#+f}|8p$KNH2f3a7e0u*8l&W!gO>~ z&G25x0f4_AEC6^_3I`m3%kl*Y?Gp+vIy?-h^bqMgMZ?YFsL|cOPCvIxf{rOnyXn@S{hlq+1cA!IC?wT zn7KJvy1KfmSo-TYhU&S;n7D?3FYz!;z(s-9YN3u=F|Im+&c@$et^M6?!(9y`-Hk)N zYy!NT;=GK(z80YYUWwl=)4rRf`dh^ZI>!ZhC5C#Z1vzAdI;Dnt=R~*`#(7pH`i6&x z2S>z3#3g|vgA-yS6B82xhucSJ^s=2JHuC%tbwydC~x~RUs zKEAXkrJ^^jdZ3_ju%LaWwzaRc`&V<%XyedA+thmNB0N+1t9ynVSn-Mzg!eZAiOeS7@=wEzBm za(8!kegAy>`}O($`tjlM_4)Sg?TxqCXAS@$0!WDpskkqnWguv%sxCipY-3}|Y&nXy z5^RNR@@R4CPDo8b34CLP+9e9JOT_sGjo_Qj$)?OzSe#-(CpcV+%{J&snTD;Djbm|5 z>VgIeM9Yz>oj!4)C>NC71)>p5ELANyZCG9S@ON4CSZ5->y|-L9O|Dy&`&?|aEVTb> zd5}W>+L;J}3IG&=ATJjLy5V1O{0i-Yv7gxhlM$FW@Y7j*UGBts+Qi%h(HT!Uk56`o zn~dzeUtT}>Wvwyz3S3rcT)y611Y2+Tl+u8fMb>{9JR<{6ayAG(^mH2Vj!`Bfrh_if z^K(_O3J8Ih>78-3qLC;B*cKU7*STUZ%!~Q@z)f|GD*d@fPyyGG;MwN8z%%dZ%%p!8 zCJei|i2A21ZZXhRtdl{aFUO}QP+JkaR4SigCldNdYcj??EkH{v@bGz&Tx;ZgP8uXZ z6R`X((HGh;x*`Kk8=>@88^Ef_MS>}QG)W-%4enSOD>gsLW6s8w-?9E!)$H16 zmqs1IPf4k4IgIGp-i8=dn?G4DKL8!}<}>p<*O#f{fwQ6rckS>~MiHm7=*er6eLUC1 z=+Pq6*GJ@`L1{UAScagF>3)gk$R3!?muj=Cz+B2gKloSW66)^p{b)>35-2j&uSJy)GontXm~3)LCm88j)I6qr)=|Uwn5da#@)4zE4yb4! zC71EM0^j+kt>GFeDJXZtMnNK!+%>@)#L}pzYUEr@Yfzh%(pu7Gpca`^oW5ZGuM8pX zCRz5OFDk^Dx!0%CB{FkVsLCi{6uo#C0leZ<^lfa*IOP|E_@xk28M1mqR|Yn&R8ughe23{8@L{tMxoQIKOuiAFL*A6Qz+6c2sg8q}<8SCoyjr`O77 zJ>>Dg=Gj}!I_k^)%a(~lta1s}jCSi@6IQHvZz5mjC3l&ZKDCO9$@#-{Eoa#K+Y3^z zO%f!os08m?2CF^B=~(H4^Jh2i;JI;1t=m&U%p`FkP~Pw?-I3m!lMsra<2RyrtC zgCj^W-ATiEb!6OY>+?fK#cSr<0mEJl>zZrqWF!(|6!JLm;z(K2BaiwD;%*Jozx`Na zbPzXqKV%KXPaNW#kUJ;396*J}`ea~AWIM1Ec(G0VV!*dH0#fKHmna&kwsksTgHtr9 z?;y*I9o{!u-O!2C=r2@Ql93Au-~Ginft+76oDa#^puK+6{DAuA{W_=OPsi_btLGuh z-j*Wo9Cq*5p6RqAa<4ocStG-WIC^C>jp~cpXXtwh52&}PU2llcUh=N|QA#qfs`p7| z?|mQ|WjvR32K1vO(iQSjxn)$#aw@&i=$CuRIN>BkhL2FIO?Xq;SkpX~xOx&oOq8T|@7>OAemvcSMtDqG*n%ztiwx--7_NdOCu-ETpPqAqBO2DU>fb z5%PBxQy=21bYf%sN9XL^0aaK<`1tw+?ux8&u^BoErrxt$5!{m|qX$pZt20SEhYjZn zNeap7du$3K`ilZIzIun8oy1+~wgp}2$(9t@i%~6%ThxoQu-Xc}M@+-t; ztl;)pb!!kp09E}1U~Skn@T-@=rQOsV?M4d_(cW3-iAt3>rjau#JrU(;3V1(r;PVTL zwc2&8xuvB=fd{f-6w(eJMF2Cp^mjd5e)iYp%Djg8;8?C$VOG z6+(!jPFdYqYc4Y8{VkH}>kP1T|;*`JXf)5Q~R zBhQ>3&v{)*ornp-ECRa&VxoPRwMnhPWul-uWfyP_Y)ICw?IV&ar#i%Vun+m=7mhu~ zmm?Tn!G0`yYfxeR8|-LN@qEX-WHxrA9C~o_6NhqKRY#duB$Xuu-lfL*m{TrtDHBr>ZPhf#XW{$We9Q)zr^+?xiukIDHFe?(6oFf>0g zD`C1*&;{A)V zInFl=Zuk8LdOcem?&INTCDdWNnOV{W&C=Y1GtD$Q4^xS20*Lh8x8Go1O&uECwSZMox_~68%j6gA_u^1f zB%NFA*)FfT3hpKF3lg^+Q*eYx5+1iDUVu56=gS`y_uCmRr9mwC*&f%`(b&+~S6WLeZ zV*k$np5vpfB5mWN_t}nxLJH7ilNJ8x;4Mi?x?VeTOG@j}=k6IpL)sJ(T3wl(3#I8N zjLbfOR;k$q>4g9SuQy1|(KxErc!h8xi)OMiu=T917!@t*t~yqx2oW0k5vh*-JivJ< zdMvJa5qv`F>}4f{U)R$6!rip4V>G+Qsel24(cVt#M<+-ih?>#37qeFDF7-2{z{}$z zUVzBX@D-`@uDQN39*rv~n%t29?=kIqFd@lhU93a+`=%kNQ`IghkE-%3NQYP*Lv*(4 z(q>O#x-K&KLn<`Q1`FhjsSJ0Pk|cqjZG+ktu|6+H-)ZPJLjKk#?CbC!Zs8$vD*c8( zp7q)`N*sgZO!V}29liWuxJ21nDyMIQI8J7}{M`6-6+AH z8jUP+JkVi*h;~qOZN{^68#>wzoG;BtOueNHx`TS0cC+F(R-Ljoe5c3WT8)^0V2h(C zL8z$==7m||h6fj55VDSfWK*3tp=}N+GMUU066mYTkW}Y>i01aQ?9twV>UqCKn$tN_ zjfV4|(E>oa45C~qzt!iyj~*;q-zZd%I>|=2C8;xj;H?rWn1gQ@P)W>eT?st|%FB1Q zMAaNi7g^FO63e;oW7P5YLWe_LeKZg6j$);}-2@Iown}spohrxgk=UMRNEl396KN{= zO=`*Ue{q73hq4KDu4Z-n9j?>T@<_7NFfr^PrGi z_>4M%JW82VEym^q63nFJtqw}hXE?vkF)MhUXU{&4GBHm%CPgTXV~{f@=wC7 z4eHmb*4ixKRX0GfZ!;SA*M`)x$P9@d9G>RGE2_q6iZycbQ8F)(rz)e&Dxt8q_IAxI zHKaIq+;eV>|8{Lj{%GMHQu>(NKL1k!J)eCAWEaTEx0ad6e1eqd|GpyAo?X6RXPm3% zFnD}kq|3$~()ZkoHqJ*m!~HNluI zC#0#DIuO)V|LquVzVNiGORJtAMo4Mz0Ebx2Cx349ZD)+G5=SL6wXyrLrY zy|@$D&@oZp(bBg!rwVchH~fB6qu0Kl77)0J&~vz8NxLQCch)8B>|hIezbY60t-<)7 zm3&T{8AJ?#0O-5bopS)1M3XE(Yw+=bDhTkWKy34FXqb-X37EyY3s*nZ+DDbVyesw3 zm|k?{F?Oy3;TO3bfI4 zdRk&uBj3hY_u&@W8_qz zWgt^msMxBt%Q0%g>U_qZGO!r~N;q4TRXq)a9kADo{A^ z-UEM&psR~QU3j)YKz+NoSD7*}u$dwj8*4$BlI1S+(;3=jfA-$f2%V_8+yWWfI>D_^ zoE{ub<4N7daP`TlcsrG}oBd`Xhn<)y1s-f&!598;AZl7o%55azUi;?=8+Qb~Ek&*{ zr{P$N`0}j_+QH*6W96O`ZBoY2%8r_Wif)mHyAXlK)5}OOK78TfV>n@w2gVWZr!c&g zqMxesgWDZzt^?Id+^QB?)}U~kx3UHKeA&q zE0Y-J924Nq5y?wvPK^S!5U3yEVVkCb_2TLh8n?1dHStx=hKiZVx~{Aw6NkRfO6{U8 zwh~q_pY0{)>xz+x`thd@d|ZBXmfd~R$k4`u$^&rbn`@d5);J4_a3@Nr=K4KUC;s&J&~QU%9I zzcxt!*4W{&awYR1 zAGfNZD0Vj1K%@E5E;!|&VN^8WVF`8tzUi=-F+gh>&0dsOiLmy_6lm`(40CrolNYbE z?OqEnk(%(z*OO2$E-bky?Zgoi?fe9|47#>VLteP7C^@djJ#>!qU?gxU43zUZ3Z;S* z9OJFc!7;*Zk^*s&^$I;xkRBYyG_3#WmHTS54woh~;Sic-NWCrk%m$aSt9bQAjfaCn z+~g9Zb`;^;*FnViAk#fQ?5+OYki|V@%s_U&G(hs{r!L09D_5d}*RsfKs0bK9{+o?= z1OYB)$;c-C`+3w9uMy)Q0-l)jhJygt5_2tDl6AC41t^*KO}RHwmB4VfA$nv*hNci< zl@2gK(AW^xL?2#!ZbtvMH7YQVDy(&UEZ^J~><2N}As^o1Q}5;XI8DF8Zu`phw6yQX zbIR&|fw~NS1IE%C$K@x%UhYET6;HAFa}pcZv)`J?f7tQ{P^$Kcbd}}x^=V>Sj(hu2 z!42iEgGBsf=Oo?3IdpzSq3a(~8!-O}2=d#m!CDU?6>uisWHc_J&j4OrBOz7wR~fgO zKrJb|~bWc$xAAwKLM5_WKc7waeK&0cL_9N-cXEE;__q(oWy|#Xv^^`clZ4&OHh+eh)8Gr#QXr4x>X(D$n>u zrTll?h(PCaalZCuivyB%1{X@{!zcrUdMD}0zU)dk!I(#r!L}dsUmNN+6PumlQ9hXTfwo|f$sJoKg@wcgHo`feROmJS~F+! zC(s1Bj#^aJO`d{W;o?<2qLI<+4hS8Rle){f5PK|{jMXz_KF81x8?q@FpcybmTy}jA zm`x0|rN5o@Tpt?02IThbNrp9StBss03EwJKyM7Bebyyj1|51PXJAF+&%qH@hVGw|p zJVU_HM?8gkgRjZM)e2d0N?%@mQMH7BO^)`JiR}kG~qOq`Kf@3ST z)3AAfrILxT9_DpfGWgf=?5u5+(N$tyx#3T(WOX2TVHPH9&48)(5ft-6G zbI2DQ0xZ9>h{7~TC#IlEgMtC_`&mY|m0&m+9+DiDD`Q9VZ;pxB8!9wXp~JHv8CF;m z)1Vm@b=Dtiam{4A6(DwYB(pS|g-_D5ocg7!RtoUgC-q2|b<@l~I80hX;Hht=KF{D><*j%{cI9D8+!8`5f0hap$992e$J|@tAOBV94zG z2AFSWi0*O7XIIG~O>Mvq!69cnA0cJwI)TtvWZ-1k@X0i$1f)+_Sa)F$_k6-B2c5D6 zt8z2`)4#mOn?*8&n+xOILA`uf-RtAWc?xWN{3OQD!zHXw4AF}oQ$T^X1PxyojSg)2hpvY7X^d zg_afP#rW@tynvRcNo6+TAJ(gHVuRmy*}p!eZ6}vCYS)UJ5X`y2sv7`plv;N}CILWi@3jXoC~^0mDANh=?k zi87t`_4YLlaD*!=hHs`fk-94C6nPk~hRU54PDR?i+fX8Y@v%So3~Y-=P?* zo9_Ps>R1uvV-I0{9yEe2nPguZxGUDRm1*tpKqN}nWq5lC8Yvh}XDGa(XtO=f6I}6_ zW$$j$UDMfCr;9cfu~c_cce|jN#^h+I&gEw7Xo;ryO71ZP>(`+Pu(fvB(y!?c)vtU~ z2iT*UH%$)~z24Y$b#VX$7c{Xq4ngVEUfNlphdMmk-%|%qJf)+@kK`)~yTb?Oo{l9^ z&e9171kPbrw~e)gUT1_;)HP)oM%p`cSzQ8Amu?+Z=jjXBw+VC)MoaNlg>3}4OEr*q zFSm(*T-rO#d?U*d-G&T=FIZnpP{qgny70!XXn7_VRbMC+ zM0{^SR#>Q+AEb|}PZM7>SGmc1ED@f|HxU4OUvKCdIOO5#BJU@6%Ai|Zed?0^YBEY`f`3bT^flw zSY!+Uj;JTqZFglWo`?q_?Y|&Y-WH(A&!=kf-Sd3UY*s zu2%rywHrO-5c7vb=oY-gd^bm5c2m1~X+1&Z00=Z`d%jsJ9@(91C#R7=Gg~Jq-!3+7 zLvQGIxA}0(>$4?{?njP5GXe~+U7Ypn-8(?^&w>Q_RQtay^ATTSFuUGzKg<> zG@k_N^&o%4H|n6|=B&BlY#x27#7TnY6NqU-Kh!Vm;@CqJTX|v#ymad8nN|bgT&Y_T8hw$(=*?Z-H^?4IysY zzo?z7U2D15GTv}L=|P5^n_)o2e&O{6?PDJRzt?}}G?#h^EWofuLg{;X`uk-R^&AR*0pj^~9Z{hyag#=V+49%Ng4sWVP!i%U#i}(Sz&ZJ+{avI@XPjZ|ulj(Z zShTCsdFVgPMoGpwY=QtKH_&`Ub4u8f0SvS`vc3OC`17QPR7PGkc&NIOs-wl6pE_Rbv zZkf47GwU70PF3sg{@tpb!lt;v!|0PCNP9mdurz_6p2PKkC_kJ4MlrvFTwdFr#DVoBi78oJ6~Ciwz{|O=z708(B-y>Tsp@5yMy>fUc8nZyyRunzfJW9(5vh91c0 zN|I5r>yxps*6y zKqMZ1)wrPr0Dvg{>$V+yCCC8;fV+iqz(0kl|Cm$$Xy*S#7yy0%0MwtWdBB~-D`gO% z#VoJyt?@5Y`u}P9|JUyY0M3&5kKdmLf$U%n3CjPe z#Tp1kmZ17O`^N~82Lz9bQ~Zy085mnmfB=L*1N=|;0T}yFF%*bcd(!{n{}5R7B>xT` z0Iy1NeE#c&{+H?sCYGZ8J9OaR)X6`=4F8f^6ac`+#M$7lD1xst|7q~Q73=()a0CA@ zpFb?xKX2t^;_Pf;Yv%NC&wu*zUxXawKa8AzODE1Beh$UoJ!ezrr}$@70d!CR0Q$en R0ImeVB+`^Hrow-r{||~k9`pbJ diff --git a/Scenes/Characters/Player/player.tscn b/Scenes/Characters/Player/player.tscn index 7148879..09c9fef 100644 --- a/Scenes/Characters/Player/player.tscn +++ b/Scenes/Characters/Player/player.tscn @@ -13,6 +13,7 @@ [ext_resource type="Script" uid="uid://cd2ewadcm8oi5" path="res://Scripts/Characters/Player/States/firing_arrow_state.gd" id="8_plevq"] [ext_resource type="Script" uid="uid://bx1a35al4yiej" path="res://Scripts/Characters/Player/States/sitting_state.gd" id="9_sdxbo"] [ext_resource type="Script" uid="uid://bnontuqj3cnom" path="res://Scripts/Characters/Player/States/cutscene_state.gd" id="10_p06rw"] +[ext_resource type="Script" uid="uid://wfdtd3xlgrvm" path="res://Scripts/Characters/Player/States/play_animation_state.gd" id="12_aencf"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_apx8m"] size = Vector2(10, 5) @@ -23,9 +24,11 @@ radius = 12.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_fu1fx"] size = Vector2(6, 5) -[node name="Player" type="CharacterBody2D" unique_id=1502234578 groups=["Player Group"]] +[node name="Player" type="CharacterBody2D" unique_id=1502234578 node_paths=PackedStringArray("player_sprite", "state_machine") groups=["Player Group"]] y_sort_enabled = true script = ExtResource("1_qqvsf") +player_sprite = NodePath("Player Sprite") +state_machine = NodePath("State Machine") [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=495465356] position = Vector2(0, 4.5) @@ -36,53 +39,57 @@ shape = SubResource("RectangleShape2D_apx8m") [node name="FacingDirectionComponent" type="Node" parent="Components" unique_id=408127032] script = ExtResource("1_siygm") -[node name="StateMachine" parent="." unique_id=732559774 node_paths=PackedStringArray("states_container", "current_state") instance=ExtResource("1_lyjr2")] +[node name="MovementComponent" type="Node" parent="Components" unique_id=1773880772 node_paths=PackedStringArray("body")] +script = ExtResource("4_apx8m") +body = NodePath("../..") + +[node name="State Machine" parent="." unique_id=732559774 node_paths=PackedStringArray("states_container", "current_state") instance=ExtResource("1_lyjr2")] states_container = NodePath("States") current_state = NodePath("States/Idle State") -[node name="States" type="Node" parent="StateMachine" unique_id=1171587216] +[node name="States" type="Node" parent="State Machine" unique_id=1171587216] -[node name="Idle State" type="Node" parent="StateMachine/States" unique_id=2017409248 node_paths=PackedStringArray("movement_component", "state_machine")] +[node name="Idle State" type="Node" parent="State Machine/States" unique_id=2017409248 node_paths=PackedStringArray("movement_component", "state_machine")] script = ExtResource("4_dxcao") -movement_component = NodePath("../../../MovementComponent") +movement_component = NodePath("../../../Components/MovementComponent") state_machine = NodePath("../..") -[node name="Walking State" type="Node" parent="StateMachine/States" unique_id=1661048365 node_paths=PackedStringArray("movement_component", "direction_component", "body", "state_machine")] +[node name="Walking State" type="Node" parent="State Machine/States" unique_id=1661048365 node_paths=PackedStringArray("movement_component", "direction_component", "body", "state_machine")] script = ExtResource("5_cscr0") -movement_component = NodePath("../../../MovementComponent") +movement_component = NodePath("../../../Components/MovementComponent") direction_component = NodePath("../../../Components/FacingDirectionComponent") body = NodePath("../../..") state_machine = NodePath("../..") -[node name="Using Item A State" type="Node" parent="StateMachine/States" unique_id=1017153142 node_paths=PackedStringArray("body", "direction_component", "state_machine")] +[node name="Using Item A State" type="Node" parent="State Machine/States" unique_id=1017153142 node_paths=PackedStringArray("body", "direction_component", "state_machine")] script = ExtResource("5_1mdwi") body = NodePath("../../..") direction_component = NodePath("../../../Components/FacingDirectionComponent") state_machine = NodePath("../..") -[node name="Drawing Bow State" type="Node" parent="StateMachine/States" unique_id=317681716 node_paths=PackedStringArray("movement_componenent", "body", "state_machine")] +[node name="Drawing Bow State" type="Node" parent="State Machine/States" unique_id=317681716 node_paths=PackedStringArray("movement_componenent", "body", "state_machine")] script = ExtResource("7_cscr0") -movement_componenent = NodePath("../../../MovementComponent") +movement_componenent = NodePath("../../../Components/MovementComponent") body = NodePath("../../..") state_machine = NodePath("../..") -[node name="Firing Arrow State" type="Node" parent="StateMachine/States" unique_id=2129772816 node_paths=PackedStringArray("direction_component", "arrow_spawn_marker", "state_machine")] +[node name="Firing Arrow State" type="Node" parent="State Machine/States" unique_id=2129772816 node_paths=PackedStringArray("direction_component", "arrow_spawn_marker", "state_machine")] script = ExtResource("8_plevq") direction_component = NodePath("../../../Components/FacingDirectionComponent") arrow_spawn_marker = NodePath("../../../Marker2D") state_machine = NodePath("../..") -[node name="Sitting State" type="Node" parent="StateMachine/States" unique_id=1774602333 node_paths=PackedStringArray("state_machine")] +[node name="Sitting State" type="Node" parent="State Machine/States" unique_id=1774602333 node_paths=PackedStringArray("state_machine")] script = ExtResource("9_sdxbo") state_machine = NodePath("../..") -[node name="Cutscene State" type="Node" parent="StateMachine/States" unique_id=1722986400 node_paths=PackedStringArray("state_machine")] +[node name="Cutscene State" type="Node" parent="State Machine/States" unique_id=1722986400 node_paths=PackedStringArray("state_machine")] script = ExtResource("10_p06rw") state_machine = NodePath("../..") -[node name="MovementComponent" type="Node" parent="." unique_id=1773880772 node_paths=PackedStringArray("body")] -script = ExtResource("4_apx8m") -body = NodePath("..") +[node name="Play Animation State" type="Node" parent="State Machine/States" unique_id=1357816619 node_paths=PackedStringArray("state_machine")] +script = ExtResource("12_aencf") +state_machine = NodePath("../..") [node name="Occlusion Culling Area" type="Area2D" parent="." unique_id=1195961806] collision_layer = 8 @@ -92,7 +99,7 @@ collision_mask = 0 shape = SubResource("CircleShape2D_plevq") [node name="Player Sprite" parent="." unique_id=1169131604 node_paths=PackedStringArray("state_machine", "direction_component") instance=ExtResource("1_27cb7")] -state_machine = NodePath("../StateMachine") +state_machine = NodePath("../State Machine") direction_component = NodePath("../Components/FacingDirectionComponent") [node name="Marker2D" type="Marker2D" parent="." unique_id=2003544808] @@ -109,17 +116,20 @@ position = Vector2(0, 9.5) shape = SubResource("RectangleShape2D_fu1fx") debug_color = Color(0.79959095, 0.41617078, 0.18507844, 0.41960785) -[connection signal="CutsceneEnded" from="." to="StateMachine/States/Cutscene State" method="OnCutsceneEnded"] -[connection signal="CutsceneStarted" from="." to="StateMachine/States/Idle State" method="OnCutsceneStarted"] -[connection signal="SitOnFurnitureTriggered" from="." to="StateMachine/States/Idle State" method="OnSitOnFurnitureTriggered"] +[connection signal="CutsceneEnded" from="." to="State Machine/States/Cutscene State" method="OnCutsceneEnded"] +[connection signal="CutsceneStarted" from="." to="State Machine/States/Idle State" method="OnCutsceneStarted"] +[connection signal="SitOnFurnitureTriggered" from="." to="State Machine/States/Idle State" method="OnSitOnFurnitureTriggered"] [connection signal="DirectionChanged" from="Components/FacingDirectionComponent" to="Player Sprite" method="UpdateSprite"] [connection signal="DirectionChanged" from="Components/FacingDirectionComponent" to="Marker2D/InteractScanner" method="OnDirectionChanged"] -[connection signal="PlayerBecameIdle" from="StateMachine/States/Idle State" to="Player Sprite" method="UpdateSprite"] -[connection signal="PlayerBeganDrawingBow" from="StateMachine/States/Drawing Bow State" to="Player Sprite" method="UpdateSprite"] -[connection signal="PlayerBeganFiringArrow" from="StateMachine/States/Firing Arrow State" to="Player Sprite" method="UpdateSprite"] -[connection signal="PlayerFiredArrow" from="StateMachine/States/Firing Arrow State" to="." method="_on_using_item_a_state_arrow_fired"] -[connection signal="DrawingBowAnimationFinished" from="Player Sprite" to="StateMachine/States/Drawing Bow State" method="OnDrawingBowAnimationFinished"] -[connection signal="FiringArrowAnimationFinished" from="Player Sprite" to="StateMachine/States/Firing Arrow State" method="OnFiringArrowAnimationFinished"] +[connection signal="PlayerBecameIdle" from="State Machine/States/Idle State" to="Player Sprite" method="UpdateSprite"] +[connection signal="StartedWalking" from="State Machine/States/Walking State" to="Player Sprite" method="UpdateSprite"] +[connection signal="PlayerBeganDrawingBow" from="State Machine/States/Drawing Bow State" to="Player Sprite" method="UpdateSprite"] +[connection signal="PlayerBeganFiringArrow" from="State Machine/States/Firing Arrow State" to="Player Sprite" method="UpdateSprite"] +[connection signal="PlayerFiredArrow" from="State Machine/States/Firing Arrow State" to="." method="_on_using_item_a_state_arrow_fired"] +[connection signal="PlayAnimation" from="State Machine/States/Play Animation State" to="Player Sprite" method="PlaySpecifiedAnimation"] +[connection signal="AnimationFinished" from="Player Sprite" to="State Machine/States/Play Animation State" method="OnAnimationFinished"] +[connection signal="DrawingBowAnimationFinished" from="Player Sprite" to="State Machine/States/Drawing Bow State" method="OnDrawingBowAnimationFinished"] +[connection signal="FiringArrowAnimationFinished" from="Player Sprite" to="State Machine/States/Firing Arrow State" method="OnFiringArrowAnimationFinished"] [connection signal="InteractionActionTriggered" from="Marker2D/InteractScanner" to="." method="_on_interaction_action_triggered"] [connection signal="area_entered" from="Marker2D/InteractScanner" to="." method="_on_interact_scanner_area_entered"] [connection signal="area_exited" from="Marker2D/InteractScanner" to="." method="_on_interact_scanner_area_exited"] diff --git a/Scenes/Characters/Player/sprite.tscn b/Scenes/Characters/Player/sprite.tscn index e6a9855..d303a7a 100644 --- a/Scenes/Characters/Player/sprite.tscn +++ b/Scenes/Characters/Player/sprite.tscn @@ -153,6 +153,26 @@ region = Rect2(256, 128, 64, 64) atlas = ExtResource("2_ndjja") region = Rect2(320, 128, 64, 64) +[sub_resource type="AtlasTexture" id="AtlasTexture_e1olu"] +atlas = ExtResource("2_ndjja") +region = Rect2(0, 1280, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jmdrl"] +atlas = ExtResource("2_ndjja") +region = Rect2(64, 1280, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wk3mk"] +atlas = ExtResource("2_ndjja") +region = Rect2(128, 1280, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8mpdo"] +atlas = ExtResource("2_ndjja") +region = Rect2(192, 1280, 64, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_46inv"] +atlas = ExtResource("2_ndjja") +region = Rect2(256, 1280, 64, 64) + [sub_resource type="AtlasTexture" id="AtlasTexture_s6rq5"] atlas = ExtResource("2_ndjja") region = Rect2(0, 192, 64, 64) @@ -382,6 +402,26 @@ animations = [{ }, { "frames": [{ "duration": 1.0, +"texture": SubResource("AtlasTexture_e1olu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jmdrl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wk3mk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8mpdo") +}, { +"duration": 8.0, +"texture": SubResource("AtlasTexture_46inv") +}], +"loop": false, +"name": &"opening-chest-down", +"speed": 8.0 +}, { +"frames": [{ +"duration": 1.0, "texture": SubResource("AtlasTexture_s6rq5") }, { "duration": 1.0, @@ -1655,7 +1695,7 @@ script = ExtResource("1_jqxwg") [node name="Full" type="AnimatedSprite2D" parent="." unique_id=1296959783] position = Vector2(0, 7) sprite_frames = SubResource("SpriteFrames_jqxwg") -animation = &"idle-down" +animation = &"opening-chest-down" autoplay = "idle-down" offset = Vector2(0, -7) diff --git a/Scenes/Debug/under_construction_block.tscn b/Scenes/Debug/under_construction_block.tscn new file mode 100644 index 0000000..ec3d63f --- /dev/null +++ b/Scenes/Debug/under_construction_block.tscn @@ -0,0 +1,17 @@ +[gd_scene format=3 uid="uid://c7rjjlamkqhnw"] + +[ext_resource type="Texture2D" uid="uid://2euqjppqk8s5" path="res://Assets/Sprites/Under Construction.png" id="1_acm7k"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_wcsxr"] +size = Vector2(16, 16) + +[node name="Under Construction Block" type="StaticBody2D" unique_id=390553492] +texture_repeat = 2 +collision_mask = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=64334173] +shape = SubResource("RectangleShape2D_wcsxr") + +[node name="Sprite2D" type="Sprite2D" parent="." unique_id=291414072] +texture_repeat = 2 +texture = ExtResource("1_acm7k") diff --git a/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn b/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn index 9be4402..3c48ed9 100644 --- a/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn +++ b/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn @@ -14,6 +14,9 @@ [sub_resource type="RectangleShape2D" id="RectangleShape2D_7kg22"] size = Vector2(32, 8) +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ec540"] +size = Vector2(11, 18) + [sub_resource type="AtlasTexture" id="AtlasTexture_a58cd"] atlas = ExtResource("6_x3y8m") region = Rect2(0, 0, 64, 64) @@ -64,6 +67,9 @@ animations = [{ "speed": 5.0 }] +[sub_resource type="RectangleShape2D" id="RectangleShape2D_6xfm6"] +size = Vector2(11, 14) + [node name="Home 01" type="Node2D" unique_id=1401818514] y_sort_enabled = true @@ -127,10 +133,22 @@ position = Vector2(80, 175) [node name="CharacterBody2D" type="CharacterBody2D" parent="NPCs" unique_id=1487693855] position = Vector2(93, 85) +[node name="CollisionShape2D" type="CollisionShape2D" parent="NPCs/CharacterBody2D" unique_id=542589948] +position = Vector2(-0.5, -2) +shape = SubResource("RectangleShape2D_ec540") + [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="NPCs/CharacterBody2D" unique_id=1921427945] sprite_frames = SubResource("SpriteFrames_qunaf") autoplay = "default" +[node name="Dialogue Trigger" parent="NPCs/CharacterBody2D" unique_id=661667742 instance=ExtResource("5_msu6a")] +dialogue_name = "MSG_BLACKSMITH" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="NPCs/CharacterBody2D/Dialogue Trigger" unique_id=2044300734] +position = Vector2(-0.5, -4) +shape = SubResource("RectangleShape2D_6xfm6") +debug_color = Color(0.7930861, 0.42714188, 7.70092e-07, 0.41960785) + [node name="Camera2D" type="Camera2D" parent="." unique_id=2134984506] position = Vector2(127, 110) zoom = Vector2(3, 3) diff --git a/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn b/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn index d83bf73..e1f1cb2 100644 --- a/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn +++ b/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn @@ -25,6 +25,7 @@ [ext_resource type="PackedScene" uid="uid://coaf2ndwb6h61" path="res://Scenes/Objects/Decorative/Signs/wooden_sign_02.tscn" id="19_jtncl"] [ext_resource type="PackedScene" uid="uid://cla2d3gii8qda" path="res://Scenes/Objects/Loading Zone/interactive_loading_zone.tscn" id="20_c5vrl"] [ext_resource type="PackedScene" uid="uid://b60nr4wfvijpf" path="res://Scenes/Objects/Dialogue/dialogue_trigger.tscn" id="20_x6da4"] +[ext_resource type="PackedScene" uid="uid://c7rjjlamkqhnw" path="res://Scenes/Debug/under_construction_block.tscn" id="26_4lnhp"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_lwurn"] size = Vector2(768, 494) @@ -336,13 +337,51 @@ destination_marker_name = "Entrance" position = Vector2(278, 474) [node name="Player" parent="." unique_id=1502234578 instance=ExtResource("4_4igim")] -position = Vector2(207, 481) +position = Vector2(656, 488) [node name="Camera2D" type="Camera2D" parent="Player" unique_id=1115720225] position = Vector2(0, 1) zoom = Vector2(3, 3) position_smoothing_enabled = true +[node name="Debug" type="Node2D" parent="." unique_id=1186828407] + +[node name="Under Construction Block" parent="Debug" unique_id=390553492 instance=ExtResource("26_4lnhp")] +position = Vector2(51, 648) + +[node name="Under Construction Block2" parent="Debug" unique_id=1351690442 instance=ExtResource("26_4lnhp")] +position = Vector2(67, 648) + +[node name="Under Construction Block3" parent="Debug" unique_id=1745219253 instance=ExtResource("26_4lnhp")] +position = Vector2(83, 648) + +[node name="Under Construction Block4" parent="Debug" unique_id=1747088705 instance=ExtResource("26_4lnhp")] +position = Vector2(99, 648) + +[node name="Under Construction Block5" parent="Debug" unique_id=647551373 instance=ExtResource("26_4lnhp")] +position = Vector2(99, 648) + +[node name="Under Construction Block6" parent="Debug" unique_id=1848435737 instance=ExtResource("26_4lnhp")] +position = Vector2(115, 648) + +[node name="Under Construction Block7" parent="Debug" unique_id=1030022743 instance=ExtResource("26_4lnhp")] +position = Vector2(131, 648) + +[node name="Under Construction Block8" parent="Debug" unique_id=936966717 instance=ExtResource("26_4lnhp")] +position = Vector2(147, 648) + +[node name="Under Construction Block9" parent="Debug" unique_id=1242991407 instance=ExtResource("26_4lnhp")] +position = Vector2(760, 280) + +[node name="Under Construction Block10" parent="Debug" unique_id=341914637 instance=ExtResource("26_4lnhp")] +position = Vector2(760, 296) + +[node name="Under Construction Block11" parent="Debug" unique_id=92502654 instance=ExtResource("26_4lnhp")] +position = Vector2(760, 312) + +[node name="Under Construction Block12" parent="Debug" unique_id=1005752992 instance=ExtResource("26_4lnhp")] +position = Vector2(760, 328) + [connection signal="SitOnBenchTriggered" from="Connectors/Bench Interaction Connector" to="Player" method="OnSitOnFurnitureTriggered"] [connection signal="TargetHit" from="Objects/ArrowTarget" to="Objects/Spike Gate" method="OpenGate"] [connection signal="TargetHit" from="Objects/ArrowTarget" to="Objects/Spike Gate2" method="OpenGate"] diff --git a/Scripts/Characters/Player/States/play_animation_state.gd b/Scripts/Characters/Player/States/play_animation_state.gd new file mode 100644 index 0000000..cd474dd --- /dev/null +++ b/Scripts/Characters/Player/States/play_animation_state.gd @@ -0,0 +1,30 @@ +extends BaseState +class_name PlayerPlayAnimationState + +signal PlayAnimation(animation_name: String) +signal AnimationFinished(animation_name: String) + +var current_animation_name: String + +# Public Methods +func GetAnimationBaseName() -> String: + return "idle" + + +func GetStateEnum() -> PlayerStateMachine.States: + return PlayerStateMachine.States.PLAY_ANIMATION + + +func Enter(_extra_parameters: Dictionary) -> void: + current_animation_name = _extra_parameters["animation_name"] + print("Playing Player Animation State: [%s]" % current_animation_name) + PlayAnimation.emit(current_animation_name) + + +func Exit() -> void: + current_animation_name = '' + + +func OnAnimationFinished(animation_name: String) -> void: + if animation_name != current_animation_name: return + AnimationFinished.emit(animation_name) diff --git a/Scripts/Characters/Player/States/play_animation_state.gd.uid b/Scripts/Characters/Player/States/play_animation_state.gd.uid new file mode 100644 index 0000000..eada39d --- /dev/null +++ b/Scripts/Characters/Player/States/play_animation_state.gd.uid @@ -0,0 +1 @@ +uid://wfdtd3xlgrvm diff --git a/Scripts/Characters/Player/States/walking_state.gd b/Scripts/Characters/Player/States/walking_state.gd index 88c761b..9b51991 100644 --- a/Scripts/Characters/Player/States/walking_state.gd +++ b/Scripts/Characters/Player/States/walking_state.gd @@ -1,7 +1,8 @@ extends BaseState -@export var walking_speed := 100 +signal StartedWalking +@export var walking_speed := 100 @export var movement_component: MovementComponent @export var direction_component: FacingDirectionComponent @export var body: CharacterBody2D @@ -10,6 +11,10 @@ func GetStateEnum() -> PlayerStateMachine.States: return PlayerStateMachine.States.WALKING +func Enter(_extra_parameters: Dictionary) -> void: + StartedWalking.emit() + + func Update(_delta: float) -> void: if movement_component.movement_vector == Vector2.ZERO: state_machine.QueueStateChange(PlayerStateMachine.States.IDLE) diff --git a/Scripts/Characters/Player/player.gd b/Scripts/Characters/Player/player.gd index c598f5b..8b1effb 100644 --- a/Scripts/Characters/Player/player.gd +++ b/Scripts/Characters/Player/player.gd @@ -15,7 +15,8 @@ signal SitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enu signal CutsceneStarted() signal CutsceneEnded() -@onready var state_machine: PlayerStateMachine = $StateMachine +@export var player_sprite: Node2D +@export var state_machine: PlayerStateMachine # Public Methods func OnSitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enums.Directions): diff --git a/Scripts/Characters/Player/sprite.gd b/Scripts/Characters/Player/sprite.gd index cbb7915..df5e006 100644 --- a/Scripts/Characters/Player/sprite.gd +++ b/Scripts/Characters/Player/sprite.gd @@ -2,6 +2,7 @@ extends Node2D signal DrawingBowAnimationFinished signal FiringArrowAnimationFinished +signal AnimationFinished(animation_name: String) @export var state_machine: PlayerStateMachine @export var direction_component: FacingDirectionComponent @@ -41,6 +42,14 @@ func OnAnimationFinished() -> void: DrawingBowAnimationFinished.emit() elif current_animation.begins_with("firing-arrow-"): FiringArrowAnimationFinished.emit() + AnimationFinished.emit(current_animation) + + +func PlaySpecifiedAnimation(animation_name: String) -> void: + current_animation = animation_name + for part in all_parts: + part.animation = animation_name + part.play() # Called when the node enters the scene tree for the first time. diff --git a/Scripts/Characters/Player/state_machine.gd b/Scripts/Characters/Player/state_machine.gd index 446a1ba..6612bf7 100644 --- a/Scripts/Characters/Player/state_machine.gd +++ b/Scripts/Characters/Player/state_machine.gd @@ -1,9 +1,11 @@ extends Node class_name PlayerStateMachine +signal StateChanged + enum States { UNSET, IDLE, WALKING, USING_ITEM_A, DRAWING_BOW, FIRING_ARROW, - SITTING, CUTSCENE + SITTING, CUTSCENE, PLAY_ANIMATION } @export var states_container: Node @@ -36,7 +38,6 @@ func _ready() -> void: current_state.Enter({}) -# Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: if current_state: current_state.Update(delta) @@ -53,3 +54,5 @@ func _swap_state() -> void: current_state.Enter(queued_parameters) queued_state = PlayerStateMachine.States.UNSET queued_parameters = {} + + StateChanged.emit() diff --git a/Scripts/Maps/Connectors/chest_interaction_connector.gd b/Scripts/Maps/Connectors/chest_interaction_connector.gd index ff22c84..afdbea9 100644 --- a/Scripts/Maps/Connectors/chest_interaction_connector.gd +++ b/Scripts/Maps/Connectors/chest_interaction_connector.gd @@ -41,13 +41,40 @@ func OnPlayerInteractionActionTriggered() -> void: # Private Methods func _ready() -> void: - var all_players := get_tree().get_nodes_in_group("Player Group") - if all_players == null or all_players.is_empty(): + var player := GroupUtils.GetPlayer() + if player == null: return - for player_node in all_players: - var player := player_node as PlayerCharacter - - player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered) - player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited) - player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered) + player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered) + player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited) + player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered) + + var chests := GroupUtils.GetAllTreasureChests() + for chest in chests: + chest.OpeningAnimationStarted.connect(_on_chest_opening_animation_started) + + +func _on_chest_opening_animation_started() -> void: + var player := GroupUtils.GetPlayer() + var children := player.get_children() + + player.OnCutsceneStarted() + + var camera_idx := children.find_custom(func(x): return x is Camera2D) + if camera_idx == -1: return + + # Zoom In + var camera := children[camera_idx] as Camera2D + var current_zoom := camera.zoom + await get_tree().create_tween().tween_property(camera, "zoom", current_zoom + Vector2(2, 2), 0.5).finished + + # Player the player's chest opening animation + player.state_machine.QueueStateChange(PlayerStateMachine.States.PLAY_ANIMATION, { "animation_name": "opening-chest-down" }) + await player.state_machine.StateChanged + var play_animation_state := player.state_machine.current_state as PlayerPlayAnimationState + await play_animation_state.AnimationFinished + player.state_machine.QueueStateChange(PlayerStateMachine.States.IDLE) + + # Zoom back out + await get_tree().create_tween().tween_property(camera, "zoom", current_zoom, 0.5).finished + diff --git a/Scripts/Objects/Chests/Bases/chest_base.gd b/Scripts/Objects/Chests/Bases/chest_base.gd index 5f79b26..215736d 100644 --- a/Scripts/Objects/Chests/Bases/chest_base.gd +++ b/Scripts/Objects/Chests/Bases/chest_base.gd @@ -1,6 +1,8 @@ extends StaticBody2D class_name BaseChest +signal OpeningAnimationStarted + @export var is_open := false # Public Methods diff --git a/Scripts/Objects/Chests/item_chest_01.gd b/Scripts/Objects/Chests/item_chest_01.gd index ac73cc8..48a8e6d 100644 --- a/Scripts/Objects/Chests/item_chest_01.gd +++ b/Scripts/Objects/Chests/item_chest_01.gd @@ -14,6 +14,8 @@ func Open() -> void: return super.Open() + + OpeningAnimationStarted.emit() chest_01_sprite.play("opening") var item_name: String = Enums.Items.keys()[item_id] diff --git a/Scripts/UI/dialogue_box.gd b/Scripts/UI/dialogue_box.gd index 8aac70b..25f1ae5 100644 --- a/Scripts/UI/dialogue_box.gd +++ b/Scripts/UI/dialogue_box.gd @@ -6,17 +6,41 @@ signal DialogueEnded @onready var label: Label = $ColorRect/MarginContainer/Label +var _dialogue_arr: PackedStringArray +var _dialogue_idx := 0 +var _dialogue_count := 0 + # Public Methods func OnDialogueTriggered(dialogue_name: String) -> void: - label.text = tr(dialogue_name) + var text_arr := tr(dialogue_name).split("") + _init_dialogue_box(text_arr) visible = true DialogueStarted.emit() +# Private Methods +func _init_dialogue_box(text_arr: PackedStringArray) -> void: + _dialogue_arr = text_arr + _dialogue_idx = 0 + _dialogue_count = len(text_arr) + + label.text = _dialogue_arr[_dialogue_idx] + + +func _proceed_dialogue() -> bool: # Returns true if no more dialogue + _dialogue_idx += 1 + if _dialogue_idx == _dialogue_count: + return true + label.text = _dialogue_arr[_dialogue_idx] + return false + + func _process(_delta: float) -> void: if !visible: return if Input.is_action_just_pressed("player_interact") and !InputManager.ShouldIgnoreAction("player_interact"): - visible = false - DialogueEnded.emit() + var finished := _proceed_dialogue() + if finished: + visible = false + DialogueEnded.emit() diff --git a/project.godot b/project.godot index 278441e..906935b 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Archipelago Game" -config/version="beta-1.0" +config/version="beta-1.1" run/main_scene="uid://dqgxg3i307lvr" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg"