Add level switching
Changelog: - Water is now on a separate layer in LDtk - Update water loading in assets functions - Add actions to switch levelsscene_man
parent
ca392a0efd
commit
e0ea01a4de
|
@ -229,15 +229,24 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!pressed)
|
||||||
|
{
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case ACTION_RESTART:
|
case ACTION_RESTART:
|
||||||
puts("Restarting!");
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void player_simple_movement_system(Scene_t* scene)
|
static void player_simple_movement_system(Scene_t* scene)
|
||||||
{
|
{
|
||||||
|
@ -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_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_UP, ACTION_UP);
|
||||||
sc_map_put_64(&scene.scene.action_map, KEY_DOWN, ACTION_DOWN);
|
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_LEFT, ACTION_LEFT);
|
||||||
sc_map_put_64(&scene.scene.action_map, KEY_RIGHT, ACTION_RIGHT);
|
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)
|
while(true)
|
||||||
{
|
{
|
||||||
|
|
|
@ -62,11 +62,14 @@ with open(converted_filename, 'wb+') as out_file:
|
||||||
|
|
||||||
level_layout = {}
|
level_layout = {}
|
||||||
entity_layout = {}
|
entity_layout = {}
|
||||||
|
water_layout = {}
|
||||||
for layer in level['layerInstances']:
|
for layer in level['layerInstances']:
|
||||||
if layer["__identifier"] == "Tiles":
|
if layer["__identifier"] == "Tiles":
|
||||||
level_layout = layer
|
level_layout = layer
|
||||||
elif layer["__identifier"] == "Entities":
|
elif layer["__identifier"] == "Entities":
|
||||||
entity_layout = layer
|
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
|
# Dimensions of each level is obtained via __cWid and __cHei. Get the __gridSize as well
|
||||||
width = level_layout["__cWid"]
|
width = level_layout["__cWid"]
|
||||||
|
@ -79,6 +82,9 @@ with open(converted_filename, 'wb+') as out_file:
|
||||||
for tile in level_layout["gridTiles"]:
|
for tile in level_layout["gridTiles"]:
|
||||||
tiles_info[tile["d"][0]][0] = ids_tiletype_map[tile["t"]]
|
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"]:
|
for ent in entity_layout["entityInstances"]:
|
||||||
if ent["__identifier"] in ENTID_MAPPING:
|
if ent["__identifier"] in ENTID_MAPPING:
|
||||||
x,y = ent["__grid"]
|
x,y = ent["__grid"]
|
||||||
|
|
|
@ -13,5 +13,7 @@ typedef enum ActionType
|
||||||
ACTION_CONFIRM,
|
ACTION_CONFIRM,
|
||||||
ACTION_EXIT,
|
ACTION_EXIT,
|
||||||
ACTION_RESTART,
|
ACTION_RESTART,
|
||||||
|
ACTION_NEXTLEVEL,
|
||||||
|
ACTION_PREVLEVEL,
|
||||||
}ActionType_t;
|
}ActionType_t;
|
||||||
#endif // __ACTIONS_H
|
#endif // __ACTIONS_H
|
||||||
|
|
|
@ -17,7 +17,8 @@ typedef struct LevelTileInfo
|
||||||
{
|
{
|
||||||
uint8_t tile_type;
|
uint8_t tile_type;
|
||||||
uint8_t entity_to_spawn;
|
uint8_t entity_to_spawn;
|
||||||
uint8_t dummy[2];
|
uint8_t water;
|
||||||
|
uint8_t dummy[1];
|
||||||
}LevelTileInfo_t;
|
}LevelTileInfo_t;
|
||||||
|
|
||||||
typedef struct LevelMap
|
typedef struct LevelMap
|
||||||
|
|
|
@ -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 init_level_scene_data(LevelSceneData_t* data, uint32_t max_tiles, Tile_t* tiles);
|
||||||
void term_level_scene_data(LevelSceneData_t* data);
|
void term_level_scene_data(LevelSceneData_t* data);
|
||||||
void reload_level_tilemap(LevelScene_t* scene);
|
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);
|
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);
|
void change_a_tile(TileGrid_t* tilemap, unsigned int tile_idx, TileType_t new_type);
|
||||||
|
|
||||||
|
|
|
@ -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].tile_type = EMPTY_TILE;
|
||||||
scene->data.tilemap.tiles[i].moveable = true;
|
scene->data.tilemap.tiles[i].moveable = true;
|
||||||
scene->data.tilemap.tiles[i].size = (Vector2){TILE_SIZE, TILE_SIZE};
|
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)
|
switch (lvl_map.tiles[i].tile_type)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
change_a_tile(&scene->data.tilemap, i, SOLID_TILE);
|
change_a_tile(&scene->data.tilemap, i, SOLID_TILE);
|
||||||
break;
|
break;
|
||||||
case 2:
|
|
||||||
scene->data.tilemap.tiles[i].water_level = scene->data.tilemap.tiles[i].max_water_level;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
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);
|
Entity_t* ent = create_player(&scene->scene.ent_manager, &scene->scene.engine->assets);
|
||||||
CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T);
|
CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T);
|
||||||
p_ct->position.x = 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;
|
p_ct->position.y = (i / scene->data.tilemap.width) * scene->data.tilemap.tile_size;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
scene->data.tilemap.tiles[i].water_level = lvl_map.tiles[i].water;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -100,6 +99,26 @@ void reload_level_tilemap(LevelScene_t* scene)
|
||||||
load_level_tilemap(scene, scene->data.current_level);
|
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)
|
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;
|
TileType_t last_type = tilemap->tiles[tile_idx].tile_type;
|
||||||
|
|
Loading…
Reference in New Issue