Move adult trade to flags

This commit is contained in:
Pepe20129 2025-01-28 22:14:24 +01:00
parent 668e266ecc
commit 24699f8ce3
13 changed files with 63 additions and 80 deletions

View File

@ -160,7 +160,6 @@ typedef struct {
#pragma region SoH
typedef struct ShipRandomizerSaveContextData {
u16 adultTradeItems;
u8 triforcePiecesCollected;
} ShipRandomizerSaveContextData;

View File

@ -414,6 +414,7 @@ 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;
@ -430,6 +431,7 @@ void DrawBGSItemFlag(uint8_t itemID) {
Inventory_ReplaceItem(gPlayState, itemID, Randomizer_GetNextAdultTradeItem());
}
}
*/
}
void DrawInventoryTab() {
@ -476,9 +478,11 @@ 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 +516,15 @@ 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
/*
// 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));

View File

@ -1,19 +1,13 @@
#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)) {
if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) {
return ITEM_POCKET_EGG + tradeIndex;
}
}
@ -25,7 +19,7 @@ u8 Randomizer_GetPrevAdultTradeItem() {
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)) {
if (Flags_GetRandomizerInf(tradeIndex + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG)) {
return ITEM_POCKET_EGG + tradeIndex;
}
}

View File

@ -1,13 +1,9 @@
#ifndef Z_ADULT_TRADE_SHUFFLE_H
#define Z_ADULT_TRADE_SHUFFLE_H
#include <z64.h>
#include <libultraship/libultra/types.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
#endif

View File

@ -220,10 +220,12 @@ 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(play, 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(play, ITEM_EYEDROPS, Randomizer_GetNextAdultTradeItem());
break;
}
}
@ -1170,7 +1172,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l
EnFr* enFr = va_arg(args, EnFr*);
if (
(enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) ||
(enFr->songIndex >= FROG_STORMS && enFr->reward == GI_HEART_PIECE) ||
(enFr->songIndex < FROG_STORMS && enFr->reward == GI_RUPEE_PURPLE)
) {
*should = true;
@ -1179,7 +1181,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(play, ITEM_POCKET_CUCCO, Randomizer_GetNextAdultTradeItem());
// Trigger the reward now
Flags_SetItemGetInf(ITEMGETINF_2E);
enNiwLady->actionFunc = func_80ABA778;
@ -1188,13 +1191,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(play, 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(play, ITEM_ODD_MUSHROOM, Randomizer_GetNextAdultTradeItem());
// Trigger the reward now
Flags_SetItemGetInf(ITEMGETINF_30);
granny->actor.textId = 0x504F;
@ -1205,14 +1210,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(play, 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(play, ITEM_SAW, Randomizer_GetNextAdultTradeItem());
*should = false;
break;
}
@ -1229,14 +1236,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(play, 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(play, ITEM_PRESCRIPTION, Randomizer_GetNextAdultTradeItem());
} else {
Flags_SetRandomizerInf(RAND_INF_KING_ZORA_THAWED);
}
@ -1245,7 +1254,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(play, ITEM_FROG, Randomizer_GetNextAdultTradeItem());
*should = false;
break;
}
@ -1282,9 +1292,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
@ -1296,10 +1306,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;

View File

@ -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:
@ -1481,7 +1481,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:
{
@ -2048,26 +2048,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);
}
}
@ -2087,8 +2071,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];
}
}
@ -2100,8 +2083,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));
}
}
@ -2113,8 +2095,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));
}
}

View File

@ -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);

View File

@ -1325,6 +1325,18 @@ typedef enum {
RAND_INF_FISHING_HOLE_UNLOCKED,
RAND_INF_FISHING_HOLE_KEY_OBTAINED,
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,

View File

@ -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);

View File

@ -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);

View File

@ -2446,8 +2446,8 @@ 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 (item >= ITEM_POCKET_EGG && IS_RANDO) {
Flags_SetRandomizerInf(item - ITEM_POCKET_EGG + RAND_INF_ADULT_TRADES_HAS_POCKET_EGG);
}
temp = INV_CONTENT(item);
@ -2759,12 +2759,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)) {
return 0;
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;
}

View File

@ -1300,7 +1300,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) {

View File

@ -386,7 +386,7 @@ void KaleidoScope_DrawItemCycles(PlayState* play) {
ITEM_MASK_KEATON :
INV_CONTENT(ITEM_TRADE_CHILD) + 1
);
//draw the adult trade select
KaleidoScope_DrawItemCycleExtras(
play,