added Alex' patch to add FPS independent and physics homing missiles - also implemented command-line to switch back to legacy homers

This commit is contained in:
zicodxx 2007-02-17 22:52:23 +00:00
parent 2546a5e24a
commit dc0a72029a
4 changed files with 162 additions and 103 deletions

View file

@ -5,6 +5,7 @@
;-missiondir <d> Set alternate mission dir to <d> instead of missions/
;-hudlog Start hudlog immediately
;-lowmem Lowers animation detail for better performance with low memory
;-legacyhomers Activate original homing missiles (FPS and physics independent)
Controls:

View file

@ -1,5 +1,13 @@
D1X-Rebirth Changelog
20070217
--------
d1x.ini, main/inferno.c, main/laser.c: added Alex' patch to add FPS independent and physics homing missiles - also implemented command-line to switch back to legacy homers
20070214
--------
Makefile, SConstruct, arch/sdl/mixmusic.c, main/vers_id.h: Turning off sound debug flags; Optional micro versions (see SConstruct); Makefile emulation for SCons
20070211
--------
d1x.ini, main/collide.c, main/collide.h, main/fireball.c, main/inferno.c, main/object.c: improved debris random stuff, added -persistentdebris feature

View file

@ -218,6 +218,7 @@ void show_commandline_help()
printf( " -missiondir <d> %s\n", "Set alternate mission dir to <d> instead of missions/");
printf( " -hudlog %s\n", "Start hudlog immediately");
printf( " -lowmem %s\n", "Lowers animation detail for better performance with low memory");
printf( " -legacyhomers %s\n", "Activate original homing missiles (FPS and physics independent)");
printf( "\n Controls:\n\n");
printf( " -NoJoystick %s\n", "Disables joystick support");
@ -322,6 +323,7 @@ extern fix fixed_frametime;
extern int framerate_on;
extern void vfx_set_palette_sub(ubyte *);
extern int mouselook;
extern int newhomers;
#ifndef RELEASE
extern int invulnerability;
#endif
@ -464,6 +466,9 @@ int main(int argc,char **argv)
else
mouselook=0;
if (FindArg("-legacyhomers"))
newhomers = 0;
if (FindArg("-persistentdebris"))
persistent_debris=1;

View file

@ -68,6 +68,8 @@ int Laser_rapid_fire = 0;
int Laser_drop_vulcan_ammo = 0;
int newhomers = 1;
int find_homing_object_complete(vms_vector *curpos, object *tracker, int track_obj_type1, int track_obj_type2);
//---------------------------------------------------------------------------------
@ -955,11 +957,7 @@ void Flare_create(object *obj)
}
#define HOMING_MISSILE_SCALE 16
#define LIMIT_HOMERS 1
#define HOMER_MAX_FPS 30
#define HOMER_MIN_DELAY (1000 / HOMER_MAX_FPS)
#define HOMING_MISSILE_SCALE 8
//-------------------------------------------------------------------------------------------
// Set object *objp's orientation to (or towards if I'm ambitious) its velocity.
@ -967,36 +965,9 @@ void homing_missile_turn_towards_velocity(object *objp, vms_vector *norm_vel)
{
vms_vector new_fvec;
#ifdef LIMIT_HOMERS
static time_t last_time = -1;
static int nFrames = 1;
time_t this_time, delta_time;
fix frame_time;
int fps;
if (last_time == -1) {
last_time = clock ();
frame_time = FrameTime;
} else {
nFrames++;
this_time = clock ();
delta_time = this_time - last_time;
if (delta_time < HOMER_MIN_DELAY) {
return;
} else {
fps = (1000 + delta_time / 2) / delta_time;
frame_time = fps ? (f1_0 + fps / 2) / fps : f1_0;
// frame_time /= nFrames;
nFrames = 0;
last_time = this_time;
}
}
#else
fix frame_time = FrameTime;
#endif
new_fvec = *norm_vel;
vm_vec_scale(&new_fvec, frame_time * HOMING_MISSILE_SCALE);
vm_vec_scale(&new_fvec, FrameTime * HOMING_MISSILE_SCALE);
vm_vec_add2(&new_fvec, &objp->orient.fvec);
vm_vec_normalize_quick(&new_fvec);
@ -1006,6 +977,58 @@ void homing_missile_turn_towards_velocity(object *objp, vms_vector *norm_vel)
vm_vector_2_matrix(&objp->orient, &new_fvec, NULL, NULL);
}
// *a hack, because weapons must have physics; at least missiles must
// *that this subroutine would be easy in use, here is used turn radius, and not something else
// *give here normalized vectors; returns normalized vector too
void Laser_TurnSpeedLimit(vms_vector* vec_forward, vms_vector* vec_to_target, fix speed, fix turn_radius)
{
fixang allowed_angle;
fixang angle_delta;
fix temp;
fix circle_length;
vms_matrix view_mat;
vms_matrix rot_mat;
// get allowed angle
circle_length = (fix)(turn_radius * 2 * 3.14159);
// get gone distance
temp = fixmul(speed, FrameTime);
// look, which angle such distance will be on the circle
temp = fixdiv(temp, circle_length);
// however it will be, but not too much, for this one frame
allowed_angle = temp <= 0x1000 ? temp : 0x1000; // 0x1000: not more that 90 / 4 degrees
angle_delta = vm_vec_delta_ang_norm (vec_forward, vec_to_target, NULL);
if (angle_delta && angle_delta > allowed_angle)
{
vms_angvec tangles;
vms_matrix new_orient;
// imagine view matrix (which will not have anything common with real view matrix of weapon)
// matrix must be such, that we would rotate (home) at right side
view_mat.fvec = *vec_forward;
vm_vec_crossprod (&view_mat.uvec, vec_forward, vec_to_target);
vm_vec_normalize (&view_mat.uvec);
vm_vec_crossprod (&view_mat.rvec, &view_mat.uvec, vec_forward);
vm_vec_normalize (&view_mat.rvec);
tangles.p = 0;
// turn to the right, as we were arranged above
tangles.h = allowed_angle;
tangles.b = 0;
// copied from 'do_physics_sim_rot ()'
vm_angles_2_matrix (&rot_mat, &tangles);
vm_matrix_x_matrix (&new_orient, &view_mat, &rot_mat);
*vec_forward = new_orient.fvec;
}
else
// time was enough to finish homing turn till the end
*vec_forward = *vec_to_target;
}
//-------------------------------------------------------------------------------------------
//sequence this laser object for this _frame_ (underscores added here to aid MK in his searching!)
void Laser_do_weapon_sequence(object *obj)
@ -1065,82 +1088,104 @@ void Laser_do_weapon_sequence(object *obj)
}
if (track_goal != -1) {
//edited 8/3/98 by Victor Rachels to fix homer high cpu effect
fixang tang;
//end this section editing - Victor Rachels
vm_vec_sub(&vector_to_object, &Objects[track_goal].pos, &obj->pos);
vm_vec_normalize_quick(&vector_to_object);
temp_vec = obj->mtype.phys_info.velocity;
speed = vm_vec_normalize_quick(&temp_vec);
max_speed = Weapon_info[obj->id].speed[Difficulty_level];
if (speed+F1_0 < max_speed) {
speed += fixmul(max_speed, FrameTime/2);
if (speed > max_speed)
speed = max_speed;
}
dot = vm_vec_dot(&temp_vec, &vector_to_object);
//edited 8/2/98 by Victor Rachels to fix homer high cpu effect
//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);
if(tang > F1_0/(80/(Difficulty_level+1)-10 ) * FrameTime)
{
//make new vector at MaxHomingAng between previous vector and otherwise new vector;
//Vector = ( (New - Old)* MaxAngle/OldAngle ) + Old
vm_vec_sub2(&temp_vec,&vector_to_object);
vm_vec_scale(&temp_vec,F1_0/(80/(Difficulty_level+1)-10 ) * FrameTime/tang);
vm_vec_add2(&temp_vec,&vector_to_object);
}
//end changes for fixing homers - Victor Rachels
vm_vec_add2(&temp_vec, &vector_to_object);
// The boss' smart children track better...
if (Weapon_info[obj->id].render_type != WEAPON_RENDER_POLYMODEL)
vm_vec_add2(&temp_vec, &vector_to_object);
vm_vec_normalize_quick(&temp_vec);
vm_vec_scale(&temp_vec, speed);
obj->mtype.phys_info.velocity = temp_vec;
// Subtract off life proportional to amount turned.
// For hardest turn, it will lose 2 seconds per second.
if (newhomers)
{
fix lifelost, absdot;
absdot = abs(F1_0 - dot);
if (absdot > F1_0/8) {
if (absdot > F1_0/4)
absdot = F1_0/4;
lifelost = fixmul(absdot*16, FrameTime);
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)));
fix turn_radius;
turn_radius = 0x0014 * F1_0;
vm_vec_sub(&vector_to_object, &Objects[track_goal].pos, &obj->pos);
// we need normalized exact vectors here
vm_vec_normalize (&vector_to_object);
temp_vec = obj->mtype.phys_info.velocity;
// gives magnitude
speed = vm_vec_normalize (&temp_vec);
// homing missile speeds : insane - 0x005a
max_speed = Weapon_info[obj->id].speed[Difficulty_level];
if (speed + F1_0 < max_speed)
{
speed += fixmul(max_speed, FrameTime/2);
if (speed > max_speed)
speed = max_speed;
}
//added 8/14/98 by Victor Rachels to make homers lose life while going straight, too
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
dot = vm_vec_dot(&temp_vec, &vector_to_object);
Laser_TurnSpeedLimit(&temp_vec, &vector_to_object, speed, turn_radius);
obj->mtype.phys_info.velocity = temp_vec;
// orient it directly by movement vector
vm_vector_2_matrix (&obj->orient, &temp_vec, NULL, NULL);
// apply speed
vm_vec_scale (&temp_vec, speed);
obj->mtype.phys_info.velocity = temp_vec;
// Subtract off life proportional to amount turned.
// For hardest turn, it will lose 2 seconds per second.
{
fix lifelost, absdot;
absdot = abs(F1_0 - dot);
if (absdot > F1_0/8) {
if (absdot > F1_0/4)
absdot = F1_0/4;
lifelost = fixmul(absdot*16, FrameTime);
obj->lifeleft -= lifelost;
}
//added 8/14/98 by Victor Rachels to make homers lose life while going straight, too
obj->lifeleft -= fixmul(F1_0, FrameTime);
//end addition - Victor Rachels
}
} else {
vm_vec_sub(&vector_to_object, &Objects[track_goal].pos, &obj->pos);
vm_vec_normalize_quick(&vector_to_object);
temp_vec = obj->mtype.phys_info.velocity;
speed = vm_vec_normalize_quick(&temp_vec);
max_speed = Weapon_info[obj->id].speed[Difficulty_level];
if (speed+F1_0 < max_speed) {
speed += fixmul(max_speed, FrameTime/2);
if (speed > max_speed)
speed = max_speed;
}
dot = vm_vec_dot(&temp_vec, &vector_to_object);
vm_vec_add2(&temp_vec, &vector_to_object);
// The boss' smart children track better...
if (Weapon_info[obj->id].render_type != WEAPON_RENDER_POLYMODEL)
vm_vec_add2(&temp_vec, &vector_to_object);
vm_vec_normalize_quick(&temp_vec);
vm_vec_scale(&temp_vec, speed);
obj->mtype.phys_info.velocity = temp_vec;
// Subtract off life proportional to amount turned.
// For hardest turn, it will lose 2 seconds per second.
{
fix lifelost, absdot;
absdot = abs(F1_0 - dot);
if (absdot > F1_0/8) {
if (absdot > F1_0/4)
absdot = F1_0/4;
lifelost = fixmul(absdot*16, FrameTime);
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)));
}
//added 8/14/98 by Victor Rachels to make homers lose life while going straight, too
obj->lifeleft -= fixmul(F1_0, FrameTime);
//end addition - Victor Rachels
}
// Only polygon objects have visible orientation, so only they should turn.
if (Weapon_info[obj->id].render_type == WEAPON_RENDER_POLYMODEL)
homing_missile_turn_towards_velocity(obj, &temp_vec); // temp_vec is normalized velocity.
}
// Only polygon objects have visible orientation, so only they should turn.
if (Weapon_info[obj->id].render_type == WEAPON_RENDER_POLYMODEL)
homing_missile_turn_towards_velocity(obj, &temp_vec); // temp_vec is normalized velocity.
}
}
}
// Make sure weapon is not moving faster than allowed speed.