Allow aliens to attack "less desirable" targets if they can't find a good one.
The way it previously was, in particular, Sid 100% refused to attack fighting vessels and Phoebe and Ursula 100% refused to attack non-fighting vessels. This was most notable with the Urusor mission, where Sid would just become completely idle after disabling the last non-combat vessel and would often just drift off into the distance as a result (especially annoying in Classic difficulty as this could make it very difficult to find the remaining enemies). So now, instead these targets are treated as "undesirables", which normally will be avoided but will be accepted after 30 frames. This stops allies from idling around forever. This rule has also been applied to a rule that didn't allow targeting enemies beyond a particular distance. I'm keeping it in Classic difficulty for now, but might add an exception later.
This commit is contained in:
parent
cda23d7f7c
commit
75327aa3f8
22
src/alien.c
22
src/alien.c
|
@ -869,6 +869,7 @@ void aliens_init()
|
||||||
aliens[i].active = 0;
|
aliens[i].active = 0;
|
||||||
aliens[i].shield = -1;
|
aliens[i].shield = -1;
|
||||||
aliens[i].flags = 0;
|
aliens[i].flags = 0;
|
||||||
|
aliens[i].badTargetCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (game.area)
|
switch (game.area)
|
||||||
|
@ -1651,12 +1652,14 @@ void alien_searchForTarget(Object *alien)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Object *targetEnemy;
|
Object *targetEnemy;
|
||||||
|
int badTarget = 0;
|
||||||
|
|
||||||
if (alien->flags & FL_WEAPCO)
|
if (alien->flags & FL_WEAPCO)
|
||||||
{
|
{
|
||||||
if (CHANCE(1 / 10.))
|
if (CHANCE(1 / 10.))
|
||||||
{
|
{
|
||||||
alien->target = &player;
|
alien->target = &player;
|
||||||
|
alien->badTargetCount = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1668,8 +1671,11 @@ void alien_searchForTarget(Object *alien)
|
||||||
// return fire. This will save him from messing about (unless we're on the last mission)
|
// return fire. This will save him from messing about (unless we're on the last mission)
|
||||||
if ((alien->classDef == CD_SID) && (game.area != MISN_EARTH))
|
if ((alien->classDef == CD_SID) && (game.area != MISN_EARTH))
|
||||||
{
|
{
|
||||||
if ((targetEnemy->flags & FL_DISABLED) || (!(targetEnemy->flags & FL_NOFIRE)))
|
if (targetEnemy->flags & FL_DISABLED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!(targetEnemy->flags & FL_NOFIRE))
|
||||||
|
badTarget = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell Phoebe and Ursula not to attack ships that cannot fire or are disabled (unless we're on the last mission)
|
// Tell Phoebe and Ursula not to attack ships that cannot fire or are disabled (unless we're on the last mission)
|
||||||
|
@ -1683,7 +1689,7 @@ void alien_searchForTarget(Object *alien)
|
||||||
|
|
||||||
if ((targetEnemy->flags & FL_DISABLED) ||
|
if ((targetEnemy->flags & FL_DISABLED) ||
|
||||||
(targetEnemy->flags & FL_NOFIRE))
|
(targetEnemy->flags & FL_NOFIRE))
|
||||||
return;
|
badTarget = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1697,12 +1703,20 @@ void alien_searchForTarget(Object *alien)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (abs((int)alien->x - (int)alien->target->x) > 550)
|
if (abs((int)alien->x - (int)alien->target->x) > 550)
|
||||||
return;
|
badTarget = 1;
|
||||||
|
|
||||||
if (abs((int)alien->y - (int)alien->target->y) > 400)
|
if (abs((int)alien->y - (int)alien->target->y) > 400)
|
||||||
return;
|
badTarget = 1;
|
||||||
|
|
||||||
|
if (badTarget)
|
||||||
|
{
|
||||||
|
alien->badTargetCount++;
|
||||||
|
if (alien->badTargetCount < BAD_TARGET_ALLOW_TIME)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
alien->target = targetEnemy;
|
alien->target = targetEnemy;
|
||||||
|
alien->badTargetCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -89,6 +89,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#define ALIEN_WARP_SPEED MIN(-15, -3 * screen->w / 160)
|
#define ALIEN_WARP_SPEED MIN(-15, -3 * screen->w / 160)
|
||||||
#define ALIEN_WARP_ACCEL (game.difficulty == DIFFICULTY_ORIGINAL ? -15: -0.5)
|
#define ALIEN_WARP_ACCEL (game.difficulty == DIFFICULTY_ORIGINAL ? -15: -0.5)
|
||||||
|
|
||||||
|
#define BAD_TARGET_ALLOW_TIME 30
|
||||||
|
|
||||||
#define SLAVE_RESCUE_TARGET 250
|
#define SLAVE_RESCUE_TARGET 250
|
||||||
|
|
||||||
#define PIXFONT_LINE_HEIGHT 16
|
#define PIXFONT_LINE_HEIGHT 16
|
||||||
|
|
|
@ -45,6 +45,8 @@ typedef struct Object_ {
|
||||||
|
|
||||||
int face; // Either 0 or 1
|
int face; // Either 0 or 1
|
||||||
|
|
||||||
|
int badTargetCount;
|
||||||
|
|
||||||
struct Object_ *owner; // Who owns this Object
|
struct Object_ *owner; // Who owns this Object
|
||||||
|
|
||||||
int chance[2]; // Chance of using the weapons (out of 1000)
|
int chance[2]; // Chance of using the weapons (out of 1000)
|
||||||
|
|
Loading…
Reference in New Issue