mirror of
https://github.com/nzp-team/quakec.git
synced 2025-04-09 19:42:27 +00:00
Adds zombie lerp traversal type
Adds bezier vector lerp util function Adds drawing of test ent in traversal editor Adds framedefs for zombie lerp anim Updates framedefs for zombie from removing frame 160
This commit is contained in:
parent
69696eb0e3
commit
e463a671d2
4 changed files with 237 additions and 47 deletions
|
@ -420,6 +420,137 @@ void() cl_navmesh_pathfind_draw_result_portals;
|
|||
void() cl_navmesh_pathfind_draw_result_point_path;
|
||||
|
||||
|
||||
entity cl_navmesh_traversal_test_ent;
|
||||
|
||||
void cl_navmesh_draw_traversal_test_ent() {
|
||||
if(cl_navmesh_selected_traversal == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(cl_navmesh_traversal_test_ent == world) {
|
||||
cl_navmesh_traversal_test_ent = spawn();
|
||||
setmodel(cl_navmesh_traversal_test_ent, "models/ai/zfull.mdl");
|
||||
print("woo\n");
|
||||
}
|
||||
|
||||
float traversal_speed_scale = 1.0; // 4x slower
|
||||
float lerp_frac = (time * traversal_speed_scale) % 1.0;
|
||||
|
||||
|
||||
cl_navmesh_traversal_test_ent.angles.y = cl_navmesh_traversals[cl_navmesh_selected_traversal].angle;
|
||||
makevectors([0, cl_navmesh_traversals[cl_navmesh_selected_traversal].angle, 0]);
|
||||
cl_navmesh_traversal_test_ent.drawmask = MASK_ENGINE;
|
||||
|
||||
vector start_pos = cl_navmesh_traversals[cl_navmesh_selected_traversal].start_pos;
|
||||
vector end_pos = cl_navmesh_get_traversal_end_pos(cl_navmesh_selected_traversal);
|
||||
// cl_navmesh_traversal_test_ent.origin = start_pos + lerp_frac * (end_pos - start_pos);
|
||||
float trav_state_a_dur;
|
||||
float trav_state_b_dur;
|
||||
float trav_state_c_dur;
|
||||
float lerp_subfrac;
|
||||
float ent_framenum;
|
||||
float ent_frametime = 0.1;
|
||||
|
||||
// TODO - Detect traversal type
|
||||
// string traversal_type = "ledge";
|
||||
string traversal_type = "leap";
|
||||
if(traversal_type == "ledge") {
|
||||
vector ledge_pos;
|
||||
float traversal_height = end_pos.z - start_pos.z;
|
||||
|
||||
if(traversal_height < 0) {
|
||||
trav_state_a_dur = min(-traversal_height * (0.35 / 100.0), 2.0);
|
||||
trav_state_b_dur = 6*ent_frametime * 0.5; // double-speed
|
||||
lerp_frac *= (trav_state_a_dur + trav_state_b_dur);
|
||||
|
||||
if(lerp_frac < trav_state_a_dur) {
|
||||
lerp_subfrac = lerp_frac / (trav_state_a_dur);
|
||||
cl_navmesh_traversal_test_ent.origin = lerp_vector(start_pos, end_pos, lerp_subfrac * lerp_subfrac);
|
||||
ent_framenum = 150 + lerp_subfrac*4;
|
||||
}
|
||||
else {
|
||||
lerp_subfrac = (lerp_frac - (trav_state_a_dur)) / trav_state_b_dur;
|
||||
cl_navmesh_traversal_test_ent.origin = end_pos;
|
||||
ent_framenum = 154 + lerp_subfrac*6;
|
||||
|
||||
}
|
||||
}
|
||||
else if(traversal_height < 98) {
|
||||
ledge_pos = end_pos - '0 0 85' - v_forward * 28;
|
||||
trav_state_a_dur = 3*ent_frametime;
|
||||
trav_state_b_dur = 11*ent_frametime;
|
||||
lerp_frac *= trav_state_a_dur + trav_state_b_dur;
|
||||
|
||||
// Play low jump anim (frames 163-165)
|
||||
if(lerp_frac < trav_state_a_dur) {
|
||||
lerp_subfrac = lerp_frac / (trav_state_a_dur);
|
||||
cl_navmesh_traversal_test_ent.origin = lerp_vector(start_pos, ledge_pos, lerp_subfrac);
|
||||
ent_framenum = 163 + lerp_subfrac * 6;
|
||||
}
|
||||
// Lerp to endpos, play low climb anim (frames 170-180)
|
||||
else {
|
||||
lerp_subfrac = (lerp_frac - (trav_state_a_dur)) / trav_state_b_dur;
|
||||
cl_navmesh_traversal_test_ent.origin = lerp_vector(ledge_pos, end_pos, lerp_subfrac);
|
||||
ent_framenum = 170 + lerp_subfrac * 10;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Traversal states:
|
||||
ledge_pos = end_pos - '0 0 98' - v_forward * 28;
|
||||
trav_state_a_dur = 6*ent_frametime;
|
||||
trav_state_b_dur = 0.15;
|
||||
trav_state_c_dur = 14*ent_frametime;
|
||||
lerp_frac *= trav_state_a_dur + trav_state_b_dur + trav_state_c_dur;
|
||||
|
||||
// Play jump anim (frames 160-166)
|
||||
if(lerp_frac < trav_state_a_dur) {
|
||||
lerp_subfrac = lerp_frac / (trav_state_a_dur);
|
||||
cl_navmesh_traversal_test_ent.origin = start_pos;
|
||||
ent_framenum = 160 + lerp_subfrac * 6;
|
||||
}
|
||||
// Lerp to ledge pos
|
||||
else if(lerp_frac < trav_state_a_dur + trav_state_b_dur) {
|
||||
lerp_subfrac = (lerp_frac - (trav_state_a_dur)) / trav_state_b_dur;
|
||||
cl_navmesh_traversal_test_ent.origin = lerp_vector(start_pos, ledge_pos, lerp_subfrac);
|
||||
ent_framenum = 166 + lerp_subfrac * 1;
|
||||
}
|
||||
// Lerp to endpos, play climb anim (frames 167-180)
|
||||
else {
|
||||
lerp_subfrac = (lerp_frac - (trav_state_a_dur + trav_state_b_dur)) / trav_state_c_dur;
|
||||
cl_navmesh_traversal_test_ent.origin = lerp_vector(ledge_pos, end_pos, lerp_subfrac);
|
||||
ent_framenum = 167 + lerp_subfrac * 14;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(traversal_type == "leap") {
|
||||
trav_state_a_dur = 5*ent_frametime; // Play anim (218-233)
|
||||
trav_state_b_dur = 8*ent_frametime; // Play anim (233-241), lerp across gap
|
||||
trav_state_c_dur = 5*ent_frametime; // Play anim (242-247)
|
||||
lerp_frac *= (trav_state_a_dur + trav_state_b_dur + trav_state_c_dur);
|
||||
lerp_subfrac = lerp_frac;
|
||||
|
||||
if(lerp_frac < trav_state_a_dur) {
|
||||
lerp_subfrac = lerp_frac / (trav_state_a_dur);
|
||||
cl_navmesh_traversal_test_ent.origin = start_pos;
|
||||
ent_framenum = 228 + lerp_subfrac * 5;
|
||||
}
|
||||
else if(lerp_frac < trav_state_a_dur + trav_state_b_dur) {
|
||||
lerp_subfrac = (lerp_frac - (trav_state_a_dur)) / trav_state_b_dur;
|
||||
vector midpoint_pos = cl_navmesh_get_traversal_midpoint_pos(cl_navmesh_selected_traversal);
|
||||
cl_navmesh_traversal_test_ent.origin = lerp_vector_bezier(start_pos, midpoint_pos, end_pos, lerp_subfrac);
|
||||
ent_framenum = 233 + lerp_subfrac * 8;
|
||||
}
|
||||
else {
|
||||
lerp_subfrac = (lerp_frac - (trav_state_a_dur + trav_state_b_dur)) / trav_state_c_dur;
|
||||
cl_navmesh_traversal_test_ent.origin = end_pos;
|
||||
ent_framenum = 242 + lerp_subfrac * 5;
|
||||
}
|
||||
}
|
||||
cl_navmesh_traversal_test_ent.frame = floor(ent_framenum);
|
||||
cl_navmesh_traversal_test_ent.frame2 = floor(ent_framenum+ 1);
|
||||
cl_navmesh_traversal_test_ent.lerpfrac = ent_framenum % 1.0;
|
||||
}
|
||||
|
||||
|
||||
void cl_navmesh_editor_draw() {
|
||||
for(float i = 0; i < cl_navmesh_vert_count; i++) {
|
||||
|
@ -446,6 +577,11 @@ void cl_navmesh_editor_draw() {
|
|||
cl_navmesh_pathfind_draw_result_path();
|
||||
cl_navmesh_pathfind_draw_result_portals();
|
||||
cl_navmesh_pathfind_draw_result_point_path();
|
||||
|
||||
// If a traversal is selected, draw a zombie being animated
|
||||
if(cl_navmesh_selected_traversal != -1) {
|
||||
cl_navmesh_draw_traversal_test_ent();
|
||||
}
|
||||
|
||||
|
||||
//The following code block is for detecting and placing waypoints at bsp map corners
|
||||
|
@ -1845,7 +1981,7 @@ void cl_navmesh_editor_load_navmesh() {
|
|||
cl_navmesh_polies[i].doortarget = fgets(file);
|
||||
|
||||
if(cl_navmesh_polies[i].doortarget != "") {
|
||||
print("CLLOADNAVMESH - Polygon at index ",ftos(i)," has doortarget: \"", cl_navmesh_polies[i].doortarget, "\"" );
|
||||
print("CLLOADNAVMESH - Polygon at index ",ftos(i)," has doortarget: \"", cl_navmesh_polies[i].doortarget, "\"\n" );
|
||||
}
|
||||
// cl_navmesh_polies[i].doortarget = ""; // Temp fix to load old files
|
||||
// If v0.0.0, discard entrance edge (no longer used)
|
||||
|
@ -2216,17 +2352,11 @@ void cl_pathfind_clear_result_data() {
|
|||
cl_test_pathfind_result->path_polygons[i] = -1;
|
||||
cl_test_pathfind_result->path_traversals[i] = -1;
|
||||
|
||||
cl_test_pathfind_result->portals_left_pos[i].x = 0;
|
||||
cl_test_pathfind_result->portals_left_pos[i].y = 0;
|
||||
cl_test_pathfind_result->portals_left_pos[i].z = 0;
|
||||
cl_test_pathfind_result->portals_right_pos[i].x = 0;
|
||||
cl_test_pathfind_result->portals_right_pos[i].y = 0;
|
||||
cl_test_pathfind_result->portals_right_pos[i].z = 0;
|
||||
cl_test_pathfind_result->portals_left_pos[i] = '0 0 0';
|
||||
cl_test_pathfind_result->portals_right_pos[i] = '0 0 0';
|
||||
cl_test_pathfind_result->portals_traversal[i] = -1;
|
||||
|
||||
cl_test_pathfind_result->point_path_points[i].x = 0;
|
||||
cl_test_pathfind_result->point_path_points[i].y = 0;
|
||||
cl_test_pathfind_result->point_path_points[i].y = 0;
|
||||
cl_test_pathfind_result->point_path_points[i] = '0 0 0';
|
||||
cl_test_pathfind_result->point_path_traversals[i] = -1;
|
||||
}
|
||||
for(float i = 0;i < NAV_MAX_TRAVERSALS; i++) {
|
||||
|
@ -3389,20 +3519,6 @@ void cl_navmesh_traversal_editor_auto_adjust_traversal() {
|
|||
}
|
||||
vector ledge_pos = (search_start + search_end) * 0.5;
|
||||
// ledge_pos is the center of the bbox, offset to find the corner near the ledge
|
||||
// https://stackoverflow.com/a/1343531
|
||||
// float angle = vectoangles(search_end - search_stard).y;
|
||||
// float abs_cos_angle = fabs(cos(angle));
|
||||
// float abs_sin_angle = fabs(sin(angle));
|
||||
// float bbox_width = (VEC_HULL_MAX.x - VEC_HULL_MIN.x) / 2;
|
||||
// float bbox_depth = (VEC_HULL_MAX.y - VEC_HULL_MIN.y) / 2;
|
||||
// float ofs_dist;
|
||||
// if(bbox_width * abs_sin_angle <= bbox_depth * abs_cos_angle) {
|
||||
// ofs_dist = bbox_width / abs_cos_angle;
|
||||
// }
|
||||
// else {
|
||||
// ofs_dist = bbox_depth / abs_sin_angle;
|
||||
// }
|
||||
// ledge_pos += normalize(top_point - [bottom_point.x, bottom_point.y, top_point.z]) * ofs_dist;
|
||||
// Push 16 qu towards the top point
|
||||
// NOTE: This won't be accurate for sloped ledges, but we're just
|
||||
// trying to get close-enough so the animations look half-decent
|
||||
|
|
|
@ -7,21 +7,24 @@ DEFINE_ANIM(zombie_jog1, 84,85,86,87,88,89,90,91,92);
|
|||
DEFINE_ANIM(zombie_run1, 93,94,95,96,97,98,99,100,101,102); // Defines: get_anim_frame_zombie_run1, get_anim_length_zombie_run1
|
||||
DEFINE_ANIM(zombie_attack1, 103,104,105,106,107); // Defines: get_anim_frame_zombie_attack1, get_anim_length_zombie_attack1
|
||||
DEFINE_ANIM(zombie_attack2, 108,109,110,111,112,113); // Defines: get_anim_frame_zombie_attack2, get_anim_length_zombie_attack2
|
||||
DEFINE_ANIM(zombie_window_rip_board1, 182,183,184,185,186,187,188,189,190,191,192); // Defines: get_anim_frame_zombie_window_rip_board1, get_anim_length_zombie_window_rip_board1
|
||||
DEFINE_ANIM(zombie_window_rip_board2, 192,193,194,195,196,197,198,199,200,201,202); // Defines: get_anim_frame_zombie_window_rip_board2, get_anim_length_zombie_window_rip_board2
|
||||
DEFINE_ANIM(zombie_window_attack, 202,203,204,205,206,207,208,209,210,211); // Defines: get_anim_frame_zombie_window_attack, get_anim_length_zombie_window_attack
|
||||
DEFINE_ANIM(zombie_window_rip_board1, 181,182,183,184,185,186,187,188,189,190,191); // Defines: get_anim_frame_zombie_window_rip_board1, get_anim_length_zombie_window_rip_board1
|
||||
DEFINE_ANIM(zombie_window_rip_board2, 191,192,193,194,195,196,197,198,199,200,201); // Defines: get_anim_frame_zombie_window_rip_board2, get_anim_length_zombie_window_rip_board2
|
||||
DEFINE_ANIM(zombie_window_attack, 201,202,203,204,205,206,207,208,209,210); // Defines: get_anim_frame_zombie_window_attack, get_anim_length_zombie_window_attack
|
||||
DEFINE_ANIM(zombie_window_hop, 114,115,116,117,118,119,120,121,122,123); // Defines: get_anim_frame_zombie_window_hop, get_anim_length_zombie_window_hop
|
||||
DEFINE_ANIM(zombie_die1, 124,125,126,127,128,129,130,131,132,133,134); // Defines: get_anim_frame_zombie_die1, get_anim_length_zombie_die1
|
||||
DEFINE_ANIM(zombie_die2, 135,136,137,138,139); // Defines: get_anim_frame_zombie_die2, get_anim_length_zombie_die2
|
||||
DEFINE_ANIM(zombie_die3, 140,141,142,143,144,145,146,147,148,149); // Defines: get_anim_frame_zombie_die3, get_anim_length_zombie_die3
|
||||
DEFINE_ANIM(zombie_die_wunder, 212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228); // Defines: get_anim_frame_zombie_die_wunder, get_anim_length_zombie_die_wunder
|
||||
DEFINE_ANIM(zombie_die_wunder, 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227); // Defines: get_anim_frame_zombie_die_wunder, get_anim_length_zombie_die_wunder
|
||||
DEFINE_ANIM(zombie_fall, 150,151,152,153); // Defines: get_anim_frame_zombie_fall, get_anim_length_zombie_fall
|
||||
DEFINE_ANIM(zombie_land, 154,155,156,157,158,159,159); // Defines: get_anim_frame_zombie_land, get_anim_length_zombie_land
|
||||
DEFINE_ANIM(zombie_jump, 161,162,163,164,165,166,167); // Defines: get_anim_frame_zombie_jump, get_anim_length_zombie_jump
|
||||
DEFINE_ANIM(zombie_climb, 168,169,170,171,172,173,174,175,176,177,178,179,180,181); // Defines: get_anim_frame_zombie_climb, get_anim_length_zombie_climb
|
||||
DEFINE_ANIM(zombie_jump_low, 164,165,166); // Defines: get_anim_frame_zombie_jump_low, get_anim_length_zombie_jump_low
|
||||
DEFINE_ANIM(zombie_climb_low, 171,172,173,174,175,176,177,178,179,180,181); // Defines: get_anim_frame_zombie_climb_low, get_anim_length_zombie_climb_low
|
||||
DEFINE_ANIM(zombie_jump, 160,161,162,163,164,165,166); // Defines: get_anim_frame_zombie_jump, get_anim_length_zombie_jump
|
||||
DEFINE_ANIM(zombie_climb, 167,168,169,170,171,172,173,174,175,176,177,178,179,180); // Defines: get_anim_frame_zombie_climb, get_anim_length_zombie_climb
|
||||
DEFINE_ANIM(zombie_jump_low, 163,164,165); // Defines: get_anim_frame_zombie_jump_low, get_anim_length_zombie_jump_low
|
||||
DEFINE_ANIM(zombie_climb_low, 170,171,172,173,174,175,176,177,178,179,180); // Defines: get_anim_frame_zombie_climb_low, get_anim_length_zombie_climb_low
|
||||
DEFINE_ANIM(zombie_fall_loop, 151,152,153,152); // Defines: get_anim_frame_zombie_fall_loop, get_anim_length_zombie_fall_loop
|
||||
DEFINE_ANIM(zombie_leap, 228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247); // Defines: get_anim_frame_zombie_leap, get_anim_length_zombie_leap
|
||||
DEFINE_ANIM(zombie_leap_jump, 228,229,230,231,232,233,234,235,236,237,238,239,240,241); // Defines: get_anim_frame_zombie_leap_jump, get_anim_length_zombie_leap_jump
|
||||
DEFINE_ANIM(zombie_leap_land, 242,243,244,245,246,247); // Defines: get_anim_frame_zombie_leap_land, get_anim_length_zombie_leap_land
|
||||
|
||||
|
||||
|
||||
|
@ -338,7 +341,8 @@ void zombie_traversal_logic() {
|
|||
|
||||
|
||||
string traversal_type;
|
||||
traversal_type = "ledge";
|
||||
// traversal_type = "ledge";
|
||||
traversal_type = "leap";
|
||||
// traversal_type = "jump_gap";
|
||||
// traversal_type = "hop_barricade";
|
||||
// traversal_type = "hop_fence";
|
||||
|
@ -362,10 +366,10 @@ void zombie_traversal_logic() {
|
|||
//
|
||||
// Check height of ledge we're climbing:
|
||||
float traversal_height = end_pos.z - start_pos.z;
|
||||
vector goal_pos;
|
||||
float traversal_time;
|
||||
float lerp_frac;
|
||||
float anim_time;
|
||||
vector ledge_pos;
|
||||
|
||||
// Fall down
|
||||
if(traversal_height < 0 ) {
|
||||
|
@ -392,11 +396,13 @@ void zombie_traversal_logic() {
|
|||
}
|
||||
// Short ledge
|
||||
else if(traversal_height < 98) {
|
||||
makevectors([0, sv_navmesh_traversals[traversal_idx].angle, 0]);
|
||||
ledge_pos = end_pos - '0 0 72' - v_forward * 21;
|
||||
|
||||
if(zombie_ent.substate == 0) {
|
||||
zombie_ent.movetype = MOVETYPE_STEP;
|
||||
// If short jump up, play short jump / short climb anim
|
||||
zombie_ent.play_anim(get_anim_frame_zombie_jump_low, get_anim_length_zombie_jump_low(), ANIM_STOP_TYPE_STOP);
|
||||
// zombie_ent.cur_anim_frametime = 0.08;
|
||||
anim_time = (zombie_ent.cur_anim_length - 1) * zombie_ent.cur_anim_frametime;
|
||||
// zombie_ent.cur_traversal_end_time = time + anim_time - (2 * zombie_ent.cur_anim_frametime);
|
||||
zombie_ent.cur_traversal_end_time = 0;
|
||||
|
@ -408,9 +414,7 @@ void zombie_traversal_logic() {
|
|||
}
|
||||
if(zombie_ent.substate == 1) {
|
||||
lerp_frac = (time - zombie_ent.cur_traversal_start_time) / (zombie_ent.cur_traversal_end_time - zombie_ent.cur_traversal_start_time);
|
||||
makevectors([0, sv_navmesh_traversals[traversal_idx].angle, 0]);
|
||||
goal_pos = end_pos - '0 0 72' - v_forward * 21;
|
||||
zombie_ent.origin = lerpVector(start_pos, goal_pos, lerp_frac);
|
||||
zombie_ent.origin = lerpVector(start_pos, ledge_pos, lerp_frac);
|
||||
|
||||
if(lerp_frac >= 1) {
|
||||
zombie_ent.substate = 2;
|
||||
|
@ -435,6 +439,9 @@ void zombie_traversal_logic() {
|
|||
}
|
||||
// Tall ledge
|
||||
else {
|
||||
makevectors([0, sv_navmesh_traversals[traversal_idx].angle, 0]);
|
||||
ledge_pos = end_pos - '0 0 98' - v_forward * 28;
|
||||
|
||||
if(zombie_ent.substate == 0) {
|
||||
zombie_ent.movetype = MOVETYPE_STEP;
|
||||
zombie_ent.play_anim(get_anim_frame_zombie_jump, get_anim_length_zombie_jump(), ANIM_STOP_TYPE_STOP);
|
||||
|
@ -453,7 +460,7 @@ void zombie_traversal_logic() {
|
|||
else if(zombie_ent.substate == 1) {
|
||||
if(zombie_ent.cur_traversal_end_time <= time) {
|
||||
// Zombie jumping should be real fast,
|
||||
traversal_time = 0.2; // seconds
|
||||
traversal_time = 0.12; // seconds
|
||||
// TODO - Should we determine how fast the zombie moves based on traversal distance?
|
||||
// TODO Otherwise zombie will always jump up in 0.5 seconds regardless of ledge height
|
||||
zombie_ent.cur_traversal_start_time = time;
|
||||
|
@ -463,9 +470,7 @@ void zombie_traversal_logic() {
|
|||
}
|
||||
else if(zombie_ent.substate == 2) {
|
||||
lerp_frac = (time - zombie_ent.cur_traversal_start_time) / (zombie_ent.cur_traversal_end_time - zombie_ent.cur_traversal_start_time);
|
||||
makevectors([0, sv_navmesh_traversals[traversal_idx].angle, 0]);
|
||||
goal_pos = end_pos - '0 0 98' - v_forward * 28;
|
||||
zombie_ent.origin = lerpVector(start_pos, goal_pos, lerp_frac);
|
||||
zombie_ent.origin = lerpVector(start_pos, ledge_pos, lerp_frac);
|
||||
|
||||
|
||||
if(lerp_frac >= 1) {
|
||||
|
@ -478,8 +483,7 @@ void zombie_traversal_logic() {
|
|||
}
|
||||
else if(zombie_ent.substate == 3) {
|
||||
lerp_frac = (time - zombie_ent.cur_traversal_start_time) / (zombie_ent.cur_traversal_end_time - zombie_ent.cur_traversal_start_time);
|
||||
start_pos = end_pos - '0 0 98' - v_forward * 28;
|
||||
zombie_ent.origin = lerpVector(start_pos, end_pos, lerp_frac);
|
||||
zombie_ent.origin = lerpVector(ledge_pos, end_pos, lerp_frac);
|
||||
if(lerp_frac >= 1.0) {
|
||||
zombie_ent.state = AI_STATE_PATHING;
|
||||
zombie_ent.movetype = MOVETYPE_WALK;
|
||||
|
@ -488,11 +492,68 @@ void zombie_traversal_logic() {
|
|||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if(traversal_type == "leap") {
|
||||
midpoint_pos = sv_navmesh_get_traversal_midpoint_pos(traversal_idx);
|
||||
|
||||
// Adjust zombie angle to its smallest representation
|
||||
zombie_ent.angles.y = ((zombie_ent.angles.y + 180) % 360) - 180;
|
||||
// Apply smallest delta angle
|
||||
float delta_angle = sv_navmesh_traversals[traversal_idx].angle - zombie_ent.angles.y;
|
||||
delta_angle = ((delta_angle + 180) % 360) - 180;
|
||||
zombie_ent.angles.y += 0.5 * delta_angle;
|
||||
|
||||
// FIXME - I need better alignment tools...
|
||||
// Leap traversal consists of the following substates:
|
||||
// 0: Play leap animation (frames 218-233)
|
||||
// 1: Wait for frame 233
|
||||
// 2: Move zombie across arc to end pos, ends at frame 241
|
||||
// 3: Wait at endpos for frame 247
|
||||
|
||||
// TODO - Adjust traversal speed?
|
||||
// TODO - Break up leap start / leap-mid-air / leap land anims?
|
||||
// float traversal_length =
|
||||
|
||||
float lerp_frac;
|
||||
|
||||
if(zombie_ent.substate == 0) {
|
||||
zombie_ent.movetype = MOVETYPE_STEP;
|
||||
zombie_ent.play_anim(get_anim_frame_zombie_leap_jump, get_anim_length_zombie_leap_jump(), ANIM_STOP_TYPE_STOP);
|
||||
zombie_ent.substate = 1;
|
||||
// Advance to next substate (1->2) after 5 frames
|
||||
zombie_ent.cur_traversal_start_time = time;
|
||||
zombie_ent.cur_traversal_end_time = time + (5 * zombie_ent.cur_anim_frametime);
|
||||
}
|
||||
else if(zombie_ent.substate == 1) {
|
||||
if(zombie_ent.cur_traversal_end_time <= time) {
|
||||
zombie_ent.substate = 2;
|
||||
// Advance to next substate (2->3) after 8 frames
|
||||
zombie_ent.cur_traversal_start_time = time;
|
||||
zombie_ent.cur_traversal_end_time = time + (8 * zombie_ent.cur_anim_frametime);
|
||||
}
|
||||
}
|
||||
else if(zombie_ent.substate == 2) {
|
||||
lerp_frac = (time - zombie_ent.cur_traversal_start_time) / (zombie_ent.cur_traversal_end_time - zombie_ent.cur_traversal_start_time);
|
||||
zombie_ent.origin = lerp_vector_bezier(start_pos, midpoint_pos, end_pos, lerp_frac);
|
||||
|
||||
if(lerp_frac >= 1) {
|
||||
zombie_ent.substate = 3;
|
||||
zombie_ent.play_anim(get_anim_frame_zombie_leap_land, get_anim_length_zombie_leap_land(), ANIM_STOP_TYPE_STOP);
|
||||
float anim_time = (zombie_ent.cur_anim_length - 1) * zombie_ent.cur_anim_frametime;
|
||||
// Finish traversal at the end of the land animation
|
||||
zombie_ent.cur_traversal_start_time = time;
|
||||
zombie_ent.cur_traversal_end_time = time + anim_time;
|
||||
|
||||
}
|
||||
}
|
||||
else if(zombie_ent.substate == 3) {
|
||||
if(zombie_ent.cur_traversal_end_time <= time) {
|
||||
zombie_ent.state = AI_STATE_PATHING;
|
||||
zombie_ent.movetype = MOVETYPE_WALK;
|
||||
// FIXME - Need a better way to revert to walking
|
||||
zombie_ent.play_anim(get_anim_frame_zombie_walk1, get_anim_length_zombie_walk1(), ANIM_STOP_TYPE_LOOP);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -240,3 +240,16 @@ float invertfloat(float input) {
|
|||
// custom weapon defs
|
||||
// now 90% slimmed down
|
||||
float currentWeaponTracker;
|
||||
|
||||
|
||||
|
||||
vector(vector a, vector b, float mix) lerp_vector {
|
||||
if (mix <= 0) return a;
|
||||
if (mix >= 1) return b;
|
||||
return (b * mix + a * ( 1 - mix ) );
|
||||
}
|
||||
|
||||
|
||||
vector lerp_vector_bezier(vector a, vector b, vector c, float mix) {
|
||||
return lerp_vector(lerp_vector(a,b,mix), lerp_vector(b,c,mix), mix);
|
||||
}
|
|
@ -137,9 +137,9 @@ struct navmesh_pathfind_result {
|
|||
// It denotes crossing from one polygon to another, or crossing a polygon into a traversal
|
||||
// This contains the number of portals in the path (same as path_length - 1)
|
||||
float portals_length;
|
||||
// The left vertex of the i-th portal (-1 if the i-th portal is a traversal)
|
||||
// The left position of the i-th portal's left endpoint
|
||||
vector portals_left_pos[NAV_MAX_POLIES];
|
||||
// The right vertex of the i-th portal (-1 if the i-th portal is a traversal)
|
||||
// The right position of the i-th portal's right endpoint
|
||||
vector portals_right_pos[NAV_MAX_POLIES];
|
||||
// If the i-th portal is a traversal, contains the traversal index, -1 otherwise.
|
||||
float portals_traversal[NAV_MAX_POLIES];
|
||||
|
|
Loading…
Reference in a new issue