diff --git a/bin/back b/bin/back index 0af2dfc..5cbff1b 100755 Binary files a/bin/back and b/bin/back differ diff --git a/obj/entities.o b/obj/entities.o index d04f10f..afb3a54 100644 Binary files a/obj/entities.o and b/obj/entities.o differ diff --git a/obj/generation.o b/obj/generation.o index 17eb6b9..def099a 100644 Binary files a/obj/generation.o and b/obj/generation.o differ diff --git a/obj/hash.o b/obj/hash.o index 1715c43..220ae9b 100644 Binary files a/obj/hash.o and b/obj/hash.o differ diff --git a/obj/main.o b/obj/main.o index a055971..8a7547b 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/menus.o b/obj/menus.o index 1e528a8..d150176 100644 Binary files a/obj/menus.o and b/obj/menus.o differ diff --git a/src/entities.c b/src/entities.c index 14a3501..4e3754e 100644 --- a/src/entities.c +++ b/src/entities.c @@ -195,7 +195,19 @@ void explodeOnHit(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret) { } // metai1 = id of the interface -// metach1 = text (unused outside of initialization) +// metach1 = text (stored here to free() easily) void pop_text(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret) { interface_set(ent->metai1); +} + +// metai1 = id of the interface +// metai2 = room count +// metach1 = dest folder +// metach2 = text (stored here to free() easily) +void pop_and_tp(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret) { + interface_set(ent->metai1); + newRoomName = ent->metach1; + newRoomCount = ent->metai2; + //printf("%s %d\n", newRoomName, newRoomCount); + switchRoom = true; } \ No newline at end of file diff --git a/src/entities.h b/src/entities.h index cf8dbee..52d30bc 100644 --- a/src/entities.h +++ b/src/entities.h @@ -22,5 +22,6 @@ void explodeOnHit(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret); void translatePlayer(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret); void translatePlayerLine(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret); void pop_text(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret); +void pop_and_tp(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret); #endif \ No newline at end of file diff --git a/src/generation.c b/src/generation.c index 5d1456d..b781d6e 100644 --- a/src/generation.c +++ b/src/generation.c @@ -28,6 +28,9 @@ int total_weight; int coins; int fct_entry_size; +static char** to_free; +static int to_length; + fct_entry* hashtbl_entities; void init_ent_generator(int n) { @@ -80,11 +83,10 @@ void init_ent_generator(int n) { hashtbl_entities[6].onHit = &pop_text; hashtbl_entities[6].onDeath = NULL; - // NOT IMPLEMENTED YET // hashtbl_entities[7].id = 7; hashtbl_entities[7].name = "WarpBox"; hashtbl_entities[7].updatePos = NULL; - hashtbl_entities[7].onHit = &translatePlayerLine; + hashtbl_entities[7].onHit = &pop_and_tp; hashtbl_entities[7].onDeath = NULL; } @@ -148,6 +150,10 @@ void copy_room(room* src, room* dest, int chx, int chy) { dest->ents[k]->metad9 = src->ents[k]->metad9; dest->ents[k]->metach1 = src->ents[k]->metach1; dest->ents[k]->metach2 = src->ents[k]->metach2; + //dest->ents[k]->metach1 = malloc(sizeof(char)*52); + //dest->ents[k]->metach2 = malloc(sizeof(char)*52); + //strcpy(dest->ents[k]->metach1, src->ents[k]->metach1); + //strcpy(dest->ents[k]->metach2, src->ents[k]->metach2); *(dest->ents[k]->hitpoints) = *(src->ents[k]->hitpoints); dest->ents[k]->pos = create_cube_0( (*(src->ents[k]->pos)).x, (*(src->ents[k]->pos)).y, (*(src->ents[k]->pos)).z, @@ -209,10 +215,17 @@ void build_starting_chunk(int chx, int chy) { } void init_hashtbl() { + printf("+1\n"); fflush(stdout); visited = hashtbl_generate(1789); + printf("+1\n"); fflush(stdout); build_starting_chunk(player_chx, player_chy); + printf("+1\n"); fflush(stdout); current_room = hashtbl_find_opt(visited, player_chx, player_chy); + printf("+1\n"); fflush(stdout); total_weight = 0; + printf("+1\n"); fflush(stdout); + to_free = malloc(sizeof(char*)*100); // ------------------------------------------------------------------------------------------------- 100 max // + to_length = 0; } void get_number_blocks(int* ret_cubes, int* ret_tps, int* ret_ent, FILE* ptr) { @@ -275,9 +288,12 @@ int read_int(FILE* ptr, bool print) { } char* read_string(FILE* ptr) { - char* res0 = malloc(sizeof(char)*51); + char* res0 = malloc(sizeof(char)*52); char c = fgetc(ptr); int i = 0; + while(c != EOF && c == ' ') { // ignore initial spaces + c = fgetc(ptr); + } while(c != EOF && c != ',') { res0[i] = c; i += 1; @@ -423,8 +439,6 @@ void parse_one_room(int id, char* filename) { pool[id].area->ents[k]->metad7 = entry->metad7; pool[id].area->ents[k]->metad8 = entry->metad8; pool[id].area->ents[k]->metad9 = entry->metad9; - pool[id].area->ents[k]->metach1 = entry->metach1; - pool[id].area->ents[k]->metach2 = entry->metach2; if(entry->id == 4) { // sine platform double ccw = read_float(ptr); @@ -465,12 +479,33 @@ void parse_one_room(int id, char* filename) { } else if(entry->id == 6) { // text box char* msg = read_string(ptr); + to_free[to_length] = msg; + to_length += 1; pool[id].area->ents[k]->metach1 = msg; int ired = read_int(ptr, true); int igreen = read_int(ptr, true); int iblue = read_int(ptr, true); pool[id].area->ents[k]->metai1 = build_text_box(msg, ired, igreen, iblue); - pool[id].area->ents[k]->metai2 = (-727); // random value to recognize + pool[id].area->ents[k]->metai3 = (-727); // random value to recognize + } else if(entry->id == 7) { + // warp text box + char* dest = read_string(ptr); + to_free[to_length] = dest; + to_length += 1; + int count = read_int(ptr, true); + char* msg = read_string(ptr); + to_free[to_length] = msg; + to_length += 1; + pool[id].area->ents[k]->metach1 = dest; + pool[id].area->ents[k]->metach2 = msg; + int ired = read_int(ptr, true); + int igreen = read_int(ptr, true); + int iblue = read_int(ptr, true); + pool[id].area->ents[k]->metai1 = build_text_box(msg, ired, igreen, iblue); + pool[id].area->ents[k]->metai2 = count; + pool[id].area->ents[k]->metai3 = (-72727); // random value to recognize + } else { + pool[id].area->ents[k]->metai3 = 0; } } @@ -513,32 +548,13 @@ char* get_name_and_i(char* folder, int nrooms, int* reti) { } void parse_rooms(int n_rooms, char* folder) { - /*char* name = malloc(sizeof(char)*19); // 1000 rooms max (not anymore xD) - name[0] = 't'; - name[1] = 'e'; - name[2] = 'm'; - name[3] = 'p'; - name[4] = 'l'; - name[5] = 'a'; - name[6] = 't'; - name[7] = 'e'; - name[8] = 's'; - name[9] = '/'; - name[10] = 'r'; - name[11] = 'o'; - name[12] = 'o'; - name[13] = 'm'; - name[14] = '_'; - name[15] = '0'; - name[16] = '\0'; - name[17] = '\0'; - name[18] = '\0';*/ int id = 0; char* name = get_name_and_i(folder, n_rooms, &id); pool = malloc(sizeof(entry)*n_rooms); pool_size = n_rooms; + printf("<%s> with %d rooms\n", folder, n_rooms); printf("Parsing...\n"); for(int k = 0; k < n_rooms; k++) { @@ -558,9 +574,8 @@ void parse_rooms(int n_rooms, char* folder) { } printf("\nDone.\n"); - printf("Total sum : %d\n", total_weight); - free(name); + printf("Total sum : %d\n", total_weight); } // has to be a multiple of both room_width and room_depth @@ -622,6 +637,7 @@ void generate_nearby_chunks(int render_dist) { void free_pool() { for(int k0 = 0; k0 < pool_size; k0++) { + printf("%d/%d\n", 1+k0, pool_size); for(int k = 0; k < pool[k0].area->map_size; k++) { free(pool[k0].area->map[k]); } @@ -630,8 +646,12 @@ void free_pool() { free(pool[k0].area->tps[k]); } for(int k = 0; k < pool[k0].area->ent_memlen; k++) { - if(pool[k0].area->ents[k]->metai2 == -727) { - free(pool[k0].area->ents[k]->metach1); + if(pool[k0].area->ents[k]->metai3 == -727) { // 6 and 7 // + //free(pool[k0].area->ents[k]->metach1); + } + if(pool[k0].area->ents[k]->metai3 == -72727) { // 7 // + //free(pool[k0].area->ents[k]->metach1); + //free(pool[k0].area->ents[k]->metach2); } free(pool[k0].area->ents[k]->hitpoints); free(pool[k0].area->ents[k]->pos); @@ -643,4 +663,16 @@ void free_pool() { free(pool[k0].area); } free(pool); +} + +void free_to_free() { + for(int k = 0; k < to_length; k++) { + free(to_free[k]); + } + free(to_free); + +} + +void free_ent_generator() { + free(hashtbl_entities); } \ No newline at end of file diff --git a/src/generation.h b/src/generation.h index a9a7143..b314744 100644 --- a/src/generation.h +++ b/src/generation.h @@ -55,5 +55,7 @@ void parse_rooms(int n_rooms, char* folder) ; void generate_nearby_chunks(int render_dist) ; void free_pool(); +void free_ent_generator(); +void free_to_free(); #endif \ No newline at end of file diff --git a/src/hash.c b/src/hash.c index aed16b7..991981f 100644 --- a/src/hash.c +++ b/src/hash.c @@ -66,6 +66,8 @@ void free_all_cubes(room* r) { free(r->tps[k]); } for(int k = 0; k < r->ent_memlen; k++) { + //free(r->ents[k]->metach1); + //free(r->ents[k]->metach2); free(r->ents[k]->hitpoints); free(r->ents[k]->pos); free(r->ents[k]); diff --git a/src/main.c b/src/main.c index 43cfde1..2477efe 100644 --- a/src/main.c +++ b/src/main.c @@ -25,23 +25,74 @@ int triCount; unsigned int fffff; int gamemode; +char* newRoomName; +int newRoomCount; +bool switchRoom; + double jPress = false; double gPress = false; double rPress = false; void reset_everything(GLFWwindow *window, int count, char* folder) { - hashtbl_free(visited); + /*hashtbl_free(visited); free_proj(); free_interf(); free_pool(); - //init_csts(); + init_csts(); init_hashtbl(); init_interf(window); - //build_all_menus(); + build_all_menus(); init_ent_generator(30); init_proj(); - parse_rooms(7, "templates/"); + parse_rooms(count, folder); + interface_set(-1);*/ + + camx = /*2*room_width*player_chx+*/2.0; + camy = 5.0; + camz = /*2*room_depth*player_chy+*/2.0; + + player_chx = 0; + player_chy = 0; + + camvx = 0.0; + camvy = 0.0; + camvz = 0.0; + + printf("-------------------------------- resetting hashtbl... --------------------------------\n"); + fflush(stdout); + + hashtbl_free(visited); + + printf("-------------------------------- done 1 --------------------------------\n"); + fflush(stdout); + printf("-------------------------------- resetting pool... --------------------------------\n"); + fflush(stdout); + + free_pool(); + free_to_free(); + + printf("-------------------------------- done 2 --------------------------------\n"); + fflush(stdout); + + printf("-------------------------------- initializing hashtbl... --------------------------------\n"); + fflush(stdout); + + init_hashtbl(); + + printf("-------------------------------- done 3 --------------------------------\n"); + fflush(stdout); + + printf("-------------------------------- initializing rooms... --------------------------------\n"); + fflush(stdout); + + parse_rooms(count, folder); + + printf("-------------------------------- Done 4 --------------------------------\n"); + fflush(stdout); + interface_set(-1); + + generate_nearby_chunks(1); } void processInput(GLFWwindow *window, float dtime) { @@ -177,9 +228,16 @@ void processInput(GLFWwindow *window, float dtime) { rPress = true; reset_everything(window, 7, "templates/"); } - }/*else { + } else { rPress = false; - }*/ + } + + if(!isMenuOpen() && switchRoom) { + //printf("-----\n"); + switchRoom = false; + reset_everything(window, newRoomCount, newRoomName); + free(newRoomName); + } } const char *vertexShaderSource = "#version 330 core\n" @@ -423,7 +481,7 @@ int main_alt() { } teleport_on_edge(); update_entities(delta); - updateProj(delta); + updateProj(delta); } usleep(max(0, interval-(int)(1000000*delta))); @@ -440,10 +498,18 @@ int main_alt() { incr = 0.0f; } + printf("| 1/5 |\n"); fflush(stdout); hashtbl_free(visited); + printf("| 2/5 |\n"); fflush(stdout); free_proj(); + printf("| 3/5 |\n"); fflush(stdout); free_interf(); + printf("| 4/5 |\n"); fflush(stdout); free_pool(); + printf("| 5/5 |\n"); fflush(stdout); + free_to_free(); + free_ent_generator(); + printf("Done\n"); fflush(stdout); // optional: de-allocate all resources once they've outlived their purpose: // ------------------------------------------------------------------------ @@ -462,5 +528,8 @@ int main(int argc, char** argv) { triCount = 0; sim_time = 0.0; gamemode = 0; + newRoomCount = 7; + switchRoom = false; + newRoomName = "templates/"; return main_alt(); } \ No newline at end of file diff --git a/src/menus.c b/src/menus.c index ba13b2f..e60bc56 100644 --- a/src/menus.c +++ b/src/menus.c @@ -631,6 +631,23 @@ void init_interf(GLFWwindow *window) { glfwSetMouseButtonCallback(window, menu_actions); } +void reset_interf() { + bListId = 0; + intListId = 0; + *current_interface = -1; + noMousePoll = false; +} + +void free_interf() { + free(buttonList); + for(int k = 0; k < intListId; k++) { + free(interfaceList[k].buttons); + } + free(interfaceList); + free(current_interface); + free(numbers); +} + // returns the ID of the new button (-1 if error) // actn can be within {NONE, WARP, SET_VAR, EXIT} // if actn is WARP or SET_VAR then val shall not be NULL @@ -769,11 +786,4 @@ int build_text_box(char* msg, int red, int green, int blue) { interface_link_button(intf, button_ok); return intf; -} - -void free_interf() { - free(buttonList); - free(interfaceList); - free(current_interface); - free(numbers); } \ No newline at end of file diff --git a/src/menus.h b/src/menus.h index 98c25d2..7e7cd3a 100644 --- a/src/menus.h +++ b/src/menus.h @@ -50,6 +50,8 @@ void gl_drawString(unsigned int fragShader, char* str, float x, float y, float s void gl_printf(unsigned int fragShader, float x, float y, float size, float width, int r, int g, int b, const char* str, ...); void init_interf(GLFWwindow *window); +void reset_interf(); +void free_interf(); bool isInMenu(GLFWwindow *win, unsigned int fragShader); bool isMenuOpen(); @@ -63,6 +65,4 @@ void interface_set(int interface_id); void build_all_menus(); int build_text_box(char* msg, int red, int green, int blue); -void free_interf(); - #endif \ No newline at end of file diff --git a/src/structure.h b/src/structure.h index eee0350..9e61201 100644 --- a/src/structure.h +++ b/src/structure.h @@ -166,4 +166,8 @@ extern int gamemode; extern float incr; +extern char* newRoomName; +extern int newRoomCount; +extern bool switchRoom; + #endif \ No newline at end of file diff --git a/templates/room_0 b/templates/room_0 index b42c9a0..b07a80e 100644 --- a/templates/room_0 +++ b/templates/room_0 @@ -34,10 +34,9 @@ else if entityType = 6 (text box) [.. text] with text = {char*} -// NOT IMPLEMENTED YET // else if entityType = 7 (warp text box) - [.. text, r, g, b] with - text = {char*} (length <= 50) + [.. dest_folder, room_count, text, r, g, b] with + {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] else diff --git a/templates/room_1 b/templates/room_1 index 5ed89de..e1f7882 100644 --- a/templates/room_1 +++ b/templates/room_1 @@ -20,6 +20,7 @@ Entities : [0.0, 8.0, 1.0, 0.5, 0.5, 0.5, 0.0, 0.0, 193, 192, 0, 1, 0, 0] [0.0, 9.0, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 193, 192, 0, 1, 0, 0] [0.0, 10.0, 0.0, 0.5, 0.5, 0.5, 0.0, 0.0, 193, 192, 0, 1, 0, 0] +[-1.0, -5.0, -1.0, 2.0, 2.0, 2.0, 1.0, 0.0, 16, 16, 16, 1, 0, 7, templates/, 7, level passed, 192, 192, 192] Weight : 50 @@ -43,10 +44,9 @@ else if entityType = 6 (text box) [.. text] with text = {char*} -// NOT IMPLEMENTED YET // else if entityType = 7 (warp text box) - [.. text, r, g, b] with - text = {char*} (length <= 50) + [.. dest_folder, room_count, text, r, g, b] with + {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] else diff --git a/templates/room_2 b/templates/room_2 index c2abd0f..b26670f 100644 --- a/templates/room_2 +++ b/templates/room_2 @@ -41,10 +41,9 @@ else if entityType = 6 (text box) [.. text] with text = {char*} -// NOT IMPLEMENTED YET // else if entityType = 7 (warp text box) - [.. text, r, g, b] with - text = {char*} (length <= 50) + [.. dest_folder, room_count, text, r, g, b] with + {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] else diff --git a/templates/room_3 b/templates/room_3 index 62fd62b..722e64f 100644 --- a/templates/room_3 +++ b/templates/room_3 @@ -35,10 +35,9 @@ else if entityType = 6 (text box) [.. text] with text = {char*} -// NOT IMPLEMENTED YET // else if entityType = 7 (warp text box) - [.. text, r, g, b] with - text = {char*} (length <= 50) + [.. dest_folder, room_count, text, r, g, b] with + {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] else diff --git a/templates/room_4 b/templates/room_4 index 3d73a66..0f577ab 100644 --- a/templates/room_4 +++ b/templates/room_4 @@ -34,10 +34,9 @@ else if entityType = 6 (text box) [.. text] with text = {char*} -// NOT IMPLEMENTED YET // else if entityType = 7 (warp text box) - [.. text, r, g, b] with - text = {char*} (length <= 50) + [.. dest_folder, room_count, text, r, g, b] with + {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] else diff --git a/templates/room_5 b/templates/room_5 index 33146fb..06c375d 100644 --- a/templates/room_5 +++ b/templates/room_5 @@ -35,10 +35,9 @@ else if entityType = 6 (text box) [.. text] with text = {char*} -// NOT IMPLEMENTED YET // else if entityType = 7 (warp text box) - [.. text, r, g, b] with - text = {char*} (length <= 50) + [.. dest_folder, room_count, text, r, g, b] with + {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] else diff --git a/templates/room_6 b/templates/room_6 index f0562fa..028a900 100644 --- a/templates/room_6 +++ b/templates/room_6 @@ -35,10 +35,9 @@ else if entityType = 6 (text box) [.. text] with text = {char*} -// NOT IMPLEMENTED YET // else if entityType = 7 (warp text box) - [.. text, r, g, b] with - text = {char*} (length <= 50) + [.. dest_folder, room_count, text, r, g, b] with + {dest_folder,text} = {char*} (length <= 50) {r,g,b} = int[0-256] else