From d4d3b317e2e095a82ac44d72f48bfdc47cd03f0d Mon Sep 17 00:00:00 2001 From: En Yi Date: Thu, 28 Sep 2023 16:10:20 +0800 Subject: [PATCH] Complete level data packing and loading --- main.c | 13 ++++- res/ldtk_repacker.py | 36 ++++++++++--- res/testLevels.lvldata.zst | Bin 398 -> 475 bytes scenes/engine/EC/EC.h | 3 +- scenes/engine/EC/entManager.c | 1 + scenes/game_systems.c | 3 +- scenes/scene_systems.c | 93 ++++++++++++++++++++++++++-------- 7 files changed, 116 insertions(+), 33 deletions(-) diff --git a/main.c b/main.c index 34f948c..830b11c 100644 --- a/main.c +++ b/main.c @@ -30,10 +30,13 @@ int main(void) init_memory_pools(); init_assets(&engine.assets); - //load_from_infofile("res/assets.info", &engine.assets); - //init_player_creation("res/player_spr.info", &engine.assets); +#ifndef NDEBUG + load_from_infofile("res/assets_debug.info", &engine.assets); + init_player_creation("res/player_spr.info", &engine.assets); +#else load_from_rres("res/myresources.rres", &engine.assets); init_player_creation_rres("res/myresources.rres", "player_spr.info", &engine.assets); +#endif init_item_creation(&engine.assets); LevelScene_t sandbox_scene; @@ -43,6 +46,12 @@ int main(void) LevelScene_t level_scene; level_scene.scene.engine = &engine; init_game_scene(&level_scene); + level_scene.data.tile_sprites[ONEWAY_TILE] = get_sprite(&engine.assets, "tl_owp"); + level_scene.data.tile_sprites[LADDER] = get_sprite(&engine.assets, "tl_ldr"); + level_scene.data.tile_sprites[SPIKES] = get_sprite(&engine.assets, "d_spikes"); + level_scene.data.tile_sprites[SPIKES + TILE_90CWROT] = get_sprite(&engine.assets, "l_spikes"); + level_scene.data.tile_sprites[SPIKES + TILE_90CCWROT] = get_sprite(&engine.assets, "r_spikes"); + level_scene.data.tile_sprites[SPIKES + TILE_180ROT] = get_sprite(&engine.assets, "u_spikes"); LevelPack_t* pack = get_level_pack(&engine.assets, "TestLevels"); if (pack != NULL) { diff --git a/res/ldtk_repacker.py b/res/ldtk_repacker.py index 6ba5328..301e392 100644 --- a/res/ldtk_repacker.py +++ b/res/ldtk_repacker.py @@ -16,19 +16,39 @@ with open(args.filename, 'r') as f: #pprint.pprint(level_pack_data) ENUMIDS_TILETYPE_MAPPING = { 'Solid': 1, - 'Water': 2 + 'WoodenPlat': 2, + 'Ladder': 3, + 'LSpike': 4, + 'RSpike': 5, + 'USpike': 6, + 'DSpike': 7, + 'EmptyWCrate': 8, + 'LArrowWCrate': 9, + 'RArrowWCrate': 10, + 'UArrowWCrate': 11, + 'DArrowWCrate': 12, + 'BombWCrate': 13, + 'EmptyMCrate': 14, + 'LArrowMCrate': 15, + 'RArrowMCrate': 16, + 'UArrowMCrate': 17, + 'DArrowMCrate': 18, + 'BombMCrate': 19, + 'Boulder': 20, + 'Runner': 21, + 'Player': 22, } -ENTID_MAPPING = { - 'Player': 1 -} +#ENTID_MAPPING = { +# 'Player': 1 +#} # First go to tilesets and find Simple_tiles identifier, then find enumTags to identifier which tile type is what tileid ids_tiletype_map = {} tileset_defs = level_pack_data["defs"]["tilesets"] for ts_def in tileset_defs: - if ts_def["identifier"] != "Simple_tiles": + if ts_def["identifier"] != "Items_spritesheet": continue for tag in ts_def["enumTags"]: ids_tiletype_map[tag["tileIds"][0]] = ENUMIDS_TILETYPE_MAPPING[tag["enumValueId"]] @@ -85,10 +105,10 @@ with open(converted_filename, 'wb+') as out_file: for i, water_level in enumerate(water_layout["intGridCsv"]): tiles_info[i][2] = water_level + # Subject to change for ent in entity_layout["entityInstances"]: - if ent["__identifier"] in ENTID_MAPPING: - x,y = ent["__grid"] - tiles_info[y*width + x][1] = ENTID_MAPPING[ent["__identifier"]] + x,y = ent["__grid"] + tiles_info[y*width + x][0] = ENUMIDS_TILETYPE_MAPPING[ent["__identifier"]] out_file.write(struct.pack("<32s2H", level_name.encode('utf-8'), width, height)) for tile in tiles_info: diff --git a/res/testLevels.lvldata.zst b/res/testLevels.lvldata.zst index 2877d06c268ce4ec81855838331a79a62d7508af..3c1026bad9dfb16ac7348f1ca6008fcab222e89b 100644 GIT binary patch literal 475 zcmV<10VMt?wJ-f-5Eg9?0D=V&7m%kK1J@ZiZ=WOi?Uu1QGy_QdC|gPa|NHE-T+;7U z5{+E0m*GJ0#Bo>W_l-n$SOmVPWp+fP5l}F+LnEjcfc2B+lgAo~R(*Y9TF&G9U z6bB;=1u}#{LX;xLm`EfLlc*#~at!&xT_>r}2Qdasl{rZU=-KKQ4XG&)MjfBWE%=B% zcVVgsgDsrO|EC@1wJ2}86_~mK)Z3QMy}b1`KPqeBS4W%9z}Ub?_285FywW~^8vRHA z=7aa1fWQL60iyZEk}Mz*(?5kX{aa?j5SN@c=c~Ur^YqI~eoHSHGO{FW=8( zoln%}Zc+6fXNf*Lw^zLae#lQs_ra74Y?yZ*@C4G$K@PhMUutIMz{3wRnIMRFiL=|RMz<@2~`m{`k2^^;@>DrX*LiyPNBp~i7DvmMa{e^G0IIdi_v?KPqR z#T9KVjX%A$wFSRWMpFOCi4)xByn||QIId{*tk_V4TkXvVHUTyb~ RU5H5?%e6*Z?@|#ME|f93;%Wc@ literal 398 zcmV;90df8)wJ-f-5Ecat0Fnd@6rd*=4uk0F@8Y_=Roum19%Pdw17!QDOr1G7paS8w z_dv$rN>y4>k>G$h5{IFhfWoLyRnm3D%IOJD%_Y9cGC_mC-%+%22g{onZEI1^Dhqi?(~XQCjXph5wkoN5Dv890CKu!xU>`sBa*9$ zzJtoufu`^dA!h=1vR7TS1SIlx@+M5!sY;%zsOj zG}o;$K@=p1LjPx_wC#^>aXR?zCFE8W$B8)VxUtpW{G|sxfnfo1kJSHNObq_7XGn|J zGa$3dL76Q$j33KE%##77PCAD9oU;+w=r3rMh5G~FjIbXj1)4PgQspawn_pos = (Vector2){0, 0}; p_ent->m_tag = tag; sc_queue_add_last(&p_manager->to_add, e_idx); p_ent->manager = p_manager; diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 0990542..457c257 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -208,10 +208,9 @@ void player_respawn_system(Scene_t* scene) memcpy(&new_ct->position, &p_ct->position, sizeof(p_ct->position)); } p_player->m_alive = true; - memset(&p_ct->position, 0, sizeof(p_ct->position)); + p_ct->position = p_player->spawn_pos; memset(&p_ct->velocity, 0, sizeof(p_ct->velocity)); memset(&p_ct->accel, 0, sizeof(p_ct->accel)); - } } } diff --git a/scenes/scene_systems.c b/scenes/scene_systems.c index 3b6f83e..a9ad852 100644 --- a/scenes/scene_systems.c +++ b/scenes/scene_systems.c @@ -1,4 +1,5 @@ #include "scene_impl.h" +#include "water_flow.h" #include "ent_impl.h" #include "constants.h" @@ -72,30 +73,82 @@ bool load_level_tilemap(LevelScene_t* scene, unsigned int level_num) 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) + + if (lvl_map.tiles[i].tile_type == 1) { - case 1: change_a_tile(&scene->data.tilemap, i, SOLID_TILE); - 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) * 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; + + scene->data.tilemap.tiles[i].water_level = lvl_map.tiles[i].water; } + // Two pass + for (size_t i = 0; i < scene->data.tilemap.n_tiles;i++) + { + if (lvl_map.tiles[i].tile_type >= 8 && lvl_map.tiles[i].tile_type < 20) + { + uint32_t tmp_idx = lvl_map.tiles[i].tile_type - 8; + uint32_t item_type = tmp_idx % 6; + ContainerItem_t item = CONTAINER_EMPTY; + switch (item_type) + { + case 1: item = CONTAINER_LEFT_ARROW;break; + case 2: item = CONTAINER_RIGHT_ARROW;break; + case 3: item = CONTAINER_UP_ARROW;break; + case 4: item = CONTAINER_DOWN_ARROW;break; + case 5: item = CONTAINER_BOMB;break; + default: break; + } + + Entity_t* ent = create_crate(&scene->scene.ent_manager, &scene->scene.engine->assets, tmp_idx > 5, item); + CTransform_t* p_ct = get_component(ent, CTRANSFORM_COMP_T); + 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; + } + else + { + + switch (lvl_map.tiles[i].tile_type) + { + case 2: + change_a_tile(&scene->data.tilemap, i, ONEWAY_TILE); + break; + case 3: + change_a_tile(&scene->data.tilemap, i, LADDER); + break; + case 4: + case 5: + case 6: + case 7: + change_a_tile(&scene->data.tilemap, i, SPIKES); + break; + case 20: + { + Entity_t* ent = create_boulder(&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) * scene->data.tilemap.tile_size; + p_ct->position.y = (i / scene->data.tilemap.width) * scene->data.tilemap.tile_size; + } + break; + case 21: + { + create_water_runner(&scene->scene.ent_manager, lvl_map.width, lvl_map.height, i); + } + break; + case 22: + { + 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) * scene->data.tilemap.tile_size; + p_ct->position.y = (i / scene->data.tilemap.width) * scene->data.tilemap.tile_size; + ent->spawn_pos = p_ct->position; + } + break; + default: + break; + } + } + } + return true; }