Skip to content

Commit ded5d42

Browse files
committed
Cache Issue Fix
Cleared the cache for Mario's and the partners' stats upon entering a battle if they were modified manually.
1 parent e94a7ac commit ded5d42

File tree

6 files changed

+58
-7
lines changed

6 files changed

+58
-7
lines changed

ttyd-tools/rel/include/global.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,12 @@ struct ClearAreaFlagsStruct
417417
bool StartClearingFlags;
418418
};
419419

420+
struct ClearCacheForBattlesStruct
421+
{
422+
bool MarioStatsShouldBeCleared;
423+
bool PartnerStatsShouldBeCleared;
424+
};
425+
420426
struct TrickDisplay
421427
{
422428
uint32_t MainTimer;
@@ -463,6 +469,7 @@ extern SaveAnywhereStruct SaveAnywhere;
463469
extern ReloadRoomStruct ReloadRoom;
464470
extern SpawnItems SpawnItem;
465471
extern ClearAreaFlagsStruct ClearAreaFlags;
472+
extern ClearCacheForBattlesStruct ClearCacheForBattles;
466473
extern TrickDisplay YoshiSkip;
467474
extern TrickDisplay PalaceSkip;
468475
extern OnScreenTimerDisplay OnScreenTimer;

ttyd-tools/rel/include/mod.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Mod
1515
void preventButtonInputInBattle();
1616
int32_t pauseMenuPreventUnpause(void *);
1717
bool infiniteItemUsage(int16_t, uint32_t);
18-
bool recheckBattleJumpAndHammerLevels();
18+
bool performPreBattleActions();
1919
int32_t preventMenuSounds(int32_t, uint32_t, uint32_t, uint32_t);
2020
const char *getCustomMessage(const char *);
2121

ttyd-tools/rel/source/global.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ struct SaveAnywhereStruct SaveAnywhere;
779779
struct ReloadRoomStruct ReloadRoom;
780780
struct SpawnItems SpawnItem;
781781
struct ClearAreaFlagsStruct ClearAreaFlags;
782+
struct ClearCacheForBattlesStruct ClearCacheForBattles;
782783
struct TrickDisplay YoshiSkip;
783784
struct TrickDisplay PalaceSkip;
784785
struct OnScreenTimerDisplay OnScreenTimer;

ttyd-tools/rel/source/main.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <ttyd/mario.h>
1212
#include <ttyd/evt_sub.h>
1313
#include <ttyd/mario_pouch.h>
14+
#include <ttyd/OSCache.h>
1415

1516
#include <cstdio>
1617

@@ -325,11 +326,31 @@ void Mod::preventButtonInputInBattle()
325326
mPFN_BattlePadManager_trampoline();
326327
}
327328

328-
bool Mod::recheckBattleJumpAndHammerLevels()
329+
bool Mod::performPreBattleActions()
329330
{
330331
// Make sure the Jump and Hammer upgrades have been properly checked
331332
recheckJumpAndHammerLevels();
332333

334+
// Clear the cache for Mario if his stats were changed manually
335+
if (ClearCacheForBattles.MarioStatsShouldBeCleared)
336+
{
337+
ClearCacheForBattles.MarioStatsShouldBeCleared = false;
338+
339+
uint32_t PouchPtr = reinterpret_cast<uint32_t>(ttyd::mario_pouch::pouchGetPtr());
340+
void *AddressesToClearStart = reinterpret_cast<void *>(PouchPtr + 0x70);
341+
ttyd::OSCache::DCFlushRange(AddressesToClearStart, 0x21);
342+
}
343+
344+
// Clear the cache for the partners if their stats were changed manually
345+
if (ClearCacheForBattles.PartnerStatsShouldBeCleared)
346+
{
347+
ClearCacheForBattles.PartnerStatsShouldBeCleared = false;
348+
349+
uint32_t PouchPtr = reinterpret_cast<uint32_t>(ttyd::mario_pouch::pouchGetPtr());
350+
void *AddressesToClearStart = reinterpret_cast<void *>(PouchPtr + 0xE);
351+
ttyd::OSCache::DCFlushRange(AddressesToClearStart, 0x61);
352+
}
353+
333354
// Call original function
334355
return mPFN_battle_init_trampoline();
335356
}

ttyd-tools/rel/source/menufunctions.cpp

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,6 +1635,15 @@ void setMarioStatsValue(uint32_t currentMenuOption)
16351635
// Perform adjustments on certain addresses
16361636
switch (currentMenuOption)
16371637
{
1638+
case MARIO_HP:
1639+
case MARIO_FP:
1640+
case MARIO_RANK:
1641+
case SPECIAL_MOVES:
1642+
case STAR_POWER:
1643+
{
1644+
ClearCacheForBattles.MarioStatsShouldBeCleared = true;
1645+
break;
1646+
}
16381647
case BP:
16391648
{
16401649
// Force the game to recalculate how much BP is left
@@ -1653,6 +1662,8 @@ void setMarioStatsValue(uint32_t currentMenuOption)
16531662
{
16541663
*reinterpret_cast<int16_t *>(PouchPtr + 0x70) = MaxHP;
16551664
}
1665+
1666+
ClearCacheForBattles.MarioStatsShouldBeCleared = true;
16561667
break;
16571668
}
16581669
case MARIO_MAX_FP:
@@ -1667,22 +1678,25 @@ void setMarioStatsValue(uint32_t currentMenuOption)
16671678
{
16681679
*reinterpret_cast<int16_t *>(PouchPtr + 0x74) = MaxFP;
16691680
}
1681+
1682+
ClearCacheForBattles.MarioStatsShouldBeCleared = true;
16701683
break;
16711684
}
1672-
/*case MARIO_LEVEL:
1685+
case MARIO_LEVEL:
16731686
{
16741687
// Adjust Mario's rank with the level
1675-
int16_t MarioLevel = *reinterpret_cast<int16_t *>(PouchPtr + 0x8A);
1688+
/*int16_t MarioLevel = *reinterpret_cast<int16_t *>(PouchPtr + 0x8A);
16761689
int16_t NewRank = MarioLevel / 10;
16771690
16781691
if (NewRank > 3)
16791692
{
16801693
NewRank = 3;
16811694
}
16821695
1683-
*reinterpret_cast<int16_t *>(PouchPtr + 0x88) = NewRank;
1696+
*reinterpret_cast<int16_t *>(PouchPtr + 0x88) = NewRank;*/
1697+
ClearCacheForBattles.MarioStatsShouldBeCleared = true;
16841698
break;
1685-
}*/
1699+
}
16861700
case MAX_STAR_POWER:
16871701
{
16881702
// Prevent the current value from exceeding the max value
@@ -1693,6 +1707,8 @@ void setMarioStatsValue(uint32_t currentMenuOption)
16931707
{
16941708
*reinterpret_cast<int16_t *>(PouchPtr + 0x7A) = MaxSP;
16951709
}
1710+
1711+
ClearCacheForBattles.MarioStatsShouldBeCleared = true;
16961712
break;
16971713
}
16981714
default:
@@ -1714,6 +1730,8 @@ void setPartnerStatsValue(uint32_t currentMenuOption)
17141730
{
17151731
*reinterpret_cast<int16_t *>(PartnerEnabledAddress + 0x6) =
17161732
static_cast<int16_t>(tempMenuSecondaryValue);
1733+
1734+
ClearCacheForBattles.PartnerStatsShouldBeCleared = true;
17171735
break;
17181736
}
17191737
case PARTNER_MAX_HP:
@@ -1724,6 +1742,8 @@ void setPartnerStatsValue(uint32_t currentMenuOption)
17241742
// Set the Max HP entering battle
17251743
*reinterpret_cast<int16_t *>(PartnerEnabledAddress + 0x4) =
17261744
static_cast<int16_t>(tempMenuSecondaryValue);
1745+
1746+
ClearCacheForBattles.PartnerStatsShouldBeCleared = true;
17271747
break;
17281748
}
17291749
case PARTNER_RANK:
@@ -1734,6 +1754,8 @@ void setPartnerStatsValue(uint32_t currentMenuOption)
17341754
// Set the rank for battles
17351755
*reinterpret_cast<int16_t *>(PartnerEnabledAddress + 0xC) =
17361756
static_cast<int16_t>(tempMenuSecondaryValue);
1757+
1758+
ClearCacheForBattles.PartnerStatsShouldBeCleared = true;
17371759
break;
17381760
}
17391761
default:

ttyd-tools/rel/source/mod.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void Mod::init()
6565
mPFN_battle_init_trampoline = patch::hookFunction(
6666
ttyd::seq_battle::battle_init, []()
6767
{
68-
return gMod->recheckBattleJumpAndHammerLevels();
68+
return gMod->performPreBattleActions();
6969
});
7070

7171
mPFN_SoundEfxPlayEx_trampoline = patch::hookFunction(

0 commit comments

Comments
 (0)