|
26 | 26 | #include <ttyd/itemdrv.h>
|
27 | 27 | #include <ttyd/battle_unit.h>
|
28 | 28 | #include <ttyd/battle_ac.h>
|
| 29 | +#include <ttyd/party.h> |
29 | 30 |
|
30 | 31 | #include <cstring>
|
31 | 32 | #include <cstdio>
|
@@ -1544,6 +1545,247 @@ int32_t warpToMapByEvent(int32_t index)
|
1544 | 1545 | return SUCCESS;
|
1545 | 1546 | }
|
1546 | 1547 |
|
| 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 | + |
1547 | 1789 | int32_t warpToMapByString(const char *map)
|
1548 | 1790 | {
|
1549 | 1791 | // Make sure the player is currently in the game
|
|
0 commit comments