From cb8ce89166311691746da6b537ba60c15be6713a Mon Sep 17 00:00:00 2001 From: GreenXenith <24834740+GreenXenith@users.noreply.github.com> Date: Thu, 23 Apr 2020 14:19:46 -0700 Subject: [PATCH] Refactor map handling/generation/rendering --- assets/floor_cobble.png | Bin 1855 -> 1946 bytes assets/loot_gold.png | Bin 0 -> 3496 bytes assets/loot_pile.png | Bin 0 -> 3375 bytes assets/rect.png | Bin 0 -> 1624 bytes assets/wall_cobble.png | Bin 0 -> 1211 bytes assets/wall_cobble_corner_inner.png | Bin 0 -> 1007 bytes assets/wall_cobble_corner_ne_inner.png | Bin 1181 -> 0 bytes assets/wall_cobble_corner_ne_outer.png | Bin 1325 -> 0 bytes assets/wall_cobble_corner_nw_inner.png | Bin 1142 -> 0 bytes assets/wall_cobble_corner_nw_outer.png | Bin 1252 -> 0 bytes assets/wall_cobble_corner_outer.png | Bin 0 -> 1456 bytes assets/wall_cobble_corner_se_inner.png | Bin 1153 -> 0 bytes assets/wall_cobble_corner_se_outer.png | Bin 1286 -> 0 bytes assets/wall_cobble_corner_sw_inner.png | Bin 1209 -> 0 bytes assets/wall_cobble_corner_sw_outer.png | Bin 1303 -> 0 bytes assets/wall_cobble_down.png | Bin 1246 -> 0 bytes assets/wall_cobble_left.png | Bin 1353 -> 0 bytes assets/wall_cobble_right.png | Bin 1353 -> 0 bytes assets/wall_cobble_up.png | Bin 1254 -> 0 bytes none.png | Bin 0 -> 756 bytes src/assets.py | 9 +- src/dungeon.py | 174 +++++++++++++++++++++ src/game.py | 74 ++++++--- src/generator.py | 206 ------------------------- src/map.py | 49 ++++-- src/register.py | 25 +++ src/tiles.py | 49 ++++++ src/vector.py | 12 +- 28 files changed, 351 insertions(+), 247 deletions(-) create mode 100644 assets/loot_gold.png create mode 100644 assets/loot_pile.png create mode 100644 assets/rect.png create mode 100644 assets/wall_cobble.png create mode 100644 assets/wall_cobble_corner_inner.png delete mode 100644 assets/wall_cobble_corner_ne_inner.png delete mode 100644 assets/wall_cobble_corner_ne_outer.png delete mode 100644 assets/wall_cobble_corner_nw_inner.png delete mode 100644 assets/wall_cobble_corner_nw_outer.png create mode 100644 assets/wall_cobble_corner_outer.png delete mode 100644 assets/wall_cobble_corner_se_inner.png delete mode 100644 assets/wall_cobble_corner_se_outer.png delete mode 100644 assets/wall_cobble_corner_sw_inner.png delete mode 100644 assets/wall_cobble_corner_sw_outer.png delete mode 100644 assets/wall_cobble_down.png delete mode 100644 assets/wall_cobble_left.png delete mode 100644 assets/wall_cobble_right.png delete mode 100644 assets/wall_cobble_up.png create mode 100644 none.png create mode 100644 src/dungeon.py delete mode 100644 src/generator.py create mode 100644 src/register.py create mode 100644 src/tiles.py diff --git a/assets/floor_cobble.png b/assets/floor_cobble.png index da152c9099eb7a9691733a5d278babdc4bb6ef0e..f954bcea81879c095e0b3c499b4c80027059a62d 100644 GIT binary patch delta 1932 zcmV;72Xpwp4w?^;B!5qOR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}tygWbQB)-IPFxXYOL5`mmU>nc)?QW`K*Bks8fu!!1@RzM$bDZjLel?pA(ljb9L5{^Lo?4$z|7^IChnH=bSf=uUM%2 z&D~!mf#*grWq-nEgeAYc&F>8UEfVpbkVVRZTlGY~?@;lH2FG@{W1gkC`m-Jl+4+oBtwolWyv|00-wd35(-uq zSd_By<~F~DEpBO(EpMelKGoMyV@*|RuBCBv&9~5EOHEpCWv3ldGP~cy9{04%p7(M< zYll1h5r2+&q(hE;l#8{=>eu}rSfj}rcc#=XU94d?CEciRLE2}6at6lO6Btj*00hm- znHBP$l{w|iW=2&6Mvy_dX=IC`2nzj991gm;yP5lA-VCt*9dG<6%o(Nbe_)Qy?ml>X zVXbK=tevq@g^HU6|TKmz6cPMhCHb;Gjd@9X{x1w5*>3&0^CVwiu znY0*Lm)`B;N6+?M;$+71yFq;S(%CDfiS!mRM1Oi#kjz?!U#_1>eJg5_fwA}cQO+td z4f~a3cLzhy-fhZg?pFb7v2_-&7}th7bgjq2^O)ICv_D5{A7ejaJ`1B4WvAAh9(z)u zruf>l>5I|_3w##s0O*^MUv+yq1AiP$Uj-N-MdvZEWbTZz54HEuJz-J<6o z4!RMjc7l%9o$*2=XaeWqpBo+n74Jx5*(uQqmmJb%+ToHj-j7ACD! zgvmt|Ui8gIO8)D}6zdK1P7FcDAY+*iki@4<#~IBnZdS|mcqKvqkh1BH1S?G8E9z-7BaE3~y! zkT=%yo^lU6SlUEqwSUE<)8K`a<(AD3T7;24X06I{>lLuYhvGq{gS41QUevrM0D3IMD)& zY}D4Ff;Jef5RGH|&SS5o$XZv?Oh*FQUWX!p9wlsb%l3KB7^5qe*RH5de*sa6yqua4 Sz`Fnd002ovP6b4+LSTY2#j$4q delta 1820 zcmV+%2jlpf55EqOB!32aR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}tyWu-DZ8}6MV zF&SORQdX3x&_Nl`op$7C`CyMH^UkKt1>-sLZnPm|>rI8di6)z1*z9~5W2`cK=0YuQ zZ1Hvqh@1(gOn-1jSn|hP{bcaXUCOS35fOGz11sdkTzQ}hqp80z10hrfZ_)ss_j##> zSOW&7!5px`q_^&36S}lzng9&!1kbK7^0~6cO(hnw1<8;B1=^7ja-==8C$feE2ujGD zjpYptkO*fa$<`PLZUS_K*jVGK*|Kn-N2!1xG0u2!6MsztS=I{l<86S3k{Gcf;>1gk zC`mcvtP|&)ceUn{H{N>j&U+tx^eLENg9I0R2qA_PIU1CtL>GMwF~*b-Gg*}+VReE< zN*ixxvzu&g^IO>BmUhTzx4Z0a_j}mmo-${XZI~~C3hhBGg--4+=Dy}l0qdW5<8PQ#mAb#c9IL}Tcza?MFv_f{bga`c92zU)QJ0@UOq`JY2Iwx3CV~AC*I;vAx$P|4`4-7pL zMHonJ*d3PsgwvTW#}If7u_JZi zGm=C$m9I(b@c4%Kf)-DVmhjgGpJ;VUh_7m|Vbw*_wyLNjAHqV|0N~U}^#-qF%Mtb5 z2G|7Lb?NQO-i)>Mu&eQlSm&B>!K=D@+J7WpDjq_cBJF`IYTcDQK!*c0tp-Ri1ffsk z4~RbNNUeo*Dq|wpYwHxq)Qz8lUZ7F~E4wOiRaH1OJOQ}tXUa#tB6L&xi#|?*LYzU> z@3j0Xs?gWhoThpwBC11jR_P_M6Vufq+dz7StA9n- z&-(h<j(S&ZzV5B=qx+~icsoI#hkxKzq}M4irKBER^D2}k?@NTE=09ke<)yBZu_rOQ z({+*zX|8%$%WBcl^EAHmbpPt;)%7@&nosp2i}O6sKQ!F6uGGu-##_&MR?sc~rTV{E z^TPQ&#%jf>n|v=!pEVV(Q@UY)%5#>KayJ1z_Ox=hw$ZCh<|oug8+rLK=_@RpC)la? zUJo55UlhJsqxuiM-T|T_p8S{q000JJOGiWia{x{NBIs4XPLqxW7=O)4L_t(o!>w1# zZi7G!T#!#ZKOy~qM7c$k`u`u)7P!)rk#WY4MO`U}ux35B$FrvS`h4w0t!3RxDW!b> z{FZqdkLN?*6>sr-{I0d+nS>06zJnn6nFb;qOXt#&+>>Wg6bU*|@1v;MR)SsDt<2MS z0?}G&l1}+Bei5Y?J%7`g;{T@-EbI1$GOC*eLIUNp5D4jmGAZXnv>mFkJj2^(n^s3+ zIrlO$^xg4`faxFz)z5P-ZPC6?aa3B;waxT=l-jH|%+q*oLvE4GLI5o;xkBWnEYlrc zlqkEJJ1vSvBd>KXwZkeK`y@>sSq3kqnW!@vq)Z=Mt!mZQBY&{g2SP0*^*UmIRyQ=s znPaWRZs|vGA?3kWb-1j&k0%|deqWd-9um*fH=fyhQ5l`o@| zl)b%b%iw{NK{wCGeMfh`H`nP}W@ZDcyv_4*-z~+8bimrrUT8-KvQw@{)LJ65{aXpH zj@wu6gwsfdNM)l{4+#@e#TxNywKQfJZH;2Jst9jG=?t+Q*<8^CUd_ktwnxOt5-f8w z>VOC_*_s8AT_i@)P;zuZRyd*$4Qn{DMz=_kd9gC_v3HpO0000< KMNUMnLSTZhJ9rrY diff --git a/assets/loot_gold.png b/assets/loot_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..0a63be4f3d92f5270bd60708eb94bf1d54c2837a GIT binary patch literal 3496 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 WPY5;4r=Q>e0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3z_kt;V0MgI|nLm&XI;c%^T1`gks>_xJqc_X>i ztZ8;}1@8es4fTKi9`qL;PFBde5PkCA;IYXj$@qxo_Vm5p+Su6jJ|5oROfNeGwW8Lo zG1$FV_x5AFKWi-XqJ!PT1U3rDqGV`H3g+|VqrCdEjQxKgF83Wl`Cwt(j}l4siLbb zYLFyVjk4NVcu3HsO{0od>8ff;<+O#@zG>}OIb!F=7%Gg#7*qaO=(hpylrgG-M$9-p z?^?kwk;#Flj5^;K1|U3kZf*&Dl=GoGunK~1$sBROY|6GoaeVVFT@Iia=TL9{#i31V zvb@A%ZwF&ofxviH$DU0P3Cva{0#JtKqE-qBuyfL2q*zrCHW7Y=y)h^78Y@n=c7zJ} zIQ1I9CTRvNYaRS2*a#oWPMvkmc^6!C$z}5Dt#{u0;AhO`puq+gdO==_Z@TCKG!gw4KEbKH1&Kz0HlF z^>5td9db0$eSw@%*9UGdsI{31>ms&A;ndV9q7VH&W{DYM%l2`#eqLzUJU?)o6q6fH zX6O6pM{H%Y_1mmHY-5X8;;k83`C3hP4bzsPZq>H>xY>~42*vliNywr7);S<7zA5Gw ztGzB1Jv5XibN%cJ{BaoofsoG+Q>1JXC110Rr>?0}UfT#53xBo;l`asmF)uCBZzRLoDN}DpPZJOjO%gZ#uA4I==s24Ee zLa19L&}rLY8tf`au&8e41M_dP(KpiUbU8ZW^QuwwrQC1mE@>>I-put+5a~;~-_VPs zF)e+L$|ERmO4%BJ&e>O!|Np!d@06nND1?Q6%@1#;2l|RY$3jPbfExHmMo*CYZT&j? zKbS_}xv*ENy>vw?eugFb7n-rmb*S4+kpKVy24YJ`L;$t`{{TGqGY+8u000SaNLh0L z01FcU01FcV0GgZ_0001vNkl zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGa_lG!hTmDmECJm>EQf2=*}*J-ez4QYoTMh5 zIe83J8@DVZp-aKmpM=X%RI^1mXg{P6L*ocp)d@U`Z(x~d6jNY|n+ z7vaSW6dST6XIetf_!;i==>^?mjh!@(*keQQRESC9BBc?i(xOQNW2cT7l_zJ6%$?=P zTrwB#5`{!}r^Q){3~^!UJViu<@FNyFe#`OK$>DhrRGDCmFy%jc_)OuMzE+RO5fN5T zcdif@^X5Q1jk2#$0}xs_H#-S_>5mrPfE5t5lV-;PYiyT^X7pNHatc78XBe;gqC7S= zK2@UdZ3u=02x1~JN)$75CQ@Mspo+*@lp6?;84m=>Dw4p)QAhBNIhl?w8((s474R`h zlEJ1(1uRuV{bY62P&F|%vt-%aiq()LX|j}3PJ7SQELpSVlyml6a&>Wa^W@pxi`T+M zuqCael8cv8YK70Lp<2c43XNJDH)-0erIwqw(rQQfbnVtt&)s|Jb?}g(!$ul;_$Z@J znkc0(b=pibPoHJhg<4y(blFNPFJEQV2eq5(yZ!}gbW`I)YU||(HAr*bhK>o^?-|?7 zK#Y|@JZ}OhXx_}ClPYg=n^`Q3U15wMZL=8^YoG*#I*D!3gWW5+r?~~>`ZI3)47sq; zeFHfTQ-0(20kyH;g#8e^cHz!x6zo1cpI+H3lFir6pN>C`Z4rl=z9#c!L{H6 zrM|?jzmQH!(!)qcF>$PCO8lQ=_*79Yw~p^ye-~xzBVBQYgfCo`z5`oY>kj#dE<45j z+jF$ta7*)q*7e*sdW0U{uH|IVYgI4lUdGe83r{CiM!C53KHi1fabmku@!+}h2gYn) zOH=qt?JXQzub_1JJ}jI>@IL5rxKj4kZ9522dCbb z00v@9M??U&0RI3y_cIQm00009a7bBm000XU000XU0RWnu7ytkOc}YY;R9M4fWME+U z&oF?1iD7`jr~^hFFzSF&2aGyk)B&Ro7;hq?hlB d3ISTD0RXSc7>t^wWDo!V002ovPDHLkV1j#;)XV?? literal 0 HcmV?d00001 diff --git a/assets/wall_cobble_corner_ne_inner.png b/assets/wall_cobble_corner_ne_inner.png deleted file mode 100644 index 89b33a891dc8336866904fd3bde079b4195bf988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1181 zcmV;O1Y-M%P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH@21MgLjFECERf!E$&;%no|_bFrPyM`d

h!xG0vXvGOFQ>ab3=F&e_wPV_#hf5i-Pm zQF{n?af68!D#`X(L^GUXKvz!B&UOHL7XSti?r%A!>}#;(F(bi3L-OW|k~lNs>a+6qBWt zaw?g#;FZ)Iv*na?E(I}5a77EAE|^hDF^D3>qjUH^R^nhmADyC=<0dWrnFUPMc}wSx#yP)er3p)aanb8>uzVPHGr6TaGpt zw7xUCn1L7v0&!aeP|&=X`9vY`BDa|N%y=u5k)$p*oqTZ=fiMhWopiFhl6#w*gVvvM z<9Eoph3*H)u^aNh?FqHMzJzTfw!ei-Q!jY?aDSx2sX%PrJKwc`9sPCm=Q`>W-Ss1R z>^6Kx{12t{hNCU`itiunU25)!Bzo=WWgaiAd#2r``#ox-#;u2a&JmMSCtV-V$g3L^ zn=Sm`@2z_nz}J6S#c$?o)|~^Ub?Y%DeIAtpa;-fmzO;K6|CEbJ?p8I_)m~ly1D<=S z%xCscuB0w&N8~;#6lY)i*)NKO$~Kd&i@)dPo(lFV1N|0`F3gklARQfhdTz(rP9LO+ zv`$=~F#e5o+lqSI{3+|lImo5vOPWX}r}UT^Hh1c1(Y!teb-t%jTntz#_ZQQzT1EZ{ zvWUAOc$d^ytK98XT@(scY;-bIN*ZmYi0f^DJJB?Zd$HUtM~HTV@38SbcJ8JcCpIwI z{RiS8VIa9Rv04BC00v@9M??T~08RiR=vBZ@00009a7bBm000XU000XU0RWnu7ytkO zvq?ljR9M69mCXu+Kn#SV=`#+UFLR;Ib-lYD!8XYJJ>?Q2N$IK+_5m8IP z@(ElDpa2S>015yH;L_Sjv#M*X0&`HeTTohi3kYvr7(+$jcf!HMRpz(aYv14eG zn8r|$5bgyz8`RAV{6bt|kJBbxQsj&Z&Z}4&f}=1PG@8#BI|We~^v6|&|ND;DRDdfW vWrLrkhO*R%sBmNwdIi=XF14V@AJ7nX4Rjc~1oj!(00000NkvXXu0mjfDqR_B diff --git a/assets/wall_cobble_corner_ne_outer.png b/assets/wall_cobble_corner_ne_outer.png deleted file mode 100644 index 5716d05fcf291d9a7916329696afb4e3f74db6aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1325 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 IM6N<$f^GH$)&Kwi diff --git a/assets/wall_cobble_corner_nw_outer.png b/assets/wall_cobble_corner_nw_outer.png deleted file mode 100644 index 600a72994ff2838b90487503f078386cb11eea5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1252 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+O=0%jw~q*{O1&N1Z-mr$01pycY`_p1Z3@;L{4?jID&!MmWAVvfPWAy!WB}C8=_e1Sd-FX=V zZeU5)w1{f>Q}k`sjGBD$m4a`+`VF;GCdTH20yRg426bw%l`1d>?rgBkm1X&o7-z2H zg(S>MgH5tDNy1XOi%4+77c8{)&1=6(2|G7JC=(VVOnF(|yMRyX7}bL#BAlL1TmcvJ z)PW|AGFyZ}5E>`lbP;^6m*Q@O6)32S=7a+lzwJwGO4rmY`h28UutWDK;Wl6x^ z3NR#)z(*3LNZy!@C}5QYmeP}>baMJTpKdN&=H4?H1a4H)lRDZs9&f?C)IccgXahnPtp?PZN6NSK2xv81Yj9Z}$kUF(#;T4nV}LQR_be|-*nw4!KI$~TOe;3?N+f%Y`Ns;Aq<; z8bHBkX8}4p-QPg-a-k<^WJ+@+q`O_A+m@n31Neo6VN> z!dPxAKBUr}T+zXYJ<|0h)6f ze8b-Vg$U~`Vs3f;%(~T?KRbOK4WjM9Hg0#oG&jX2kniBQ3!A%w`yN~LPx9!|egn+? zVC^pZR~kK&Z}RZK(F+o(*X^3_9-nzA7*j)gcWU=6<*%7O)BNFr+>iu`mQ?Q3lzYdQ zJ5cg#zCf0`ZQOD8Ys#D*9{zjE++$+>mM`}v^FQXxov-(|mlXf&jFut$f2OmDDzX(H z+W-In24YJ`L;$G(UjQWEm&?Qe000SaNLh0L01FcU01FcV0GgZ_0001+NkljyRirTf4M zzka~PfX8VjiGU60HQ-K94ZZCEw_Z1(QZnE6gT90m&_@Qa!BWESZb3@^^Rm)!0R}Xm z4x~>1pAurL)!J_W`wZJ4_6S1YNd__(4JW6s(T` O0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvk}D|;{O1&N1SGK@hc#kuFvp(+YO`H_?e5n_ zv_-LqM45&2`JEx#F8WJnLUva4j?E2Ig8;82FO~j0LezgftvswVQtLuG{>^#)sCYAeylk0 z;3i4}S;koC$D05RB`elgYn}Br*l3e-;*7J-Iq$}qOJ2P3);sTg@X@Cr!2}yz@F9d4 zQsgK&k~X^NV~8=Pgf){<$tKKB7?D!uEZJn6UG_QTm{Wm#iYd0Z;!7y8q{>yQskXZ6 zYpAiNMh#L@%{1Fw^DVU4Qis;Mbkl8j-S^OAPX}uot1smntkK3APo~B=f3SvD?}wx5 zf<~UPgEKJ3hQPQV3_#F4IMacQ;lbSCOh?A4undrPa8pSqMGh32Mr=DB+?~vQ%$q{2 zzv7KQVNMO|et|hwO`dqWVXcl#SSDlZ6pol`!Rd=GBo3*Vs>1LvUJ?)Wb9Q)j$V5C_ zk@3Wi3a5g^HXHSwRqr}JvC_g?B$Fto6ENj8I!&P@*bI+Xw5BL*Q7tCboH&Mn+CbP1 zHV^^ag&nX;A^sH5gH>;kx^vVDA~U}{DxS56rK_cQSW4%H_EAK`6{Pgz4DZER!? zNGCMniv+)U*1nT9UXq47soitgllDK9zWO2EFJV(paXa}uVg`)3D$<@WW^`ZOtG|-r z1(#aDhT@2|+n9QU_RiY_WVK^nX}A{aF7F}ZUOXfV2aPV>qhm^ai_v?b-17|+hlBl2 zScI!z$g&UgU+||K<=qD6-Fcg0)Oj0CL7w;5sGV!#d;Zw>!!@_AW_%xA>gSZ(p&O4k zq0D(pwfL9eC6e#CpNYwOsz+iPbg8%JbRNiPi+9H@zT|M7e(qM??4fNq!k$UCLp0mH zr|D}sPB>|mZ@xwzQp30J{uBCA_Pd?P<{F=PA74kmcCQ`Gc6|6n^*;qy>hSG=T!#Pv z00v@9M??U&0RI3y_cIQm00009a7bBm000XU000XU0RWnu7ytkP0!c(cR9M69l|2rE zKoEr=WDY?Hgo3kJ*mxgX58z>JEIf;a(HL)mjZ4OLCp#iLOW{j4A!G>O&d-}-zuOJ~ zaK7B&biF^u=fm-Ylqy3n+q#04Mu5I+f)Jba$}R(a*SvvPK$OU=4*;ndO#t}Mxl&Go zSOSaNt9ro92drzq+$qQg5HcY14ET0zZpAqk(z2Q`$0$a7;O_&eCxNtqA&5El1Zmds z)XZoADdj5WfD#NzCN%dLN-(5JzvPM`NFFO)g2T`+Rve4bz?4=d)YjE_CXJy3j7^Gv zkx)E`Apc|jK`1LOMw_u1H~}aC4BwPuO1Y%W5HiUDxh5=L$6QaI%wqS(#J7n60000< KMNUMnLSTZF9i6KH literal 0 HcmV?d00001 diff --git a/assets/wall_cobble_corner_se_inner.png b/assets/wall_cobble_corner_se_inner.png deleted file mode 100644 index 0f09217821a1916dce8841adf76e1e6b133ad435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1153 zcmV-{1b+L8P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_bk|QY${O1&V1SBC4$Ke^VH`wEELX{tFyFH%W z`D}2Z3J_9CDJZ+~&)?Jig+?a91x*%nj2)7Yn2h8|3PS?;WRd&a>w)h)TZtxP@~*b9S3^9MP2!k%o8#b+~XB zGf=F^lI(2}J>gNjr`X3~ZFa{o+AekG>o-;|D zxrrB&usTgnlBJ6YOXDE|)`YKEX#36EUn7I(4q}-J#t2*9cK0iVPx_qABS%Dtp3YnW z7xUtQRvKlEPy-<}Pu_GV_|mV<-4QEbPWeNpO*HQrSc z;9CKP1Qhs4q7=y|=0p^P4FnY+X9--v0I6~ZNDd+q+!*QzzOg6K)@9{m9!CZIs6r61w#!L6%DEyHK}RV;-bV5HO83YI&&pS3Q1E;DOt*?m{>5iXvxg7mCRXi zBsIsJvgMphfzJ|L(SqFt8l_aOQbW}mYpParEe++i_1w## zfl_iK3>|T#VIz++QEO9Xm^$N3(`KIK%G$~5Q~wRt=wyvIQ%f&hS;K5f%g{DK>z>iY z85rY0U_31bP|&L+0!|t&iaVjr%`v#yIRPEbdXK#N#rulo~dehmE>`Z4tSa+vt1l5x%c3uA&eL~rMLu>b%724YJ` zL;!ODP5>h4RlrUF000SaNLh0L01FcU01FcV0GgZ_0001}Nkl94=0>m)A0mL>WMZlH27eHuZ(iL!-8yny>aw!9F$Wtr;0w4ea@N0k*etJ;Y TN%YFQ00000NkvXXu0mjfCzcB$ diff --git a/assets/wall_cobble_corner_se_outer.png b/assets/wall_cobble_corner_se_outer.png deleted file mode 100644 index 618fc961695065650d3a459f01de75fc6e381f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1286 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 X?JGS<4~*&p00000NkvXXu0mjfravS8 diff --git a/assets/wall_cobble_corner_sw_outer.png b/assets/wall_cobble_corner_sw_outer.png deleted file mode 100644 index 583245046361701a55a4a69cb46e976d9a15dc20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1303 zcmV+y1?c*TP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YwlEWwr{MRY=2uMOaj)TEe?G5($+hE6eOp=Lb z#w3Ws0-El|Hm(2t+vy)%oXwNBm_iQ0;quvMDQF~jz1BT$eeC?KFBk7M)6*M*sEE3C zM!()lFnfPCE{;r$5}E;a>Z5luDR+Kl**Zf)phpVhzoaKxgl1r!02U_h$vD;XJ67N zS*ki^^`mf?s9BpP6|J(Wswb5L3(s})T(5G%%8ijKjL8^7-WK{U;giyPb>N5@yXT!N z-~#2~od=CNYNSCB?z?U_3BHu$q8niq3fiPOVS~jj+Z2oO)mu6ZpvW`C&0iebP)(*w zJk~aVVTA-Puo?$;Q6w^Zl>~tbkc)a*pa7dm14!|z0oo+^2y0_Z+=wa{Wq zEw{4r3Mja<19t^N(;`#$vG;!U*LQ~JfqKWGdV9}MX z9o804W1^j_Ut^+M34eo$4*hL(h*E9Nl*S?M?QjZGZQv5i8n z#D4H5zUUT~C9J6N#)BEwf4)RKH0hzchKasU7T24YJ`L;$G( zUjQWEm&?Qe000SaNLh0L01FcU01FcV0GgZ_0002mNklkPpo1@8zcF9~A3uG@5PR_OAp@y^iD7`j@N$5Hy!>bsj5=V{0VL-HnuLIYygbnk zVWDO4;&KFXkyQ`FJUg3WAA{hnov$qXb`iz}8@)Yc?b{ zWCm9n5EkUe84bfW7Z9BW&_jVx!lb$bXca9OQGhEQjFyBnb%3mt1V%K#Fx_&2tds-; ztdB@Zn!wh-B;)`_1_p-z)bbIj4n|1>vQiQl(Lt{$V1&~Dv84%G0sx6tDSrWYh(iDX N002ovPDHLkV1l{7VCMh; diff --git a/assets/wall_cobble_down.png b/assets/wall_cobble_down.png deleted file mode 100644 index 469922d6bf420ed28b8dbf73a93c7ed305c186cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1246 zcmV<41R?v0P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-_ZlI$o9{O1&N1SBB@$H6QSbAvhlB-rKZu5xwP z+y0&jTM9@mD1~j;|ND2ie{fOKI-cY%7Z_3? zWuLTgtjaNe!^cy?(ZvGkgMpl3_+wxz$2@!flu_j~#(g`-Jw{7o^nG_FM3f=!o7zLT zn;QT(R7sXu#4y|n-PXt$$roQK_~xtMFe+tY5D19mu7|EYcI&C3|C?iRo+%)pVQ3Qpd6YHRpyE}7l^X5?N?|9>P zm~)f5-@qKZE)Tq2u-4|Aur9{-Q#fnt1*Z?|Jrzy`#pYf4Rr%M^Uq|P}hOV5ioJmeAPlkM*A3caLzocLM!mLs)QrDFJw)mdB4?GfZItO1@@%bf8``SPHa+)l@C z4;T3&$S%otL;S6tTpv;HN#^9zGwjcG_BNXgpUD1&>Tddl(KmkYTLF0f`D26Wb+E&_ z(Z@nx6vF+UBYWj&=DDXiUxC|dfEtix>|dqigl>3j@EQMN`5EahXb0-q6hAlF{SU}H zep?FD=luWx00v@9M??T~08RiR=vBZ@00009a7bBm001r{001r{0eGc9b^rhX_(?=T zR9M69mp>1JFc8ICa+3vi+TVNkAO{2~ zgm{aDRfxou1LOcXz<&l%h(aN|4-i zopuNnVtx$M2LLWuSLNWmzuj4Uh=aN+N08fWZUb9yAKR>12W~^|otew#A%qz5YPp!) ze>`8|0Imr~6lzRyK3||jHq34IYiNkM!sIhBRhxDFJ#M=`9KaS(WlRj`Go^f}HKPYk zbBf_;LVj)6iz3!2HpFNK_PZ?!pD$OEbJs&Yu121YhoryfA0>28L zaB^>EX>4U6ba`-PAZ2)IW&i+q+O=0%lH@83{MRYw2uMOK$H8DC<_2^8NxanJTI_!D z##A9UW=S#=xtiubzdQZH#aRP+iz(y~94?=ImV%q)?$^Aiy!aW_tTT5EW6^ z#^|@Fy0!29!!2T>HxJkj1N63xJT4r|)-Fz-5FteOc%}Qd_m+B}*WDE#KtotJwGO3y z8g!h%k}ksnO2pT2AD5C*k}IyVcgu{y?UL81M#_oCJ z3b;gu4m@boQKK6K;lAl%3&DH2UGyNVLP1+-PS{{^(>ldueD{_v22k`f#MNIM+fYpw zmw2pg0K*CiTwpa0?4n3y_9_Vi6(AS&GC=`0lLnCDRRgq1@DbL=n8-_CFDA9Q+>4>YOJZ|TADO%zF7+` zw$ySfGtaOR&3?8y%yCY0o=b<VWT1xcQvp0Mo6(ZT33L55|K`h;~NoQ z*;)|6VjIK(=Weyn&Z-~J+DU?VVQWuWPe!4100e4EA1uA|)3dKofAP_O^%dQRJQ(bP zpN?Fnd77JE)GYC4@`nU=Dkg1eenoNt zQKj>j&b4$!7wI_zH4wc^4F`r^UeK?uqHC%BO;R{miaw>Qf2!KI^GDAwnNKg9Gx6|G z%@2Uw0O6-sroYoWvBh_0>$3m=00v@9M??T~08RiR=vBZ@00009a7bBm000XU000XU z0RWnu7ytkO?@2^KR9M69SIY{*Fc2Jb^i{-*2vUEnCy)NLMG!9{^>x)#LCk~QWYcZI zxizHCbTXOUjP|?geLS530GDe67aq@-HP+nj&bf!W1_$Q*VYw(sFZmXaf%zSvlJH?$ zmT3eez#(A(V6$F%C%E=s5e-8j3o8VW#7R>np00000 LNkvXXu0mjfi|%Sr diff --git a/assets/wall_cobble_right.png b/assets/wall_cobble_right.png deleted file mode 100644 index 9648a330b932a28d11461188a903fba99bacbadd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1353 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 Q>;M1&07*qoM6N<$f`CvycK`qY diff --git a/none.png b/none.png new file mode 100644 index 0000000000000000000000000000000000000000..d48da43006a4fb3aee68aca13be51e1ec6d2d7c1 GIT binary patch literal 756 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGj@2*>hTppimJr`!XE|vu5<6h|{Aqi7U>Grj z;05W#YF(v{?f7%5ZsXh6xqZPPkF=?INn-4_fk z&~i??UT@`^f7s_+!_hl0$lffFI}HCA*y}aViGRw-<&N>(&UMY%W6p8zu4+aZ^0}!q z#P)Cl!yQ$UV_AkcF2l1QQXr9PYNV;BmUc*^LQIk-DfNviO&Zjp8#UypJlLU`8_O{l z;#{~%5)xfPlU<5*31MkGL_{~?I~O|QmLp!HK;%v^Wr8!plHbbqk-=wV&X!OkBJ7^7 zS|Kmy#er5CW!+&0AT%#-b`C+>s=!NCulgA0al@I32cZe9q&jfR9NQ z2b&@luv88G;~MCpYGP_;+1$d4)h$cbY&mDo>&#UbS2xe@9$vhLgoZ^9kBAbra1k6y zE4g@yQcA6eS#_&cvAV*d)}43Rb+xCA5f!<8Xu&Vo!`_j>%JTvE@*vcY%v2d zRswNf1kljDn57_9UgQ?DR2Zki7)jb<(<#-BG7#z@wn;a;C%I2^+feI|xbbJmZ42E$ zAjjK~H{9N#*4LM?9mLL4xN4dNrw{K(RE~;b^ZD?%`sL{5=;i3;=;i3;=;i1?cQo= other.left and self.top <= other.bottom and self.bottom >= other.top + +# Generator class in case its used multiple times +class Generator(): + rooms = [] # Stores room objects + board = [] # Map of zeros and ones + + def __init__(self, width, height = None): + self.width = width + self.height = height or width + + for y in range(self.height + 1): + self.board.append([]) + for _ in range(self.width + 1): + self.board[y].append(0) + + self.place_rooms() + self.place_corridors() + + def place_rooms(self): + for _ in range(rand(10, 30)): # Amount of rooms + width = rand(4, 10) # Room size + height = rand(4, 10) + x = rand(0, self.width - width) # Room position + y = rand(0, self.height - height) + + if x + width > self.width: + x = self.width - width + + if y + height > self.height: + y = self.height - height + + collides = False + room = Room(x, y, width, height) + + # Make sure room doesn't collide + for other_room in self.rooms: + if room.intersects(other_room): + collides = True + break + + # Add room if valid place + if not collides: + for row in range(room.height): + for col in range(room.width): + self.board[room.y + row][room.x + col] = 1 + + self.rooms.append(room) + + # Connect rooms together + def place_corridors(self): + for i in range(len(self.rooms) - 1): + room1 = self.rooms[i] + room2 = self.rooms[i + 1] + + if rand(0, 2) == 0: + if room1.cx <= room2.cx: + self.horiz_corridor(room1.cx, room2.cx, room1.cy) + else: + self.horiz_corridor(room2.cx, room1.cx, room1.cy) + if room1.cy <= room2.cy: + self.vert_corridor(room1.cy, room2.cy, room2.cx) + else: + self.vert_corridor(room2.cy, room1.cy, room2.cx) + else: + if room1.cy <= room2.cy: + self.vert_corridor(room1.cy, room2.cy, room2.cx) + else: + self.vert_corridor(room2.cy, room1.cy, room2.cx) + if room1.cx <= room2.cx: + self.horiz_corridor(room1.cx, room2.cx, room1.cy) + else: + self.horiz_corridor(room2.cx, room1.cx, room1.cy) + + def horiz_corridor(self, x1, x2, y): + for row in range(y - 1, y + 2): + for col in range(x1 - 1, x2 + 2): + self.board[row][col] = 1 + + def vert_corridor(self, y1, y2, x): + for row in range(y1, y2 + 2): + for col in range(x - 1, x + 2): + self.board[row][col] = 1 + + def generate(self, map): + for y in range(self.height): + for x in range(self.width): + if self.board[y][x] == 1: + # Floor + map.set_tile(x, y, 0, "map:cobble") + + if self.board[y][x] == 1: + # Adjacent sides (Corresponds with rotation map below) + asides = [ + [1, 0], + [0, 1], + [-1, 0], + [0, -1] + ] + + adj = 0 # How many adjacent + arot = 0 # Last adjacent key + for key in range(len(asides)): + off = asides[key] + if self.board[y + off[1]][x + off[0]] == 0: + adj += 1 + arot = key + + # Diagonal sides (Corresponds with rotation map below) + dsides = [ + [-1, 1], + [-1, -1], + [1, -1], + [1, 1] + ] + + dia = 0 # How many diagonal + drot = 0 # Last diagonal key + for key in range(len(dsides)): + off = dsides[key] + if self.board[y + off[1]][x + off[0]] == 0: + dia += 1 + # Only set key if opposite tile is floor + if self.board[y - off[1]][x - off[0]] == 1: + drot = key + + tile = "" + rmap = [2, 3, 0, 1] # Rotation map + if adj == 0 and dia == 1: # Need diagonals to prevent false positives with all-floor + tile = "map:wall_cobble_corner_outer" + rot = rmap[drot] + elif adj == 1: + tile = "map:wall_cobble" + rot = rmap[arot] + elif adj == 2: + tile = "map:wall_cobble_corner_inner" + rot = rmap[drot] + + if tile != "": + map.set_tile(x, y, 1, tile) + map.get_tile(x, y, 1).set_rotation(rot) diff --git a/src/game.py b/src/game.py index b9ed95e..ecd7a67 100644 --- a/src/game.py +++ b/src/game.py @@ -1,23 +1,24 @@ import pygame import os, sys -from . import assets, controller, spritesheet -from .map import Map -from .player import Player - -# Constants -SCALE = 3 -METER = 32 -FPS = 60 # Init pygame.init() pygame.font.init() -# Screen Init (might implement a display module later to handle maximizing) +winsize = [800, 600] +screen = pygame.display.set_mode(winsize, pygame.RESIZABLE) + +from . import assets, controller, register, spritesheet +from .map import Map +from .player import Player + pygame.display.set_caption("Zoria") pygame.display.set_icon(assets.load("icon.png")) -winsize = [800, 600] -screen = pygame.display.set_mode(winsize) #, pygame.RESIZABLE) + +# Constants +SCALE = 2 +METER = 32 +FPS = 60 # Load all assets for filename in os.listdir(os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), "assets")): @@ -39,6 +40,8 @@ player.set_pos(map.generator.rooms[0].x + 2, map.generator.rooms[0].y + 2) CENTER = [winsize[0] / 2, winsize[1] / 2] +arial = pygame.font.SysFont("Arial", 10) + # Mainloop clock = pygame.time.Clock() while 1: @@ -46,6 +49,11 @@ while 1: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() + elif event.type == pygame.VIDEORESIZE: + winsize = event.size + SCALE = 2 * (winsize[0] / 800) + CENTER = [winsize[0] / 2, winsize[1] / 2] + screen = pygame.display.set_mode(winsize, pygame.RESIZABLE) screen.fill((0, 0, 0)) @@ -56,19 +64,37 @@ while 1: psize = player.sprite.rect.size camera = [CENTER[0] - (psize[0] / 2 * SCALE), CENTER[1] - (psize[1] / 2 * SCALE)] - for layer in map.map["renderLayers"]: - for row in range(len(layer)): - for column in range(len(layer[row])): - materialIndex = layer[row][column] - if materialIndex != 0: - texture = assets.get(map.map["tiles"][materialIndex - 1]) - tilesize = texture.get_rect().size[0] - screen.blit(pygame.transform.scale(texture, [SCALE * tilesize, SCALE * tilesize]), [ - column * SCALE * tilesize - (player.pos.x * SCALE * METER) + camera[0], - row * SCALE * tilesize - (player.pos.y * SCALE * METER) + camera[1] - ]) + for z in range(len(map.map)): + for y in range(len(map.map[z])): + for x in range(len(map.map[z][y])): + tile = map.get_tile(x, y, z) + if tile: + texture = assets.get(tile.texture) + + # Rotations are clockwise due to Y+ down rendering + # NOTE: This will be obsolete once game is converted to 2.5D + rotated = pygame.transform.rotate(texture, -90 * tile.rotation) + + tilesize = texture.get_rect().size + + tilex = (x * METER) - ((tilesize[0] / 2) - (METER / 2)) + tiley = (y * METER) - (tilesize[1] - METER) + + pos = [ + camera[0] + round((tilex - (player.pos.x * METER)) * SCALE), + camera[1] + round((tiley - (player.pos.y * METER)) * SCALE) + ] + + # Only render tile if on-screen + if pos[0] + tilex >= 0 and pos[0] <= winsize[0] and \ + pos[1] + tiley >= 0 and pos[1] <= winsize[1]: + screen.blit(pygame.transform.scale(rotated, [round(tilesize[0] * SCALE), round(tilesize[1] * SCALE)]), pos) + + # text = arial.render(str(int(x)) + ", " + str(int(y)), False, (255, 255, 255)) + # screen.blit(text, [x * 64 - (player.pos.x * round(SCALE * METER)) + camera[0], y * 64 - (player.pos.y * round(SCALE * METER)) + camera[1]]) # Draw player based on camera position - screen.blit(pygame.transform.scale(player.sprite.texture.frame, [SCALE * player.sprite.texture.width, SCALE * player.sprite.texture.height]), camera) + screen.blit(pygame.transform.scale(player.sprite.texture.frame, [round(SCALE * player.sprite.texture.width), round(SCALE * player.sprite.texture.height)]), camera) - pygame.display.flip() + pygame.display.update() + # pygame.display.flip() diff --git a/src/generator.py b/src/generator.py deleted file mode 100644 index 17c24c5..0000000 --- a/src/generator.py +++ /dev/null @@ -1,206 +0,0 @@ -import random -import time -import math - -MSIZE = 80 - -def rand(*args): - random.seed(time.clock()) - return random.randint(*args) - -class Room(): - def __init__(self, x, y, width, height): - self.x = x - self.y = y - self.width = width - self.height = height - - self.left = x - self.right = x + width - self.top = y - self.bottom = y + height - - self.cx = math.floor(self.x + (width / 2)) - self.cy = math.floor(self.y + (height / 2)) - - def intersects(self, other): - return self.left <= other.right and self.right >= other.left and self.top <= other.bottom and self.bottom >= other.top - -class Generator(): - rooms = [] - board = [] - - def __init__(self, width, height = None): - self.width = width - self.height = height or width - - for y in range(self.height): - self.board.append([]) - for _ in range(self.width): - self.board[y].append(0) - - self.place_rooms() - self.place_corridors() - - def place_rooms(self): - for _ in range(rand(10, 30)): - width = rand(4, 10) - height = rand(4, 10) - x = rand(0, 60) - y = rand(0, 60) - - if x + width > self.width: - x = self.width - width - - if y + height > self.height: - y = self.height - height - - collides = False - room = Room(x, y, width, height) - - for other_room in self.rooms: - if room.intersects(other_room): - collides = True - break - - if not collides: - self.place_room(room) - - def place_room(self, room): - for row in range(room.height): - for col in range(room.width): - y = room.y + row - x = room.x + col - - self.board[y][x] = 1 - - self.rooms.append(room) - - def place_corridors(self): - for i in range(0, len(self.rooms) - 1): - room1 = self.rooms[i] - room2 = self.rooms[i + 1] - - if rand(0, 2) == 0: - if room1.cx <= room2.cx: - self.horiz_corridor(room1.cx, room2.cx, room1.cy) - else: - self.horiz_corridor(room2.cx, room1.cx, room1.cy) - if room1.cy <= room2.cy: - self.vert_corridor(room1.cy, room2.cy, room2.cx) - else: - self.vert_corridor(room2.cy, room1.cy, room2.cx) - else: - if room1.cy <= room2.cy: - self.vert_corridor(room1.cy, room2.cy, room2.cx) - else: - self.vert_corridor(room2.cy, room1.cy, room2.cx) - if room1.cx <= room2.cx: - self.horiz_corridor(room1.cx, room2.cx, room1.cy) - else: - self.horiz_corridor(room2.cx, room1.cx, room1.cy) - - def horiz_corridor(self, x1, x2, y): - for row in range(y - 1, y + 2): - for col in range(x1 - 1, x2 + 2): - self.board[row][col] = 1 - - def vert_corridor(self, y1, y2, x): - for row in range(y1, y2 + 2): - for col in range(x - 1, x + 2): - self.board[row][col] = 1 - - def get_map(self): - # Map object - map = { - "tiles": [ - "floor_cobble.png", - "wall_cobble_down.png", - "wall_cobble_right.png", - "wall_cobble_up.png", - "wall_cobble_left.png", - "wall_cobble_corner_nw_inner.png", - "wall_cobble_corner_ne_inner.png", - "wall_cobble_corner_se_inner.png", - "wall_cobble_corner_sw_inner.png", - "wall_cobble_corner_nw_outer.png", - "wall_cobble_corner_ne_outer.png", - "wall_cobble_corner_se_outer.png", - "wall_cobble_corner_sw_outer.png" - ], - "renderLayers": [] - } - - # Generate walls - bounds = [] - for y in range(self.height): - bounds.append([]) - for x in range(self.width): - wall = 0 - if self.board[y][x] > 0: - for x2 in range(x - 1, x + 2): - for y2 in range(y - 1, y + 2): - if self.board[y2][x2] == 0: - wall += 1 - bounds[y].append(wall) - map["boundaries"] = bounds - - # Floor layer - layer1 = self.board.copy() - map["renderLayers"].append(layer1) - - # Wall layer - layer2 = [] - for y in range(self.height): - layer2.append([]) - for _ in range(self.width): - layer2[y].append(0) - - for y in range(1, self.height - 1): - for x in range(1, self.width - 1): - if self.board[y][x] == 1: - tile = 0 - if self.board[y][x - 1] == 1 and self.board[y][x + 1] == 1: - if self.board[y - 1][x] == 0: - tile = 2 - elif self.board[y + 1][x] == 0: - tile = 4 - - if self.board[y - 1][x] == 1 and self.board[y + 1][x] == 1: - if self.board[y][x - 1] == 0: - tile = 3 - elif self.board[y][x + 1] == 0: - tile = 5 - - layer2[y][x] = tile - - for y in range(1, self.height - 1): - for x in range(1, self.width - 1): - if bounds[y][x] > 0 and layer2[y][x] == 0: - tile = 0 - if bounds[y + 1][x] > 0 and bounds[y][x + 1] > 0: - if bounds[y][x] > 1: - tile = 6 - else: - tile = 10 - elif bounds[y + 1][x] > 0 and bounds[y][x - 1] > 0: - if bounds[y][x] > 1: - tile = 7 - else: - tile = 11 - elif bounds[y - 1][x] > 0 and bounds[y][x - 1] > 0: - if bounds[y][x] > 1: - tile = 8 - else: - tile = 12 - elif bounds[y - 1][x] > 0 and bounds[y][x + 1] > 0: - if bounds[y][x] > 1: - tile = 9 - else: - tile = 13 - - layer2[y][x] = tile - - map["renderLayers"].append(layer2) - - return map diff --git a/src/map.py b/src/map.py index b394abb..2243f5a 100644 --- a/src/map.py +++ b/src/map.py @@ -1,7 +1,7 @@ import pygame import json, math -from . import assets -from .generator import Generator +from . import assets, dungeon, loot +from .tiles import Tile from .vector import Vector class Map: @@ -10,21 +10,44 @@ class Map: def __init__(self, meter): self.METER = meter # Pixels per 1 meter - def load(self, filename): - with open(filename) as file: - self.map = json.load(file) - + # def load(self, filename): + # with open(filename) as file: + # self.map = json.load(file) + def generate(self): - self.generator = Generator(80) - self.map = self.generator.get_map() + self.generator = dungeon.Generator(80) + self.generator.generate(self) + # self.placer = loot.Placer() + # self.map = self.placer.populate(self.map) def collides(self, pos, rect): - for y in range(int(math.floor(pos.y)) - 1, int(math.floor(pos.y)) + 2): - for x in range(int(math.floor(pos.x)) - 1, int(math.floor(pos.x)) + 2): - if not (x == pos.x and y == pos.y): - if self.map["boundaries"][y][x] > 0: + px = int(math.floor(pos.x)) + py = int(math.floor(pos.y)) + for y in range(py - 1, py + 2): + for x in range(px - 1, px + 2): + if y >= 0 and y < len(self.map[1]) and x >=0 and x < len(self.map[1][y]): + tile = self.map[1][y][x] + if tile and tile.is_solid(): if pos.x + (rect.width / self.METER) >= x and pos.x <= (x + 1) and \ pos.y + (rect.height / self.METER) >= y and pos.y <= (y + 1): return True - return False + + def set_tile(self, x, y, z, name): + for _ in range(len(self.map), z + 1): + self.map.append([]) + + for _ in range(len(self.map[z]), y + 1): + self.map[z].append([]) + + for _ in range(len(self.map[z][y]), x + 1): + self.map[z][y].append(None) + + if name != "": + self.map[z][y][x] = Tile(name) + + def get_tile(self, x, y, z): + try: + return self.map[z][y][x] + except: + return None diff --git a/src/register.py b/src/register.py new file mode 100644 index 0000000..e79a935 --- /dev/null +++ b/src/register.py @@ -0,0 +1,25 @@ +from . import tiles + +tiles.register_tile("map:cobble", { + "texture": "floor_cobble.png", +}) + +tiles.register_tile("map:wall_cobble", { + "texture": "wall_cobble.png", +}) + +tiles.register_tile("map:wall_cobble_corner_inner", { + "texture": "wall_cobble_corner_inner.png", +}) + +tiles.register_tile("map:wall_cobble_corner_outer", { + "texture": "wall_cobble_corner_outer.png", +}) + +tiles.register_tile("loot:coins", { + "texture": "loot_gold.png", +}) + +tiles.register_tile("loot:pile", { + "texture": "loot_pile.png", +}) diff --git a/src/tiles.py b/src/tiles.py new file mode 100644 index 0000000..e6a9ac0 --- /dev/null +++ b/src/tiles.py @@ -0,0 +1,49 @@ +import pygame + +global registered_tiles +registered_tiles = {} + +content_ids = [] +content_id_map = {} + +def register_tile(name, definition): + registered_tiles[name] = definition + content_id_map[name] = len(content_ids) + content_ids.append(name) + +def get_content_id(name): + try: + return content_id_map[name] + except: + return None + +def get_tile_from_content_id(id): + try: + return registered_tiles[content_ids[id]] + except: + return None + +class Tile: + texture = "none.png" + solid = True + rotation = 0 + + def __init__(self, name): + self.name = name + for key in registered_tiles[name]: + self.__dict__[key] = registered_tiles[name][key] + + def get(self, key): + try: + return getattr(self, key) + except: + return None + + def set_rotation(self, rot): + self.rotation = rot + + def get_rotation(self, rot): + return self.rotation + + def is_solid(self): + return self.get("solid") == True diff --git a/src/vector.py b/src/vector.py index 5cd9030..db9b49e 100644 --- a/src/vector.py +++ b/src/vector.py @@ -14,8 +14,13 @@ class Vector: def __repr__(self): return "Vector {{x: {0}, y: {1}}}".format(self.x, self.y) - def apply(self, func): - return Vector(func(self.x), func(self.y)) + def __eq__(self, b): + vec = vec_or_num(b) + return self.x == vec.x and self.y == vec.y + + def __ne__(self, b): + vec = vec_or_num(b) + return self.x != vec.x or self.y != vec.y def __add__(self, b): vec = vec_or_num(b) @@ -41,3 +46,6 @@ class Vector: def __ceil__(self): return Vector(ceil(self.x), ceil(self.y)) + + def apply(self, func): + return Vector(func(self.x), func(self.y))