Added a new paradigm for how Kline works.

For difficulties above Easy difficulty which are not Classic difficulty,
Kline's run shield now changes depending on whether or not other
WEAPCO ships are still alive. If he's alone, the previous 100 shield
threshold was used. If any of the other ships are alive, though, he
only runs if he takes 500 damage (the same amount that you have to
inflict the first time you see him). The result of this is that he
doesn't run away real early in the battle (100 shield is so low that
you can easily make him run away with a quick laser shot); you have
to either fight real hard, or more realistically, defeat all the other
enemies first, making him feel like an actual threat rather than a
gimmick.

This is of course is excluded from Classic difficulty, and it's also
excluded from Easy and Super Easy difficulty.
This commit is contained in:
diligentcircle 2021-09-17 21:57:15 -04:00
parent 7b594c9fa7
commit 5ee90df2f3
1 changed files with 16 additions and 5 deletions

View File

@ -2186,6 +2186,7 @@ void alien_hurt(Object *alien, Object *attacker, int damage, int ion)
int ai_type; int ai_type;
double run_chance; double run_chance;
int stage1_shield, stage2_shield, stage3_shield; int stage1_shield, stage2_shield, stage3_shield;
int i;
ai_type = ((game.difficulty == DIFFICULTY_ORIGINAL) ? ai_type = ((game.difficulty == DIFFICULTY_ORIGINAL) ?
alien->AITypeOriginal : alien->AIType); alien->AITypeOriginal : alien->AIType);
@ -2267,21 +2268,31 @@ void alien_hurt(Object *alien, Object *attacker, int damage, int ion)
else else
{ {
stage1_shield = KLINE_SHIELD_TINY; stage1_shield = KLINE_SHIELD_TINY;
if ((game.difficulty != DIFFICULTY_ORIGINAL)
&& (game.difficulty > DIFFICULTY_EASY))
{
for (int i = 0 ; i < ALIEN_MAX ; i++)
{
if (aliens[i].active && (i != ALIEN_KLINE)
&& (aliens[i].flags & FL_WEAPCO)
&& (aliens[i].shield > 0))
{
stage1_shield = KLINE_SHIELD_SMALL;
break;
}
}
}
if ((alien->shield <= alien->maxShield - stage1_shield) if ((alien->shield <= alien->maxShield - stage1_shield)
&& !(alien->flags & FL_LEAVESECTOR)) && !(alien->flags & FL_LEAVESECTOR))
{
alien->flags |= FL_LEAVESECTOR; alien->flags |= FL_LEAVESECTOR;
}
} }
} }
run_chance = (game.difficulty == DIFFICULTY_ORIGINAL) ? 0.02 : damage / 50.; run_chance = (game.difficulty == DIFFICULTY_ORIGINAL) ? 0.02 : damage / 50.;
if ((alien->flags & FL_RUNSAWAY) && CHANCE(run_chance)) if ((alien->flags & FL_RUNSAWAY) && CHANCE(run_chance))
{
alien->flags |= FL_LEAVESECTOR; alien->flags |= FL_LEAVESECTOR;
}
audio_playSound(SFX_HIT, alien->x, alien->y); audio_playSound(SFX_HIT, alien->x, alien->y);
if (ai_type == AI_EVASIVE) if (ai_type == AI_EVASIVE)