diff --git a/README.md b/README.md index 54f1fa3..60a41d0 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,15 @@ entities: dmg = int (>0) -> 16 (type 1 entity) - [.. speed, jump_height, dmg, kbPlayer, kbEntity] with + [.. speed, jump_height, dmg, kbPlayer, {buttonActivation}] with all\{dmg} = double[>=0.0] dmg = int (>=0) + buttonActivation = int[0-16] + + -> 17 (type 2 entity) + [.. speed, jump_height, dmg, kbPlayer, kbEntity, {buttonActivation}] with + all\{dmg} = double[>=0.0] + dmg = int (>=0) + buttonActivation = int[0-16] ``` \ No newline at end of file diff --git a/bin/back b/bin/back index 25d8447..e8a5143 100755 Binary files a/bin/back and b/bin/back differ diff --git a/levels/level_05/room_0 b/levels/level_05/room_0 index 38744f5..30469fe 100644 --- a/levels/level_05/room_0 +++ b/levels/level_05/room_0 @@ -21,8 +21,8 @@ Blocks : [ -2.0, 0.0, -2.0, 4.0, 2.0, 4.0, 0.0, 0.0, 192, 192, 192] Entities : -[-5.0, 0.5, -5.0, 1.0, 2.0, 1.0, 0.0, 0.0, 64, 64, 64, 1, 0, 16, 2.5, 1.9, 0, 0.0, 0.0] -[ 4.0, 0.5, 4.0, 1.0, 2.0, 1.0, 0.0, 0.0, 64, 64, 64, 1, 0, 16, 2.5, 1.9, 0, 0.0, 0.0] +[-5.0, 0.5, -5.0, 1.0, 2.0, 1.0, 0.0, 0.0, 64, 64, 64, 1, 0, 17, 5.0, 1.9, 0, 12.0, 0.0] +[ 4.0, 0.5, 4.0, 1.0, 2.0, 1.0, 0.0, 0.0, 64, 64, 64, 1, 0, 17, 5.0, 1.9, 0, 12.0, 0.0] [-1.0, 2.0, -1.0, 2.0, 2.0, 2.0, 0.0, 0.0, 192, 192, 32, 1, 0, 8, 250, 1, 255, 128, 128] [-0.5, 2.5, -0.5, 1.0, 1.0, 1.0, 0.0, 0.0, 192, 192, 32, 1, 0, 7, levels/level_05/, 5, impressive, 128, 255, 128] diff --git a/obj/base.o b/obj/base.o index 6c831fe..e2a020a 100644 Binary files a/obj/base.o and b/obj/base.o differ diff --git a/obj/display.o b/obj/display.o index 86aabe8..3112e2b 100644 Binary files a/obj/display.o and b/obj/display.o differ diff --git a/obj/entities.o b/obj/entities.o index 14c9762..59a56de 100644 Binary files a/obj/entities.o and b/obj/entities.o differ diff --git a/obj/generation.o b/obj/generation.o index eb5f9a1..7773eba 100644 Binary files a/obj/generation.o and b/obj/generation.o differ diff --git a/obj/maeth.o b/obj/maeth.o index c354c0f..aed50d6 100644 Binary files a/obj/maeth.o and b/obj/maeth.o differ diff --git a/obj/main.o b/obj/main.o index 5f94d0f..411750e 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/menus.o b/obj/menus.o index 75351b4..849ad2b 100644 Binary files a/obj/menus.o and b/obj/menus.o differ diff --git a/obj/move.o b/obj/move.o index 54b70f1..ffd4fd6 100644 Binary files a/obj/move.o and b/obj/move.o differ diff --git a/obj/proj.o b/obj/proj.o index 37bb340..82d4ab2 100644 Binary files a/obj/proj.o and b/obj/proj.o differ diff --git a/src/base.c b/src/base.c index f2db2a6..d87ebe8 100644 --- a/src/base.c +++ b/src/base.c @@ -456,6 +456,15 @@ pt_2d rotate_to_y_axis(double x, double y, double z, double x0, double z0, int a return res; } +void normalize(pt_2d* p) { + double norm = sqrt(p->x*p->x + p->y*p->y + p->z*p->z); + if(norm >= 0.0001) { + p->x /= norm; + p->y /= norm; + p->z /= norm; + } +} + // ------------------------------------------------------------------------------------------------ // void remove_entity(entity** arr, int* memlen, int* len, int index) { @@ -561,4 +570,20 @@ double read_float(FILE* ptr) { //printf("%d, %d\n", ent, frac); return sn0*((double)frac)/(pow(10.0, (double)ln_baseN(frac, 10))); } +} + +// RESET "\x1b[0m" +// RED "\033[38;2;192;40;40m" +// BLUE "\033[38;2;40;192;192m" +// GREEN "\033[38;2;192;255;0m" +// TREE "\033[38;2;20;180;20m" +// YELLOW "\033[38;2;255;255;40m" +// PURPLE "\033[38;2;250;12;250m" +// ORANGE "\033[38;2;250;120;0m" +// CYAN "\033[38;2;12;250;250m" +// GRAY "\033[38;2;192;192;192m" +// DARK "\033[38;2;128;128;128m" +// GRAYB "\033[1;38;2;192;192;192m" +void set_printf_color(const char* color) { + printf(color); } \ No newline at end of file diff --git a/src/base.h b/src/base.h index e03d7e0..e0e27cb 100644 --- a/src/base.h +++ b/src/base.h @@ -1,5 +1,19 @@ -#ifndef BACK_BASE_H -#define BACK_BASE_H +#ifndef BASE_H +#define BASE_H + +#define RESET "\x1b[0m" +#define RED "\033[38;2;192;40;40m" +#define BLUE "\033[38;2;40;192;192m" +#define GREEN "\033[38;2;192;255;0m" +#define TREE "\033[38;2;20;180;20m" +#define YELLOW "\033[38;2;160;160;40m" +#define PURPLE "\033[38;2;250;12;250m" +#define ORANGE "\033[38;2;250;120;0m" +#define CYAN "\033[38;2;12;250;250m" +#define GRAY "\033[38;2;192;192;192m" +#define DARK "\033[38;2;128;128;128m" +#define GRAYB "\033[1;38;2;192;192;192m" +void set_printf_color(const char* color); int ln_baseN(int n, int b); int pw(int x, int n); @@ -32,6 +46,7 @@ char* read_string(FILE* ptr); pt_2d vect_diff(pt_2d p1, pt_2d p2); double dot2D(pt_2d p1, pt_2d p2); double dot3D(pt_2d p1, pt_2d p2); +void normalize(pt_2d* p); cube_0* create_cube_0(double x, double y, double z, double w, double h, double d, double hz_a, double vt_a, int r, int g, int b); void fill_cube_0(cube_0* cb, double x, double y, double z, double w, double h, double d, double hz_a, double vt_a, int r, int g, int b); diff --git a/src/entities.c b/src/entities.c index 3abdd5e..46df4db 100644 --- a/src/entities.c +++ b/src/entities.c @@ -462,53 +462,157 @@ void movCrateButton_postStep(float dtime, entity* ent, cube_0* ret) { } } +void entity1_onHit(entity* ent, cube_0* ret) { + pt_2d direct = (pt_2d){.x = camx - ret->x-ret->w/2.0, .y = camy - ret->y-ret->h/2.0, .z = camz - ret->z-ret->d/2.0}; + if(direct.x*direct.x + direct.y*direct.y + direct.z*direct.z >= 0.00001) { + normalize(&direct); + outvx = direct.x * ent->metad4; + //outvy = direct.y * ent->metad4; + outvz = direct.z * ent->metad4; + } +} // metad1 = speed // metad2 = jump height // metad3 = vertical speed // metad4 = knockback on hit (for player) [speed] -// metad5 = knockback on hit (for entity) [speed] // metai1 = damage +// metai2 = isActivated (0/1) +// metai3 = trigger button (-1 if none) void enemy1_postStep(float dtime, entity* ent, cube_0* ret) { - double dx = (camx - choffxE)-ret->x-ret->w/2.0; - ent->metad3 -= gravity_factor*dtime; - double dz = (camz - choffzE)-ret->z-ret->d/2.0; - double norm = sqrt(dx*dx + dz*dz); - dx = ent->metad1*dx/norm; - dz = ent->metad1*dz/norm; + if(ent->metai2) { + double dx = (camx - choffxE)-ret->x-ret->w/2.0; + ent->metad3 -= gravity_factor*dtime; + double dz = (camz - choffzE)-ret->z-ret->d/2.0; + double norm = sqrt(dx*dx + dz*dz); + dx = ent->metad1*dx/norm; + dz = ent->metad1*dz/norm; - bool hasCollisionXZ = false; - bool hasCollisionY = false; + bool hasCollisionXZ = false; + bool hasCollisionY = false; - ret->x += dtime*dx; - if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 16) || distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { - ret->x -= dtime*dx; - hasCollisionXZ = true; - } - - ret->z += dtime*dz; - if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 16) || distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { - ret->z -= dtime*dz; - hasCollisionXZ = true; - } - - ret->y += dtime*ent->metad3; - if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 16) || distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { + ret->x += dtime*dx; if(distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { + ret->x -= dtime*dx; + player_hp -= ent->metai1; + entity1_onHit(ent, ret); + } else if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 16)) { + ret->x -= dtime*dx; hasCollisionXZ = true; - hasCollisionY = true; } - ret->y -= dtime*ent->metad3; - hasCollisionY = hasCollisionY || (ent->metad3 <= 0.0); - ent->metad3 = 0.0; - } - if(hasCollisionXZ && hasCollisionY) { - ent->metad3 += sqrt(2.0*gravity_factor*ent->metad2); - //printf("%lf\n", ent->metad3); - } + ret->z += dtime*dz; + if(distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { + ret->z -= dtime*dz; + player_hp -= ent->metai1; + entity1_onHit(ent, ret); + } else if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 16)) { + ret->z -= dtime*dz; + hasCollisionXZ = true; + } - if(ret->y <= -48.0) { - *(ent->hitpoints) = 0; + ret->y += dtime*ent->metad3; + if(distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { + ret->y -= dtime*ent->metad3; + player_hp -= ent->metai1; + entity1_onHit(ent, ret); + ent->metad3 = 0.0; + } else if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 16)) { + ret->y -= dtime*ent->metad3; + hasCollisionY = hasCollisionY || (ent->metad3 <= 0.0); + ent->metad3 = 0.0; + } + + if(hasCollisionXZ && hasCollisionY) { + ent->metad3 += sqrt(2.0*gravity_factor*ent->metad2); + //printf("%lf\n", ent->metad3); + } + + if(ret->y <= -48.0) { + *(ent->hitpoints) = 0; + } + } else if((choffxE == 0 && choffzE == 0) || (ent->metai3 != -1 && buttonSwitch[ent->metai3])) { + ent->metai2 = 1; + } +} + +void entity2_onHit(entity* ent, cube_0* ret) { + pt_2d direct = (pt_2d){.x = camx - ret->x-ret->w/2.0, .y = camy - ret->y-ret->h/2.0, .z = camz - ret->z-ret->d/2.0}; + if(direct.x*direct.x + direct.y*direct.y + direct.z*direct.z >= 0.00001) { + normalize(&direct); + outvx = direct.x * ent->metad3; + //outvy = direct.y * ent->metad4; + outvz = direct.z * ent->metad3; + } +} +// metad1 = speed +// metad2 = jump height +// metad3 = knockback on hit (for player) [speed] +// metad4 = knockback on hit (for entity) [speed] +// metad{5,6,7} = {x,y,z} speed +// metai1 = damage +// metai2 = isActivated (0/1) +// metai3 = trigger button (-1 if none) +void enemy2_postStep(float dtime, entity* ent, cube_0* ret) { + if(ent->metai2) { + double dx = (camx - choffxE)-ret->x-ret->w/2.0; + double dz = (camz - choffzE)-ret->z-ret->d/2.0; + double norm = sqrt(dx*dx + dz*dz); + dx = ent->metad1*dx/norm; + dz = ent->metad1*dz/norm; + + ent->metad5 += dx*dtime; + ent->metad6 -= gravity_factor*dtime; + ent->metad7 += dz*dtime; + + bool hasCollisionXZ = false; + bool hasCollisionY = false; + + ret->x += dtime*ent->metad5; + if(distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { + ret->x -= dtime*ent->metad5; + ent->metad5 = 0.0; + player_hp -= ent->metai1; + entity2_onHit(ent, ret); + } else if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 17)) { + ret->x -= dtime*ent->metad5; + ent->metad5 = 0.0; + hasCollisionXZ = true; + } + + ret->z += dtime*ent->metad7; + if(distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { + ret->z -= dtime*ent->metad7; + ent->metad7 = 0.0; + player_hp -= ent->metai1; + entity2_onHit(ent, ret); + } else if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 17)) { + ret->z -= dtime*ent->metad7; + ent->metad7 = 0.0; + hasCollisionXZ = true; + } + + ret->y += dtime*ent->metad6; + if(distance_pt_cube_0_3d_infinite(camx, camy, camz, ret) <= min_dist) { + ret->y -= dtime*ent->metad6; + player_hp -= ent->metai1; + entity2_onHit(ent, ret); + ent->metad6 = 0.0; + } else if(is_colliding_with_map(ret) || is_colliding_with_tp(ret) || is_colliding_with_ent_sp2(ret, 10, 17)) { + ret->y -= dtime*ent->metad6; + hasCollisionY = hasCollisionY || (ent->metad6 <= 0.0); + ent->metad6 = 0.0; + } + + if(hasCollisionXZ && hasCollisionY) { + ent->metad6 += sqrt(2.0*gravity_factor*ent->metad2); + //printf("%lf\n", ent->metad3); + } + + if(ret->y <= -48.0) { + *(ent->hitpoints) = 0; + } + } else if((choffxE == 0 && choffzE == 0) || (ent->metai3 != -1 && buttonSwitch[ent->metai3])) { + ent->metai2 = 1; } } diff --git a/src/entities.h b/src/entities.h index fef9787..eae089d 100644 --- a/src/entities.h +++ b/src/entities.h @@ -28,6 +28,7 @@ void lava_postStep(float dtime, entity* ent, cube_0* ret); void movableCrate_postStep(float dtime, entity* ent, cube_0* ret); void movCrateButton_postStep(float dtime, entity* ent, cube_0* ret); void enemy1_postStep(float dtime, entity* ent, cube_0* ret); +void enemy2_postStep(float dtime, entity* ent, cube_0* ret); void movableCrate_onHit(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret); void lava_onHit(float dtime, int* hp, int* dmg, entity* ent, cube_0* ret); diff --git a/src/generation.c b/src/generation.c index 5e89665..c76b9cf 100644 --- a/src/generation.c +++ b/src/generation.c @@ -177,6 +177,14 @@ void init_ent_generator(int n) { hashtbl_entities[16].updatePos = &enemy1_postStep; hashtbl_entities[16].onHit = NULL; hashtbl_entities[16].onDeath = NULL; + + hashtbl_entities[17].id = 17; + hashtbl_entities[17].tex = 14; + hashtbl_entities[17].tex2 = 14; + hashtbl_entities[17].name = "ennemy2"; + hashtbl_entities[17].updatePos = &enemy2_postStep; + hashtbl_entities[17].onHit = NULL; + hashtbl_entities[17].onDeath = NULL; } fct_entry* get_entry(int k0) { @@ -770,14 +778,53 @@ void parse_one_room(int id, char* filename) { double height = read_float(ptr); int damage = read_int(ptr); double kb_player = read_float(ptr); - double kb_entity = read_float(ptr); + + int buttonTrig = -1; + + doAlign = exists_optionnal(ptr, '{', '\n'); + if(doAlign) { + buttonTrig = read_int(ptr); + if(buttonTrig < 0 || buttonTrig >= 16) { + fprintf(stderr, "warning : invalid button %d, using 0 instead\n", buttonTrig); + buttonTrig = 0; + } + } pool[id].area->ents[k]->metad1 = speed; pool[id].area->ents[k]->metad2 = height; - pool[id].area->ents[k]->metad3 = 0.0; pool[id].area->ents[k]->metad4 = kb_player; - pool[id].area->ents[k]->metad5 = kb_entity; pool[id].area->ents[k]->metai1 = damage; + pool[id].area->ents[k]->metai2 = 0; + pool[id].area->ents[k]->metai3 = buttonTrig; + } else if(entry->id == 17) { + // entity2 + double speed = read_float(ptr); + double height = read_float(ptr); + int damage = read_int(ptr); + double kb_player = read_float(ptr); + double kb_entity = read_float(ptr); + + int buttonTrig = -1; + + doAlign = exists_optionnal(ptr, '{', '\n'); + if(doAlign) { + buttonTrig = read_int(ptr); + if(buttonTrig < 0 || buttonTrig >= 16) { + fprintf(stderr, "warning : invalid button %d, using 0 instead\n", buttonTrig); + buttonTrig = 0; + } + } + + pool[id].area->ents[k]->metad1 = speed; + pool[id].area->ents[k]->metad2 = height; + pool[id].area->ents[k]->metad3 = kb_player; + pool[id].area->ents[k]->metad4 = kb_entity; + pool[id].area->ents[k]->metad5 = 0.0; + pool[id].area->ents[k]->metad6 = 0.0; + pool[id].area->ents[k]->metad7 = 0.0; + pool[id].area->ents[k]->metai1 = damage; + pool[id].area->ents[k]->metai2 = 0; + pool[id].area->ents[k]->metai3 = buttonTrig; } else { pool[id].area->ents[k]->metai3 = 0; } @@ -869,6 +916,7 @@ void generate_nearby_chunks(int render_dist) { for(int w = -render_dist; w <= render_dist; w++) { for(int h = -render_dist; h <= render_dist; h++) { if(!hashtbl_mem(visited, player_chx + w, player_chy + h)) { + set_printf_color(YELLOW); printf("generating (%d, %d)... ", player_chx + w, player_chy + h); fflush(stdout); //build_starting_chunk(player_chx + w, player_chy + h); int pick = rand()%(abs(total_weight)); @@ -881,7 +929,9 @@ void generate_nearby_chunks(int render_dist) { for(int k = 0; k < pool_size; k++) { sum += pool[k].weight; if(pick < sum) { + set_printf_color(GREEN); printf("chose %d\n", k); fflush(stdout); + set_printf_color(RESET); has_spawned = true; room* new = malloc(sizeof(room)); copy_room(pool[k].area, new, player_chx + w, player_chy + h); @@ -891,7 +941,9 @@ void generate_nearby_chunks(int render_dist) { } } if(!has_spawned) { + set_printf_color(CYAN); printf("chose NULL\n"); fflush(stdout); + set_printf_color(RESET); hashtbl_add(visited, player_chx + w, player_chy + h, NULL); } printf("Done\n"); diff --git a/src/main.c b/src/main.c index 62a28d2..057154f 100644 --- a/src/main.c +++ b/src/main.c @@ -74,9 +74,9 @@ void reset_everything(GLFWwindow *window, int count, char* folder) { player_chx = 0; player_chy = 0; - camvx = 0.0; - camvy = 0.0; - camvz = 0.0; + camvx = 0.0; outvx = 0.0; + camvy = 0.0; outvy = 0.0; + camvz = 0.0; outvz = 0.0; printf("-------------------------------- resetting hashtbl... --------------------------------\n"); fflush(stdout); @@ -125,7 +125,6 @@ void reset_everything(GLFWwindow *window, int count, char* folder) { printf("-------------------------------- Done 4 --------------------------------\n"); fflush(stdout); - interface_set(-1); generate_nearby_chunks(1); @@ -143,6 +142,7 @@ void reset_everything(GLFWwindow *window, int count, char* folder) { current_room = hashtbl_find_opt(visited, 0, 0); } } + interface_set(-1); } void processInput(GLFWwindow *window, float dtime) { diff --git a/src/move.c b/src/move.c index 5590cc9..f960c9f 100644 --- a/src/move.c +++ b/src/move.c @@ -56,6 +56,10 @@ double camx; double camy; double camz; +double outvx; +double outvy; +double outvz; + double camvx; double camvy; double camvz; @@ -91,9 +95,9 @@ void init_csts() { camz = 2.0; player_chx = 0; player_chy = 0; - camvx = 0.0; - camvy = 0.0; - camvz = 0.0; + camvx = 0.0; outvx = 0.0; + camvy = 0.0; outvy = 0.0; + camvz = 0.0; outvz = 0.0; rot_hz = 0.0; rot_vt = 0.0; @@ -212,13 +216,6 @@ pt_2d cross_product(pt_2d p1, pt_2d p2) { }; } -void normalize(pt_2d* p) { - double norm = sqrt(p->x*p->x + p->y*p->y + p->z*p->z); - p->x /= norm; - p->y /= norm; - p->z /= norm; -} - void debugMove(cube_0* cb) { for(int d = 0; d < 6; d++) { cb->x -= min_dist; @@ -334,16 +331,25 @@ void updateF(cube_0* cb, double dtime, entity* ent) { (dot3D(vt, normal) <= 0.0 && dot3D(vtdt, normal) >= 0.0) || (dot3D(vt, normal) >= 0.0 && dot3D(vtdt, normal) <= 0.0) ) { + //printf("-----------------------------------------------------------------------------------------------\n"); //printf("%d\n", d); - double normv = sqrt(camvx*camvx + camvy*camvy + camvz*camvz); + double normv = sqrt(camvx*camvx + camvy*camvy + camvz*camvz); + double normvB = sqrt(outvx*outvx + outvy*outvy + outvz*outvz); - double alpha = acos(dot3D(normal, (pt_2d){.x = camvx, .y = camvy, .z = camvz})/normv); - double beta = 3.1415926535 - 2*alpha; - double nu = normv*sqrt(1-cos(beta)); + double alpha = acos(dot3D(normal, (pt_2d){.x = camvx, .y = camvy, .z = camvz})/normv); + double alphaB = acos(dot3D(normal, (pt_2d){.x = outvx, .y = outvy, .z = outvz})/maxd(0.001, normvB)); - pt_2d u = (pt_2d){.x = normal.x*nu, .y = normal.y*nu, .z = normal.z*nu}; + double beta = 3.1415926535 - 2*alpha; + double betaB = 3.1415926535 - 2*alphaB; + + double nu = normv*sqrt(1-cos(beta)); + double nuB = normvB*sqrt(1-cos(betaB)); + + pt_2d u = (pt_2d){.x = normal.x*nu, .y = normal.y*nu, .z = normal.z*nu}; + pt_2d uB = (pt_2d){.x = normal.x*nuB, .y = normal.y*nuB, .z = normal.z*nuB}; normalize(&u); + normalize(&uB); if(ent != NULL && ent->entity_type == 2) { double radspeed = distance_pt_pt_3d(camx, camy, camz, ent->metad4+ent->pos->w/2.0, camy, ent->metad6+ent->pos->d/2.0 @@ -372,13 +378,31 @@ void updateF(cube_0* cb, double dtime, entity* ent) { //printf("(HZ) %lf %lf %lf\n", utheta.x*radspeed , utheta.y*radspeed , utheta.z*radspeed ); //printf("(VT) %lf %lf %lf\n\n", utheta2.x*radspeed2, utheta2.y*radspeed2, utheta2.z*radspeed2); - camvx = u.x*normv*(blockRestitution) + utheta.x*radspeed + utheta2.x*radspeed2; - camvy = u.y*normv*(blockRestitution) + utheta.y*radspeed + utheta2.y*radspeed2; - camvz = u.z*normv*(blockRestitution) + utheta.z*radspeed + utheta2.z*radspeed2; + if(normv >= 0.0001 && nu >= 0.0001) { // no NaN + camvx = u.x*normv*(blockRestitution) + utheta.x*radspeed + utheta2.x*radspeed2; + camvy = u.y*normv*(blockRestitution) + utheta.y*radspeed + utheta2.y*radspeed2; + camvz = u.z*normv*(blockRestitution) + utheta.z*radspeed + utheta2.z*radspeed2; + } + + if(normvB >= 0.0001 && nuB > 0.001) { // no NaN + //printf("%lf / %lf %lf %lf || %lf %lf %lf |||\n", normvB, alphaB, betaB, nuB, uB.x, uB.y, uB.z); + outvx = uB.x*normvB*(blockRestitution) + utheta.x*radspeed + utheta2.x*radspeed2; + outvy = uB.y*normvB*(blockRestitution) + utheta.y*radspeed + utheta2.y*radspeed2; + outvz = uB.z*normvB*(blockRestitution) + utheta.z*radspeed + utheta2.z*radspeed2; + } } else { - camvx = u.x*normv*(blockRestitution); - camvy = u.y*normv*(blockRestitution); - camvz = u.z*normv*(blockRestitution); + if(normv >= 0.0001 && nu >= 0.0001) { // no NaN + camvx = u.x*normv*(blockRestitution); + camvy = u.y*normv*(blockRestitution); + camvz = u.z*normv*(blockRestitution); + } + + if(normvB >= 0.0001 && nuB > 0.001) { // no NaN + //printf("%lf / %lf %lf %lf || %lf %lf %lf |||\n", normvB, alphaB, betaB, nuB, uB.x, uB.y, uB.z); + outvx = uB.x*normvB*(blockRestitution); + outvy = uB.y*normvB*(blockRestitution); + outvz = uB.z*normvB*(blockRestitution); + } } is_clipping = false; @@ -611,14 +635,20 @@ void movePlayerG(float dtime) { player_hp -= (int)(0.75*absf(oldvy)); } } - camx += camvx*dtime; - camy += camvy*dtime; - camz += camvz*dtime; + camx += (camvx+outvx)*dtime; + camy += (camvy+outvy)*dtime; + camz += (camvz+outvz)*dtime; camvx *= (1.0 - friction*((double)(dtime))); camvy *= (1.0 - friction*((double)(dtime))); camvz *= (1.0 - friction*((double)(dtime))); + outvx *= (1.0 - mind(5.0*friction*((double)(dtime)), 1.0)); + outvy *= (1.0 - mind(5.0*friction*((double)(dtime)), 1.0)); + outvz *= (1.0 - mind(5.0*friction*((double)(dtime)), 1.0)); + + //printf("%lf %lf %lf ; %lf %lf %lf\n", camvx, camvy, camvz, outvx, outvy, outvz); + if(camy <= -48) { camx = 0.0; camz = 0.0; @@ -626,6 +656,10 @@ void movePlayerG(float dtime) { camvx = 0.0; camvy = 0.0; camvz = 0.0; + outvx = 0.0; + outvy = 0.0; + outvz = 0.0; + player_chx = 0; player_chy = 0; if(is_HR==1) { diff --git a/src/structure.h b/src/structure.h index d4cdc45..d15c590 100644 --- a/src/structure.h +++ b/src/structure.h @@ -110,6 +110,10 @@ extern double camx; extern double camy; extern double camz; +extern double outvx; +extern double outvy; +extern double outvz; + extern double camvx; extern double camvy; extern double camvz;