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,14 +229,23 @@ static void level_do_action(Scene_t* scene, ActionType_t action, bool pressed)
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (!pressed)
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
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;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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_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)
|
||||
{
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -13,5 +13,7 @@ typedef enum ActionType
|
|||
ACTION_CONFIRM,
|
||||
ACTION_EXIT,
|
||||
ACTION_RESTART,
|
||||
ACTION_NEXTLEVEL,
|
||||
ACTION_PREVLEVEL,
|
||||
}ActionType_t;
|
||||
#endif // __ACTIONS_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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue