mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-13 18:17:19 -07:00
Fix crash when no valid enemies are selected (#5519)
* fix crash when no valid enemies are selected * Clanged
This commit is contained in:
parent
2511275b8b
commit
a9fc317a5a
2 changed files with 17 additions and 15 deletions
|
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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[];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue