Skip to content

Commit 30b856c

Browse files
committed
Added a Warps menu for warping to most bosses/mini-bosses
Also made the following changes: 1. Created a function for spawning a partner/follower if one is not currently out, called spawnFailsafePartnerOrFollower. fixEvtMapBlendSetFlagPartnerCrash and fixEvtMapBlendSetFlagFollowerCrash originally had the code for it inlined, but the code is now used for another function, so it was better to just make the entire thing its own function. 2. Created a function for setting the current Pit of 100 Trials floor, as there are now 2 functions that set a Pit floor. 3. Adjusted spawnPartnerOrFollower to make sure that the partner/follower id passed in is valid, and also adjusted it to preserve the enabled flag for partners when spawning them. This is because it uses marioPartyEntry to spawn partners, and that function requires the flag for that partner to be enabled, so spawnPartnerOrFollower now temporarily sets that flag.
1 parent 0b46393 commit 30b856c

File tree

12 files changed

+513
-53
lines changed

12 files changed

+513
-53
lines changed

ttyd-tools/rel/include/codes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void displayActionCommandsTiming();
3939

4040
int32_t warpToMap(uint32_t value);
4141
int32_t warpToMapByEvent(int32_t index);
42+
int32_t warpToBoss(uint32_t index);
4243
int32_t warpToMapByString(const char *map);
4344

4445
}

ttyd-tools/rel/include/commonfunctions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@ void removeFollowerFromOverworld();
3939
uint32_t getCurrentYoshiColorId();
4040
void setNewYoshiColorId(uint32_t colorId);
4141
void spawnPartnerOrFollower(ttyd::party::PartyMembers id);
42+
void spawnFailsafePartnerOrFollower(bool shouldSpawnPartner);
4243
bool checkIfBadgeEquipped(int16_t badge);
4344
bool checkIfHaveItem(int16_t item);
4445
void recheckJumpAndHammerLevels();
4546
uint32_t getCurrentPitFloor();
47+
void setPitFloor(int32_t floor);
4648
uint32_t getCurrentFPS();
4749
void clearGSWFsRange(uint32_t lowerBound, uint32_t upperBound);
4850
bool checkIfPointerIsValid(void *ptr);

ttyd-tools/rel/include/draw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ void drawCheatsClearArea();
102102
void drawWarpsOptions();
103103
void drawEventDetails(int32_t posX, int32_t posY, int32_t index);
104104
void drawWarpByEventMenuDetails();
105+
void drawWarpsBossesOptions();
105106
void drawWarpIndexMapAndEntrance();
106107
void drawWarpIndexEntranceList();
107108
void drawOnScreenTimerButtonCombos(uint16_t *buttonCombo);

ttyd-tools/rel/include/global.h

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ enum MENU_NAMES
3838
DISPLAYS_NO_BUTTON_COMBO,
3939
WARPS_EVENT,
4040
WARPS_INDEX,
41+
WARPS_BOSS,
4142
};
4243

4344
enum INVENTORY_MENU_NAMES
@@ -371,6 +372,7 @@ enum WARPS_OPTIONS
371372
SELECT_WARP = 1,
372373
WARP_BY_EVENT,
373374
WARP_BY_INDEX,
375+
WARP_TO_BOSS,
374376
};
375377

376378
enum WARPS_SELECTION_OPTIONS
@@ -415,6 +417,34 @@ enum WARPS_EVENT_OPTIONS
415417
EVENT_WARP_NOW,
416418
};
417419

420+
enum WARPS_BOSS_OPTIONS
421+
{
422+
BOSS_CRUMP_PROLOGUE = 0,
423+
BOSS_GUS,
424+
BOSS_BLOOPER,
425+
BOSS_GOLD_FUZZY,
426+
BOSS_RED_BONES,
427+
BOSS_HOOKTAIL,
428+
BOSS_SHADOW_SIRENS_CH2,
429+
BOSS_MAGNUS_CH2,
430+
BOSS_MACHO_GRUBBA,
431+
BOSS_ATOMIC_BOO,
432+
BOSS_DOOPLISS_1,
433+
BOSS_DOOPLISS_2,
434+
BOSS_CORTEZ,
435+
BOSS_CRUMP_CH5,
436+
BOSS_SMORG,
437+
BOSS_MAGNUS_CH8,
438+
BOSS_DARK_BONES,
439+
BOSS_GLOOMTAIL,
440+
BOSS_SHADOW_SIRENS_CH8,
441+
BOSS_GRODUS,
442+
BOSS_BOWSER_AND_KAMMY,
443+
BOSS_SHADOW_QUEEN_1,
444+
BOSS_SHADOW_QUEEN_2,
445+
BOSS_BONETAIL,
446+
};
447+
418448
enum WARPS_INDEX_OPTIONS
419449
{
420450
INDEX_SELECT_MAP = 1,
@@ -817,7 +847,7 @@ struct NpcNameToPtrErrorStruct
817847
};
818848

819849
extern MenuVars MenuVar;
820-
extern Menus Menu[30];
850+
extern Menus Menu[31];
821851
extern Cheats Cheat[25];
822852
extern bool Displays[13];
823853
extern char DisplayBuffer[256];
@@ -874,6 +904,7 @@ extern const char *DisplaysLines[];
874904
extern const char *OnScreenTimerOptions[];
875905
extern const char *WarpDestinations[];
876906
extern const char *WarpDescriptions[];
907+
extern const char *WarpBossLines[];
877908

878909
extern uint8_t CheatsManageGlobalWordsOptionsSize;
879910
extern uint8_t CheatsManageGlobalFlagsOptionsSize;

ttyd-tools/rel/include/menufunctions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ void adjustMemoryChangeAddressOrPointerSelection(uint32_t button);
123123
void adjustBattlesActorSelection(uint32_t button);
124124
void adjustBattlesStatusSelection(uint32_t button);
125125
void adjustWarpsSelection(uint32_t button);
126+
void adjustWarpsBossSelection(uint32_t button);
126127
void adjustIndexWarpCurrentMapEntrancesPage(uint32_t button);
127128

128129
void adjustMenuSelectionVertical(uint32_t button, uint8_t &currentMenuOption,

ttyd-tools/rel/source/codes.cpp

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <ttyd/itemdrv.h>
2727
#include <ttyd/battle_unit.h>
2828
#include <ttyd/battle_ac.h>
29+
#include <ttyd/party.h>
2930

3031
#include <cstring>
3132
#include <cstdio>
@@ -1544,6 +1545,247 @@ int32_t warpToMapByEvent(int32_t index)
15441545
return SUCCESS;
15451546
}
15461547

1548+
int32_t warpToBoss(uint32_t index)
1549+
{
1550+
// Make sure the player is currently in the game
1551+
if (!checkIfInGame())
1552+
{
1553+
return NOT_IN_GAME;
1554+
}
1555+
1556+
int32_t NewSequencePosition = -1;
1557+
const char *BossMap;
1558+
const char *BossBero = "";
1559+
1560+
switch (index)
1561+
{
1562+
case BOSS_CRUMP_PROLOGUE:
1563+
{
1564+
NewSequencePosition = 4;
1565+
BossMap = "gor_00";
1566+
break;
1567+
}
1568+
case BOSS_GUS:
1569+
{
1570+
BossMap = "gor_02";
1571+
BossBero = "w_bero";
1572+
1573+
// Turn off GSWF(1213) to allow Gus to be fought again
1574+
ttyd::swdrv::swClear(1213);
1575+
break;
1576+
}
1577+
case BOSS_BLOOPER:
1578+
{
1579+
NewSequencePosition = 20;
1580+
BossMap = "tik_02";
1581+
BossBero = "w_bero_1";
1582+
break;
1583+
}
1584+
case BOSS_GOLD_FUZZY:
1585+
{
1586+
// Turn on GSWF(1774) and GSWF(1775) to allow the Gold Fuzzy to be fought again
1587+
static const uint16_t FlagsToSet[] =
1588+
{
1589+
1774,
1590+
1775,
1591+
};
1592+
1593+
// Set the flags
1594+
uint32_t Size = sizeof(FlagsToSet) / sizeof(FlagsToSet[0]);
1595+
for (uint32_t i = 0; i < Size; i++)
1596+
{
1597+
ttyd::swdrv::swSet(FlagsToSet[i]);
1598+
}
1599+
1600+
NewSequencePosition = 31;
1601+
BossMap = "hei_10";
1602+
break;
1603+
}
1604+
case BOSS_RED_BONES:
1605+
{
1606+
NewSequencePosition = 38;
1607+
BossMap = "gon_03";
1608+
BossBero = "e_bero";
1609+
break;
1610+
}
1611+
case BOSS_HOOKTAIL:
1612+
{
1613+
NewSequencePosition = 54;
1614+
BossMap = "gon_11";
1615+
1616+
// Turn off GSWF(1498) to allow Hooktail to be fought again
1617+
ttyd::swdrv::swClear(1498);
1618+
break;
1619+
}
1620+
case BOSS_SHADOW_SIRENS_CH2:
1621+
{
1622+
NewSequencePosition = 84;
1623+
BossMap = "win_00";
1624+
BossBero = "w_bero";
1625+
break;
1626+
}
1627+
case BOSS_MAGNUS_CH2:
1628+
{
1629+
NewSequencePosition = 110;
1630+
BossMap = "mri_01";
1631+
BossBero = "e_bero"; // Required to avoid a crash
1632+
break;
1633+
}
1634+
case BOSS_MACHO_GRUBBA:
1635+
{
1636+
NewSequencePosition = 163;
1637+
BossMap = "tou_03";
1638+
BossBero = "w_bero";
1639+
break;
1640+
}
1641+
case BOSS_ATOMIC_BOO:
1642+
{
1643+
NewSequencePosition = 194;
1644+
BossMap = "jin_00";
1645+
1646+
// Turn off GSWF(2226) to allow the Atomic Boo to be fought again
1647+
ttyd::swdrv::swClear(2226);
1648+
break;
1649+
}
1650+
case BOSS_DOOPLISS_1:
1651+
{
1652+
NewSequencePosition = 199;
1653+
BossMap = "jin_04";
1654+
break;
1655+
}
1656+
case BOSS_DOOPLISS_2:
1657+
{
1658+
// Force Vivian to be the current partner out
1659+
spawnPartnerOrFollower(ttyd::party::PartyMembers::kVivian);
1660+
1661+
NewSequencePosition = 210;
1662+
BossMap = "jin_04";
1663+
break;
1664+
}
1665+
case BOSS_CORTEZ:
1666+
{
1667+
NewSequencePosition = 252;
1668+
BossMap = "muj_12";
1669+
break;
1670+
}
1671+
case BOSS_CRUMP_CH5:
1672+
{
1673+
NewSequencePosition = 259;
1674+
BossMap = "muj_00";
1675+
break;
1676+
}
1677+
case BOSS_SMORG:
1678+
{
1679+
NewSequencePosition = 331;
1680+
BossMap = "rsh_06_a";
1681+
break;
1682+
}
1683+
case BOSS_MAGNUS_CH8:
1684+
{
1685+
NewSequencePosition = 372;
1686+
BossMap = "aji_14";
1687+
BossBero = "w_bero";
1688+
break;
1689+
}
1690+
case BOSS_DARK_BONES:
1691+
{
1692+
NewSequencePosition = 382;
1693+
BossMap = "las_05";
1694+
BossBero = "e_bero_1";
1695+
break;
1696+
}
1697+
case BOSS_GLOOMTAIL:
1698+
{
1699+
NewSequencePosition = 387;
1700+
BossMap = "las_26";
1701+
break;
1702+
}
1703+
case BOSS_SHADOW_SIRENS_CH8:
1704+
{
1705+
NewSequencePosition = 390;
1706+
BossMap = "las_09";
1707+
BossBero = "majyorin_evt";
1708+
break;
1709+
}
1710+
case BOSS_GRODUS:
1711+
{
1712+
NewSequencePosition = 399;
1713+
BossMap = "las_28";
1714+
BossBero = "e_bero";
1715+
break;
1716+
}
1717+
case BOSS_BOWSER_AND_KAMMY:
1718+
{
1719+
NewSequencePosition = 399;
1720+
BossMap = "las_28";
1721+
BossBero = "koopa_evt";
1722+
break;
1723+
}
1724+
case BOSS_SHADOW_QUEEN_1:
1725+
{
1726+
NewSequencePosition = 400;
1727+
BossMap = "las_29";
1728+
BossBero = "sekai_yami2";
1729+
break;
1730+
}
1731+
case BOSS_SHADOW_QUEEN_2:
1732+
{
1733+
NewSequencePosition = 400;
1734+
BossMap = "las_29";
1735+
BossBero = "minnnanokoe";
1736+
break;
1737+
}
1738+
case BOSS_BONETAIL:
1739+
{
1740+
BossMap = "jon_06";
1741+
BossBero = "dokan_2";
1742+
1743+
// Set the Pit floor for Bonetail
1744+
setPitFloor(100);
1745+
1746+
// Turn off GSWF(5084) and GSWF(5085) to allow Bonetail to be fought again
1747+
static const uint16_t FlagsToSet[] =
1748+
{
1749+
5084,
1750+
5085,
1751+
};
1752+
1753+
// Set the flags
1754+
uint32_t Size = sizeof(FlagsToSet) / sizeof(FlagsToSet[0]);
1755+
for (uint32_t i = 0; i < Size; i++)
1756+
{
1757+
ttyd::swdrv::swClear(FlagsToSet[i]);
1758+
}
1759+
break;
1760+
}
1761+
default:
1762+
{
1763+
return UNKNOWN_BEHAVIOR;
1764+
}
1765+
}
1766+
1767+
// Bring out a partner if one is not currently out
1768+
// Do not bring a partner out for the first Crump fight
1769+
if ((index != BOSS_CRUMP_PROLOGUE) && !getPartnerPointer())
1770+
{
1771+
spawnFailsafePartnerOrFollower(true);
1772+
}
1773+
1774+
// Set the new map, bero, and Sequence position
1775+
setNextMap(BossMap);
1776+
setNextBero(BossBero);
1777+
1778+
// Make sure the Sequence position should be changed
1779+
if (NewSequencePosition >= 0)
1780+
{
1781+
setSequencePosition(static_cast<uint32_t>(NewSequencePosition));
1782+
}
1783+
1784+
// Warp to the boss
1785+
reloadRoomMain();
1786+
return SUCCESS;
1787+
}
1788+
15471789
int32_t warpToMapByString(const char *map)
15481790
{
15491791
// Make sure the player is currently in the game

0 commit comments

Comments
 (0)