Fix crash when no valid enemies are selected (#5519)

* fix crash when no valid enemies are selected

* Clanged
This commit is contained in:
Pepper0ni 2025-05-22 23:23:14 +01:00 committed by GitHub
commit a9fc317a5a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 15 deletions

View file

@ -270,15 +270,7 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* po
// Get randomized enemy ID and parameter. // Get randomized enemy ID and parameter.
uint32_t seed = uint32_t seed =
play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params; play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params;
EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed); EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed, play);
int8_t timesRandomized = 1;
// While randomized enemy isn't allowed in certain situations, randomize again.
while (!IsEnemyAllowedToSpawn(play->sceneNum, play->roomCtx.curRoom.num, randomEnemy)) {
randomEnemy = GetRandomizedEnemyEntry(seed + timesRandomized);
timesRandomized++;
}
*actorId = randomEnemy.id; *actorId = randomEnemy.id;
*params = randomEnemy.params; *params = randomEnemy.params;
@ -334,19 +326,28 @@ void GetSelectedEnemies() {
} }
} }
EnemyEntry GetRandomizedEnemyEntry(uint32_t seed) { EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play) {
std::vector<EnemyEntry> filteredEnemyList = {};
if (selectedEnemyList.size() == 0) { if (selectedEnemyList.size() == 0) {
GetSelectedEnemies(); GetSelectedEnemies();
} }
for (EnemyEntry enemy : selectedEnemyList) {
if (IsEnemyAllowedToSpawn(play->sceneNum, play->roomCtx.curRoom.num, enemy)) {
filteredEnemyList.push_back(enemy);
}
}
if (filteredEnemyList.size() == 0) {
filteredEnemyList = selectedEnemyList;
}
if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM_SEEDED) { if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM_SEEDED) {
uint32_t finalSeed = uint32_t finalSeed =
seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt);
Random_Init(finalSeed); Random_Init(finalSeed);
uint32_t randomNumber = Random(0, selectedEnemyList.size()); uint32_t randomNumber = Random(0, filteredEnemyList.size());
return selectedEnemyList[randomNumber]; return filteredEnemyList[randomNumber];
} else { } else {
uint32_t randomSelectedEnemy = Random(0, selectedEnemyList.size()); uint32_t randomSelectedEnemy = Random(0, filteredEnemyList.size());
return selectedEnemyList[randomSelectedEnemy]; return filteredEnemyList[randomSelectedEnemy];
} }
} }

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <libultraship/bridge.h> #include <libultraship/bridge.h>
#include "item-tables/ItemTableTypes.h"
typedef struct EnemyEntry { typedef struct EnemyEntry {
int16_t id; int16_t id;
@ -11,7 +12,7 @@ typedef struct EnemyEntry {
bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX);
bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy);
EnemyEntry GetRandomizedEnemyEntry(uint32_t seed); EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play);
extern const char* enemyCVarList[]; extern const char* enemyCVarList[];
extern const char* enemyNameList[]; extern const char* enemyNameList[];