From 0d751a749f41c3eee7eb7eec3551cf3d218a78d5 Mon Sep 17 00:00:00 2001 From: Miguel Angel Astor Romero Date: Fri, 17 Oct 2014 15:04:24 -0430 Subject: [PATCH] Started programming the ingame state. --- android/AndroidManifest.xml | 2 +- android/res/drawable-hdpi/roselia.png | Bin 0 -> 3979 bytes android/res/drawable-mdpi/roselia.png | Bin 0 -> 2259 bytes android/res/drawable-xhdpi/roselia.png | Bin 0 -> 5636 bytes android/res/drawable-xxhdpi/roselia.png | Bin 0 -> 9775 bytes android/roselia-web.png | Bin 0 -> 53235 bytes .../gamejolt/mikykr5/poukemon/GameCore.java | 3 +- .../mikykr5/poukemon/ProjectConstants.java | 2 +- .../poukemon/ecs/components/Mappers.java | 24 ++++ .../ecs/components/PositionComponent.java | 30 +++++ .../ecs/components/SoundEffectComponent.java | 28 +++++ .../ecs/components/SpriteComponent.java | 38 ++++++ .../ecs/components/TextureComponent.java | 27 ++++ .../ecs/entities/EntityInitializerBase.java | 24 ++++ .../entities/PoukemonEntityInitializer.java | 85 +++++++++++++ .../mikykr5/poukemon/states/BaseState.java | 17 ++- .../mikykr5/poukemon/states/InGameState.java | 116 +++++++++++++++++- .../poukemon/states/MainMenuState.java | 6 +- .../poukemon/utils/AsyncAssetLoader.java | 15 ++- 19 files changed, 402 insertions(+), 15 deletions(-) create mode 100644 android/res/drawable-hdpi/roselia.png create mode 100644 android/res/drawable-mdpi/roselia.png create mode 100644 android/res/drawable-xhdpi/roselia.png create mode 100644 android/res/drawable-xxhdpi/roselia.png create mode 100644 android/roselia-web.png create mode 100644 core/src/com/gamejolt/mikykr5/poukemon/ecs/components/Mappers.java create mode 100644 core/src/com/gamejolt/mikykr5/poukemon/ecs/components/PositionComponent.java create mode 100644 core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SoundEffectComponent.java create mode 100644 core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SpriteComponent.java create mode 100644 core/src/com/gamejolt/mikykr5/poukemon/ecs/components/TextureComponent.java create mode 100644 core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/EntityInitializerBase.java create mode 100644 core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/PoukemonEntityInitializer.java diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 71c98c5..b9a29bc 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -8,7 +8,7 @@ Zf}uzWi^bBbtE>An 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 S0sT7!gHx1KlWhQ-L;nv;xu!1w literal 0 HcmV?d00001 diff --git a/android/roselia-web.png b/android/roselia-web.png new file mode 100644 index 0000000000000000000000000000000000000000..11af0d591f0678f972ff4007982b668a599add42 GIT binary patch literal 53235 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 z

s-jbm!}iI^(1sM>t{5bAD&b4lR&dL54YS?AYFcxS<_OKVdIJ_=;dkh*i5NNRbj!=jIdX5(T zJ4&@uXCm-$bCYFjWyPwQ33^JGTEAM9VhLac+~yM>osNZdb*h@BjS)x}b=D5|_&@J) za&o5c#7F(2!kUn9Jb-J=3ldhkSRo&W4(rN_EHVu;>PQ>FTXJ(8nNc^@W#^jzE}$`? z*fh`c4co6?PxxW*nYN-ouK;|aK|R@t18OOf+wD`KyNYHcvJ>OtJ~;bu(f~BICfys! z-X@Lyq-smh-rdJY&R0@a?wQhgY$ENI5m|K+@|qo|JDbfROmBUM7ES`W9<;3Imvz9E z)YM!=dHoYyd@J}12>J_U(xET5Bt6d1ADc&fLbdP1yT8O+6v`h<@>g^%BbJSqspBvY zOAy>6$B`rX7kRfPgjic!`+VX^XD)d%F)}jJ0rvy9Z9Qz(-S$2AI0^?lPf=CNcAu}* z0Md!vS=SGO!U($5<12{XK0f}faG~3xWfV^*5fI$ca(7={U46E(t#Pr{{go0KDX`o3 z!D@YNt!Fp_(cRS!bG{IE{>_B8z$Xm+cb0Er zRN?e?m^!&@eoMvqf4h~+Nj8E0Cm~#b| z)?4V_<`eQPqg=*~U2zK&(x&MH#4!Uq0UO*dox(j}xDQG*-JcLftE4oy3lU^v1JCXb zM#SVcdjM~arp(~-$fmr!+{W46-F_!vQ5Eh=e){@#V)J}*bksUEC`bzFf##z#%u&$o zNO7>npbhH#BM+`y?cuhn6Xc(xDRXe?quE=U?J7)z8%+c^fGDCpqy_Tgd(mxO7H3CC zN_yXzs%b%2b(;6#I*o0o9s^4^hM`y78KMSFI+H$c$}j2zhR@E<;wc>Yq0@_rZH{hk zzQjYxtl=z($zOD5xa$LCCSCt$c`|sWW@9jA2}3ka84$T?c={sG2FF!dp*ZU2ZP)4ODfN^$Q?M*1g>8qJy-8-wA7v4puU&d9;|ug#8}aW-gS zOhbz~2`p2lar@&+a7=?tGI9(a-O2}mu^X}S-i-})qG7N9bL($3@8;Il>3z4^&5W8F zE@$OkBS*0C^G1i;tF(iW8|dj95D0r06%|$IBJ!+qX;#eMUo|i*ln`H;VeoITk!hS# z;Z@FrC+LreYe5Sa4P3G@8dg+Pe0Kq~Z|=H5Kbj3YsR%w!6i1sNgTMU=my2*iCw8Bey`;EL$Z zbn<#brC;D^fpo-aN6sc$Y(BQT*-@(CSj`=>0UMLqD+tQH0(aKXoSZJo^!4>C^8%i1 zeIyaNYD~VM@xQ&`&PEc)n@f7$g=xQb@~Da@S!;OKyS0 zREpaF_x*{puJm`n{T6%pNtSEAizA^|9HV%wug22$(&?Y3UoMn%wA;dhuJUKjXrHBb zP~lcj(_&<*X4ovqop}O;7j}b}*DSAlk&V=mk*+PRrmx=_pLd(~%?ZoI&N=U;=?|Y- z(r{vbd<|0I{U^t_9NvpbW1g?%G&J4zFHd(xj$2(PwUrmSZk%h7e?s3q(U}5Y1h7n( zTfHO4osp3SrC-1F)=8(CB&=^7XcIIjbgxSZMq&K z6!I5fAJCI<2&-Zn4QgE^aCdR}Q~URVlb_#H-~wA#*+98?JB7%3PZ(}BOnyuJ(=xwg ziQ@ApO;3p5>s^)q-qgZE8aI&Dd?c14V*}|1jWl(U=zW-k66>(azu&6>hAlmxY#KnU zw|!hZaWcV`)SIdIz>CvU=mp#s0>V+2_At`>UlPk#e%AvsUd!LfffH#w4}YZEy|2v4 zm3KNhAty=!ZkST zIii1VB?b*Ds*^owjVl@8U+%07hmp4)fc6&i=^8U_JhQ)lhxO+oFF`!G*tQu{-w~RN zX%LT*Z#fA2Xs|dSFW>e1gaxCgxa+aek)BtH(e2X_Z4GA1ISGF?KLwsi-0P{VFELabtC5c8(Nb{iHO;sYJK1~8}bf#Gn0Ht!KZ;^FsI|!FCtvxr?Qlk zrJRF<12-utDJB!|-LNj>LI6)AZ*MLCXsqwQTatfH7qR50&+3k>nNJ&SI6YIbn#T0z)#QzwJA=2F)oyq2)KkxTuVTu6te~K)i_Hb^QKdiC_X)&0{Wset29e zV4yGG>n$d&9a>;KGPI`^xs~nnU@SfmZWVlMqEL;kD3a9BA^8gzwGt7bq0l@K=y@3~ zFxsfa{o0K}=|x0Dg7O~mbH8oddHX&riIO+*Qi~#SNixr$+y=m>18{n3YBPEcU8{EG z`r7p$oZ~9}7jldd_3Emi`3+X*TS{S5_vqoONK^-DIHlNfK6<&C`rcgV*8*~P$|i9}x(PFOsyq54|pJC9Kmk0QO=B8WehjSLikdP1{+aHhbgGb=Tr_ZEbF{|nN*g8xY zUVc2jzRylbh=_5mEiG?kX$31{-PB2S_4QlVuVU^z=u1{{_;Wc!)_aYRoq(MP0e6q2 z-ry!B=SKmeh*+fAt^T(`N*i}h#>CT}FsXO^^=I>aOUS2wdW?WjuD~u-z=PPHJ!Xm! zpy=~YOmMc$c!PyTxTYnDl^As|St@rd(bTspPyUZHwqmx}H;|vS#piQd1C{sh@=jlP zoWFJFm5{8-qP0Ktc@9NZOsu*~%l^ZiZxcf?CwlK$Z8jMG5<{+Y6AgQfGl@%-M|Q%Q zq2fD$$5>FtVIc&SLZn%v;+T}h%unGh2aCJhP^z*OXv ztEdf*G27iXygCq#pS>yMp0X&eCf2Edh8Shr+!q@CThnQ76eqL`yzgkKQ9sOrLx})$ z2*gUs z^4@U5TI<5G$0~;!!OiXFB0DE19_A;B+&X%*9vwJbD<{pP6$TKHH#* zLhUWs_P}T7bg2UsZ4nQgUK3~44fJ?4n3HY$wZ811aWrjX@Q&W0na*b_&i-lzzz2WN z!{x3tla`p*z`%gG^>$ec&9^h(T={N^rx!UB)G{+YKI^UJ#Is|O-&j;4otSk}w!5)L z;3t_4mzdVZ6+4f)PccQA{=cc7G(#i9!u0uM`?8AB<#7Y&@1-ZuQ(+@+D)mijDpxdZ zzh14SKSCS2h-r_G2B(ra+p`mJ)Akm2hTC&-Ol}At*6b8AE^YP5{s}rg>G4C}Ypa5)`OG7~imon+Q~HSoZR}K7ZFDTH{4k!Oi6lEAAL- zXg)&@mUUCoYO$Orjr1qg8V<~xZiv&2q+81Es0F(3To7~Vo4`91{WC4p-igUcQO~=- zOQweLb}O|?2h<^WL#{MP~f@*DaRYBJ$m1 zAtrvh|JPr@C8FdpU{N_`>5uaa1{__2f`YjGXyguV`59eVa15Rfq@nV^SJhAY#N3c0 z*2lY5L}0mRtTDXxiy^i0?4M%O8>_+7A-@FrI6=md%#xD$c#U!r%{=R!nG zcJqp=`qMxG-Zb#ryO}Dg|9p6$bGdpM?aiNm(^itMiFP3VPs~WuClFzA@qnh3loVcO zG+&5X`tg{U0v)uemlnmzzq3c~dKA_R3HX|J5x*x4+3M`%W0O%a!InK7PtYLdi9N_^ z65EaP0Pu^k5dh370Zf*Z0165UD)@?sii_(R)ycR4Y4II$nw{X{Q;=hRl2QyY`O^MG zs-4h$l>cR&AVf}uY>l7>anRS#e|gT%l+TRgSojCVgD;$c5S;53$zh8|wma_zi%6t1 z_YK5qrQork(a#L4?Ws{xH3YZ462hE>7<&@4D?H~fe)Gy+g60Xe+Xcv1u0ETwasY<^ z!E@Xg;P?N`ac3ZOV4kC6`mN5mMVM7KQ-aZ9|BrjnT9n0|NagKS9q_LiN!QhAuGi~> zxE?MzKx^f&7WnsxyuQ`Rvnfdpd*m3ND8<5zz-E)|LJ#mQL*SELsQYSy%P<6e~?~9!L_%)Qy982n- z+$qxy#-HNVM0y>6IJ4b>s_2yenXUB3g+W1YA%mYjC-0y=gwIia5_?8X__jd4C{Ysxf>L6Wn;dN zFcM9|(b(A3bdiyvaGlS1j^)D}st*tm1~{^gT=wGldjVcej9505r{>Z3(gYO6x^z^_ z@1FwWD`PT@1A}VqA7}^(ukUJ&K%$Qy2WsMl{Bm3UvVV9ErQ3}nNiESx=L^c&7p^{Gou{OWML@sFYBlFs}{d`EfUYH97%2#^9DP3&S z2!hTaU3%b$8A+-w1jxzL-M{fl@B78&QrGr!WtssDtWQUYJ+geq1wgw3eH=T$B55RA~nvj^8`D12i zNM=@XwC8d-kwN-1Kt2GC%9d-c4zHOv0!C%D@XWsZj%g=kU;ttKio>E!qiL6}s8Y-L zG5&45R<7fKGsCOY>HhxBpXC|@i-Q$RTu4K6^S2s(?fdYzdFpLSY=YJ%`!*NSY{ z;F?Nt4gJ+(oUeFn5-zxXsbt?CVHH%af^uV_bsMkomAO*zHq|qUit35TG@%a%7p6N+ zaF#XSqw%9SEEz{`>2(X9$RrUb>ej7OhTKZ)^qW74XCU=uT%|ANJD9&IPQ%2+#3dA| zBG7e#V@F2_)2q|Ljr4!UBiFm{@`ta7>wqihm7C1EZa>iX5!+-*XP_pT^C#9<)o=4pe8#se{Jv~2XdA2z6y?>v#XCmUG)QrhCWf=tORdkq~Uk0So zC}{_=a{#fRBZTN^sMw8)1>!1w`~#TjAU$M6D-&BG=%l ze0M&Zs5_K*japUOO3bC&NWUj0sA{UKU)g!`q8WL!hzirwr&YDO2IEiyynj36rJZY_ zaCua((HdNaV?IulA=gW)W*lR`p0^GidtwH{-Q8_wHa5E2>gwCSwrBR6ogayvl%X^* zdAm}bI?i!Zv%KyY7f_Gyqq&5oKF&M;!0FI$)&)2i;|$JM%U0S4D^!m~yLLD@EO;ej znh|UqFxcm3C~yJFJS#waLjwS+4L2RPtQg1ad;0ZW)_j-Q`+fL47qxeDA}knLRagOB zKzO$8ufh8EW++w9s1^2SMr5M|eo5!4v1Rub744_Ndq~$zBiaNKp1tRoko(bzAIWK-!`z9k>%!VxufwUYyoiZ^^w!sJ4+javH1^3;Udyq~ z!VxryQ6LkpI3#XNQm_)8Up^&IN7@L=dEz;iwziL`z@~y(EYitt6TR}Qq5$6%0IlBer$>+Jb3*lf>|uN1yEXyM zrr%Emim%uAjsXZ7teVZrj1%KhJv&E^9v&^9y4#eLlz#dxd48`jXcKzc!j{9H(0N9a z(HorR==efJ=E)8T)&Ei`m5mbiW8i(-%DvCZ_T1Zlv=_pGDQp@A<^5=tY$&ZnqHEp- z^+pJ$yXCyQAb4RwJql^({9HUn!U}F^${a<9L*d+Nrchrh6wPafeJQK+a4|6N>vDsg z={uLE*=1`Q>Ob5izr3zl1-V4mnveqT07W_>abY>Cc&b`jEg|HF7@Yde>=8G`J&D_Q zPLVNz7nyR{k5U5ci#M+3s7yoTZX5-XS7Or*iNH-*T=}<`yLha}oBQ%|c?Pue{WW!l z+y5$TOTSY%h)9f7*eCwM?G*--l6YZQbnBDSIyu(oQuSTBxZ**=vt;dci_uMdxQB*1 zFU2IRDj-a@1wGd7g+nwB=v(LEM-4#(PS|h+%`6L55%jH$YXD!wq8Zk6*o|Y`IDw8 z{J&;-zNay7hY93#mg%4co*uBDQ@A}|7m2I7#!Red1bxfdmjX1 z5t0sAffap-pRv2li%~|EtN5GJAitVOi@fkb*|KQUujRr+QX`PHv&;F$3yU?rgH{0oFbzBtJpa5ndHqa!A zX+W%?!Ib^XjLwRO3i(#{&bgfrIp&4f15up&-}+=YyvsQ-ML|y9-rj5XZ!D2X`TqXC z+GBBe9UHete|1#5*WN55E>&;0)?I|56o*mcR4+1Dh`-_0`Ebj#Br2~>4j6#yhh!Lb zj!aDiZI?yx?8!z`tH9-?9HeGvvmpOytqUTRoS~1(j|~e$!IVK^fA;J2eW)#gS6%2r zaRKUp(*=53&4*uf6EQ2eSO7GS`@Vv-e*4UCUQVi_K?ZV!5fmN>x?X*M%bt{9{oa~x zu+BDkrIE21$X3?^;4|dn2K0eC?ncYvFo6xodH=66(kZIW{%I*T0dT)2;U)r9y13A> z^y&lq+YoGg=`5-6MdaaT-eNbkaZgkVk@- zAJx|oR$CnmlB=qQ8X9Ai%|k3B4}8h*d?9>-ES6YY0p*~JOye}ElT1ST!-y>S(3U57oxr$#-fAA#3 zmJJ?dS8__EgyPCgW5TQ8q2FQ^Z}aW#i52yKVT7|L?QuJc25dBb zi8}DDUz}p=f6H5#Q|zR=@ZqO?);DS&6i(~Ye;d=ISTQFQyd5UhmpZE$>0LzbG@@bb zfQLzanbR$-|GG987Z*IlE7ZzA>7EW|242IA2)AXY_aJ}f8I8P~m{r)Z{pL@9sIx*r z70JZqt+rbC89+M~ z72H=}u=rg>BK^LhL_^AI?EvII^-JrC^7FKr{O-rb#@eEGeG$Mcvib&JNfql$9uqY0 z{*~)TggK^lGIWE@HTplRG!otN@`uM@*s3tYvHFLVW7}C!dFrv{_koDT0I!!PkCG2< za&9|xdmSytn@7hvqTd>e4_g`;3ogyN<#5+Z2+oN=>1Sl&E1+Xvg?_Db)S|k&x!*OJ zmfEN{weyKDH!mNH{7q2i)HCD}MFUwIzLfs3A zfUOU9Aht}X&vSiy`TB=1okiUV6Jq{P?&XbhtnkiPoo-OJ5g4&!pPFFUQV0VtFnd6- z9lFNPkbQn+jVgD3r=*0xj?;iiH;&H5AwhaBAzbKr4R$!6R~rD^=n)oV3;}yXPdL0$ z^_rOipdeipW}JU9@SO$SFYw0ffA9(l zkX7;tdS^vlT5 zx!A6}@gJ9ULVGRM3BJN8j@FlKVWi_Wxkg@>HI4i0wHPi^JPb0 zGy%osG@UXo`D2k$XOq_QR`N-)%R&70ctb{9K9j%^c?*8h{DA3mfgZ1iP-FjhuPWXodLAThd6rI zuz<-(@iz}CaMuk{(pTDI908vd-KxQEH3w;DcNd}jtS&ewyEi0c@IhbwjmhL(lN8^m zI&uSDqAuAzb>3*??bJ3cl8%=zLvz>jcjLM*9=MJp14yQmp@iPBn=;g7sGi79nswOC zh|Oqi+D8k~%eaY-1RXHS6KZ2r+|!e}{6utcnX%#U2<84`?`zhe=>lgm}YOu+|^!t}ft@_Lk zlm6fyBU4>5GD5UZMC_B)7#|$hSBZbg8td&=H}%2|ghv!Q0!~}*I>VV*7#KoRbwZpF5pNK_ z;o*?wUpX*Fp(vf->xWR;M@-m?Cua-X`uQ(9**;}qLit36J;*N|z$WVJ3#E^Ejw!Ho z5nL6d91nZ)pyz*w9+zXXT!OBCQ>@;9^*x(v&8s25i6Zzt8)=M-;lI<`<^HqvHh;mY zwGKDyC3uKd*}kGRJUXfa-@c^v`24Jr{lRv=1zwD>>*(lM@$>WR*_rWOjqX+vePnAr zbJRJFczJ=xR5lwvdy;f%!=q12%cF$|76O5SoJzBprbFikNS}XlbiU?9t%tRKN|cxR z2|yy1&#sb`(PFcrMI%u-u25(aEYKlW5E zZ@}v~Z}0Bz^ww?NGm*X}Pq+pIG0eFmlVG_Rk!`g|Jplm+TvoRmMd zI<5*NT1yWz8*paP&{((-G=~Xua-Q13dkb}3oSZ#J0k0q1N?#qUtityV)do_8ur{PY z8Z=UJzJ)Y_8UhS{dyM!L6j&rTaU1?3s!V<)6VKbhfh{TzSLiRJm@VprHZB+8(clzM1Bu%^2#fM@5b(vZu8S34329HsZ#A%#iHHf9sfi*tRJLyk(q9DpG$fbN`2u_w@nRLYfTKGkIVHmI$NctqUt^Smoc7X0aEuSIslqqe3jo1{ z5nxGxPKJ3H-Gh0y zd9{}*RQLbH+0;AbumP(LOPRKVOwNNBxo_tkXt2NLH7vFqXpdoy?ZH(Me_f*OC}oEO-yQ@{ZYP*(kfhXqI@=D&PjR`H&I(6e{dVIq&u zYNN4d6Wx@Pcu}Rw@*|QWPQ72JDn11%X=?;|51zA&i`geh_NQxGqdy5QfSzjF+62D~ zcOJd|N!MOgMyTVdarid?v2x&t)bMW+cys}uQ|ugPa>Z&L9UVNV04gkdwAHP8Wl-5CL+VPT;iu zyJt08$oNtb(f2PSo0i+7-d#5*j1jEyQLXftJnIk{uEW`j5Bm&ct6=cP$pNiD#fIBN z*i8Ij0%KX5t)u@y?$?~fSIzH4tqtaqQiAewXtzzD8{`86zLX>!Ws3Vh*_%Iz(=#zy z2=uml;>P$?SH2!PWP|LJPs01q8J}qj0js1CaAIRbTu@NIjaF^P8;#N-c%c-U7BwFA`943eNvf!*;QaN9uw*6irm|^5iG| z2ceJFJKJgdmxsUxx-XPwZvnY+L7*)-v_#~CCn;i5Zb+C!_n9mKo`ltIy#Kg8f2(3W)y7=zVZg^tgubhuXu@?H9iCl=Mvf2RV?AiTA_8>h zDM#o_d+?$nJpMN~H#a7Jdyp1;>M@Y}Q&XSJ;IFpx!HiCmg^h22^yi<@5{X z&fmVjNW?F(MONde-oukdbwNw#0)LW0?M7q_?h8JbCO5?1Eji|U0?JtN!TZ5XVwpFE zMLQ$i%XY(WE)8CYMLrL8F6<;EF!(uIpplWcs=MXnK{k0Ry};YDRry0038jSZO4yfh zon2jjgrplGghoUF2ctuW%)NUn<%`B)CO<#EP;M=pvce0>^a+tYzM!OZTo93YXuwkn zhfd`rLV0y{><3=nK1`#_ThG6mciSl}rJkKjCRYI{Hs75f<0Fw(G!WMvk1odB;7)B|y^At27P5eBV zXi9{Lzr_P+2p^1t`#h{E`VFQx(5x0T({4t-dm52R6rj;Q?{XPvhpf*NO-e{{`ml>5 zvfG%&0}X&KzP!wK(@)nM{2v|g%`7#1Xnk8-uN1Gox=jw|dFbV`YrnXGzv69v(=3X^ zUa`>z7zMT5kxm0x@RBf%*3O<@LN<2C-hW+EM~(_sET4|N2(d*?e$_hgE31tUVnO>A zhM*K3uyw^z7z)q(%yxH9uZ0Q+_xLwT3}%G$`PB!vyo}ladO_7WBIF-y{$95T3a?mA zOOe|4rGi#zczDa`fq~($1Lrt=T*x~uvzFcgep|LkL?X)tJXuCT-}_T?a}Si+wKYmh zN5@wrV@Ya2QH6BS>mSt`)!n=yMP~IvkgIsXkn#%TRc{q7%wjyO|2tXd0zPu2n-px`=0B#H+WS!$K;Qo zvC=nt+iKg!i58}J-BYI_vFR3GJ%B%>wG9e>l|9_!&paVwUP`DxA?xF4PUeVG(4+ry z)62mKyy2l!OnUfUW`y2LWA3q8c{Ity*50_*4U^Oud)GVWq>KLCcqJ4sX$$eZ`;f}z z^t`-nmL6Dd9SGQ5_23oU5G8ZS!#C2aVvD5I=zwPR8}$JDB9DDG$N)u^cb-bdTraG* zu9t%v==mqGS-g-J-z1iT+Im9XKmP+xD)kpq@f*oFq|Zq=h5@dUp6w$RD^2g(5g*-v zqpbp#@i8YD@s?~1j$qj_F&Ak|1{lKB!-FiF=_21Oe{wUITb5pVW#wBYZ5;rdgeyVY zm-)QNel8&Y7r~cmub8N>QxGztBUrAj63soB$}ti48FE$_gS%`~1OdO;RO0w}c_C4F zIvjlYXc&$cQID$HDQgy^fu)q6ITRIHaIr~w@3jo_bZ!R!`Yf)3?J#a{Wq2z~OeJX; z>@hewsaSJX@&}1g(OkU=^3MBG+k?oB{&nv)f4O<;J~!PAIq-aa?f$;S@%?znw3FU% zqKVUe+r$XiRx*kvaIhV++eaTj?F{eZ_A2L!+A2=g0^qF~T^G`OV6RbbomvOXtqiR* z48ZC@aLe6XwvmI`%A8OLqqqC%hI(m7AUIL&o%8ibR^AL@ZIHBKr9RqnsK-C)__8Cpxdr2vxIVbqs9*NY=5Yh(YsB+y4} zAa|js24o|S*K4X;Pf=K_B|{Yxkk@IONbv48oX zHWLWo6L1LL!d_M71futbJ5FVBaqeCX+8f^ezgVE!M~u$arK^BUUH7)mTvBvU%BS0R zp}oSdY@EnhbD0mo&5By>BiW54>bfA+In$r6^Ro zWto&?B1%4~nV@j53i^^xj9HV_lJkz~F~jmlEaV(1g+zR?=bH)_>AOc(W7qzk1{Q#z zP(j!=zw#Ek_MN)~t837VmWjFvot@F}V*!>r0TPp_=4DQYnc(MMw$7v|%#U`x zgpf`g>_*TP%_Li+gUlR!ZUqbM9h$UfFJRoY8N!8eVpN|CaG>}-YmB*>suXf!VJJw} zT+3E1k@UeFboSi`}PrN`GQXCLc{V&WGRg#52Z zr?MK@S(usK@|WKcL~R@obbm!?&&V!z3iM{-A^0p$%S#p7%Ik~;hYLAbx_AU9$lPoL z{;u8>EooX>+E49`lF~hEt}a!%tm{Ihe-!(ipR;}C&wue3#qdi^!+8KwW!J#B>6pOn z=*NVCirwk;kkhKLo_(?67}4{mcimR*pgECj7D*Z1=_`Wq#{zTM#@=sUHZ23UF&7tc zQEM6!BRSK`0j@5#uVurtv$qgHuSTOa*8l;z!uv;(m&cVEIC>b&x+35s>Y)`?>!S$A zR1D2W9rXt(EV1_|m{Ca7mOJ#oI4o#3uViSrVfN{8rW2niwTU|3n}XChkmmvB*cOl-y7Do#W>p1W7;k>2vK&H5k4)wpittLmIa+z(-Fh zBqWrmsR#Fej&R5QN7RQvlohxKJ*=jY@VUxWdKcsG@NcbZ7CkYN0Olx=RC!oIK1YdO5MSw>B9A zV4rQ6Br|nTsr}LU80!51oXJd2lI~c^2@7gr6{ALcW2NO#XgIMb8{5qBAHlQXEM1$; zuEUW3tt8m|C?K-5)~Obo9{t{hKysb;_QEUZ=7fnYfQRU71sVjR(uoA8ci%KR#NJwedWB0jF?^>r9B1JWw3y!|0db ze(1t2At!nlS613m055g3@3UKyW*JJ(`4QJfE9{7_{hFN-=Z7(i3*zVnng<}FBqcgtlf2&*wBiKZxr2)B6B1kMdB}N z*EkBsAT|3v9p%m*Bd+;pltX3F-ur6U9-F3?oZBQ7?poGAM=9D^c^{Q{yAoitZtN1C=Clrq*_D|MG42K_twgphAoB>*i z(N(1~k2=B;$S3#1E@aI{&oFrM+OD`5TlxduFHICfRzcOlICrOs za~Bovb%R_5+gX~S{Z3)5F`EBAcjbP2OBN^$Ho>(1XzM0LylD`=x>V^bTvwjVixOqppFn-rR}__h z5IMak%EK%#Te3;Taw-+_A1JwYxIZFjG8Zy9Em$bkHE^V)q}Hzk#nyS|u{0lGQcipR z@#LYe*EVEk@YL#!%x|GIWiX`cY~0pX2;hU)U|fU}Z2_-K)?k;?#J9GUX9z$1A*sJIN*MNi)q0+Vb|V&|{UWd@iQPSBQS7-L@lNs zzgVPVCdTRfHJzJj3@%obK{*ql=3ZMQvuLO_DQnd`8Szfb)9a$&&xHo5q4k%M{8O5Y zr~f}zGu7Z^xI|@P-#NVR z;|J*k6^I!;)c}^O7xhKgp!#M{GE`EXWk)U+NP$@b5z0rNf1MD|QvB-L59paeM2NdG@+16Ix|LYtEE1^!$1??G&ccMjqVyzrIIKAO|idkHiiajY`aS zZR4&VA2`$7z}tHbxwcHD#oe7?j4$|9*q=!ZeQ-tJz5$>Bf8mtgDl03G!qrUA2Z_$4 zVud4I7&%`0<8R=t<4_S8(&2G__E8yvNvknF=FDtJST3pp*!~v_)&b)=kD6frtoFwYIs^S?hkzn@rpS{Mn>`S*Q(KFH#@mwY7qC@n zkl^8B(C5Gqw{INA9BjeG`H8=XPr<5|O<^f11mlxf-`!Rpo}TpgA~f|E_JFxJIKCsI zluF3itWwrJ|2mZy?fQtl(m^F8?=0XCuZR%*$XuLRu$|##Q&o6uXzXOvQ_E|1bs|JHvC<7?1CT8c-b2%xiVKp0h4{4de`97veN%sYwn2{# zO@SIYh|pDLV(#mDOa0aHT8HoN?S0`S1LQ6`B2=wUM_$LMw6$7mxmrqZgk zB8LZ}z7VtZp!b&aJyRbHSi?AdlSkm=(?+Km%+ypw+#{r`h+F6FBFNu*p%SLou1OCT zqpOU@C%SwZhOvl>!r2b=2sC7Q&kivg4Rr7A*Q=2{f&D*=(bgPW;Z_LifavxT1M~-C ztKz*MoCHxQjYmSdseeT*i_dF)5H0^SN1qK7=W>*ZoV?OjSLaDxXa_I+73CWT3^}WC z4}a=xl>Rz^HAyuiZiDB#bakXtju1#UV(sZx$s{v$x;HN##9!Ni$qe-to758eU0eHS zUjCNy9%y5Oq_f0+{V!653Mu$k7H(Bzqwx2Z5!SECV-@y{#CUL`FGe-OGTY3!Rn*f5McO*4bpMS3Gg#}7Ax9!h|M3mx|TQ)yEjr-ld)~k<*W}9;p zQfFRk$x4RPg@2KceQ+fpL=bs-K>WyN8fy?pMhY%CUj+>|&y)K!5I5>F2d5NY8J$(> zrZY-EkX4qj>+-0#m{)9o3d!5y&Ho{nKG<*ZOx7l$5xmQ&wRDjj2ugmwe}g-12y8)S zVCx1zX7~+Y_X}odNQ6z8pj5q9v)02)s^Il*b)iXXr2Ii)*@!J)RlW$-DI^XBfBU;# zkW?qa20z^5Z0mA)qV{h?()2^RTmddHz{Dpc>q&vR=e8)#`~ zHfkBIM&FFGB;O9HV7uv_`F`Fg+D9{bWRJaY-|M+iSjG2~w$@5S8!%7g@(;1EnZzP) z-^>tSdzH)oe72k@KYkoqIxic7dXD1sy5m5FjR z1|+7X=r=ygN2&~FZ<8@BzY1#Ctg>ByZ$XNBk61EL9PeYV%S0L{6YO{|R(eofAdw>*Hewq_ZNv*O~)>t3kI}IRCt3UUIU4CNS8?@aixpE4W2Yn*EYeK^?V^ z0X3(bR6l88iDvdzAM&`xtZL@smV(NdS2Derre5wda|vuqIxy}T4>>p8>oEB@@R`&W zwF?us)IHkvnvaxtH$T$5IomqLpSg}ew7E)92~z0<+ZjP&$jPOxFa{z!sA1U6RP z4y-N%t6}acVY}912o9~2Y)-UCJHl;PVAK7}K+wEy_gKt9vvy*Rl?u>*k>$9lq zdPFg%D^EjQLfSW58Xv>lo}bGRdbD-|2vpvYz_?5XqFvM~Gq$$2u3tQJpH{YuMvI@i z#mdv)Ouy{LSkc1ns3Y#t@jA7qjpP@2N=_V=3&YQ~he~fxrr;Jlf0w|pKo%|3ru!6p zPI#uIEdoCzz-;@YQP6M+)rfEuIj~U=@Qfx7nR|PBzRF-!`3PzVfs?o&J%!y~VZN^L z(K|9cGo$cWq5X`)w)W;aNLigc*n8FGa3tQGT2Kud+09T)4O=Xc0L8CdF>LQg4GqQ_Ab|g61XdElAy4@u*N3OG#NhUD31w!*cP{b z)%k#-kA{gU{0*au1|9)H!XcGIfAT#m??VfMC9EtTWYw{1d}dA;KN+dZ$BzDqI2%Hzi*ETZAsxQswONNUuO{Cpt)N&1r1^$&U_H-(Lcb)KuzW8 zsnYWxyT2F^V%b~jEhN}^Xxm=(ZOwkr_(1=(eSQwR1(Mm>YAxo?CTLh7R!NDXj8J&l zh|;_s?VnurDwdZtC)yj!aBU=5!D>*=#p-AT|2+!Egv+^EUeIyT?;r`G=Hox{KPU}x zDb=9Z#!!e$-GvPauic7|u>&o;?b06{Y3aWTsk=KM(b!6B=_QjFTH&1{V_Y94wZdd5 z>~zK^hH!Kd7jMjM?ghU0$)5v-sE8uB0>R(yVGCo3H4ZoOPyEm-MoiZ)@8(07g;SFh z4?ATcQjxaw+gOu_xtZ@v8$|r7-^?;`?I#D#t;ki?flsR z6!|)oTu)+u3g<0t9f4NV!misYylaMhSB%+w)K5`dpHxDJv<8yNha{zvokskEl6fdscehWtpeUo#mX{>6^vgp>$vqi-$>kxHSdjX+s$U z=J-Pbt#k%gJJaGgP512LYTDY?&ZyxbSe4i5t~&+SrPWcV(~ygk0wT!GC-1E_b2G7kXiAu>KXU zO>+a%cPsWN8=?vg5>f(0%eUrUNHy7wlNw{fLiIMJ>G4X6v10tv<1gnGE3*rK;o|w= zu8mfq<`-A4fVGz)BQt}j*Q?*LX*~(!qZF-M$bgI2y2R$?hK(UZJlMwOL>kD}G^pQt zwE&^;ARtkgR*^fk>L>H&BL1rsCrYSCO#{1=e5cCbQoDU?&46+fC|<-38YrZn`qS{fk%^DLgI?GPrICwl1-eUNM+S3u*``q~INxL+d=p zp*kq{)idDU;krrqt|}mjP@{>njD+o4a6x|#vJv8FltbBA6dc*e79|gB5*2~ludcG7 zTKYxaeC)1}a2v0)E5!p;rZW3J%NnKg?zPwkcK%v-aq({6ksK^diNcs+T%DBdPVdiz6EyKP>%L16ZeF8 zSLTz}Unz!`*j|ny9g0Vp&14vn^fG;BlB*MDldjlBFEB$v&|yQ*eJ#MF67E}L5(9$R zEYSQ;{h!OR%`m}6tjN`@5dAxYTW7;b18b(x9ZE8q<^IlYW=u-fi=bZDngu(1O&dWt zsz>O8G+c$p4#{Yu{+<)k1D$`Mw!ANtOz9FDWqaa-<4H0e8%cZvgPYw z6Ox@i{D61d1&CeQr2fM5Q2>Up()JK1VGG&osVw=UvUC{Vc}Y(CM&a8nCLV~tFN~c>Pw`r?K=XM$*>y2q8TU<5>glm@MP(&~6gUsR z>$(FeD(A=d$O-l?ZQ0F3ALWmj4|;kq8F@h8b2#uWd9sqnnX$u_yCkv-=Fb#RlsFkdQYDM?+Pxh!e(qjp1PGy`E2WMp{Q%Wt{SwrAmp+j?$6kdM!& zTN=*cZN+2(MFQ2!*&P1%Vu#z-FzJFrGg4&Pc2|#fDtWI@=a68&-jW#2T*!i{sQRC% zY=NtLn{SrMJFZy;{;o)pJwX)+lQp`;@ZSOKEVi*d0hNHj)BQ`Vn^ny^%;H?IE5Eh= z?y#5bW(}Zu+|%j3g~L@AlSHZwLPEb=`#7hGr}LA2DqS<5?x%4iyBY7_RMYy*)v>dt zXWw<`wXIt{Kg`>&w_}to2#ZZ(>RM#N)A;S#N=D0lXK^PA)F9i3lkyC8!=88s=|KaV zepC4_YAb)R2QFUi$od*9n1NG{-&0>p@W%MQcc(>%%=auE;%84mg3@QAtuJsPb4g2&&Z?Ha{g>{(aPPe-J>9CzAMC*E|PpDPA#l%B&?9TyiD1nmX> z<%Zrop?OBgxfYAIut!3MvS8||J9Gyrb4I>;=97UI z$piGdr`X23)xNb%Ob;N&>Sxgl$=HEgt0%BmQs>Y%Js6autEoPsGZRLE$A^YI_WC05 ztAbp!eVz`BSImqZauj0tG^dF-@J&bNX5HiR=bo7qVD3V+>#w3F3UmwnnSq@FEHr!G zy)(O(IBCbU^Q&=%XM1~h5FkN(4e%4?z1r@qtgL7V2?@db$4^rDOTS$=1Er`w3AyU~ zu_p1_)_9$pIyf}G&4;q%<8KbhIj2B{mTJ@X1HNe7fksefKzu^-6B0}|{d(v-pc3>n z7CjDt|D*o{h;Jmtzu&ei`;MZskVA@aKd{q%*7rjSYJ(_mj0h=V@Y*5+r6vN0$ryO4 zC)VBfhrTYekj(hnkFYrKy$c1=YL=;qTitrd3Bo@h>i!Jeg3I!n)o*TY78XiUV%`DA zNBAo2^xp>20bNIDe{0R|BlGVO@SaUV9F)Dkx|}}dN?{bUdqG|VjhBZ9dJe1^$ilG5 zu9O^&EsGr#9|qY~q%8G2Q$>peYBfGfFW=r^$PA+eKP?uJKRN%%jN@Ue{dkBdMwxKV z#-4R@FiiaF1K>KCjqSOO*V;W(&d$yZE))Vj|0yj-FG7BD%DzyZOT8G3FvaY1BFhfpuMR;OZm<%d*@SiKdRxy`M7TLPJfuyc zvl%hsA5R_Ob;*undC}CCTcNAR;d|l#fHx#ofR8T2mz5ex{Zvjrr_On{+O{uXIbArG zWdSu1CJXqLYHEQ1E+M~`LD?uDEJRhB8^1kxN=qmHeEic94LkAp-u><|K+st{g!B^N zbof!=;ne||bQjkO(P=ETu1~Zg}nqlt1!K6JWS7rQn~i=+>V`jC9|Az&&2eD zs0J%xRIS^yI>3W72UkM?7UDl4b`uE-raSg-@-vukP}b}oDBAvjP#oWE3bCsu1Cf|h z+Joik@e#OBF_H?pjrswr+HE~u-8nN;Qy(HCqI)8irx!U#$4dhrUtjRXGm^1Q#YWWd z)}R-LlGaY#2XP-ML~2;0>#i&XjXT)0W&(S4RhsAxrpn3}sIQt@%Bn*P3qVLkMA_IP zSq`V6aP~eNP&XS9wk=GBO`X9F)rh9#z=uG9q5-2MDveUl4q=w9k~(HUJ4IXr-^ zAWnPJ(KE5o5gerMR(Nq_HHt? z_i+HNJ@&JAEBR$ek^bhf`)sZ;tVUv96{p_%Xn(k=j7IHu2A%UMymMAi7<1uP{Pby~ z9waa~o_qYBk}Rx&O@$b88YkS(kGlpJtA`IVj-RQfzak4I0b>8o>vTNi9}G3@zI_`n zf4KqOy~&M_=V;l0sK$QbTc{R|V4UwgcAfRMLyV?NfEX;_4f z-2X~UobJle7#t|=4J{FY?!60_LnCY)bd5{143a5iwV*4KvMG$=bwh@x^IU%`t%o0j9A!zY&OpZUeC1 zAybLU&)Xyp^X_w)3vdTMeuU}iU%xEFNpuS%L5@tC7 zw6q@WHg6UJh|7gxnv<~d%HSyKtQSWl`$8?=M;)gG@ZfkvoKO0V8YsMJ-(VfFRWC*Z z5T4e#d3kj(!_IxyJAE;IZq#@?JQm_-f0?9Vj}7*Wi)T#GI%W7#f6~pQpkWg)fILG0< zha>%F;@>${_nu(}fsIsYq`SX=*Wg7V2t8O`GW5+zh+hQ-wgw)j6!RlRoQ%I1KIdkh ze}j~dOvx2ni-Uy%Wcn|5CqHIwg!tz{YZDWbWrv5Vb)Rbmd|}}Z*oNnCvoBaAJxtZ( zc%3=Kavz84>Mc@@O-2x_9)1x}j7Ok1)hSz%(-m!4+2k9t;NcrhQ&ZC)MG%91j+1%~ zjVzZ4UP-#w=C9rkL9V56M_1_-p<~B&fUWVpaAsyEtSv8(N?&z89|D183TOY})+z2q zf$(EZte+h;A+XhV6zXKKafF4tH@|^X(86A#o2DEc8afb_jwOwtyCb91Y_L*`jENbu zsNlEJgEJ0H0Gm+CwJKSiFPGIp(-#^|Q{L_avBt74;_#tJMWNEmuc za@E(4SADK8DlUDOHNp}| z8rcd9N$L$=M+aCK<$sTBe*dN&o1DCWnC9>k;MZ$m4+h!i1Q4z1&a$Ey-UJ7q5%lpV zh5Llf3K-f#ms%w&1V<-lW_IvMNtyQ%H+p#&dPq}|5PKgFc5wGWGi_dFw7$`dAF=JF zJ3dHtJ-o`;0vXq4WI0DD^#x^OyI#4z@& z^EX&Xs=kNOe6l>%(XuC;kJsw^Bs4y8`z+PqiodWq>1;!5R<$wCS~mXv z^Vi##?3A$i*HmvNuZ=t%q72y1VJu8cvXld4p#W@Hp{}9fRrwuiYb34G{?_08qXaQ1 z5g*C^M*f_D(|295ocz6(sPf=-U_0z{KM+F_D)CBITwHv<|My~{Wmn>xX45&vTS*-n zFRvN_8q!8bEV00pn2SX-f!3aDe%e5Kz-#xqjQ_vK+sS}!B>Ni{frqzKB zXPPYjG<*>TsAv=@+uA;_xAS_dD=VFe9fLspZS%Fd(7MT9WMP&5O4Rc=rp?LkaT=Ci z;(1gbHmS6ssvQ^@c+x?!4M{kU+rA=JGbI)gmSOBb;F$OD;ASn}EYBXKHFsAtAR0Y3 zgDo8c%kEZ=x3Q#dI+5;s^{k6Rv3c``sA84=4WSnbN9Oh+wyIu7y22*L?ehp93jA2_ zkY>1&y3LORRjz?~WBv&u9=jDy4h#NJ6_dAMvN^9Cia znGW;I-N{*gNuoI1$Y#EeXL>FSV1Wb$)K@HOr!mg7Fj`<_Z(D*XHQJ*Pr=1I z0zyJ^(u!k8Ai~M*VSiEGVJDpw9Y6Js4>rJ&Lgv3(oGE5(!(ao~M-Fm=M`oRto+hG= zL(;P_;0a_LApxXj7|X|xZI3nCxWPvLv9VaxK%ytAhiGtBW2l)QgC1m zY0h!HE2CtGD(7})6riHm`ZK)@B$+b1n$)|$r_Z_)P?Qd957 z*$(c*0jH|*e$p>8{vFP13w^DRJ|f?YsWnO7WBnRf1+uihqBuah4JY#hsXZT`@XtES z`auz{r@TNO0%s2{~d?ts=2#C;}hYoo54=LqXNrS z_hsi7(!;nqM-T}@!ir~Jknu$JKNoijKHe^92$6|uUfj)f98S|FWM`8tqlG))NUXl`*qHgS>3kbcED;i==2qWoL&55mQhpm*2w@b_?N$}IHWKsD>xq7^7mXoan_87qWa0b=> z_igU4z2?Hu-N)SUq(+$vF1hICZ!O0M_5fw@SyoQ21DKpG#3}@O;)lDZr&TnmqZyrO zdh1DRS+6leZAiQwHdsKX`m#uSPfs{T=G`iX^}?@)dSb*U*fB;4Paz^v4>Y|2lbWfG zIlG%E{43Vpa`HPor+@JvX$kCHt)BJHYQ?D_0sd*1RPh}1Ve9v3ruCq6Ojp(}pu8q$ ze`5a-y*xAqVZ+P@o<}dIHlT`y^wXyx*1gfN^~O(u_G!!^qLl|qHRq|H!t4n@8HwJD z_qsHTRQ+^*vy&Zg7v4O$1lKh+5c$()Q&@crOXcgW;`>*6^pAdyLQ&38XOv?B3~X%C z;j{uELeE4t^>Wfyf3cmz%G9^gxLpE0!sxkrNJL(48B@q7=g&_~rW#XSGT(D?aYd64pEm+wsZd~l zm!ryKLkhw_6WoDpEBpCftX>hweuWv`NuRmw2&X($lZ!Pf^;2hShKVGqi%pA_J{ zlT{NYTa7VVKaQM&#cH6XNWqj3&sG(xl$C>csUu#nJD z=;H9O)poPvc3I2$zw-Ke)tvNe_8`FXi`>aL8GQ|6M>~(9j0+v?by_zhyp_(-s>2A- zXDt*~>UHj35)q&{MlPko9l@H~OYPxj*5=pR)dwvu+5q%@_pm2#R|f|}SsT8fIF)vZ zFZ#_%Vsd{Mb~*9Op5>v!r%6Rx74k~^^Btt-uj6}zcH0J0c7Jl6*($a$(azJqmi+=lo?8$?v7%L;= zA;&qQAtK~!NN6j%-n&2vBS#x!kT*h2fk;TyiEoU8CLyT6%ckmhEZW6&@z_%?nyS0! zXUuJb$3stQu1wLzeIT+oMzR1XD~YO2YN2OZa<|fpSM&(cTe_S@OS>Zn*o%k#A?gAQ zWp6)Pgkz?=Tq@x%IBW1Q2>tM>sN5X+5`}UC%Jt=O=1KN^cr$qB<8^7W3v&6Tje)F3 z0uzECO|gR7`&Eerya1n?mLF&1hBH?DSMy&11n{UuZsK(B26P_VUF;m}i}%eyhgteW zFy|NCKW%iaWbl^LF*RTqe6X}(BIJO3N?4pB9_j#pJ+)$!VSpoZ7Mwidf1TZiwOH>w z16u-<{62aN3ZIJr6Fa*z1ZWZWu8`yjf|ABP^zWNpo~!|kOWlD5!H@9--u|TvGEF|d zP2XBFGnd`}6)QH8m7Q}53VK&mRdI0(IEz2V;}Q!{2#fxEw6wIM0M{I3li9l{w47pVQEs>NC8XlNqaoN$^GgFhdlf=ENKL-Np!J1Yy6 za#Cezz_q{~3Mq$B!dPQBAO_7s+~`*wI=ecC5ruz2NJu}0X5Z;Pe2$;Dxr_|P>>D!* z5h+ss_C+C8+nqRJI8Q&QUS#x>10eUu#URvp%$gbn8M}lckhZB7PA^c5zlPDa4oSHM zsXW`;+G6gXk(^Tkt(#K#QsbBD`8|yf_1NP0kk2;c! z=IW+!aQA1krwQK$DDURehdo%FfO_)}bC0*G)At6Up9Fbv%oGs6u4+$W%MlGcHJ_hA zlK64ZMK(Q78|Fz{hAtz2{rWZO6D9!aRmPFg3-!g^|v zihfygBJ#k#YWnt2W(r=FKPHTCUw8ll(^7k5*E7XHlF)l?HzqsKd|#u1az zJ{p-}48(Oxi<&y_kTBFtqr&Hf`FoNkHhz6F9gY6h&H$l>>4^CqTUxLjIq$>Z!E37noqd?{PZ+% zmGi~V4@wB#OiX`YMrk~)^H2S6^Y_j4|A&B%iyrhniAy~ok2v74KhZhJo^mMB*b+;W zCoafmmj&?K*I9M2^wsC4-?ubTuRLG%h10_nJB6v;F;ixqnQUKlnt3%WZ_Y{VSOrrB z7#d)}fPwzfv30l&fFb?<*k|NpHv!Z>yFucB$<>Zi!-))YnV~lzKpNHTymk0zK2^nY zl##9-;Bm4tnD%fyA0Tc6cc8g25_RJMp5x&#l8unUPpcgVi%3w$ytqDqcK3Hj($1UR z&&gfy@pqIB4Aub#^t$z58N`XZ3zO_C>g<=4%l!d)X_Fbf39;V=0wq5wj*bbI*feaQQhL_bDlb2T_!A> zg?m_?HZz=Q_|CvI4jxLuo;7-oWi?&BKHWO>ZV|#*4Eam z+`ci6-_AVF1T0kP%?Sq_&Q#WkI65v3c}YDjS@>GCU2laB0G2MGd#t5-I8M-LZT;hE z-1xAGO37l6^tE?jP$Mjd+BGO$2uO+yf$8{=Ezhy?qnYC6S1Z_%a*1$QUzn}BDl}`2 z1=-2+Gyrc%pO?2cc#s#x_$%nQ$9+iOjn;_;-@-L}Y0ZLQxFz-lFMO&X&~0F#+vZjo zR5xL`*%K165_CgRA!KNbxNo3#x*7WO=0#!!08xZ#)te(>_q!7l5zP;Q!DX@BWvg%p zDm5b)SD~V12`^J?Ih+~~EKvh=aUNIT=lTNXz|^@ZSHrtK&EH-y=SGG^@O3M5jWavG zm(ujVf7m~so|XVFI-ictGR4l5S?BTKbcy1<_*itsS-&z}XpPkb4c|=<>HmuH`)6S3 zV>a(V0|C(_X*l9KWKFxM`e_mc(^ktz1TV|B9 zx`MU5AMXg+nmAGo*r<8@>%RU~`aV^8Q!=@@-i|J5NpLk)6U!p)5nvs|;Er;yz z-n+VL0>4w5W#NGcmemd0q5;8R3kOBattLJr?0V_F<5txaE9w(%wpEqPCkvH;v z3(9D7DSi$Nzjx}3yYVBdkXO3&mHz}xc0}2 zDTF*G?~V5TZVr?c(b1#8+viUxE%hZnH8Pl-R0-^U({#deau2c!@M7(=l3!d)cMiJ_ z)8?Z!uLjj1K1GNY(BkUI@2w{m=)xd%|E2Y$6tgLy1ofE{{4vX&F63 zmEIniaO#k;%KNjKRI-#{`iFsz^rr8zfJXpB`BTC(7L6)zfS+dQ2F7LwEGmIU={t+}p-%@$X5_EijGSh?gA`SJW;qJtI{(vUWI{kf(V$Xjwb-@Zn@1n-2G;S^j?_EM0n;ItZ79-eK7n*cP9sF$($!zh=2^0Y?6lyne1%cbu}o%iPD;q zIU7len{3*q`{r~SGia=hi>JxHkDn?(*%46XbCs6ow+0_xw#9_ZvF@*zDIDd;;g~Y% zd9g~Wt6}Fr7;FS+ku1EBR$`4M-EBy?o`Dsvn$UyhmV9aGl!kGyoYrypNC}JG zl&QYs>z+~!t3M9&-2E-Y)9RbxXHEhhM#JLR`%&R|fkzZPk>>Bps6N--RO;aUiKsRz z(F4yFohG|Q2TABBXq$U@$V>bEu5yhB_=CI^X28y8B8O{EgoM1RD>5{5a~yp9YXTzi zv4v*G0tx^M+Vgo7zD6HpFPbJjTwnIDhCgoBz9sw;+Wu%o4V&P%=$ZPyWO#65E@)f; zUNPue7i}EJTX1F6*sX#+-F;`P$3u^0AWqfGACq#qk-7^O(fUWv}{QP zkCZk!z4nPemGH*rgBC)*_zeRNZJe1eN@$DgXkURv9lv))pFYJ4<@j*cFyUEt;OhM^|2>Spf&Sv`_wJy@!;*AWUk~TBE5S! zSG{2Z5aFBe3CjhXJfZ~!1v#6{%>@O$GTGHa>h?$%*N$3C4?s{zx$`MT4OEGm)x zXzn^{_s!Z@*`MjOlat1rYGhbsa^B<0jLBt0#(U!ZesI0*UZsR$_Z=|KeJ)=Cz$K|< zOy86Hf9G;PKzhG!`Ekv&KNWOGZO3FY?#%W!NN}I@K~|n}bmnt6TWcCa>7nIcn_4F~ zx6rPxu4SN)@w!^KWvlw{{ldx$sfDR&A9*l?me+$zn=E$wBKqLS?B(^<)wEe0$=kPo zq|2>etk11Iv0dR!G5__Ke=8DSbOB#ra9K!BUvr{iW5bpKSjPE=d(Q`R4V|KCUSb+v z`@e{rLM$_LrDJdl${gB!XDj_`)Uhv)k{rx+-U-T6ruHG{cLzGdNZ`roK^ON|=lSh* zU^CCb{$dr5S(a`L#H! z*V+y}|3;P&_1;32oM$yJnuT0KR4C}nOKa>}uF3Xj9i}GBfo+sNBs%Klvbpt)%7&Yj zhus(rqUZ%%IN#Wzo~IdFT?dzzm1#@JOA@PWsI#5a*;`p@69O1m`OlwwMEi^{u{G<} z8x|{hkC!xFB>)GSXtRl^o|2N%KtiS{k+L=R+;b+I(Pxx{g=uWg{UA_ zAD*ws@vXC^<)ONQ{<$vKBZnxOwG~|eI&UM!!Rt96SDdrU?Zaq4q`tmh_}NKBE|s}7 zJTmer7=qGZD!9|apv~dg;3WVpwztUtoY=~3$W@9EU6#h~DlY#_viHqAwA4#^nm7fs z?K-Ax>G!y-!9;C&VctIOhxvmcUo25z2^2J}0Y*{?Jk3D2C<0}dBNFv37FV*ROY zoY%$bQ%Tb7#^d@nX?k2U%Da!MK>5m_MA-9R+q_pN(A!;Oe9DFe0{KrEZ%G+P^-Ef} z4JqArMpg2@R#Nk7*y44;xlP~jmXWT#IP9E&#EPvi%e2KA(B$}Z3`W%-plg?z2v&*XF%R{|5GqZM1Ec2a+gYr`1{uy$Uz-Oct58KVbdf!ZW@@PzGbnHqkx zSl!~yXAnrS>Z_#q_l@K=ELc@C26mq zw|zWcUHzxF_EA*CI@oEU?517FW-IT{2L*M?V_tMZ=6H-9QsBV&U}1JF1D1v{S8whhFS}s96W& zy0JgNAei7{7dcu=6!y(I*!_81!qAQ?W>V_$v9up&q+OQy>n znBhBo%Y3r@@&F-mt@0OdY&Sb?;h$NKwW_kR!!ZExA@Tt=*hsyV4bT=lhjk72ARB z_I%l}Vxh%zMmO=e7(2wR-J#Ey!%gsAv%Hh#6wZ-Dlq-3AL_SO~`K(6{H2t+omJ@fzk;Ryju7hD??xwic@-HZS4uNYZbCwyzpr-0v( ze|Baj8XFy5@EE9pM-ZLOt@!RAC|<&zyHC;^zQop)>blPP>Z?zsl(7j>Sf?ZV)E5C4 zd!THDqlW6Lhaf(<@~!Nl*i`6!z1GSrYyyy9&VdTcCg(niP;a2;S(Y*y1e6O=2>?Jm z9NBkzzlQg+DQ+FwN4|ss5HmDvM0{rizAN(tscir3>Yc!j^1^buO7ylkmdQ7$Rciuz z4qUP7-?4_^(%;X2s%+ohXb1iW1*V0$WGm4v45HG9?XY~`NLN@ZEr4LQVE#z^+60tn zT2*X&1Dr*j+Hq!ADa?(o(k}>53_#eV{_(n9D<>;kgnio)S?-`wrK{D;uaXJ8ooB#t za%&W7koo1b`A2c_?U#?Bb0nK5SKy~7V0j)MAFmR0Ify3{{)!rm8wn^RwEy1$iO#1A z-i%u?xhO!~+<6}!+8Bf=m)z)o%)p6RufCh;3%lU9J!M7~+OBljL?`-kbzaUb+_Am` zQ+QT!sE;p#)n;G~GKGD5g#E|URmVlSeEmf_q&uVpqy(iK6hTRmE-3}2J0zA4DFNw} z5R~rjlJ4%7?p}7^;okdu|KHC%&(1S*=FBYGxgI5P7#R&9FjiMO({LKdj2<_>Hj zv#w9K&<7KFauY?GX+Y$>w6d~-4v&r9{;H0aGQdekPOw_eyoCaRraOFca#z0R&+TOa z{plkBnJtSPHkiCpR(i1VtTl{+XXi@MRFEQLCrRgfz$+E{nIKv75cU+;TdXXL&~= zaqIGZ7pAP8gmqD5YA*)`-m<@v>P%UbQWE~?mqRC_6AM~42YfuxKoK6z9?Ll3avAVM zwtxvULCmN)P{L$zY2r&UsmRF8T;;!9ngiOW)e8#?2y#N8gQUO^&^8DCm zG;S4SP4eP{d3BoL&q4`G@4@=A>%*&c!_N<=`*FNxs!9xSTN0KH>3<7f^+y}AA16mq zF_B#t3&v%7P_7yKycnYmg)Q`d?0oNK>+C$KwT^(D4h7i_b}n5_^|1z1*_tp##6H#6 z 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

    &-j}bp}VQ2MPx3$1r+y) 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 W`I9QP>l=!Kyz1%d=d#Wzp$P!4Yxvdx literal 0 HcmV?d00001 diff --git a/core/src/com/gamejolt/mikykr5/poukemon/GameCore.java b/core/src/com/gamejolt/mikykr5/poukemon/GameCore.java index cf13de1..9223edb 100644 --- a/core/src/com/gamejolt/mikykr5/poukemon/GameCore.java +++ b/core/src/com/gamejolt/mikykr5/poukemon/GameCore.java @@ -31,6 +31,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.gamejolt.mikykr5.poukemon.interfaces.AssetsLoadedListener; import com.gamejolt.mikykr5.poukemon.states.BaseState; +import com.gamejolt.mikykr5.poukemon.states.InGameState; import com.gamejolt.mikykr5.poukemon.states.LoadingState; import com.gamejolt.mikykr5.poukemon.states.LogoScreenState; import com.gamejolt.mikykr5.poukemon.states.MainMenuState; @@ -102,7 +103,7 @@ public class GameCore extends Game { try{ states[game_states_t.LOGO_SCREEN.getValue()] = new LogoScreenState(this); states[game_states_t.MAIN_MENU.getValue()] = new MainMenuState(this); - states[game_states_t.IN_GAME.getValue()] = null; + states[game_states_t.IN_GAME.getValue()] = new InGameState(this); states[game_states_t.LOADING.getValue()] = new LoadingState(this); states[game_states_t.QUIT.getValue()] = null; }catch(IllegalArgumentException e){ diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ProjectConstants.java b/core/src/com/gamejolt/mikykr5/poukemon/ProjectConstants.java index 619240e..2c36916 100644 --- a/core/src/com/gamejolt/mikykr5/poukemon/ProjectConstants.java +++ b/core/src/com/gamejolt/mikykr5/poukemon/ProjectConstants.java @@ -19,7 +19,7 @@ public abstract class ProjectConstants{ public static final int EXIT_SUCCESS = 0; public static final int EXIT_FAILURE = 1; - public static final boolean DEBUG = false; + public static final boolean DEBUG = true; public static final int[] POWERS_OF_2 = {64, 128, 256, 512, 1024, 2048}; } \ No newline at end of file diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/Mappers.java b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/Mappers.java new file mode 100644 index 0000000..ac76aee --- /dev/null +++ b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/Mappers.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014, Miguel Angel Astor Romero + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Read the LICENSE file for more details. + */ +package com.gamejolt.mikykr5.poukemon.ecs.components; + +import com.badlogic.ashley.core.ComponentMapper; + +public abstract class Mappers { + public static final ComponentMapper position = ComponentMapper.getFor(PositionComponent.class); + public static final ComponentMapper sprite = ComponentMapper.getFor(SpriteComponent.class); + public static final ComponentMapper soundEffect = ComponentMapper.getFor(SoundEffectComponent.class); +} diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/PositionComponent.java b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/PositionComponent.java new file mode 100644 index 0000000..e2f7dc5 --- /dev/null +++ b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/PositionComponent.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2014, Miguel Angel Astor Romero + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Read the LICENSE file for more details. + */ +package com.gamejolt.mikykr5.poukemon.ecs.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.utils.Pool.Poolable; + +public class PositionComponent extends Component implements Poolable { + public int x = 0; + public int y = 0; + + @Override + public void reset() { + x = 0; + y = 0; + } +} diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SoundEffectComponent.java b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SoundEffectComponent.java new file mode 100644 index 0000000..683db43 --- /dev/null +++ b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SoundEffectComponent.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014, Miguel Angel Astor Romero + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Read the LICENSE file for more details. + */ +package com.gamejolt.mikykr5.poukemon.ecs.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.utils.Pool.Poolable; + +public class SoundEffectComponent extends Component implements Poolable { + int soundEffectID = -1; + + @Override + public void reset() { + soundEffectID = -1; + } +} diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SpriteComponent.java b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SpriteComponent.java new file mode 100644 index 0000000..4dbb032 --- /dev/null +++ b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/SpriteComponent.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2014, Miguel Angel Astor Romero + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Read the LICENSE file for more details. + */ +package com.gamejolt.mikykr5.poukemon.ecs.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.utils.Pool.Poolable; + +public class SpriteComponent extends Component implements Poolable { + public Sprite sprite = null; + + public SpriteComponent() { + reset(); + } + + public SpriteComponent(Sprite sprite){ + this.sprite = sprite; + } + + @Override + public void reset() { + if(sprite != null) + sprite = null; + } +} diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/TextureComponent.java b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/TextureComponent.java new file mode 100644 index 0000000..80dce08 --- /dev/null +++ b/core/src/com/gamejolt/mikykr5/poukemon/ecs/components/TextureComponent.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2014, Miguel Angel Astor Romero + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Read the LICENSE file for more details. + */ +package com.gamejolt.mikykr5.poukemon.ecs.components; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.graphics.Texture; + +public class TextureComponent extends Component{ + public Texture texture; + + public TextureComponent(Texture texture){ + this.texture = texture; + } +} diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/EntityInitializerBase.java b/core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/EntityInitializerBase.java new file mode 100644 index 0000000..cd4c83a --- /dev/null +++ b/core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/EntityInitializerBase.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014, Miguel Angel Astor Romero + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Read the LICENSE file for more details. + */ +package com.gamejolt.mikykr5.poukemon.ecs.entities; + +import com.badlogic.ashley.core.PooledEngine; + +public abstract class EntityInitializerBase{ + public abstract void createAllEntities(PooledEngine engine); + public abstract void setLoadableAssets(PooledEngine engine) throws IllegalStateException; + public abstract void disposeAssets(PooledEngine engine) throws IllegalStateException; +} diff --git a/core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/PoukemonEntityInitializer.java b/core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/PoukemonEntityInitializer.java new file mode 100644 index 0000000..62410c4 --- /dev/null +++ b/core/src/com/gamejolt/mikykr5/poukemon/ecs/entities/PoukemonEntityInitializer.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2014, Miguel Angel Astor Romero + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Read the LICENSE file for more details. + */ +package com.gamejolt.mikykr5.poukemon.ecs.entities; + +import com.badlogic.ashley.core.Component; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.PooledEngine; +import com.badlogic.ashley.utils.ImmutableArray; +import com.badlogic.gdx.graphics.Texture; +import com.gamejolt.mikykr5.poukemon.ecs.components.PositionComponent; +import com.gamejolt.mikykr5.poukemon.ecs.components.SpriteComponent; +import com.gamejolt.mikykr5.poukemon.ecs.components.TextureComponent; +import com.gamejolt.mikykr5.poukemon.utils.AsyncAssetLoader; + +public class PoukemonEntityInitializer extends EntityInitializerBase { + private AsyncAssetLoader loader; + private Entity ball; + private boolean entitiesCreated; + private boolean assetsLoaded; + + public PoukemonEntityInitializer() { + entitiesCreated = false; + assetsLoaded = false; + } + + @Override + public void createAllEntities(PooledEngine engine){ + loader = AsyncAssetLoader.getInstance(); + + // TODO: Load Roselia's sprites. + // TODO: Load ball sprites. + // TODO: Create entities. + + loader.addAssetToLoad("gfx/textures/ball.png", Texture.class); + + ball = engine.createEntity(); + ball.add(engine.createComponent(PositionComponent.class)); + ball.add(engine.createComponent(SpriteComponent.class)); + + entitiesCreated = true; + } + + @Override + public void setLoadableAssets(PooledEngine engine) throws IllegalStateException{ + if(!entitiesCreated) + throw new IllegalStateException("Entities have not been created before setting assets."); + + ball.add(new TextureComponent(loader.getAsset("gfx/textures/ball.png", Texture.class))); + + AsyncAssetLoader.freeInstance(); + assetsLoaded = true; + } + + @Override + public void disposeAssets(PooledEngine engine) throws IllegalStateException { + if(!entitiesCreated) + throw new IllegalStateException("Entities have not been created before disposing assets."); + + if(!entitiesCreated) + throw new IllegalStateException("Assets have not been loaded before disposing."); + + ImmutableArray components = ball.getComponents(); + for(int i = 0; i < components.size(); i++){ + Component c = components.get(i); + if(c instanceof TextureComponent){ + ((TextureComponent)c).texture.dispose(); + } + } + + // TODO: Dispose of Roselia's textures. + } +} diff --git a/core/src/com/gamejolt/mikykr5/poukemon/states/BaseState.java b/core/src/com/gamejolt/mikykr5/poukemon/states/BaseState.java index 1eda7b3..0efcefe 100644 --- a/core/src/com/gamejolt/mikykr5/poukemon/states/BaseState.java +++ b/core/src/com/gamejolt/mikykr5/poukemon/states/BaseState.java @@ -46,6 +46,9 @@ public abstract class BaseState implements Screen, InputProcessor{ ; STATE METHODS ; ;;;;;;;;;;;;;;;;;*/ + /** + * Executes a set of standard actions when the state is set by the {@link GameCore}. + */ public void onStateEnabled(){ stateEnabled = true; Gdx.input.setInputProcessor(this); @@ -53,6 +56,9 @@ public abstract class BaseState implements Screen, InputProcessor{ Gdx.input.setCatchMenuKey(true); } + /** + * Executes a set of standard actions when the state is removed by the {@link GameCore}. + */ public void onStateDisabled(){ stateEnabled = false; Gdx.input.setInputProcessor(null); @@ -71,7 +77,9 @@ public abstract class BaseState implements Screen, InputProcessor{ public abstract void dispose(); @Override - public void resize(int width, int height){ } + public void resize(int width, int height){ + this.pixelPerfectCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } @Override public void show(){ } @@ -89,6 +97,13 @@ public abstract class BaseState implements Screen, InputProcessor{ ; HELPER METHODS ; ;;;;;;;;;;;;;;;;;;*/ + /** + * Converts a point in screen coordinates to world coordinates inside the view of this state's {@link BaseState#pixelPerfectCamera}. + * The result is stored in the {@link BaseState#touchPointWorldCoords} vector. + * + * @param screenX The x coordinate in window space. + * @param screenY The y coordinate in window space. + */ protected final void unprojectTouch(int screenX, int screenY){ win2world.set(screenX, screenY, 0.0f); pixelPerfectCamera.unproject(win2world); diff --git a/core/src/com/gamejolt/mikykr5/poukemon/states/InGameState.java b/core/src/com/gamejolt/mikykr5/poukemon/states/InGameState.java index f6ef53e..988f085 100644 --- a/core/src/com/gamejolt/mikykr5/poukemon/states/InGameState.java +++ b/core/src/com/gamejolt/mikykr5/poukemon/states/InGameState.java @@ -15,22 +15,126 @@ */ package com.gamejolt.mikykr5.poukemon.states; +import com.badlogic.ashley.core.PooledEngine; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.Pixmap.Format; +import com.badlogic.gdx.graphics.glutils.FrameBuffer; import com.gamejolt.mikykr5.poukemon.GameCore; +import com.gamejolt.mikykr5.poukemon.GameCore.game_states_t; +import com.gamejolt.mikykr5.poukemon.ecs.entities.EntityInitializerBase; +import com.gamejolt.mikykr5.poukemon.ecs.entities.PoukemonEntityInitializer; +import com.gamejolt.mikykr5.poukemon.interfaces.AssetsLoadedListener; -public class InGameState extends BaseState { - public InGameState(final GameCore core) throws IllegalArgumentException { +public class InGameState extends BaseState implements AssetsLoadedListener{ + private static final int FB_WIDTH = 1920; + private static final int FB_HEIGHT = 1080; + + private PooledEngine engine; + private EntityInitializerBase entityInitializer; + private FrameBuffer frameBuffer; + private int w; + private final float oldRatio; + private boolean assetsLoaded; + + public InGameState(final GameCore core) throws IllegalArgumentException{ super(core); + + engine = new PooledEngine(); + frameBuffer = new FrameBuffer(Format.RGB565, FB_WIDTH, FB_HEIGHT, false); + w = Gdx.graphics.getWidth(); + oldRatio = aspectRatio(FB_WIDTH, FB_HEIGHT); + assetsLoaded = false; + + entityInitializer = new PoukemonEntityInitializer(); + entityInitializer.createAllEntities(engine); } @Override - public void render(float delta) { - Gdx.gl.glClearColor(0, 0, 0, 1); - Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + public void render(float delta){ + float x, y, renderW, renderH; + + if(assetsLoaded){ + // Update the game using the ECS pattern. + engine.update(delta); + + // Clear the screen. + Gdx.gl.glClearColor(0, 0, 0, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + // Render the scene to a frame buffer so that we can apply screen effects later. + frameBuffer.begin();{ + Gdx.gl.glClearColor(0.2f, 0.2f, 0.5f, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + }frameBuffer.end(); + + // Scale the frame buffer to the current screen size. + renderW = w; + renderH = renderW / oldRatio; + + // Set the rendering position of the frame buffer. + x = -(renderW / 2.0f); + y = -(renderH / 2.0f); + + // Render the frame buffer applying screen effects if needed. + core.batch.begin();{ + core.batch.draw(frameBuffer.getColorBufferTexture(), x, y, renderW, renderH); + }core.batch.end(); + } } @Override - public void dispose() { + public void dispose(){ + frameBuffer.dispose(); + engine.removeAllEntities(); + } + + @Override + public void resize(int width, int height){ + // It's important to call the resize method of the superclass to ensure + // the pixel perfect camera is properly recreated. + super.resize(FB_WIDTH, FB_HEIGHT); + w = width; + } + + @Override + public boolean keyDown(int keycode){ + if(keycode == Input.Keys.BACK || keycode == Input.Keys.ESCAPE){ + core.nextState = game_states_t.MAIN_MENU; + return true; + } + return false; + } + + @Override + public boolean touchDown(int screenX, int screenY, int pointer, int button){ + unprojectTouch(screenX, screenY); + + return false; + } + + @Override + public boolean touchDragged(int screenX, int screenY, int pointer){ + unprojectTouch(screenX, screenY); + + return false; + } + + /** + * Calculates the aspect ratio of a given width and height. + * + * @param w The width. + * @param h The height. + * @return The aspect ratio. + */ + private float aspectRatio(float w, float h){ + return w / h; + } + + @Override + public void onAssetsLoaded() { + entityInitializer.setLoadableAssets(engine); + assetsLoaded = true; } } diff --git a/core/src/com/gamejolt/mikykr5/poukemon/states/MainMenuState.java b/core/src/com/gamejolt/mikykr5/poukemon/states/MainMenuState.java index 3142767..24cc8b7 100644 --- a/core/src/com/gamejolt/mikykr5/poukemon/states/MainMenuState.java +++ b/core/src/com/gamejolt/mikykr5/poukemon/states/MainMenuState.java @@ -36,9 +36,9 @@ import com.gamejolt.mikykr5.poukemon.utils.CachedFontManager; public class MainMenuState extends BaseState implements AssetsLoadedListener{ // Helper fields. - private AsyncAssetLoader loader; - private CachedFontManager fontManager; - private boolean assetsLoaded; + private AsyncAssetLoader loader; + private CachedFontManager fontManager; + private boolean assetsLoaded; // Buttons and other GUI components. private TextButton startButton; diff --git a/core/src/com/gamejolt/mikykr5/poukemon/utils/AsyncAssetLoader.java b/core/src/com/gamejolt/mikykr5/poukemon/utils/AsyncAssetLoader.java index abbf9f3..bc04acc 100644 --- a/core/src/com/gamejolt/mikykr5/poukemon/utils/AsyncAssetLoader.java +++ b/core/src/com/gamejolt/mikykr5/poukemon/utils/AsyncAssetLoader.java @@ -17,10 +17,12 @@ package com.gamejolt.mikykr5.poukemon.utils; import java.util.LinkedList; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.utils.Disposable; import com.gamejolt.mikykr5.poukemon.interfaces.AssetsLoadedListener; -public final class AsyncAssetLoader { +public final class AsyncAssetLoader implements Disposable{ private LinkedList listeners; private AssetManager manager; @@ -43,7 +45,10 @@ public final class AsyncAssetLoader { public static void freeInstance(){ SingletonHolder.REF_COUNT--; - if(SingletonHolder.REF_COUNT <= 0) SingletonHolder.INSTANCE = null; + if(SingletonHolder.REF_COUNT <= 0){ + SingletonHolder.INSTANCE.dispose(); + SingletonHolder.INSTANCE = null; + } } public void addListener(AssetsLoadedListener listener) throws IllegalArgumentException{ @@ -92,4 +97,10 @@ public final class AsyncAssetLoader { private void checkParametes(Object parameter, String paramName) throws IllegalArgumentException{ if(parameter == null) throw new IllegalArgumentException("Parameter: " + paramName + " is null."); } + + @Override + public void dispose(){ + Gdx.app.log("ASYNC_LOADER", "Disposing asset manager."); + manager.dispose(); + } }