From 0644801b73be54c2d7a16e169b35f904412716be Mon Sep 17 00:00:00 2001 From: KikooDX Date: Wed, 10 Nov 2021 00:37:45 +0100 Subject: [PATCH] level module --- CMakeLists.txt | 3 +++ inc/conf.h | 3 +++ inc/level.h | 19 +++++++++++++++ jle.ini | 2 +- lvl/fxconv-metadata.txt | 3 +++ lvl/test.kble | Bin 0 -> 356 bytes res/fxconv-metadata.txt | 3 +++ res/tileset.png | Bin 0 -> 4737 bytes src/level.c | 50 ++++++++++++++++++++++++++++++++++++++++ src/main.c | 20 ++++++++++++++++ 10 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 inc/conf.h create mode 100644 inc/level.h create mode 100644 lvl/fxconv-metadata.txt create mode 100644 lvl/test.kble create mode 100644 res/fxconv-metadata.txt create mode 100644 res/tileset.png create mode 100644 src/level.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 642d3fa..6f5c3c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,12 +14,15 @@ include_directories(inc) set(SOURCES src/main.c src/input.c + src/level.c ) set(LEVELS + lvl/test.kble ) set(ASSETS + res/tileset.png ${LEVELS} ) diff --git a/inc/conf.h b/inc/conf.h new file mode 100644 index 0000000..230cd9b --- /dev/null +++ b/inc/conf.h @@ -0,0 +1,3 @@ +#pragma once + +#define TILE_SIZE 16 diff --git a/inc/level.h b/inc/level.h new file mode 100644 index 0000000..3c0ce81 --- /dev/null +++ b/inc/level.h @@ -0,0 +1,19 @@ +#pragma once + +struct LevelBin { + unsigned char format; + unsigned char chunk_size; + unsigned short width; + unsigned short height; + unsigned char data[]; +} __attribute__((__packed__)); + +struct Level { + int width; + int height; + char *data; +}; + +struct Level level_load(struct LevelBin *restrict); +void level_free(struct Level *restrict); +void level_draw(struct Level *restrict); diff --git a/jle.ini b/jle.ini index b6c2cd2..dd20334 100644 --- a/jle.ini +++ b/jle.ini @@ -1,5 +1,5 @@ # https://git.sr.ht/~kikoodx/jle -tileset = assets/graphics/tileset.png +tileset = res/tileset.png tile_size = 16 new_level_width = 25 new_level_height = 14 diff --git a/lvl/fxconv-metadata.txt b/lvl/fxconv-metadata.txt new file mode 100644 index 0000000..7b61593 --- /dev/null +++ b/lvl/fxconv-metadata.txt @@ -0,0 +1,3 @@ +*.kble: + type: binary + name_regex: (.*)\.kble lvl_\1 diff --git a/lvl/test.kble b/lvl/test.kble new file mode 100644 index 0000000000000000000000000000000000000000..5bc4bcd2cb26376548ea3f5880dcbe09924b52c2 GIT binary patch literal 356 zcmZ{d(G37G2tsv%{@?zK9$>XGt)xi<57pd0TRzI(a-Z@9wQ(0~;uJ{SE`Uth0E@!2 l+(G8pK~znds1uwUa0(c95N%$-Bh{x?UTGjhm1Qt8=m(2n0Hy!{ literal 0 HcmV?d00001 diff --git a/res/fxconv-metadata.txt b/res/fxconv-metadata.txt new file mode 100644 index 0000000..8134606 --- /dev/null +++ b/res/fxconv-metadata.txt @@ -0,0 +1,3 @@ +tileset.png: + type: bopti-image + name: bimg_tileset diff --git a/res/tileset.png b/res/tileset.png new file mode 100644 index 0000000000000000000000000000000000000000..9dfce003b12cf92f5d412b69fa246bf69e4ae5b9 GIT binary patch literal 4737 zcmeHKX;f2577mR9g5ov^qe#c7&6?z8fh-ahldv2NA|RmB)4t?Y@F`iyLIT<#pbmmE zfZ*0{2s(fuiVHZ5f`DM7xKDRuyCB#q;3!~^xV20rpu(B{<2lp+$jN)Dck8R~-uu<9 zda2DJ!TyshXIc^ngh_z`f>8KNgx3@cGkDh#zFkHjn9fTKkJ5yqI-*jgkm9j`s7X)) zBGBVf0zrSfJYQD%(8XfYU`@udg@mcmS=XbqI^_=UibsXsSGr1fZQE>fJcrnSVD{<3 z!JY@U4jB&o@E3Vu%X=H`8MYJGwe6>`UEcBZaYOT;l4_rr?wvj{->2pM&6{X)cbDo| zW@?TXr$2E~S;cgY!~5S_uTRb0lHOE3JFEXefPVjh2H&=-Q$+p{(RmMuhY9xzG2K++A+r-&KYR({orJ0go(0_>aYV z&a_PPan17EE2?D1)s@w`UhB89YSq4oKAJ0e;CBp5Wz^f+`wdWU`}?2$Tdw2G?|}+ErYRWG1YiVdwJDdRN(O z>uge4xrLb{@kVYy-ZXMktl(l{+TxVC%>@r^ECTXp9en7NOK46g+p5@dnC$v|^_^ve zg51XSUj>;Qi9249G%+$dODHTX{mNb2x;(dNC-V@7M<-oqJXkWHp}rIm?fH*Hm3s2N zv)Gl?OH0%(+j)qkFX}zRs={l}$^3JbAl&&0m6quWv=2I=uQ{{MJ)U`3>db zlefweE|tfgEXX@u-L>80=XIA>bUB@(@Z$envSMK0+B3yVemb6nCkJm0UhNq;iCWc9(d7I8aY+ z)Mw7x|FGU?fO>Ib$}`h56?e`R{LoY@`g-1?g`IX;MU>P|^R!m0wSP`to$S_-d9cE} zj|QsOz4|8kEvexw+X3CMHqNu&VxU7`Tn`^hmDH@ouLikUirzuDtjKq)4*f-F`s+jp zFf^`ef9>q-5BINLK}X)3RUWDW>b^Y@1cJ#%oX-ylb_r5<;bAskXnryMRa`H`k`sVy#yRIrCUR57t z>6h}-w)wT4*%viFI2;ZYp;PH}GDMKo333gpC(G4y4HQEh0-%!x^i^Fzj z0yfG)jZ}tt;QEFH@ zT)qmR8igucp@`*?46zaol*aNVdJauW0Ir6J1VhCS*L)a=8+saA0nW05dv*pg!2~-HoP3tP zV{(nj^;rsh7I>_>#^m}e1wIQrR$c!$xhy{&cz_)K3(~>kOlytZA$Sxr69@SVjE5q^ zYko~KY)w!GEK?H*R?`ia31RmhJ7_f51d4>_zgSJMH6>J@ul9r{$3TH^ctEoRJ22(l z;NYP5{5QMo%F++xH9#>Fpdkv literal 0 HcmV?d00001 diff --git a/src/level.c b/src/level.c new file mode 100644 index 0000000..180314e --- /dev/null +++ b/src/level.c @@ -0,0 +1,50 @@ +#include "level.h" +#include "conf.h" +#include +#include + +struct Level +level_load(struct LevelBin *restrict s) +{ + struct Level level; + int i = s->width * s->height; + level.width = s->width; + level.height = s->height; + level.data = malloc(i); + while (i-- > 0) { + level.data[i] = s->data[i]; + } + return level; +} + +void +level_free(struct Level *restrict s) +{ + free(s->data); +} + +void +level_draw(struct Level *restrict s) +{ + extern bopti_image_t bimg_tileset; + const int tileset_width = bimg_tileset.width / TILE_SIZE; + int i; + int x = 0; + int y = 0; + + for (i = 0; i < s->width * s->height; i++) { + const int sx = x * TILE_SIZE; + const int sy = y * TILE_SIZE; + const int tile = s->data[i]; + const int rx = tile % tileset_width * TILE_SIZE; + const int ry = tile / tileset_width * TILE_SIZE; + + dsubimage(sx, sy, &bimg_tileset, rx, ry, TILE_SIZE, TILE_SIZE, + DIMAGE_NONE); + + if (++x >= s->width) { + x = 0; + y++; + } + } +} diff --git a/src/main.c b/src/main.c index cccc79d..a2a49d1 100644 --- a/src/main.c +++ b/src/main.c @@ -1,10 +1,30 @@ #include "input.h" +#include "level.h" +#include + +extern struct LevelBin lvl_test; +struct Level level; + +static void draw(void); int main(void) { input_init(); + level = level_load(&lvl_test); + + draw(); while (!input_pressed(K_EXIT)) input_update(); + + level_free(&level); return 1; } + +static void +draw(void) +{ + dclear(C_BLACK); + level_draw(&level); + dupdate(); +}