diff --git a/level_load_test.c b/level_load_test.c index e7d0731..20c2018 100644 --- a/level_load_test.c +++ b/level_load_test.c @@ -229,13 +229,22 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed) break; } } - switch (action) + if (!pressed) { - case ACTION_RESTART: - puts("Restarting!"); - break; - default: - break; + switch (action) + { + case ACTION_RESTART: + reload_level_tilemap((LevelScene_t*)scene); + break; + case ACTION_NEXTLEVEL: + load_next_level_tilemap((LevelScene_t*)scene); + break; + case ACTION_PREVLEVEL: + load_prev_level_tilemap((LevelScene_t*)scene); + break; + default: + break; + } } } @@ -293,11 +302,12 @@ int main(void) sc_map_put_64(&scene.scene.action_map, KEY_R, ACTION_RESTART); + sc_map_put_64(&scene.scene.action_map, KEY_RIGHT_BRACKET, ACTION_NEXTLEVEL); + sc_map_put_64(&scene.scene.action_map, KEY_LEFT_BRACKET, ACTION_PREVLEVEL); sc_map_put_64(&scene.scene.action_map, KEY_UP, ACTION_UP); sc_map_put_64(&scene.scene.action_map, KEY_DOWN, ACTION_DOWN); sc_map_put_64(&scene.scene.action_map, KEY_LEFT, ACTION_LEFT); 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/res/ldtk_repacker.py b/res/ldtk_repacker.py index 0718440..6ba5328 100644 --- a/res/ldtk_repacker.py +++ b/res/ldtk_repacker.py @@ -62,11 +62,14 @@ with open(converted_filename, 'wb+') as out_file: level_layout = {} entity_layout = {} + water_layout = {} for layer in level['layerInstances']: if layer["__identifier"] == "Tiles": level_layout = layer elif layer["__identifier"] == "Entities": entity_layout = layer + elif layer["__identifier"] == "Water": + water_layout = layer # Dimensions of each level is obtained via __cWid and __cHei. Get the __gridSize as well width = level_layout["__cWid"] @@ -79,6 +82,9 @@ with open(converted_filename, 'wb+') as out_file: for tile in level_layout["gridTiles"]: tiles_info[tile["d"][0]][0] = ids_tiletype_map[tile["t"]] + for i, water_level in enumerate(water_layout["intGridCsv"]): + tiles_info[i][2] = water_level + for ent in entity_layout["entityInstances"]: if ent["__identifier"] in ENTID_MAPPING: x,y = ent["__grid"] diff --git a/scenes/engine/actions.h b/scenes/engine/actions.h index aae89f7..89a50b6 100644 --- a/scenes/engine/actions.h +++ b/scenes/engine/actions.h @@ -13,5 +13,7 @@ typedef enum ActionType ACTION_CONFIRM, ACTION_EXIT, ACTION_RESTART, + ACTION_NEXTLEVEL, + ACTION_PREVLEVEL, }ActionType_t; #endif // __ACTIONS_H diff --git a/scenes/engine/assets.h b/scenes/engine/assets.h index 2f2a4e0..2e48ecd 100644 --- a/scenes/engine/assets.h +++ b/scenes/engine/assets.h @@ -17,7 +17,8 @@ typedef struct LevelTileInfo { uint8_t tile_type; uint8_t entity_to_spawn; - uint8_t dummy[2]; + uint8_t water; + uint8_t dummy[1]; }LevelTileInfo_t; typedef struct LevelMap diff --git a/scenes/scene_impl.h b/scenes/scene_impl.h index 4a93d68..edad0c0 100644 --- a/scenes/scene_impl.h +++ b/scenes/scene_impl.h @@ -39,6 +39,8 @@ void free_sandbox_scene(LevelScene_t* scene); void init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* tiles); void term_level_scene_data(LevelSceneData_t* data); void reload_level_tilemap(LevelScene_t* scene); +void load_next_level_tilemap(LevelScene_t* scene); +void load_prev_level_tilemap(LevelScene_t* scene); bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num); void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type); diff --git a/scenes/scene_systems.c b/scenes/scene_systems.c index 54e1bd9..ca92177 100644 --- a/scenes/scene_systems.c +++ b/scenes/scene_systems.c @@ -66,15 +66,13 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num) 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}; + sc_map_clear_64v(&scene->data.tilemap.tiles[i].entities_set); 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; } @@ -84,13 +82,14 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num) { 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; + p_ct->position.x = (i % scene->data.tilemap.width) * scene->data.tilemap.tile_size; + p_ct->position.y = (i / scene->data.tilemap.width) * scene->data.tilemap.tile_size; } break; default: break; } + scene->data.tilemap.tiles[i].water_level = lvl_map.tiles[i].water; } return true; } @@ -100,6 +99,26 @@ void reload_level_tilemap(LevelScene_t* scene) load_level_tilemap(scene, scene->data.current_level); } +void load_next_level_tilemap(LevelScene_t* scene) +{ + unsigned int lvl = scene->data.current_level; + lvl++; + if (lvl < scene->data.level_pack->n_levels) + { + load_level_tilemap(scene, lvl); + } +} + +void load_prev_level_tilemap(LevelScene_t* scene) +{ + unsigned int lvl = scene->data.current_level; + lvl--; + if (lvl >= 0) + { + load_level_tilemap(scene, lvl); + } +} + void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type) { TileType_t last_type = tilemap->tiles[tile_idx].tile_type;