mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-08-13 17:03:47 -04:00
Implements fixes for competing getItem calls.
This commit is contained in:
parent
194c4f4e52
commit
cfce0eba3d
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user