From 8ac22505e342d47e78caa9a63ab439d6955e7be5 Mon Sep 17 00:00:00 2001 From: Ritchie Cunningham Date: Thu, 10 Mar 2022 22:57:15 +0000 Subject: [PATCH] [Add] NPC class. --- bin/tfg/AnimatedSprite.class | Bin 3944 -> 3963 bytes bin/tfg/Entity.class | Bin 506 -> 1710 bytes bin/tfg/Game.class | Bin 5852 -> 10897 bytes bin/tfg/Location.class | Bin 3346 -> 4232 bytes bin/tfg/Map.class | Bin 3673 -> 5260 bytes bin/tfg/NPC.class | Bin 0 -> 2457 bytes bin/tfg/Player.class | Bin 3581 -> 3537 bytes src/tfg/AnimatedSprite.java | 1 + src/tfg/Entity.java | 40 ++++++++++++++++++++- src/tfg/Game.java | 23 +++++++++--- src/tfg/Location.java | 14 +++++++- src/tfg/Map.java | 42 ++++++++++++++++++++-- src/tfg/NPC.java | 57 +++++++++++++++++++++++++++++ src/tfg/Player.java | 68 ++++++++++++----------------------- 14 files changed, 191 insertions(+), 54 deletions(-) create mode 100644 bin/tfg/NPC.class create mode 100644 src/tfg/NPC.java diff --git a/bin/tfg/AnimatedSprite.class b/bin/tfg/AnimatedSprite.class index 7287744b73f3b6dedd80b288c5c02ba31a397bff..db361aab9ecfb380481bcd65dd179f3f360afbd3 100644 GIT binary patch delta 1875 zcmY*aTUV4-7=AwH{LRM0w9piFu^drmL{Tgc%Wy<=1Q{3=3`RUO97K?V0v^a}D0Nax zQ+A?;htdKqHI5@5va4EFm#x)RH{G@B2eekLvS)wasCY4Z@Av)odwSmI-Shjbe`e`F z{&)WofIK`J)O%BO9U4{%1h87>+UCjrlt{2hU;}1qNNw+E-J9Ri&>Zb(Xl-#}2|@xT zNYmh`$PX14m9Ezj#wG_gY7iZ}>T^P^HO5te%_x&WORh7FEdsBjLUvhlvm*jqp=;0% zxiBBw1hyMer;a(;DewlO8Z7Pmt2LBm$;sL@`IjYcbB!{xyLhEe8Q68yqrrjQ8YVPG z4@7gCqAm3~CDD%E0*%;12hr+w4c4rnFKAuW1y}v1?2~cp9T~ALw7(~C z1V`m5+fsWR#~pZI{$QJBIf0Y%58JEGI6f3Oh0}7LeaX}_0#k5S`Sn#5sj8*G$2ceV z*)tcP$3+J&5H1D5+J?5e8U>fYC+HmgOsQ;IfA4-S+8({SvMUyo^uf zpZ1-T`j!8wI?m&!z?b++Zgpft&f~Vg9emBO>+;LWHB1b>5Mrf^_Xh=r)D>H4cyoE7 z(u@d<8k(~37E^OqV9an+v97G#f&21j$1T@w*kB*aB0zQ>=PK;9t56y$SV2)F#j z>01!Q3ap`=VO~W6)>5Jo)?p%ZDG3+SG9zivKwbf(T70h&>>xC!N)6{bbZog#| z8U6T)qN!~*v{pkqn(1j)+C`b37DH__)K@7|eIZlyTt>IwZYWPOIP+`mLzkybYI=#c z-P<_MXtqi>?xB*VX{OL2_vz^|1LOj;;^F&VD_{n>fUihE7@F_G%ksz1x?g zO7OtSwGj^Nfj|@c*KBlI7#;N_y=$~TEWdT9FIF}>eFN=`-(lRHV#xMqjIiS^!olIj z+jvL1g*RJSsp!Drao#5+Ejp>UKvN;r+p|@q$I46miW2O8Wt@va2~y@cE6u!*Fo&b8 z^%!O&Zg@7?>3x=q*We^4l0&8NQS6MNi|ceoJ;AzFR$+E_g+GCJ6F8=hF%_H#9~sDP zkxHY{lxxS!{7{vYYva2}+XOzKykdYp&FPtA-cz*5KiWrqF$h6 zUa~zk&HWKQaX`8g=#esYdF)aoeMT~vxmDf8mC^+&mc^LVTy_xXfs>Q3<03iIi`V$L z1W2}gTqQ9-WBhB3|2fHcgZ#K@oBE#q#U}cjymNRgVqdFHp?tZ@g vOSv!O&=znvu`^Q?Mv98vs!T6jg$_J;qQ=UBj0bAHhvF9(ru>k1Q}E6I)!}uz delta 1870 zcmY*a>r<3f82=sizI!lTLsKvra2ashJ-gD0LywBx#p6BsYk~!7d$?l>_L_65ss6>^#bFXB6}kF&5@SI z{9vSGyTmp$s&!7B>#3Y;+u+H>X73-Uxl{g2b4%mHjI&r~)E|y4N zdu6n(p-z`bq8p#GI<0N>(UwRvZ!^_CtD!9Lx25xo*G;j;SEUOoN`9ec7Ho#>ai zfiG3PBiq@DuO)8cmOAOkT+oR-5(Bs;U@Hr4s958o?U2M>LsK5wXlfD?Nv*MlSCv;d zFsgoW+;m-s4HouvxjN@8OdsSajr|1zaI4>(e*aRQvrP*u!<&?7i$c5rVVss@0zCv) zsKu^8Y-PXj2Zm8Fgw=iM4)D0x>*Sh~#M%V(tHnvIE9LHgfEksuhEWmc5{{1`Zxow@ zvxo6EpPJfH)E4MInf z?)J&9UYrZq4dn?YC%zqhIOuIrFS>)V*4(j9IT~){l=D8;)7;uv{<3L#vMVI8hv zJ-f95qo}|)*oepE@y~Som2Q8L$xpFaWTHxBV~bcq>Muu)C`Bz(0> z!9;ds6Ka?&o!x0bIoe?-*vHt94xR*d(=!Y1tS3;_o~fcp?f3X&y769ExklkY6C`%9 zz0F1%X*ArMN+Ym`w-A_0+oepA#@!y6l|aFB3b_q!8{xGZ5hj^dsR*>kURH}EPRRRp zER`dt&(;_;Kv1WzXXYK3^3t#^5L$Tv@2Qz}% zjw8syQ6sWR>)ikF>tjqO=fO|v za+|ARG?{YESeY-vDY-trjeJkyIORnHjA@SCB;81I!h_Su#ToMEG}hwmm@0%)Skv?; zDuqkM(=$A$7>Sd0CW-T^FMVO`Vr6DlDw(;3M{ud^6`jju>^#;L{7N{{Mb>s>Aui$# z^e}!exqF$s{fzmqGXFJlwVxEaVc-ZD>}X8kaH1Ml=r8zerHAf#1E1Jce9lC=SsvK_ z!9pSIR-3NpHB!;6XFhjbPn!n#ya;CN2gY35W+of&)L+Iucu1wZ?&aPxa(EkbO_DBPjX*Ldf@Nn}!Gf0wB+HHUIzs diff --git a/bin/tfg/Entity.class b/bin/tfg/Entity.class index 3934c27627e841ebe4fd4c653dafef7f6a87c6c3..083ac670504c0ad79155d8b3c2024397d32df789 100644 GIT binary patch literal 1710 zcmaJ>TT|0u5ItX82u*`r1QY}X1?>f?3JO{%AQwf8IF{i(w4sFQZPHZ7|Kx+tV4d;7 z@!22cc)ldGX(_(syPZ9|dv-T}{{H+0U=8~U0s^XiQb_KUZPWg&AS5t&rhn9vMZH`| z9vq(;Ia@)mz^#f^NS@VBO2uTs(yOOtu9n=k^iTS6(NNGQFw!#Hs+6j_C0_)>hQpkx zW9Y`K2 z81_Y^)Fc{fk39@Zq9F{G(3&4Q6m3V!&_t2p<*AmyPBha+$qz<3FQc^RHFY&0Yg3q7 zDt08@-_;O-reYTN70d|?OL5!9)9?UMibmE8ji;DNmjFDmRm3r`AR#b*B}l^^OjCW^ ziB@2y8(&*O1lOF%{|ok#Be-78Gf$b>qJ|||N=0{@f@PxE?_2$#xoXRXa8+5+(2r}B zyhJSX_F*Gl5#8wm&Gf7Y)_@U>l$uiT*W4~6ucyvzjrmPVq4%+t@r4d zjXWC7w5GuwqLj<}T3W7g=(3f%l{0otIU^C*@q)BrwX$ZRtlM>qFWJjH-PFDq#FP)- z8p2h7XQxx48Dt86ij5x+w`CAkW&J@FqH{>DuJBmDL{ zmnufN*IWR`aDyiy)#JC__#6{oJB%m08c$-%GfvZ0K)Q-2zGI^0T6Jz`nZ=yLFy^8> z_cFBG%u7bicJ;Upm~W6={qb|mG;l95-$1OBGQmvd9m;7J+@$QsLoASr1Qg^E9SS^d zO7x5;`PS!>Kk4LMq})rsWc!**J%zNDO0^}s+{v)aWLK_8_Bo3t{l7rU<7$=c9Lt@m zr+k6*Gy`F4dd3?}PO7dknTbRL=>|5w@a!-9x-S&1DUyaAHh>u1WTWqTY%z~598dg) WXy8>R6-UM)mk#!v-5b1h*33UzJWKfi literal 506 zcmZut%}&BV5dMZjE2V-(Me*jXKw=+2I=t0B1#kDS}ZBiB!-%1mWi3cCRhceD? zF^cgrJ2ULv|Ob0yV-gF0bj7T?EV7UyYrk<7$Y5t_n$j*2Ov z9cetbv64l8NU)D&F4dS|1%nBpeo|Zu7ZzF`9IO#Kk<7*U;w};8Rh(pk(ADg05|>iX z%Vk~N$~nO^@>LubZ>2(gdvUa2uvUt6u(*0$EIZ>?L^wzjoaYsp-s&&N5ETE66TMG)6pR z(FjFDX_%Wv2^#TlyyBseG$M-x2$3xSom}godXhz<*Jo4L{8`F3dWm6wE(n3W!)K^e%e>5JcY+Ju7 zk_?4cIV&R35RTP`lTqfB(r#T7MHG7UlX)2+y6pAgXk5^MyyYjaq5N789x{TzsuV4u zVF-_88*1C(TM@le^3tq!Vz+a?X<}|d zGdD*E7Fiaprl_0Nq>@x98jC1eOY1PvU{PhMu^8*&!$w-qK7<*1BU-gBb%_(V&58!l zK(2+zXd&datZ-waH{Kd;#p>+sc-_G{`L%A^kQzp1RY@jc(itVONK@;kOxld6$D13b zc&Lre=LcROD4!pAQmQ*ylV6)j7olUPuc?`IiPPCsH(i=qPfp(P&=$IkJHH&uHrQE{cB8X9I7-9cFAS0jqLots+ZC9y=qIuGsODB3|g6(JwOk#`&)u(11NLT_mFQ+bYgK^G=}{xlO9GA zEUOC69_gWd^a#7A1Jlg=CLeQ+1Bwn(C&DJ&+>9Mk(6BsT{z;Wny~C#a=&+*4=y4A9 zgtJv*wZaJ}4oD}fClo!&&sS~DjaX<-eO`f2D|&{$kHx7PbO( z9;a2cUZSE5#g0P91TyN$j@KnfN*>)$s-7p#d#WA)a>C-Se%aILGtwOwa6_;)+^`Ny zT4y{S>C1|KO0S?%b0QYgJ01dIz;P4yVSC^#Ij0A`Mn8Ac&v2mVHis!y^b2|&W{Yxd z917BUX={zf3Uxi`(aW#s4LAMT^m1IOqTkS)ycjX36AkYigyy*EZMd;Juv7U=@7aZV z1{`?rDjGt+MNfJ8%aJGFqTeZckA4qDtKQJZq*?dm9&<hl@X;kKFVjj$HrS<8)<3 zAJZSOaudnMXgnO#9`~_>2pPYp})fT;T9ZD^w3)NOn$RLH zAFjj*U0%fHqm&rU<#wGn7~wp$C z{A8c$5+~F#{zg%##AJ3wA18klVIlK=8jZ9d0L4@#rlkTf5>E1bPg7!s!0E3KwvD2A zbUhMKW3V}imFp~8w$SlEIc^?XM5z*9o=0!<_|iyIxGjdAX{1=F#3C+p zH%43dJp_k8v6z?HV1%^rD^VdTVcQM-ri1)88cE?~vzidp0mUw>Qep}F#40K+WezG4 z(k?7!s#T(nDXX}sq&(;^3hF4RS7KSWwyLPa%XQCG;w;^=glVM`XEV7<0u>cStXZW* z18eNkR5uYNnplxh>h*g=x{ozVL>-l{)>o=k>y(H&%>s3m+z+BX!3v>^&ru@DWO*y~ z_*<1|V|IC$)D-!-{zgU5(^vd!lMl>BW<)ChSlM**OsN3#U z;uZ&Ia96h}al3;v8ShZyP6uZ(-mSzv4xY| zGpxw;7gr;0yjuCJ63;oxl0apsI-r~WK#3nZP4NoGJ-?s?o`^yCgNuBQ>c>j_gjH^T zus#^_R&ceKmG~*^gr--Ocun_G;jOIU;-4$=3sz)S)c8ZbDt|pIf2qW;bQ>K-Zz%B_ z-KMgpLVN!$CEhj)?f!R__^nZB2mVfp_l!cj@O>pdFpBB?h>w)`*eJ9cKT+aSqtK50 zqY{5I3hm0zmH3NMXlMRSi7$*oyYovW^!Db)NUMrU^GXL2rNpr`9S>Ow zC1sk9M=fn7U1>TVxO6L-nWp2hOOKL0(sVq0*;C10X*!;P%vQ2bnvN$S`zqNlO~><) z1C$)dIuT$RtmF_)RZPQ_JcTK}n@^<#Z)aV?}0l zcl64cO3reW-O(#&D>;Xi8P(oUO*My=oTub`R=KKu3m0)j%LPgnIh9OA%Mv9^S>>+o zifCD;BMR|b@cuY%`tk<1{e14r}<#Hv@)b)A&$Q4SiWOCP3mRF{{5ms^)>!jm}MkOP< z0iPS>Y9-fbTFSIm$#t4|-ATMD_oc7gGJzNW?jv<&BG}fjrYstXHF}fDMAA)zv7t%4 zFc0Ak?E{HKULo6XfAo#}SlaQxImc$9$wnp5<>PNgi9ZnZA{IW7o0U9|Rcc|8uhLt( zvMf+i6Xb#ml)R7&1}+XDtN2RFR~FZVLV?PaRn^{Ls`152Ucz+-omi(D8&*-O(xpmn zone>y`t;FUujCC};DH4~-Lu`LZ_V z)2ZRD40)@aLEf(9cl0xz6247i3*V{aU99fmsJrHLkCOMYzK^4?TjcfnS9X=QD|tVc zy5R=jGUovgDET1kRLHwDv@-Q%%rTf~OEyHxa3zCv!*^MeIKEKN7mr7hC9yCL*8Iwk zLl4$BzwXc|yqj3Kk@k?}3rhUT;p<6gv+!F&pTl>K`Zq2YbvZ8DG~=30OI&SXUx)k51fOesGyhBiV!66!6aD+zIAEMC*X-q+m=OB%RVtjocd2t`{ z?jg!QNE4x$gc_3%(iHrhR^LIVb2m`)Ny@3v4&%0hzgI-RMAt+22M z6WvqLN!zWtIahg)&<>dDn#z=%ZJ*jn*Vf_dhECc&)74H*sCuiz-(*nRKz;94AqLyJ>HV{^24<;Ux6pV@rt}EytIv7p5bYm&`M|9B zRh{%`CmrgfBi3B5er+93xRajRdu%sP*ur!O*QAI^4BdurGT@yoc%~1$G6eUgBWNk* z;j}k_&ZI)roJA{Ph_i8b9fmnpqD2F0HBvpULK|oeZa>%3<+P5rQH-uZyPGMY4OI<~ z!x$+;WzY@uEJ}F=?WE^$)|PnUHu?em5Mvrb7txRK%f^$>p%-wRbm6(R^df$_@stVl zW3|ooYJ7z;x{ptv#bdoRY2`skQkXVobVroYwa35cyi`NsYWa44QN* z+5q!!#7f_UK-dhUpAR=(0LNbh!(U8IxcA*gTj^T5jIO8cNL3qP;Tz~)x{)3N9j4uI z%}w+&9RCK~{T^;q|3r8zp<6`;-6nd{9o@-5^h$-p5IRpx6sN+{?9w9Yc?|ziVQ~_4 z<4%l@A>x?a^p@rh z(S3MGd)i{o>{`sYpiT906>4%HUTrin1>y>PrgVzwonjU%@j>TvSul2r1rS$siV`M# zN}WO!q~+q#dQm)t0qjQ}euPF+2V(hAH$~4c=a**4=3ND&v z2x;VKrhzaQ%{J7?RBC87(;`D_nf!*wJ@D-D4%JZp$$x313Q=vGqjs&xuHEwXBxVd z=`2IvVOnA6E~b@+?q%w-?)^+zrtCqcVnYuxc?|7mDlvrIe>A&?p@U4y&|#*YhK?}h z8+wXqvZ3!YjW_f>lh4qPnDPw0$W&nHC8l16USTRU^fRV~hF)jtZRpob!wkL2bc&&O zn1&ldqCT2E!qD%TMjHB%X_TQqFpW0!8Pga;e`d-x^jD^_hW^e}VdyKSN<;r-3ZzJ4 zsUFR)GGs9=F_ghnZ77Q=Xh<=I4E1KJF_gnpYp6d{wxK~xeGCm{T3~26(;0?FF*O;= zWtwhiJX4M#94wAzpJoUrk)zpt4NYb`)zCDiDTZb+O)zvi(_BMynHC#5gK46nVx~zc z5(Am~nKCcaR6~oHW*91Gnq#Pvsm#z4rv8RPO!E!ZG0ifxjA?+Ovp}|iv$?3;Py^Gz z6bYMYkSS|o8f+-aG{jJhX{bZ>j|$&@Y@gZKWQWN(b|(Ds0^|gmPBS5AQ89TT%czQi zkRdvY&V~%*EER`L(7ALTe}MdizMy|VekE+-mT~;YLyqVVIY5jQV<2;Cmx2}FCG_9LOvy45I=_e ziFjT78uAVCp7;RrL-D!z8{`*wpRi_;Fw z>?iD}A)m2dv|oaJ+5VON8^|~9_wA1$KeqpB{~hv6mvp&g+?CcF1#5r()USoQfq*j_-Hn`Aqc$Q9Zcp> zC+}u52Ss@w$Q=3QcLAxA`bXtC`*Eq$z59$KWHBoE*4<|XA&cR!rDB9EhS%WDge*oE z;^hxn41Zy>i*AP8LwD1CknMPRIRJT(o~CCZpQD%P706fdR|{`LzC$0;Cy<|Z?LL;s z0DtT1rYMa)d3FB>ad5(l|JI<^UFk29avxHPl;4vNLFV99?`x4MA6_sRf93F&+`nM( F{{Ub-*P{Rc literal 5852 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 Jpo;IT{|{*Yr4j%D diff --git a/bin/tfg/Location.class b/bin/tfg/Location.class index 0e24d1acc5ca4417ad13b996bef96fc01a4640c2..d8bc6b4da4db6852db27f3da537ffa9b6644c951 100644 GIT binary patch literal 4232 zcma)9{Z|{u6}<}*0OEF_sy=vq5$pT>}uc4ygTpRx$|cD z*MI)@Ie??M<3o)Gy)ZZ5J#Hn8Ldwec;L#9VFqVw&w2_(bp1QDLCJH{(Y1p~mI+V6D zrg0%{`cSW7m#f2C%o;iA(a@N-5~r+uN?B3e+Cs6JvG~yF`S{?m@!=4=LzQj~HRr}O)b*z_sltE;Z+L7h zGOfWgWF^f8?8JRO?9vd}fT?3QbdHTpor#b7q2YcV&1hvd^sbs-z?#QX8FR9@c)`rY z?fhDVv-Gr)ONs3?dI}d)c@0epp-d{{*OvJ(NNvTBT0A6k9ner4j!gS-P($mM3!kI_FQwci@O~hzJVD=+n9F)J`mmpPq=B! zn3vb**XiuSZwXhyi-%4R*O*2lnJfcH!e7(T3&v5)b`7!Z=HD)~ZTd9SXDiwa=8G2! zIU`XaQDXSIj;B-%?4)r8wg^WvWRX z0ZdW-;mEl$Kh^&Y9j6h~;InecRK`dv*|A5%8J$I-N4{osJYj#$>Ub27NmZbb%i-Be zyl&N)l=GqS|0hzeVn78rVPu^>(#V+2T-G9+q@p7{GPbo~=lXmg{afyjIX?^}Wq%OL z8y*>nOiMoVI=XPAfyynQB=#cS?A}`jYZG<(~x21UI`nC&~QRK6xN!e;6 zTm%-nEY;)6crcm#pCxgQtTj>lYT)3aRm>DL_!Grk&di8NX;h?;mx8h^`dX3V6>+VK zUA&1^XFgXn(sbKl3%0zHeUY;w^%rz}2jA0hU--+;k+aN%nyD{Xu>#dLUp{ z!=80T*v-d^sdUoJ)#FD*Ip@a}yd-P&a@AZ8hOFHcyrSbLc$GmL*{qo%k?mm$WDDfJ zdi<32|L}hCd_z31Yv^+4QO4c|;Vts{?EVoW!Ss3+(%XXc^C~2V&aGpS7~awG1N=}! zLqZ*eX589@bshwpa;7d3!BIRN`QAZm93GAZ{L!}dTWDFso==s}UTLE* zu$L!j8~?y+phlt{`)El&D+O`ni2Zh8R+=-I^hLY(0stwU=5sEt>dUwZBNL(cr14TqU+En{Fkb0X>HuSDsM z-a+^#KWdm1P^TKZ6tr#+aG*7G;}Nz9L2l=0wew?}I)4Q{j`IMg5)SL4oy>bZOPkrF z%ymE^?6yZ$GONQ^$*Dxmvt=_Z7h^WoFtJ9qz{P7kia00*^pWO`Ske2(&&=u+zQP;e#0SMiA3o?gX%WqU-OCD0DK z?RXdQzu9$@$T|hFi}#LNC7%Im9rzYk?mT-E>`U^BY%;qPFG80vfizAbgJ)sk+jtI( z$RUdYUchCRy=BG1qjr83Vy`OovOaUfS>{kfm&Iu~t_XUIT_@Mc) zQ@y#wK8)3cnwy(tz0Y%2C1LF_ed_3Q{T__j#>O=yCiMfE_G=4IdPpA?5G^wZuFg7# z9sEARr=QOW<-5nTB;Kp&bWGdYC)OU1LS99)Z7nI2&~v?BX=(M|!NqIxUbsfLuDeLf zcCyLrVWPl`RMpF9!7H5dRgB^_oW$!4=?%={P15@o=J7W2cn2$ZR}na1CsrZwI?2u| z5nLzbQj+|5iNxnQPYb?J`m-cs1^1)K9SB7E-@evp~h4h z5Sfd%>RHV${{vceC3s(jW0#S7CmfBpgzwTz%E(hhluDqh4M$Q+c>ZJB?o#xD!mw+B zUP(!3*!$G%JSQErXPAye({m43W?QbV;hMmb-x7Y@@>&V6+vb9pZ`vjo;%6oNqB`ym zU2*qR;^ukk%yis|JLn*CGt6-Xlhv``aK#?1#2&O`4-WE#{*{9maS$7#o#e5EUspr% zpI1c;g2&~O#^D>6;vj+Sa?VmvozJ>+y^Id40Bow$YfX8#G#&6&IS-RFPzpN!tZ zA1VI2sa1GpXspukl#Lb|-m>u#4WDhy-o|@3sf{4dx^~>)>KsCZzfo50$NBpNS9^%R swzTbI#$QfKN$vm|Mt%6?3tlg{XFrkG4f%J*{bJsBa-ZUs;^X#z0a6-fv;Y7A literal 3346 zcma)8U3U{z6y4KKI&Cs(LqQPQ@*x4!lu|?mrBE%UrG+*{5?U)_O_OO!Ni$)Rl-4g4 z5fpVPx?IcUn@?TKC*-5B#O3nI2mg~F``k&=P-ygFCimQX&c5gDyYHF&`S&ls0XTv$ z4Af{a^V2h3!*(K`PuUp*x`x1Pd_LZlj%Q}NMyF=2MBYH1hV?76eQ7&m#i!Di24C7v zoU(H%3D(duY&$buv$^THbXRUMm$&A+#u#rq`%~TAiN42D4kwgz)3EGZo}fcZFgiXI z>l>Vm^&TDW4{|wJUe-`^c1T0r;Z!D-@6q514Gp!AY0&%Zq}70RSZ|A zZ*=rbY|sl08%_AJNy7$4ui9R~nub#uD^i%7vYeP(U$Zci9*a9Ev5S*>{(LH@p-~}} zsAK-x0v{%+EqYOl?XuSn4Yi^6F#|g_Y+jQbFP_0Jac^v3lFynjP%oo)6Ae;;mL$_N zR(^%)worR@uIXLD-8#BI!VI(Z$;p;hn_VKSn^#}`i~ zO8`>vK@%_GW%9#$4bf`*S4*wRnuhvpS(|}eVJh#$6J-)5ha)C>R1RFE#7Wv|E6tlQ zZ>9y^U*>!Ydd)> z*}ssmvT{XCoDlsqWt~(eAI--T7h=rclC6eK_%K5ChuY5$d8z(U6Q}T+2E%resZ2br zWXBZ}YoZ(bWOT;Fi|%OL#C|+4cb`HorRN^;idAD#&bx>IPo`9pUnMva&lc~9k2zaT z)+U>zVq0inXl=nxcN=)S%Ke!3ViHqwKN52B2L{^5q#nye2lh1Z7-vkhqD@9A6I;Ps%1t-Psavj<`Wawl*@R3G-lva4O>zs<6E$qqwTIIXIf~jg3* zSZq&4tbU~rY9TC?bUeU;C!{w*xkM@;{pIxhI8;oJy>BhZ!%u)bL&&kJkiaW=)rHg! zu_jT&)$qteXi7f4kv+>e8d-w(kiJ=8#=rxd>{v!*?@#o5gO8lEsIHAqC!ZsHMmm-H zbP8@6rBZy{gp9KV$TGok%rAUcdxL zwZ!(Y!n3UIP1dv(#y?C(H=r3cm+ z1Cuq4e!q{){F}kRJQLChbzGhEevU+2_3UPa-=VGU1V5^D+%{70rV}_OAC$+Cb`_C4 zq~_>q7=EU?30p>>UjBm6ReI1JW-ptcxQ&I0KcL?le}H#>`_+3gd>bF|?CM6BppVn| zh=yJ=0yI1&<0=iqH74$0;TB5^aIaRf)5iAN&fhRw%>n)%qz<6;CB3D*6k|Kl aFlgYjf3RL8_nEw|#7d diff --git a/bin/tfg/Map.class b/bin/tfg/Map.class index e7f8884d11c0eb157061d05ccf0cc3a9eb524797..87bfe14968f904468e4d2e828574c57bb641ef2b 100644 GIT binary patch literal 5260 zcmbVP33yyp75;B#CNG)1E=ft+v`H;Z3zO+GHLWRRO0l#JMAMCw)KDzECNIeglbJB{ z(l)3?u@q2oVc(&+gv~;0vp@wwWf2t>_YF`~L{Jf25v~7u@68sb_51kpW!`=Fo_o%J z&iT)|_dWIB2OkD-3f|CAq@dZ|J&|?BfCj(9)IMW}5s4Y`p2&vneP*Yvp;%#7BH0t^ zOLh0hB0WiCpx5e5Mb;#ZoyPWD)~&5#dNZfEG*y;Ty{2hzHh0;BNh+?%(Ur05t#U`%4l`++yF7Js3JJGo zCAeXd8MiIlGE*Dk^jD#>)$w+amLraqRx4!-$~LPfZnzlg3dyW+fUgy8L(!GoQM|&6 zTlPwYDWR5@tXK8z3jWoJE;9%prt6r784A8oeY=L43e`uAR1npu5%F4u05#UPmqOtk zIy97MI9_39cI(8z1ThEGMSPx)GUyskP?%jnJSQ|k%y+lc>zIVe8Wt!_D-fC>!miw6 z9aAv1lqi?zcqbYZ)Gq$F$jmYw?{a2_Gz105NjgdqEI|{alQdHi+hqQ&_~LgRwB|(azr*7c5h0@DxAhB_L#OpG~}koA*{PQy7jG7_3l)j zqNoIFjgGZwCKqD~qpLZY=x?SSh3TH!{0;T(L7aj2XlO|zBe0eYYj<^;12);OoQ?MBj)cW=^f_gd@*rOsw5VvVR6|9A4Ac?)KhDioO{k5`NN5tW*C z0!a;yVh!C2CF!nF3KP9LEEtU0>1VELYZFh-m%=$Nh<+qA#MAuB7C9L-fD2fdr638?~|G1Eu}>F@`1d=MXE+oqN_X31$NEwXZvjt}D_beJn%mt37lB)gc0 z6LYheV>-V>cSkjRG_NmZnv2^lG+dImJYjnfdvK{l|1xP?&CTM%#rT-ad|ct=+@MU@ znH!FYOKu>p(D6xpiq0BcU1Upc-KR5jw%GrS$X%(>_I9luGdfqZ3l}Kj+{6WO6|NPR zuVV|&1(Av6Y95s71bJz`LB}9=@Eoxnb|@U510%CBk3bYoIZQdGutz2-8j{xKi?UdR zecqI`9ab67Q919@d^!3l-Yw^2+}!CZc4_F=!%UZB(hZ~=M(eXR9>krvTf<#!v{Jii z5gqs7UX~E~x-pSr+exroYeV%pzUPxct`L(QwP_WcC>hA?onoch*}A&Ys|w{4L6Ia1 z2X%ZNUyzzPq+%vrS&rJ@GmT%)b8lGkl9n+55mbh*9 zm`NSq#rK%}9Y$=>+`yh(6>9PD=ZaB>58v1E1F76%^MXMmmJ*MCq~pi<3HSFJsr3$c zUW(4BWcEM=Rnk5Q908@E{rRK05 zSlYuYyg(G}C+V9wH6F7Ucy^i3!GSJPF$ZuEui`Zge_?0M(rk4i7UR`j?)5re$6v{` zR3ga?P4l|1bEZ0XW;bGg*YOWItcqRzBwkx$FxhFkm#PwmY_Vv^@hm|f{{#Fhk~=NG zMvCN;=sbC8b)LM5@>wA_P0E%#a}|`KeH_Q%Ns<}1a%zF=kUZ4gg6XyxNroE9O+p#o^<#SW*DC7grz^C_ck+^3w;xf~Taqw`?URv%@z zqmy>JI9rLLBLv~spp?>RfInvxI}xjOBZgLr`Y0L<&#F0yo-y7(Q{bzv1vraL5nxT=G1bz``uNv1;!gv-}wlhKEn4C+=^N4HJ`2GDkO32Z_$n&A5e0E~EUdwCiIpcpbNKffHoXeOr15W`rq!U>sk%0h44n z_5=d{dwus(lUqr%nKs}`+P|6&@)|bTYZ1Y9Xu|b4jdR(mYR+J8&R|}J!wzPtsuD0> zYc$rQk~@!w`v7rEtdN%g&U7N zuOy0or@gocZ>IiRn50|Tt!`rqZ|7IeEm+Lt2|_ojOEL(TcnC|_KYxm!5kn=9gP-FU z^!k^Sms)q%p5>aLFGbOtDAVw$z<&QkH$<~3} zl!giNP8z$5fw;#3$95wcGT>%9K$K&aNfv{@!;7B5%P1`In&-u9{V*yPrQ@}3!NO7e zp07@jUY=-rKfSzLf5Hq8 z)g^oi`@({19DmLxvpkc`R)*tm=>)!##a2ab0f(q|gy-2Pd-MqEF`g5eu!paPo=cA0 W(3A_R3iyc1g*1tSe^ONu{`EiZLoS2> literal 3673 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 { /** * The entity location. */ protected Location entityLoc; + /** + * The animated sprite representing the entity. + */ + protected AnimatedSprite entitySprite; + + protected Map parentMap; + /** * Get the entity location. * @return Entity location. @@ -24,4 +35,31 @@ public class Entity { public void setLocation(Location l) { entityLoc = l; } + + /** + * Draw the animated sprite. + */ + public void draw(RenderTarget target, RenderStates states) { + entitySprite.getSprite().draw(target, states); + } + + /** + * Update all entity logic on fixed timestep. + */ + public void update() { + /* Update animation, ignored if no animation. */ + entitySprite.animate(); + } + + public void setParentMap(Map m) { + parentMap = m; + } + + public Map getParentMap() { + return parentMap; + } + + public int compareTo(Entity e) { + return entityLoc.compareTo(e.getLocation()); + } } diff --git a/src/tfg/Game.java b/src/tfg/Game.java index a7312ee..7974d08 100644 --- a/src/tfg/Game.java +++ b/src/tfg/Game.java @@ -47,6 +47,8 @@ public class Game { * Allows the window to shift focus. */ private Camera camera; + + private Map currentMap; /** @@ -64,7 +66,10 @@ public class Game { public void handleInitialization() { window.create(new VideoMode(windowDimensions.x, windowDimensions.y), windowTitle); - player.changeMap(new Map(10, 10, Tile.SAND)); + currentMap = new Map(10, 10, Tile.SAND); + currentMap.addEntity(player); + currentMap.addEntity(new NPC(1, 0, "Clefty", "npc1")); + currentMap.addEntity(new NPC(3, 2, "Clefty2", "npc2")); camera = new Camera(window); // window.setFramerateLimit(60); } @@ -120,6 +125,16 @@ public class Game { break; case LOST_FOCUS: windowFocus = false; + break; + case KEY_PRESSED: + switch(event.asKeyEvent().key) { + case E: + player.interact(); + break; + default: + break; + } + break; default: break; } @@ -148,7 +163,7 @@ public class Game { * Update at a fixed rate (20Hz). */ public void handleLogic() { - player.update(); + currentMap.updateAllEntities(); } /** @@ -159,8 +174,8 @@ public class Game { window.clear(); /* Draw each object like layers, background to foreground. */ camera.centerOn(player.getAnimatedSprite()); - window.draw(player.getMap()); - window.draw(player); + window.draw(currentMap); + currentMap.drawAllEntities(window); camera.centerOnDefault(); window.draw(fpsUI); window.display(); diff --git a/src/tfg/Location.java b/src/tfg/Location.java index 3b8abef..6cf8053 100644 --- a/src/tfg/Location.java +++ b/src/tfg/Location.java @@ -7,7 +7,7 @@ import org.jsfml.system.Vector2i; * Contains a position and direction. * @author Ritchie Cunningham */ -public class Location implements Cloneable { +public class Location implements Cloneable, Comparable { /** * Vector position (x,y). */ @@ -160,4 +160,16 @@ public class Location implements Cloneable { protected Location clone() throws CloneNotSupportedException { return (Location) super.clone(); } + + public boolean equals(Location l) { + return locPosition.equals(l.getPosition()); + } + + public String toString() { + return "[" + locPosition.x + ", " + locPosition.y + "] Facing: " + locDirection; + } + + public int compareTo(Location l) { + return locPosition.y - l.getPosition().y; + } } diff --git a/src/tfg/Map.java b/src/tfg/Map.java index b9d1a11..efd3a52 100644 --- a/src/tfg/Map.java +++ b/src/tfg/Map.java @@ -4,6 +4,7 @@ import org.jsfml.graphics.Drawable; import org.jsfml.graphics.PrimitiveType; import org.jsfml.graphics.RenderStates; import org.jsfml.graphics.RenderTarget; +import org.jsfml.graphics.RenderWindow; import org.jsfml.graphics.Texture; import org.jsfml.graphics.Vertex; import org.jsfml.graphics.VertexArray; @@ -12,7 +13,10 @@ import org.jsfml.system.Vector2i; import java.io.IOException; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; /** * A map or level for the player to interact in. Can be created @@ -35,6 +39,8 @@ public class Map implements Drawable { */ private VertexArray vertexArray = new VertexArray(); + private final ArrayList entitiesOnMap = new ArrayList(); + /** * Create a new map of specified size and tile type. * @param l Map length. @@ -141,7 +147,39 @@ public class Map implements Drawable { /* Return true if the location is greater than 0. */ return ((coordinates.x >= 0) && (coordinates.y >=0) && (coordinates.x < dimensions.x) && - (coordinates.y < dimensions.y) && Tile.getCanWalkOn(getTile(l))); + (coordinates.y < dimensions.y) && + Tile.getCanWalkOn(getTile(l)) && + (getEntityatLocation(l) == null)); } - + + public Entity getEntityatLocation(Location l) { + Iterator it = entitiesOnMap.iterator(); + while(it.hasNext()) { + Entity e = it.next(); + if(e.getLocation().equals(1)) { + return e; + } + } + return null; + } + + public void addEntity(Entity e) { + if(getEntityatLocation(e.getLocation()) == null) { + e.setParentMap(this); + entitiesOnMap.add(e); + } + } + + public void drawAllEntities(RenderWindow w) { + for(Entity e : entitiesOnMap) { + w.draw(e); + } + } + + public void updateAllEntities() { + Collections.sort(entitiesOnMap); + for(Entity e : entitiesOnMap) { + e.update(); + } + } } diff --git a/src/tfg/NPC.java b/src/tfg/NPC.java new file mode 100644 index 0000000..46adb5c --- /dev/null +++ b/src/tfg/NPC.java @@ -0,0 +1,57 @@ +package tfg; + +import org.jsfml.audio.SoundSource; +import org.jsfml.graphics.RenderStates; +import org.jsfml.graphics.RenderTarget; +import org.jsfml.graphics.Sprite; +import org.jsfml.graphics.Texture; + +import java.io.IOException; +import java.nio.file.Paths; + +/** + * NPC class for interactive non-player characters. + * @author Ritchie Cunningham. + */ +public class NPC extends Entity { + private final Texture entitySpriteshTexture = new Texture(); + private boolean moving = false; + private String name; + + public NPC(int x, int y, String n, String spritesheet) { + entityLoc = new Location(x,y); + try { + entitySpriteshTexture.loadFromFile(Paths.get("res/"+spritesheet+".png")); + } catch(IOException ex) { + ex.printStackTrace(); + } + Sprite sprite = new Sprite(); + sprite.setTexture(entitySpriteshTexture); + entitySprite = new AnimatedSprite(sprite, entityLoc); + name = n; + } + + public void move(Direction d) { + if(!moving && entitySprite.finishedAnimating()) { + Location newLoc = entityLoc.getRelativeLocation(d); + entityLoc.setDirection(d); + if(parentMap.isValidLocation(newLoc)) { + moving = true; + entitySprite.startAnimation(AnimationType.WALKING); + } else { + entitySprite.startAnimation(AnimationType.STATIONARY_WALK); + } + } + } + + public void update() { + if(moving) { + if(entitySprite.finishedAnimating()) { + moving = false; + entityLoc = entityLoc.getRelativeLocation(entityLoc.getDirection()); + entitySprite.updatePosition(entityLoc); + } + } + entitySprite.animate(); + } +} diff --git a/src/tfg/Player.java b/src/tfg/Player.java index 6f18cd2..2dcb753 100644 --- a/src/tfg/Player.java +++ b/src/tfg/Player.java @@ -3,9 +3,6 @@ package tfg; import org.jsfml.audio.Sound; import org.jsfml.audio.SoundBuffer; import org.jsfml.audio.SoundSource; -import org.jsfml.graphics.Drawable; -import org.jsfml.graphics.RenderStates; -import org.jsfml.graphics.RenderTarget; import org.jsfml.graphics.Sprite; import org.jsfml.graphics.Texture; @@ -16,19 +13,12 @@ import java.nio.file.Paths; * Holds everything that pertains to the player (you?). * @author Ritchie Cunningham */ -public class Player extends Entity implements Drawable { +public class Player extends Entity { /** * The texture for the sprite. */ - private Texture playerSpritesheetTexture = new Texture(); - /** - * The player sprite that supports animation. - */ - private final AnimatedSprite playerSprite; - /** - * The map the player is currently on. - */ - private Map currentMap; + private final Texture entitySpritesheetTexture = new Texture(); + /** * The action the player is currently performing. */ @@ -51,15 +41,15 @@ public class Player extends Entity implements Drawable { entityLoc = new Location(x, y); /* Load sprite texture and 'stuck' sound. */ try { - playerSpritesheetTexture.loadFromFile(Paths.get("res/player.png")); + entitySpritesheetTexture.loadFromFile(Paths.get("res/player.png")); cannotMoveBuffer.loadFromFile(Paths.get("res/stuck.wav")); } catch(IOException ex) { ex.printStackTrace(); } Sprite sprite = new Sprite(); /* Create a new regular sprite. */ - sprite.setTexture(playerSpritesheetTexture); + sprite.setTexture(entitySpritesheetTexture); /* Create a new animated sprite from the regular sprite. */ - playerSprite = new AnimatedSprite(sprite, entityLoc); + entitySprite = new AnimatedSprite(sprite, entityLoc); cannotMove.setBuffer(cannotMoveBuffer); } @@ -70,43 +60,27 @@ public class Player extends Entity implements Drawable { this(0,0); } - /** - * Change the map the is on. - * @param m New map. - */ - public void changeMap(Map m) { - currentMap = m; - } - - /** - * Get the map the player is currently on. - * @return Map player is currently on. - */ - public Map getMap() { - return currentMap; - } - /** * Move the player in the specified direction. * @param d Direction to move the player. */ public void move(Direction d) { - if(currentAction == PlayerAction.NONE) { + if(currentAction == PlayerAction.NONE && entitySprite.finishedAnimating()) { /* * Get the location relative to the current location. * e.g. NORTH would return the location above the current location. */ Location newLoc = entityLoc.getRelativeLocation(d); entityLoc.setDirection(d); - if(currentMap.isValidLocation(newLoc)) { + if(parentMap.isValidLocation(newLoc)) { currentAction = PlayerAction.MOVING; - playerSprite.startAnimation(AnimationType.WALKING); + entitySprite.startAnimation(AnimationType.WALKING); } else if(cannotMove.getStatus() == SoundSource.Status.STOPPED) { /* * Play the stationary walk animation. * It appears like the player is trying to move, but can't. */ - playerSprite.startAnimation(AnimationType.STATIONARY_WALK); + entitySprite.startAnimation(AnimationType.STATIONARY_WALK); /* Play an annoying sound. */ cannotMove.play(); } @@ -119,16 +93,16 @@ public class Player extends Entity implements Drawable { */ public void update() { if(currentAction == PlayerAction.MOVING) { - if(playerSprite.finishedAnimating()) { + if(entitySprite.finishedAnimating()) { currentAction = PlayerAction.NONE; /* Actually move the location. */ entityLoc = entityLoc.getRelativeLocation(entityLoc.getDirection()); /* Update the sprite with new location. */ - playerSprite.updatePosition(entityLoc); + entitySprite.updatePosition(entityLoc); } } /* Update the animation, if there is no current animation, ignore. */ - playerSprite.animate(); + entitySprite.animate(); } /** @@ -136,14 +110,16 @@ public class Player extends Entity implements Drawable { * @return Animated sprite. */ public AnimatedSprite getAnimatedSprite() { - return playerSprite; + return entitySprite; } - /** - * Draw the player on screen. - */ - public void draw(RenderTarget target, RenderStates states) { - /* Get the animated sprite and draw it. */ - playerSprite.getSprite().draw(target, states); + public void interact() { + Location interactLoc = entityLoc.getRelativeLocation(entityLoc.getDirection()); + Entity e = parentMap.getEntityatLocation(interactLoc); + if(e != null && e instanceof NPC) { + System.out.println("'Sup Nerd!"); + NPC npc = (NPC)e; + npc.move(Direction.SOUTH); + } } }