mirror of
https://github.com/HarbourMasters/Shipwright
synced 2026-04-23 08:14:31 +00:00
Fix seeded warp traps to be deterministic (#6469)
This commit is contained in:
parent
695c05d339
commit
40425c8c28
|
|
@ -32,6 +32,7 @@ typedef enum {
|
||||||
static AltTrapType roll = ADD_TRAP_MAX;
|
static AltTrapType roll = ADD_TRAP_MAX;
|
||||||
static int statusTimer = -1;
|
static int statusTimer = -1;
|
||||||
static int eventTimer = -1;
|
static int eventTimer = -1;
|
||||||
|
static EntranceIndex teleportRoll = ENTR_MAX;
|
||||||
|
|
||||||
const char* altTrapTypeCvars[] = {
|
const char* altTrapTypeCvars[] = {
|
||||||
CVAR_ENHANCEMENT("ExtraTraps.Ice"), CVAR_ENHANCEMENT("ExtraTraps.Burn"),
|
CVAR_ENHANCEMENT("ExtraTraps.Ice"), CVAR_ENHANCEMENT("ExtraTraps.Burn"),
|
||||||
|
|
@ -41,6 +42,12 @@ const char* altTrapTypeCvars[] = {
|
||||||
CVAR_ENHANCEMENT("ExtraTraps.Kill"), CVAR_ENHANCEMENT("ExtraTraps.Teleport"),
|
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> getEnabledAddTraps() {
|
||||||
std::vector<AltTrapType> enabledAddTraps;
|
std::vector<AltTrapType> enabledAddTraps;
|
||||||
for (int i = 0; i < ADD_TRAP_MAX; i++) {
|
for (int i = 0; i < ADD_TRAP_MAX; i++) {
|
||||||
|
|
@ -102,6 +109,7 @@ static void RollRandomTrap(uint64_t seed) {
|
||||||
break;
|
break;
|
||||||
case ADD_TELEPORT_TRAP:
|
case ADD_TELEPORT_TRAP:
|
||||||
eventTimer = 3;
|
eventTimer = 3;
|
||||||
|
teleportRoll = ShipUtils::RandomElement(teleportDestinations, &state);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
@ -135,32 +143,7 @@ static void OnPlayerUpdate() {
|
||||||
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
|
||||||
break;
|
break;
|
||||||
case ADD_TELEPORT_TRAP: {
|
case ADD_TELEPORT_TRAP: {
|
||||||
int entrance;
|
GameInteractor::RawAction::TeleportPlayer(teleportRoll);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -52,16 +52,6 @@ typedef enum {
|
||||||
/* 0x08 */ GI_COLOR_BLACK,
|
/* 0x08 */ GI_COLOR_BLACK,
|
||||||
} GIColors;
|
} 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
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,7 @@
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <spdlog/fmt/fmt.h>
|
#include <spdlog/fmt/fmt.h>
|
||||||
#include <regex>
|
#include "soh/ShipInit.hpp"
|
||||||
#include "soh/OTRGlobals.h"
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <z64.h>
|
#include <z64.h>
|
||||||
|
|
@ -625,37 +624,37 @@ CrowdControl::Effect* CrowdControl::ParseMessage(nlohmann::json dataReceived) {
|
||||||
case kEffectTpLinksHouse:
|
case kEffectTpLinksHouse:
|
||||||
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
||||||
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
||||||
GI_TP_DEST_LINKSHOUSE;
|
ENTR_LINKS_HOUSE_CHILD_SPAWN;
|
||||||
break;
|
break;
|
||||||
case kEffectTpMinuet:
|
case kEffectTpMinuet:
|
||||||
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
||||||
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
||||||
GI_TP_DEST_MINUET;
|
ENTR_SACRED_FOREST_MEADOW_WARP_PAD;
|
||||||
break;
|
break;
|
||||||
case kEffectTpBolero:
|
case kEffectTpBolero:
|
||||||
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
||||||
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
||||||
GI_TP_DEST_BOLERO;
|
ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD;
|
||||||
break;
|
break;
|
||||||
case kEffectTpSerenade:
|
case kEffectTpSerenade:
|
||||||
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
||||||
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
||||||
GI_TP_DEST_SERENADE;
|
ENTR_LAKE_HYLIA_WARP_PAD;
|
||||||
break;
|
break;
|
||||||
case kEffectTpRequiem:
|
case kEffectTpRequiem:
|
||||||
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
||||||
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
||||||
GI_TP_DEST_REQUIEM;
|
ENTR_DESERT_COLOSSUS_WARP_PAD;
|
||||||
break;
|
break;
|
||||||
case kEffectTpNocturne:
|
case kEffectTpNocturne:
|
||||||
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
||||||
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
||||||
GI_TP_DEST_NOCTURNE;
|
ENTR_GRAVEYARD_WARP_PAD;
|
||||||
break;
|
break;
|
||||||
case kEffectTpPrelude:
|
case kEffectTpPrelude:
|
||||||
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
effect->giEffect = std::make_unique<GameInteractionEffect::TeleportPlayer>();
|
||||||
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
dynamic_cast<ParameterizedGameInteractionEffect*>(effect->giEffect.get())->parameters[0] =
|
||||||
GI_TP_DEST_PRELUDE;
|
ENTR_TEMPLE_OF_TIME_WARP_PAD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue