| 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. |
| } | | } |
| } | | } |
| | | |