This commit is contained in:
Philip Dubé 2025-04-26 08:00:58 +02:00 committed by GitHub
commit 372d2ff374
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 163 additions and 9 deletions

View file

@ -79,8 +79,38 @@ typedef enum {
TEXT_SARIAS_SONG_CHANNELING_POWER = 0x016D, TEXT_SARIAS_SONG_CHANNELING_POWER = 0x016D,
TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI = 0x01B3, // 0x1yy for Navi msg range TEXT_LAKE_HYLIA_WATER_SWITCH_NAVI = 0x01B3, // 0x1yy for Navi msg range
TEXT_MASK_SHOP_SIGN = 0x0207, TEXT_MASK_SHOP_SIGN = 0x0207,
TEXT_WATERFALL = 0x022D,
TEXT_FROGS_UNDERWATER = 0x022E, TEXT_FROGS_UNDERWATER = 0x022E,
TEXT_OUTSIDE_FISHING_POND = 0x023A,
TEXT_HF_SIGN = 0x0301,
TEXT_HC_GF = 0x0304,
TEXT_KAK_SIGN = 0x0305,
TEXT_KAK_GY = 0x0306,
TEXT_KAK_WELL = 0x0307,
TEXT_KAK_DMT = 0x0308,
TEXT_DMT_DC = 0x030A,
TEXT_GC_SIGN = 0x030B,
TEXT_HF_ZR = 0x030C,
TEXT_ZD_SIGN = 0x030E,
TEXT_ZF_JABU_SIGN = 0x030F,
TEXT_KF_LW = 0x0314,
TEXT_HF_LON_LON = 0x0315,
TEXT_LA_SIGN = 0x0317,
TEXT_LA_LAB = 0x0318,
TEXT_GV_SIGN = 0x0319,
TEXT_GF_HBA_SIGN = 0x031A, TEXT_GF_HBA_SIGN = 0x031A,
TEXT_KF_SHOP_SIGN = 0x031E,
TEXT_LINKS_HOUSE_SIGN = 0x031F,
TEXT_KOKIRI_EXIT_SIGN = 0x0320,
TEXT_DMT_DMC = 0x0323,
TEXT_ZD_SHOP_SIGN = 0x0333,
TEXT_OUTSIDE_KOKIRI_SIGN = 0x0339,
TEXT_OUTSIDE_MARKET_SIGN = 0x033A,
TEXT_MIDO_HOUSE_SIGN = 0x033C,
TEXT_KNOW_IT_ALL_HOUSE = 0x033D,
TEXT_TWINS_HOUSE_SIGN = 0x033E,
TEXT_SARIAS_HOUSE_SIGN = 0x033F,
TEXT_NO_DIVING_SIGN = 0x0342,
TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN = 0x0346, // 0x3yy for cuttable sign range TEXT_LAKE_HYLIA_WATER_SWITCH_SIGN = 0x0346, // 0x3yy for cuttable sign range
TEXT_WARP_MINUET_OF_FOREST = 0x088D, TEXT_WARP_MINUET_OF_FOREST = 0x088D,
TEXT_WARP_BOLERO_OF_FIRE = 0x088E, TEXT_WARP_BOLERO_OF_FIRE = 0x088E,

View file

@ -26,6 +26,8 @@
#include "Enhancements/audio/AudioCollection.h" #include "Enhancements/audio/AudioCollection.h"
#include "Enhancements/enhancementTypes.h" #include "Enhancements/enhancementTypes.h"
#include "Enhancements/debugconsole.h" #include "Enhancements/debugconsole.h"
#include "Enhancements/randomizer/entrance.h"
#include "Enhancements/randomizer/location_access.h"
#include "Enhancements/randomizer/randomizer.h" #include "Enhancements/randomizer/randomizer.h"
#include "Enhancements/randomizer/randomizer_entrance_tracker.h" #include "Enhancements/randomizer/randomizer_entrance_tracker.h"
#include "Enhancements/randomizer/randomizer_item_tracker.h" #include "Enhancements/randomizer/randomizer_item_tracker.h"
@ -1746,7 +1748,7 @@ int CopyStringToCharBuffer(const std::string& inputStr, char* buffer, const int
// Prevent potential horrible overflow due to implicit conversion of maxBufferSize to an unsigned. Prevents // Prevent potential horrible overflow due to implicit conversion of maxBufferSize to an unsigned. Prevents
// negatives. // negatives.
memset(buffer, 0, std::max<int>(0, maxBufferSize)); memset(buffer, 0, std::max<int>(0, maxBufferSize));
// Gaurentee that this value will be greater than 0, regardless of passed variables. // Guarantee that this value will be greater than 0, regardless of passed variables.
const int copiedCharLen = std::min<int>(std::max<int>(0, maxBufferSize - 1), inputStr.length()); const int copiedCharLen = std::min<int>(std::max<int>(0, maxBufferSize - 1), inputStr.length());
memcpy(buffer, inputStr.c_str(), copiedCharLen); memcpy(buffer, inputStr.c_str(), copiedCharLen);
return copiedCharLen; return copiedCharLen;
@ -2174,6 +2176,129 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
s16 actorParams = 0; s16 actorParams = 0;
if (IS_RANDO) { if (IS_RANDO) {
auto ctx = Rando::Context::GetInstance(); auto ctx = Rando::Context::GetInstance();
if (ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) {
s16 entrance = -1;
switch (textId) {
case TEXT_WATERFALL:
entrance = ENTR_ZORAS_DOMAIN_ENTRANCE;
break;
case TEXT_OUTSIDE_FISHING_POND:
entrance = ENTR_FISHING_POND_0;
break;
case TEXT_HF_SIGN:
if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE) {
entrance = ENTR_HYRULE_FIELD_STAIRS_EXIT;
} else if (gPlayState->sceneNum == SCENE_GERUDO_VALLEY) {
entrance = ENTR_HYRULE_FIELD_ROCKY_PATH;
} else if (gPlayState->sceneNum == SCENE_LAKE_HYLIA) {
entrance = ENTR_HYRULE_FIELD_FENCE_EXIT;
}
break;
case TEXT_HC_GF:
entrance = ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC;
break;
case TEXT_KAK_SIGN:
if (gPlayState->sceneNum == SCENE_HYRULE_FIELD) {
entrance = ENTR_KAKARIKO_VILLAGE_FRONT_GATE;
} else {
entrance = ENTR_KAKARIKO_VILLAGE_GUARD_GATE;
}
break;
case TEXT_KAK_GY:
entrance = ENTR_GRAVEYARD_ENTRANCE;
break;
case TEXT_KAK_WELL:
entrance = ENTR_BOTTOM_OF_THE_WELL_ENTRANCE;
break;
case TEXT_KAK_DMT:
entrance = ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT;
break;
case TEXT_DMT_DC:
entrance = ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT;
break;
case TEXT_GC_SIGN:
if (gPlayState->sceneNum == SCENE_DEATH_MOUNTAIN_TRAIL) {
entrance = ENTR_GORON_CITY_UPPER_EXIT;
} else {
entrance = ENTR_GORON_CITY_DARUNIA_ROOM_EXIT;
}
break;
case TEXT_HF_ZR:
entrance = ENTR_ZORAS_RIVER_WEST_EXIT;
break;
case TEXT_KF_SHOP_SIGN:
entrance = ENTR_KOKIRI_SHOP_0;
break;
case TEXT_LINKS_HOUSE_SIGN:
entrance = ENTR_LINKS_HOUSE_1;
break;
case TEXT_KOKIRI_EXIT_SIGN:
entrance = ENTR_LOST_WOODS_BRIDGE_WEST_EXIT;
break;
case TEXT_ZD_SIGN:
if (gPlayState->sceneNum == SCENE_ZORAS_DOMAIN) {
entrance = ENTR_ZORAS_RIVER_WATERFALL_EXIT;
} else {
entrance = ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT;
}
break;
case TEXT_ZF_JABU_SIGN:
entrance = ENTR_JABU_JABU_ENTRANCE;
break;
case TEXT_KF_LW:
entrance = ENTR_LOST_WOODS_SOUTH_EXIT;
break;
case TEXT_HF_LON_LON:
entrance = ENTR_LON_LON_RANCH_ENTRANCE;
break;
case TEXT_LA_SIGN:
entrance = ENTR_LAKE_HYLIA_NORTH_EXIT;
break;
case TEXT_LA_LAB:
entrance = ENTR_LAKESIDE_LABORATORY_0;
break;
case TEXT_GV_SIGN:
if (gPlayState->sceneNum == SCENE_HYRULE_FIELD) {
entrance = ENTR_GERUDO_VALLEY_EAST_EXIT;
} else {
entrance = ENTR_GERUDO_VALLEY_WEST_EXIT;
}
break;
case TEXT_ZD_SHOP_SIGN:
entrance = ENTR_ZORA_SHOP_0;
break;
case TEXT_OUTSIDE_KOKIRI_SIGN:
entrance = ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE;
break;
case TEXT_OUTSIDE_MARKET_SIGN:
entrance = ENTR_LON_LON_RANCH_ENTRANCE;
break;
case TEXT_MIDO_HOUSE_SIGN:
entrance = ENTR_MIDOS_HOUSE_0;
break;
case TEXT_KNOW_IT_ALL_HOUSE:
entrance = ENTR_KNOW_IT_ALL_BROS_HOUSE_0;
break;
case TEXT_TWINS_HOUSE_SIGN:
entrance = ENTR_TWINS_HOUSE_0;
break;
case TEXT_SARIAS_HOUSE_SIGN:
entrance = ENTR_SARIAS_HOUSE_0;
break;
case TEXT_NO_DIVING_SIGN:
entrance = ENTR_LAKE_HYLIA_RIVER_EXIT;
break;
}
if (entrance != -1) {
auto data = GetEntranceData(Entrance_GetOverride(entrance));
if (data != nullptr) {
font->charTexBuf[0] = (TEXTBOX_TYPE_WOODEN << 4) | TEXTBOX_POS_BOTTOM;
return msgCtx->msgLength = font->msgLength = SohUtils::CopyStringToCharBuffer(
buffer, data->destination + CustomMessage::MESSAGE_END(), maxBufferSize);
}
}
}
bool nonBeanMerchants = ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) || bool nonBeanMerchants = ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL_BUT_BEANS) ||
ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL); ctx->GetOption(RSK_SHUFFLE_MERCHANTS).Is(RO_SHUFFLE_MERCHANTS_ALL);
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
@ -2222,7 +2347,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
(Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == RO_GOSSIP_STONES_NEED_STONE && (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == RO_GOSSIP_STONES_NEED_STONE &&
CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) {
Actor* stone = GET_PLAYER(play)->talkActor; Actor* stone = player->talkActor;
RandomizerHint stoneHint = RH_NONE; RandomizerHint stoneHint = RH_NONE;
s16 hintParams = stone->params & 0xFF; s16 hintParams = stone->params & 0xFF;
@ -2249,7 +2374,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
} else { } else {
messageEntry = ctx->GetHint(stoneHint)->GetHintMessage(MF_AUTO_FORMAT); messageEntry = ctx->GetHint(stoneHint)->GetHintMessage(MF_AUTO_FORMAT);
} }
} else if ((textId == TEXT_ALTAR_CHILD || textId == TEXT_ALTAR_ADULT)) { } else if (textId == TEXT_ALTAR_CHILD || textId == TEXT_ALTAR_ADULT) {
// rando hints at altar // rando hints at altar
messageEntry = (LINK_IS_ADULT) ? ctx->GetHint(RH_ALTAR_ADULT)->GetHintMessage() messageEntry = (LINK_IS_ADULT) ? ctx->GetHint(RH_ALTAR_ADULT)->GetHintMessage()
: ctx->GetHint(RH_ALTAR_CHILD)->GetHintMessage(MF_AUTO_FORMAT); : ctx->GetHint(RH_ALTAR_CHILD)->GetHintMessage(MF_AUTO_FORMAT);
@ -2280,7 +2405,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
(RandomizerInf)((textId - TEXT_SHOP_ITEM_RANDOM_CONFIRM) + RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1)); (RandomizerInf)((textId - TEXT_SHOP_ITEM_RANDOM_CONFIRM) + RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1));
messageEntry = OTRGlobals::Instance->gRandomizer->GetMerchantMessage(rc, TEXT_SHOP_ITEM_RANDOM_CONFIRM); messageEntry = OTRGlobals::Instance->gRandomizer->GetMerchantMessage(rc, TEXT_SHOP_ITEM_RANDOM_CONFIRM);
} else if (textId == TEXT_SCRUB_RANDOM) { } else if (textId == TEXT_SCRUB_RANDOM) {
EnDns* enDns = (EnDns*)GET_PLAYER(play)->talkActor; EnDns* enDns = (EnDns*)player->talkActor;
RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf( RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf(
(RandomizerInf)enDns->sohScrubIdentity.randomizerInf); (RandomizerInf)enDns->sohScrubIdentity.randomizerInf);
messageEntry = OTRGlobals::Instance->gRandomizer->GetMerchantMessage( messageEntry = OTRGlobals::Instance->gRandomizer->GetMerchantMessage(
@ -2330,7 +2455,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId, messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId,
MF_AUTO_FORMAT); MF_AUTO_FORMAT);
} else if (textId == TEXT_SKULLTULA_PEOPLE_IM_CURSED) { } else if (textId == TEXT_SKULLTULA_PEOPLE_IM_CURSED) {
actorParams = GET_PLAYER(play)->talkActor->params; actorParams = player->talkActor->params;
if (actorParams == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)) { if (actorParams == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)) {
messageEntry = ctx->GetHint(RH_KAK_10_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); messageEntry = ctx->GetHint(RH_KAK_10_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT);
} else if (actorParams == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)) { } else if (actorParams == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)) {
@ -2480,14 +2605,14 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) {
switch (gSaveContext.language) { switch (gSaveContext.language) {
case LANGUAGE_FRA: case LANGUAGE_FRA:
return msgCtx->msgLength = font->msgLength = return msgCtx->msgLength = font->msgLength =
CopyStringToCharBuffer(messageEntry.GetFrench(MF_RAW), buffer, maxBufferSize); SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetFrench(MF_RAW), maxBufferSize);
case LANGUAGE_GER: case LANGUAGE_GER:
return msgCtx->msgLength = font->msgLength = return msgCtx->msgLength = font->msgLength =
CopyStringToCharBuffer(messageEntry.GetGerman(MF_RAW), buffer, maxBufferSize); SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetGerman(MF_RAW), maxBufferSize);
case LANGUAGE_ENG: case LANGUAGE_ENG:
default: default:
return msgCtx->msgLength = font->msgLength = return msgCtx->msgLength = font->msgLength =
CopyStringToCharBuffer(messageEntry.GetEnglish(MF_RAW), buffer, maxBufferSize); SohUtils::CopyStringToCharBuffer(buffer, messageEntry.GetEnglish(MF_RAW), maxBufferSize);
} }
return false; return false;
} }

View file

@ -2782,7 +2782,6 @@ void Message_OpenText(PlayState* play, u16 textId) {
gSaveContext.eventInf[0] = gSaveContext.eventInf[1] = gSaveContext.eventInf[2] = gSaveContext.eventInf[3] = 0; gSaveContext.eventInf[0] = gSaveContext.eventInf[1] = gSaveContext.eventInf[2] = gSaveContext.eventInf[3] = 0;
} }
// RANDOTODO: Use this for ice trap messages
if (CustomMessage_RetrieveIfExists(play)) { if (CustomMessage_RetrieveIfExists(play)) {
osSyncPrintf("Found custom message"); osSyncPrintf("Found custom message");
if (gSaveContext.language == LANGUAGE_JPN) { if (gSaveContext.language == LANGUAGE_JPN) {