Added more versatility in picking targets for the creation of smart blobs - especially for Multiplayer; cleaned that code a bit; made dodging of homing projectiles a little easier
This commit is contained in:
parent
b466072fd5
commit
8dfb4cde57
|
@ -1,5 +1,9 @@
|
||||||
D1X-Rebirth Changelog
|
D1X-Rebirth Changelog
|
||||||
|
|
||||||
|
20120509
|
||||||
|
--------
|
||||||
|
main/laser.c, main/multi.h: Added more versatility in picking targets for the creation of smart blobs - especially for Multiplayer; cleaned that code a bit; made dodging of homing projectiles a little easier
|
||||||
|
|
||||||
20120430
|
20120430
|
||||||
--------
|
--------
|
||||||
main/net_udp.c: fixed copy/paste mistake
|
main/net_udp.c: fixed copy/paste mistake
|
||||||
|
|
117
main/laser.c
117
main/laser.c
|
@ -914,65 +914,13 @@ void homing_missile_turn_towards_velocity(object *objp, vms_vector *norm_vel)
|
||||||
vm_vector_2_matrix(&objp->orient, &new_fvec, NULL, NULL);
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef NEWHOMER
|
#ifdef NEWHOMER
|
||||||
/*
|
/*
|
||||||
* In the original game homers turned sharper in higher FPS-values. We do not want that so we need to scale vector_to_object to FrameTime.
|
* In the original game homers turned sharper in higher FPS-values. We do not want that so we need to scale vector_to_object to FrameTime.
|
||||||
* For each difficulty setting we have a base value the homers will align to. This we express in a FPS value representing the homers turn radius of the original game (i.e. "The homer will turn like on XXFPS").
|
* For each difficulty setting we have a base value the homers will align to. This we express in a FPS value representing the homers turn radius of the original game (i.e. "The homer will turn like on XXFPS").
|
||||||
* NOTE: Old homers only get valid track_goal every 8 frames. This does not apply anymore so these values are divided by 4 to compensate this.
|
* NOTE: Old homers only get valid track_goal every 8 frames. This does not apply anymore so these values are divided by 4 to compensate this.
|
||||||
*/
|
*/
|
||||||
fix homing_turn_base[NDL] = { 5, 6, 8, 9, 10 };
|
fix homing_turn_base[NDL] = { 4, 5, 6, 7, 8 };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------
|
||||||
|
@ -1371,33 +1319,33 @@ int create_homing_missile(object *objp, int goal_obj, int objtype, int make_soun
|
||||||
// Create the children of a smart bomb, which is a bunch of homing missiles.
|
// Create the children of a smart bomb, which is a bunch of homing missiles.
|
||||||
void create_smart_children(object *objp)
|
void create_smart_children(object *objp)
|
||||||
{
|
{
|
||||||
int make_sound;
|
int parent_type;
|
||||||
int numobjs=0;
|
int numobjs=0, objnum = 0, sel_objnum, last_sel_objnum = -1;
|
||||||
int parent_type;
|
int objlist[MAX_OBJDISTS];
|
||||||
objdist objlist[MAX_OBJDISTS];
|
int blob_id;
|
||||||
|
|
||||||
if (Game_mode & GM_MULTI)
|
|
||||||
d_srand(8321L);
|
|
||||||
|
|
||||||
parent_type = objp->ctype.laser_info.parent_type;
|
parent_type = objp->ctype.laser_info.parent_type;
|
||||||
|
|
||||||
if (objp->id == SMART_ID) {
|
if (objp->id == SMART_ID) {
|
||||||
int i, objnum;
|
int i;
|
||||||
|
|
||||||
|
if (Game_mode & GM_MULTI)
|
||||||
|
d_srand(8321L);
|
||||||
|
|
||||||
for (objnum=0; objnum<=Highest_object_index; objnum++) {
|
for (objnum=0; objnum<=Highest_object_index; objnum++) {
|
||||||
object *curobjp = &Objects[objnum];
|
object *curobjp = &Objects[objnum];
|
||||||
|
|
||||||
if ((((curobjp->type == OBJ_ROBOT) && (!curobjp->ctype.ai_info.CLOAKED)) || (curobjp->type == OBJ_PLAYER)) && (objnum != objp->ctype.laser_info.parent_num)) {
|
if ((((curobjp->type == OBJ_ROBOT) && (!curobjp->ctype.ai_info.CLOAKED)) || (curobjp->type == OBJ_PLAYER)) && (objnum != objp->ctype.laser_info.parent_num)) {
|
||||||
fix dist;
|
fix dist;
|
||||||
|
|
||||||
if (curobjp->type == OBJ_PLAYER)
|
if (curobjp->type == OBJ_PLAYER)
|
||||||
{
|
{
|
||||||
if ((parent_type == OBJ_PLAYER) && (Game_mode & GM_MULTI_COOP))
|
if ((parent_type == OBJ_PLAYER) && (Game_mode & GM_MULTI_COOP))
|
||||||
continue;
|
continue;
|
||||||
#ifdef NETWORK
|
|
||||||
if ((Game_mode & GM_TEAM) && (get_team(curobjp->id) == get_team(Objects[objp->ctype.laser_info.parent_num].id)))
|
if ((Game_mode & GM_TEAM) && (get_team(curobjp->id) == get_team(Objects[objp->ctype.laser_info.parent_num].id)))
|
||||||
continue;
|
continue;
|
||||||
#endif
|
if (Players[curobjp->id].flags & PLAYER_FLAGS_CLOAKED)
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Robot blobs can't track robots.
|
// Robot blobs can't track robots.
|
||||||
|
@ -1407,13 +1355,12 @@ void create_smart_children(object *objp)
|
||||||
|
|
||||||
dist = vm_vec_dist_quick(&objp->pos, &curobjp->pos);
|
dist = vm_vec_dist_quick(&objp->pos, &curobjp->pos);
|
||||||
if (dist < MAX_SMART_DISTANCE) {
|
if (dist < MAX_SMART_DISTANCE) {
|
||||||
int oovis;
|
int oovis;
|
||||||
|
|
||||||
oovis = object_to_object_visibility(objp, curobjp, FQ_TRANSWALL);
|
oovis = object_to_object_visibility(objp, curobjp, FQ_TRANSWALL);
|
||||||
|
|
||||||
if (oovis) { //object_to_object_visibility(objp, curobjp, FQ_TRANSWALL)) {
|
if (oovis) { //object_to_object_visibility(objp, curobjp, FQ_TRANSWALL)) {
|
||||||
objlist[numobjs].objnum = objnum;
|
objlist[numobjs] = objnum;
|
||||||
objlist[numobjs].dist = dist;
|
|
||||||
numobjs++;
|
numobjs++;
|
||||||
if (numobjs >= MAX_OBJDISTS) {
|
if (numobjs >= MAX_OBJDISTS) {
|
||||||
numobjs = MAX_OBJDISTS;
|
numobjs = MAX_OBJDISTS;
|
||||||
|
@ -1424,26 +1371,22 @@ void create_smart_children(object *objp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get type of weapon for child from parent.
|
||||||
make_sound = 1;
|
if (parent_type == OBJ_PLAYER) {
|
||||||
if (numobjs == 0) {
|
blob_id = PLAYER_SMART_HOMING_ID;
|
||||||
for (i=0; i<NUM_SMART_CHILDREN; i++) {
|
Assert(blob_id != -1); // Hmm, missing data in bitmaps.tbl. Need "children=NN" parameter.
|
||||||
if (parent_type == OBJ_PLAYER) {
|
|
||||||
create_homing_missile(objp, -1, PLAYER_SMART_HOMING_ID, make_sound);
|
|
||||||
} else {
|
|
||||||
create_homing_missile(objp, -1, ROBOT_SMART_HOMING_ID, make_sound);
|
|
||||||
}
|
|
||||||
make_sound = 0;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
for (i=0; i<NUM_SMART_CHILDREN; i++) {
|
Assert(objp->type == OBJ_ROBOT);
|
||||||
if (parent_type == OBJ_PLAYER) {
|
blob_id = ROBOT_SMART_HOMING_ID;
|
||||||
create_homing_missile(objp, objlist[(d_rand() * numobjs) >> 15].objnum, PLAYER_SMART_HOMING_ID, make_sound);
|
}
|
||||||
} else {
|
|
||||||
create_homing_missile(objp, objlist[(d_rand() * numobjs) >> 15].objnum, ROBOT_SMART_HOMING_ID, make_sound);
|
for (i=0; i<NUM_SMART_CHILDREN; i++) {
|
||||||
}
|
sel_objnum = (numobjs==0)?-1:objlist[(d_rand() * numobjs) >> 15];
|
||||||
make_sound = 0;
|
if (numobjs > 1)
|
||||||
}
|
while (sel_objnum == last_sel_objnum)
|
||||||
|
sel_objnum = objlist[(d_rand() * numobjs) >> 15];
|
||||||
|
create_homing_missile(objp, sel_objnum, blob_id, (i==0)?1:0);
|
||||||
|
last_sel_objnum = sel_objnum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ extern int multi_protocol; // set and determinate used protocol
|
||||||
// 3 Descent II Shareware
|
// 3 Descent II Shareware
|
||||||
// 4 Descent II Commercial
|
// 4 Descent II Commercial
|
||||||
// > 4 DXX-Rebirth
|
// > 4 DXX-Rebirth
|
||||||
#define MULTI_PROTO_VERSION 13
|
#define MULTI_PROTO_VERSION 14
|
||||||
// PROTOCOL VARIABLES AND DEFINES - END
|
// PROTOCOL VARIABLES AND DEFINES - END
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue