Add tileset info in level pack

main
En Yi 2024-11-09 13:30:32 +08:00
parent abdf246382
commit 188c2e30a5
4 changed files with 17 additions and 3 deletions

View File

@ -275,7 +275,7 @@ static LevelPack_t* add_level_pack_zst(Assets_t* assets, const char* name, const
for (lvls = 0; lvls < n_levels; ++lvls) for (lvls = 0; lvls < n_levels; ++lvls)
{ {
printf("Parsing level %u\n", lvls); printf("Parsing level %u\n", lvls);
output.size = 38; output.size = 40;
output.pos = 0; output.pos = 0;
do do
@ -311,6 +311,7 @@ static LevelPack_t* add_level_pack_zst(Assets_t* assets, const char* name, const
memcpy(&pack_info->pack.levels[lvls].width, level_decompressor.out_buffer + 32, 2); memcpy(&pack_info->pack.levels[lvls].width, level_decompressor.out_buffer + 32, 2);
memcpy(&pack_info->pack.levels[lvls].height, level_decompressor.out_buffer + 34, 2); memcpy(&pack_info->pack.levels[lvls].height, level_decompressor.out_buffer + 34, 2);
memcpy(&pack_info->pack.levels[lvls].n_chests, level_decompressor.out_buffer + 36, 2); memcpy(&pack_info->pack.levels[lvls].n_chests, level_decompressor.out_buffer + 36, 2);
memcpy(&pack_info->pack.levels[lvls].flags, level_decompressor.out_buffer + 38, 2);
pack_info->pack.levels[lvls].level_name[31] = '\0'; pack_info->pack.levels[lvls].level_name[31] = '\0';
printf("Level name: %s\n", pack_info->pack.levels[lvls].level_name); printf("Level name: %s\n", pack_info->pack.levels[lvls].level_name);
printf("WxH: %u %u\n", pack_info->pack.levels[lvls].width, pack_info->pack.levels[lvls].height); printf("WxH: %u %u\n", pack_info->pack.levels[lvls].width, pack_info->pack.levels[lvls].height);

View File

@ -59,6 +59,7 @@ typedef struct LevelMap
uint16_t width; uint16_t width;
uint16_t height; uint16_t height;
uint16_t n_chests; uint16_t n_chests;
uint16_t flags; // In case of extras
LevelTileInfo_t* tiles; LevelTileInfo_t* tiles;
}LevelMap_t; }LevelMap_t;

View File

@ -82,6 +82,11 @@ with open(converted_filename, 'wb+') as out_file:
level_name = level["identifier"] level_name = level["identifier"]
print("Parsing level", level_name) print("Parsing level", level_name)
level_metadata = level['fieldInstances']
level_tileset = 0;
for data in level_metadata:
if data["__identifier"] == "TileSet":
level_tileset = data["__value"]
level_layout = {} level_layout = {}
entity_layout = {} entity_layout = {}
@ -97,7 +102,7 @@ with open(converted_filename, 'wb+') as out_file:
# 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"]
height = level_layout["__cHei"] height = level_layout["__cHei"]
print(f"Dim.: {width}x{height}") print(f"Dim.: {width}x{height}. N Tiles: {width * height}")
# Create a W x H array of tile information # Create a W x H array of tile information
n_tiles = width * height n_tiles = width * height
tiles_info = [[0,0,0] for _ in range(n_tiles)] tiles_info = [[0,0,0] for _ in range(n_tiles)]
@ -120,7 +125,7 @@ with open(converted_filename, 'wb+') as out_file:
x,y = ent["__grid"] x,y = ent["__grid"]
tiles_info[y*width + x][0] = ENUMIDS_TILETYPE_MAPPING[ent["__identifier"]] tiles_info[y*width + x][0] = ENUMIDS_TILETYPE_MAPPING[ent["__identifier"]]
out_file.write(struct.pack("<32s3H", level_name.encode('utf-8'), width, height, n_chests)) out_file.write(struct.pack("<32s4H", level_name.encode('utf-8'), width, height, n_chests, level_tileset))
for tile in tiles_info: for tile in tiles_info:
out_file.write(struct.pack("<3Bx", *tile)) out_file.write(struct.pack("<3Bx", *tile))

View File

@ -106,6 +106,13 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num)
scene->data.coins.current = 0; scene->data.coins.current = 0;
scene->data.coins.total = lvl_map.n_chests; scene->data.coins.total = lvl_map.n_chests;
#define N_SOLID_TILESETS 3
static const char* SOLID_TILE_SELECTIONS[N_SOLID_TILESETS] = {
"stile0", "stile1", "stile2"
};
scene->data.selected_solid_tilemap = lvl_map.flags;
scene->data.solid_tile_sprites = get_sprite(&scene->scene.engine->assets, SOLID_TILE_SELECTIONS[lvl_map.flags]);
clear_all_game_entities(scene); clear_all_game_entities(scene);
for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++) for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++)