From 7e275f06075502f3e2727e5fa1bf0605341212b0 Mon Sep 17 00:00:00 2001 From: Ratstail91 Date: Sat, 4 Mar 2023 22:59:12 +1100 Subject: [PATCH 1/2] Tilemap is working, in theory --- Airport.vcxproj | 1 + Toy | 2 +- assets/scripts/gameplay/lejana.toy | 2 +- assets/scripts/gameplay/tilemap.toy | 75 ++++++++++++++++++++++++++++ assets/scripts/init.toy | 2 +- assets/sprites/lejana.png | Bin 1569 -> 1889 bytes assets/sprites/tileset.png | Bin 0 -> 227 bytes box/box_engine.c | 2 +- box/lib_node.c | 2 +- 9 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 assets/scripts/gameplay/tilemap.toy create mode 100644 assets/sprites/tileset.png diff --git a/Airport.vcxproj b/Airport.vcxproj index 999d88a..9dbfdac 100644 --- a/Airport.vcxproj +++ b/Airport.vcxproj @@ -30,6 +30,7 @@ + diff --git a/Toy b/Toy index 6e9d42f..6698087 160000 --- a/Toy +++ b/Toy @@ -1 +1 @@ -Subproject commit 6e9d42f892a8e4a4827904d928eb372a5508cabe +Subproject commit 669808730e3b881c0995408b8331e2e29d5943cc diff --git a/assets/scripts/gameplay/lejana.toy b/assets/scripts/gameplay/lejana.toy index e51303a..66744ae 100644 --- a/assets/scripts/gameplay/lejana.toy +++ b/assets/scripts/gameplay/lejana.toy @@ -31,7 +31,7 @@ fn faceUp(node: opaque) { } fn faceLeft(node: opaque) { - node.setNodeRect(32 * 8, 0, SPRITE_WIDTH, SPRITE_HEIGHT); + node.setNodeRect(32 * 12, 0, SPRITE_WIDTH, SPRITE_HEIGHT); node.setNodeFrames(4); } diff --git a/assets/scripts/gameplay/tilemap.toy b/assets/scripts/gameplay/tilemap.toy new file mode 100644 index 0000000..2dfffeb --- /dev/null +++ b/assets/scripts/gameplay/tilemap.toy @@ -0,0 +1,75 @@ +import standard; +import node; + +//consts +var ROOM_WIDTH: int const = 5; +var ROOM_HEIGHT: int const = 5; + +var TILE_WIDTH: int const = 128; +var TILE_HEIGHT: int const = 128; + +//vars +var tilemap: [[int]] = null; + +//debug vars +var camX = 0; +var camY = 0; +var camW = 1080; +var camH = 720; + + + +//lifecycle functions +fn onInit(node: opaque) { + tilemap = generateBlankMap(ROOM_WIDTH, ROOM_HEIGHT); + + node.loadTexture("sprites:/tileset.png"); + node.setNodeRect(0, 0, 32, 32); + + //debug + print tilemap; + tilemap[1][1] = 1; + print tilemap; +} + +fn onDraw(node: opaque) { + //calc the region to render + var lowerX: int = round((camX - camW/2.0) / TILE_WIDTH); + var upperX: int = round((camX - camW*1.5) / TILE_WIDTH); + var lowerY: int = round((camY - camH/2.0) / TILE_HEIGHT); + var upperY: int = round((camY - camH*1.5) / TILE_HEIGHT); + + //bounds check + lowerX = max(0, lowerX); + upperX = min(upperX < 0 ? abs(upperX) : 0, ROOM_WIDTH); + lowerY = max(0, lowerY); + upperY = min(upperY < 0 ? abs(upperY) : 0, ROOM_HEIGHT); + + + //draw the tilemap + for (var j = lowerY; j < upperY; j++) { + for (var i = lowerX; i < upperX; i++) { + node.setCurrentNodeFrame(tilemap[i][j]); + node.drawNode(i * TILE_WIDTH, j * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT); + } + } +} + + +//utils functions +fn generateBlankMap(width: int, height: int) { + //generate the row template + var row: [int] = []; + for (var j: int = 0; j < height; j++) { + row.push(0); + } + + var result: [[int]] = []; + //generate the game map proper + for (var i: int = 0; i < width; i++) { + result.push(row); + } + + return result; +} + diff --git a/assets/scripts/init.toy b/assets/scripts/init.toy index 614326f..f531a69 100644 --- a/assets/scripts/init.toy +++ b/assets/scripts/init.toy @@ -31,7 +31,7 @@ initWindow("Skyland", 1080, 720, false); //kick off the logic of the scene graph - loadRootNode("scripts:/gameplay/lejana.toy"); + loadRootNode("scripts:/gameplay/tilemap.toy"); } //Globals go here diff --git a/assets/sprites/lejana.png b/assets/sprites/lejana.png index e1b279f20a205470bef5b7950330d922d183566a..0fcc02a760ee045090fc4bff508906f5b28d7dc6 100644 GIT binary patch literal 1889 zcmZvddo~J~xY9R*qheDk1S?%e3<( z0l^unl|d&1^%}I6a^1`3W_G1+NI&n0@o2SC@Db#dW3Awy+`4jTjsO$EWVzrrK$HMg z*1(?z;25&`hx%7GcuT|fQCpPn$#V)(ut$vj9mX#J+*K_O11?x0z&{DZf32(eo0uEb zxkjKCj3q@)(GR*(CWrnx?a$)=pK+JSv&KLjgU}Vx`m1xL=4tSB#|d^D{!6a=m&J|N zV|z_qMtx9h@gg@II<@f_dMZxfk&h{-iu%vWlX|a3vbc+;fWl(Mm4Yw*J6387{1WLQ zKEhg@hv9>Y|JJ*>M9xz5s@{~2HYh2`|Hp$G$W4wFf6W1bo92%ivN7+WDRw!DcRe3Gc(~Mqo-r7_~q$XxhN^zN2BT?=tG)D z&p^wPsPbxwNc+>y_XCsuQZpTLQOyf-ken{`4m3R%PIgX30H{w3;+?di@u?NBRzsLDsr?RffhfUQCTaf zbxMp*3=Q0|Oh#`hzo^^&~qEP&7=%_`S0`+^$%Rp43sE%R-7UBMl4cEHg-;meN z#dK5KLu^!d66#1=0_(xQj)S__E`-UZ&@Fg!BBfN?&;D@0o_{A!)&7&I4PC3GdZO73 zX$+6kM8dFLU_In%ewL(BB}4pR2v|bp-6mo0@J)bl7)3W02#0lmIXu$V#u=c*$j8JP z&(v+T51mQ%zl@hn+_JoO-s26S%438OK`VW+*gQ1RMC<%~%UEwgYnZZ!Ul(WQ$GR_@ z?+Negy1t=4!z}qRHt=SewQX2c1$fI1c+%1ONs2f>yQkl4jo(RQ=$_N>Fl|e)-1)gfY_(#{YJm%_UyoL7?D$@#}Fz5i}5MMyg;(w_eD?O*L4KJJPQ>VGiEr^P!a|365m(6;~p literal 1569 zcmV++2HyFJP)Px)+et)0RCt{2U9oQCI1qilY!e_=iv5EC`GIZo8SV|Z*fRBEv4vq=eWeQn+xs)r z-VYq$KS<%qfUAYBu*oHD{{x%*Pla=c~AU+Yy*_mubm$#{%ht3X5@crz;(4- zq562h_aA$2hY5<=1ZjR71BG1Nit{hcZ)2cP{GUC)je&v!|4~=FRgG%}Y;4ZHS@Ul< zYm!@we(n6lf8G3Z^8c?PQBW1|aykw<)F4Rnht(Ibl{X8d^=s!Z{_EzSlmE%LfWiR2 zEWZH&{yqHdCV}k|P?|ru)Uvpoj&2OI)vuku_^+FPZvGD{0AUb7BO$B_kmi@}0AUP( zuKY{$7yoth&&mIkKNggJL z3)1}39Y9*YcK+hOZvMIXpHcu8W|AQ!Grv2N5FC>r()^Z7r~yjr*UoRbl=_bZeilgc z8!o8=#GyawDIoKLy4OXJv(3Us@UwHjeg0*4v=}f;{gM2vF%-Q!#yZEc!itAbU zsP@Oi-{2PTpGE(m0uTw-MkvWIGyqOUzjl6w{zq{$u16ECox1=4vIVFQsr;XYM%42h z?5vUFQnO&XDE`xU`}&hyrXUw`aZlC%A^Hce1>_F+62@1%mAB>Qc4Khg%Nc`|{(=G* zVH>=?=3Eqwgw#psJ?l@J1O~bXI%gl}lBiMzsOabU?7cv{{>fr01F#hSM1S%XfEjoQ zLhcGYi2+!Ia%|@A{J_fiI^c9-m+A8`Qw(e1>fjtmg|EIJg0M{WgvW z{T%!a{S8MZ3T#dUs^xue+O8KpMjA7Ktusx@;{2(K{nl)2H?&Z2+U4@eK{TNhU>ye zHG*%X2|vThPi;)xB!6c8HinQh6ThT>@3=8J7?GQd0e9d(M;nOX;=J$PsXf@(`RAfP zW)8qR`+9tS!FIF8`|BR(!}Xb1vzh&XJrfxtA>P@SLD#}dBXWEELi)WJ%+J1sr$**) z;Qe)PS8&G*bqWh}irvGNd802blk_x`%aKmT=~fscF-a?v)Zg#%D< z20j|Mr2g;<#D%Nhe8$8*7C(X_44_j#hxhKWsRG2@0UP?e!2A$^hqeNoBL>4~PDr@X zH~8NA0PB@s$PeVxkDH%8c}UVfcqxeU;W`Ky;ZMsyI(AYFh8uvF_@`yQNwCcNz1vXX z0BCTFfwR+lIdB_(pr7>#7^DCDkG*^8&+We#1Aqp%1GY(M*MCYsV+@Tr0J06RJ^dC= zvQqfqaH{wab#!%^aPmm9ydHrDi-EAr1W=j=Fn~9n3DhJ1MCLANnnrP zXbri!dBaIyNxTny1aq(Zm{UUa<2h1xv> z%EamMJFg}5H)09$!JdETwV3}s>#=0J3Yr)Av zs{bDUV^V6coia4#M3dH7NaTbnM!AdMB4Pj7m>OU1cnS&%3JMAe3JMAe?hgM0-84fw Tz-sHZ00000NkvXXu0mjf9_AIz diff --git a/assets/sprites/tileset.png b/assets/sprites/tileset.png new file mode 100644 index 0000000000000000000000000000000000000000..b50809a35f7e600e1ac67edfdb5b8034af752189 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XBj({-ZRBb+KpkRfki(^QJ^V^vl1)BqSj{2A_NT0vu<&9Rx z8?Ak2zb_aw7093cAZ>g1XUg_0+mNeYd!~s!*nj5z)tT>ina)3c@6PPPUsu~>y_php pIUBaBFkG9&5J8Z0;{M}MbE6fU)^E74>I2=t;OXk;vd$@?2>=f9PZ$6I literal 0 HcmV?d00001 diff --git a/box/box_engine.c b/box/box_engine.c index 8d5cd30..55d0a84 100644 --- a/box/box_engine.c +++ b/box/box_engine.c @@ -432,7 +432,7 @@ void Box_execEngine() { } //render the world - SDL_SetRenderDrawColor(engine.renderer, 0, 0, 0, 255); //NOTE: This line can be disabled later + SDL_SetRenderDrawColor(engine.renderer, 128, 128, 128, 255); //NOTE: This line can be disabled later SDL_RenderClear(engine.renderer); //NOTE: This line can be disabled later Box_callRecursiveEngineNode(engine.rootNode, &engine.interpreter, "onDraw", NULL); diff --git a/box/lib_node.c b/box/lib_node.c index 6712b31..ac5f323 100644 --- a/box/lib_node.c +++ b/box/lib_node.c @@ -594,7 +594,7 @@ static int nativeSetCurrentNodeFrame(Toy_Interpreter* interpreter, Toy_LiteralAr //actually set Box_EngineNode* node = (Box_EngineNode*)TOY_AS_OPAQUE(nodeLiteral); - Box_setFramesEngineNode(node, TOY_AS_INTEGER(currentFrameLiteral)); + Box_setCurrentFrameEngineNode(node, TOY_AS_INTEGER(currentFrameLiteral)); //cleanup Toy_freeLiteral(nodeLiteral); From 16be4665cb6290dc0bd87dd7db54f9ccb6d078c2 Mon Sep 17 00:00:00 2001 From: Ratstail91 Date: Sun, 5 Mar 2023 00:29:55 +1100 Subject: [PATCH 2/2] Randomly generated floor --- Toy | 2 +- assets/scripts/gameplay/tilemap.toy | 74 +++++++++++++++++++++------- assets/sprites/tileset.png | Bin 227 -> 1858 bytes 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/Toy b/Toy index 6698087..76ddd57 160000 --- a/Toy +++ b/Toy @@ -1 +1 @@ -Subproject commit 669808730e3b881c0995408b8331e2e29d5943cc +Subproject commit 76ddd5703e73cc7435595f7b38c8d8a1c63a80d0 diff --git a/assets/scripts/gameplay/tilemap.toy b/assets/scripts/gameplay/tilemap.toy index 2dfffeb..427faa2 100644 --- a/assets/scripts/gameplay/tilemap.toy +++ b/assets/scripts/gameplay/tilemap.toy @@ -2,14 +2,39 @@ import standard; import node; //consts -var ROOM_WIDTH: int const = 5; -var ROOM_HEIGHT: int const = 5; +var ROOM_WIDTH: int const = 8; +var ROOM_HEIGHT: int const = 8; -var TILE_WIDTH: int const = 128; -var TILE_HEIGHT: int const = 128; +var TILE_WIDTH: int const = 64; +var TILE_HEIGHT: int const = 64; + +//map between the identity and position on the sprite sheet +var tilemap: [[string]] = null; + +var tileset: [string : [int]] = [ + "pillar": [0, 0], + + "floor-0": [0, 1], + "floor-1": [1, 1], + "floor-2": [2, 1], + "floor-3": [3, 1], + + "wall-t": [0, 2], + "wall-b": [1, 2], + "wall-l": [2, 2], + "wall-r": [3, 2], + + "corner-tl": [0, 3], + "corner-tr": [1, 3], + "corner-bl": [2, 3], + "corner-br": [3, 3], + + "edge-tl": [0, 4], + "edge-tr": [1, 4], + "edge-bl": [2, 4], + "edge-br": [3, 4] +]; -//vars -var tilemap: [[int]] = null; //debug vars var camX = 0; @@ -18,17 +43,12 @@ var camW = 1080; var camH = 720; - //lifecycle functions fn onInit(node: opaque) { - tilemap = generateBlankMap(ROOM_WIDTH, ROOM_HEIGHT); + tilemap = generateMap(ROOM_WIDTH, ROOM_HEIGHT); node.loadTexture("sprites:/tileset.png"); - node.setNodeRect(0, 0, 32, 32); - //debug - print tilemap; - tilemap[1][1] = 1; print tilemap; } @@ -49,7 +69,10 @@ fn onDraw(node: opaque) { //draw the tilemap for (var j = lowerY; j < upperY; j++) { for (var i = lowerX; i < upperX; i++) { - node.setCurrentNodeFrame(tilemap[i][j]); + + var pos = tileset[tilemap[i][j]]; + node.setNodeRect(pos[0] * 16, pos[1] * 16, 16, 16); + node.drawNode(i * TILE_WIDTH, j * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT); } } @@ -57,19 +80,32 @@ fn onDraw(node: opaque) { //utils functions -fn generateBlankMap(width: int, height: int) { - //generate the row template - var row: [int] = []; +fn generateMap(width: int, height: int) { + import random; + var rng: opaque = createRandomGenerator(clock().hash()); + + //generate an empty grid + var result: [[string]] = []; + var row: [string] = []; for (var j: int = 0; j < height; j++) { - row.push(0); + row.push("pillar"); } - var result: [[int]] = []; - //generate the game map proper for (var i: int = 0; i < width; i++) { result.push(row); } + //generate the contents of the grid + for (var j: int = 0; j < height; j++) { + for (var i: int = 0; i < width; i++) { + //select a random floor tile + var x: int = rng.generateRandomNumber() % 4; + var t: string = "floor-" + string x; + + result[i][j] = t; + } + } + return result; } diff --git a/assets/sprites/tileset.png b/assets/sprites/tileset.png index b50809a35f7e600e1ac67edfdb5b8034af752189..57e353517a2431395da7f712deaa5e09b3c28a27 100644 GIT binary patch delta 1807 zcmV+q2k`jg0m2TD7Ya}a1^@s6slRhYks&mH2G>bMK~#8N?VCN197Pa@&!(F;=6@M zYG!u2ySnPFnx66QapUzjZvTC@lzxK*2d&i-H^*djaO4jqn(_B!J)R{{{8}Jo)R%$p`O!wEOf_ z2uj`s(Y0gQ0AVkH2SuQ4dXzdxKD!Wq$Hep^^zQp_?Kik=Gjx31S6_U094|t`A9D&c z(i7;qkv;_olE%K^?HJh$5Hm}_dgD_Q$5aKA0CTddvBy#o|NnFN<9qj439tn(oxiv{ zyUZUKf9}rmarC$5w_xsO0*nR`Srhygq)&mlRL&`YrOx-}wS*mI69Fm?l{K+{h5dsH z;2c_vrTl9GTvav^VB}t$Glrv@7@6;kj=vI*L6O}i9!Tt`ue!A~uXpQRnOmUcD1E&^ z1cAF~`W&x|gH}K(S2Y3Jkm<7}mYpDp#z47JOk4gdj ztFP)y(g&YB*qtro?!CLav!`fHzHz3{KlAN1N1#t@>zsbjSio=fan9HK7Z(>(ADr!u zO{(A_2CxR4bI~(#U4*%0-(?O7&|>QfaAF1Y@XTjq6>zFwd^mcG#C{)t!=h^Ovo|NZ z2CZrvVQzJtq6R8+^ycLf`~B|)vLGrncFr7!;CcbhwSA^QJ>ZP0KXa((r1#IsxPq(f zXTkSw(X*bjJy;YQmGZJ*^&_lAh?Td7EUwJmZIv>A{j^Nbk>Gm*W>ggyX+8#7xMxV}_U<*v#zawEkP(}6@kFs! zcMoXwj|emeJz8A^*Seg+~6Xynjn1) zJ}(d?bJ9Ts7r(+2*5YjKPFo4s3nW9g#FDu{u&NRrxz#+zSapm3K*Eg+IX#k{5n=#* z*1plZb?^m0NY2IY7bg!td${Yl%=8{GavR8~@Zf>Zo;f+(LYYypZr`)nf;D{|_aUop zx5*j@{Ze%9E{}76(ZLvmXJ5f`REx-Fv@M1NXaz!F)jxNa7nQRfsDeeLtVO62uM~}0 zTmf=`Age$}D?rXfCtU;&&RdV(xK&??NrbH#3Czi=MMzL>q~P|u0%Td7>)#}xCj^|2*?n=ui-j?Z-=HAmI3-vcy3 z3%dc3%1qQ`p0ODB1=Qz6Th95*Py298&c)0Vn3_KK$i}!}+Ha-`@F3#ipx`59j)0@8 z5a+lE?p#$lVkFoK=2qfs-AMpfCPV$%z1f;Q;Q%%tJFPE7s-(zu~lqU z{?#6UecGu990zmHyOTX3Kx3-0EujxVPsnF}9!CHskU^YB0A(`^rU%b>9&>sNtAbv$ z#$1$8`Lgc%>*b4(CSa6BB|>IMebpm} zza?nV3QAPA9sHoVz%ARv()~h&K{Sl^N?nf}J!3~02_8o6Mf9VM#8DH^2tc;8hMHSUk@LGsRF~!)@_kgP8 z9S?pqD`d45l=opDA$6^_M#V@1E(tIayi)~KIouO#B+%^1!8PBLMg=S11S4dlBHjvf xsUC%MnQI5ZHv4(pK?E{@L%pA;pD!mT{{Tr+C741-yh#86002ovPDHLkV1fa$bp8MU delta 164 zcmX@a_n2{lIF|wk8v_HwqPcY~6BSMB87e$o978gk-_G19*c`xf)W>W=`ur^~Z?rPr zXzermeZiQiK>q9pY1_L$Q?_T>hFtyHGfnKl{xk2d&V0YibpG*scV-v