Added a super-easy difficulty.

This commit is contained in:
Layla Marchant 2020-05-26 15:51:04 -04:00
parent 1a00e0df2c
commit 5c9b69dd0c
7 changed files with 139 additions and 71 deletions

View File

@ -1286,9 +1286,9 @@ int alien_add()
int randEnemy = alienArray[rand() % numberOfAliens]; int randEnemy = alienArray[rand() % numberOfAliens];
if ((game.area != MISN_DORIM) && if ((game.area != MISN_DORIM)
(game.area != MISN_SIVEDI) && && (game.area != MISN_SIVEDI)
(game.area != MISN_MARS)) && (game.area != MISN_MARS))
{ {
if ((game.system == SYSTEM_EYANANTH) && (game.area == MISN_INTERCEPTION)) if ((game.system == SYSTEM_EYANANTH) && (game.area == MISN_INTERCEPTION))
{ {
@ -1312,15 +1312,33 @@ int alien_add()
aliens[index].deathCounter = 0 - (aliens[index].maxShield * 3); aliens[index].deathCounter = 0 - (aliens[index].maxShield * 3);
aliens[index].hit = 0; aliens[index].hit = 0;
if (game.difficulty == DIFFICULTY_SUPEREASY)
{
if ((aliens[index].classDef == CD_SID)
|| (aliens[index].classDef == CD_PHOEBE)
|| (aliens[index].classDef == CD_URSULA)
|| (aliens[index].classDef == CD_GOODTRANSPORT)
|| (aliens[index].classDef == CD_REBELCARRIER)
|| ((game.area == MISN_URUSOR)
&& (aliens[index].classDef == CD_CARGOSHIP)))
{
aliens[index].shield *= 2;
aliens[index].maxShield *= 2;
}
else if ((aliens[index].classDef != CD_ASTEROID)
&& (aliens[index].classDef != CD_ASTEROID2))
{
aliens[index].shield /= 2;
aliens[index].maxShield /= 2;
}
}
LIMIT(aliens[index].deathCounter, -250, 0); LIMIT(aliens[index].deathCounter, -250, 0);
// Attempts to place an alien. If it fails, the alien is deactivated. // Attempts to place an alien. If it fails, the alien is deactivated.
for (int i = 0 ; i < 100 ; i++) if (!alien_place(&aliens[index]))
{ {
if (alien_place(&aliens[index]))
break;
aliens[index].active = 0; aliens[index].active = 0;
return 0; return 0;
} }
@ -1590,16 +1608,25 @@ This AI is exclusively for Kline.
*/ */
void alien_setKlineAI(Object *alien) void alien_setKlineAI(Object *alien)
{ {
int threshold;
// Weapon type change // Weapon type change
if (CHANCE(1. / 3.)) if (CHANCE(1. / 3.))
{ {
if ((game.area != MISN_VENUS) || (game.difficulty != DIFFICULTY_ORIGINAL)) if ((game.area != MISN_VENUS)
|| (game.difficulty != DIFFICULTY_ORIGINAL))
{ {
alien->flags &= ~FL_AIMS; alien->flags &= ~FL_AIMS;
if (CHANCE(0.5)) if (CHANCE(0.5))
{ {
if ((game.area != MISN_VENUS) || (alien->shield > 1500)) if (game.difficulty == DIFFICULTY_SUPEREASY)
threshold = 750;
else
threshold = 1500;
if ((game.area != MISN_VENUS)
|| (alien->shield > threshold))
alien->weaponType[0] = W_TRIPLE_SHOT; alien->weaponType[0] = W_TRIPLE_SHOT;
else else
alien->weaponType[0] = W_SPREADSHOT; alien->weaponType[0] = W_SPREADSHOT;
@ -2123,6 +2150,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;
ai_type = ((game.difficulty == DIFFICULTY_ORIGINAL) ? ai_type = ((game.difficulty == DIFFICULTY_ORIGINAL) ?
alien->AITypeOriginal : alien->AIType); alien->AITypeOriginal : alien->AIType);
@ -2133,8 +2161,8 @@ void alien_hurt(Object *alien, Object *attacker, int damage, int ion)
alien->shield -= damage; alien->shield -= damage;
// Chain reaction damage if needed // Chain reaction damage if needed
if ((game.difficulty != DIFFICULTY_ORIGINAL) && if ((game.difficulty != DIFFICULTY_ORIGINAL)
(alien->owner != alien) && (alien->flags & FL_DAMAGEOWNER)) && (alien->owner != alien) && (alien->flags & FL_DAMAGEOWNER))
{ {
alien_hurt(alien->owner, attacker, damage, ion); alien_hurt(alien->owner, attacker, damage, ion);
} }
@ -2143,8 +2171,15 @@ void alien_hurt(Object *alien, Object *attacker, int damage, int ion)
{ {
if (game.area == MISN_ELAMALE) if (game.area == MISN_ELAMALE)
{ {
if ((alien->shield <= alien->maxShield - ((game.difficulty != DIFFICULTY_ORIGINAL) ? 500 : 750)) && if (game.difficulty == DIFFICULTY_ORIGINAL)
!(alien->flags & FL_LEAVESECTOR)) stage1_shield = 750;
else if (game.difficulty == DIFFICULTY_SUPEREASY)
stage1_shield = 250;
else
stage1_shield = 500;
if ((alien->shield <= alien->maxShield - stage1_shield)
&& !(alien->flags & FL_LEAVESECTOR))
{ {
alien->flags |= FL_LEAVESECTOR; alien->flags |= FL_LEAVESECTOR;
alien->flags &= ~FL_CIRCLES; alien->flags &= ~FL_CIRCLES;
@ -2155,8 +2190,15 @@ void alien_hurt(Object *alien, Object *attacker, int damage, int ion)
} }
else if (game.area == MISN_EARTH) else if (game.area == MISN_EARTH)
{ {
if ((alien->shield <= alien->maxShield - ((game.difficulty != DIFFICULTY_ORIGINAL) ? 750 : 500)) && if (game.difficulty == DIFFICULTY_ORIGINAL)
!(alien->flags & FL_LEAVESECTOR)) stage1_shield = 500;
else if (game.difficulty == DIFFICULTY_SUPEREASY)
stage1_shield = 375;
else
stage1_shield = 750;
if ((alien->shield <= alien->maxShield - stage1_shield)
&& !(alien->flags & FL_LEAVESECTOR))
{ {
alien->flags |= FL_LEAVESECTOR; alien->flags |= FL_LEAVESECTOR;
alien->flags &= ~FL_CIRCLES; alien->flags &= ~FL_CIRCLES;
@ -2167,20 +2209,38 @@ void alien_hurt(Object *alien, Object *attacker, int damage, int ion)
} }
else if (game.area == MISN_VENUS) else if (game.area == MISN_VENUS)
{ {
if (alien->shield + damage > 1500 && if (game.difficulty == DIFFICULTY_SUPEREASY)
alien->shield <= 1500) {
stage1_shield = 750;
stage2_shield = 500;
stage3_shield = 250;
}
else
{
stage1_shield = 1500;
stage2_shield = 1000;
stage3_shield = 500;
}
if (alien->shield + damage > stage1_shield
&& alien->shield <= stage1_shield)
alien_setKlineAttackMethod(alien); alien_setKlineAttackMethod(alien);
else if (alien->shield + damage > 1000 && else if (alien->shield + damage > stage2_shield
alien->shield <= 1000) && alien->shield <= stage2_shield)
alien_setKlineAttackMethod(alien); alien_setKlineAttackMethod(alien);
else if (alien->shield + damage > 500 && else if (alien->shield + damage > stage3_shield
alien->shield <= 500) && alien->shield <= stage3_shield)
alien_setKlineAttackMethod(alien); alien_setKlineAttackMethod(alien);
} }
else else
{ {
if ((alien->shield <= alien->maxShield - 100) && if (game.difficulty == DIFFICULTY_SUPEREASY)
!(alien->flags & FL_LEAVESECTOR)) stage1_shield = 50;
else
stage1_shield = 100;
if ((alien->shield <= alien->maxShield - stage1_shield)
&& !(alien->flags & FL_LEAVESECTOR))
{ {
alien->flags |= FL_LEAVESECTOR; alien->flags |= FL_LEAVESECTOR;
alien->flags &= ~FL_CIRCLES; alien->flags &= ~FL_CIRCLES;

View File

@ -60,8 +60,8 @@ void bullet_add(Object *theWeapon, Object *attacker, int y, int dy)
if (attacker->face == 0) if (attacker->face == 0)
{ {
bullet->dx = theWeapon->speed; bullet->dx = theWeapon->speed;
if ((game.area == MISN_ELLESH) || if ((game.area == MISN_ELLESH)
(game.area == MISN_MARS)) || (game.area == MISN_MARS))
bullet->dx += fabsf(engine.ssx + engine.smx); bullet->dx += fabsf(engine.ssx + engine.smx);
} }
else else

View File

@ -40,17 +40,18 @@ void collectable_add(float x, float y, int type, int value, int life)
Collectable *collectable; Collectable *collectable;
int plasma_useless, shield_useless, rockets_useless; int plasma_useless, shield_useless, rockets_useless;
plasma_useless = (((weapons[W_PLAYER_WEAPON].reload[0] >= rate2reload[game.minPlasmaRate]) && plasma_useless = (((weapons[W_PLAYER_WEAPON].reload[0] >= rate2reload[game.minPlasmaRate])
(weapons[W_PLAYER_WEAPON].ammo[0] <= game.minPlasmaOutput) && && (weapons[W_PLAYER_WEAPON].ammo[0] <= game.minPlasmaOutput)
(weapons[W_PLAYER_WEAPON].damage <= game.minPlasmaDamage)) || && (weapons[W_PLAYER_WEAPON].damage <= game.minPlasmaDamage))
(player.ammo[0] >= game.maxPlasmaAmmo)); || (player.ammo[0] >= game.maxPlasmaAmmo));
shield_useless = ((game.difficulty == DIFFICULTY_NIGHTMARE) || shield_useless = ((game.difficulty == DIFFICULTY_NIGHTMARE) ||
(player.shield >= player.maxShield)); (player.shield >= player.maxShield));
rockets_useless = ((player.weaponType[1] == W_CHARGER) || rockets_useless = ((player.weaponType[1] == W_CHARGER)
(player.weaponType[1] == W_LASER) || (game.maxRocketAmmo <= 0) || || (player.weaponType[1] == W_LASER)
(player.ammo[1] >= game.maxRocketAmmo)); || (game.maxRocketAmmo <= 0)
|| (player.ammo[1] >= game.maxRocketAmmo));
if (type == P_ANYTHING) if (type == P_ANYTHING)
{ {
@ -61,21 +62,22 @@ void collectable_add(float x, float y, int type, int value, int life)
switch (r) switch (r)
{ {
case 0: case 0:
if ((game.difficulty == DIFFICULTY_ORIGINAL) || if ((game.difficulty == DIFFICULTY_ORIGINAL)
(game.difficulty == DIFFICULTY_NIGHTMARE)) || (game.difficulty == DIFFICULTY_NIGHTMARE))
{ {
type = P_PLASMA_AMMO; type = P_PLASMA_AMMO;
} }
else else
{ {
if ((!shield_useless) && if ((!shield_useless)
(CHANCE(2 * (player.maxShield - player.shield) / player.maxShield))) && (CHANCE(2 * (player.maxShield - player.shield) / player.maxShield)))
{ {
type = P_SHIELD; type = P_SHIELD;
} }
else if ((!rockets_useless) && (game.maxRocketAmmo > 0) && else if ((!rockets_useless)
(CHANCE((game.maxRocketAmmo - player.ammo[1]) / game.maxRocketAmmo))) && (game.maxRocketAmmo > 0)
&& (CHANCE((game.maxRocketAmmo - player.ammo[1]) / game.maxRocketAmmo)))
{ {
type = P_ROCKET; type = P_ROCKET;
} }
@ -91,20 +93,21 @@ void collectable_add(float x, float y, int type, int value, int life)
break; break;
case 2: case 2:
if ((game.difficulty == DIFFICULTY_ORIGINAL) || if ((game.difficulty == DIFFICULTY_ORIGINAL)
(game.difficulty == DIFFICULTY_NIGHTMARE)) || (game.difficulty == DIFFICULTY_NIGHTMARE))
{ {
type = P_ROCKET; type = P_ROCKET;
} }
else else
{ {
if ((!shield_useless) && if ((!shield_useless)
(CHANCE(2 * (player.maxShield - player.shield) / player.maxShield))) && (CHANCE(2 * (player.maxShield - player.shield) / player.maxShield)))
{ {
type = P_SHIELD; type = P_SHIELD;
} }
else if ((!plasma_useless) && (game.maxPlasmaAmmo > 0) && else if ((!plasma_useless)
(CHANCE((game.maxPlasmaAmmo - player.ammo[0]) / game.maxPlasmaAmmo))) && (game.maxPlasmaAmmo > 0)
&& (CHANCE((game.maxPlasmaAmmo - player.ammo[0]) / game.maxPlasmaAmmo)))
{ {
type = P_PLASMA_AMMO; type = P_PLASMA_AMMO;
} }
@ -120,13 +123,14 @@ void collectable_add(float x, float y, int type, int value, int life)
{ {
type = P_PLASMA_RATE; type = P_PLASMA_RATE;
if ((game.difficulty == DIFFICULTY_NIGHTMARE) || if ((game.difficulty == DIFFICULTY_NIGHTMARE)
((game.difficulty != DIFFICULTY_EASY) && || ((game.difficulty != DIFFICULTY_SUPEREASY)
(game.difficulty != DIFFICULTY_ORIGINAL) && && (game.difficulty != DIFFICULTY_EASY)
((game.area == MISN_MOEBO) || && (game.difficulty != DIFFICULTY_ORIGINAL)
(game.area == MISN_ELAMALE) || && ((game.area == MISN_MOEBO)
(game.area == MISN_ELLESH) || || (game.area == MISN_ELAMALE)
(game.area == MISN_EARTH)))) || (game.area == MISN_ELLESH)
|| (game.area == MISN_EARTH))))
{ {
// Deny the Super Charge in Nightmare difficulty, and on bosses. // Deny the Super Charge in Nightmare difficulty, and on bosses.
r = rand() % 59; r = rand() % 59;
@ -149,6 +153,9 @@ void collectable_add(float x, float y, int type, int value, int life)
if (value == 0) if (value == 0)
return; // don't bother! return; // don't bother!
if (game.difficulty == DIFFICULTY_SUPEREASY)
value *= 2;
// No point in giving the player plasma ammo if the weapons aren't // No point in giving the player plasma ammo if the weapons aren't
// upgraded! Give them money instead. (Except in Classic difficulty.) // upgraded! Give them money instead. (Except in Classic difficulty.)
@ -164,9 +171,9 @@ void collectable_add(float x, float y, int type, int value, int life)
// rockets. Causes problems otherwise :) // rockets. Causes problems otherwise :)
if (type == P_ROCKET) if (type == P_ROCKET)
{ {
if ((player.weaponType[1] == W_CHARGER) || if ((player.weaponType[1] == W_CHARGER)
(player.weaponType[1] == W_LASER) || || (player.weaponType[1] == W_LASER)
(value < 10)) || (value < 10))
{ {
type = P_CASH; type = P_CASH;
} }
@ -199,8 +206,9 @@ void collectable_add(float x, float y, int type, int value, int life)
else else
{ {
// No cash or ammo on interceptions. Completely stops grinding. // No cash or ammo on interceptions. Completely stops grinding.
if ((game.area == MISN_INTERCEPTION) && if ((game.area == MISN_INTERCEPTION)
((type == P_CASH) || (type == P_PLASMA_AMMO) || (type == P_ROCKET))) && ((type == P_CASH) || (type == P_PLASMA_AMMO)
|| (type == P_ROCKET)))
{ {
return; return;
} }

View File

@ -794,7 +794,8 @@ enum {
// Difficulties // Difficulties
enum { enum {
DIFFICULTY_EASY = 0, DIFFICULTY_SUPEREASY = 0,
DIFFICULTY_EASY,
DIFFICULTY_NORMAL, DIFFICULTY_NORMAL,
DIFFICULTY_HARD, DIFFICULTY_HARD,
DIFFICULTY_NIGHTMARE, DIFFICULTY_NIGHTMARE,

View File

@ -130,6 +130,7 @@ void game_init()
switch (game.difficulty) switch (game.difficulty)
{ {
case DIFFICULTY_SUPEREASY:
case DIFFICULTY_EASY: case DIFFICULTY_EASY:
player.maxShield = 100; player.maxShield = 100;
@ -872,8 +873,9 @@ static void game_doBullets()
} }
} }
if ((game.difficulty != DIFFICULTY_EASY) && if ((game.difficulty != DIFFICULTY_SUPEREASY)
((bullet->owner == &player) || (bullet->id == WT_ROCKET))) && (game.difficulty != DIFFICULTY_EASY)
&& ((bullet->owner == &player) || (bullet->id == WT_ROCKET)))
{ {
for (int j = 0 ; j < 20 ; j++) for (int j = 0 ; j < 20 ; j++)
{ {
@ -2386,6 +2388,10 @@ void game_getDifficultyText(char *dest, int difficulty)
{ {
switch (difficulty) switch (difficulty)
{ {
case DIFFICULTY_SUPEREASY:
/// DIFFICULTY_SUPEREASY
strcpy(dest, _("Super-Easy"));
break;
case DIFFICULTY_EASY: case DIFFICULTY_EASY:
/// DIFFICULTY_EASY /// DIFFICULTY_EASY
strcpy(dest, _("Easy")); strcpy(dest, _("Easy"));

View File

@ -1461,8 +1461,9 @@ int intermission()
intermission_createCommsSurface(commsSurface); intermission_createCommsSurface(commsSurface);
// Remove the Supercharge, if it is there // Remove the Supercharge, if it is there
if ((game.difficulty != DIFFICULTY_EASY) && if ((game.difficulty != DIFFICULTY_SUPEREASY)
(game.difficulty != DIFFICULTY_ORIGINAL)) && (game.difficulty != DIFFICULTY_EASY)
&& (game.difficulty != DIFFICULTY_ORIGINAL))
{ {
weapons[W_PLAYER_WEAPON].reload[0] = MAX( weapons[W_PLAYER_WEAPON].reload[0] = MAX(
weapons[W_PLAYER_WEAPON].reload[0], weapons[W_PLAYER_WEAPON].reload[0],

View File

@ -105,16 +105,8 @@ void ship_fireBullet(Object *ship, int weaponIndex)
if (theWeapon->ammo[0] == 5) if (theWeapon->ammo[0] == 5)
{ {
if (game.difficulty == DIFFICULTY_ORIGINAL) bullet_add(theWeapon, ship, y * 1, -2);
{ bullet_add(theWeapon, ship, y * 5, 2);
bullet_add(theWeapon, ship, y * 2, -1);
bullet_add(theWeapon, ship, y * 4, 1);
}
else
{
bullet_add(theWeapon, ship, y * 1, -2);
bullet_add(theWeapon, ship, y * 5, 2);
}
} }
} }
else else