From 3aadb8bb78efd105330a6d40dcc0d953ba2e8540 Mon Sep 17 00:00:00 2001 From: StephenAdamson Date: Sun, 29 Dec 2024 00:45:07 +0000 Subject: [PATCH] Separate floor from fixture --- assets/{bedrock.png => bedrock_floor.png} | Bin assets/bedrock_wall.png | Bin 0 -> 4418 bytes assets/{dirt.png => dirt_floor.png} | Bin assets/dirt_wall.png | Bin 0 -> 4728 bytes assets/{grass.png => grass_floor.png} | Bin assets/grass_wall.png | Bin 0 -> 4527 bytes assets/natural walls/rock/end.png | Bin 0 -> 4437 bytes assets/natural walls/rock/inner_a.png | Bin 0 -> 620 bytes assets/natural walls/rock/inner_ab.png | Bin 0 -> 4364 bytes assets/natural walls/rock/inner_abc.png | Bin 0 -> 4408 bytes assets/natural walls/rock/inner_abcd.png | Bin 0 -> 4394 bytes assets/natural walls/rock/inner_ac.png | Bin 0 -> 4393 bytes assets/natural walls/rock/line.png | Bin 0 -> 657 bytes assets/natural walls/rock/line_with_a.png | Bin 0 -> 708 bytes assets/natural walls/rock/line_with_ab.png | Bin 0 -> 736 bytes assets/natural walls/rock/line_with_b.png | Bin 0 -> 711 bytes assets/natural walls/rock/outer.png | Bin 0 -> 696 bytes assets/{rock.png => rock_floor.png} | Bin assets/rock_wall.png | Bin 0 -> 4617 bytes assets/underground.png | Bin 633 -> 0 bytes src/game.rs | 86 ++++-- src/main.rs | 2 +- src/tile.rs | 329 +++++++-------------- src/tiles.rs | 156 +++++----- 24 files changed, 269 insertions(+), 304 deletions(-) rename assets/{bedrock.png => bedrock_floor.png} (100%) create mode 100644 assets/bedrock_wall.png rename assets/{dirt.png => dirt_floor.png} (100%) create mode 100644 assets/dirt_wall.png rename assets/{grass.png => grass_floor.png} (100%) create mode 100644 assets/grass_wall.png create mode 100644 assets/natural walls/rock/end.png create mode 100644 assets/natural walls/rock/inner_a.png create mode 100644 assets/natural walls/rock/inner_ab.png create mode 100644 assets/natural walls/rock/inner_abc.png create mode 100644 assets/natural walls/rock/inner_abcd.png create mode 100644 assets/natural walls/rock/inner_ac.png create mode 100644 assets/natural walls/rock/line.png create mode 100644 assets/natural walls/rock/line_with_a.png create mode 100644 assets/natural walls/rock/line_with_ab.png create mode 100644 assets/natural walls/rock/line_with_b.png create mode 100644 assets/natural walls/rock/outer.png rename assets/{rock.png => rock_floor.png} (100%) create mode 100644 assets/rock_wall.png delete mode 100644 assets/underground.png diff --git a/assets/bedrock.png b/assets/bedrock_floor.png similarity index 100% rename from assets/bedrock.png rename to assets/bedrock_floor.png diff --git a/assets/bedrock_wall.png b/assets/bedrock_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..ce302bbd91e5d59b613212c30799c30cee21fe1b GIT binary patch literal 4418 zcmeHKe^3)w9*+=%4JmR8MX%zm!L~B6*(BuWHi6P4LW&XOhsBP)`m#U5)+8HtHzaUa zFr=7WB z=K3FRW_RDd_xXO__xpL@_vXFrC2I@rmH$*Okx1@!7TQbUH(7iZ$l&{DH^%_{4AhlZ z3Z)=~1UQyvyc8nT1}KCIGqgk!{>RRBzN9W>!RTOSja1ssE&J}}0olWMf1dhj@Z5_n zg_rX$k0?I<>cp?lf{mtYyNfz@FKBCfH#L91pTF7i=i1^bsnOCpU$%1ivErTS7q@2Y zdTlSZ{Xl~PH&)pDD*o6%G_tEVxB2{S#Dg4V+xi>+lYjdC!e5*;9UvdLc=)(V_$!zG zau4&EChJY@zgrd6;3I|gLesUANB)vumUc_JI`@gCt>KqeNwMGWi!3XM#CgK6EZVjD zU~1&!dhhAQuPsV>=b!cKB4s_rKGn`=KFPZvXHz!T{NX(*_J%|43J_9Q&yNXr~*aPD{PNH{wh4h>e{PDO)f~OI8eXhYRBo? z=Z`&c=-9W`k;JC?z6ZL3d%(&g&#o*@UU6WTy!}XWq$1;teb2XFEWf+%?CZ+ktT`-S zV!p4WNq%mqY3$UX|Gg`>cJEEu5&sr;d{iTo)-nd4cDI@ zk(o@=cZ+tvbz|tp$s3>Fwf5Z@Oz7|7-sgpZF_@n<49vqy*BYE)eJVh*Zb}vQ1z>_o zB$m8z01%rg0dZ3v#&1;)cD}7d7}BbIT<=o50ye6ODXinDvbwe9MBQe>Oe*to<(4oG z34D|Qkg(6|=kc&r8Rf-cU2MjbNE9M$wkj)KC5VmXC`6~ysnn<=%+zR=xpKt9ku+Xv zUp-C%|E$U?K?vX&77B$_p&S*RJ*p$k z8q`g@b*RChCrLM9r1d5+jiQ)iU{(U}bgx7zQltVjpxtT;H39&s0AWOdmQbSxwVT$H z1oVa0MX5*vU(Iqp0H>4j0S|=*{GMosC^(*9;@sn(bpXw@S zd{mhLL_Iae9K8-^r$MXF(Hiu|DbRX~<6$m}tQxf{C+37WF*pndN(;nHg#=Lx7!7XY zC?K$0Im>#jO3^7qw4CgA!39ME0oZ{+K~l9=hikOB)>N+5;A#V|)?}&GxOy6%B^kQ* zf1$)v>?Wua}7~CIpEt3mg!!5O`2Skx@S(SFDSu0)7t# z_mA;}ooHu%AQ^J>l%67t1ZoDf4%N{H6AEYz4PR!HUJIv|)WxEjWan902my}D_dp$? zRxm-MS|O{(rz&%%H=!y@oChcws?nlTl4+ILc(9nbV@yPA!M>-5B?_3f#X!4Q8{E3! zPKZrzh2wfbUw_OpJ`X?U5C}3i$gK38lWR_{St&3p@LYDy$u%nlW(A(huK$}{@~O)d z<%cJr5WFfGKOC!r*DRU4sK6e*a7jjNoei*dPoQuEFOjG+#AjYOl2-#869lKrk#J41 zEL9d)WZk+?EtdK_!%I~oSNb1LIkU+9Xuyz{hsDEUyLP#9+dL6i*4BIK>BNlq zjP*kUJ)}%54+?v?&sSU5C{p6CFWI_$Q@7-|%dgiq{v_ef3-P5!Mf2i&j!N1*&Gw9J z-%D|u>MEQ2499!^_4iB9<>Y9@F_-Ji!((F$J9u5Zr0lv;Giv-g2z`|}9c%4}AKmoJ F{{laNFcSa( literal 0 HcmV?d00001 diff --git a/assets/dirt.png b/assets/dirt_floor.png similarity index 100% rename from assets/dirt.png rename to assets/dirt_floor.png diff --git a/assets/dirt_wall.png b/assets/dirt_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..f757f51ddb7cfa31fce229a9f20972c35ca3dbfe GIT binary patch literal 4728 zcmeHKdr(tX8jpa9gojzcN?ozn3%46X7K;_4PtvA>H;=hTvBC4bC$BK@dQg~_NvC2S$mw#JDJu!l z1x^woy_A{7@_x5*{`HM5=%|;TF&TdBm%GN_owS(q``#35RrbQH&WhwE5IW%xJx^Dx z+1d7$>tfo{`l`S^drpNU)L?VFHyv6rFPA-9l|7Oj^Ze_ijZyz9j{bPZXM*y&)uDfv zO0=E)LwBA(ZW;UDnWyfGxC*(n?N0o22(#>t&e=Y{K5Ih8^@W95M?ZQ0W|b?J`(<(s zp~>EMXx4=XF@<}rtBm7HJ~)2PGNUxSE9|2V9erTSlP|;_!531SudO{)y`^ws-p#;y zf!rnb#xE{Sx|3tGZ*2VM>iuJGyc3)MmmbaW2`tu#HIznU)N3@a69?&5t=gncYMwRz zWX^&bcnoL8TKbG}`~42it<2iYfS{Uv7i&w;*5q8=JyE}Wc|>+l=!dZjqq3{=@|p+TxRf@pivGST$c%O_o9>kd|jUEn1~q<_A0;@yKy1?%gw_SHR8zX&QF zX`9rXSBb?OSQC@VoA~+1+}Z=Yn)K+C+RA6QC-lxgy%YX(@_ufl;vHit_w1w6S0}pc z=WqSE<+F$l{znD%JwkRse(}QQ`eUEi8uI*}?<}6N@Aj9H;=}X4`E3;93JA9QkG&dY zxZ%(D6m6QaSQL}^xGiFxuA^r|x`P6)4br3KU|dAz6t#YPDA)g7oOburmjF86RA|Wwf%tsNOm&zBxGr5q;MVOVT+By9Y;7<+b(zH`4 z5O_Quz9)|Fa9IRGg+d`fMFNos0Tzh6z)oXc#O{t}Ao?)0q#JipPMUJqAqEpOIr3;V z3Jb6yZc!HdkWP6PccNG08lJQq&t z@<}@#Jrsh#2mGCRE~_sc0vC{0(gsZ3U{v87Lni7C#sLq80t;nx`n&+yZ&=cld629( zVq-MEbcO~3+y`*quzsDp&lp%43`(s7&tt;VYt=9_zLId@6ruEeDkL%yDwD+_W>hRj z#1imOm=z=gDhRfzKA#6Ar(F-njQpcZ2)6#)3;ARDE| zMPjtWmF93*)i4tj#CQ&<4WOY2jK;JWO#)C{=@Z_<+}HyFRbC+h2|1?2L+zrJ59PY6)C&Vx&C4DYJ*iWWp&$2bcVjH#yb(UGK@J_JB|K z)vr!Jn)B^X9*51pC}eXrJEFKqyyn!aALVWCDyq$268^!F!t$b?_8p-S9nT77Wqx5* zIo8u;^R;X2z{XXFcQ4)1d;7_hL)ol#$z6A<%Qye+tHXZRVw{3U_n&fDwISV}6|>8O z+e;$rkx}o)`h{b)e)^Y<*WLG2%B1!1=s$&iTGX+-vMJK8`TFv<3-9x)6O-m-!j@g5 z)@d_y*+@d&-K{*9tRX6JeC6Tz$mpfNVNdu^M@fs78?@i!?>b-L3P~uj`L(&_)BRdU z6}KFGOlljQ+_ZBKOn@0ZN0hc6h7DC$w;od^-a_C ZN1Qyq|B9y>FDy*m=yfUD{j-;p{1=q?$HxEw literal 0 HcmV?d00001 diff --git a/assets/grass.png b/assets/grass_floor.png similarity index 100% rename from assets/grass.png rename to assets/grass_floor.png diff --git a/assets/grass_wall.png b/assets/grass_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd08215e717db02c9880ff4827d566d66b98492 GIT binary patch literal 4527 zcmeHKdsGuw8V}{A0g-J{bcJOYa4CgJGL!dgf?yI&#AtYm)~=moCSg|cAQ?#TQAMpv zRVtQkw+gye*)CWgi(O8YQb9oMR>f2Gxa#U!-BYm@sJa&1g6^I0KJ7VsIA{AGIcG9= zzQ^x=-|v3kJ@=Lv7R{f+{Uw*f;Y`tK)#>0J%080t|#g3`ykPNuYV&pxBes7^0icpGvgZF%zK zAE!;yBN3wC??x;es;l!=hUyzkuXdGZaju_KQQ;pD+q+=#j>r|oF{OL=@JkM?3&y2l z_5D{q{<@cGi;Ft@Wc5zr&c919-I>!15tf6>eU)i-%WO+tHJ^O7p>)Al70yKN(S=o{ zYWe#gC%02^C(q}#{qeHDvbgN+?0~r6&gM34%eBP+kVZGo+*`G|;TNy4;SODeV4!fvSUlX>+p90)3L%sAJLIb9FET>TBS1RRH~uGLAn)d%aq#YvEdxz!ndymtSK?VXXT z-#WXwU^fwaY*TD{X!L0;uDL%oE3>U{eo@2;a4N| zw|sf-^<{CdVX^ZcT?%_kbGv{0XYo^mZ@$pK(q`{mTamx*m3Y z)^+Qd@={lK;FWXE3ohotb5Nj#G$_Oz{X*PixAF+mZlrh~s{>RhhohL|aS*1J6ayJ4 z3vE-v-Swwnh$fZr60u&Occ`dbTD!_gWvp71XdqT!wMr ze7@W5=DCGDyVJr)<#IV+fblU50Tzg>$i@&J#O8`&AqFtil*{C#9Sm)^K`bU=v==Z+ z7zTQ1C_bx0uOEiDxdvGPeDFPlgOBnAe5;i|+QY?Y3IWJqKtJi>$^`w)Pp4e=0;h@6 z6jC-OW;6t88uoV-IP<*ekS0ErM_GZX3(Sg+nR32PZy5GqDX`F1ht~^`J;suu%_C%u ziH+5G(-|EIa397UV?C6+*BDso^|;z@DqzFYsg*E0KTg_BG>LnM0!l0-%mjvrL=qz+ zl1YS!krWCMQYu5GGD>C?8s(#)bT$`5*h~})1;BYUz>%V;R8C2yh?$U)h)61yAVx7E zL&TVrl*^q5RKd@LyQs-msoC;W2jIf zl9)*^6luce*_~DbEGKOxEEL~ivv?IO;dqKcr-U({U_@fbBN#Jq06jq4NW0rLqROPL zR0cz^e4HK%k~SCp zFKf1aAjQCOQ4FM1N?@c!hENicLPTN=6oVW!A|{gwl!sX^l$r=H3&ZFxyP0tlPAbI$ zcm!O50`+nQy*#*7@nh}XxfHt&fHDNdkP*s+Fn=&vKD%QKWvk%-h!2I=VAK`^{03xT z>jFC=e|Re#BPntuX(eOV6>&15t=jLL3h&*U8ML6IUMH_hZi>_Kr!aY#70a0lzuDVee_D&IjD zHw(fxojNo5gVxNNt*;au#ha#flvl?DJ^#bxx&_-GOq!ggDNmle>qBhDZ>E2u?zGmm z_jFb63p}*vN@jZ^P#yLzX6Z^0~|3)ho6G6Q?|w4a$2 z;amMCSw6#OR!&r3wj}Dt5&zX4FU?)MWm!p|YF{Y4MLqRz$sb-X(ax@HWH7nb?{!J) z`2_7X_^*DQn-hP~&MTRD@M1*Yg_icl@Y23(U90CN{5hku>yxAJA@4S|lW4;?&PPEZ iwcq9~k*;V9iT!74we>>b@v}!*x^LYVs-|$~ysCM)K literal 0 HcmV?d00001 diff --git a/assets/natural walls/rock/end.png b/assets/natural walls/rock/end.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac74dec7dfb36e6ae60af5e8ef42eaf812ca75d GIT binary patch literal 4437 zcmeHKe^3)w9*=+^saR!N0ZVloTF0WBY&Ho=wgf~HAV4re_|Yp=HoI@bo+KNxOA;ux zptPgq5S2k&wJPnQ(oVgrRjKE7EF+FrY{#o!t=?I=*50W{En2ULoRxbUe&2QGhMDVs zWM;E(zwi6~yzlq(zTfY>x6zuD9wA*Il}IEJ<_u#le9sl1S)uTM(VZa@zHV0AiiBL! zhqyf)!a%EK|6jXP^4c$X7T51spnasJIy-&SuhYHD-}>P8SBa(8btQz_yLM(1K_o1S zJpJQm*LVHN+Sa>Qb8Y`K$yKQbdm4-Dx{_X>KlIUK;m2h+{a(|hUmi0!U%#>NhhN0M z%y+-H~nd+$S$$(|DLy+-~NS?74AvBtYwm%XfDu;@FgKx6w_S7BSF>5h`hm+tD& zz4OE3-Yd-~u%dGXp5py6DblQrxZrvCjsvZ88V27^i92Q7*5ADFLB;7kPi)UVxFA|T z|BtoOk8iIZ>g;oU`u!(|cRrFGv|e%aN9BwVZ(YurqbHi2$N8XvJ#|apy~Z7`JGS!N za|X0Jr2c4KL+|dzeKWQ{^U=j-dCb+Wmim=8YE3#OTRL%nswOlR7P?Mka;<6+ulIWosBG;HU z0s+4avNAz%6AFdT=ac(Xa?ayWDD`^10>c$JjzSHTuW|{bA9e9@BE&F;5%83Ubqg%# zLPSi`&Q%HqnGDV&qy9PF7RwmCiyvVD@}cmPZiP~gDV$ElL0+$ds5rU@1?A?`~@<2E=r2yr?2~~Nxs&dkj>1K;{%tEBV!8+XmD@gVv zO@U>`$(rPwI1>nGq9f3J40n?DXzT%HsAaJbMvkf!-7^~vGI4!^<|vjX0z;sqlv;|W zP@OgbN7amqM0KQ2jbaHpl}ZHwrBW&FFro?n=r4mzVh64{E761EpC2ieUscL7$^p zrs{ubi{*nP4sUt}%ft1n0;1uX$^#X{U&Ei}Y@nDBBv2LvNezdZ&i+I)=rtGv7{-ob8Vv4W0??p3ptPg*1e~H0>{^}bKhb%P5qzWvq&Ogt zkSmy=0j`iGBU|pN8LGt5amv&(#YnIUv15!zo2d9NJ`w{86Iu+k8hqlo*(j@^p6n-{_K# zU#5Tyo`8Jtsw9~m77ediq4unFW8lIixtDtUB{&LqXFSVGB=R`%nc;6s_CjHpV78dT zuFsBrSQR~U|F3W;iV;jjLMrDJ&*YN8K@rf1j}^)g@t{~(Hzx`z9WonJY`QZo%{L>u zkXf(n5hAru@7&_rw^L}ovS-ESuS=ThH`Lbr9(lXk6e^!r5#!bmUOZNDKKi7w|HW&% zIkJtjYI{#dABg{E*%lN1yN(N&zi{Tazas&%-ZO6&MjM~&tlXEmdeB7oxL18jRIj;t z8~K;>^8?=|o^8(l(AN>XxpVMBPB@cx|55k*4}3?9Kew5W^bCcZyx=*~o&Qj?ystC9 q^x*fmAM4vVaNtnVgMvGG`AI8ERfVks=g&g#C1z8O@!*Qmb^ivhLQ0+h literal 0 HcmV?d00001 diff --git a/assets/natural walls/rock/inner_a.png b/assets/natural walls/rock/inner_a.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7b1d538d92947e41727d22ea21e1b096563367 GIT binary patch literal 620 zcmV-y0+aoTP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5afkfA!+MMWG-Ef&E-X)CnqU~=gfG-*gu zTpR`0f`cE6RRrZcJ|~_s=z_$LT$f#b<6LoA;F)0~pIsmh6N{BTmiw4h4V8G7II5@`D%QMq%QZNAwzS#E11Q6H-IxXA&KDO=73E+PQuC$)N(FW!}NpJPE z=n*io4P0FJG)`lcc_CX>@2HM@dakSAh-}00012 zNkl;X_Em*Cs^{Yy?l`0i?Sp&?<3vA_6l5KvgNK z_ePGcSO?9lBe^zJbzjijo<~`_2t(v4t~Js-KJvmZm~jFr`Ci)bXrSl-0000>#yD-*cz&S9uqE7hbTJA9n34 zKBcR>yztFqH)m&T41IR+@bCSm2bVc^Kk}0z^C5LXk9z6Bva183wfLg0a!McBJb5og zWv)vtxc9IaeERjC>MJkZ`LMNZ6Y^1S-qBpor^OAOf2!ZMW?v-h^eg^%uVx2cyp{1a zwRpSG{qse?Aoe$=RD+(xoaQy3XTCG9-evgLg5-?1?svRbG;7)HD@R>@9X)4s#PXEN zpEfE|Kj~|E;KsDh)YOAlH(@43eLrbir1kLMauc28U6g-~29JU37`vQo5i7zxMV{!%m+8 zZM~CS^}>@2w-2<$x)0u$niF0Vxw~69PuKZ&?A{bPU@U%O#WxjSGAl^;UyN1mGO{~O zsaeu;()h;Lk9~2ysS~g0SrK0S+MGP)@FJ404|T8YkM%pBun*IkOePE`FoHlK0u^e4A{|46f?A@8b6A1E zgt?H&@j*o5q&l)DUuD2Icx@=Uc9p51CzN#j#2&u}ayH+2L~ z09;R^MuzsFdR-=snoJ~%YDpS+fk#K;9x#f^9u!16$N-57l504~lga80xPi<>f!<4_ zdfH?{Jv8n?b)+%V1PBA8Bgs(|rC|Tn&a#bqj%q4N1~fQHk_1!y0@LP4M0Aqh_9IqhZ@p@~Cfi_=ewUg!YV02gHW zs4xO{a{*8;(vqH9gO1eWT0&>k84WtzGy+-y!UC*CiB*ehbb7f*nivYE1Er;us`yv@)6dC^2|?s#LD5V+1%ZwLR*n;L#k-hF zI_Lv%{}?RTAv^ay#Xz%quLlP@lqR)s21#HJEk{MOlV6vFBV+>`Rh5eTvSu$YM76bj_ zHn?@coe&$|3J3LqvHp<1!Fl*0hd_{tLB^%;gj^GHjZ1-XfhVeKLauQsFfQ;!b^YJu zQjT1vKoFjQqVTHJwc||C^?YUxRcy_yq&#wnuR zVVm;#{pk;o)Q;AtozOH#v{i@}J|LaR74kt5ut<~>D-r3SxUz0~8U%56Yo6P9`Sx>V z$}{*>%R8;-I{xa-xc1EBdsh9Z{`Q9Lx%-?d4J`u zpZ&O{X{p8A@!JbQ&)L=O?_DU`^}r?9r1yAAy-2a>X<8Wo~v W=agwJwpuu-!fq?E9$mJ6>wf^NKpk=b literal 0 HcmV?d00001 diff --git a/assets/natural walls/rock/inner_abc.png b/assets/natural walls/rock/inner_abc.png new file mode 100644 index 0000000000000000000000000000000000000000..e8da18c3818238b1626a4d27ae6375e6fff22508 GIT binary patch literal 4408 zcmeHKe^3)w9*=-fb3(C1f42wer&S&u}4IjfCLFfOaU!|o86bNl4Qf~k_2e0 zh`rNcP%5^z6;az_>-CqNQo!?i%Ba^CxofYTJKMAVI`5#gv3bS*$csDv?NHtyz{l_?{s?4@ATNx!3QL@O7oiQ7Gh* zLB!9oF2(~8q0$c!5Mo>sN$6koE6>!QP(5%bIIAEc`p&+j-uY`|p1haqX)4NJ)7Ox* z4pGhd{oNbYoA-Xv!F}df-_|tkz=6NSrnivG`=4vAUQrtTU~19S=;VQ}toldK*T}au z?^bSoe?#0Kb-1NZ(b_Zc{fUIRAK%~`Gz|vb7d>eM2MJB$Q zoP03BlAX|eZRb8oPfuOqTIaog^!)Riy1Tt=F2+7m9cUwtzigFArfg=+X1mpF9*!Kw z+w}BvrmW*jlTMbbYLPu37nsr4u%GxUqt5WcqK7*lXHr_fUB~q$Xql|MqNJ&(H`UIq zdm<*mz4p~QYy zSQK3xZ;6_BV#cl)55CUVRfe{`TRkvPm2heGx!!w8^6XFOjVqFKRc8-v(Qk3<(LL9f zl)w1I{AUN6LS6fQH8YJ{8@N@^pCoJCzpH;L&}_(AoPWFU3YCvL{%t6Cti-z#q>7ZL zcEg)D7JPTE@u;fs^L(!8_1Wptm}ekdoRR@rt}JtZnolY6S|=yvZBK4M^RP0HK7Y-`Qo z6`wz8LaU-Sx7E~r*Sz5BlwH3)_GP1D_73?iM*3gu+B2Ew9Z{KV%|*Pu{mPQuxf@d} zK6olJDJi0HR#$O?fpS#&f$4-M88em{17TR(MiuEc;nsow2$m@qG zDv_k7h5RH{1_ZFm8yL#lP3}I-KtN^#EY<@E+WwNR`u&OH8K~VAW84`vFWhPmn&5oE^4j@{ER-r;OLQDXYEs-Lr9PJ|V zESWcp)PINroKyQ48Jy z3tE{6c(#J0Kt=%g1o>DBni{e9S8$$iI5edM9^i#g9?q&BH{~*`%|2owO5kR^{;(Ak zdmK_=T%%%*^GzHHhcng@XgKn8ZcU; zr;I2K3@%iwaT-w)2O89=C!Ltns0J#RdJL7-#|xy70wNV8S1^zV$4NkGbXt_eTn1E& zId!NJsP!oA(rIX%R%>)>-581$90RkG^o;dNq@p2}R*U0mqt1w8dYnSFMk9dUz%(%e z9M?NtIOQY_VJey;GFi?`!sTSVq#G#xK6iLP6r4!6TTL=dp&IS6dq}|r4PXs0KAH{k zqeBkH3swoFsHa-5!L=$irZ=ioS`DTh1?2;dhq)-Ss#OZj;E1>|1PljCONyBa3BndI z8p6y0QeZg;%X&;Q(J4f<92vI3f}%-*w2%UTq$*5Hs4)UFIMg_SYYB}$MWrHCWAH4^ zxGH}NEtU_GI=JXr3=ik840jFI)GAOu_%-?hdv&BHW!9KWk z!JSY!vK0>LC2l&u;BROhe!&?a_2eWI(sxp>Nx3GZz=Xh)*)=KGgcO(%crv?wHo2su zmnqo3>o;E$sNV(uhTQ-!vJ!|3o2Fu@Ow?AZ=Rgz;r9g}xB^9=M) OV$I04yz}_FP5%eJ$vKw* literal 0 HcmV?d00001 diff --git a/assets/natural walls/rock/inner_abcd.png b/assets/natural walls/rock/inner_abcd.png new file mode 100644 index 0000000000000000000000000000000000000000..35a7afe8f30f3c84f7d9c58e7fcdc7a49757a586 GIT binary patch literal 4394 zcmeHKeNYtV8DBmkO2qg2DjT`M~PHK z2VtLIaPd_fEYpS&&5{#d=|7z9N%@Md$N&1@dZ9OS$I zM>|Z`-@ll0zPz|iwR>7%`pwr{sjE4ShCS)CBTMdEdRQ^sB*@qk?O2#Jsbc2+n9#Hfn)!AF}jevbm8buXX~%i zC#{=diCxe+y=CvQx5UQUQ1jax`})F3pO#+heUg&8{35$$#lixt=NH@c+ueHPz?YfT zdtZ8CTi^ar*WqVpX8G3!`kTb_be;Q^rcHr^hWsC_`l{qMvx;X!~PLRBWKG;8Oe9*E}6!bl;)6#V2}&({;aD z(Y?lmgku}p>l$wzTy!U@WyyOV?o!X)ncC0CU&rshocpmOHdmg?u!#fsQj&ZWiUxy0bx^Ao{BBfZG#XJ1M{yhh2t=&)N^}VEim5Wi0EdMW89(on zc)<(HoU~J@kxVKT7>9@A^Z4xcVS2APr~=Rf4beVSqsCB=2OaGpN;v^QG8oV|dWa6t z&}b1S3N?O)%L#B^DRndj%MAPbYW!77IxK^7Rh$PvMKG&o%#_P)_QGKgSpqlj@hM(F z>@i4*ca4ZOCN_CQNoRB*zVjbU6_MBWc9wBuE6u zaLkFbE|$@g3Kh#xxq{zAgXQEsw3|bHUbiwJ3r=Mh+Ds~3JrKBJDXgL;7jOVQz_K zX|J0D`^R9x4%zu{CCo5rTYF@e6W&}*8xa|XmDgiGQA2NOcs@QjG=5Z(ErjSLjjE1Vu0U( z4QyRtCq#$0!a=>{P3K$u4X(qtI0K-bm}Fe~PRKPO*SHiI7kHw&Cgd8I0^^X5arlve+NZ$OzSTiuqm2yfXv*3}>#EP+VO%EeU{Lv01VmhD#@k zKT3cWOup5#@W&z;(F(9qjidVb2$xa+#(*1eBEOa0{iQty?H=t7<=+x+bAe=g5d|L(+t z$gv&gx-MQ>V`=(#aygnFPR`uadN}!V{i!FAr|;HZ(^m%H1rb5EoC3?qr4?KM16_nL A9smFU literal 0 HcmV?d00001 diff --git a/assets/natural walls/rock/inner_ac.png b/assets/natural walls/rock/inner_ac.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c61db74e8909216ffe3a94017c217565073c4a GIT binary patch literal 4393 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 literal 0 HcmV?d00001 diff --git a/assets/natural walls/rock/outer.png b/assets/natural walls/rock/outer.png new file mode 100644 index 0000000000000000000000000000000000000000..7850345d1fe6a610e3d1303f5e3df8402ec7c878 GIT binary patch literal 696 zcmV;p0!RIcP)EX>4Tx04R}tkv&MmKpe$iQ>7v;4t5afkfA!+MMWG-Ef&E-X)CnqU~=gfG-*gu zTpR`0f`cE6RRrZcJ|~_s=z_$LT$f#b<6LoA;F)0~pIsmh6N{BTmiw4h4V8G7II5@`D%QMq%QZNAwzS#E11Q6H-IxXA&KDO=73E+PQuC$)N(FW!}NpJPE z=n*io4P0FJG)`lcc_CX>@2HM@dakSAh-}0001^ zNklE!~nMd0000u!VIP?1SPYnY>7b1kEN9BF07_ik@0_GBd#`WF{m-5?mj( zShbdRON(|@6g?Gfv05LkFRHd8S`;5E72Rd=MOAzhL_I3C$bJ(L@odl8<2l>^$T^ew z=6?77zI%W7-tTtuU}?mWO8Y^4|2I# z2c1hnT!D*%C_n8G2>k#0aI!PB3L4na8s`-XE8I~Jm);CYe6)IaLw?OC#VHr{7u!P` zZtPx^EEh*{M_!&bL71N2v}BESXZx+#QM!bzp~;<* z98-nS*XaJ{&BP|@sfWa_q8CJ%hen3zf@m-o;1FB>{N_SBNJ_%F`J zXfMX;`_&$cuwm7|{dDD2^P&#VrdvUg*S%ZEZQGSE5cFF>8w^&n!SFb65N_$5VqHqr zxTxx^^m2H3aQtHKN9(Ga7lJQkR%8kXmv1^*QCL%+b#h&dIWKS6n}b8=j+qkuW@&!D zYq;=-=fkptUo}O2Ar&VMPP>N_KRhK|=5RDOEf6|IJyM-~U0`{P;~xUn}SDe&f_j(TH0Z z!VHKw6Ky#+K#hAlB&=qTD3_k2iW|Bf7n{bf#Rl3?2Px7&l%YT=>O zlD#c$E&E!|J<`>+v<9E9bszU|H#)-$`2FAQt0z&~6E=LDvTC9+PbyJW+tPo2Plb`m=;3N^Gb(0P(%{aar0(|M< znH=ZBBod#`C-%w3tUFtRYBU;&R3?$h5TJp03K$OeBaA1Ohv>pEQXaxhyEvL=;If1GNtcpIhWU|>}?Xln~$fljHfE6J7DNT-c zJR$2T-}sq8IK3SK<~_JiX+MrVpbWGu7R<;J`Mi5(qYmcR$4Hi-Nh~nLRWiyhx8sOI zX_p}ioWc=Ytwa&KhES>rHLg-6D0@Mf84rgu1jR!Ea4`*VP)dWUWoimZP?8CV!mg4c zcB!326mqrQfug9CkSTgWyy2!nRpPn5z2c!r07a=(a#DsX5mGKk5rs;PBN{uQLR7#f z2Z`HB8IcfxA_;6f>vrNGowO6rrX(&VJ21f$j_Ivt9V`<|pGd5^IOhNcpa*D%WPP3| zQyH|AO6PE%Pc%WURG=EQMyisbs6zcjX$s}`fLi2HQK?wo6%U^n41@!y#raAF009dS z4Q6mtILEp(STZx=puj{MpGnWoD69fg?0>g=}5Ine-A_IN`tgb0y zCeCD2VE^bY*vE4EcZxwxDJi=`4(iFS0L4J66A-(DQX&*dI1~yMK{yh+qUu5Sunx|L zyD5D(;1O^I3N*kK^jdeS;-2=#HA*;A8^feV+Q-B39Xj0U+JFl-iJRe4MeU6_zzjoe*OZ`gUgZQGB#)KI7LED{(RF@BacgGyP?eMSn*`0zfmggny+?Ck6w#04AX_yN4x7m!G zYL3WOPOsS58m^CfF1ofoV&Rqfl;kM7eeU;lZ6keUHM>fFZuz-1&zG^Zsda?yvgGSE zH?TdMUkV*p@On^Q$vAMmDB47CHp-0e0-2_)nMBTk1ac1g)uG{pFs-hmBse zGj&vL(doC}Ti$m0&PUVZr{~O2xUScHlN6O59#d|VZ9jKx5M|qYdtLp6zX+!m| Zqs)WqCvCPgUg8sJHcc{a{_|hn{SWiGuR{O; literal 0 HcmV?d00001 diff --git a/assets/underground.png b/assets/underground.png deleted file mode 100644 index 802e47dca4f604495268b5943641cca874708af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmV-<0*3vGP)EX>4Tx04R}tkv&MmKpe$iQ>7vmQ9Fn@WT;Md@e9XN#UfZJZG~1HOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2zhIPS;0dyl(!fY7Kg)$ED_s%9Cf zcudUZR>i<8f*8OcW)P8>sVCBl8F-Gbd-(Wz7vWjn=l&dhO5S9EPb7{q-LQx^h-Wt~ zo%23%h?OLT_?&pcpbHW|a$R=$jdRgqfoFz{OlqDuL@X9NSngm}GF0Me;;^D>lrLmm zRyc2QRx35ux+i~OFt4qoxlVHwaV#N$Bt*!lp^OSFL}=AWF_EJEn1_GF@h8b8ldB9y zjs;YqLUR1zfAG6ovoJO3CIw?a_ls?Ri~)gNpjo%=?_=9;o&f%5;7V)zs|{f8lk|F9 z3m*af+rY(jTa)*I%N=0&NtX=Ck^D4;LIHR`qi@OqL$^Thn%i4zAEysMhPqn50S*p< z@gilfd%U}+v$ucGwEFu2C=hb*3khoY00009a7bBm001r{001r{0eGc9b^rhX2XskI zMF;2%5feBMg4R;^0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zV@X6oR5;6}&`}P+AP56cy8GX`erbd$D~vBRrs)%AM*A_(ejr)eUjYEt17%+U`$aVb z^AAWG09SRMZ@VMJYAr%1#azf6ctT!Zcm(~r6R T<=%{800000NkvXXu0mjf_e=)t diff --git a/src/game.rs b/src/game.rs index bb80338..ca34edc 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,9 +1,7 @@ -use std::process::exit; - -use crate::citizen::Citizen; use crate::constants::*; -use crate::item::{Item, ItemBundle}; -use crate::tiles::TilePrefab; +use crate::item::ItemBundle; +use crate::tiles::FloorTilePrefab; +use crate::{citizen::Citizen, tiles::FixtureTilePrefab}; use bevy::prelude::*; use noise::{NoiseFn, Perlin}; use rand::prelude::*; @@ -28,17 +26,14 @@ pub fn setup_level(mut commands: Commands, asset_server: Res) { fn setup_tilemap(commands: &mut Commands, asset_server: &Res) { let noise = Perlin::new(0); + let mut floor_positions = Vec::new(); + // First pass: Generate and store floor tiles for y in -50..50 { for x in -50..50 { - // Base noise for terrain height let noise_value_a = noise.get([x as f64 * 0.01, y as f64 * 0.01]) * 1.25; - // Additional noise for bumpiness let noise_value_b = noise.get([x as f64 * 0.05, y as f64 * 0.05]) * 0.25; - - // Combine the two noise values let combined_noise_value = noise_value_a + noise_value_b; - // print!("({}, {}, {}), ", noise_value_a, noise_value_b, combined_noise_value); let noise_position = Vec3::new( (x as f32 * TILE_SIZE).round(), @@ -54,70 +49,125 @@ fn setup_tilemap(commands: &mut Commands, asset_server: &Res) { ); let items: Vec = vec![]; + let mut floor_type = None; if noise_position.z > position.z { if z < -15 { let noise_value = - noise.get([x as f64 * 0.1, y as f64 * 0.1, z as f64 * 0.1]); + noise.get([x as f64 * 0.05, y as f64 * 0.05, z as f64 * 0.05]); if noise_value < -0.5 { commands - .spawn(TilePrefab::air(position, asset_server)) + .spawn(FloorTilePrefab::air(position, asset_server)) .with_children(|parent| { for item in items { parent.spawn(item); } }); + floor_type = Some("air"); } else if noise_value < 0.8 { commands - .spawn(TilePrefab::rock(position, asset_server)) + .spawn(FloorTilePrefab::rock(position, asset_server)) .with_children(|parent| { for item in items { parent.spawn(item); } }); + floor_type = Some("rock"); } else { commands - .spawn(TilePrefab::dirt(position, asset_server)) + .spawn(FloorTilePrefab::dirt(position, asset_server)) .with_children(|parent| { for item in items { parent.spawn(item); } }); + floor_type = Some("dirt"); } } else { commands - .spawn(TilePrefab::dirt(position, asset_server)) + .spawn(FloorTilePrefab::dirt(position, asset_server)) .with_children(|parent| { for item in items { parent.spawn(item); } }); + floor_type = Some("dirt"); } } else if noise_position.z < position.z { commands - .spawn(TilePrefab::air(position, asset_server)) + .spawn(FloorTilePrefab::air(position, asset_server)) .with_children(|parent| { for item in items { parent.spawn(item); } }); + floor_type = Some("air"); } else { commands - .spawn(TilePrefab::grass(position, asset_server)) + .spawn(FloorTilePrefab::dirt(position, asset_server)) .with_children(|parent| { for item in items { parent.spawn(item); } }); + floor_type = Some("dirt"); + } + + // Store floor type and position + if let Some(floor_type) = floor_type { + floor_positions.push((position, floor_type)); } } } } + // Generate bedrock floor for x in -50..50 { for y in -50..50 { let position = Vec3::new(x as f32 * TILE_SIZE, y as f32 * TILE_SIZE, -150.); - commands.spawn(TilePrefab::bedrock(position, asset_server)); + commands.spawn(FloorTilePrefab::bedrock(position, asset_server)); + floor_positions.push((position, "bedrock")); + } + } + + // Sort floor positions by z coordinate (highest to lowest) to process from top to bottom + floor_positions.sort_by(|a, b| b.0.z.partial_cmp(&a.0.z).unwrap()); + + // Create a map to easily look up floor types at specific positions + let floor_map: std::collections::HashMap<(i32, i32, i32), &str> = floor_positions + .iter() + .map(|(pos, floor_type)| ((pos.x as i32, pos.y as i32, pos.z as i32), *floor_type)) + .collect(); + + // Second pass: Generate fixtures based on floor tiles above + for (position, _) in floor_positions.iter() { + let x = position.x as i32; + let y = position.y as i32; + let z = position.z as i32; + + // Look up the floor type one z-level above + if let Some(above_floor_type) = floor_map.get(&(x, y, z + TILE_SIZE as i32)) { + // Skip if the floor above is air or if we're at the surface + if *above_floor_type == "air" { + continue; + } + + // Calculate fixture position (one tile above current floor) + let fixture_position = Vec3::new(position.x, position.y, position.z + 1.); + + // Spawn appropriate fixture based on floor type above + match *above_floor_type { + "dirt" => { + commands.spawn(FixtureTilePrefab::dirt(fixture_position, asset_server)); + } + "rock" => { + commands.spawn(FixtureTilePrefab::rock(fixture_position, asset_server)); + } + "bedrock" => { + commands.spawn(FixtureTilePrefab::bedrock(fixture_position, asset_server)); + } + _ => {} + } } } } diff --git a/src/main.rs b/src/main.rs index 9423538..406117c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,7 +50,7 @@ fn main() { ) .init_resource::() .add_systems( - FixedUpdate, + Update, ( tile::camera_z_movement, tile::update_tile_visibility diff --git a/src/tile.rs b/src/tile.rs index 23a08fa..f676d41 100644 --- a/src/tile.rs +++ b/src/tile.rs @@ -4,62 +4,44 @@ use crate::item::Item; use bevy::ecs::system::ParamSet; use bevy::prelude::*; use std::collections::HashMap; -use std::process::exit; #[derive(Component, Clone)] #[require(Sprite)] -pub struct Tile { +pub struct FloorTile { pub id: u32, pub opaque: bool, - pub visible_range: [u32; 8], -} - -impl Default for Tile { - fn default() -> Self { - Self { - id: 1, - opaque: true, - visible_range: [0; 8], - } - } -} - -#[derive(Component)] -#[require(Tile)] -pub struct FloorTile { pub walkable: bool, pub astar_weight: u8, + pub visible_range: [u32; 8], } impl Default for FloorTile { fn default() -> Self { Self { + id: 0, + opaque: true, walkable: true, - astar_weight: 1, + astar_weight: 0, + visible_range: [0; 8], } } } -#[derive(Component)] -pub struct WallTile { - pub tile: Tile, +#[derive(Component, Clone)] +pub struct FixtureTile { + pub id: u32, pub solid: bool, - pub embrasure: bool, // Arrowslit, crenelle, grate, cage etc + pub visible_range: [u32; 8], } -#[derive(Component)] -#[require(Tile)] -pub struct HasWater { - pub height: u8, - pub astarmultiplier: f32, - pub swimmable: bool, -} - -#[derive(Component)] -pub struct DoorTile { - pub tile: Tile, - pub open: bool, - pub locked: bool, +impl Default for FixtureTile { + fn default() -> Self { + Self { + id: 0, + solid: true, + visible_range: [0; 8], + } + } } #[derive(Resource, Default)] @@ -76,63 +58,61 @@ pub fn camera_z_movement( z_index.0 -= 1.0; z_index.0 = z_index.0.clamp(-149.0, 5.0); camera_moved.0 = true; + println!("z_index = {}", z_index.0); } if keyboard_input.just_pressed(KeyCode::ShiftRight) { z_index.0 += 1.0; z_index.0 = z_index.0.clamp(-149.0, 5.0); camera_moved.0 = true; + println!("z_index = {}", z_index.0); } } pub fn tile_sprite_generate_occlusion_map( - mut query_set: ParamSet<(Query<(&Transform, &Tile)>, Query<(&mut Tile, &Transform)>)>, + mut query_set: ParamSet<( + Query<(&Transform, &FloorTile)>, + Query<(&Transform, &FixtureTile)>, + Query<(&mut FloorTile, &Transform)>, + Query<(&mut FixtureTile, &Transform)>, + )>, ) { - // First, create the tile map using only the first query + // Create the tile map using floor query let tile_map: HashMap<(i32, i32, i32), (bool, u32)> = { - let first_query = query_set.p0(); - first_query - .iter() - .map(|(transform, tile)| { + let mut map = HashMap::new(); + + // Add floor tiles + query_set.p0().iter().for_each(|(transform, tile)| { + map.insert( ( - ( - transform.translation.x as i32, - transform.translation.y as i32, - transform.translation.z as i32, - ), - (tile.opaque, tile.id), - ) - }) - .collect() - }; - - // Then, process tiles using the second query and our collected tile_map - let mut second_query = query_set.p1(); - second_query - .par_iter_mut() - .for_each(|(mut tile, transform)| { - // Clear existing visible range - tile.visible_range = [0; 8]; - - let pos = ( - transform.translation.x as i32, - transform.translation.y as i32, - transform.translation.z as i32, + transform.translation.x as i32, + transform.translation.y as i32, + transform.translation.z as i32, + ), + (tile.opaque, tile.id), // false indicates floor ); + }); + map + }; + let tile_size = TILE_SIZE as i32; + + // Helper function to calculate visibility + let calculate_visibility = + |pos: (i32, i32, i32), tile_map: &HashMap<(i32, i32, i32), (bool, u32)>| { + let mut visible_range = [0u32; 8]; - // Check visibility for each possible z-index for mut camera_z in -150..100 { - camera_z *= TILE_SIZE as i32; + camera_z *= tile_size; let mut is_visible = false; - // Skip if tile is above camera - if pos.2 > (camera_z) { + if pos.2 > camera_z { continue; } - // Check for opaque tiles above let mut is_occluded = false; - 'vertical_check: for z_offset in 1..=20 { - let above_pos = (pos.0, pos.1, pos.2 + (z_offset * TILE_SIZE as i32)); + + 'vertical_check: for z_offset in 1..=35 { + // check above + let above_pos = (pos.0, pos.1, pos.2 + (z_offset * tile_size)); if above_pos.2 <= camera_z { if let Some(&(is_opaque, _)) = tile_map.get(&above_pos) { if is_opaque { @@ -146,22 +126,20 @@ pub fn tile_sprite_generate_occlusion_map( } if !is_occluded { - // Check neighbors for visibility + let base_pos = (pos.0, pos.1, pos.2); 'neighbor_check: for x_offset in -1..=1 { for y_offset in -1..=1 { for z_offset in 0..=1 { if x_offset == 0 && y_offset == 0 && z_offset == 0 { continue; } - let neighbor_pos = ( - pos.0 + (x_offset * TILE_SIZE as i32), - pos.1 + (y_offset * TILE_SIZE as i32), - pos.2 + (z_offset * TILE_SIZE as i32), + base_pos.0 + x_offset * tile_size, + base_pos.1 + y_offset * tile_size, + base_pos.2 + z_offset * tile_size, ); if let Some(&(_, id)) = tile_map.get(&neighbor_pos) { if id == 0 { - // air tile is_visible = true; break 'neighbor_check; } @@ -172,158 +150,81 @@ pub fn tile_sprite_generate_occlusion_map( } if is_visible { - let z2 = ((camera_z / TILE_SIZE as i32) + 150) as usize; - tile.visible_range[z2 / 32] |= 1 << ((z2 % 32) as u32); + let z2 = ((camera_z / tile_size) + 150) as usize; + visible_range[z2 / 32] |= 1 << ((z2 % 32) as u32); } } + + visible_range + }; + + // Update floor tiles + query_set + .p2() + .par_iter_mut() + .for_each(|(mut tile, transform)| { + let pos = ( + transform.translation.x as i32, + transform.translation.y as i32, + transform.translation.z as i32, + ); + tile.visible_range = calculate_visibility(pos, &tile_map); + }); + + // Update fixture tiles + query_set + .p3() + .par_iter_mut() + .for_each(|(mut fixture, transform)| { + let pos = ( + transform.translation.x as i32, + transform.translation.y as i32, + transform.translation.z as i32 - 1, + ); + fixture.visible_range = calculate_visibility(pos, &tile_map); }); } pub fn update_tile_visibility( z_index: ResMut, - mut query: Query<(&Tile, &mut Visibility)>, -) { - let z_index = (z_index.0 as i32 + 150) as usize; - query.par_iter_mut().for_each(|(tile, mut visibility)| { - let is_visible = (tile.visible_range[z_index / 32] & (1 << (z_index % 32) as u32)) != 0; - *visibility = if is_visible { - Visibility::Visible - } else { - Visibility::Hidden - }; - }); -} - -// TODO CHECK THIS -pub fn update_occlusion_map_for_tile( - updated_pos: Vec3, mut query_set: ParamSet<( - Query<(&Transform, &Tile)>, - Query<(&mut Visibility, &mut Tile, &Transform)>, + Query<(&FloorTile, &mut Visibility)>, + Query<(&FixtureTile, &mut Visibility)>, )>, ) { - use std::collections::HashMap; + let z_index = (z_index.0 as i32 + 150) as usize; - // Convert the updated position into integer coordinates - let updated_pos = ( - updated_pos.x as i32, - updated_pos.y as i32, - updated_pos.z as i32, - ); + // Update floor visibility + query_set + .p0() + .par_iter_mut() + .for_each(|(tile, mut visibility)| { + let is_visible = (tile.visible_range[z_index / 32] & (1 << (z_index % 32) as u32)) != 0; + *visibility = if is_visible { + Visibility::Visible + } else { + Visibility::Hidden + }; + }); - // Build a tile map as before, but only for relevant tiles - let tile_map: HashMap<(i32, i32, i32), (bool, u32)> = { - let first_query = query_set.p0(); - first_query - .iter() - .map(|(transform, tile)| { - ( - ( - transform.translation.x as i32, - transform.translation.y as i32, - transform.translation.z as i32, - ), - (tile.opaque, tile.id), - ) - }) - .collect() - }; - - // Get the second query for mutable access to tiles - let mut second_query = query_set.p1(); - - // Iterate over a 3×3 area centered around the updated tile - for x_offset in -1..=1 { - for y_offset in -1..=1 { - for z_offset in -1..=1 { - let current_pos = ( - updated_pos.0 + x_offset, - updated_pos.1 + y_offset, - updated_pos.2 + z_offset, - ); - - // Find the tile at the current position - if let Some((mut visibility, mut tile, _)) = - second_query.iter_mut().find(|(_, _, transform)| { - let pos = ( - transform.translation.x as i32, - transform.translation.y as i32, - transform.translation.z as i32, - ); - pos == current_pos - }) - { - // Clear the visible range for the current tile - tile.visible_range = [0; 8]; - - // Recalculate visibility for each possible z-index - for camera_z in current_pos.2 - 20..=current_pos.1 + 1 { - let mut is_visible = false; - - // Skip if the tile is above the camera - if current_pos.2 > camera_z { - continue; - } - - // Check for occluding tiles above - let mut is_occluded = false; - for z_offset in 1..=20 { - let above_pos = - (current_pos.0, current_pos.1, current_pos.2 + z_offset); - if above_pos.2 <= camera_z { - if let Some(&(is_opaque, _)) = tile_map.get(&above_pos) { - if is_opaque { - is_occluded = true; - break; - } - } - } - } - - if !is_occluded { - // Check neighbors for visibility - 'neighbor_check: for x_offset in -1..=1 { - for y_offset in -1..=1 { - for z_offset in 0..=1 { - if x_offset == 0 && y_offset == 0 && z_offset == 0 { - continue; - } - - let neighbor_pos = ( - current_pos.0 + x_offset, - current_pos.1 + y_offset, - current_pos.2 + z_offset, - ); - - if let Some(&(_, id)) = tile_map.get(&neighbor_pos) { - if id == 0 { - // sky tile - is_visible = true; - break 'neighbor_check; - } - } - } - } - } - } - - if is_visible { - tile.visible_range[((camera_z + 150) / 32) as usize] |= - 1 << (((camera_z + 150) % 32) as u32); - } - } - - // Update visibility state - *visibility = Visibility::Hidden; - } - } - } - } + // Update fixture visibility + query_set + .p1() + .par_iter_mut() + .for_each(|(fixture, mut visibility)| { + let is_visible = + (fixture.visible_range[z_index / 32] & (1 << (z_index % 32) as u32)) != 0; + *visibility = if is_visible { + Visibility::Visible + } else { + Visibility::Hidden + }; + }); } pub fn tile_item_sprite_update( time: Res