Merge pull request #3294 from HarbourMasters/develop

develop -> develop-rando (10/16/23) 2: Electric Boogaloo
This commit is contained in:
Garrett Cox 2023-10-16 09:22:39 -05:00 committed by GitHub
commit 8357c2aa1b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 137 additions and 76 deletions

View file

@ -309,8 +309,8 @@ static const ALIGN_ASSET(2) char gLinkAdultHookshotDesignTex[] = dgLinkAdultHook
#define dgLinkAdultHookshotChainTex "__OTR__objects/object_link_boy/gLinkAdultHookshotChainTex" #define dgLinkAdultHookshotChainTex "__OTR__objects/object_link_boy/gLinkAdultHookshotChainTex"
static const ALIGN_ASSET(2) char gLinkAdultHookshotChainTex[] = dgLinkAdultHookshotChainTex; static const ALIGN_ASSET(2) char gLinkAdultHookshotChainTex[] = dgLinkAdultHookshotChainTex;
#define dgLinkAdultHookshotRedicleVtx "__OTR__objects/object_link_boy/gLinkAdultHookshotRedicleVtx" #define dgLinkAdultHookshotReticleVtx "__OTR__objects/object_link_boy/gLinkAdultHookshotReticleVtx"
static const ALIGN_ASSET(2) char gLinkAdultHookshotRedicleVtx[] = dgLinkAdultHookshotRedicleVtx; static const ALIGN_ASSET(2) char gLinkAdultHookshotReticleVtx[] = dgLinkAdultHookshotReticleVtx;
#define dgLinkAdultHookshotReticleTex "__OTR__objects/object_link_boy/gLinkAdultHookshotReticleTex" #define dgLinkAdultHookshotReticleTex "__OTR__objects/object_link_boy/gLinkAdultHookshotReticleTex"
static const ALIGN_ASSET(2) char gLinkAdultHookshotReticleTex[] = dgLinkAdultHookshotReticleTex; static const ALIGN_ASSET(2) char gLinkAdultHookshotReticleTex[] = dgLinkAdultHookshotReticleTex;

View file

@ -209,7 +209,7 @@
<Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/> <Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/>
<Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/> <Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/>
<Array Name="gLinkAdultHookshotRedicleVtx" Count="3" Offset="0x2CB18"> <Array Name="gLinkAdultHookshotReticleVtx" Count="3" Offset="0x2CB18">
<Vtx/> <Vtx/>
</Array> </Array>

View file

@ -209,7 +209,7 @@
<Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/> <Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/>
<Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/> <Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/>
<Array Name="gLinkAdultHookshotRedicleVtx" Count="3" Offset="0x2CB18"> <Array Name="gLinkAdultHookshotReticleVtx" Count="3" Offset="0x2CB18">
<Vtx/> <Vtx/>
</Array> </Array>

View file

@ -209,7 +209,7 @@
<Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/> <Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/>
<Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/> <Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/>
<Array Name="gLinkAdultHookshotRedicleVtx" Count="3" Offset="0x2CB18"> <Array Name="gLinkAdultHookshotReticleVtx" Count="3" Offset="0x2CB18">
<Vtx/> <Vtx/>
</Array> </Array>

View file

@ -209,7 +209,7 @@
<Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/> <Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/>
<Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/> <Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/>
<Array Name="gLinkAdultHookshotRedicleVtx" Count="3" Offset="0x2CB18"> <Array Name="gLinkAdultHookshotReticleVtx" Count="3" Offset="0x2CB18">
<Vtx/> <Vtx/>
</Array> </Array>

View file

@ -209,7 +209,7 @@
<Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/> <Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/>
<Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/> <Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/>
<Array Name="gLinkAdultHookshotRedicleVtx" Count="3" Offset="0x2CB18"> <Array Name="gLinkAdultHookshotReticleVtx" Count="3" Offset="0x2CB18">
<Vtx/> <Vtx/>
</Array> </Array>

View file

@ -209,7 +209,7 @@
<Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/> <Texture Name="gLinkAdultGauntletPlate1Tex" OutName="gauntlet_plate_1" Format="rgba16" Width="16" Height="32" Offset="0x9980"/>
<Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/> <Texture Name="gLinkAdultGauntletPlate2Tex" OutName="gauntlet_plate_2" Format="rgba16" Width="32" Height="32" Offset="0x9D80"/>
<Array Name="gLinkAdultHookshotRedicleVtx" Count="3" Offset="0x2CB18"> <Array Name="gLinkAdultHookshotReticleVtx" Count="3" Offset="0x2CB18">
<Vtx/> <Vtx/>
</Array> </Array>

View file

@ -1,7 +1,7 @@
<Root> <Root>
<File Name="ovl_Boss_Ganon" BaseAddress="0x809F2C80" RangeStart="0xE388" RangeEnd="0x211D8"> <File Name="ovl_Boss_Ganon" BaseAddress="0x809F2C80" RangeStart="0xE388" RangeEnd="0x211D8">
<Texture Name="ovl_Boss_GanonTex_00E748" OutName="ovl_Boss_GanonTex_00E748" Format="i8" Width="64" Height="64" Offset="0xE418" AddedByScript="true"/> <Texture Name="ovl_Boss_GanonTex_00E748" OutName="ovl_Boss_GanonTex_00E748" Format="i8" Width="64" Height="64" Offset="0xE418" AddedByScript="true"/>
<Texture Name="ovl_Boss_GanonTex_00F848" OutName="ovl_Boss_GanonTex_00F848" Format="ci8" Width="32" Height="32" Offset="0xF518" TluOffset="0xF4D8" AddedByScript="true"/> <Texture Name="ovl_Boss_GanonTex_00F848" OutName="ovl_Boss_GanonTex_00F848" Format="ci8" Width="32" Height="32" Offset="0xF518" TlutOffset="0xF4D8" AddedByScript="true"/>
<Texture Name="ovl_Boss_GanonTex_010538" OutName="ovl_Boss_GanonTex_010538" Format="i8" Width="64" Height="64" Offset="0x10208" AddedByScript="true"/> <Texture Name="ovl_Boss_GanonTex_010538" OutName="ovl_Boss_GanonTex_010538" Format="i8" Width="64" Height="64" Offset="0x10208" AddedByScript="true"/>
<Texture Name="ovl_Boss_GanonTex_01A7B0" OutName="ovl_Boss_GanonTex_01A7B0" Format="ia16" Width="32" Height="32" Offset="0x1A480" AddedByScript="true"/> <Texture Name="ovl_Boss_GanonTex_01A7B0" OutName="ovl_Boss_GanonTex_01A7B0" Format="ia16" Width="32" Height="32" Offset="0x1A480" AddedByScript="true"/>
<Texture Name="ovl_Boss_GanonTex_01AFB0" OutName="ovl_Boss_GanonTex_01AFB0" Format="i4" Width="64" Height="64" Offset="0x1AC80" AddedByScript="true"/> <Texture Name="ovl_Boss_GanonTex_01AFB0" OutName="ovl_Boss_GanonTex_01AFB0" Format="i4" Width="64" Height="64" Offset="0x1AC80" AddedByScript="true"/>

View file

@ -1,5 +1,5 @@
<Root> <Root>
<File Name="ovl_Oceff_Spot" BaseAddress="0x80BA6070" RangeStart="0x780" RangeEnd="0xE58"> <File Name="ovl_Oceff_Spot" BaseAddress="0x80B1AA20" RangeStart="0x780" RangeEnd="0xE58">
<Texture Name="sTex" OutName="sun_song_effect" Format="i8" Width="32" Height="32" Offset="0x780"/> <Texture Name="sTex" OutName="sun_song_effect" Format="i8" Width="32" Height="32" Offset="0x780"/>
<Array Name="sCylinderVtx" Count="27" Offset="0xB80"> <Array Name="sCylinderVtx" Count="27" Offset="0xB80">
<Vtx/> <Vtx/>

View file

@ -46,6 +46,7 @@ extern PlayState* gPlayState;
#include "overlays/ovl_Boss_Ganon2/ovl_Boss_Ganon2.h" #include "overlays/ovl_Boss_Ganon2/ovl_Boss_Ganon2.h"
#include "objects/object_gjyo_objects/object_gjyo_objects.h" #include "objects/object_gjyo_objects/object_gjyo_objects.h"
#include "textures/nintendo_rogo_static/nintendo_rogo_static.h" #include "textures/nintendo_rogo_static/nintendo_rogo_static.h"
#include "objects/object_gi_rabit_mask/object_gi_rabit_mask.h"
void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction); void ResourceMgr_PatchGfxByName(const char* path, const char* patchName, int index, Gfx instruction);
void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const char* patchName, int destinationIndex, int sourceIndex); void ResourceMgr_PatchGfxCopyCommandByName(const char* path, const char* patchName, int destinationIndex, int sourceIndex);
void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName);
@ -228,6 +229,7 @@ static std::map<std::string, CosmeticOption> cosmeticOptions = {
COSMETIC_OPTION("Equipment_BowHandle", "Bow Handle", GROUP_EQUIPMENT, ImVec4( 50, 150, 255, 255), false, true, true), COSMETIC_OPTION("Equipment_BowHandle", "Bow Handle", GROUP_EQUIPMENT, ImVec4( 50, 150, 255, 255), false, true, true),
COSMETIC_OPTION("Equipment_ChuFace", "Bombchu Face", GROUP_EQUIPMENT, ImVec4( 0, 100, 150, 255), false, true, true), COSMETIC_OPTION("Equipment_ChuFace", "Bombchu Face", GROUP_EQUIPMENT, ImVec4( 0, 100, 150, 255), false, true, true),
COSMETIC_OPTION("Equipment_ChuBody", "Bombchu Body", GROUP_EQUIPMENT, ImVec4(180, 130, 50, 255), false, true, true), COSMETIC_OPTION("Equipment_ChuBody", "Bombchu Body", GROUP_EQUIPMENT, ImVec4(180, 130, 50, 255), false, true, true),
COSMETIC_OPTION("Equipment_BunnyHood", "Bunny Hood", GROUP_EQUIPMENT, ImVec4(255, 235, 109, 255), false, true, true),
COSMETIC_OPTION("Consumable_Hearts", "Hearts", GROUP_CONSUMABLE, ImVec4(255, 70, 50, 255), false, true, false), COSMETIC_OPTION("Consumable_Hearts", "Hearts", GROUP_CONSUMABLE, ImVec4(255, 70, 50, 255), false, true, false),
COSMETIC_OPTION("Consumable_HeartBorder", "Heart Border", GROUP_CONSUMABLE, ImVec4( 50, 40, 60, 255), false, true, true), COSMETIC_OPTION("Consumable_HeartBorder", "Heart Border", GROUP_CONSUMABLE, ImVec4( 50, 40, 60, 255), false, true, true),
@ -916,6 +918,26 @@ void ApplyOrResetCustomGfxPatches(bool manualChange) {
PATCH_GFX(gBombchuDL, "Equipment_ChuBody5", equipmentChuBody.changedCvar, 46, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255)); PATCH_GFX(gBombchuDL, "Equipment_ChuBody5", equipmentChuBody.changedCvar, 46, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255));
} }
static CosmeticOption& equipmentBunnyHood = cosmeticOptions.at("Equipment_BunnyHood");
if (manualChange || CVarGetInteger(equipmentBunnyHood.rainbowCvar, 0)) {
static Color_RGBA8 defaultColor = {equipmentBunnyHood.defaultColor.x, equipmentBunnyHood.defaultColor.y, equipmentBunnyHood.defaultColor.z, equipmentBunnyHood.defaultColor.w};
Color_RGBA8 color = CVarGetColor(equipmentBunnyHood.cvar, defaultColor);
PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood1", equipmentBunnyHood.changedCvar, 5, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255));
PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood2", equipmentBunnyHood.changedCvar, 6, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255));
PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood3", equipmentBunnyHood.changedCvar, 83, gsDPSetPrimColor(0, 0, color.r, color.g, color.b, 255));
PATCH_GFX(gGiBunnyHoodDL, "Equipment_BunnyHood4", equipmentBunnyHood.changedCvar, 84, gsDPSetEnvColor(color.r / 3, color.g / 3, color.b / 3, 255));
PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood5", equipmentBunnyHood.changedCvar, 4, gsDPSetGrayscaleColor(color.r, color.g, color.b, 255));
if (manualChange) {
PATCH_GFX(gLinkChildBunnyHoodDL, "Equipment_BunnyHood6", equipmentBunnyHood.changedCvar, 13, gsSPGrayscale(true));
if (CVarGetInteger(equipmentBunnyHood.changedCvar, 0)) {
ResourceMgr_PatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7", 125, gsSPBranchListOTRFilePath(gEndGrayscaleAndEndDlistDL));
} else {
ResourceMgr_UnpatchGfxByName(gLinkChildBunnyHoodDL, "Equipment_BunnyHood7");
}
}
}
static CosmeticOption& consumableGreenRupee = cosmeticOptions.at("Consumable_GreenRupee"); static CosmeticOption& consumableGreenRupee = cosmeticOptions.at("Consumable_GreenRupee");
if (manualChange || CVarGetInteger(consumableGreenRupee.rainbowCvar, 0)) { if (manualChange || CVarGetInteger(consumableGreenRupee.rainbowCvar, 0)) {
static Color_RGBA8 defaultColor = {consumableGreenRupee.defaultColor.x, consumableGreenRupee.defaultColor.y, consumableGreenRupee.defaultColor.z, consumableGreenRupee.defaultColor.w}; static Color_RGBA8 defaultColor = {consumableGreenRupee.defaultColor.x, consumableGreenRupee.defaultColor.y, consumableGreenRupee.defaultColor.z, consumableGreenRupee.defaultColor.w};

View file

@ -1694,6 +1694,10 @@ void DrawPlayerTab() {
ImU16 one = 1; ImU16 one = 1;
ImGui::PushItemWidth(ImGui::GetFontSize() * 6); ImGui::PushItemWidth(ImGui::GetFontSize() * 6);
DrawGroupWithBorder([&]() { DrawGroupWithBorder([&]() {
ImGui::Text("Current B Item");
ImGui::InputScalar("B Button", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[0], &one, NULL);
ImGui::NewLine();
ImGui::Text("Current C Equips"); ImGui::Text("Current C Equips");
ImGui::InputScalar("C Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[1], &one, NULL); ImGui::InputScalar("C Left", ImGuiDataType_U8, &gSaveContext.equips.buttonItems[1], &one, NULL);
ImGui::SameLine(); ImGui::SameLine();

View file

@ -42,8 +42,8 @@ bool performSave = false;
void ReloadSceneTogglingLinkAge() { void ReloadSceneTogglingLinkAge() {
gPlayState->nextEntranceIndex = gSaveContext.entranceIndex; gPlayState->nextEntranceIndex = gSaveContext.entranceIndex;
gPlayState->sceneLoadFlag = 0x14; gPlayState->sceneLoadFlag = 0x14;
gPlayState->fadeTransition = 11; gPlayState->fadeTransition = 42; // Fade Out
gSaveContext.nextTransitionType = 11; gSaveContext.nextTransitionType = 42;
gPlayState->linkAgeOnLoad ^= 1; // toggle linkAgeOnLoad gPlayState->linkAgeOnLoad ^= 1; // toggle linkAgeOnLoad
} }

View file

@ -74,6 +74,7 @@ const std::vector<const char*> enhancementsCvars = {
"gNoForcedNavi", "gNoForcedNavi",
"gSkulltulaFreeze", "gSkulltulaFreeze",
"gMMBunnyHood", "gMMBunnyHood",
"gAdultBunnyHood",
"gFastChests", "gFastChests",
"gChestSizeAndTextureMatchesContents", "gChestSizeAndTextureMatchesContents",
"gFastDrops", "gFastDrops",
@ -545,6 +546,8 @@ const std::vector<PresetEntry> enhancedPresetEntries = {
PRESET_ENTRY_S32("gSkulltulaFreeze", 1), PRESET_ENTRY_S32("gSkulltulaFreeze", 1),
// MM Bunny Hood // MM Bunny Hood
PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST_AND_JUMP), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST_AND_JUMP),
// Adult Bunny Hood
PRESET_ENTRY_S32("gAdultBunnyHood", 1),
// Fast Chests // Fast Chests
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
// Fast Drops // Fast Drops
@ -665,6 +668,8 @@ const std::vector<PresetEntry> randomizerPresetEntries = {
PRESET_ENTRY_S32("gSkulltulaFreeze", 1), PRESET_ENTRY_S32("gSkulltulaFreeze", 1),
// MM Bunny Hood // MM Bunny Hood
PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST_AND_JUMP), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST_AND_JUMP),
// Adult Bunny Hood
PRESET_ENTRY_S32("gAdultBunnyHood", 1),
// Fast Chests // Fast Chests
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
// Fast Drops // Fast Drops
@ -763,6 +768,7 @@ const std::vector<PresetEntry> spockRacePresetEntries = {
PRESET_ENTRY_S32("gInstantPutaway", 1), PRESET_ENTRY_S32("gInstantPutaway", 1),
PRESET_ENTRY_S32("gFastBoomerang", 1), PRESET_ENTRY_S32("gFastBoomerang", 1),
PRESET_ENTRY_S32("gDpadNoDropOcarinaInput", 1), PRESET_ENTRY_S32("gDpadNoDropOcarinaInput", 1),
PRESET_ENTRY_S32("gAdultBunnyHood", 1),
PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST),
PRESET_ENTRY_S32("gSeparateArrows", 1), PRESET_ENTRY_S32("gSeparateArrows", 1),
PRESET_ENTRY_S32("gAssignableTunicsAndBoots", 1), PRESET_ENTRY_S32("gAssignableTunicsAndBoots", 1),
@ -835,6 +841,7 @@ const std::vector<PresetEntry> spockRacePresetEntries = {
}; };
const std::vector<PresetEntry> spockRaceNoLogicPresetEntries = { const std::vector<PresetEntry> spockRaceNoLogicPresetEntries = {
PRESET_ENTRY_S32("gAdultBunnyHood", 1),
PRESET_ENTRY_S32("gAdultMinimumWeightFish", 6), PRESET_ENTRY_S32("gAdultMinimumWeightFish", 6),
PRESET_ENTRY_S32("gAssignableTunicsAndBoots", 1), PRESET_ENTRY_S32("gAssignableTunicsAndBoots", 1),
PRESET_ENTRY_S32("gCheatEasyPauseBufferEnabled", 1), PRESET_ENTRY_S32("gCheatEasyPauseBufferEnabled", 1),
@ -945,6 +952,7 @@ const std::vector<PresetEntry> s6PresetEntries = {
PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH), PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH),
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST),
PRESET_ENTRY_S32("gAdultBunnyHood", 1),
PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1), PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1),
PRESET_ENTRY_S32("gRandomizeCuccosToReturn", 4), PRESET_ENTRY_S32("gRandomizeCuccosToReturn", 4),
PRESET_ENTRY_S32("gRandomizeDoorOfTime", RO_DOOROFTIME_OPEN), PRESET_ENTRY_S32("gRandomizeDoorOfTime", RO_DOOROFTIME_OPEN),
@ -978,6 +986,7 @@ const std::vector<PresetEntry> hellModePresetEntries = {
PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH), PRESET_ENTRY_S32("gChestSizeAndTextureMatchesContents", CSMC_BOTH),
PRESET_ENTRY_S32("gFastChests", 1), PRESET_ENTRY_S32("gFastChests", 1),
PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST), PRESET_ENTRY_S32("gMMBunnyHood", BUNNY_HOOD_FAST),
PRESET_ENTRY_S32("gAdultBunnyHood", 1),
PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1), PRESET_ENTRY_S32("gRandomizeBigPoeTargetCount", 1),
PRESET_ENTRY_S32("gRandomizeBlueFireArrows", 1), PRESET_ENTRY_S32("gRandomizeBlueFireArrows", 1),
PRESET_ENTRY_S32("gRandomizeBossKeysanity", RO_DUNGEON_ITEM_LOC_ANYWHERE), PRESET_ENTRY_S32("gRandomizeBossKeysanity", RO_DUNGEON_ITEM_LOC_ANYWHERE),

View file

@ -28,12 +28,12 @@ void HintTable_Init() {
hintTable[PREFIX] = hintTable[PREFIX] =
HintText::Exclude({ Text{ "They say that ", /*french*/ "Selon moi, ", /*spanish*/ "Según dicen, " } }); HintText::Exclude({ Text{ "They say that ", /*french*/ "Selon moi, ", /*spanish*/ "Según dicen, " } });
hintTable[WAY_OF_THE_HERO] = hintTable[WAY_OF_THE_HERO] =
HintText::Exclude({ Text{ " is on the way of the hero.", /*french*/ " est sur la voie du héros.", HintText::Exclude({ Text{ " is on %cthe way of the hero%w.", /*french*/ " est sur %cla voie du héros%w.",
/*spanish*/ " conduce a la senda del héroe." } }); /*spanish*/ " conduce a la senda del héroe." } });
hintTable[PLUNDERING] = hintTable[PLUNDERING] =
HintText::Exclude({ Text{ "plundering ", /*french*/ "explorer ", /*spanish*/ "inspeccionar " } }); HintText::Exclude({ Text{ "plundering ", /*french*/ "explorer ", /*spanish*/ "inspeccionar " } });
hintTable[FOOLISH] = HintText::Exclude( hintTable[FOOLISH] = HintText::Exclude(
{ Text{ " is a foolish choice.", /*french*/ " est futile.", /*spanish*/ " no es una sabia decisión." } }); { Text{ " is %pa foolish choice%w.", /*french*/ " est %pfutile%w.", /*spanish*/ " no es una sabia decisión." } });
hintTable[CAN_BE_FOUND_AT] = hintTable[CAN_BE_FOUND_AT] =
HintText::Exclude({ Text{ "can be found at", /*french*/ "se trouve dans", /*spanish*/ "aguarda en" } }); HintText::Exclude({ Text{ "can be found at", /*french*/ "se trouve dans", /*spanish*/ "aguarda en" } });
hintTable[HOARDS] = HintText::Exclude({ Text{ "hoards", /*french*/ "recèle", /*spanish*/ "acapara" } }); hintTable[HOARDS] = HintText::Exclude({ Text{ "hoards", /*french*/ "recèle", /*spanish*/ "acapara" } });

View file

@ -314,7 +314,7 @@ static void CreateLocationHint(const std::vector<uint32_t>& possibleHintLocation
Text itemHintText = Location(hintedLocation)->GetPlacedItem().GetHint().GetText(); Text itemHintText = Location(hintedLocation)->GetPlacedItem().GetHint().GetText();
Text prefix = Hint(PREFIX).GetText(); Text prefix = Hint(PREFIX).GetText();
Text finalHint = prefix + locationHintText + " #"+itemHintText+"#."; Text finalHint = prefix + "%r" + locationHintText + " #%g" + itemHintText + "#%w.";
SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG("\tMessage: ");
SPDLOG_DEBUG(finalHint.english); SPDLOG_DEBUG(finalHint.english);
SPDLOG_DEBUG("\n\n"); SPDLOG_DEBUG("\n\n");
@ -367,7 +367,7 @@ static void CreateWothHint(uint8_t* remainingDungeonWothHints) {
// form hint text // form hint text
Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText();
Text finalWothHint = Hint(PREFIX).GetText() + "#" + locationText + "#" + Hint(WAY_OF_THE_HERO).GetText(); Text finalWothHint = Hint(PREFIX).GetText() + "%r#" + locationText + "#%w" + Hint(WAY_OF_THE_HERO).GetText();
SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG("\tMessage: ");
SPDLOG_DEBUG(finalWothHint.english); SPDLOG_DEBUG(finalWothHint.english);
SPDLOG_DEBUG("\n\n"); SPDLOG_DEBUG("\n\n");
@ -411,7 +411,7 @@ static void CreateBarrenHint(uint8_t* remainingDungeonBarrenHints, std::vector<u
// form hint text // form hint text
Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText();
Text finalBarrenHint = Text finalBarrenHint =
Hint(PREFIX).GetText() + Hint(PLUNDERING).GetText() + "#" + locationText + "#" + Hint(FOOLISH).GetText(); Hint(PREFIX).GetText() + Hint(PLUNDERING).GetText() + "%r#" + locationText + "#%w" + Hint(FOOLISH).GetText();
SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG("\tMessage: ");
SPDLOG_DEBUG(finalBarrenHint.english); SPDLOG_DEBUG(finalBarrenHint.english);
SPDLOG_DEBUG("\n\n"); SPDLOG_DEBUG("\n\n");
@ -457,13 +457,13 @@ static void CreateRandomLocationHint(const bool goodItem = false) {
Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText(); Text locationText = GetHintRegion(Location(hintedLocation)->GetParentRegionKey())->GetHint().GetText();
// RANDOTODO: reconsider dungeon vs non-dungeon item location hints when boss shuffle mixed pools happens // RANDOTODO: reconsider dungeon vs non-dungeon item location hints when boss shuffle mixed pools happens
if (Location(hintedLocation)->IsDungeon()) { if (Location(hintedLocation)->IsDungeon()) {
Text finalHint = Hint(PREFIX).GetText()+"#"+locationText+"# "+Hint(HOARDS).GetText()+" #"+itemText+"#."; Text finalHint = Hint(PREFIX).GetText()+"%r#"+locationText+"#%w "+Hint(HOARDS).GetText()+" %g#"+itemText+"#%w.";
SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG("\tMessage: ");
SPDLOG_DEBUG(finalHint.english); SPDLOG_DEBUG(finalHint.english);
SPDLOG_DEBUG("\n\n"); SPDLOG_DEBUG("\n\n");
AddHint(finalHint, gossipStone, {QM_GREEN, QM_RED}, HINT_TYPE_NAMED_ITEM, hintedLocation); AddHint(finalHint, gossipStone, {QM_GREEN, QM_RED}, HINT_TYPE_NAMED_ITEM, hintedLocation);
} else { } else {
Text finalHint = Hint(PREFIX).GetText()+"#"+itemText+"# "+Hint(CAN_BE_FOUND_AT).GetText()+" #"+locationText+"#."; Text finalHint = Hint(PREFIX).GetText()+"%r#"+itemText+"#%w "+Hint(CAN_BE_FOUND_AT).GetText()+" %g#"+locationText+"#%w.";
SPDLOG_DEBUG("\tMessage: "); SPDLOG_DEBUG("\tMessage: ");
SPDLOG_DEBUG(finalHint.english); SPDLOG_DEBUG(finalHint.english);
SPDLOG_DEBUG("\n\n"); SPDLOG_DEBUG("\n\n");
@ -602,7 +602,7 @@ void CreateGanonText() {
ganonHintText = hint.GetText()+Hint(YOUR_POCKET).GetText(); ganonHintText = hint.GetText()+Hint(YOUR_POCKET).GetText();
lightArrowHintLoc = "Link's Pocket"; lightArrowHintLoc = "Link's Pocket";
} else { } else {
ganonHintText = hint.GetText()+GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); ganonHintText = hint.GetText() + "%r" + GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText();
lightArrowHintLoc = Location(lightArrowLocation[0])->GetName(); lightArrowHintLoc = Location(lightArrowLocation[0])->GetName();
} }
ganonHintText = ganonHintText + "!"; ganonHintText = ganonHintText + "!";
@ -814,9 +814,9 @@ void CreateDampesDiaryText() {
uint32_t location = FilterFromPool(allLocations, [item](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == item;})[0]; uint32_t location = FilterFromPool(allLocations, [item](const uint32_t loc){return Location(loc)->GetPlaceduint32_t() == item;})[0];
Text area = GetHintRegion(Location(location)->GetParentRegionKey())->GetHint().GetText(); Text area = GetHintRegion(Location(location)->GetParentRegionKey())->GetHint().GetText();
Text temp1 = Text{ Text temp1 = Text{
"Whoever reads this, please enter %g", "Whoever reads this, please enter %r",
"Toi qui lit ce journal, rends-toi dans %g", "Toi qui lit ce journal, rends-toi dans %r",
"Wer immer dies liest, der möge folgenden Ort aufsuchen: %g" "Wer immer dies liest, der möge folgenden Ort aufsuchen: %r"
}; };
Text temp2 = { Text temp2 = {
@ -839,13 +839,13 @@ void CreateGregRupeeHint() {
Text area = GetHintRegion(Location(location)->GetParentRegionKey())->GetHint().GetText(); Text area = GetHintRegion(Location(location)->GetParentRegionKey())->GetHint().GetText();
Text temp1 = Text{ Text temp1 = Text{
"By the way, if you're interested, I saw the shiniest %gGreen Rupee%w somewhere in%g ", "By the way, if you're interested, I saw the shiniest %gGreen Rupee%w somewhere in%r ",
"Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des %gRubis Verts%w quelque part à %g", "Au fait, si ça t'intéresse, j'ai aperçu le plus éclatant des %gRubis Verts%w quelque part à %r",
"" ""
}; };
Text temp2 = { Text temp2 = {
"%w.^It's said to have %rmysterious powers%w...^But then, it could just be another regular rupee.&Oh well.", "%w.^It's said to have %cmysterious powers%w...^But then, it could just be another regular rupee.&Oh well.",
"%w. On dit qu'il possède des pouvoirs mystérieux... Mais bon, ça pourrait juste être un autre rubis ordinaire.", "%w. On dit qu'il possède des pouvoirs mystérieux... Mais bon, ça pourrait juste être un autre rubis ordinaire.",
"" ""
}; };
@ -859,8 +859,8 @@ void CreateSheikText() {
lightArrowHintLoc = Location(lightArrowLocation[0])->GetName(); lightArrowHintLoc = Location(lightArrowLocation[0])->GetName();
Text area = GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText(); Text area = GetHintRegion(Location(lightArrowLocation[0])->GetParentRegionKey())->GetHint().GetText();
Text temp1 = Text{ Text temp1 = Text{
"I overheard Ganondorf say that he misplaced the %rLight Arrows%w in&%g", "I overheard Ganondorf say that he misplaced the %yLight Arrows%w in&%r",
"J'ai entendu dire que Ganondorf aurait caché les %rFlèches de Lumière%w dans %g", "J'ai entendu dire que Ganondorf aurait caché les %yFlèches de Lumière%w dans %r",
"" ""
}; };
Text temp2 = Text{"%w.", "%w.", "%w."}; Text temp2 = Text{"%w.", "%w.", "%w."};
@ -873,8 +873,8 @@ void CreateSariaText() {
sariaHintLoc = Location(magicLocation[0])->GetName(); sariaHintLoc = Location(magicLocation[0])->GetName();
Text area = GetHintRegion(Location(magicLocation[0])->GetParentRegionKey())->GetHint().GetText(); Text area = GetHintRegion(Location(magicLocation[0])->GetParentRegionKey())->GetHint().GetText();
Text temp1 = Text{ Text temp1 = Text{
"Did you feel the %gsurge of magic%w recently? A mysterious bird told me it came from %g", "Did you feel the %gsurge of magic%w recently? A mysterious bird told me it came from %r",
"As-tu récemment ressenti une vague de %gpuissance magique%w? Un mystérieux hibou m'a dit qu'elle provenait du %g", "As-tu récemment ressenti une vague de %gpuissance magique%w? Un mystérieux hibou m'a dit qu'elle provenait du %r",
"" ""
}; };
Text temp2 = Text{ Text temp2 = Text{

View file

@ -465,9 +465,9 @@ void Randomizer::LoadHintLocations(const char* spoilerFileName) {
CustomMessageManager::Instance->CreateMessage( CustomMessageManager::Instance->CreateMessage(
Randomizer::randoMiscHintsTableID, TEXT_CURSED_SKULLTULA_PEOPLE, Randomizer::randoMiscHintsTableID, TEXT_CURSED_SKULLTULA_PEOPLE,
CustomMessage("Yeaaarrgh! I'm cursed!!^Please save me by destroying&%r{{params}} Spiders of the Curse%w&and I will give you my&%b{{check}}%w!", CustomMessage("Yeaaarrgh! I'm cursed!!^Please save me by destroying&%r{{params}} Spiders of the Curse%w&and I will give you my&%g{{check}}%w!",
"Yeaaarrgh! Ich bin verflucht!^Bitte rette mich, indem du %r{{params}} Skulltulas&%wzerstörst und ich werde dir dafür&%b{{check}} %wgeben!", "Yeaaarrgh! Ich bin verflucht!^Bitte rette mich, indem du %r{{params}} Skulltulas&%wzerstörst und ich werde dir dafür&%g{{check}} %wgeben!",
"Yeaaarrgh! Je suis maudit!^Détruit encore %r{{params}} Araignées de&la Malédiction%w et j'aurai quelque&chose à te donner!&%b({{check}})") "Yeaaarrgh! Je suis maudit!^Détruit encore %r{{params}} Araignées de&la Malédiction%w et j'aurai quelque&chose à te donner!&%g({{check}})")
); );
CustomMessageManager::Instance->CreateMessage( CustomMessageManager::Instance->CreateMessage(
Randomizer::randoMiscHintsTableID, TEXT_DAMPES_DIARY, Randomizer::randoMiscHintsTableID, TEXT_DAMPES_DIARY,
@ -481,7 +481,7 @@ void Randomizer::LoadHintLocations(const char* spoilerFileName) {
Randomizer::randoMiscHintsTableID, TEXT_FROGS_UNDERWATER, Randomizer::randoMiscHintsTableID, TEXT_FROGS_UNDERWATER,
CustomMessage("Some frogs holding&%g{{item}}%w&are looking at you from underwater...", CustomMessage("Some frogs holding&%g{{item}}%w&are looking at you from underwater...",
"Unter Wasser gibt es Frösche,&die %g{{item}}%w&bei sich haben und Dich neugierig&beobachten...", "Unter Wasser gibt es Frösche,&die %g{{item}}%w&bei sich haben und Dich neugierig&beobachten...",
"Des grenouilles se trouvant&sous l'eau vous fixent attentivement,&tenant fermement&%r{{item}}%w.", TEXTBOX_TYPE_BLUE) "Des grenouilles se trouvant&sous l'eau vous fixent attentivement,&tenant fermement&%g{{item}}%w.", TEXTBOX_TYPE_BLUE)
); );
CustomMessageManager::Instance->CreateMessage( CustomMessageManager::Instance->CreateMessage(
Randomizer::randoMiscHintsTableID, TEXT_SARIAS_SONG_FOREST_SOUNDS, Randomizer::randoMiscHintsTableID, TEXT_SARIAS_SONG_FOREST_SOUNDS,
@ -565,17 +565,17 @@ void Randomizer::LoadMerchantMessages(const char* spoilerFileName) {
//RANDOTODO: Implement obscure/ambiguous hints //RANDOTODO: Implement obscure/ambiguous hints
CustomMessageManager::Instance->CreateMessage( CustomMessageManager::Instance->CreateMessage(
Randomizer::merchantMessageTableID, TEXT_MEDIGORON, Randomizer::merchantMessageTableID, TEXT_MEDIGORON,
CustomMessage("How about buying %r&{{item}}%w for %g200 rupees%w?\x1B&%gYes&No%w", CustomMessage("How about buying %g&{{item}}%w for %y200 rupees%w?\x1B&%gYes&No%w",
"Wie wäre es mit %r&{{item}}%w für %g200 Rubine?%w\x1B&%gJa!&Nein!%w", "Wie wäre es mit %g&{{item}}%w für %y200 Rubine?%w\x1B&%gJa!&Nein!%w",
"Veux-tu acheter %r&{{item}}%w pour %g200 rubis?%w\x1B&%gOui&Non&w")); "Veux-tu acheter %g&{{item}}%w pour %y200 rubis?%w\x1B&%gOui&Non&w"));
//Granny Shopy //Granny Shopy
//RANDOTODO: Implement obscure/ambiguous hints //RANDOTODO: Implement obscure/ambiguous hints
CustomMessageManager::Instance->CreateMessage( CustomMessageManager::Instance->CreateMessage(
Randomizer::merchantMessageTableID, TEXT_GRANNYS_SHOP, Randomizer::merchantMessageTableID, TEXT_GRANNYS_SHOP,
CustomMessage("%r{{item}}%w!&How about %g100 rupees%w?\x1B&%gYes&No%w", CustomMessage("%g{{item}}%w!&How about %y100 rupees%w?\x1B&%gYes&No%w",
"%r{{item}}%w!&Wie wäre es mit %g100 Rubine?%w\x1B&%gJa!&Nein!%w", "%g{{item}}%w!&Wie wäre es mit %y100 Rubine?%w\x1B&%gJa!&Nein!%w",
"%r{{item}}%w!&Que dis-tu de %g100 rubis?%w\x1B&%gOui&Non&w")); "%g{{item}}%w!&Que dis-tu de %y100 rubis?%w\x1B&%gOui&Non&w"));
//Carpet Salesman //Carpet Salesman
//RANDOTODO: Implement obscure/ambiguous hints //RANDOTODO: Implement obscure/ambiguous hints
@ -596,14 +596,14 @@ void Randomizer::LoadMerchantMessages(const char* spoilerFileName) {
CustomMessageManager::Instance->CreateMessage( CustomMessageManager::Instance->CreateMessage(
Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_1, Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_1,
CustomMessage("Welcome!^I am selling stuff, strange and rare, &from all over the world to " CustomMessage("Welcome!^I am selling stuff, strange and rare, &from all over the world to "
"everybody.&Today's special is...^%r{{item}}" + "everybody.&Today's special is...^%g{{item}}" +
cgBoxTwoText[0] + "How about %g200 Rupees?%w\x1B&&%gYes&No%w", cgBoxTwoText[0] + "How about %y200 Rupees?%w\x1B&&%gYes&No%w",
"Sei gegrüßt!^Ich verkaufe allerlei Kuriorisäten.&Stets sonderliche und seltene Ware&aus " "Sei gegrüßt!^Ich verkaufe allerlei Kuriorisäten.&Stets sonderliche und seltene Ware&aus "
"aller Welt für jedermann.&Das heutige Angebot bleibt...^%r{{item}}" + "aller Welt für jedermann.&Das heutige Angebot bleibt...^%g{{item}}" +
cgBoxTwoText[1] + "Wie wäre es mit %g200 Rubinen?%w\x1B&&%gJa!&Nein!%w", cgBoxTwoText[1] + "Wie wäre es mit %y200 Rubinen?%w\x1B&&%gJa!&Nein!%w",
"Bienvenue!^Je vends des trucs étranges et rares,&de partout dans le monde et à tout " "Bienvenue!^Je vends des trucs étranges et rares,&de partout dans le monde et à tout "
"le&monde! L'objet du jour est...^%r{{item}}" + "le&monde! L'objet du jour est...^%g{{item}}" +
cgBoxTwoText[2] + "Alors, marché conclu pour %g200 rubis?%w\x1B&&%gOui&Non%w")); cgBoxTwoText[2] + "Alors, marché conclu pour %y200 rubis?%w\x1B&&%gOui&Non%w"));
CustomMessageManager::Instance->CreateMessage( CustomMessageManager::Instance->CreateMessage(
Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_2, Randomizer::merchantMessageTableID, TEXT_CARPET_SALESMAN_2,

View file

@ -586,6 +586,8 @@ void DrawEnhancementsMenu() {
"Wearing the Bunny Hood grants a speed increase like in Majora's Mask. The longer jump option is not accounted for in randomizer logic.\n\n" "Wearing the Bunny Hood grants a speed increase like in Majora's Mask. The longer jump option is not accounted for in randomizer logic.\n\n"
"Also disables NPC's reactions to wearing the Bunny Hood." "Also disables NPC's reactions to wearing the Bunny Hood."
); );
UIWidgets::PaddedEnhancementCheckbox("Bunny Hood Equippable as Adult", "gAdultBunnyHood", true, false, (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) == BUNNY_HOOD_VANILLA), "Only available with increased bunny hood speed", UIWidgets::CheckboxGraphics::Cross, false);
UIWidgets::Tooltip("Allows the bunny hood to be equipped normally from the pause menu as adult.");
UIWidgets::PaddedEnhancementCheckbox("Mask Select in Inventory", "gMaskSelect", true, false); UIWidgets::PaddedEnhancementCheckbox("Mask Select in Inventory", "gMaskSelect", true, false);
UIWidgets::Tooltip("After completing the mask trading sub-quest, press A and any direction on the mask slot to change masks"); UIWidgets::Tooltip("After completing the mask trading sub-quest, press A and any direction on the mask slot to change masks");
UIWidgets::PaddedEnhancementCheckbox("Nuts explode bombs", "gNutsExplodeBombs", true, false); UIWidgets::PaddedEnhancementCheckbox("Nuts explode bombs", "gNutsExplodeBombs", true, false);
@ -672,6 +674,8 @@ void DrawEnhancementsMenu() {
UIWidgets::PaddedEnhancementCheckbox("Always Win Dampe Digging Game", "gDampeWin", true, false, SaveManager::Instance->IsRandoFile(), UIWidgets::PaddedEnhancementCheckbox("Always Win Dampe Digging Game", "gDampeWin", true, false, SaveManager::Instance->IsRandoFile(),
"This setting is always enabled in randomizer files", UIWidgets::CheckboxGraphics::Checkmark); "This setting is always enabled in randomizer files", UIWidgets::CheckboxGraphics::Checkmark);
UIWidgets::Tooltip("Always win the heart piece/purple rupee on the first dig in Dampe's grave digging game, just like in rando\nIn a rando file, this is unconditionally enabled"); UIWidgets::Tooltip("Always win the heart piece/purple rupee on the first dig in Dampe's grave digging game, just like in rando\nIn a rando file, this is unconditionally enabled");
UIWidgets::PaddedEnhancementCheckbox("All Dogs are Richard", "gAllDogsRichard", true, false);
UIWidgets::Tooltip("All dogs can be traded in and will count as Richard.");
UIWidgets::Spacer(0); UIWidgets::Spacer(0);
if (ImGui::BeginMenu("Potion Values")) if (ImGui::BeginMenu("Potion Values"))
@ -897,6 +901,8 @@ void DrawEnhancementsMenu() {
UIWidgets::Tooltip("Disables bombs always rotating to face the camera. To be used in conjunction with mods that want to replace bombs with 3D objects."); UIWidgets::Tooltip("Disables bombs always rotating to face the camera. To be used in conjunction with mods that want to replace bombs with 3D objects.");
UIWidgets::PaddedEnhancementCheckbox("Disable Grotto Fixed Rotation", "gDisableGrottoRotation", true, false); UIWidgets::PaddedEnhancementCheckbox("Disable Grotto Fixed Rotation", "gDisableGrottoRotation", true, false);
UIWidgets::Tooltip("Disables grottos rotating with the camera. To be used in conjunction with mods that want to replace grottos with 3D objects."); UIWidgets::Tooltip("Disables grottos rotating with the camera. To be used in conjunction with mods that want to replace grottos with 3D objects.");
UIWidgets::PaddedEnhancementCheckbox("Invisible Bunny Hood", "gHideBunnyHood", true, false);
UIWidgets::Tooltip("Turns Bunny Hood invisible while still maintaining its effects.");
ImGui::EndMenu(); ImGui::EndMenu();
} }

View file

@ -653,7 +653,7 @@ void Play_Init(GameState* thisx) {
Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL); Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL);
// In order to keep bunny hood equipped on first load, we need to pre-set the age reqs for the item and slot // In order to keep bunny hood equipped on first load, we need to pre-set the age reqs for the item and slot
if (CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || CVarGetInteger("gTimelessEquipment", 0)) { if ((CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA && CVarGetInteger("gAdultBunnyHood", 0)) || CVarGetInteger("gTimelessEquipment", 0)) {
gItemAgeReqs[ITEM_MASK_BUNNY] = 9; gItemAgeReqs[ITEM_MASK_BUNNY] = 9;
if(INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY) if(INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY)
gSlotAgeReqs[SLOT_TRADE_CHILD] = 9; gSlotAgeReqs[SLOT_TRADE_CHILD] = 9;

View file

@ -1369,7 +1369,7 @@ void Player_DrawHookshotReticle(PlayState* play, Player* this, f32 hookshotRange
const Color_RGBA8 color = CVarGetColor("gCosmetics.HookshotReticle_NonTarget.Value", defaultColor); const Color_RGBA8 color = CVarGetColor("gCosmetics.HookshotReticle_NonTarget.Value", defaultColor);
gDPSetPrimColor(WORLD_OVERLAY_DISP++, 0, 0, color.r, color.g, color.b, color.a); gDPSetPrimColor(WORLD_OVERLAY_DISP++, 0, 0, color.r, color.g, color.b, color.a);
} }
gSPVertex(WORLD_OVERLAY_DISP++, (uintptr_t)gLinkAdultHookshotRedicleVtx, 3, 0); gSPVertex(WORLD_OVERLAY_DISP++, (uintptr_t)gLinkAdultHookshotReticleVtx, 3, 0);
gSP1Triangle(WORLD_OVERLAY_DISP++, 0, 1, 2, 0); gSP1Triangle(WORLD_OVERLAY_DISP++, 0, 1, 2, 0);
CLOSE_DISPS(play->state.gfxCtx); CLOSE_DISPS(play->state.gfxCtx);

View file

@ -438,7 +438,7 @@ u16 func_80A6F810(PlayState* play, Actor* thisx) {
if (followingDog != 0) { if (followingDog != 0) {
this->unk_215 = false; this->unk_215 = false;
return (followingDog == 1) ? 0x709F : 0x709E; return ((followingDog == 1) || (CVarGetInteger("gAllDogsRichard", 0))) ? 0x709F : 0x709E;
} else { } else {
return 0x709D; return 0x709D;
} }

View file

@ -2972,33 +2972,9 @@ void func_80835F44(PlayState* play, Player* this, s32 item) {
return; return;
} }
if (actionParam >= PLAYER_IA_BOOTS_KOKIRI) {
u16 bootsValue = actionParam - PLAYER_IA_BOOTS_KOKIRI + 1;
if (CUR_EQUIP_VALUE(EQUIP_BOOTS) == bootsValue) {
Inventory_ChangeEquipment(EQUIP_BOOTS, PLAYER_BOOTS_KOKIRI + 1);
} else {
Inventory_ChangeEquipment(EQUIP_BOOTS, bootsValue);
}
Player_SetEquipmentData(play, this);
func_808328EC(this, CUR_EQUIP_VALUE(EQUIP_BOOTS) == PLAYER_BOOTS_IRON + 1 ? NA_SE_PL_WALK_HEAVYBOOTS
: NA_SE_PL_CHANGE_ARMS);
return;
}
if (actionParam >= PLAYER_IA_TUNIC_KOKIRI) {
u16 tunicValue = actionParam - PLAYER_IA_TUNIC_KOKIRI + 1;
if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == tunicValue) {
Inventory_ChangeEquipment(EQUIP_TUNIC, PLAYER_TUNIC_KOKIRI + 1);
} else {
Inventory_ChangeEquipment(EQUIP_TUNIC, tunicValue);
}
Player_SetEquipmentData(play, this);
func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
return;
}
if (actionParam >= PLAYER_IA_SHIELD_DEKU) { if (actionParam >= PLAYER_IA_SHIELD_DEKU) {
// Changing shields through action commands is unimplemented // Changing shields through action commands is unimplemented
// Boots and tunics handled previously
return; return;
} }
@ -10597,6 +10573,45 @@ static Vec3f D_80854814 = { 0.0f, 0.0f, 200.0f };
static f32 D_80854820[] = { 2.0f, 4.0f, 7.0f }; static f32 D_80854820[] = { 2.0f, 4.0f, 7.0f };
static f32 D_8085482C[] = { 0.5f, 1.0f, 3.0f }; static f32 D_8085482C[] = { 0.5f, 1.0f, 3.0f };
void Player_UseTunicBoots(Player* this, PlayState* play) {
// Boots and tunics equip despite state
s32 i;
s32 item;
s32 actionParam;
if (!(this->stateFlags1 & PLAYER_STATE1_INPUT_DISABLED || this->stateFlags1 & PLAYER_STATE1_IN_ITEM_CS || this->stateFlags1 & PLAYER_STATE1_IN_CUTSCENE || this->stateFlags1 & PLAYER_STATE1_TEXT_ON_SCREEN || this->stateFlags2 & PLAYER_STATE2_OCARINA_PLAYING)) {
for (i = 0; i < ARRAY_COUNT(D_80854388); i++) {
if (CHECK_BTN_ALL(sControlInput->press.button, D_80854388[i])) {
break;
}
}
item = func_80833CDC(play, i);
if (item >= ITEM_TUNIC_KOKIRI && item <= ITEM_BOOTS_HOVER) {
this->heldItemButton = i;
actionParam = Player_ItemToItemAction(item);
if (actionParam >= PLAYER_IA_BOOTS_KOKIRI) {
u16 bootsValue = actionParam - PLAYER_IA_BOOTS_KOKIRI + 1;
if (CUR_EQUIP_VALUE(EQUIP_BOOTS) == bootsValue) {
Inventory_ChangeEquipment(EQUIP_BOOTS, PLAYER_BOOTS_KOKIRI + 1);
} else {
Inventory_ChangeEquipment(EQUIP_BOOTS, bootsValue);
}
Player_SetEquipmentData(play, this);
func_808328EC(this, CUR_EQUIP_VALUE(EQUIP_BOOTS) == PLAYER_BOOTS_IRON + 1 ? NA_SE_PL_WALK_HEAVYBOOTS
: NA_SE_PL_CHANGE_ARMS);
} else if (actionParam >= PLAYER_IA_TUNIC_KOKIRI) {
u16 tunicValue = actionParam - PLAYER_IA_TUNIC_KOKIRI + 1;
if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == tunicValue) {
Inventory_ChangeEquipment(EQUIP_TUNIC, PLAYER_TUNIC_KOKIRI + 1);
} else {
Inventory_ChangeEquipment(EQUIP_TUNIC, tunicValue);
}
Player_SetEquipmentData(play, this);
func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
}
}
}
}
void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
s32 pad; s32 pad;
@ -10894,6 +10909,7 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) {
if (!(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC)) { if (!(this->stateFlags3 & PLAYER_STATE3_PAUSE_ACTION_FUNC)) {
this->func_674(this, play); this->func_674(this, play);
Player_UseTunicBoots(this, play);
} }
Player_UpdateCamAndSeqModes(play, this); Player_UpdateCamAndSeqModes(play, this);
@ -11171,7 +11187,11 @@ void Player_DrawGameplay(PlayState* play, Player* this, s32 lod, Gfx* cullDList,
MATRIX_TOMTX(sp70); MATRIX_TOMTX(sp70);
} }
if (this->currentMask != PLAYER_MASK_BUNNY || !CVarGetInteger("gHideBunnyHood", 0)) {
gSPDisplayList(POLY_OPA_DISP++, sMaskDlists[this->currentMask - 1]); gSPDisplayList(POLY_OPA_DISP++, sMaskDlists[this->currentMask - 1]);
}
if (CVarGetInteger("gFixIceTrapWithBunnyHood", 1)) Matrix_Pop(); if (CVarGetInteger("gFixIceTrapWithBunnyHood", 1)) Matrix_Pop();
} }

View file

@ -538,7 +538,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
gSelectingMask = cursorSlot == SLOT_TRADE_CHILD; gSelectingMask = cursorSlot == SLOT_TRADE_CHILD;
gSlotAgeReqs[SLOT_TRADE_CHILD] = gItemAgeReqs[ITEM_MASK_BUNNY] = gSlotAgeReqs[SLOT_TRADE_CHILD] = gItemAgeReqs[ITEM_MASK_BUNNY] =
((CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA || CVarGetInteger("gTimelessEquipment", 0)) && ((((CVarGetInteger("gMMBunnyHood", BUNNY_HOOD_VANILLA) != BUNNY_HOOD_VANILLA) && CVarGetInteger("gAdultBunnyHood", 0)) || CVarGetInteger("gTimelessEquipment", 0)) &&
INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY) INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_MASK_BUNNY)
? 9 ? 9
: 1; : 1;