diff --git a/rpg/rpg.c b/rpg/rpg.c index 5791026..9406e96 100644 --- a/rpg/rpg.c +++ b/rpg/rpg.c @@ -67,7 +67,6 @@ player.graphic = f_bitmap("/player.pbm"); set_outline(&player, OUTLINE, true, false); set_standard_sprite_off(&player); - reset_pos(&player, 0, 0); if (!load_level("level14")) { @@ -88,6 +87,7 @@ level_exited_tile = NULL; if (level_code) unload_code(level_code); + level_code = NULL; for (int i = 0; i < num_bg; i++) { @@ -95,13 +95,13 @@ } num_bg = 0; + hashmap_iterate_pairs(&tile_tags, remove_all_hashmap, NULL); + if (last_level) { free(last_level); last_level = NULL; } - - hashmap_iterate_pairs(&tile_tags, remove_all_hashmap, NULL); } #define SOLID 1 @@ -113,6 +113,7 @@ bool load_level(char* level_name) { + unload_level(); memset(grid, 0, sizeof(grid)); @@ -339,6 +340,8 @@ LOAD_DYN(level_update) } + reset_pos(&player, 0, 0); + return 0; } @@ -416,6 +419,10 @@ void update_ent_movement(ent_t* ent, bool debug); +char nextLevel[32] = ""; +char nextLevelTag[32] = ""; +bool in_door = false; + __EXPORT__ int loop(int ms) { float t = ms / 1000.0f; @@ -429,6 +436,7 @@ update_ent_movement(&player, move_debug); if (level_update) level_update(t); + in_door = false; d_clear(); @@ -481,6 +489,25 @@ } } + if (nextLevel[0] != 0) + { + unload_level(); + load_level(nextLevel); + if (nextLevelTag[0] != 0) + { + grid_t* find = get_tile_by_tag(nextLevelTag); + if (find) + { + int target_gx, target_gy; + grid_pos(find, &target_gx, &target_gy); + player.x = target_gx * GRID; + player.y = target_gy * GRID; + } + } + nextLevel[0] = 0; + nextLevelTag[0] = 0; + } + return 0; } @@ -499,6 +526,33 @@ *gy = (int)grid_y; } +__EXPORT__ bool door(grid_t g, char* t1, char* level, char* t2) +{ + if (in_door) return false; + if (g.tag && strcmp(g.tag, t1) == 0) + { + if (level) + { + in_door = true; + strcpy(nextLevel, level); + strcpy(nextLevelTag, t2); + } + else + { + grid_t* find = get_tile_by_tag(t2); + if (find) + { + in_door = true; + int target_gx, target_gy; + grid_pos(find, &target_gx, &target_gy); + player.x = target_gx * GRID; + player.y = target_gy * GRID; + } + } + } + return in_door; +} + void update_ent_movement(ent_t* ent, bool debug) { int ox_i = (int)roundf(ent->ox); diff --git a/rpg/rpg.c b/rpg/rpg.c index 5791026..9406e96 100644 --- a/rpg/rpg.c +++ b/rpg/rpg.c @@ -67,7 +67,6 @@ player.graphic = f_bitmap("/player.pbm"); set_outline(&player, OUTLINE, true, false); set_standard_sprite_off(&player); - reset_pos(&player, 0, 0); if (!load_level("level14")) { @@ -88,6 +87,7 @@ level_exited_tile = NULL; if (level_code) unload_code(level_code); + level_code = NULL; for (int i = 0; i < num_bg; i++) { @@ -95,13 +95,13 @@ } num_bg = 0; + hashmap_iterate_pairs(&tile_tags, remove_all_hashmap, NULL); + if (last_level) { free(last_level); last_level = NULL; } - - hashmap_iterate_pairs(&tile_tags, remove_all_hashmap, NULL); } #define SOLID 1 @@ -113,6 +113,7 @@ bool load_level(char* level_name) { + unload_level(); memset(grid, 0, sizeof(grid)); @@ -339,6 +340,8 @@ LOAD_DYN(level_update) } + reset_pos(&player, 0, 0); + return 0; } @@ -416,6 +419,10 @@ void update_ent_movement(ent_t* ent, bool debug); +char nextLevel[32] = ""; +char nextLevelTag[32] = ""; +bool in_door = false; + __EXPORT__ int loop(int ms) { float t = ms / 1000.0f; @@ -429,6 +436,7 @@ update_ent_movement(&player, move_debug); if (level_update) level_update(t); + in_door = false; d_clear(); @@ -481,6 +489,25 @@ } } + if (nextLevel[0] != 0) + { + unload_level(); + load_level(nextLevel); + if (nextLevelTag[0] != 0) + { + grid_t* find = get_tile_by_tag(nextLevelTag); + if (find) + { + int target_gx, target_gy; + grid_pos(find, &target_gx, &target_gy); + player.x = target_gx * GRID; + player.y = target_gy * GRID; + } + } + nextLevel[0] = 0; + nextLevelTag[0] = 0; + } + return 0; } @@ -499,6 +526,33 @@ *gy = (int)grid_y; } +__EXPORT__ bool door(grid_t g, char* t1, char* level, char* t2) +{ + if (in_door) return false; + if (g.tag && strcmp(g.tag, t1) == 0) + { + if (level) + { + in_door = true; + strcpy(nextLevel, level); + strcpy(nextLevelTag, t2); + } + else + { + grid_t* find = get_tile_by_tag(t2); + if (find) + { + in_door = true; + int target_gx, target_gy; + grid_pos(find, &target_gx, &target_gy); + player.x = target_gx * GRID; + player.y = target_gy * GRID; + } + } + } + return in_door; +} + void update_ent_movement(ent_t* ent, bool debug) { int ox_i = (int)roundf(ent->ox); diff --git a/rpg/rpg_imports.h b/rpg/rpg_imports.h index 3f38698..72ad2b0 100644 --- a/rpg/rpg_imports.h +++ b/rpg/rpg_imports.h @@ -5,3 +5,4 @@ __IMPORT__ bool (*is_player)(ent_t* ent); __IMPORT__ grid_t* (*get_tile_by_tag)(char* tag); __IMPORT__ void (*grid_pos)(grid_t* g, int* gx, int* gy); +__IMPORT__ bool (*door)(grid_t g, char* t1, char* level, char* t2);