diff --git a/README.md b/README.md index ddddb8a..6014e1f 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,13 @@ **WASD/ZQSD** (depends on keyboard, usually WASD) - movement **QE/AE** (depends on keyboard, usually QE)- horizontal camera rotation **PM** - vertical camera rotation -**R** - ***teleport to level_00*** **ESC** - exit application +- creative tools: +**Y** select level destination +**R** warp to targetted level (resets player's position) +**T** warp to targetted level (no update top player's position) + - while in menus: when editing a value : **A** (add), **S** (subtract), **M** (multiply), **D** (divide), **ENTER/SPACE** (proceed) @@ -18,6 +22,11 @@ . you can add text at the end of each line as comments but *do not use caps*, *this might confuse the parser* +. at the end of each file, the weight of the room is required (can be any positive integer) + if **there is only one file (==> its name is room_0) AND weight is 0**, the room will only generate at the central chunk (any other will be NULL) + use this if you want to create parkour levels, puzzles... + else, **make sure the total weight (the sum of all) is not equal to 0** *(you may end up with a floating point exception)* + 2) **Data structure** below is a detailled list for all block types ; each block type (Blocks, Teleporters, Entities) must have the corresponding word directly above it @@ -41,7 +50,7 @@ entities: |> if entityType >= 4, use 1 for HP and 0 for damage <| |> *Entity types are :* <| - -> 0 (coin) -> damage equals the coin's value + -> 0 (coin) -> HP equals the coin's value -> 1 (non-moving explosive) -> 2 (damaging firebar/spinning platform (set damage to 0)) [.. hz_rps, vt_rps, x_offset, y_offset, z_offset, dps] with diff --git a/bin/back b/bin/back index f2cf8aa..368b31a 100755 Binary files a/bin/back and b/bin/back differ diff --git a/levels/level_03/room_0 b/levels/level_03/room_0 index 8ebc2ef..375512f 100644 --- a/levels/level_03/room_0 +++ b/levels/level_03/room_0 @@ -23,7 +23,7 @@ Entities: [-16.0, 0.0, -16.0, 2.0, 2.0, 2.0, 0.0, 0.0, 255, 255, 192, 1, 0, 6, yeet, 255, 255, 255] [12.0, 0.0, 12.0, 4.0, 4.0, 4.0, 0.0, 0.0, 255, 255, 255, 1, 0, 8, 200, 1, 64, 64, 64] -[13.0, 1.0, 13.0, 2.0, 2.0, 2.0, 0.0, 0.0, 255, 255, 255, 1, 0, 7, levels/level_03/, 1, keep going, 192, 192, 192] +[13.0, 1.0, 13.0, 2.0, 2.0, 2.0, 0.0, 0.0, 255, 255, 255, 1, 0, 7, levels/level_04/, 1, keep going, 192, 192, 192] [-2.5, 30.0, -2.5, 1.0, 1.0, 1.0, 0.0, 0.0, 128, 128, 128, 1, 0, 0] // I should introduce for loops in these [-1.5, 30.0, -2.5, 1.0, 1.0, 1.0, 0.0, 0.0, 128, 128, 128, 1, 0, 0] diff --git a/levels/level_04/room_0 b/levels/level_04/room_0 new file mode 100644 index 0000000..b18a962 --- /dev/null +++ b/levels/level_04/room_0 @@ -0,0 +1,62 @@ +Blocks: +[-16.0, -1.0, -16.0, 32.0, 1.0, 32.0, 0.0, 0.0, 192, 192, 192] + + + +[-14.0, 0.0, -6.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[-14.0, 0.0, -2.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[-14.0, 0.0, 2.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[-14.0, 0.0, 6.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[-14.0, 0.0, 10.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] + +[-10.0, 0.0, -14.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[-10.0, 0.0, -6.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] + +[-10.0, 0.0, 10.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ -6.0, 0.0, -14.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] + +[ -6.0, 0.0, 2.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ -6.0, 0.0, 10.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ -2.0, 0.0, -14.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ -2.0, 0.0, 10.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] + +[ 2.0, 0.0, -14.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 2.0, 0.0, 2.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 2.0, 0.0, 10.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] + +[ 6.0, 0.0, -14.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 6.0, 0.0, 10.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] + +[ 10.0, 0.0, -14.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 10.0, 2.0, -10.0, 4.0, 2.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 10.0, 0.0, -6.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 10.0, 0.0, -2.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 10.0, 0.0, 2.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 10.0, 0.0, 6.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] +[ 10.0, 0.0, 10.0, 4.0, 4.0, 4.0, 0.0, 0.0, 128, 128, 128] + +Entities: +[ -5.9, 0.1, -5.9, 3.8, 3.8, 3.8, 0.0, 0.0, 192, 129, 192, 1, 0, 10, 0.98, 1.0] // crates +[ -1.9, 0.1, -5.9, 3.8, 3.8, 3.8, 0.0, 0.0, 192, 129, 192, 1, 0, 10, 0.98, 1.0] +[ -1.9, 0.1, 2.1, 3.8, 3.8, 3.8, 0.0, 0.0, 192, 129, 192, 1, 0, 10, 0.98, 1.0] +[ 6.1, 0.1, 2.1, 3.8, 3.8, 3.8, 0.0, 0.0, 192, 129, 192, 1, 0, 10, 0.98, 1.0] + +[ -9.0, 0.0, 7.0, 2.0, 0.2, 2.0, 0.0, 0.0, 192, 129, 192, 1, 0, 14, 0] // keys +[ -5.0, 0.0, 7.0, 2.0, 0.2, 2.0, 0.0, 0.0, 192, 129, 192, 1, 0, 14, 1] +[ 3.0, 0.0, -9.0, 2.0, 0.2, 2.0, 0.0, 0.0, 192, 129, 192, 1, 0, 14, 2] +[ 7.0, 0.0, 7.0, 2.0, 0.2, 2.0, 0.0, 0.0, 192, 129, 192, 1, 0, 14, 3] + +[-10.0, 0.0,-10.0, 1.0, 4.0, 4.0, 0.0, 0.0, 255, 255, 255, 1, 0, 12, 0, 1] // gate +[ -9.0, 0.0,-10.0, 1.0, 4.0, 4.0, 0.0, 0.0, 255, 255, 255, 1, 0, 12, 1, 1] +[ -8.0, 0.0,-10.0, 1.0, 4.0, 4.0, 0.0, 0.0, 255, 255, 255, 1, 0, 12, 2, 1] +[ -7.0, 0.0,-10.0, 1.0, 4.0, 4.0, 0.0, 0.0, 255, 255, 255, 1, 0, 12, 3, 1] + +[ 10.0, 0.0,-10.0, 4.0, 2.0, 4.0, 0.0, 0.0, 128, 128, 128, 1, 0, 7, levels/level_04/, 1, resetting, 129, 129, 129] // reset + +[-14.0, 0.0,-14.0, 2.0, 2.0, 2.0, 0.0, 0.0, 255, 255, 255, 1, 0, 7, levels/level_04/, 1, congrats, 129, 129, 129] // win +[ 14.5, 0.5, 14.5, 1.0, 1.0, 1.0, 0.0, 0.0, 255, 255, 192, 25, 0, 0] + +Weight: +0 + +$ \ No newline at end of file diff --git a/obj/entities.o b/obj/entities.o index 4b2a097..bb29b09 100644 Binary files a/obj/entities.o and b/obj/entities.o differ diff --git a/obj/main.o b/obj/main.o index c9c4b64..08b32c0 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/menus.o b/obj/menus.o index d58ebf7..16ddb7c 100644 Binary files a/obj/menus.o and b/obj/menus.o differ diff --git a/src/entities.c b/src/entities.c index ae39cf8..e914526 100644 --- a/src/entities.c +++ b/src/entities.c @@ -25,7 +25,7 @@ bool is_colliding_with_map(cube_0* cb) { for(int k = 0; k < current_room->map_size; k++) { for(int d = 0; d < 8; d++) { - if(distance_pt_cube_0_3d(cb->x+cb->w*(d%2==0), cb->y+cb->h*((d/2)%2==0), cb->z+cb->d*((d/4)%2==0), current_room->map[k]) <= 0.01) { + if(distance_pt_cube_0_3d(cb->x+cb->w*(d%2==0), cb->y+cb->h*((d/2)%2==0), cb->z+cb->d*((d/4)%2==0), current_room->map[k]) <= 0.001) { return true; } } @@ -36,7 +36,7 @@ bool is_colliding_with_map(cube_0* cb) { bool is_colliding_with_tp(cube_0* cb) { for(int k = 0; k < current_room->tps_size; k++) { for(int d = 0; d < 8; d++) { - if(distance_pt_cube_0_3d(cb->x+cb->w*(d%2==0), cb->y+cb->h*((d/2)%2==0), cb->z+cb->d*((d/4)%2==0), current_room->tps[k]->hitbox) <= 0.01) { + if(distance_pt_cube_0_3d(cb->x+cb->w*(d%2==0), cb->y+cb->h*((d/2)%2==0), cb->z+cb->d*((d/4)%2==0), current_room->tps[k]->hitbox) <= 0.001) { return true; } } @@ -50,7 +50,7 @@ bool is_colliding_with_ent_sp(cube_0* cb, int allowed) { if( current_room->ents[k]->entity_type == allowed && (cb->x != current_room->ents[k]->pos->x || cb->y != current_room->ents[k]->pos->y || cb->z != current_room->ents[k]->pos->z) && - distance_pt_cube_0_3d(cb->x+cb->w*(d%2==0), cb->y+cb->h*((d/2)%2==0), cb->z+cb->d*((d/4)%2==0), current_room->ents[k]->pos) <= 0.01 + distance_pt_cube_0_3d(cb->x+cb->w*(d%2==0), cb->y+cb->h*((d/2)%2==0), cb->z+cb->d*((d/4)%2==0), current_room->ents[k]->pos) <= 0.001 ) { return true; } @@ -268,17 +268,29 @@ void movableCrate_postStep(double x, double y, double z, double w, double h, dou ent->metad2 += -((double)dtime)*(gravity_factor*ent->metad5); ret->x += dtime*ent->metad1; - if(absf(ent->metad1) < 0.04 || is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp(ret, 10)) { + if( + absf(ent->metad1) < 0.04 || + is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp(ret, 10) || + distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist + ) { ret->x -= dtime*ent->metad1; ent->metad1 = 0.0; } ret->y += dtime*ent->metad2; - if(absf(ent->metad2) < 0.04 || is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp(ret, 10)) { + if( + absf(ent->metad2) < 0.04 || + is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp(ret, 10) || + distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist + ) { ret->y -= dtime*ent->metad2; ent->metad2 = 0.0; } ret->z += dtime*ent->metad3; - if(absf(ent->metad3) < 0.04 || is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp(ret, 10)) { + if( + absf(ent->metad3) < 0.04 || + is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp(ret, 10) || + distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist + ) { ret->z -= dtime*ent->metad3; ent->metad3 = 0.0; } @@ -302,7 +314,7 @@ void movCrateButton_postStep(double x, double y, double z, double w, double h, d isIn = true; ent->metai2 = 1; if(!buttonSwitch[ent->metai1]) { - //printf("In\n"); + //printf("In %d\n", ent->metai1); buttonSwitch[ent->metai1] = true; buttonTimes[ent->metai1] = -1.0; } diff --git a/src/main.c b/src/main.c index c5c8620..4db1a47 100644 --- a/src/main.c +++ b/src/main.c @@ -32,6 +32,8 @@ int triCount; unsigned int fffff; int gamemode; +int creativeWarpTarget; + char* newRoomName; int newRoomCount; bool switchRoom; @@ -41,6 +43,7 @@ bool gPress = false; bool rPress = false; bool pPress = false; bool kPress = false; +bool yPress = false; unsigned int textures[32]; @@ -106,6 +109,10 @@ void reset_everything(GLFWwindow *window, int count, char* folder) { } newFolder[i] = '\0'; + for(int k = 0; k < 16; k++) { + buttonSwitch[k] = false; + } + free_to_free(); init_to_free(); @@ -280,35 +287,70 @@ void processInput(GLFWwindow *window, float dtime) { rot_vt = mind(3.14159/2.0, rot_vt+sensitivity); } - // reset + // reset/warping + if(glfwGetKey(window, GLFW_KEY_Y) == GLFW_PRESS) { + if(!yPress) { + yPress = true; + interface_set(creativeIntID); + } + } else { + yPress = false; + } + if(glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS) { if(!isMenuOpen() && !rPress) { rPress = true; hardReset = true; - reset_everything(window, 4, "levels/level_00/"); - //reset_everything(window, 7, "levels/level_01/"); - //reset_everything(window, 1, "levels/level_02/"); - } - } else { - rPress = false; - } + switch(creativeWarpTarget) { + case 0: reset_everything(window, 4, "levels/level_00/"); break; - if(glfwGetKey(window, GLFW_KEY_T) == GLFW_PRESS) { - if(!isMenuOpen() && !rPress) { - rPress = true; - hardReset = false; - //reset_everything(window, 4, "levels/level_00/"); - //reset_everything(window, 7, "levels/level_01/"); - reset_everything(window, 1, "levels/level_02/"); - //reset_everything(window, 1, "levels/level_03/"); + case 1: reset_everything(window, 7, "levels/level_01/"); break; + + case 2: reset_everything(window, 1, "levels/level_02/"); break; + + case 3: reset_everything(window, 1, "levels/level_03/"); break; + + case 4: reset_everything(window, 1, "levels/level_04/"); break; + + case 5: /*reset_everything(window, 4, "levels/level_05/");*/break; + + case 6: /*reset_everything(window, 4, "levels/level_06/");*/break; + + default: break; + } } } else { - rPress = false; + if(glfwGetKey(window, GLFW_KEY_T) == GLFW_PRESS) { + if(!isMenuOpen() && !rPress) { + rPress = true; + hardReset = false; + switch(creativeWarpTarget) { + case 0: reset_everything(window, 4, "levels/level_00/"); break; + + case 1: reset_everything(window, 7, "levels/level_01/"); break; + + case 2: reset_everything(window, 1, "levels/level_02/"); break; + + case 3: reset_everything(window, 1, "levels/level_03/"); break; + + case 4: reset_everything(window, 1, "levels/level_04/"); break; + + case 5: /*reset_everything(window, 4, "levels/level_05/");*/break; + + case 6: /*reset_everything(window, 4, "levels/level_06/");*/break; + + default: break; + } + } + } else { + rPress = false; + } } if(!isMenuOpen() && switchRoom) { //printf("-----\n"); switchRoom = false; + hardReset = true; reset_everything(window, newRoomCount, newRoomName); //free(newRoomName); } @@ -776,6 +818,7 @@ int main(int argc, char** argv) { newRoomCount = 7; switchRoom = false; newRoomName = "templates/"; + creativeWarpTarget = 0; //play_sound("sound/audio/tetris_2.wav"); //tstst(); return main_alt(); diff --git a/src/menus.c b/src/menus.c index acc3cf3..93fb3c3 100644 --- a/src/menus.c +++ b/src/menus.c @@ -22,6 +22,8 @@ float rectDefault[18] ; float incr; +int creativeIntID; + static mat4 scale, slide; void initMenus() { rectDefault[0] = -0.5f; rectDefault[1] = -0.5f; rectDefault[2] = -0.99f; @@ -837,6 +839,7 @@ int button_pay; int welcome_start_i, settings_i; void build_all_menus() { init_math_interfaces(); + creativeIntID = build_creative_warp(); welcome_start_i = interface_create("Welcome", 255, 255, 255, -0.4f, 0.7f, 0.8f, 0.25f); settings_i = interface_create("Settings", 128, 128, 128, -0.4f, 0.7f, 0.8f, 0.25f); @@ -882,4 +885,16 @@ int build_lock_box(char* msg, int red, int green, int blue) { interface_link_button(intf, button_pay); return intf; +} + +int build_creative_warp() { + int intid = interface_create("select warp destination", 200, 200, 200, -1.0, 0.7, 2.0, 0.3); + + int warpButton = button_create_onoff("level", 128, 255, 128, -0.3, -0.2, 0.6, 0.2, SET_VAR, &creativeWarpTarget, 0, 6, INT, NULL, NULL); + int warpGTFO = button_create_onoff("exit menu", 64, 64, 64, -0.2, -0.5, 0.4, 0.2, EXIT, NULL, 0, 1, INT, NULL, NULL); + + interface_link_button(intid, warpButton); + interface_link_button(intid, warpGTFO); + + return intid; } \ No newline at end of file diff --git a/src/menus.h b/src/menus.h index 0602dde..ee9c423 100644 --- a/src/menus.h +++ b/src/menus.h @@ -69,4 +69,6 @@ void build_all_menus(); int build_text_box(char* msg, int red, int green, int blue); int build_lock_box(char* msg, int red, int green, int blue); +int build_creative_warp(); + #endif \ No newline at end of file diff --git a/src/structure.h b/src/structure.h index 04a47cd..3c43872 100644 --- a/src/structure.h +++ b/src/structure.h @@ -204,4 +204,7 @@ extern bool mathSignal; extern int mathSigCD; extern mathRes mathResult; +extern int creativeWarpTarget; +extern int creativeIntID; + #endif \ No newline at end of file