From 87fea0b2e04db1bc79b3b5757e309e6a6c0a140c Mon Sep 17 00:00:00 2001 From: diligentcircle Date: Thu, 16 Sep 2021 02:16:00 -0400 Subject: [PATCH] Added a feature to force slave ships and cloak fighters to appear. This causes these mission targets to always appear the first time the player enters an interception, and every time after they fail to appear (so that you never have two time-wasting interceptions in a row). In the case of the rescue slaves mission, this takes the form of forcing the first ship to be a slave ship, and in the case of the cloak fighter, it simply forces the cloak fighter to appear. In each case, the variable controlling whether or not the condition is forced gets set to 0 if the mission target spawned, ensuring that time-waster interceptions can still occur as long as they both are preceded and followed by worthwhile interceptions. I decided this was important when I was playing and noticed that I wasn't getting slaves to rescue several times in a row. This situation would be confusing to new players and possibly make them think they were doing something wrong. It can also be very annoying to just not get any chances to make progress because of bad RNG. Forcing them to appear the first time allows the player to be immediately introduced to the targets, and forcing them to appear if they didn't last time limits the frustration of bad RNG by ensuring that even with the worst RNG, some amount of progress can be made. --- src/alien.c | 19 ++++++++++++++++--- src/alien.h | 2 +- src/game.c | 18 +++++++++++++++--- src/game.h | 3 +++ src/intermission.c | 2 ++ 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/alien.c b/src/alien.c index e7d42fa..16bfe9b 100644 --- a/src/alien.c +++ b/src/alien.c @@ -1190,7 +1190,11 @@ void aliens_init() } } -int alien_add() +/* Adds an alien. If spawnedMisnTarget is non-NULL, it is set to 1 if + * a mission target which can be forced with game.forceMisnTarget was + * spawned (or otherwise left unchanged). + */ +int alien_add(int *spawnedMisnTarget) { int index = alien_getFreeIndex(); @@ -1315,10 +1319,19 @@ int alien_add() && (game.area != MISN_SIVEDI) && (game.area != MISN_MARS)) { - if ((game.system == SYSTEM_EYANANTH) && (game.area == MISN_INTERCEPTION)) + if ((game.system == SYSTEM_EYANANTH) + && (game.area == MISN_INTERCEPTION)) { - if (CHANCE(1. / 5.)) + if (CHANCE(1. / 5.) + || (game.difficulty != DIFFICULTY_ORIGINAL + && game.forceMisnTarget)) + { randEnemy = CD_SLAVETRANSPORT; + game.forceMisnTarget = 0; + + if (spawnedMisnTarget != NULL) + *spawnedMisnTarget = 1; + } } if (CHANCE(1. / 6.)) diff --git a/src/alien.h b/src/alien.h index 6a8a631..fcfb435 100644 --- a/src/alien.h +++ b/src/alien.h @@ -29,7 +29,7 @@ extern Object aliens[ALIEN_MAX]; void alien_nerf(int index); void alien_defs_init(); void aliens_init(); -int alien_add(); +int alien_add(int *spawnedMisnTarget); void alien_addDrone(Object *hostAlien); void alien_addSmallAsteroid(Object *hostAlien); void alien_addFriendly(int type); diff --git a/src/game.c b/src/game.c index 604852c..291e582 100644 --- a/src/game.c +++ b/src/game.c @@ -104,6 +104,8 @@ void game_init() game.slavesRescued = 0; game.experimentalShield = 1000; + game.forceMisnTarget = 1; + game.timeTaken = 0; game.stationedPlanet = -1; @@ -2523,6 +2525,7 @@ void game_getDifficultyText(char *dest, int difficulty) int game_mainLoop() { + int spawnedMisnTarget; float chance; engine_resetLists(); @@ -2541,8 +2544,12 @@ int game_mainLoop() if (game.area == MISN_ELAMALE) aliens[ALIEN_KLINE].active = 0; + spawnedMisnTarget = 0; for (int i = 0 ; i < engine.maxAliens ; i++) - alien_add(); + alien_add(&spawnedMisnTarget); + + if (!spawnedMisnTarget) + game.forceMisnTarget = 1; if (game.hasWingMate1) alien_addFriendly(ALIEN_PHOEBE); @@ -2594,7 +2601,9 @@ int game_mainLoop() if ((game.system == SYSTEM_MORDOR) && (game.experimentalShield > 0)) { - if (CHANCE(4. / 5.)) + if (CHANCE(4. / 5.) + || (game.difficulty != DIFFICULTY_ORIGINAL + && game.forceMisnTarget)) { aliens[ALIEN_BOSS] = alien_defs[CD_CLOAKFIGHTER]; aliens[ALIEN_BOSS].owner = &aliens[ALIEN_BOSS]; @@ -2605,7 +2614,10 @@ int game_mainLoop() aliens[ALIEN_BOSS].y = player.y; player_setTarget(ALIEN_BOSS); aliens[ALIEN_BOSS].shield = game.experimentalShield; + game.forceMisnTarget = 0; } + else + game.forceMisnTarget = 1; } // Note: music is started here only for interceptions. For @@ -2893,7 +2905,7 @@ int game_mainLoop() WRAP_ADD(engine.addAliens, -1, 0, mission.addAliens); if ((engine.addAliens == 0) && (allowableAliens > 0)) { - allowableAliens -= alien_add(); + allowableAliens -= alien_add(NULL); } } diff --git a/src/game.h b/src/game.h index 5f483ed..ecf6bac 100644 --- a/src/game.h +++ b/src/game.h @@ -64,6 +64,9 @@ typedef struct Game_ { // remaining shield for experimental fighter int experimentalShield; + // Whether to force interception targets to appear + int forceMisnTarget; + Uint32 timeTaken; // In seconds int missionCompleted[MAX_PLANETS]; diff --git a/src/intermission.c b/src/intermission.c index 755193a..9106c16 100644 --- a/src/intermission.c +++ b/src/intermission.c @@ -179,6 +179,7 @@ void intermission_updateSystemStatus() game.stationedPlanet = 0; game.system = 1; game.area = MISN_RESCUESLAVES; + game.forceMisnTarget = 1; intermission_initPlanets(game.system); if (game.difficulty == DIFFICULTY_ORIGINAL) @@ -189,6 +190,7 @@ void intermission_updateSystemStatus() game.stationedPlanet = 0; game.system = 2; game.area = MISN_CLOAKFIGHTER; + game.forceMisnTarget = 1; intermission_initPlanets(game.system); if (game.difficulty == DIFFICULTY_ORIGINAL)