Skip to content

Commit

Permalink
Fix Link not spawning back with proper sword if it was stolen. (#23)
Browse files Browse the repository at this point in the history
Fix draw items for progressive swords, wallets, and magic.
  • Loading branch information
PhlexPlexico authored Feb 5, 2024
1 parent 838c070 commit 576608c
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 9 deletions.
2 changes: 2 additions & 0 deletions code/include/rnd/item_override.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "game/common_data.h"
#include "game/context.h"
#include "game/items.h"
#include "rnd/savefile.h"
#include "z3d/z3DVec.h"

namespace rnd {
Expand Down Expand Up @@ -438,6 +439,7 @@ namespace rnd {
void ItemOverride_Update();
void ItemOverride_RevealMapBasedOnId(u8);
void SetExtData(void);
u8 ItemOverride_SetProgressiveItemDraw(ItemOverride);
extern "C" bool ItemOverride_CheckAromaGivenItem();
extern "C" bool ItemOverride_CheckMikauGivenItem();
extern "C" bool ItemOverride_CheckDarmaniGivenItem();
Expand Down
1 change: 1 addition & 0 deletions code/include/rnd/link.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "game/pad.h"
#include "game/ui.h"
#include "game/ui/layouts/play_hud.h"
#include "rnd/savefile.h"
#include "rnd/settings.h"

namespace rnd::link {
Expand Down
5 changes: 3 additions & 2 deletions code/include/rnd/savefile.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include "z3d/z3DVec.h"

// Increment the version number whenever the ExtSaveData structure is changed
#define EXTSAVEDATA_VERSION 13
#define EXTSAVEDATA_VERSION 14
#define SAVEFILE_SCENES_DISCOVERED_IDX_COUNT 4
#define SAVEFILE_SPOILER_ITEM_MAX 512

Expand Down Expand Up @@ -85,7 +85,8 @@ namespace rnd {
BitField<41, 1, u64> bottleSeahorseGiven;
BitField<42, 1, u64> bottleChateuGiven;
BitField<43, 1, u64> bottleMysteryMilkGiven;
BitField<44, 20, u64> unused;
BitField<44, 2, u64> progressiveSwordUpgrade;
BitField<45, 18, u64> unused;
};
GivenItemRegister givenItemChecks;
union FairyCollectRegister {
Expand Down
5 changes: 5 additions & 0 deletions code/source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ namespace rnd {

const u32 pressedButtons = gctx->pad_state.input.buttons.flags;
const u32 newButtons = gctx->pad_state.input.new_buttons.flags;
#if defined ENABLE_DEBUG || defined DEBUG_PRINT
auto& saveData = game::GetCommonData().save.equipment;
if (newButtons == (u32)game::pad::Button::ZR)
rnd::util::Print("%s: Sword flag is %u\n", __func__, saveData.sword_shield.sword);
#endif
if (gSettingsContext.customMaskButton != 0 && pressedButtons == gSettingsContext.customMaskButton) {
game::ui::OpenScreen(game::ui::ScreenType::Masks);
} else if (gSettingsContext.customItemButton != 0 && pressedButtons == gSettingsContext.customItemButton) {
Expand Down
35 changes: 29 additions & 6 deletions code/source/rnd/item_override.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ namespace rnd {
rItemOverrides[0].value.looksLikeItemId = 0x26;
rItemOverrides[1].key.scene = 0x6F;
rItemOverrides[1].key.type = ItemOverride_Type::OVR_COLLECTABLE;
rItemOverrides[1].value.getItemId = 0x60;
rItemOverrides[1].value.looksLikeItemId = 0x60;
rItemOverrides[1].value.getItemId = 0x48;
rItemOverrides[1].value.looksLikeItemId = 0x48;
rItemOverrides[2].key.scene = 0x12;
rItemOverrides[2].key.type = ItemOverride_Type::OVR_COLLECTABLE;
rItemOverrides[2].value.getItemId = 0x37;
Expand Down Expand Up @@ -142,11 +142,8 @@ namespace rnd {

ItemRow* itemRow = ItemTable_GetItemRow(resolvedGetItemId);
// XXX: Maybe create function for progressive items so that the item drawn is correct?
u8 looksLikeItemId = override.value.looksLikeItemId;
u8 looksLikeItemId = ItemOverride_SetProgressiveItemDraw(override);

if (override.value.getItemId == 0x12) { // Ice trap
looksLikeItemId = 0;
}
rActiveItemOverride = override;
rActiveItemRow = itemRow;
rActiveItemActionId = itemRow->itemId;
Expand Down Expand Up @@ -580,6 +577,32 @@ namespace rnd {
return;
}

u8 ItemOverride_SetProgressiveItemDraw(ItemOverride override) {
game::SaveData saveData = game::GetCommonData().save;
if (override.value.getItemId == 0x12) { // Ice trap
return 0;
} else if (override.value.getItemId == 0x4A) {
game::SwordType sword = saveData.equipment.sword_shield.sword;
if (sword == game::SwordType::NoSword)
return (u8)GetItemID::GI_KOKIRI_SWORD;
else if (sword == game::SwordType::KokiriSword)
return (u8)GetItemID::GI_RAZOR_SWORD;
else
return (u8)GetItemID::GI_GILDED_SWORD;
} else if (override.value.getItemId == 0x49) {
if (saveData.player.magic_acquired == 0) {
return 0x0E;
} else
return 0x0F;
} else if (override.value.getItemId == 0x48) {
if (saveData.inventory.inventory_count_register.wallet_upgrade == 0)
return 0x08;
else
return 0x09;
}
return override.value.looksLikeItemId;
}

extern "C" {
bool ItemOverride_CheckAromaGivenItem() {
if (gExtSaveData.givenItemChecks.enAlGivenItem > 0)
Expand Down
3 changes: 3 additions & 0 deletions code/source/rnd/item_upgrade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,13 @@ namespace rnd {
case game::SwordType::NoSword:
return GetItemID::GI_KOKIRI_SWORD; // Stolen sword?
case game::SwordType::KokiriSword:
gExtSaveData.givenItemChecks.progressiveSwordUpgrade = 1;
return GetItemID::GI_RAZOR_SWORD; // Razor sword
case game::SwordType::RazorSword:
gExtSaveData.givenItemChecks.progressiveSwordUpgrade = 2;
return GetItemID::GI_GILDED_SWORD; // Gilded sword
default:
gExtSaveData.givenItemChecks.progressiveSwordUpgrade = 2;
return GetItemID::GI_GILDED_SWORD; // Restore stolen sword?
}
}
Expand Down
10 changes: 10 additions & 0 deletions code/source/rnd/link.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,16 @@ namespace rnd::link {

void SongOfTimeSwordPlacement() {
game::SaveData& saveData = game::GetCommonData().save;
// Check to see if we received any sword upgrades.
if (gExtSaveData.givenItemChecks.progressiveSwordUpgrade == 1) {
saveData.equipment.data[0].item_btn_b = game::ItemId::RazorSword;
saveData.equipment.sword_shield.sword = game::SwordType::RazorSword;
return;
} else if (gExtSaveData.givenItemChecks.progressiveSwordUpgrade == 2) {
saveData.equipment.data[0].item_btn_b = game::ItemId::GildedSword;
saveData.equipment.sword_shield.sword = game::SwordType::GildedSword;
return;
}
if (gSettingsContext.startingKokiriSword == (u8)StartingSwordSetting::STARTINGSWORD_NONE &&
saveData.equipment.sword_shield.sword == game::SwordType::NoSword) {
return;
Expand Down
2 changes: 1 addition & 1 deletion code/source/rnd/savefile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ namespace rnd {
// saveData.inventory.collect_register.song_of_healing = 1; // until happy mask salesman is overridden
saveData.player.owl_statue_flags.clock_town = 1;
#ifdef ENABLE_DEBUG
gSettingsContext.startingKokiriSword = 2;
gSettingsContext.startingKokiriSword = 0;
gSettingsContext.startingShield = 0;
#endif
SaveFile_SetStartingInventory();
Expand Down

0 comments on commit 576608c

Please sign in to comment.