mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-07-16 10:02:59 -07:00
Trade cleanup (#4971)
* Move adult trade to flags * Move child trade to flags * Fix vanilla * Address review * Rename `trade_shuffle` to `ShuffleTradeItems` * Fix mac build * Update GIVanillaBehavior.h * Update z_kankyo.c * Update z_en_heishi2.c
This commit is contained in:
parent
db41c6513b
commit
06387060d6
32 changed files with 246 additions and 165 deletions
|
@ -160,7 +160,6 @@ typedef struct {
|
|||
#pragma region SoH
|
||||
|
||||
typedef struct ShipRandomizerSaveContextData {
|
||||
u16 adultTradeItems;
|
||||
u8 triforcePiecesCollected;
|
||||
} ShipRandomizerSaveContextData;
|
||||
|
||||
|
|
|
@ -19,7 +19,6 @@ extern "C" {
|
|||
#include "functions.h"
|
||||
#include "macros.h"
|
||||
#include "soh/cvar_prefixes.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
extern PlayState* gPlayState;
|
||||
|
||||
#include "textures/icon_item_static/icon_item_static.h"
|
||||
|
@ -414,22 +413,6 @@ void DrawInfoTab() {
|
|||
void DrawBGSItemFlag(uint8_t itemID) {
|
||||
const ItemMapEntry& slotEntry = itemMapping[itemID];
|
||||
ImGui::Image(Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1));
|
||||
ImGui::SameLine();
|
||||
int tradeIndex = itemID - ITEM_POCKET_EGG;
|
||||
bool hasItem = (gSaveContext.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) != 0;
|
||||
bool shouldHaveItem = hasItem;
|
||||
ImGui::Checkbox(("##adultTradeFlag" + std::to_string(itemID)).c_str(), &shouldHaveItem);
|
||||
if (hasItem != shouldHaveItem) {
|
||||
if (shouldHaveItem) {
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems |= (1 << tradeIndex);
|
||||
if (INV_CONTENT(ITEM_TRADE_ADULT) == ITEM_NONE) {
|
||||
INV_CONTENT(ITEM_TRADE_ADULT) = ITEM_POCKET_EGG + tradeIndex;
|
||||
}
|
||||
} else {
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~(1 << tradeIndex);
|
||||
Inventory_ReplaceItem(gPlayState, itemID, Randomizer_GetNextAdultTradeItem());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawInventoryTab() {
|
||||
|
@ -476,9 +459,6 @@ void DrawInventoryTab() {
|
|||
if (ImGui::BeginPopup(itemPopupPicker)) {
|
||||
if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) {
|
||||
gSaveContext.inventory.items[selectedIndex] = ITEM_NONE;
|
||||
if (selectedIndex == SLOT_TRADE_ADULT) {
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems = 0;
|
||||
}
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
UIWidgets::SetLastItemHoverText("None");
|
||||
|
@ -512,13 +492,6 @@ void DrawInventoryTab() {
|
|||
ImGui::PopStyleVar();
|
||||
if (ret) {
|
||||
gSaveContext.inventory.items[selectedIndex] = slotEntry.id;
|
||||
// Set adult trade item flag if you're playing adult trade shuffle in rando
|
||||
if (IS_RANDO &&
|
||||
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ADULT_TRADE) &&
|
||||
selectedIndex == SLOT_TRADE_ADULT &&
|
||||
slotEntry.id >= ITEM_POCKET_EGG && slotEntry.id <= ITEM_CLAIM_CHECK) {
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(slotEntry.id);
|
||||
}
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
UIWidgets::SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id));
|
||||
|
|
|
@ -1600,6 +1600,30 @@ const std::vector<FlagTable> flagTables = {
|
|||
{ RAND_INF_HYLIA_LAB_KEY_OBTAINED, "RAND_INF_HYLIA_LAB_KEY_OBTAINED" },
|
||||
{ RAND_INF_FISHING_HOLE_UNLOCKED, "RAND_INF_FISHING_HOLE_UNLOCKED" },
|
||||
{ RAND_INF_FISHING_HOLE_KEY_OBTAINED, "RAND_INF_FISHING_HOLE_KEY_OBTAINED" },
|
||||
|
||||
{ RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, "RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_CHICKEN, "RAND_INF_CHILD_TRADES_HAS_CHICKEN" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, "RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, "RAND_INF_CHILD_TRADES_HAS_MASK_KEATON" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, "RAND_INF_CHILD_TRADES_HAS_MASK_SKULL" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, "RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, "RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_GORON, "RAND_INF_CHILD_TRADES_HAS_MASK_GORON" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, "RAND_INF_CHILD_TRADES_HAS_MASK_ZORA" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, "RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO" },
|
||||
{ RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, "RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH" },
|
||||
|
||||
{ RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, "RAND_INF_ADULT_TRADES_HAS_POCKET_EGG" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, "RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_COJIRO, "RAND_INF_ADULT_TRADES_HAS_COJIRO" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, "RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_ODD_POTION, "RAND_INF_ADULT_TRADES_HAS_ODD_POTION" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_SAW, "RAND_INF_ADULT_TRADES_HAS_SAW" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, "RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, "RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_FROG, "RAND_INF_ADULT_TRADES_HAS_FROG" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_EYEDROPS, "RAND_INF_ADULT_TRADES_HAS_EYEDROPS" },
|
||||
{ RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, "RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK" },
|
||||
} },
|
||||
};
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ DEFINE_HOOK(OnFlagUnset, (int16_t flagType, int16_t flag));
|
|||
DEFINE_HOOK(OnSceneSpawnActors, ());
|
||||
DEFINE_HOOK(OnPlayerUpdate, ());
|
||||
DEFINE_HOOK(OnOcarinaSongAction, ());
|
||||
DEFINE_HOOK(OnCuccoOrChickenHatch, ());
|
||||
DEFINE_HOOK(OnShopSlotChange, (uint8_t cursorIndex, int16_t price));
|
||||
DEFINE_HOOK(OnActorInit, (void* actor));
|
||||
DEFINE_HOOK(OnActorUpdate, (void* actor));
|
||||
|
|
|
@ -80,6 +80,10 @@ void GameInteractor_ExecuteOnOcarinaSongAction() {
|
|||
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnOcarinaSongAction>();
|
||||
}
|
||||
|
||||
void GameInteractor_ExecuteOnCuccoOrChickenHatch() {
|
||||
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnCuccoOrChickenHatch>();
|
||||
}
|
||||
|
||||
void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price) {
|
||||
GameInteractor::Instance->ExecuteHooks<GameInteractor::OnShopSlotChange>(cursorIndex, price);
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ void GameInteractor_ExecuteOnFlagUnset(int16_t flagType, int16_t flag);
|
|||
void GameInteractor_ExecuteOnSceneSpawnActors();
|
||||
void GameInteractor_ExecuteOnPlayerUpdate();
|
||||
void GameInteractor_ExecuteOnOcarinaSongAction();
|
||||
void GameInteractor_ExecuteOnCuccoOrChickenHatch();
|
||||
void GameInteractor_ExecuteOnActorInit(void* actor);
|
||||
void GameInteractor_ExecuteOnActorUpdate(void* actor);
|
||||
void GameInteractor_ExecuteOnActorKill(void* actor);
|
||||
|
@ -33,7 +34,6 @@ void GameInteractor_ExecuteOnTimestamp (u8 item);
|
|||
void GameInteractor_ExecuteOnPlayerBonk();
|
||||
void GameInteractor_ExecuteOnPlayerHealthChange(int16_t amount);
|
||||
void GameInteractor_ExecuteOnPlayerBottleUpdate(int16_t contents);
|
||||
void GameInteractor_ExecuteOnOcarinaSongAction();
|
||||
void GameInteractor_ExecuteOnShopSlotChangeHooks(uint8_t cursorIndex, int16_t price);
|
||||
void GameInteractor_ExecuteOnPlayDestroy();
|
||||
void GameInteractor_ExecuteOnPlayDrawEnd();
|
||||
|
|
|
@ -371,6 +371,11 @@ typedef enum {
|
|||
// #### `args`
|
||||
// - `*Actor`
|
||||
VB_DOOR_PLAY_SCENE_TRANSITION,
|
||||
// Vanilla condition: true
|
||||
VB_HATCH_CUCCO_OR_CHICKEN,
|
||||
// Vanilla condition: exchangeItemId == EXCH_ITEM_LETTER_ZELDA
|
||||
// Opt: s32
|
||||
VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER,
|
||||
|
||||
// #### `result`
|
||||
// In `Interface_DrawAmmoCount`:
|
||||
|
|
51
soh/soh/Enhancements/randomizer/ShuffleTradeItems.c
Normal file
51
soh/soh/Enhancements/randomizer/ShuffleTradeItems.c
Normal file
|
@ -0,0 +1,51 @@
|
|||
#include "functions.h"
|
||||
#include "variables.h"
|
||||
#include "macros.h"
|
||||
|
||||
u8 Randomizer_GetNextChildTradeItem() {
|
||||
const u8 numTradeItems = ITEM_MASK_TRUTH - ITEM_WEIRD_EGG + 1;
|
||||
u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_CHILD) - ITEM_WEIRD_EGG;
|
||||
for (int i = 0; i < numTradeItems; i++) {
|
||||
u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems;
|
||||
if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) {
|
||||
return ITEM_WEIRD_EGG + tradeIndex;
|
||||
}
|
||||
}
|
||||
return ITEM_NONE;
|
||||
}
|
||||
|
||||
u8 Randomizer_GetPrevChildTradeItem() {
|
||||
const u8 numTradeItems = ITEM_MASK_TRUTH - ITEM_WEIRD_EGG + 1;
|
||||
u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_CHILD) - ITEM_WEIRD_EGG;
|
||||
for (int i = 0; i < numTradeItems; i++) {
|
||||
u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems;
|
||||
if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG)) {
|
||||
return ITEM_WEIRD_EGG + tradeIndex;
|
||||
}
|
||||
}
|
||||
return ITEM_NONE;
|
||||
}
|
||||
|
||||
u8 Randomizer_GetNextAdultTradeItem() {
|
||||
const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1;
|
||||
u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_ADULT) - ITEM_POCKET_EGG;
|
||||
for (int i = 0; i < numTradeItems; i++) {
|
||||
u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems;
|
||||
if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) {
|
||||
return ITEM_POCKET_EGG + tradeIndex;
|
||||
}
|
||||
}
|
||||
return ITEM_NONE;
|
||||
}
|
||||
|
||||
u8 Randomizer_GetPrevAdultTradeItem() {
|
||||
const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1;
|
||||
u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_ADULT) - ITEM_POCKET_EGG;
|
||||
for (int i = 0; i < numTradeItems; i++) {
|
||||
u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems;
|
||||
if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) {
|
||||
return ITEM_POCKET_EGG + tradeIndex;
|
||||
}
|
||||
}
|
||||
return ITEM_NONE;
|
||||
}
|
11
soh/soh/Enhancements/randomizer/ShuffleTradeItems.h
Normal file
11
soh/soh/Enhancements/randomizer/ShuffleTradeItems.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#ifndef Z_ADULT_TRADE_SHUFFLE_H
|
||||
#define Z_ADULT_TRADE_SHUFFLE_H
|
||||
|
||||
#include <libultraship/libultra/types.h>
|
||||
|
||||
u8 Randomizer_GetNextChildTradeItem();
|
||||
u8 Randomizer_GetPrevChildTradeItem();
|
||||
u8 Randomizer_GetNextAdultTradeItem();
|
||||
u8 Randomizer_GetPrevAdultTradeItem();
|
||||
|
||||
#endif
|
|
@ -1,33 +0,0 @@
|
|||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "functions.h"
|
||||
#include "variables.h"
|
||||
#include "macros.h"
|
||||
|
||||
void Randomizer_ConsumeAdultTradeItem(PlayState* play, u8 itemId) {
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(itemId);
|
||||
Inventory_ReplaceItem(play, itemId, Randomizer_GetNextAdultTradeItem());
|
||||
}
|
||||
|
||||
u8 Randomizer_GetNextAdultTradeItem() {
|
||||
const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1;
|
||||
u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_ADULT) - ITEM_POCKET_EGG;
|
||||
for (int i = 0; i < numTradeItems; i++) {
|
||||
u8 tradeIndex = (currentTradeItemIndex + i + 1) % numTradeItems;
|
||||
if (gSaveContext.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) {
|
||||
return ITEM_POCKET_EGG + tradeIndex;
|
||||
}
|
||||
}
|
||||
return ITEM_NONE;
|
||||
}
|
||||
|
||||
u8 Randomizer_GetPrevAdultTradeItem() {
|
||||
const u8 numTradeItems = ITEM_CLAIM_CHECK - ITEM_POCKET_EGG + 1;
|
||||
u8 currentTradeItemIndex = INV_CONTENT(ITEM_TRADE_ADULT) - ITEM_POCKET_EGG;
|
||||
for (int i = 0; i < numTradeItems; i++) {
|
||||
u8 tradeIndex = (currentTradeItemIndex - i - 1 + numTradeItems) % numTradeItems;
|
||||
if (gSaveContext.ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex)) {
|
||||
return ITEM_POCKET_EGG + tradeIndex;
|
||||
}
|
||||
}
|
||||
return ITEM_NONE;
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
#ifndef Z_ADULT_TRADE_SHUFFLE_H
|
||||
#define Z_ADULT_TRADE_SHUFFLE_H
|
||||
|
||||
#include <z64.h>
|
||||
|
||||
#define ADULT_TRADE_FLAG(itemId) (1 << (itemId - ITEM_POCKET_EGG))
|
||||
#define PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(itemID) (IS_RANDO && gSaveContext.ship.quest.data.randomizer.adultTradeItems & ADULT_TRADE_FLAG(itemID))
|
||||
|
||||
void Randomizer_ConsumeAdultTradeItem(PlayState* play, u8 itemId);
|
||||
u8 Randomizer_GetNextAdultTradeItem();
|
||||
u8 Randomizer_GetPrevAdultTradeItem();
|
||||
|
||||
#endif
|
|
@ -21,7 +21,7 @@ extern "C" {
|
|||
#include "macros.h"
|
||||
#include "functions.h"
|
||||
#include "variables.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/Enhancements/randomizer/ShuffleTradeItems.h"
|
||||
#include "soh/Enhancements/randomizer/randomizer_entrance.h"
|
||||
#include "soh/Enhancements/randomizer/randomizer_grotto.h"
|
||||
#include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h"
|
||||
|
@ -55,7 +55,6 @@ extern "C" {
|
|||
#include "src/overlays/actors/ovl_En_Xc/z_en_xc.h"
|
||||
#include "src/overlays/actors/ovl_Fishing/z_fishing.h"
|
||||
#include "src/overlays/actors/ovl_En_Mk/z_en_mk.h"
|
||||
#include "adult_trade_shuffle.h"
|
||||
#include "draw.h"
|
||||
|
||||
extern SaveContext gSaveContext;
|
||||
|
@ -219,14 +218,21 @@ void RandomizerOnFlagSetHandler(int16_t flagType, int16_t flag) {
|
|||
if (RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE) && flagType == FLAG_RANDOMIZER_INF) {
|
||||
switch (flag) {
|
||||
case RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD:
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_SWORD_BROKEN);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_SWORD_BROKEN, Randomizer_GetNextAdultTradeItem());
|
||||
break;
|
||||
case RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS:
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_EYEDROPS);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_EYEDROPS);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_EYEDROPS, Randomizer_GetNextAdultTradeItem());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (flagType == FLAG_EVENT_CHECK_INF && flag == EVENTCHKINF_TALON_WOKEN_IN_CASTLE) {
|
||||
//remove chicken as this is the only use for it
|
||||
Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_CHICKEN);
|
||||
}
|
||||
|
||||
RandomizerCheck rc = GetRandomizerCheckFromFlag(flagType, flag);
|
||||
if (rc == RC_UNKNOWN_CHECK) return;
|
||||
|
||||
|
@ -1142,7 +1148,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
}
|
||||
case VB_TRADE_POCKET_CUCCO: {
|
||||
EnNiwLady* enNiwLady = va_arg(args, EnNiwLady*);
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_POCKET_CUCCO);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_POCKET_CUCCO, Randomizer_GetNextAdultTradeItem());
|
||||
// Trigger the reward now
|
||||
Flags_SetItemGetInf(ITEMGETINF_2E);
|
||||
enNiwLady->actionFunc = func_80ABA778;
|
||||
|
@ -1151,13 +1158,15 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
break;
|
||||
}
|
||||
case VB_TRADE_COJIRO: {
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_COJIRO);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_COJIRO, Randomizer_GetNextAdultTradeItem());
|
||||
*should = false;
|
||||
break;
|
||||
}
|
||||
case VB_TRADE_ODD_MUSHROOM: {
|
||||
EnDs* granny = va_arg(args, EnDs*);
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_ODD_MUSHROOM);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_ODD_MUSHROOM, Randomizer_GetNextAdultTradeItem());
|
||||
// Trigger the reward now
|
||||
Flags_SetItemGetInf(ITEMGETINF_30);
|
||||
granny->actor.textId = 0x504F;
|
||||
|
@ -1168,14 +1177,16 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
}
|
||||
case VB_TRADE_ODD_POTION: {
|
||||
EnKo* enKo = va_arg(args, EnKo*);
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_ODD_POTION);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_POTION);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_ODD_POTION, Randomizer_GetNextAdultTradeItem());
|
||||
// Trigger the reward now
|
||||
Flags_SetItemGetInf(ITEMGETINF_31);
|
||||
*should = false;
|
||||
break;
|
||||
}
|
||||
case VB_TRADE_SAW: {
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_SAW);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_SAW);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_SAW, Randomizer_GetNextAdultTradeItem());
|
||||
*should = false;
|
||||
break;
|
||||
}
|
||||
|
@ -1192,14 +1203,16 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
if (func_8002F368(gPlayState) == EXCH_ITEM_PRESCRIPTION ||
|
||||
(hasShieldHoldingR && INV_CONTENT(ITEM_TRADE_ADULT) < ITEM_FROG)) {
|
||||
Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION);
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_PRESCRIPTION);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_PRESCRIPTION, Randomizer_GetNextAdultTradeItem());
|
||||
} else {
|
||||
Flags_SetRandomizerInf(RAND_INF_KING_ZORA_THAWED);
|
||||
}
|
||||
} else {
|
||||
if (enKz->isTrading){
|
||||
if (enKz->isTrading) {
|
||||
Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION);
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_PRESCRIPTION);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_PRESCRIPTION, Randomizer_GetNextAdultTradeItem());
|
||||
} else {
|
||||
Flags_SetRandomizerInf(RAND_INF_KING_ZORA_THAWED);
|
||||
}
|
||||
|
@ -1208,7 +1221,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
break;
|
||||
}
|
||||
case VB_TRADE_FROG: {
|
||||
Randomizer_ConsumeAdultTradeItem(gPlayState, ITEM_FROG);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_FROG);
|
||||
Inventory_ReplaceItem(gPlayState, ITEM_FROG, Randomizer_GetNextAdultTradeItem());
|
||||
*should = false;
|
||||
break;
|
||||
}
|
||||
|
@ -1236,9 +1250,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
if (!RAND_GET_OPTION(RSK_SHUFFLE_ADULT_TRADE)) {
|
||||
break;
|
||||
}
|
||||
if (PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_COJIRO)) {
|
||||
if (Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO)) {
|
||||
*should = false;
|
||||
} else if (PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_ODD_POTION)) {
|
||||
} else if (Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_POTION)) {
|
||||
*should = true;
|
||||
} else {
|
||||
*should = Flags_GetItemGetInf(ITEMGETINF_30); // Traded odd mushroom
|
||||
|
@ -1250,10 +1264,10 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
break;
|
||||
}
|
||||
|
||||
if (PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_COJIRO)) {
|
||||
if (Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO)) {
|
||||
*should = false;
|
||||
} else {
|
||||
*should = PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_ODD_POTION);
|
||||
*should = Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_ODD_POTION);
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -1595,6 +1609,13 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
|
|||
}
|
||||
break;
|
||||
}
|
||||
case VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER: {
|
||||
if (*should) {
|
||||
//remove zelda's letter as this is the only use for it
|
||||
Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VB_FREEZE_ON_SKULL_TOKEN:
|
||||
case VB_TRADE_TIMER_ODD_MUSHROOM:
|
||||
case VB_TRADE_TIMER_FROG:
|
||||
|
@ -2293,6 +2314,13 @@ void RandomizerOnKaleidoscopeUpdateHandler(int16_t inDungeonScene) {
|
|||
prevKaleidoState = gPlayState->pauseCtx.state;
|
||||
}
|
||||
|
||||
void RandomizerOnCuccoOrChickenHatch() {
|
||||
if (LINK_IS_CHILD) {
|
||||
Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_CHICKEN);
|
||||
}
|
||||
}
|
||||
|
||||
void RandomizerRegisterHooks() {
|
||||
static uint32_t onFlagSetHook = 0;
|
||||
static uint32_t onSceneFlagSetHook = 0;
|
||||
|
@ -2310,6 +2338,7 @@ void RandomizerRegisterHooks() {
|
|||
static uint32_t onPlayDestroyHook = 0;
|
||||
static uint32_t onExitGameHook = 0;
|
||||
static uint32_t onKaleidoUpdateHook = 0;
|
||||
static uint32_t onCuccoOrChickenHatchHook = 0;
|
||||
|
||||
static uint32_t fishsanityOnActorInitHook = 0;
|
||||
static uint32_t fishsanityOnActorUpdateHook = 0;
|
||||
|
@ -2345,6 +2374,7 @@ void RandomizerRegisterHooks() {
|
|||
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnPlayDestroy>(onPlayDestroyHook);
|
||||
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnExitGame>(onExitGameHook);
|
||||
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnKaleidoscopeUpdate>(onKaleidoUpdateHook);
|
||||
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnCuccoOrChickenHatch>(onCuccoOrChickenHatchHook);
|
||||
|
||||
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnActorInit>(fishsanityOnActorInitHook);
|
||||
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnActorUpdate>(fishsanityOnActorUpdateHook);
|
||||
|
@ -2373,6 +2403,7 @@ void RandomizerRegisterHooks() {
|
|||
onPlayDestroyHook = 0;
|
||||
onExitGameHook = 0;
|
||||
onKaleidoUpdateHook = 0;
|
||||
onCuccoOrChickenHatchHook = 0;
|
||||
|
||||
fishsanityOnActorInitHook = 0;
|
||||
fishsanityOnActorUpdateHook = 0;
|
||||
|
@ -2414,6 +2445,7 @@ void RandomizerRegisterHooks() {
|
|||
onPlayDestroyHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayDestroy>(RandomizerOnPlayDestroyHandler);
|
||||
onExitGameHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnExitGame>(RandomizerOnExitGameHandler);
|
||||
onKaleidoUpdateHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnKaleidoscopeUpdate>(RandomizerOnKaleidoscopeUpdateHandler);
|
||||
onCuccoOrChickenHatchHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnCuccoOrChickenHatch>(RandomizerOnCuccoOrChickenHatch);
|
||||
|
||||
if (RAND_GET_OPTION(RSK_FISHSANITY) != RO_FISHSANITY_OFF) {
|
||||
OTRGlobals::Instance->gRandoContext->GetFishsanity()->InitializeFromSave();
|
||||
|
|
|
@ -226,7 +226,7 @@ namespace Rando {
|
|||
case RG_EYEBALL_FROG:
|
||||
case RG_EYEDROPS:
|
||||
case RG_CLAIM_CHECK:
|
||||
return HasAdultTrade(StaticData::RetrieveItem(itemName).GetGIEntry()->itemId);
|
||||
return CheckRandoInf(itemName - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG);
|
||||
case RG_BOTTLE_WITH_BIG_POE:
|
||||
case RG_BOTTLE_WITH_BLUE_FIRE:
|
||||
case RG_BOTTLE_WITH_BLUE_POTION:
|
||||
|
@ -1509,7 +1509,7 @@ namespace Rando {
|
|||
case RG_EYEBALL_FROG:
|
||||
case RG_EYEDROPS:
|
||||
case RG_CLAIM_CHECK:
|
||||
SetAdultTrade(item.GetGIEntry()->itemId, state);
|
||||
SetRandoInf(randoGet - RG_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, state);
|
||||
break;
|
||||
case RG_PROGRESSIVE_HOOKSHOT:
|
||||
{
|
||||
|
@ -2079,26 +2079,10 @@ namespace Rando {
|
|||
return ((1 << item) & mSaveContext->inventory.questItems);
|
||||
}
|
||||
|
||||
bool Logic::HasAdultTrade(uint32_t itemID) {
|
||||
int tradeIndex = itemID - ITEM_POCKET_EGG;
|
||||
return mSaveContext->ship.quest.data.randomizer.adultTradeItems & (1 << tradeIndex);
|
||||
}
|
||||
|
||||
void Logic::SetAdultTrade(uint32_t itemID, bool state) {
|
||||
int tradeIndex = itemID - ITEM_POCKET_EGG;
|
||||
if (!state) {
|
||||
mSaveContext->ship.quest.data.randomizer.adultTradeItems &= ~(1 << tradeIndex);
|
||||
}
|
||||
else {
|
||||
mSaveContext->ship.quest.data.randomizer.adultTradeItems |= (1 << tradeIndex);
|
||||
}
|
||||
}
|
||||
|
||||
void Logic::SetQuestItem(uint32_t item, bool state) {
|
||||
if (!state) {
|
||||
mSaveContext->inventory.questItems &= ~(1 << item);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mSaveContext->inventory.questItems |= (1 << item);
|
||||
}
|
||||
}
|
||||
|
@ -2118,8 +2102,7 @@ namespace Rando {
|
|||
void Logic::SetDungeonItem(uint32_t item, uint32_t dungeonIndex, bool state) {
|
||||
if (!state) {
|
||||
mSaveContext->inventory.dungeonItems[dungeonIndex] &= ~gBitFlags[item];
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mSaveContext->inventory.dungeonItems[dungeonIndex] |= gBitFlags[item];
|
||||
}
|
||||
}
|
||||
|
@ -2131,8 +2114,7 @@ namespace Rando {
|
|||
void Logic::SetRandoInf(uint32_t flag, bool state) {
|
||||
if (!state) {
|
||||
mSaveContext->ship.randomizerInf[flag >> 4] &= ~(1 << (flag & 0xF));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mSaveContext->ship.randomizerInf[flag >> 4] |= (1 << (flag & 0xF));
|
||||
}
|
||||
}
|
||||
|
@ -2144,8 +2126,7 @@ namespace Rando {
|
|||
void Logic::SetEventChkInf(int32_t flag, bool state) {
|
||||
if (!state) {
|
||||
mSaveContext->eventChkInf[flag >> 4] &= ~(1 << (flag & 0xF));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mSaveContext->eventChkInf[flag >> 4] |= (1 << (flag & 0xF));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -261,8 +261,6 @@ class Logic {
|
|||
bool CheckEquipment(uint32_t item);
|
||||
bool CheckQuestItem(uint32_t item);
|
||||
void SetQuestItem(uint32_t item, bool state);
|
||||
bool HasAdultTrade(uint32_t item);
|
||||
void SetAdultTrade(uint32_t item, bool state);
|
||||
uint8_t GetSmallKeyCount(uint32_t dungeonIndex);
|
||||
void SetSmallKeyCount(uint32_t dungeonIndex, uint8_t count);
|
||||
bool CheckDungeonItem(uint32_t item, uint32_t dungeonIndex);
|
||||
|
|
|
@ -1325,6 +1325,30 @@ typedef enum {
|
|||
RAND_INF_FISHING_HOLE_UNLOCKED,
|
||||
RAND_INF_FISHING_HOLE_KEY_OBTAINED,
|
||||
|
||||
RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG,
|
||||
RAND_INF_CHILD_TRADES_HAS_CHICKEN,
|
||||
RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_KEATON,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_SKULL,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_GORON,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_ZORA,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO,
|
||||
RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH,
|
||||
|
||||
RAND_INF_ADULT_TRADES_HAS_POCKET_EGG,
|
||||
RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO,
|
||||
RAND_INF_ADULT_TRADES_HAS_COJIRO,
|
||||
RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM,
|
||||
RAND_INF_ADULT_TRADES_HAS_ODD_POTION,
|
||||
RAND_INF_ADULT_TRADES_HAS_SAW,
|
||||
RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN,
|
||||
RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION,
|
||||
RAND_INF_ADULT_TRADES_HAS_FROG,
|
||||
RAND_INF_ADULT_TRADES_HAS_EYEDROPS,
|
||||
RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK,
|
||||
|
||||
// If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16)
|
||||
|
||||
RAND_INF_MAX,
|
||||
|
|
|
@ -260,11 +260,6 @@ extern "C" void Randomizer_InitSaveFile() {
|
|||
// Give Link's pocket item
|
||||
GiveLinksPocketItem();
|
||||
|
||||
// shuffle adult trade quest
|
||||
if (Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE)) {
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems = 0;
|
||||
}
|
||||
|
||||
// remove One Time scrubs with scrubsanity off
|
||||
if (Randomizer_GetSettingValue(RSK_SHUFFLE_SCRUBS) == RO_SCRUBS_OFF) {
|
||||
Flags_SetRandomizerInf(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE);
|
||||
|
@ -316,6 +311,7 @@ extern "C" void Randomizer_InitSaveFile() {
|
|||
|
||||
// Set "Got Zelda's Letter" flag. Also ensures Saria is back at SFM.
|
||||
Flags_SetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA);
|
||||
|
||||
// Got item from impa
|
||||
Flags_SetEventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY);
|
||||
|
@ -325,6 +321,7 @@ extern "C" void Randomizer_InitSaveFile() {
|
|||
// set this at the end to ensure we always start with the letter
|
||||
// this is for the off chance we got the weird egg from impa (which should never happen)
|
||||
INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_LETTER_ZELDA;
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA);
|
||||
}
|
||||
|
||||
if (Randomizer_GetSettingValue(RSK_SHUFFLE_MASTER_SWORD) && startingAge == RO_AGE_ADULT) {
|
||||
|
@ -375,6 +372,7 @@ extern "C" void Randomizer_InitSaveFile() {
|
|||
|
||||
if (Randomizer_GetSettingValue(RSK_KAK_GATE) == RO_KAK_GATE_OPEN) {
|
||||
Flags_SetInfTable(INFTABLE_SHOWED_ZELDAS_LETTER_TO_GATE_GUARD);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA);
|
||||
}
|
||||
|
||||
if (Randomizer_GetSettingValue(RSK_GERUDO_FORTRESS) == RO_GF_CARPENTERS_FAST ||
|
||||
|
@ -412,6 +410,16 @@ extern "C" void Randomizer_InitSaveFile() {
|
|||
if (Randomizer_GetSettingValue(RSK_COMPLETE_MASK_QUEST)) {
|
||||
Flags_SetInfTable(INFTABLE_GATE_GUARD_PUT_ON_KEATON_MASK);
|
||||
Flags_SetEventChkInf(EVENTCHKINF_PAID_BACK_BUNNY_HOOD_FEE);
|
||||
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_KEATON);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_SKULL);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_GORON);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_ZORA);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO);
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH);
|
||||
|
||||
gSaveContext.itemGetInf[3] |= 0x100; // Sold Keaton Mask
|
||||
gSaveContext.itemGetInf[3] |= 0x200; // Sold Skull Mask
|
||||
gSaveContext.itemGetInf[3] |= 0x400; // Sold Spooky Mask
|
||||
|
|
|
@ -218,8 +218,6 @@ void SaveManager::LoadRandomizerVersion1() {
|
|||
}
|
||||
randoContext->AddHint(RH_GANONDORF_JOKE, Rando::Hint(RH_GANONDORF_JOKE, {CustomMessage(ganonText)}));
|
||||
|
||||
SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems);
|
||||
|
||||
SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected);
|
||||
|
||||
SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount);
|
||||
|
@ -348,8 +346,6 @@ void SaveManager::LoadRandomizerVersion2() {
|
|||
SaveManager::Instance->LoadData("warpPreludeText", warpPreludeText);
|
||||
randoContext->AddHint(RH_PRELUDE_WARP_LOC, Rando::Hint(RH_PRELUDE_WARP_LOC, {CustomMessage(warpPreludeText)}));
|
||||
|
||||
SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems);
|
||||
|
||||
SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected);
|
||||
|
||||
SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount);
|
||||
|
@ -445,8 +441,6 @@ void SaveManager::LoadRandomizerVersion3() {
|
|||
randoContext->AddHint(hint, Rando::Hint(hint, json));
|
||||
});
|
||||
|
||||
SaveManager::Instance->LoadData("adultTradeItems", gSaveContext.ship.quest.data.randomizer.adultTradeItems);
|
||||
|
||||
SaveManager::Instance->LoadData("triforcePiecesCollected", gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected);
|
||||
|
||||
SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount);
|
||||
|
@ -582,8 +576,6 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f
|
|||
});
|
||||
});
|
||||
|
||||
SaveManager::Instance->SaveData("adultTradeItems", saveContext->ship.quest.data.randomizer.adultTradeItems);
|
||||
|
||||
SaveManager::Instance->SaveData("triforcePiecesCollected", saveContext->ship.quest.data.randomizer.triforcePiecesCollected);
|
||||
|
||||
SaveManager::Instance->SaveData("pendingIceTrapCount", saveContext->ship.pendingIceTrapCount);
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include "soh/frame_interpolation.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
||||
typedef enum {
|
||||
/* 0 */ LENS_FLARE_CIRCLE0,
|
||||
|
@ -2111,6 +2113,7 @@ void func_80075B44(PlayState* play) {
|
|||
if ((Inventory_ReplaceItem(play, ITEM_WEIRD_EGG, ITEM_CHICKEN) ||
|
||||
Inventory_HatchPocketCucco(play)) &&
|
||||
play->csCtx.state == 0 && !Player_InCsMode(play)) {
|
||||
GameInteractor_ExecuteOnCuccoOrChickenHatch();
|
||||
Message_StartTextbox(play, 0x3066, NULL);
|
||||
}
|
||||
play->envCtx.unk_E0++;
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
#include "textures/do_action_static/do_action_static.h"
|
||||
#include "textures/icon_item_static/icon_item_static.h"
|
||||
#include "soh_assets.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/Enhancements/randomizer/randomizer_entrance.h"
|
||||
|
||||
#include "libultraship/bridge.h"
|
||||
|
@ -2446,8 +2445,17 @@ u8 Item_Give(PlayState* play, u8 item) {
|
|||
Flags_SetItemGetInf(ITEMGETINF_OBTAINED_NUT_UPGRADE_FROM_STAGE);
|
||||
}
|
||||
|
||||
if (item >= ITEM_POCKET_EGG) {
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(item);
|
||||
if (IS_RANDO) {
|
||||
if (item >= ITEM_POCKET_EGG) {
|
||||
Flags_SetRandomizerInf(item - ITEM_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG);
|
||||
} else if (item == ITEM_LETTER_ZELDA) {
|
||||
//don't care about zelda's letter if it's already been shown to the guard
|
||||
if (!Flags_GetInfTable(INFTABLE_SHOWED_ZELDAS_LETTER_TO_GATE_GUARD)) {
|
||||
Flags_SetRandomizerInf(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA);
|
||||
}
|
||||
} else {
|
||||
Flags_SetRandomizerInf(item - ITEM_WEIRD_EGG + RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG);
|
||||
}
|
||||
}
|
||||
|
||||
temp = INV_CONTENT(item);
|
||||
|
@ -2759,12 +2767,12 @@ bool Inventory_HatchPocketCucco(PlayState* play) {
|
|||
return Inventory_ReplaceItem(play, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO);
|
||||
}
|
||||
|
||||
if (!PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_POCKET_EGG)) {
|
||||
if (!Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems &= ~ADULT_TRADE_FLAG(ITEM_POCKET_EGG);
|
||||
gSaveContext.ship.quest.data.randomizer.adultTradeItems |= ADULT_TRADE_FLAG(ITEM_POCKET_CUCCO);
|
||||
Flags_UnsetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG);
|
||||
Flags_SetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO);
|
||||
Inventory_ReplaceItem(play, ITEM_POCKET_EGG, ITEM_POCKET_CUCCO);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -521,6 +521,7 @@ void Play_Init(GameState* thisx) {
|
|||
|
||||
if (Inventory_ReplaceItem(play, ITEM_WEIRD_EGG, ITEM_CHICKEN) ||
|
||||
Inventory_HatchPocketCucco(play)) {
|
||||
GameInteractor_ExecuteOnCuccoOrChickenHatch();
|
||||
Message_StartTextbox(play, 0x3066, NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include "overlays/actors/ovl_Bg_Dodoago/z_bg_dodoago.h"
|
||||
|
||||
#include "soh/mq_asset_hacks.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
|
||||
|
@ -1300,7 +1299,7 @@ void func_8009EE44(PlayState* play) {
|
|||
|
||||
bool playerHasCojiro = INV_CONTENT(ITEM_COJIRO) == ITEM_COJIRO;
|
||||
if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ADULT_TRADE)) {
|
||||
playerHasCojiro = PLAYER_HAS_SHUFFLED_ADULT_TRADE_ITEM(ITEM_COJIRO);
|
||||
playerHasCojiro = Flags_GetRandomizerInf(RAND_INF_ADULT_TRADES_HAS_COJIRO);
|
||||
}
|
||||
if ((play->roomCtx.unk_74[0] == 0) && playerHasCojiro) {
|
||||
if (play->roomCtx.unk_74[1] == 50) {
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
#include "z_en_ds.h"
|
||||
#include "objects/object_ds/object_ds.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
#include "objects/object_oF1d_map/object_oF1d_map.h"
|
||||
#include "soh/frame_interpolation.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
|
||||
#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED)
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
#include "objects/object_oF1d_map/object_oF1d_map.h"
|
||||
#include "soh/frame_interpolation.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
|
||||
#include "overlays/actors/ovl_Bg_Spot15_Saku/z_bg_spot15_saku.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
||||
#define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY)
|
||||
|
||||
|
@ -407,7 +409,7 @@ void func_80A53AD4(EnHeishi2* this, PlayState* play) {
|
|||
this->unk_300 = TEXT_STATE_DONE;
|
||||
if (Actor_ProcessTalkRequest(&this->actor, play)) {
|
||||
exchangeItemId = func_8002F368(play);
|
||||
if (exchangeItemId == EXCH_ITEM_LETTER_ZELDA) {
|
||||
if (GameInteractor_Should(VB_HEISHI2_ACCEPT_ITEM_AS_ZELDAS_LETTER, exchangeItemId == EXCH_ITEM_LETTER_ZELDA, exchangeItemId)) {
|
||||
Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME);
|
||||
player->actor.textId = 0x2010;
|
||||
this->unk_300 = TEXT_STATE_EVENT;
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
#include "z_en_hs.h"
|
||||
#include "vt.h"
|
||||
#include "objects/object_hs/object_hs.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#include "objects/object_km1/object_km1.h"
|
||||
#include "objects/object_kw1/object_kw1.h"
|
||||
#include "vt.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
#include "z_en_kz.h"
|
||||
#include "objects/object_kz/object_kz.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
#include "z_en_mk.h"
|
||||
#include "objects/object_mk/object_mk.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#include "objects/object_os_anime/object_os_anime.h"
|
||||
#include "overlays/actors/ovl_En_Niw/z_en_niw.h"
|
||||
#include "vt.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
#include "z_en_toryo.h"
|
||||
#include "objects/object_toryo/object_toryo.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "soh/ResourceManagerHelpers.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "z_kaleido_scope.h"
|
||||
#include "textures/parameter_static/parameter_static.h"
|
||||
#include "textures/icon_item_static/icon_item_static.h"
|
||||
#include "soh/Enhancements/randomizer/adult_trade_shuffle.h"
|
||||
#include "soh/Enhancements/randomizer/ShuffleTradeItems.h"
|
||||
#include "soh/Enhancements/randomizer/randomizerTypes.h"
|
||||
#include "soh/Enhancements/enhancementTypes.h"
|
||||
#include "soh/Enhancements/cosmetics/cosmeticsTypes.h"
|
||||
|
@ -316,6 +316,10 @@ void KaleidoScope_HandleItemCycleExtras(PlayState* play, u8 slot, bool canCycle,
|
|||
}
|
||||
|
||||
bool CanMaskSelect() {
|
||||
if (IS_RANDO) {
|
||||
return CVarGetInteger(CVAR_ENHANCEMENT("MaskSelect"), 0) /* || Randomizer_GetSettingValue(RSK_SHUFFLE_CHILD_TRADE) */;
|
||||
}
|
||||
|
||||
// only allow mask select when:
|
||||
// the shop is open:
|
||||
// * zelda's letter check: Flags_GetEventChkInf(EVENTCHKINF_OBTAINED_ZELDAS_LETTER)
|
||||
|
@ -333,12 +337,20 @@ void KaleidoScope_HandleItemCycles(PlayState* play) {
|
|||
play,
|
||||
SLOT_TRADE_CHILD,
|
||||
CanMaskSelect(),
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ?
|
||||
ITEM_MASK_TRUTH :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) - 1,
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ?
|
||||
ITEM_MASK_KEATON :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) + 1,
|
||||
IS_RANDO ?
|
||||
Randomizer_GetPrevChildTradeItem() :
|
||||
(
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ?
|
||||
ITEM_MASK_TRUTH :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) - 1
|
||||
),
|
||||
IS_RANDO ?
|
||||
Randomizer_GetNextChildTradeItem() :
|
||||
(
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ?
|
||||
ITEM_MASK_KEATON :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) + 1
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
|
@ -379,12 +391,20 @@ void KaleidoScope_DrawItemCycles(PlayState* play) {
|
|||
play,
|
||||
SLOT_TRADE_CHILD,
|
||||
CanMaskSelect(),
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ?
|
||||
ITEM_MASK_TRUTH :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) - 1,
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ?
|
||||
ITEM_MASK_KEATON :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) + 1
|
||||
IS_RANDO ?
|
||||
Randomizer_GetPrevChildTradeItem() :
|
||||
(
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) <= ITEM_MASK_KEATON || INV_CONTENT(ITEM_TRADE_CHILD) > ITEM_MASK_TRUTH ?
|
||||
ITEM_MASK_TRUTH :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) - 1
|
||||
),
|
||||
IS_RANDO ?
|
||||
Randomizer_GetNextChildTradeItem() :
|
||||
(
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) >= ITEM_MASK_TRUTH || INV_CONTENT(ITEM_TRADE_CHILD) < ITEM_MASK_KEATON ?
|
||||
ITEM_MASK_KEATON :
|
||||
INV_CONTENT(ITEM_TRADE_CHILD) + 1
|
||||
)
|
||||
);
|
||||
|
||||
//draw the adult trade select
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue