summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPepper0ni <93387759+Pepper0ni@users.noreply.github.com>2025-05-22 23:23:14 +0100
committerGitHub <noreply@github.com>2025-05-22 15:23:14 -0700
commita9fc317a5a916389449d68d666ff2e2965a0b023 (patch)
treea11bdd11e8361ef8066961daed11576f4b7ba9e5
parent2511275b8ba11f5e2149c312f42e402e23891ae8 (diff)
Fix crash when no valid enemies are selected (#5519)
* fix crash when no valid enemies are selected * Clanged
-rw-r--r--soh/soh/Enhancements/enemyrandomizer.cpp29
-rw-r--r--soh/soh/Enhancements/enemyrandomizer.h3
2 files changed, 17 insertions, 15 deletions
diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp
index 84e1d040e..bdb259719 100644
--- a/soh/soh/Enhancements/enemyrandomizer.cpp
+++ b/soh/soh/Enhancements/enemyrandomizer.cpp
@@ -270,15 +270,7 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* po
// Get randomized enemy ID and parameter.
uint32_t seed =
play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params;
- EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed);
-
- 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++;
- }
+ EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed, play);
*actorId = randomEnemy.id;
*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) {
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) {
uint32_t finalSeed =
seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt);
Random_Init(finalSeed);
- uint32_t randomNumber = Random(0, selectedEnemyList.size());
- return selectedEnemyList[randomNumber];
+ uint32_t randomNumber = Random(0, filteredEnemyList.size());
+ return filteredEnemyList[randomNumber];
} else {
- uint32_t randomSelectedEnemy = Random(0, selectedEnemyList.size());
- return selectedEnemyList[randomSelectedEnemy];
+ uint32_t randomSelectedEnemy = Random(0, filteredEnemyList.size());
+ return filteredEnemyList[randomSelectedEnemy];
}
}
diff --git a/soh/soh/Enhancements/enemyrandomizer.h b/soh/soh/Enhancements/enemyrandomizer.h
index 4c4fd5576..6f80503df 100644
--- a/soh/soh/Enhancements/enemyrandomizer.h
+++ b/soh/soh/Enhancements/enemyrandomizer.h
@@ -1,6 +1,7 @@
#pragma once
#include <libultraship/bridge.h>
+#include "item-tables/ItemTableTypes.h"
typedef struct EnemyEntry {
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 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* enemyNameList[];