version 1.2 | | version 1.3 |
---|
| | |
| | |
// For homing missiles, turn towards target. | | // For homing missiles, turn towards target. |
if (Weapon_info[obj->id].homing_flag) { | | if (Weapon_info[obj->id].homing_flag) { |
vms_vector vector_to_object, temp_vec; | | vms_vector vector_to_object, vel_vec, res_vec; |
fix dot; | | fix dot; |
fix speed, max_speed; | | fix speed, max_speed; |
| | |
| | |
| | |
if (track_goal != -1) { | | if (track_goal != -1) { |
//edited 8/3/98 by Victor Rachels to fix homer high cpu effect | | //edited 8/3/98 by Victor Rachels to fix homer high cpu effect |
fixang tang; | | fixang tang, mang; |
//end this section editing - Victor Rachels | | //end this section editing - Victor Rachels |
| | |
vm_vec_sub(&vector_to_object, &Objects[track_goal].pos, &obj->pos); | | vm_vec_sub(&vector_to_object, &Objects[track_goal].pos, &obj->pos); |
| | |
vm_vec_normalize_quick(&vector_to_object); | | vm_vec_normalize_quick(&vector_to_object); |
temp_vec = obj->mtype.phys_info.velocity; | | vel_vec = obj->mtype.phys_info.velocity; |
speed = vm_vec_normalize_quick(&temp_vec); | | speed = vm_vec_normalize_quick(&vel_vec); |
max_speed = Weapon_info[obj->id].speed[Difficulty_level]; | | max_speed = Weapon_info[obj->id].speed[Difficulty_level]; |
if (speed+F1_0 < max_speed) { | | if (speed+F1_0 < max_speed) { |
speed += fixmul(max_speed, FrameTime/2); | | speed += fixmul(max_speed, FrameTime/2); |
| | |
speed = max_speed; | | speed = max_speed; |
} | | } |
| | |
dot = vm_vec_dot(&temp_vec, &vector_to_object); | | dot = vm_vec_dot(&vel_vec, &vector_to_object); |
| | |
//edited 8/2/98 by Victor Rachels to fix homer high cpu effect | | vm_vec_add(&res_vec, &vel_vec, &vector_to_object); |
//check angle would be turning, if greater than maximum angle/sec, set to | | |
// new angle, scaled by FrameTime for how much to turn this frame | | |
| | |
tang = vm_vec_delta_ang_norm(&temp_vec,&vector_to_object,NULL); | | tang = vm_vec_delta_ang(&vel_vec,&res_vec,NULL); |
if(tang > F1_0/(80/(Difficulty_level+1)-10 ) * FrameTime) | | //mang = ((2000 + (Difficulty_level * 1000)) * FrameTime) / F1_0; |
| | mang = ((1+Difficulty_level) * FrameTime * 10000) / F1_0; |
| | |
| | if( tang > mang ) |
{ | | { |
//make new vector at MaxHomingAng between previous vector and otherwise new vector; | | vms_vector old_vec = res_vec; |
//Vector = ( (New - Old)* MaxAngle/OldAngle ) + Old | | |
vm_vec_sub2(&temp_vec,&vector_to_object); | | vms_vector v,d,axis; |
vm_vec_scale(&temp_vec,F1_0/(80/(Difficulty_level+1)-10 ) * FrameTime/tang); | | vm_vec_copy_normalize(&v,&vel_vec); |
vm_vec_add2(&temp_vec,&vector_to_object); | | vm_vec_copy_normalize(&d,&vector_to_object); |
} | | vm_vec_crossprod(&axis,&v,&d); |
//end changes for fixing homers - Victor Rachels | | vm_vec_normalize(&axis); |
| | fix sin,cos; fix_sincos(mang,&sin,&cos); |
vm_vec_add2(&temp_vec, &vector_to_object); | | fix onemincos = F1_0 - cos; |
// The boss' smart children track better... | | fix axax = fixmul(axis.x,axis.x); |
if (Weapon_info[obj->id].render_type != WEAPON_RENDER_POLYMODEL) | | fix axay = fixmul(fixmul(axis.x,axis.y),onemincos); |
vm_vec_add2(&temp_vec, &vector_to_object); | | fix axaz = fixmul(fixmul(axis.x,axis.z),onemincos); |
vm_vec_normalize_quick(&temp_vec); | | fix ayay = fixmul(axis.y,axis.y); |
vm_vec_scale(&temp_vec, speed); | | fix ayaz = fixmul(fixmul(axis.y,axis.z),onemincos); |
obj->mtype.phys_info.velocity = temp_vec; | | fix azaz = fixmul(axis.z,axis.z); |
| | fix axsin = fixmul(axis.x,sin); |
| | fix aysin = fixmul(axis.y,sin); |
| | fix azsin = fixmul(axis.z,sin); |
| | |
| | res_vec.x = fixmul((axax+fixmul(cos,(F1_0-axax))),vel_vec.x) + fixmul((axay-azsin),vel_vec.y) + fixmul((axaz+aysin),vel_vec.z); |
| | res_vec.y = fixmul((axay+azsin),vel_vec.x) + fixmul((ayay+fixmul(cos,(F1_0-ayay))),vel_vec.y) + fixmul((ayaz-axsin),vel_vec.z); |
| | res_vec.z = fixmul((axaz-aysin),vel_vec.x) + fixmul((ayaz+axsin),vel_vec.y) + fixmul((azaz+fixmul(cos,(F1_0-azaz))),vel_vec.z); |
| | |
| | fixang nang = vm_vec_delta_ang_norm(&vel_vec,&res_vec,NULL); |
| | if(nang < 0) |
| | { |
| | res_vec = old_vec; |
| | } |
| | // hud_message(MSGC_GAME_FEEDBACK,"tang %d mang %d nang %d",tang, mang, nang); |
| | } |
| | // else |
| | // { |
| | // hud_message(MSGC_GAME_FEEDBACK,"tang %d mang %d",tang, mang); |
| | // } |
| | |
| | |
| | // The boss' smart children track better... -- naah |
| | //if (Weapon_info[obj->id].render_type != WEAPON_RENDER_POLYMODEL) |
| | // vm_vec_add2(&temp_vec, &vector_to_object); |
| | vm_vec_normalize_quick(&res_vec); |
| | vm_vec_scale(&res_vec, speed); |
| | obj->mtype.phys_info.velocity = res_vec; |
| | |
// Subtract off life proportional to amount turned. | | // Subtract off life proportional to amount turned. |
// For hardest turn, it will lose 2 seconds per second. | | // For hardest turn, it will lose 2 seconds per second. |
| | |
absdot = F1_0/4; | | absdot = F1_0/4; |
lifelost = fixmul(absdot*16, FrameTime); | | lifelost = fixmul(absdot*16, FrameTime); |
obj->lifeleft -= lifelost; | | obj->lifeleft -= lifelost; |
// mprintf((0, "Missile %3i, dot = %7.3f life lost = %7.3f, life left = %7.3f\n", obj-Objects, f2fl(dot), f2fl(lifelost), f2fl(obj->lifeleft))); | | mprintf((0, "Missile %3i, dot = %7.3f life lost = %7.3f, life left = %7.3f\n", obj-Objects, f2fl(dot), f2fl(lifelost), f2fl(obj->lifeleft))); |
} | | } |
//added 8/14/98 by Victor Rachels to make homers lose life while going straight, too | | //added 8/14/98 by Victor Rachels to make homers lose life while going straight, too |
obj->lifeleft -= fixmul(F1_0, FrameTime); | | obj->lifeleft -= fixmul(F1_0, FrameTime); |
//end addition - Victor Rachels | | |
//added 8/18/98 by Victor Rachels to make homers go straight after lifelost | | |
//killed 8/28/98 by Victor Rachles - doesn't work | | |
// if(obj->lifeleft <= F1_0) | | |
// { | | |
// obj->lifeleft = F1_0*100; | | |
// Weapon_info[obj->id].homing_flag=0; | | |
// } | | |
//end kill - Victor Rachels | | |
//end addition - Victor Rachels | | |
| | |
} | | } |
| | |
// Only polygon objects have visible orientation, so only they should turn. | | // Only polygon objects have visible orientation, so only they should turn. |
if (Weapon_info[obj->id].render_type == WEAPON_RENDER_POLYMODEL) | | if (Weapon_info[obj->id].render_type == WEAPON_RENDER_POLYMODEL) |
homing_missile_turn_towards_velocity(obj, &temp_vec); // temp_vec is normalized velocity. | | homing_missile_turn_towards_velocity(obj, &res_vec); // res_vec is normalized velocity. |
} | | } |
} | | } |
| | |