summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Dubé <159546+serprex@users.noreply.github.com>2026-04-07 16:31:41 +0000
committerGitHub <noreply@github.com>2026-04-07 16:31:41 +0000
commit40425c8c28b921b478e459365a08709aed6c80c0 (patch)
tree70de127f9575e6f2e57169a41d338a4a1f843e7a
parent695c05d339d555aa2c933bc0a481f2baa03481b4 (diff)
Fix seeded warp traps to be deterministic (#6469)
-rw-r--r--soh/soh/Enhancements/ExtraTraps.cpp35
-rw-r--r--soh/soh/Enhancements/game-interactor/GameInteractor.h10
-rw-r--r--soh/soh/Network/CrowdControl/CrowdControl.cpp17
3 files changed, 17 insertions, 45 deletions
diff --git a/soh/soh/Enhancements/ExtraTraps.cpp b/soh/soh/Enhancements/ExtraTraps.cpp
index 0be9f2bd3..b506582df 100644
--- a/soh/soh/Enhancements/ExtraTraps.cpp
+++ b/soh/soh/Enhancements/ExtraTraps.cpp
@@ -32,6 +32,7 @@ typedef enum {
static AltTrapType roll = ADD_TRAP_MAX;
static int statusTimer = -1;
static int eventTimer = -1;
+static EntranceIndex teleportRoll = ENTR_MAX;
const char* altTrapTypeCvars[] = {
CVAR_ENHANCEMENT("ExtraTraps.Ice"), CVAR_ENHANCEMENT("ExtraTraps.Burn"),
@@ -41,6 +42,12 @@ const char* altTrapTypeCvars[] = {
CVAR_ENHANCEMENT("ExtraTraps.Kill"), CVAR_ENHANCEMENT("ExtraTraps.Teleport"),
};
+const std::array<EntranceIndex, 7> teleportDestinations = {
+ ENTR_LINKS_HOUSE_CHILD_SPAWN, ENTR_SACRED_FOREST_MEADOW_WARP_PAD, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD,
+ ENTR_LAKE_HYLIA_WARP_PAD, ENTR_DESERT_COLOSSUS_WARP_PAD, ENTR_GRAVEYARD_WARP_PAD,
+ ENTR_TEMPLE_OF_TIME_WARP_PAD,
+};
+
std::vector<AltTrapType> getEnabledAddTraps() {
std::vector<AltTrapType> enabledAddTraps;
for (int i = 0; i < ADD_TRAP_MAX; i++) {
@@ -102,6 +109,7 @@ static void RollRandomTrap(uint64_t seed) {
break;
case ADD_TELEPORT_TRAP:
eventTimer = 3;
+ teleportRoll = ShipUtils::RandomElement(teleportDestinations, &state);
break;
default:
break;
@@ -135,32 +143,7 @@ static void OnPlayerUpdate() {
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
break;
case ADD_TELEPORT_TRAP: {
- int entrance;
- int index = Random(0, 7);
- switch (index) {
- case 0:
- entrance = GI_TP_DEST_SERENADE;
- break;
- case 1:
- entrance = GI_TP_DEST_REQUIEM;
- break;
- case 2:
- entrance = GI_TP_DEST_BOLERO;
- break;
- case 3:
- entrance = GI_TP_DEST_MINUET;
- break;
- case 4:
- entrance = GI_TP_DEST_NOCTURNE;
- break;
- case 5:
- entrance = GI_TP_DEST_PRELUDE;
- break;
- default:
- entrance = GI_TP_DEST_LINKSHOUSE;
- break;
- }
- GameInteractor::RawAction::TeleportPlayer(entrance);
+ GameInteractor::RawAction::TeleportPlayer(teleportRoll);
break;
}
default:
diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h
index 20267760b..8d2055fbe 100644
--- a/soh/soh/Enhancements/game-interactor/GameInteractor.h
+++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h
@@ -52,16 +52,6 @@ typedef enum {
/* 0x08 */ GI_COLOR_BLACK,
} GIColors;
-typedef enum {
- /* */ GI_TP_DEST_LINKSHOUSE = ENTR_LINKS_HOUSE_CHILD_SPAWN,
- /* */ GI_TP_DEST_MINUET = ENTR_SACRED_FOREST_MEADOW_WARP_PAD,
- /* */ GI_TP_DEST_BOLERO = ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD,
- /* */ GI_TP_DEST_SERENADE = ENTR_LAKE_HYLIA_WARP_PAD,
- /* */ GI_TP_DEST_REQUIEM = ENTR_DESERT_COLOSSUS_WARP_PAD,
- /* */ GI_TP_DEST_NOCTURNE = ENTR_GRAVEYARD_WARP_PAD,
- /* */ GI_TP_DEST_PRELUDE = ENTR_TEMPLE_OF_TIME_WARP_PAD,
-} GITeleportDestinations;
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/soh/soh/Network/CrowdControl/CrowdControl.cpp b/soh/soh/Network/CrowdControl/CrowdControl.cpp
index a308685a1..19ac74f27 100644
--- a/soh/soh/Network/CrowdControl/CrowdControl.cpp
+++ b/soh/soh/Network/CrowdControl/CrowdControl.cpp
@@ -5,8 +5,7 @@
#include <nlohmann/json.hpp>
#include <spdlog/spdlog.h>
#include <spdlog/fmt/fmt.h>
-#include <regex>
-#include "soh/OTRGlobals.h"
+#include "soh/ShipInit.hpp"
extern "C" {
#include <z64.h>
@@ -625,37 +624,37 @@ CrowdControl::Effect* CrowdControl::ParseMessage(nlohmann::json dataReceived) {
case kEffectTpLinksHouse:
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
- GI_TP_DEST_LINKSHOUSE;
+ ENTR_LINKS_HOUSE_CHILD_SPAWN;
break;
case kEffectTpMinuet:
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
- GI_TP_DEST_MINUET;
+ ENTR_SACRED_FOREST_MEADOW_WARP_PAD;
break;
case kEffectTpBolero:
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
- GI_TP_DEST_BOLERO;
+ ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD;
break;
case kEffectTpSerenade:
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
- GI_TP_DEST_SERENADE;
+ ENTR_LAKE_HYLIA_WARP_PAD;
break;
case kEffectTpRequiem:
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
- GI_TP_DEST_REQUIEM;
+ ENTR_DESERT_COLOSSUS_WARP_PAD;
break;
case kEffectTpNocturne:
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
- GI_TP_DEST_NOCTURNE;
+ ENTR_GRAVEYARD_WARP_PAD;
break;
case kEffectTpPrelude:
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
- GI_TP_DEST_PRELUDE;
+ ENTR_TEMPLE_OF_TIME_WARP_PAD;
break;
default: