Implements fixes for competing getItem calls.

This commit is contained in:
Christopher Leggett 2022-08-06 22:51:15 -04:00
parent 194c4f4e52
commit cfce0eba3d
No known key found for this signature in database
GPG Key ID: 7093AE5FF7037D79
8 changed files with 69 additions and 18 deletions

View File

@ -2,6 +2,7 @@
#define Z64PLAYER_H
#include "z64actor.h"
#include "soh/Enhancements/item-tables/ItemTableTypes.h"
struct Player;
@ -626,6 +627,7 @@ typedef struct Player {
/* 0x0A87 */ u8 unk_A87;
/* 0x0A88 */ Vec3f unk_A88; // previous body part 0 position
/* 0x0A94 */ PendingFlag pendingFlag;
} Player; // size = 0xA94
/* 0x0AA0 */ GetItemEntry getItemEntry;
} Player; // size = 0xAA8
#endif

View File

@ -10,4 +10,4 @@ typedef struct {
/* 0x03 */ uint16_t textId;
/* 0x04 */ uint16_t objectId;
/* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up?
} GetItemEntry; // size = 0x06
} GetItemEntry; // size = 0x08

View File

@ -1647,6 +1647,21 @@ extern "C" int Randomizer_CopyHintFromCheck(RandomizerCheck check, char* buffer,
return CopyStringToCharBuffer(hintText, buffer, maxBufferSize);
}
extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) {
if (OTRGlobals::Instance->getItemModIndex != MOD_VANILLA) {
getItemID++; // counteracts the - 1 offset used for vanilla table
}
return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID);
}
extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) {
if (tableID == MOD_VANILLA) {
getItemID--; // counteracts the - 1 offset used for vanilla table
}
return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID);
}
extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) {
if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) {
OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER;
@ -1656,6 +1671,18 @@ extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 a
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum);
}
extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) {
s16 getItemModIndex;
if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(
OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) {
getItemModIndex = MOD_RANDOMIZER;
} else {
getItemModIndex = MOD_VANILLA;
}
s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum);
return ItemTable_RetrieveEntry(getItemModIndex, itemID);
}
extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) {
if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) {
OTRGlobals::Instance->getItemModIndex = MOD_RANDOMIZER;
@ -1665,6 +1692,17 @@ extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerChec
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId);
}
extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) {
s16 getItemModIndex;
if (OTRGlobals::Instance->gRandomizer->CheckContainsRandoItem(randomizerCheck)) {
getItemModIndex = MOD_RANDOMIZER;
} else {
getItemModIndex = MOD_VANILLA;
}
s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId);
return ItemTable_RetrieveEntry(getItemModIndex, itemID);
}
extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) {
return gSaveContext.n64ddFlag && (actor->parent != NULL) &&
Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP;
@ -1673,11 +1711,3 @@ extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomize
extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) {
return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP;
}
extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) {
if (OTRGlobals::Instance->getItemModIndex != MOD_VANILLA) {
getItemID++; // counteracts the - 1 offset used for vanilla table
}
return ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID);
}

View File

@ -104,6 +104,8 @@ s16 Randomizer_GetItemModelFromId(s16 itemId);
s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId);
s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor);
bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId);
GetItemEntry ItemTable_Retrieve(int16_t getItemID);

View File

@ -2206,7 +2206,7 @@ u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) {
if (item >= RG_BOTTLE_WITH_RED_POTION && item <= RG_BOTTLE_WITH_BIG_POE) {
temp = SLOT(ITEM_BOTTLE);
for (i = 0; i < 4; i++) {
if (gSaveContext.inventory.items[temp + i] == RG_NONE) {
if (gSaveContext.inventory.items[temp + i] == ITEM_NONE) {
switch (item) {
case RG_BOTTLE_WITH_RED_POTION:
item = ITEM_POTION_RED;
@ -2238,7 +2238,7 @@ u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry) {
}
gSaveContext.inventory.items[temp + i] = item;
return RG_NONE;
return ITEM_NONE;
}
}
}

View File

@ -242,8 +242,10 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi
(gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) &&
!Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) &&
globalCtx->sceneLoadFlag == 0) {
GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT);
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT);
GiveItemWithoutActor(globalCtx, getItemId);
player->getItemEntry = getItem;
player->pendingFlag.flagID = 0x1E;
player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
}

View File

@ -296,6 +296,7 @@ void GivePlayerRandoRewardSheikSong(EnXc* sheik, GlobalContext* globalCtx, Rando
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, ogSongId);
if (check == RC_SHEIK_AT_TEMPLE && !Flags_GetTreasure(globalCtx, 0x1F)) {
if (func_8002F434(&sheik->actor, globalCtx, getItemId, 10000.0f, 100.0f)) {
player->getItemEntry = Randomizer_GetItemFromKnownCheck(check, ogSongId);
player->pendingFlag.flagID = 0x1F;
player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
}

View File

@ -1592,7 +1592,12 @@ s32 func_808332E4(Player* this) {
}
void func_808332F4(Player* this, GlobalContext* globalCtx) {
GetItemEntry giEntry = ItemTable_Retrieve(this->getItemId - 1);
GetItemEntry giEntry;
if (this->getItemEntry.objectId == OBJECT_INVALID) {
giEntry = ItemTable_Retrieve(this->getItemId - 1);
} else {
giEntry = this->getItemEntry;
}
this->unk_862 = ABS(giEntry.gi);
}
@ -6324,7 +6329,12 @@ s32 func_8083E5A8(Player* this, GlobalContext* globalCtx) {
} else if (CHECK_BTN_ALL(sControlInput->press.button, BTN_A) && !(this->stateFlags1 & PLAYER_STATE1_11) &&
!(this->stateFlags2 & PLAYER_STATE2_10)) {
if (this->getItemId != GI_NONE) {
GetItemEntry giEntry = ItemTable_Retrieve(-this->getItemId - 1);
GetItemEntry giEntry;
if (this->getItemEntry.objectId == OBJECT_INVALID) {
giEntry = ItemTable_Retrieve(-this->getItemId - 1);
} else {
giEntry = this->getItemEntry;
}
EnBox* chest = (EnBox*)interactedActor;
if (CVar_GetS32("gFastChests", 0) != 0) {
giEntry.gi = -1 * abs(giEntry.gi);
@ -12701,12 +12711,16 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) {
s32 temp1;
s32 temp2;
if (this->getItemId == GI_NONE) {
if (this->getItemId == GI_NONE && this->getItemEntry.objectId == OBJECT_INVALID) {
return 1;
}
if (this->unk_84F == 0) {
giEntry = ItemTable_Retrieve(this->getItemId - 1);
if (this->getItemEntry.objectId == OBJECT_INVALID) {
giEntry = ItemTable_Retrieve(this->getItemId - 1);
} else {
giEntry = this->getItemEntry;
}
this->unk_84F = 1;
// make sure we get the BGS instead of giant's knife
@ -12723,6 +12737,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) {
Randomizer_Item_Give(globalCtx, giEntry);
}
Player_SetPendingFlag(this, globalCtx);
this->getItemEntry = (GetItemEntry)GET_ITEM_NONE;
if (((this->getItemId >= GI_RUPEE_GREEN) && (this->getItemId <= GI_RUPEE_RED)) ||
((this->getItemId >= GI_RUPEE_PURPLE) && (this->getItemId <= GI_RUPEE_GOLD)) ||
@ -12741,8 +12756,7 @@ s32 func_8084DFF4(GlobalContext* globalCtx, Player* this) {
}
Audio_PlayFanfare(temp1);
}
}
else {
} else {
if (Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CLOSING) {
if (this->getItemId == GI_GAUNTLETS_SILVER && !gSaveContext.n64ddFlag) {
globalCtx->nextEntranceIndex = 0x0123;