diff --git a/CMakeLists.txt b/CMakeLists.txt index 48d49ac..a77f2ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ set(SOURCES ) set(ASSETS + res/tileset.png res/test.kble ) diff --git a/inc/level.h b/inc/level.h index da10d1b..014acb7 100644 --- a/inc/level.h +++ b/inc/level.h @@ -1,4 +1,5 @@ #pragma once +#include "visual_data.h" #include struct LevelBin { @@ -11,6 +12,7 @@ struct Level { int width, height, size; const struct LevelBin *bin; uint8_t *data; + struct VisualData *visual_data; }; void level_init(void); @@ -18,3 +20,5 @@ void level_deinit(void); void level_load(const struct LevelBin *); void level_reload(void); +void level_regen_visual_data(void); +void level_draw(void); diff --git a/inc/visual_data.h b/inc/visual_data.h new file mode 100644 index 0000000..788dec8 --- /dev/null +++ b/inc/visual_data.h @@ -0,0 +1,5 @@ +#pragma once + +struct VisualData { + int x, y, img_x, img_y, visible; +}; diff --git a/res/fxconv-metadata.txt b/res/fxconv-metadata.txt index 1e3fa88..7723342 100644 --- a/res/fxconv-metadata.txt +++ b/res/fxconv-metadata.txt @@ -1,3 +1,6 @@ +*.png: + type: bopti-image + name_regex: (.*)\.png bimg_\1 *.kble: type: binary name_regex: (.*)\.kble kble_\1 diff --git a/src/level.c b/src/level.c index 9ee3742..c003d89 100644 --- a/src/level.c +++ b/src/level.c @@ -1,7 +1,11 @@ #include "level.h" +#include "conf.h" +#include "visual_data.h" +#include #include static struct Level level; +extern bopti_image_t bimg_tileset; static void level_free(void); @@ -9,6 +13,7 @@ void level_init(void) { level.data = NULL; + level.visual_data = NULL; } void @@ -26,9 +31,11 @@ level_load(const struct LevelBin *b) level.height = b->height; level.size = i; level.data = malloc(i); + level.visual_data = malloc(i * sizeof(struct VisualData)); level.bin = b; while (i-- > 0) level.data[i] = b->data[i]; + level_regen_visual_data(); } void @@ -37,6 +44,39 @@ level_reload(void) level_load(level.bin); } +void +level_regen_visual_data(void) +{ + const int tileset_width = bimg_tileset.width / TILE_SIZE; + int y = level.height; + while (y-- > 0) { + int x = level.width; + while (x-- > 0) { + const int i = x + y * level.width; + const int tile = level.data[i]; + struct VisualData *const vd = &level.visual_data[i]; + vd->x = x * TILE_SIZE; + vd->y = y * TILE_SIZE; + vd->img_x = tile % tileset_width * TILE_SIZE; + vd->img_y = (int)(tile / tileset_width) * TILE_SIZE; + vd->visible = tile != 0; + } + } +} + +void +level_draw(void) +{ + int i = level.size; + while (i-- > 0) { + const struct VisualData *const vd = &level.visual_data[i]; + if (vd->visible) { + dsubimage(vd->x, vd->y, &bimg_tileset, vd->img_x, + vd->img_y, TILE_SIZE, TILE_SIZE, 0); + } + } +} + static void level_free(void) { @@ -44,4 +84,8 @@ level_free(void) free(level.data); level.data = NULL; } + if (level.visual_data != NULL) { + free(level.visual_data); + level.visual_data = NULL; + } } diff --git a/src/main.c b/src/main.c index 6dfd704..30d69b8 100644 --- a/src/main.c +++ b/src/main.c @@ -53,6 +53,7 @@ static void draw(void) { dclear(C_BLACK); + level_draw(); player_draw(&player); dupdate(); }