diff --git a/level_load_test.c b/level_load_test.c index 9b95688..842f3d7 100644 --- a/level_load_test.c +++ b/level_load_test.c @@ -190,19 +190,6 @@ static void level_scene_render_func(Scene_t* scene) EndDrawing(); } -static inline unsigned int get_tile_idx(int x, int y, const TileGrid_t* tilemap) -{ - unsigned int tile_x = x / TILE_SIZE; - unsigned int tile_y = y / TILE_SIZE; - - if (tile_x < tilemap->width && tile_y < tilemap->height) - { - return tile_y * tilemap->width + tile_x; - } - - return MAX_N_TILES; -} - static void simple_friction_system(Scene_t* scene) { CMovementState_t* p_mstate; @@ -290,48 +277,7 @@ int main(void) scene.data.level_pack = pack; scene.data.current_level = 0; - - scene.data.tilemap.width = scene.data.level_pack->levels[scene.data.current_level].width; - scene.data.tilemap.height = scene.data.level_pack->levels[scene.data.current_level].height; - scene.data.tilemap.n_tiles = scene.data.tilemap.width * scene.data.tilemap.height; - assert(scene.data.tilemap.n_tiles <= MAX_N_TILES); - memset(scene.data.tile_sprites, 0, sizeof(scene.data.tile_sprites)); - - LevelMap_t lvl_map = scene.data.level_pack->levels[scene.data.current_level]; - // Level loading in here - for (size_t i = 0; i < scene.data.tilemap.n_tiles;i++) - { - all_tiles[i].max_water_level = 4; - all_tiles[i].solid = NOT_SOLID; - all_tiles[i].tile_type = EMPTY_TILE; - all_tiles[i].moveable = true; - all_tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE}; - - switch (lvl_map.tiles[i].tile_type) - { - case 1: - change_a_tile(&scene.data.tilemap, i, SOLID_TILE); - break; - case 2: - all_tiles[i].water_level = all_tiles[i].max_water_level; - break; - default: - break; - } - switch (lvl_map.tiles[i].entity_to_spawn) - { - case 1: - { - Entity_t* ent = create_player(&scene.scene.ent_manager, &scene.scene.engine->assets); - CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T); - p_ct->position.x = i & scene.data.tilemap.width; - p_ct->position.y = i / scene.data.tilemap.width; - } - break; - default: - break; - } - } + assert(load_level_tilemap(&scene, 0) == true); update_entity_manager(&scene.scene.ent_manager); @@ -356,7 +302,6 @@ int main(void) sc_map_put_64(&scene.scene.action_map, KEY_RIGHT, ACTION_RIGHT); sc_map_put_64(&scene.scene.action_map, KEY_P, ACTION_METAL_TOGGLE); - while(true) { diff --git a/scenes/scene_systems.c b/scenes/scene_systems.c index 241eea1..54e1bd9 100644 --- a/scenes/scene_systems.c +++ b/scenes/scene_systems.c @@ -1,4 +1,5 @@ #include "scene_impl.h" +#include "ent_impl.h" #include "constants.h" void init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* tiles) @@ -44,17 +45,59 @@ void term_level_scene_data(LevelSceneData_t* data) UnloadRenderTexture(data->game_viewport); // Unload render texture } -static void clear_level_tilemap(LevelSceneData_t* data) -{ -} - bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num) { + if (level_num >= scene->data.level_pack->n_levels) return false; + + LevelMap_t lvl_map = scene->data.level_pack->levels[level_num]; + uint32_t n_tiles = lvl_map.width * lvl_map.height; + if (n_tiles > scene->data.tilemap.max_tiles) return false; + + scene->data.current_level = level_num; + scene->data.tilemap.width = lvl_map.width; + scene->data.tilemap.height = lvl_map.height; + scene->data.tilemap.n_tiles = n_tiles; + + clear_entity_manager(&scene->scene.ent_manager); + for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++) + { + scene->data.tilemap.tiles[i].max_water_level = 4; + scene->data.tilemap.tiles[i].solid = NOT_SOLID; + scene->data.tilemap.tiles[i].tile_type = EMPTY_TILE; + scene->data.tilemap.tiles[i].moveable = true; + scene->data.tilemap.tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE}; + + switch (lvl_map.tiles[i].tile_type) + { + case 1: + change_a_tile(&scene->data.tilemap, i, SOLID_TILE); + break; + case 2: + scene->data.tilemap.tiles[i].water_level = scene->data.tilemap.tiles[i].max_water_level; + break; + default: + break; + } + switch (lvl_map.tiles[i].entity_to_spawn) + { + case 1: + { + Entity_t* ent = create_player(&scene->scene.ent_manager, &scene->scene.engine->assets); + CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T); + p_ct->position.x = i & scene->data.tilemap.width; + p_ct->position.y = i / scene->data.tilemap.width; + } + break; + default: + break; + } + } return true; } void reload_level_tilemap(LevelScene_t* scene) { + load_level_tilemap(scene, scene->data.current_level); } void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type)