diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index a89400844c1..cf29574d334 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -12,55 +12,23 @@ extern "C" { extern "C" uint32_t ResourceMgr_IsSceneMasterQuest(s16 sceneNum); static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { - { ACTOR_EN_FIREFLY, 2 }, // Regular Keese { ACTOR_EN_FIREFLY, 1 }, // Fire Keese { ACTOR_EN_FIREFLY, 4 }, // Ice Keese { ACTOR_EN_TEST, 2 }, // Stalfos - { ACTOR_EN_TITE, -1 }, // Tektite (red) - { ACTOR_EN_TITE, -2 }, // Tektite (blue) - { ACTOR_EN_WALLMAS, 1 }, // Wallmaster - { ACTOR_EN_DODONGO, -1 }, // Dodongo { ACTOR_EN_PEEHAT, -1 }, // Flying Peahat (big grounded, doesn't spawn larva) - { ACTOR_EN_PEEHAT, 1 }, // Flying Peahat Larva { ACTOR_EN_ZF, -1 }, // Lizalfos - { ACTOR_EN_ZF, -2 }, // Dinolfos - { ACTOR_EN_GOMA, 7 }, // Gohma larva (non-gohma rooms) - { ACTOR_EN_BUBBLE, 0 }, // Shabom (bubble) - { ACTOR_EN_DODOJR, 0 }, // Baby Dodongo - { ACTOR_EN_TORCH2, 0 }, // Dark Link - { ACTOR_EN_BILI, 0 }, // Biri (jellyfish) - { ACTOR_EN_TP, -1 }, // Electric Tailparasan - { ACTOR_EN_ST, 0 }, // Skulltula (normal) - { ACTOR_EN_ST, 1 }, // Skulltula (big) { ACTOR_EN_ST, 2 }, // Skulltula (invisible) { ACTOR_EN_BW, 0 }, // Torch Slug - { ACTOR_EN_EIYER, 10 }, // Stinger (land) (One in formation, sink under floor and do not activate) { ACTOR_EN_MB, 0 }, // Moblins (Club) - { ACTOR_EN_DEKUBABA, 0 }, // Deku Baba (small) - { ACTOR_EN_DEKUBABA, 1 }, // Deku Baba (large) - { ACTOR_EN_AM, -1 }, // Armos (enemy variant) - { ACTOR_EN_DEKUNUTS, 768 }, // Mad Scrub (triple attack) (projectiles don't work) - { ACTOR_EN_VALI, -1 }, // Bari (big jellyfish) - { ACTOR_EN_BB, -1 }, // Bubble (flying skull enemy) (blue) { ACTOR_EN_YUKABYUN, 0 }, // Flying Floor Tile - { ACTOR_EN_VM, 1280 }, // Beamos { ACTOR_EN_FLOORMAS, 0 }, // Floormaster - { ACTOR_EN_RD, 1 }, // Redead (standing) { ACTOR_EN_RD, 32766 }, // Gibdo (standing) - { ACTOR_EN_SB, 0 }, // Shell Blade - { ACTOR_EN_KAREBABA, 0 }, // Withered Deku Baba { ACTOR_EN_RR, 0 }, // Like-Like { ACTOR_EN_NY, 0 }, // Spike (rolling enemy) - { ACTOR_EN_IK, 2 }, // Iron Knuckle (black, standing) { ACTOR_EN_IK, 3 }, // Iron Knuckle (white, standing) { ACTOR_EN_TUBO_TRAP, 0 }, // Flying pot - { ACTOR_EN_FZ, 0 }, // Freezard { ACTOR_EN_CLEAR_TAG, 1 }, // Arwing - { ACTOR_EN_WF, 0 }, // Wolfos (normal) { ACTOR_EN_WF, 1 }, // Wolfos (white) - { ACTOR_EN_SKB, 1 }, // Stalchild (small) - { ACTOR_EN_SKB, 20 }, // Stalchild (big) - { ACTOR_EN_CROW, 0 } // Guay // Doesn't work {ACTOR_EN_POH, 0}, // Poe (Seems to rely on other objects?) // Doesn't work {ACTOR_EN_POH, 2}, // Poe (composer Sharp) (Seems to rely on other objects?) diff --git a/soh/soh/Enhancements/enemyrandomizer.h b/soh/soh/Enhancements/enemyrandomizer.h index cc68f941868..a9d09108acc 100644 --- a/soh/soh/Enhancements/enemyrandomizer.h +++ b/soh/soh/Enhancements/enemyrandomizer.h @@ -7,7 +7,7 @@ typedef struct EnemyEntry { int16_t params; } EnemyEntry; -#define RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE 49 +#define RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE 17 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); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index ae711c0932d..9f0d7881c98 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -83,6 +83,11 @@ uint8_t GameInteractor_GetRandomWindActive(); uint8_t GameInteractor_GetRandomBonksActive(); uint8_t GameInteractor_GetSlipperyFloorActive(); uint8_t GameInteractor_SecondCollisionUpdate(); +uint8_t GameInteractor_RotatingLink(); +uint8_t GameInteractor_SpazzingLink(); +void GameInteractor_SpawnCuccoStorm(); +void GameInteractor_SetRandomInvertedAxis(); +void GameInteractor_ToggleSlipperyFloor(); void GameInteractor_SetTriforceHuntPieceGiven(uint8_t state); void GameInteractor_SetTriforceHuntCreditsWarpActive(uint8_t state); #ifdef __cplusplus @@ -125,6 +130,8 @@ class GameInteractor { static uint8_t RandomBonksActive; static uint8_t SlipperyFloorActive; static uint8_t SecondCollisionUpdate; + static uint8_t RotatingLink; + static uint8_t SpazzingLink; static uint8_t TriforceHuntPieceGiven; static uint8_t TriforceHuntCreditsWarpActive; diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp index 21642ddedce..cee71cc105d 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp @@ -1,4 +1,5 @@ #include "GameInteractor.h" +#include "libultraship/libultraship.h" // MARK: - State Definitions @@ -20,6 +21,8 @@ uint8_t GameInteractor::State::RandomWindSecondsSinceLastDirectionChange = 0; uint8_t GameInteractor::State::RandomBonksActive = 0; uint8_t GameInteractor::State::SlipperyFloorActive = 0; uint8_t GameInteractor::State::SecondCollisionUpdate = 0; +uint8_t GameInteractor::State::RotatingLink = 0; +uint8_t GameInteractor::State::SpazzingLink = 0; uint8_t GameInteractor::State::TriforceHuntPieceGiven = 0; uint8_t GameInteractor::State::TriforceHuntCreditsWarpActive = 0; @@ -130,6 +133,33 @@ uint8_t GameInteractor_SecondCollisionUpdate() { return GameInteractor::State::SecondCollisionUpdate; } +// MARK: - GameInteractor::State::RotatingLink +uint8_t GameInteractor_RotatingLink() { + return GameInteractor::State::RotatingLink; +} + +// MARK: - GameInteractor::State::SpazzingLink +uint8_t GameInteractor_SpazzingLink() { + return GameInteractor::State::SpazzingLink; +} + +// MARK: - +void GameInteractor_SpawnCuccoStorm() { + GameInteractor::RawAction::SpawnActor(25, 0); +} + +// MARK: - +void GameInteractor_SetRandomInvertedAxis() { + uint32_t randomNumber1 = rand() % 2; + uint32_t randomNumber2 = rand() % 2; + CVarSetInteger("gInvertAimingXAxis", randomNumber1); + CVarSetInteger("gInvertAimingYAxis", randomNumber2); +} + +void GameInteractor_ToggleSlipperyFloor() { + GameInteractor::State::SlipperyFloorActive ^= 1; +} + // MARK: - GameInteractor::State::TriforceHuntPieceGiven void GameInteractor_SetTriforceHuntPieceGiven(uint8_t state) { GameInteractor::State::TriforceHuntPieceGiven = state; diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 6d66ff05599..0f009eb0873 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -9,6 +9,7 @@ #include "soh/Enhancements/cosmetics/authenticGfxPatches.h" #include #include "soh/Enhancements/nametag.h" +#include "soh/Enhancements/enemyrandomizer.h" #include "src/overlays/actors/ovl_En_Bb/z_en_bb.h" #include "src/overlays/actors/ovl_En_Dekubaba/z_en_dekubaba.h" @@ -497,7 +498,8 @@ void RegisterHyperBosses() { gSaveContext.bossRushOptions[BR_OPTIONS_HYPERBOSSES] == BR_CHOICE_HYPERBOSSES_YES); // Don't apply during cutscenes because it causes weird behaviour and/or crashes on some bosses. - if (hyperBossesActive && isBossActor && !Player_InBlockingCsMode(gPlayState, player)) { + if (gPlayState->sceneNum == SCENE_SPIRIT_TEMPLE_BOSS && isBossActor && + !Player_InBlockingCsMode(gPlayState, player)) { // Barinade needs to be updated in sequence to avoid unintended behaviour. if (actor->id == ACTOR_BOSS_VA) { // params -1 is BOSSVA_BODY @@ -1017,29 +1019,236 @@ void RegisterAltTrapTypes() { }); } -void RegisterRandomizerSheikSpawn() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!gPlayState) return; - bool canSheik = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIAL_COUNT) != RO_GANONS_TRIALS_SKIP && - OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LIGHT_ARROWS_HINT)); - if (!IS_RANDO || !LINK_IS_ADULT || !canSheik) return; - switch (gPlayState->sceneNum) { - case SCENE_TEMPLE_OF_TIME: - if (gPlayState->roomCtx.curRoom.num == 1) { - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, -104, -40, 2382, 0, 0x8000, 0, SHEIK_TYPE_RANDO, false); - } +// bools for queueing timed effects +bool secondUpdate = false; +bool timedCuccoStorm = false; +bool timedRequiemTP = false; +bool timedKnockback = false; +bool timedLinksHouseTP = false; +bool timedEmptyBombs = false; +bool timedRandomWindActive = false; +bool timedRandomWindDisable = false; +bool timedSetRupeeCount = false; +bool timedEmptyHealth = false; +bool timedRandomButtons = false; + +void RegisterChaosRaceStuff() { + + GameInteractor::Instance->RegisterGameHook([]() { + + // Cycle effects every 2 hours + uint32_t currentTimer = GAMEPLAYSTAT_TOTAL_TIME % 72000; + + // Effects on a timer + switch (currentTimer) { + // 120 seconds (2 minutes) | Requiem TP + case 1200: + timedRequiemTP = true; + secondUpdate = false; break; - case SCENE_INSIDE_GANONS_CASTLE: - if (gPlayState->roomCtx.curRoom.num == 1){ - Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, 101, 150, 137, 0, 0, 0, SHEIK_TYPE_RANDO, false); - } + // 600 seconds (10 minutes) | Cucco Storm + case 6000: + timedCuccoStorm = true; + secondUpdate = false; break; - default: break; + // 1200 seconds (20 minutes) | Start Rotating Link + case 12000: + GameInteractor::State::RotatingLink = 1; + break; + // 1320 seconds (22 minutes) | Stop Rotating Link + case 13200: + GameInteractor::State::RotatingLink = 0; + break; + // 1680 seconds (28 minutes) | Knockback + case 16800: + // 1740 seconds (29 minutes) | Knockback + case 17400: + // 1800 seconds (30 minutes) | Knockback + case 18000: + timedKnockback = true; + secondUpdate = false; + break; + // 2640 seconds (44 minutes) | Start Super Random Wind + case 26400: + timedRandomWindActive = true; + secondUpdate = false; + break; + // 2760 seconds (46 minutes) | Stop Super Random Wind + case 27600: + timedRandomWindDisable = true; + secondUpdate = false; + break; + // 3540 seconds (59 minutes) | Teleport to Link's House + case 35400: + timedLinksHouseTP = true; + secondUpdate = false; + break; + // 4140 seconds (69 minutes. 1 hour 9 minutes) | Set rupees to 69 + case 41400: + timedSetRupeeCount = true; + secondUpdate = false; + break; + // 4560 seconds (76 minutes. 1 hour 16 minutes) | Empty Bombs + case 45600: + timedEmptyBombs = true; + secondUpdate = false; + break; + // 5520 seconds (92 minutes. 1 hour 32 minutes) | Start Spazzing Link + case 55200: + GameInteractor::State::SpazzingLink = 1; + break; + // 5580 seconds (93 minutes. 1 hour 33 minutes) | Stop Spazzing Link + case 55800: + GameInteractor::State::SpazzingLink = 0; + break; + // 6300 seconds (105 minutes. 1 hour 45 minutes) | Set Health to 1/4 heart + case 63000: + timedEmptyHealth = true; + secondUpdate = false; + break; + // 6600 seconds (110 minutes. 1 hour 50 minutes) | Start Random Buttons + case 66000: + timedRandomButtons = true; + break; + // 6780 seconds (113 minutes. 1 hour 53 minutes) | Stop Random Buttons + case 67800: + timedRandomButtons = false; + break; + // Use secondUpdate bool to make sure an effect doesn't execute twice, as GAMEPLAYSTAT_TOTAL_TIME + // is being divided by 2 so is the same for 2 frames. + default: + secondUpdate = true; + break; + } + + // Apply timed effects + if (GameInteractor::IsSaveLoaded() && !GameInteractor::IsGameplayPaused() && secondUpdate) { + if (timedRequiemTP) { + GameInteractor::RawAction::TeleportPlayer(GI_TP_DEST_REQUIEM); + timedRequiemTP = false; + } + + if (timedLinksHouseTP) { + GameInteractor::RawAction::TeleportPlayer(GI_TP_DEST_LINKSHOUSE); + timedLinksHouseTP = false; + } + + if (timedCuccoStorm) { + for (uint8_t i = 0; i < 5; i++) { + GameInteractor::RawAction::SpawnActor(ACTOR_EN_NIW, 0); + } + timedCuccoStorm = false; + } + + if (timedEmptyBombs) { + Inventory_ChangeAmmo(ITEM_BOMBCHU, -50); + Inventory_ChangeAmmo(ITEM_BOMB, -50); + timedEmptyBombs = false; + } + + if (timedKnockback) { + GameInteractor::RawAction::KnockbackPlayer(6.0f); + timedKnockback = false; + } + + if (timedRandomWindActive) { + GameInteractor::RawAction::SetRandomWind(true); + } + + if (timedRandomWindDisable) { + GameInteractor::RawAction::SetRandomWind(false); + timedRandomWindActive = false; + timedRandomWindDisable = false; + } + + if (timedSetRupeeCount) { + gSaveContext.rupees = 69; + timedSetRupeeCount = false; + } + + if (timedEmptyHealth) { + gSaveContext.health = 4; + timedEmptyHealth = false; + } + } + + if (timedRandomButtons) { + GameInteractor::RawAction::EmulateRandomButtonPress(3); + } + + if (GameInteractor::IsSaveLoaded() && !GameInteractor::IsGameplayPaused()) { + + Player* player = GET_PLAYER(gPlayState); + + // Unequip ocarina on dpad down + if (gSaveContext.equips.buttonItems[5] == ITEM_OCARINA_FAIRY || + gSaveContext.equips.buttonItems[5] == ITEM_OCARINA_TIME) { + gSaveContext.equips.buttonItems[5] = ITEM_NONE; + } + // Unequip bunny hood on dpad up + if (gSaveContext.equips.buttonItems[4] == ITEM_MASK_BUNNY) { + gSaveContext.equips.buttonItems[4] = ITEM_NONE; + } + + // Reverse controls with bunny hood + if (player->currentMask == PLAYER_MASK_BUNNY) { + GameInteractor::State::ReverseControlsActive = 1; + } else { + GameInteractor::State::ReverseControlsActive = 0; + } + + // Effects on a random chance + + // Random swap Mirror Mode, average once every 10 minutes. + uint32_t randomMirror = rand() % 12000; + if (randomMirror == 0) { + uint8_t currentMirror = CVarGetInteger("gMirroredWorldMode", 0); + if (currentMirror == 0) { + CVarSetInteger("gMirroredWorldMode", 1); + } else { + CVarSetInteger("gMirroredWorldMode", 0); + } + UpdateMirrorModeState(gPlayState->sceneNum); + } + + // Random dpad hud location, average once every 10 minutes. + uint32_t randomDpadPos = rand() % 12000; + if (randomDpadPos == 0) { + CVarSetInteger("gDPadPosType", 2); + uint32_t randomXPos = rand() % 200; + uint32_t randomYPos = rand() % 200; + CVarSetInteger("gDPadPosX", 290 - randomXPos); + CVarSetInteger("gDPadPosY", 0 + randomYPos); + } + + // Random Enemy spawn, average once every 30 seconds + uint32_t randomEnemy = rand() % 600; + uint32_t seed = rand() % 20000; + EnemyEntry enemyToSpawn = GetRandomizedEnemyEntry(seed); + if (randomEnemy == 0) { + GameInteractor::RawAction::SpawnEnemyWithOffset(enemyToSpawn.id, enemyToSpawn.params); + } + + // Random unequip shield, average once every 2 minutes + uint32_t randomShield = rand() % 2400; + if (randomShield == 0) { + player->currentShield = PLAYER_SHIELD_NONE; + } + + // Random unequip c-buttons, average once every 10 minutes + uint32_t randomUnequipCButtons = rand() % 12000; + if (randomUnequipCButtons == 0) { + GameInteractor::RawAction::ClearAssignedButtons(GI_BUTTONS_CBUTTONS); + } + + // Random unequip d-pad, average once every 10 minutes + uint32_t randomUnequipDPad = rand() % 12000; + if (randomUnequipDPad == 0) { + GameInteractor::RawAction::ClearAssignedButtons(GI_BUTTONS_DPAD); + } } }); -} -void RegisterRandomizedEnemySizes() { GameInteractor::Instance->RegisterGameHook([](void* refActor) { // Randomized Enemy Sizes Player* player = GET_PLAYER(gPlayState); @@ -1064,11 +1273,48 @@ void RegisterRandomizedEnemySizes() { // Small actor } else { randomNumber = rand() % 90; - // Between 10% and 100% size. randomScale = 0.1f + (randomNumber / 100); } - Actor_SetScale(actor, actor->scale.z * randomScale); + if ((actor->category == ACTORCAT_ENEMY || actor->category == ACTORCAT_BOSS) && actor->id != ACTOR_EN_BROB) { + Actor_SetScale(actor, actor->scale.z * randomScale); + } + }); + + GameInteractor::Instance->RegisterGameHook([](int32_t sceneNum) { + uint32_t randomNumber = rand() % 100; + if (randomNumber == 0) { + gPlayState->linkAgeOnLoad ^= 1; + } + GameInteractor::State::RandomBombFuseTimerActive = 1; + }); + + GameInteractor::Instance->RegisterGameHook([]() { + Player* player = GET_PLAYER(gPlayState); + player->currentTunic = PLAYER_TUNIC_KOKIRI; + Inventory_ChangeEquipment(EQUIP_TYPE_TUNIC, PLAYER_TUNIC_KOKIRI + 1); + }); +} + +void RegisterRandomizerSheikSpawn() { + GameInteractor::Instance->RegisterGameHook([]() { + if (!gPlayState) return; + bool canSheik = (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_TRIAL_COUNT) != RO_GANONS_TRIALS_SKIP && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_LIGHT_ARROWS_HINT)); + if (!IS_RANDO || !LINK_IS_ADULT || !canSheik) return; + switch (gPlayState->sceneNum) { + case SCENE_TEMPLE_OF_TIME: + if (gPlayState->roomCtx.curRoom.num == 1) { + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, -104, -40, 2382, 0, 0x8000, 0, SHEIK_TYPE_RANDO, false); + } + break; + case SCENE_INSIDE_GANONS_CASTLE: + if (gPlayState->roomCtx.curRoom.num == 1){ + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_XC, 101, 150, 137, 0, 0, 0, SHEIK_TYPE_RANDO, false); + } + break; + default: break; + } }); } @@ -1099,6 +1345,6 @@ void InitMods() { RegisterEnemyDefeatCounts(); RegisterAltTrapTypes(); RegisterRandomizerSheikSpawn(); - RegisterRandomizedEnemySizes(); NameTag_RegisterHooks(); + RegisterChaosRaceStuff(); } diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index a50de65022a..14c2dc3d1f9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -1553,922 +1553,284 @@ void HintTable_Init() { | JUNK HINT TEXT | ---------------------------*/ + hintTable[JUNK01] = HintText::Junk({ + // obscure text + Text{ "They say rolling makes you stronger.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, + }); + hintTable[JUNK02] = HintText::Junk({ // obscure text - Text{ "They say you must read the names of \"Special Deal\" shop items carefully.", - /*french*/ "Selon moi, les \"Offres spéciales\" sont parfois trompeuses... Lisez les attentivement!", - /*spanish*/ "Según dicen, se debería prestar atención a los nombres de las ofertas especiales." }, + Text{ "I bet you'd like to have more bombs right now.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK03] = HintText::Junk({ // obscure text - Text{ "They say that Zelda is a poor leader.", /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.", - /*spanish*/ "Según dicen, Zelda es mala líder." }, + Text{ "Well excuuuuuse me, @.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK04] = HintText::Junk({ // obscure text - Text{ "These hints can be quite useful. This is an exception.", - /*french*/ "Ces indices sont très utiles, à l'exception de celui-ci.", - /*spanish*/ "Las pistas suelen servir de ayuda. En cambio, esta no." }, + Text{ "Hi @, I'm dad!", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK05] = HintText::Junk({ // obscure text - Text{ "They say that the Lizalfos in Dodongo's Cavern like to play in lava.", - /*french*/ "Selon moi, les Lézalfos de la Caverne Dodongo aiment patauger dans la lave.", - /*spanish*/ "Según dicen, a los Lizalfos de la Cueva de los Dodongos les gusta jugar en la lava." }, + Text{ "They say in Hyrule, nobody raves harder than the dead.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK06] = HintText::Junk({ // obscure text - Text{ "They say that all the Zora drowned in Wind Waker.", - /*french*/ "Selon moi, les Zoras se sont noyés dans Wind Waker.", - /*spanish*/ "Según dicen, en Wind Waker todos los zora se ahogaron." }, + Text{ "They say that the longer the neck, the stupider the goron.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK07] = HintText::Junk({ // obscure text - Text{ "If Gorons eat rocks, does that mean I'm in danger?", - /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!", - /*spanish*/ "Si los Goron se tragan las piedras, ¿no me hace ser una especia vulnarable o algo así" }, + Text{ "They say there's a rare kind of Goron that doesn't have a long neck.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK08] = HintText::Junk({ // obscure text - Text{ - "'Member when Ganon was a blue pig?^I 'member.", - /*french*/ "Dans mon temps, Ganon était un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!", - /*spanish*/ "¿T'acuerdas cuando Ganon era un cerdo azul?^Qué tiempos, chico." }, + Text{ "They say the holder of Greg should ask him if it's OK first.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK09] = HintText::Junk({ // obscure text - Text{ "One who does not have Triforce can't go in.", /*french*/ "Ceux sans Triforce doivent rebrousser chemin.", - /*spanish*/ "Aquel que no porte la Trifuerza no podrá pasar." }, + Text{ "BeN dRoWnEd", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK10] = HintText::Junk({ // obscure text - Text{ "Save your future, end the Happy Mask Salesman.", - /*french*/ "Selon moi, tu t'éviteras des jours de malheur si tu vaincs le vendeur de masques...", - /*spanish*/ "Salva tu futuro, acaba con el dueño de La Máscara Feliz." }, + Text{ "Quit cheating!", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK11] = HintText::Junk({ // obscure text - Text{ "Glitches are a pathway to many abilities some consider to be... Unnatural.", /*french*/ - "Les glitchs sont un moyen d'acquérir de nombreuses facultés considérées par certains comme... contraire " - "à la nature.", - /*spanish*/ "Los glitches son el camino a muchas habilidades que varios consideran... nada natural." }, + Text{ "I bet you regret joining this race now.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK12] = HintText::Junk({ // obscure text - Text{ "I'm stoned. Get it?", /*french*/ "Allez, roche, papier, ciseau...&Roche.", - /*spanish*/ "Me he quedado de piedra. ¿Lo pillas?" }, + Text{ "Loading...", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK13] = HintText::Junk({ // obscure text - Text{ "Hoot! Hoot! Would you like me to repeat that?", /*french*/ "Hou hou! Veux-tu que je répète tout ça?", - /*spanish*/ "¡Buuu, buuu! ¿Te lo vuelvo a repetir?" }, + Text{ "soh.exe has encountered a fatal exception and needs to close, please submit a crash report.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK14] = HintText::Junk({ // obscure text - Text{ "Gorons are stupid. They eat rocks.", /*french*/ "Les Gorons sont des vraies têtes dures.", - /*spanish*/ "Los Goron son tontos. Se comen las piedras." }, + Text{ "Do you want to give up yet?", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK15] = HintText::Junk({ // obscure text - Text{ "They say that Lon Lon Ranch prospered under Ingo.", - /*french*/ "Selon moi, le Ranch Lon Lon était plus prospère sous Ingo.", - /*spanish*/ "Según dicen, el Rancho Lon Lon prosperó gracias a Ingo." }, + Text{ "Do you even know where you are going?", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK16] = HintText::Junk({ // obscure text - Text{ "The single rupee is a unique item.", /*french*/ "Nul objet n'est plus unique que le rubis vert.", - /*spanish*/ "La rupia de uno es un objeto singular." }, + Text{ "Wrong way!", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK17] = HintText::Junk({ // obscure text - Text{ "Without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", - /*french*/ "Gagner la Chasse-aux-Trésors est 1 chance sur 32.^Bonne chance!", /*spanish*/ - "Sin la Lupa de la Verdad, ganarías 1/32 veces en el Cofre del Tesoro.^¡Buena suerte con ello!" }, + Text{ "Dead end!", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK18] = HintText::Junk({ // obscure text - Text{ "Use bombs wisely.", /*french*/ "Utilise les bombes avec précaution.", - /*spanish*/ "No desperdicies las bombas." }, + Text{ "They say playing Ocarina of Time is a foolish choice.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK19] = HintText::Junk({ // obscure text - Text{ "They say that Volvagia hates splinters", /*french*/ "Selon moi, Volvagia déteste les échardes.", - /*spanish*/ "Según dicen, Volvagia le teme a las astillas." }, + Text{ "They say Ship of Harkinian is on the way of the hero.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK20] = HintText::Junk({ // obscure text - Text{ "They say that funky monkeys can be spotted on Friday.", - /*french*/ "Selon moi, des capucins coquins sortent le vendredi.", - /*spanish*/ "Según dicen, en los viernes puedes hallar monos marchosos." }, + Text{ "They say using Deku Nuts attracts the local wildlife.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK21] = HintText::Junk({ // obscure text - Text{ "I found you, faker!", /*french*/ "Ah-ha! Je t'ai trouvé!", /*spanish*/ "¡Ahí estás, impostor!" }, + Text{ "They say Lake Hylia is considered an indoor area.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK22] = HintText::Junk({ // obscure text - Text{ "They say the Groose is loose.", /*french*/ "Selon moi, Hergo est le vrai héros.", - /*spanish*/ "Según dicen, Malton es un espanto." }, + Text{ "<>", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK23] = HintText::Junk({ // obscure text - Text{ - "They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", - /*french*/ "Selon moi, ceux qui utilisent les contrôles gyroscopiques sont les VRAIS joueurs.", /*spanish*/ - "Según dicen, aquellos que juegan usando el control por movimiento son los verdaderos jugadores de " - "Zelda." }, + Text{ "They say lifting weights makes you run faster.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK24] = HintText::Junk({ // obscure text - Text{ "What happened to Sheik?", /*french*/ "Donc... Qu'est-ce qui arrive avec Sheik?", - /*spanish*/ "¿Qué la habrá pasado a Sheik?" }, + Text{ "They say you never know when a bomb is going to blow up.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK25] = HintText::Junk({ // obscure text - Text{ "L2P @.", /*french*/ "Arrête de lire les indices et joue comme un grand, @.", - /*spanish*/ "Mira que eres novato, @." }, + Text{ "They say Raul has ascended to Godhood.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK26] = HintText::Junk({ // obscure text - Text{ "I've heard you can cheat at Sploosh Kaboom.", - /*french*/ "Selon moi, il y a une carte aux trésors à Mercantîle... Duh!", - /*spanish*/ "He oído por ahí que puedes hacer trampa en el Sploosh Kaboom." }, + Text{ "They say blue rupees might not be what they appear to be at first sight.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK27] = HintText::Junk({ // obscure text - Text{ "I'm Lonk from Pennsylvania.", /*french*/ "Je suis Lonk, le héros de Pennsylvanie!", - /*spanish*/ "Soy Lonk, de Pensilvania." }, + Text{ "They say attempting the treasure chest minigame has a 1/1 chance of winning.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK28] = HintText::Junk({ // obscure text - Text{ "I bet you'd like to have more bombs.", /*french*/ "Je parie que tu veux plus de bombes.", - /*spanish*/ "Me apuesto a que quisieras tener más bombas." }, + Text{ "They say some of these hints are actually useful. This one is not. Or is it?", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK29] = HintText::Junk({ // obscure text - Text{ "When all else fails, use Fire.", /*french*/ "Quand rien ne marche, utilise le feu.", - /*spanish*/ "Cuando nada funcione, usa el fuego." }, + Text{ "They say the best players don't need multiple tunics.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK30] = HintText::Junk({ // obscure text - Text{ "Here's a hint, @. Don't be bad.", /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!", - /*spanish*/ "Aquí tienes una pista, @: deja de ser manco." }, + Text{ "They say you shouldn't worry so much about your HUD layout.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK31] = HintText::Junk({ // obscure text - Text{ "Game Over. Return of Ganon.", /*french*/ "Partie terminée. RETour de Ganon.", - /*spanish*/ "Fin de la partida. El regreso de Ganon." }, + Text{ "They say the desert calls to everyone.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK32] = HintText::Junk({ // obscure text - Text{ "May the way of the Hero lead to the Triforce.", - /*french*/ "Que le chemin du héros te mène à la Triforce.", - /*spanish*/ "Puede que la senda del héroe te lleve hacia la Trifuerza." }, + Text{ "They say Mellar21 and Fredomato are fellow Chaos Lords.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK33] = HintText::Junk({ // obscure text - Text{ "Can't find an item? Scan an Amiibo.", /*french*/ "Tu cherches de quoi? Utilise un Amiibo!", - /*spanish*/ "¿No encuentras algo? Escanea un amiibo." }, + Text{ "aMannus was here.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK34] = HintText::Junk({ // obscure text - Text{ "They say this game has just a few glitches.", - /*french*/ "Selon moi, ce jeu est complètement exempt de glitchs.", - /*spanish*/ "Dicen que este juego apenas tiene glitches." }, + Text{ "They say Stone Tower is on the way of the hero.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK35] = HintText::Junk({ // obscure text - Text{ "BRRING BRRING This is Ulrira. Wrong number?", - /*french*/ "DRING DRING!! Pépé le Ramollo à l'appareil... Quoi? Faux numéro?", - /*spanish*/ "¡Ring! ¡Ring! Al habla Ulrira. ¿Me he equivocado de número?" }, + Text{ "They say Ancient Cistern is on the way of the hero.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK36] = HintText::Junk({ // obscure text - Text{ "Tingle Tingle Kooloo Limpah!", /*french*/ "Tingle! Tingle! Kooloolin... Pah!", - /*spanish*/ "Tingle, Tingle, Kurulín... ¡PA!" }, + Text{ "They say the fowl are foul in Hyrule.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK37] = HintText::Junk({ // obscure text - Text{ "L is real 2401", /*french*/ "L is real 2401", /*spanish*/ "L es real 2401." }, + Text{ "They say Zelda is a strong and dependent woman.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK38] = HintText::Junk({ // obscure text - Text{ "They say that Ganondorf will appear in the next Mario Tennis.", - /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.", - /*spanish*/ "Según dicen, Ganondorf estará en el próximo Mario Tennis." }, + Text{ "They say using the Megaton Hammer changes the floor's compound.", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK39] = HintText::Junk({ // obscure text - Text{ "Medigoron sells the earliest Breath of the Wild demo.", - /*french*/ "Selon moi, Medigoron vend une démo de #Breath of the Wild#.", - /*spanish*/ "Medigoron vende la primera demo del Breath of the Wild." }, + Text{ "They say", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); hintTable[JUNK40] = HintText::Junk({ // obscure text - Text{ "Can you move me? I don't get great service here.", - /*french*/ "Peux-tu me déplacer? J'ai pas une bonne réception ici.", - /*spanish*/ "¿Puedes llevarme a otro lado? Aquí nadie me presta atención." }, - }); - - hintTable[JUNK41] = HintText::Junk({ - // obscure text - Text{ "They say if you use Strength on the truck, you can find Mew.", - /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!", - /*spanish*/ "Según dicen, puedes hallar un Mew usando Fuerza contra el camión de Ciudad Carmín." }, - }); - - hintTable[JUNK42] = HintText::Junk({ - // obscure text - Text{ "I'm a helpful hint Gossip Stone!^See, I'm helping.", - /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?", - /*spanish*/ "Soy una Piedra Sheikah muy útil.^¡Mira cómo te ayudo!" }, - }); - - hintTable[JUNK43] = HintText::Junk({ - // obscure text - Text{ - "Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", /*french*/ - "Mon très cher @:&Viens vite au château, je t'ai préparé&un délicieux gâteau...^À bientôt, Princesse Zelda", - /*spanish*/ - "Querido @: Por favor, ven al castillo. He hecho una tarta para ti.&Sinceramente tuya: Princesa Zelda." }, - }); - - hintTable[JUNK44] = HintText::Junk({ - // obscure text - Text{ "They say all toasters toast toast.", /*french*/ "Selon moi, les grille-pains grillent du pain.", - /*spanish*/ "Según dicen, todas las tostadoras tostan tostadas tostadas." }, - }); - - hintTable[JUNK45] = HintText::Junk({ - // obscure text - Text{ "You thought it would be a useful hint, but it was me, junk hint!", - /*french*/ "Tu t'attendais à un bon indice... Mais c'était moi, un mauvais indice!", /*spanish*/ - "Je... Creeías que iba a ser una piedra de utilidad, ¡pero no, era yo, la piedra de la agonía!" }, - }); - - hintTable[JUNK46] = HintText::Junk({ - // obscure text - Text{ "They say that quest guidance can be found at a talking rock.", - /*french*/ "Selon moi, des #indices# se trouvent auprès d'une pierre parlante... Duh!", - /*spanish*/ "Según dicen, puedes consultarle ayuda a rocas parlanchinas." }, - }); - - hintTable[JUNK47] = HintText::Junk({ - // obscure text - Text{ "They say that the final item you're looking for can be found somewhere in Hyrule.", - /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!", - /*spanish*/ "Según dicen, el último objeto que te falte puede estar en cualquier rincón de Hyrule." }, - }); - - hintTable[JUNK48] = HintText::Junk({ - // obscure text - Text{ "Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", - /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.", - /*spanish*/ "Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep." }, - }); - - hintTable[JUNK49] = HintText::Junk({ - // obscure text - Text{ "They say that Barinade fears Deku Nuts.", /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.", - /*spanish*/ "Según dicen, lo que más teme a Barinade son las nueces deku." }, - }); - - hintTable[JUNK50] = HintText::Junk({ - // obscure text - Text{ "They say that Flare Dancers do not fear Goron-crafted blades.", - /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.", - /*spanish*/ "Según dicen, los Bailafuegos no le temen a las armas forjadas por Gorons." }, - }); - - hintTable[JUNK51] = HintText::Junk({ - // obscure text - Text{ "They say that Morpha is easily trapped in a corner.", - /*french*/ "Selon moi, Morpha est facilement coincé.", - /*spanish*/ "Según dicen, puedes atrapar a Morpha con facilidad en una esquina." }, - }); - - hintTable[JUNK52] = HintText::Junk({ - // obscure text - Text{ "They say that Bongo Bongo really hates the cold.", - /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.", - /*spanish*/ "Según dicen, Bongo Bongo odia a muerte el frío." }, - }); - - hintTable[JUNK53] = HintText::Junk({ - // obscure text - Text{ "They say that your sword is most powerful when you put it away.", - /*french*/ "Selon moi, ton épée est à pleine puissance quand tu la rengaines.", - /*spanish*/ "Según dicen, tu espada se vuelve más poderosa si la guardas." }, - }); - - hintTable[JUNK54] = HintText::Junk({ - // obscure text - Text{ "They say that bombing the hole Volvagia last flew into can be rewarding.", - /*french*/ "Selon moi, le trou où se creuse Volvagia est vulnérable aux bombes.", /*spanish*/ - "Según dicen, trae buena suerte colocar una bomba en el último agujero de donde salió Volvagia." }, - }); - - hintTable[JUNK55] = HintText::Junk({ - // obscure text - Text{ "They say that invisible ghosts can be exposed with Deku Nuts.", - /*french*/ "Selon moi, des fantômes invisibles apparaissent avec des noix Mojo.", - /*spanish*/ "Según dicen, puedes exponer a los espectros invisibles con nueces deku." }, - }); - - hintTable[JUNK56] = HintText::Junk({ - // obscure text - Text{ "They say that the real Phantom Ganon is bright and loud.", - /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.", - /*spanish*/ "Según dicen, el verdadero Ganon Fantasma es brillante y ruidoso." }, - }); - - hintTable[JUNK57] = HintText::Junk({ - // obscure text - Text{ "They say that walking backwards is very fast.", - /*french*/ "Selon moi, tu fais marche arrière très rapidement pour un héros.", - /*spanish*/ "Según dicen, es más rápido caminar hacia atrás." }, - }); - - hintTable[JUNK58] = HintText::Junk({ - // obscure text - Text{ - "They say that leaping above the Market entrance enriches most children.", - /*french*/ "Selon moi, les enfants riches se pavanent en haut du pont-levis.", - /*spanish*/ "Según dicen, saltar por las cadenas a la entrada de la plaza enriquece a muchos chiquillos." }, - }); - - hintTable[JUNK59] = HintText::Junk({ - // obscure text - Text{ "They say Ingo is not very good at planning ahead.", - /*french*/ "Selon moi, Ingo ne fait pas un très bon geôlier.", - /*spanish*/ "Según dicen, a Ingo no se le da especialmente bien planificar con antelación." }, - }); - - hintTable[JUNK60] = HintText::Junk({ - // obscure text - Text{ "You found a spiritual Stone! By which I mean, I worship Nayru.", - /*french*/ "Vous avez trouvé une Pierre Ancestrale! En effet, je vénère la déesse Hylia.", - /*spanish*/ "¡Has encontrado una piedra espiritual! Es que le rindo culto a Nayru..." }, - }); - - hintTable[JUNK61] = HintText::Junk({ - // obscure text - Text{ "They say that a flying strike with a Deku Stick is no stronger than a grounded one.", - /*french*/ "Selon moi, un coup de bâton sauté n'est pas meilleur qu'au sol.", - /*spanish*/ "Según dicen, los golpes aéreos con palos deku son tan fuertes como los normales." }, - }); - - hintTable[JUNK62] = HintText::Junk({ - // obscure text - Text{ "Open your eyes.^Open your eyes.^Wake up, @.", - /*french*/ "Réveille-toi...^Réveille-toi.^Ouvre les yeux, @.", - /*spanish*/ "Abre los ojos...^Abre los ojos...^Despierta, @..." }, - }); - - hintTable[JUNK63] = HintText::Junk({ - // obscure text - Text{ "They say that the Nocturne of Shadow can bring you very close to Ganon.", - /*french*/ "Selon moi, le nocturne de l'ombre peut t'amener très près de Ganon.", - /*spanish*/ "Según dicen, el Nocturno de la sombra te puede acercar mucho a Ganon." }, - }); - - hintTable[JUNK64] = HintText::Junk({ - // obscure text - Text{ "They say that Twinrova always casts the same spell the first three times.", - /*french*/ "Selon moi, Twinrova lance toujours les mêmes trois premiers sorts.", - /*spanish*/ "Según dicen, Birova siempre lanza el mismo hechizo las tres primeras veces." }, - }); - - hintTable[JUNK65] = HintText::Junk({ - // obscure text - Text{ "They say that the nightly builds may be unstable.", - /*french*/ "Selon moi, les \"nightly builds\" peuvent être instables.", - /*spanish*/ "Según dicen, las últimas nightlies pueden llegar a ser algo inestables." }, - }); - - hintTable[JUNK66] = HintText::Junk({ - // obscure text - Text{ "You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", - /*french*/ "Tu joues à un randomizer. Je suis aléatoire!^Voici un nombre aléatoire: #4#.&Bonne partie!", - /*spanish*/ - "¡Estás jugando un Randomizer! ¡Yo también estoy aleatorizada!^Aquí tienes un número aleatorio: " - "#8#.&¡Diviértete!" }, - }); - - hintTable[JUNK67] = HintText::Junk({ - // obscure text - Text{ "They say Ganondorf's bolts can be reflected with glass or steel.", - /*french*/ "Selon moi, les éclairs de Ganon se reflètent sur l'acier et le verre.", - /*spanish*/ "Según dicen, puedes reflejar las esferas de energía de Ganondorf con cristal y acero." }, - }); - - hintTable[JUNK68] = HintText::Junk({ - // obscure text - Text{ "They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " - "boomerangs...^...rods, shovels, iron balls, angry bees...", - /*french*/ - "Selon moi, la queue de Ganon est vulnérable aux noix, flèches, épées, bombes, marteaux...^...bâtons, " - "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragées...", - /*spanish*/ - "Según dicen, la cola de Ganon es vulnerable a nueces, flechas, espadas, explosivos, " - "martillos...^...palos, semillas, bumeráns...^...cetros, palas, bolas de hierro, abejas..." }, - }); - - hintTable[JUNK69] = HintText::Junk({ - // obscure text - Text{ - "They say that you're wasting time reading this hint, but I disagree. Talk to me again!", - /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!", /*spanish*/ - "Según dicen, pierdes el tiempo en leer esta pista, pero no pienso igual. ¡Vuelve a hablarme, ya verás!" }, - }); - - hintTable[JUNK70] = HintText::Junk({ - // obscure text - Text{ "They say Ganondorf knows where to find the instrument of his doom.", - /*french*/ "Selon moi, Ganondorf sait où il a caché son point faible.", - /*spanish*/ "Según dicen, Ganondorf sabe dónde hallar el instrumento de su perdición." }, - }); - - hintTable[JUNK71] = HintText::Junk({ - // obscure text - Text{ "I heard @ is pretty good at Zelda.", /*french*/ "Apparemment, @ est super bon à Zelda.", - /*spanish*/ "He oído que a @ se le dan muy bien los Zelda." }, - }); - - hintTable[JUNK72] = HintText::Junk({ - // obscure text - Text{ "Hi @, we've been trying to reach you about your car's extended warranty. ", - /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...", - /*spanish*/ - "Buenas, @. Le llamamos para ofrecerle un nuevo seguro de hogar que puede pagar en cómodos plazos, sin " - "intereses ni comisiones." }, - }); - - hintTable[JUNK73] = HintText::Junk({ - // obscure text - Text{ "They say that the best weapon against Iron Knuckles is item 176.", - /*french*/ "Selon moi, les hache-viandes sont vulnérables contre l'objet 176.", - /*spanish*/ "Según dicen, la mejor arma para enfrentarse a los Nudillos de hierro es el objeto 176." }, - }); - - hintTable[JUNK74] = HintText::Junk({ - // obscure text - Text{ "They say that it's actually possible to beat the running man.", - /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...", - /*spanish*/ "Según dicen, con mucha perseverancia puedes ganarle al corredor con la capucha de conejo." }, - }); - - hintTable[JUNK75] = HintText::Junk({ - // obscure text - Text{ "They say that the stone-cold guardian of the Well is only present during work hours.", - /*french*/ "Selon moi, le gardien de pierre du Puits quitte le soir pour aller se coucher.", - /*spanish*/ "Según dicen, la inmensa roca que bloquea el pozo solo trabaja en horas laborales." }, - }); - - hintTable[JUNK76] = HintText::Junk({ - // obscure text - Text{ - "They say this hint makes more sense in other languages.", - /*french*/ "Selon moi, ces indices auraient pu être mieux traduits... Duh!", - /*spanish*/ "Según dicen, esta pista revela algo de vital importancia si cambias el idioma del juego..." }, - }); - - hintTable[JUNK77] = HintText::Junk({ - // obscure text - Text{ "BOK? No way.", /*french*/ "BD'accord? Hors de question.", /*spanish*/ "¿BVale? Ni hablar." }, - }); - - // ^ junk hints above are from 3drando - // v junk hints below are new to soh rando - -#define HINT_TEXT_NEEDS_TRANSLATION_FR \ - "Erreur 0x69a504:&Traduction manquante^C'est de la faute à Purple Hato!&J'vous jure!" - - hintTable[JUNK78] = HintText::Junk({ - //obscure text - Text{"They say blarg...^...or at least briaguya does.", /*french*/"Tout ce que j'ai à dire, c'est blarg...^... 'fin c'est plutôt ce que briaguya dirait.", /*spanish*/"blarg"}, - }); - - hintTable[JUNK79] = HintText::Junk({ - //obscure text - Text{"They say this peace is what all true warriors strive for.", /*french*/"Selon moi, cette paix est ce pour quoi luttent tous les vrais guerriers.", /*spanish*/"blarg"}, - }); - - hintTable[JUNK80] = HintText::Junk({ - //obscure text - Text{"They say this ship is what all true gamers strive for.", /*french*/"Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.", /*spanish*/"blarg"}, - }); - - hintTable[JUNK81] = HintText::Junk({ - //obscure text - Text{"They say that Glowsticks can be found in the Raveyard.", /*french*/"On peut trouver des Bâtons Lumineux sur le dancefloor du cimetière.", /*spanish*/"blarg"}, - }); - - hintTable[JUNK_WTC_1] = HintText::Junk({ - Text{ "They say %rthere are no more than 18&people on this island.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_2] = HintText::Junk({ - Text{ "They say I am one yet many", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_3] = HintText::Junk({ - Text{ "They say its all in the name of guiding&humanity down the right path.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[JUNK_WTC_4] = HintText::Junk({ - Text{ "They say \"Repetition requested\"", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_5] = HintText::Junk({ - Text{ "They say %rThe red tells only the truth!", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_6] = HintText::Junk({ - Text{ "They say good tidings to you^my traitorous @", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_7] = HintText::Junk({ - Text{ "They say when the seagulls cried,&none were left alive.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_7] = HintText::Junk({ - Text{ "They say when the seagulls cried,&none were left alive.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_8] = HintText::Junk({ - Text{ "They say she is lying with the red letters!", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_9] = HintText::Junk({ - Text{ "They say we'll meet again,&when something else cries.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_10] = HintText::Junk({ - Text{ "They say \"Forgive me, but-^Your script will not be used.&....After all...^The one writing the rest of " - "the script...&will be me.\"", - HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_11] = HintText::Junk({ - Text{ "They say tea is best enjoyed...^\"\"With your fellow monsters.\"\"", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_WTC_12] = HintText::Junk({ - Text{ "They say I shall make you some black tea. With my own hands, not magic.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[JUNK_SEI_1] = HintText::Junk({ - Text{ "They say you know I've kiboshed before...^and I will kibosh again.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[JUNK_SEI_2] = HintText::Junk({ - Text{ "They say if relationship @ walks through that door,^they will KILL independent @.", - HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_3] = HintText::Junk({ - Text{ "They say you gotta have the BIG Salad.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_4] = HintText::Junk({ - Text{ "They say it's a festivus miracle", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_5] = HintText::Junk({ - Text{ "They say there are no houses in Tuscany to rent.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_6] = HintText::Junk({ - Text{ "They say my last boyfriend had a real&Kroner comprehension problem.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[JUNK_SEI_7] = HintText::Junk({ - Text{ "They say it's a festivus miracle.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_8] = HintText::Junk({ - Text{ "They say Louis quit the importing&to focus on the exporting.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_9] = HintText::Junk({ - Text{ "They say no thanks, I can't drink coffee&late at night, it keeps me up.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_10] = HintText::Junk({ - Text{ "They say it's not a lie if you believe it.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_11] = HintText::Junk({ - Text{ "They say there was a second spitter.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_12] = HintText::Junk({ - Text{ "They say there was a second spitter.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_13] = HintText::Junk({ - Text{ "They say the jerk store called,^they're running out of YOU.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_14] = HintText::Junk({ - Text{ "They say when you look annoyed all the time,&people thing you are busy.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_15] = HintText::Junk({ - Text{ "They say when you look annoyed all the time,&people think you are busy.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, - }); - - hintTable[JUNK_SEI_16] = HintText::Junk({ - Text{ "They say he fires people like its a bodily function.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_17] = HintText::Junk({ - Text{ "They say he threatened to move the ship to New Jersey&just to upset people.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_18] = HintText::Junk({ - Text{ "They say there was significant shrinkage.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_19] = HintText::Junk({ - Text{ "They say if it wasn't for the toilet there'd be no books.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_20] = HintText::Junk({ - Text{ "They say if it wasn't for the toilet there'd be no books.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_21] = HintText::Junk({ - Text{ "They say don't trust men in capes.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_22] = HintText::Junk({ - Text{ "They say @'s uncle works for Nintendo.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_23] = HintText::Junk({ - Text{ "They say @'s stole the marble rye.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_24] = HintText::Junk({ - Text{ "They say there is no better harmony&than the black and white cookie.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_25] = HintText::Junk({ - Text{ "They say @ hasn't vomited since 1983.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_26] = HintText::Junk({ - Text{ "They say you gotta have the early bird special.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_27] = HintText::Junk({ - Text{ "They say a donation has been made in your name&to the human fund.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_28] = HintText::Junk({ - Text{ "They say you want to be my latex salesman.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SEI_29] = HintText::Junk({ - Text{ "They say if every instinct you have is wrong...^... then the opposite would have to be right.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_OTR_MEANS_1] = HintText::Junk({ - Text{ "They say OTR stands for&Over the Rainbow", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_2] = HintText::Junk({ - Text{ "They say that OTR stands for&Onions, Tomatoes, and Radishes", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_3] = HintText::Junk({ - Text{ "They say that OTR stands for&Ocarina of Time Resources", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_4] = HintText::Junk({ - Text{ "They say that OTR stands for&Over the Road", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_5] = HintText::Junk({ - Text{ "They say that OTR stands for&Off the Record", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_6] = HintText::Junk({ - Text{ "They say that OTR stands for&Office of Tax and Revenue", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_7] = HintText::Junk({ - Text{ "They say OTR stands for&Over the Rainbow", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_8] = HintText::Junk({ - Text{ "They say that OTR stands for&Office of Trade Relations", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_9] = HintText::Junk({ - Text{ "They say that OTR stands for&Original Theatrical Release", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_10] = HintText::Junk({ - Text{ "They say that OTR stands for&Operational Test Requirement", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_11] = HintText::Junk({ - Text{ "They say that OTR stands for&Operational Trouble Report", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_12] = HintText::Junk({ - Text{ "They say that OTR stands for&Oxygen Transmission Rate", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_13] = HintText::Junk({ - Text{ "They say that OTR stands for&One Touch Recording", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_14] = HintText::Junk({ - Text{ "They say that OTR stands for&Olympic Torch Relay", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_15] = HintText::Junk({ - Text{ "They say that OTR stands for&Off the Rack", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_16] = HintText::Junk({ - Text{ "They say that OTR stands for&Overhead Transfer Rate", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_17] = HintText::Junk({ - Text{ "They say that OTR stands for&Operational TurnaRound", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_18] = HintText::Junk({ - Text{ "They say that OTR stands for&Opportunity to Recall", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_19] = HintText::Junk({ - Text{ "They say that OTR stands for&Operability Test Report", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_20] = HintText::Junk({ - Text{ "They say that OTR stands for&Overall Tuning Range", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_21] = HintText::Junk({ - Text{ "They say that OTR stands for&One Time Requisition", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_22] = HintText::Junk({ - Text{ "They say that OTR stands for&Oblivious to Reality", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_23] = HintText::Junk({ - Text{ "They say that OTR stands for&On the Run", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_24] = HintText::Junk({ - Text{ "They say that OTR stands for&On Time Reporting", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_25] = HintText::Junk({ - Text{ "They say that OTR stands for&Order to Receipt", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_26] = HintText::Junk({ - Text{ "They say that OTR stands for&Other Terrestrial Radio", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_27] = HintText::Junk({ - Text{ "They say that OTR stands for&On Target Reports", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_28] = HintText::Junk({ - Text{ "They say that OTR stands for&One Time Repair", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_29] = HintText::Junk({ - Text{ "They say that OTR stands for&Own the Room", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - hintTable[JUNK_OTR_MEANS_30] = HintText::Junk({ - Text{ "They say that OTR stands for&Online Text Repository", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_1] = HintText::Junk({ - Text{ "They say %gKenix%w isn't a developer...^...Just a PR guy", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_2] = HintText::Junk({ - Text {"They say... No", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg"}, - }); - - hintTable[JUNK_MISC_3] = HintText::Junk({ - Text{ "They say BIG RIGS: OTR", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" } - }); - - hintTable[JUNK_MISC_4] = HintText::Junk({ - Text{ "They say you wanted to see me %pMr. Kenix%w?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_5] = HintText::Junk({ - Text{ "They say Louis once saw an&equals not get set equals", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_6] = HintText::Junk({ - Text{ "They say only you can find your rom.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_7] = HintText::Junk({ - Text{ "They say ZAPD is good software.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_8] = HintText::Junk({ - Text{ "They say you can encounter&a parascode in tall grass.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_9] = HintText::Junk({ - Text{ "They say the ship sails on March 32nd.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_10] = HintText::Junk({ - Text{ "They say bombing dodongos is fun.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_11] = HintText::Junk({ - Text{ "They say shopkeepers don't give credits.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_12] = HintText::Junk({ - Text{ "They say shopkeepers don't give credits.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_13] = HintText::Junk({ - Text{ "They say Malon is glitched.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_14] = HintText::Junk({ - Text{ "They say do I look like I know&what a DList is?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_15] = HintText::Junk({ - Text{ "They say do I look like I know&what an AList is?", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_16] = HintText::Junk({ - Text{ "They say the king drinks enthusiastically", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_MISC_17] = HintText::Junk({ - Text{ "They say Rubies are on the path to&Lamp Oil, Rope, and Bombs", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SG_1] = HintText::Junk({ - Text{ "They say %rError. Human is dead, mismatch.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SG_2] = HintText::Junk({ - Text{ "They say this is the choice of the&steins gate.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SG_3] = HintText::Junk({ - Text{ "They say el psy kongroo.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SG_4] = HintText::Junk({ - Text{ "They say tutturu~.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - - hintTable[JUNK_SG_5] = HintText::Junk({ - Text{ "They say im not Christina!.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SG_6] = HintText::Junk({ - Text{ "They say you know where to find an IBN5100.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SG_7] = HintText::Junk({ - Text{ "They say when you're on a chicken bender&grab a box of chicken tenders.", HINT_TEXT_NEEDS_TRANSLATION_FR, "blarg" }, - }); - - hintTable[JUNK_SG_8] = HintText::Junk({ - Text{ "Juicy Chicken #1! Wow!.", HINT_TEXT_NEEDS_TRANSLATION_FR, - "blarg" }, + Text{ "A golden piece of poo is what I’ve always wanted!", + /*french*/ "Bwarg!", + /*spanish*/ "Bwarg." }, }); /*-------------------------- diff --git a/soh/soh/Enhancements/randomizer/3drando/keys.hpp b/soh/soh/Enhancements/randomizer/3drando/keys.hpp index 95d31070e43..fc1023abf45 100644 --- a/soh/soh/Enhancements/randomizer/3drando/keys.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/keys.hpp @@ -1586,6 +1586,7 @@ typedef enum { CAN_BE_FOUND_AT, HOARDS, + JUNK01, JUNK02, JUNK03, JUNK04, @@ -1625,148 +1626,6 @@ typedef enum { JUNK38, JUNK39, JUNK40, - JUNK41, - JUNK42, - JUNK43, - JUNK44, - JUNK45, - JUNK46, - JUNK47, - JUNK48, - JUNK49, - JUNK50, - JUNK51, - JUNK52, - JUNK53, - JUNK54, - JUNK55, - JUNK56, - JUNK57, - JUNK58, - JUNK59, - JUNK60, - JUNK61, - JUNK62, - JUNK63, - JUNK64, - JUNK65, - JUNK66, - JUNK67, - JUNK68, - JUNK69, - JUNK70, - JUNK71, - JUNK72, - JUNK73, - JUNK74, - JUNK75, - JUNK76, - JUNK77, - JUNK78, - JUNK79, - JUNK80, - JUNK81, - - JUNK_WTC_1, - JUNK_WTC_2, - JUNK_WTC_3, - JUNK_WTC_4, - JUNK_WTC_5, - JUNK_WTC_6, - JUNK_WTC_7, - JUNK_WTC_8, - JUNK_WTC_9, - JUNK_WTC_10, - JUNK_WTC_11, - JUNK_WTC_12, - - JUNK_SEI_1, - JUNK_SEI_2, - JUNK_SEI_3, - JUNK_SEI_4, - JUNK_SEI_5, - JUNK_SEI_6, - JUNK_SEI_7, - JUNK_SEI_8, - JUNK_SEI_9, - JUNK_SEI_10, - JUNK_SEI_11, - JUNK_SEI_12, - JUNK_SEI_13, - JUNK_SEI_14, - JUNK_SEI_15, - JUNK_SEI_16, - JUNK_SEI_17, - JUNK_SEI_18, - JUNK_SEI_19, - JUNK_SEI_20, - JUNK_SEI_21, - JUNK_SEI_22, - JUNK_SEI_23, - JUNK_SEI_24, - JUNK_SEI_25, - JUNK_SEI_26, - JUNK_SEI_27, - JUNK_SEI_28, - JUNK_SEI_29, - - JUNK_OTR_MEANS_1, - JUNK_OTR_MEANS_2, - JUNK_OTR_MEANS_3, - JUNK_OTR_MEANS_4, - JUNK_OTR_MEANS_5, - JUNK_OTR_MEANS_6, - JUNK_OTR_MEANS_7, - JUNK_OTR_MEANS_8, - JUNK_OTR_MEANS_9, - JUNK_OTR_MEANS_10, - JUNK_OTR_MEANS_11, - JUNK_OTR_MEANS_12, - JUNK_OTR_MEANS_13, - JUNK_OTR_MEANS_14, - JUNK_OTR_MEANS_15, - JUNK_OTR_MEANS_16, - JUNK_OTR_MEANS_17, - JUNK_OTR_MEANS_18, - JUNK_OTR_MEANS_19, - JUNK_OTR_MEANS_20, - JUNK_OTR_MEANS_21, - JUNK_OTR_MEANS_22, - JUNK_OTR_MEANS_23, - JUNK_OTR_MEANS_24, - JUNK_OTR_MEANS_25, - JUNK_OTR_MEANS_26, - JUNK_OTR_MEANS_27, - JUNK_OTR_MEANS_28, - JUNK_OTR_MEANS_29, - JUNK_OTR_MEANS_30, - - JUNK_MISC_1, - JUNK_MISC_2, - JUNK_MISC_3, - JUNK_MISC_4, - JUNK_MISC_5, - JUNK_MISC_6, - JUNK_MISC_7, - JUNK_MISC_8, - JUNK_MISC_9, - JUNK_MISC_10, - JUNK_MISC_11, - JUNK_MISC_12, - JUNK_MISC_13, - JUNK_MISC_14, - JUNK_MISC_15, - JUNK_MISC_16, - JUNK_MISC_17, - - JUNK_SG_1, - JUNK_SG_2, - JUNK_SG_3, - JUNK_SG_4, - JUNK_SG_5, - JUNK_SG_6, - JUNK_SG_7, - JUNK_SG_8, BRIDGE_OPEN_HINT, BRIDGE_VANILLA_HINT, diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 8f88a729940..84d0785189d 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -2904,7 +2904,7 @@ void GenerateRandomizerImgui(std::string seed = "") { cvarSettings[RSK_KAK_50_SKULLS_HINT] = CVarGetInteger("gRandomize50GSHint", RO_GENERIC_OFF); cvarSettings[RSK_GOSSIP_STONE_HINTS] = CVarGetInteger("gRandomizeGossipStoneHints", RO_GOSSIP_STONES_NEED_NOTHING); cvarSettings[RSK_HINT_CLARITY] = CVarGetInteger("gRandomizeHintClarity", RO_HINT_CLARITY_CLEAR); - cvarSettings[RSK_HINT_DISTRIBUTION] = CVarGetInteger("gRandomizeHintDistribution", RO_HINT_DIST_BALANCED); + cvarSettings[RSK_HINT_DISTRIBUTION] = RO_HINT_DIST_USELESS; cvarSettings[RSK_BLUE_FIRE_ARROWS] = CVarGetInteger("gRandomizeBlueFireArrows", 0); cvarSettings[RSK_SUNLIGHT_ARROWS] = CVarGetInteger("gRandomizeSunlightArrows", 0); cvarSettings[RSK_KEYSANITY] = CVarGetInteger("gRandomizeKeysanity", RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); diff --git a/soh/src/code/z_draw.c b/soh/src/code/z_draw.c index cb28a498e35..e490dfed25d 100644 --- a/soh/src/code/z_draw.c +++ b/soh/src/code/z_draw.c @@ -404,11 +404,12 @@ void GetItem_Draw(PlayState* play, s16 drawId) { * Uses the Custom Draw Function if it exists, or just calls `GetItem_Draw` */ void GetItemEntry_Draw(PlayState* play, GetItemEntry getItemEntry) { - if (getItemEntry.drawFunc != NULL) { + /*if (getItemEntry.drawFunc != NULL) { getItemEntry.drawFunc(play, &getItemEntry); } else { GetItem_Draw(play, getItemEntry.gid); - } + }*/ + GetItem_Draw(play, 109); } // All remaining functions in this file are draw functions referenced in the table and called by the function above diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 42ea78f90ba..e63317d3ec0 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -333,12 +333,8 @@ void EnItem00_SetupAction(EnItem00* this, EnItem00ActionFunc actionFunc) { void EnItem00_SetObjectDependency(EnItem00* this, PlayState* play, s16 objectIndex) { // Remove object dependency for Enemy Randomizer and Crowd Control to allow Like-likes to // drop equipment correctly in rooms where Like-likes normally don't spawn. - if (CVarGetInteger("gRandomizedEnemies", 0) || CVarGetInteger("gCrowdControl", 0)) { - this->actor.objBankIndex = 0; - } else { - this->actor.objBankIndex = Object_GetIndex(&play->objectCtx, objectIndex); - Actor_SetObjectDependency(play, &this->actor); - } + + this->actor.objBankIndex = 0; } void EnItem00_Init(Actor* thisx, PlayState* play) { diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c index 4474c2d8b02..b0c1f50ec99 100644 --- a/soh/src/code/z_kankyo.c +++ b/soh/src/code/z_kankyo.c @@ -927,10 +927,12 @@ void Environment_Update(PlayState* play, EnvironmentContext* envCtx, LightContex if ((envCtx->unk_1A == 0) && !FrameAdvance_IsEnabled(play) && (play->transitionMode == 0 || ((void)0, gSaveContext.gameMode) != 0)) { - if (IS_DAY || gTimeIncrement >= 0x190) { - gSaveContext.dayTime += gTimeIncrement; - } else { - gSaveContext.dayTime += gTimeIncrement * 2; // time moves twice as fast at night + if (play->sceneNum != SCENE_LAKE_HYLIA || gTimeIncrement != 10) { + if (IS_DAY || gTimeIncrement >= 0x190) { + gSaveContext.dayTime += gTimeIncrement; + } else { + gSaveContext.dayTime += gTimeIncrement * 2; // time moves twice as fast at night + } } } } diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index ec25d206256..37026bd4e6b 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -2297,7 +2297,11 @@ u8 Item_Give(PlayState* play, u8 item) { return Return_Item(item, MOD_NONE, item); } else if ((item >= ITEM_RUPEE_GREEN) && (item <= ITEM_INVALID_8)) { - Rupees_ChangeBy(sAmmoRefillCounts[item - ITEM_RUPEE_GREEN + 10]); + int16_t rupeeChangeValue = sAmmoRefillCounts[item - ITEM_RUPEE_GREEN + 10]; + if (rupeeChangeValue == 200) { + rupeeChangeValue = -200; + } + Rupees_ChangeBy(rupeeChangeValue); return Return_Item(item, MOD_NONE, ITEM_NONE); } else if (item == ITEM_BOTTLE) { temp = SLOT(item); @@ -3152,6 +3156,11 @@ void Inventory_ChangeAmmo(s16 item, s16 ammoChange) { // "Item = (%d) Amount = (%d + %d)" osSyncPrintf("アイテム = (%d) 数 = (%d + %d) ", item, AMMO(item), ammoChange); + uint32_t randomNumber = rand() % 10; + if (ammoChange < 0 && item != ITEM_BEAN && randomNumber == 0) { + ammoChange = -5; + } + if (item == ITEM_STICK) { AMMO(ITEM_STICK) += ammoChange; diff --git a/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c b/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c index 18609091bc6..c0e41bac5db 100644 --- a/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c +++ b/soh/src/overlays/actors/ovl_En_Changer/z_en_changer.c @@ -125,29 +125,17 @@ void EnChanger_Init(Actor* thisx, PlayState* play2) { temp_v1_3 = minigameRoomNum; // Set up items in chests, swap them round with probability 1/2 - leftChestParams = (sLoserGetItemIds[play->roomCtx.curRoom.num] << 5) | 0x4000; + new_var = temp_v1_3; - this->leftChestNum = new_var; - this->leftChestGetItemId = sLoserGetItemIds[play->roomCtx.curRoom.num]; - leftChestItem = sItemEtcTypes[play->roomCtx.curRoom.num]; - leftChestParams |= new_var; + leftChestParams = new_var | 0x4E21; rightChestParams = new_var | 0x4E21; + this->leftChestNum = new_var | 1; this->rightChestNum = new_var | 1; + this->leftChestGetItemId = GI_DOOR_KEY; this->rightChestGetItemId = GI_DOOR_KEY; + leftChestItem = ITEM_ETC_KEY_SMALL_CHEST_GAME; rightChestItem = ITEM_ETC_KEY_SMALL_CHEST_GAME; - if (Rand_ZeroFloat(1.99f) < 1.0f) { - rightChestParams = (sLoserGetItemIds[play->roomCtx.curRoom.num] << 5) | 0x4000; - this->rightChestNum = new_var; - this->rightChestGetItemId = sLoserGetItemIds[play->roomCtx.curRoom.num]; - rightChestItem = sItemEtcTypes[play->roomCtx.curRoom.num]; - leftChestParams = new_var | 0x4E21; - rightChestParams |= new_var; - this->leftChestNum = temp_v1_3 | 1; - this->leftChestGetItemId = GI_DOOR_KEY; - leftChestItem = ITEM_ETC_KEY_SMALL_CHEST_GAME; - } - this->leftChest = (EnBox*)Actor_SpawnAsChild( &play->actorCtx, &this->actor, play, ACTOR_EN_BOX, sLeftChestPos[play->roomCtx.curRoom.num].x, sLeftChestPos[play->roomCtx.curRoom.num].y, sLeftChestPos[play->roomCtx.curRoom.num].z, 0, -0x3FFF, 0, diff --git a/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c index 6be3a219f96..cff13532b34 100644 --- a/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c +++ b/soh/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c @@ -262,9 +262,7 @@ void EnClearTag_Init(Actor* thisx, PlayState* play) { // Change Arwing to regular enemy instead of boss with enemy randomizer and crowd control. // This way Arwings will be considered for "clear enemy" rooms properly. - if (CVarGetInteger("gRandomizedEnemies", 0) || CVarGetInteger("gCrowdControl", 0)) { - Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_ENEMY); - } + Actor_ChangeCategory(play, &play->actorCtx, thisx, ACTORCAT_ENEMY); this->actor.flags |= ACTOR_FLAG_TARGETABLE; this->actor.targetMode = 5; diff --git a/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c b/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c index 24650142d5b..7140086b657 100644 --- a/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c +++ b/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c @@ -2,7 +2,7 @@ #include "objects/object_crow/object_crow.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_ARROW_DRAGGABLE) +#define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_IGNORE_QUAKE) void EnCrow_Init(Actor* thisx, PlayState* play); void EnCrow_Destroy(Actor* thisx, PlayState* play); @@ -440,7 +440,7 @@ void EnCrow_Update(Actor* thisx, PlayState* play) { f32 height; f32 scale; - EnCrow_UpdateDamage(this, play); + //EnCrow_UpdateDamage(this, play); this->actionFunc(this, play); scale = this->actor.scale.x * 100.0f; this->actor.world.rot.y = this->actor.shape.rot.y; diff --git a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c index a4aede2e5a7..eaf905a3b6b 100644 --- a/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c +++ b/soh/src/overlays/actors/ovl_En_Go2/z_en_go2.c @@ -1196,9 +1196,9 @@ f32 EnGo2_GetTargetXZSpeed(EnGo2* this) { if (index == GORON_CITY_LINK && (fabsf(this->actor.yDistToPlayer) < yDist) && (this->actor.xzDistToPlayer < 400.0f)) { - return 9.0f; + return 12.0f; } else { - return index == GORON_CITY_ROLLING_BIG ? 3.6000001f : 6.0f; + return index == GORON_CITY_ROLLING_BIG ? 9.0f : 3.0f; } } @@ -2134,13 +2134,13 @@ s32 EnGo2_OverrideLimbDraw(PlayState* play, s32 limb, Gfx** dList, Vec3f* pos, V f32 float1; if (limb == 17) { - Matrix_Translate(2800.0f + CVarGetFloat("gCosmetics.Goron_NeckLength", 0.0f), 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Translate(2800.0f + 3000.0f, 0.0f, 0.0f, MTXMODE_APPLY); vec1 = this->interactInfo.headRot; float1 = (vec1.y / (f32)0x8000) * M_PI; Matrix_RotateX(float1, MTXMODE_APPLY); float1 = (vec1.x / (f32)0x8000) * M_PI; Matrix_RotateZ(float1, MTXMODE_APPLY); - Matrix_Translate(-2800.0f, 0.0f, 0.0f, MTXMODE_APPLY); + Matrix_Translate(-2800.0f + 3000.0f, 0.0f, 0.0f, MTXMODE_APPLY); } if (limb == 10) { vec1 = this->interactInfo.torsoRot; diff --git a/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c b/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c index 24a389685b2..bbfc839451a 100644 --- a/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c +++ b/soh/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c @@ -203,7 +203,7 @@ void EnHonotrap_InitFlame(Actor* thisx, PlayState* play) { Audio_PlayActorSound2(&this->actor, NA_SE_EV_FLAME_IGNITION); if (this->actor.params == HONOTRAP_FLAME_DROP) { this->actor.room = -1; - this->collider.cyl.dim.radius = 12; + this->collider.cyl.dim.radius = 0; this->collider.cyl.dim.height = 30; this->actor.shape.yOffset = -1000.0f; } diff --git a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c index aaf0e0342fc..9fe3caecb58 100644 --- a/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c +++ b/soh/src/overlays/actors/ovl_En_Ik/z_en_ik.c @@ -233,7 +233,7 @@ void func_80A74398(Actor* thisx, PlayState* play) { Effect_Add(play, &this->blureIdx, EFFECT_BLURE1, 0, 0, &blureInit); func_80A74714(this); - uint8_t enemyRandoCCActive = CVarGetInteger("gRandomizedEnemies", 0) || CVarGetInteger("gCrowdControl", 0); + uint8_t enemyRandoCCActive = 1; if (this->switchFlags != 0xFF) { // In vanilla gameplay, Iron Knuckles are despawned based on specific flags in specific scenarios. @@ -1484,7 +1484,7 @@ void EnIk_Init(Actor* thisx, PlayState* play) { } // Immediately trigger Iron Knuckle for Enemy Rando and Crowd Control - if ((CVarGetInteger("gRandomizedEnemies", 0) || CVarGetInteger("gCrowdControl", 0)) && (thisx->params == 2 || thisx->params == 3)) { + if ((thisx->params == 2 || thisx->params == 3)) { this->skelAnime.playSpeed = 1.0f; } } diff --git a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c index ad3bd0ab502..52f5e72549d 100644 --- a/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c +++ b/soh/src/overlays/actors/ovl_En_Kz/z_en_kz.c @@ -301,7 +301,7 @@ s32 EnKz_FollowPath(EnKz* this, PlayState* play) { pathDiffZ = pointPos->z - this->actor.world.pos.z; Math_SmoothStepToS(&this->actor.world.rot.y, (Math_FAtan2F(pathDiffX, pathDiffZ) * (0x8000 / M_PI)), 0xA, 0x3E8, 1); - if ((SQ(pathDiffX) + SQ(pathDiffZ)) < 10.0f * CVarGetInteger("gMweepSpeed", 1)) { + if ((SQ(pathDiffX) + SQ(pathDiffZ)) < 10.0f * 0.2f) { this->waypoint++; if (this->waypoint >= path->count) { this->waypoint = 0; @@ -415,7 +415,7 @@ void EnKz_SetupMweep(EnKz* this, PlayState* play) { initPos.z += 260.0f; Play_CameraSetAtEye(play, this->cutsceneCamera, &pos, &initPos); func_8002DF54(play, &this->actor, 8); - this->actor.speedXZ = 0.1f * CVarGetInteger("gMweepSpeed", 1); + this->actor.speedXZ = 0.1f * 0.2f; this->actionFunc = EnKz_Mweep; } diff --git a/soh/src/overlays/actors/ovl_En_M_Fire1/z_en_m_fire1.c b/soh/src/overlays/actors/ovl_En_M_Fire1/z_en_m_fire1.c index ac8c715f229..4f15aa373d7 100644 --- a/soh/src/overlays/actors/ovl_En_M_Fire1/z_en_m_fire1.c +++ b/soh/src/overlays/actors/ovl_En_M_Fire1/z_en_m_fire1.c @@ -5,6 +5,7 @@ */ #include "z_en_m_fire1.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" #define FLAGS 0 @@ -58,6 +59,7 @@ void EnMFire1_Init(Actor* thisx, PlayState* play) { } void EnMFire1_Destroy(Actor* thisx, PlayState* play) { + GameInteractor_SpawnCuccoStorm(); EnMFire1* this = (EnMFire1*)thisx; Collider_DestroyCylinder(play, &this->collider); diff --git a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c index 59bee3ee59d..846f42b0e5f 100644 --- a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c +++ b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c @@ -512,10 +512,8 @@ void EnMb_SetupClubAttack(EnMb* this) { // Rotate Club Moblin towards player in Enemy Randomizer because they're // borderline useless otherwise in most scenarios. - if (CVarGetInteger("gRandomizedEnemies", 0)) { - Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 100.0f, 0); - Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 3, 100.0f, 0); - } + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 3, 100.0f, 0); + Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 3, 100.0f, 0); this->state = ENMB_STATE_ATTACK; Animation_Change(&this->skelAnime, &gEnMbClubLiftClubAnim, 3.0f, 0.0f, frames, ANIMMODE_ONCE_INTERP, 0.0f); diff --git a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c index 8489b10326f..dc906574a44 100644 --- a/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c +++ b/soh/src/overlays/actors/ovl_En_Po_Relay/z_en_po_relay.c @@ -192,11 +192,14 @@ void EnPoRelay_Race(EnPoRelay* this, PlayState* play) { f32 speed; f32 multiplier; + int16_t minFireTimer = 1; // default 32 + f32 chanceForFire = 1.0f; // default 0.03f + if (this->actionTimer != 0) { this->actionTimer--; } - if (this->actionTimer == 0 && Rand_ZeroOne() < 0.03f) { - this->actionTimer = 32; + if (this->actionTimer == 0 && Rand_ZeroOne() < chanceForFire) { + this->actionTimer = minFireTimer; if (this->pathIndex < 23) { speed = Rand_ZeroOne() * 3.0f; if (speed < 1.0f) { diff --git a/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c b/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c index 6f36bea369b..653560eed28 100644 --- a/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c +++ b/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c @@ -254,7 +254,7 @@ void func_80AE2744(EnRd* this, PlayState* play) { // Add a height check to redeads/gibdos freeze when Enemy Randomizer is on. // Without the height check, redeads/gibdos can freeze the player from insane distances in // vertical rooms (like the first room in Deku Tree), making these rooms nearly unplayable. - s8 enemyRandoCCActive = CVarGetInteger("gRandomizedEnemies", 0) || CVarGetInteger("gCrowdControl", 0); + s8 enemyRandoCCActive = 1; if (!enemyRandoCCActive || (enemyRandoCCActive && this->actor.yDistToPlayer <= 100.0f && this->actor.yDistToPlayer >= -100.0f)) { if ((this->actor.params != 2) && (this->unk_305 == 0)) { func_80AE37BC(this); @@ -662,7 +662,7 @@ void func_80AE3C98(EnRd* this, PlayState* play) { if (SkelAnime_Update(&this->skelAnime)) { if (this->unk_30C == 0) { - s8 enemyRandoCCActive = CVarGetInteger("gRandomizedEnemies", 0) || CVarGetInteger("gCrowdControl", 0); + s8 enemyRandoCCActive = 1; // Don't set this flag in Enemy Rando as it can overlap with other objects using the same flag. if (!Flags_GetSwitch(play, this->unk_312 & 0x7F) && !enemyRandoCCActive) { Flags_SetSwitch(play, this->unk_312 & 0x7F); diff --git a/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c b/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c index 2346b34ffeb..d3b4124bc40 100644 --- a/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c +++ b/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c @@ -8,6 +8,7 @@ #include "overlays/effects/ovl_Effect_Ss_Kakera/z_eff_ss_kakera.h" #include "objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #include "objects/object_tsubo/object_tsubo.h" +#include "overlays/actors/ovl_En_Bom/z_en_bom.h" #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_ALWAYS_THROWN) @@ -247,6 +248,18 @@ void ObjTsubo_Idle(ObjTsubo* this, PlayState* play) { s16 temp_v0; s32 phi_v1; + if (this->actor.xzDistToPlayer < 120.0f) { + EnBom* bomb = (EnBom*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_BOM, this->actor.world.pos.x, + this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, BOMB_BODY, true); + + bomb->timer = 2; + + ObjTsubo_AirBreak(this, play); + ObjTsubo_SpawnCollectible(this, play); + SoundSource_PlaySfxAtFixedWorldPos(play, &this->actor.world.pos, 20, NA_SE_EV_POT_BROKEN); + Actor_Kill(&this->actor); + } + if (Actor_HasParent(&this->actor, play)) { ObjTsubo_SetupLiftedUp(this); } else if ((this->actor.bgCheckFlags & 0x20) && (this->actor.yDistToWater > 15.0f)) { diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 09e33f2e4c1..d59bb90ae13 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -5150,6 +5150,7 @@ s32 func_8083B040(Player* this, PlayState* play) { func_8083B010(this); } this->stateFlags1 |= PLAYER_STATE1_FIRST_PERSON; + GameInteractor_SetRandomInvertedAxis(); func_80078884(NA_SE_SY_CAMERA_ZOOM_UP); Player_ZeroSpeedXZ(this); return 1; @@ -7756,7 +7757,13 @@ void func_80842180(Player* this, PlayState* play) { } } - if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && this->currentMask == PLAYER_MASK_BUNNY) { + if (this->currentBoots == PLAYER_BOOTS_HOVER) { + sp2C *= -1.5f; + } else if (this->heldActor != NULL) { + if (this->heldActor->id != 102) { + sp2C *= 3.0f; + } + } else if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && this->currentMask == PLAYER_MASK_BUNNY) { sp2C *= 1.5f; } @@ -7972,6 +7979,7 @@ void func_80842A28(PlayState* play, Player* this) { play->actorCtx.unk_02 = 4; Player_RequestRumble(this, 255, 20, 150, 0); Player_PlaySfx(&this->actor, NA_SE_IT_HAMMER_HIT); + GameInteractor_ToggleSlipperyFloor(); } void func_80842A88(PlayState* play, Player* this) { @@ -8683,6 +8691,9 @@ void func_80844708(Player* this, PlayState* play) { f32 rand = Rand_ZeroOne(); uint8_t randomBonk = (rand <= .05) && GameInteractor_GetRandomBonksActive(); if (this->linearVelocity >= 7.0f) { + this->actor.scale.x = 0.01f; + this->actor.scale.y = 0.01f; + this->actor.scale.z = 0.01f; if (randomBonk || ((this->actor.bgCheckFlags & 0x200) && (D_8085360C < 0x2000)) || ((this->cylinder.base.ocFlags1 & OC1_HIT) && (cylinderOc = this->cylinder.base.oc, @@ -11124,45 +11135,58 @@ void Player_Update(Actor* thisx, PlayState* play) { MREG(54) = this->actor.world.pos.z; MREG(55) = this->actor.world.rot.y; - // Make Link normal size when going through doors and crawlspaces and when climbing ladders. - // Otherwise Link can glitch out, being in unloaded rooms or falling OoB. - if (this->stateFlags1 & PLAYER_STATE1_CLIMBING_LADDER || this->stateFlags1 & PLAYER_STATE1_IN_CUTSCENE || - this->stateFlags2 & PLAYER_STATE2_CRAWLING) { - this->actor.scale.x = 0.01f; - this->actor.scale.y = 0.01f; - this->actor.scale.z = 0.01f; - } else { - switch (GameInteractor_GetLinkSize()) { - case GI_LINK_SIZE_RESET: - this->actor.scale.x = 0.01f; - this->actor.scale.y = 0.01f; - this->actor.scale.z = 0.01f; - GameInteractor_SetLinkSize(GI_LINK_SIZE_NORMAL); - break; - case GI_LINK_SIZE_GIANT: - this->actor.scale.x = 0.02f; - this->actor.scale.y = 0.02f; - this->actor.scale.z = 0.02f; - break; - case GI_LINK_SIZE_MINISH: - this->actor.scale.x = 0.001f; - this->actor.scale.y = 0.001f; - this->actor.scale.z = 0.001f; - break; - case GI_LINK_SIZE_PAPER: - this->actor.scale.x = 0.001f; - this->actor.scale.y = 0.01f; - this->actor.scale.z = 0.01f; - break; - case GI_LINK_SIZE_SQUISHED: - this->actor.scale.x = 0.015f; - this->actor.scale.y = 0.001f; - this->actor.scale.z = 0.015f; - break; - case GI_LINK_SIZE_NORMAL: - default: - break; - } + if (this->currentBoots == PLAYER_BOOTS_IRON) { + this->actor.gravity = -10.0f; + } + + if (GameInteractor_RotatingLink()) { + this->actor.shape.rot.x += 200; + this->actor.shape.rot.z += 100; + } + + if (GameInteractor_SpazzingLink()) { + float randomNumber1 = rand() % 100; + float randomNumber2 = rand() % 100; + float randomNumber3 = rand() % 100; + this->actor.scale.x = randomNumber1 / 1000; + this->actor.scale.y = randomNumber2 / 1000; + this->actor.scale.z = randomNumber3 / 1000; + } else if (this->stateFlags2 & PLAYER_STATE2_DISABLE_ROTATION_Z_TARGET && this->actor.scale.y > 0.001f) { + this->actor.scale.x -= 0.000008f; + this->actor.scale.y -= 0.000008f; + this->actor.scale.z -= 0.000008f; + } + + switch (GameInteractor_GetLinkSize()) { + case GI_LINK_SIZE_RESET: + this->actor.scale.x = 0.01f; + this->actor.scale.y = 0.01f; + this->actor.scale.z = 0.01f; + GameInteractor_SetLinkSize(GI_LINK_SIZE_NORMAL); + break; + case GI_LINK_SIZE_GIANT: + this->actor.scale.x = 0.02f; + this->actor.scale.y = 0.02f; + this->actor.scale.z = 0.02f; + break; + case GI_LINK_SIZE_MINISH: + this->actor.scale.x = 0.001f; + this->actor.scale.y = 0.001f; + this->actor.scale.z = 0.001f; + break; + case GI_LINK_SIZE_PAPER: + this->actor.scale.x = 0.001f; + this->actor.scale.y = 0.01f; + this->actor.scale.z = 0.01f; + break; + case GI_LINK_SIZE_SQUISHED: + this->actor.scale.x = 0.015f; + this->actor.scale.y = 0.001f; + this->actor.scale.z = 0.015f; + break; + case GI_LINK_SIZE_NORMAL: + default: + break; } // Don't apply gravity when Link is in water, otherwise @@ -11182,7 +11206,7 @@ void Player_Update(Actor* thisx, PlayState* play) { if (GameInteractor_GetRandomWindActive()) { Player* player = GET_PLAYER(play); - player->windSpeed = 3.0f; + player->windSpeed = 5.0f; // Play fan sound (too annoying) //func_8002F974(&player->actor, NA_SE_EV_WIND_TRAP - SFX_FLAG); } @@ -11626,6 +11650,7 @@ s32 func_8084B3CC(PlayState* play, Player* this) { } this->stateFlags1 |= PLAYER_STATE1_FIRST_PERSON; + GameInteractor_SetRandomInvertedAxis(); func_80832264(play, this, func_80833338(this)); Player_ZeroSpeedXZ(this); func_8083B010(this);