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 2877d06..3c1026b 100644 Binary files a/res/testLevels.lvldata.zst and b/res/testLevels.lvldata.zst differ diff --git a/scenes/engine/EC/EC.h b/scenes/engine/EC/EC.h index 47ed2f2..e1e366b 100644 --- a/scenes/engine/EC/EC.h +++ b/scenes/engine/EC/EC.h @@ -221,11 +221,12 @@ static inline void set_bbox(CBBox_t* p_bbox, unsigned int x, unsigned int y) } struct Entity { + Vector2 spawn_pos; unsigned long m_id; unsigned int m_tag; - bool m_alive; unsigned long components[N_COMPONENTS]; EntityManager_t* manager; + bool m_alive; }; enum EntityUpdateEvent diff --git a/scenes/engine/EC/entManager.c b/scenes/engine/EC/entManager.c index c0a3c5b..9bb382b 100644 --- a/scenes/engine/EC/entManager.c +++ b/scenes/engine/EC/entManager.c @@ -101,6 +101,7 @@ Entity_t *add_entity(EntityManager_t* p_manager, unsigned int tag) Entity_t* p_ent = new_entity_from_mempool(&e_idx); if (p_ent == NULL) return NULL; + p_ent->spawn_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; }