summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_ai_script_commands.c4
-rw-r--r--src/battle_anim_smokescreen.c55
-rw-r--r--src/battle_dome.c8
-rw-r--r--src/battle_factory.c184
-rw-r--r--src/battle_factory_screen.c57
-rw-r--r--src/battle_gfx_sfx_util.c164
-rw-r--r--src/battle_main.c10
-rw-r--r--src/battle_message.c26
-rw-r--r--src/battle_script_commands.c365
-rw-r--r--src/battle_setup.c83
-rw-r--r--src/battle_tower.c20
-rw-r--r--src/battle_transition.c244
-rw-r--r--src/battle_transition_frontier.c650
-rw-r--r--src/battle_util.c22
-rw-r--r--src/crt0.s80
-rw-r--r--src/data/text/nature_names.h2
-rw-r--r--src/field_specials.c4
-rw-r--r--src/libgcnmultiboot.s86
-rw-r--r--src/pokeblock.c4
-rw-r--r--src/pokeblock_feed.c2
-rw-r--r--src/pokemon.c36
-rw-r--r--src/pokemon_animation.c2
-rw-r--r--src/starter_choose.c291
-rw-r--r--src/strings.c4
-rw-r--r--src/unk_transition.c639
-rw-r--r--src/wild_encounter.c20
26 files changed, 1565 insertions, 1497 deletions
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index c9a6a6606..748e4729a 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -471,9 +471,9 @@ static u8 ChooseMoveOrAction_Doubles(void)
else
{
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
- BattleAI_SetupAIData(gBattleStruct->field_92 >> 4);
+ BattleAI_SetupAIData(gBattleStruct->palaceFlags >> 4);
else
- BattleAI_SetupAIData(0xF);
+ BattleAI_SetupAIData((1 << MAX_MON_MOVES) - 1);
gBattlerTarget = i;
diff --git a/src/battle_anim_smokescreen.c b/src/battle_anim_smokescreen.c
index a8c043e67..4120dda72 100644
--- a/src/battle_anim_smokescreen.c
+++ b/src/battle_anim_smokescreen.c
@@ -6,39 +6,40 @@
#include "sprite.h"
#include "util.h"
#include "constants/pokemon.h"
+#include "constants/battle_palace.h"
static void SmokescreenImpact_Callback(struct Sprite *);
static void SpriteCB_DestroySprite(struct Sprite *sprite);
// The below data for smokescreen starts and ends with some data that belongs to battle_gfx_sfx_util.c
-const u8 gUnknown_0831C604[] =
-{
- [NATURE_HARDY] = 0,
- [NATURE_LONELY] = 0,
- [NATURE_BRAVE] = 1,
- [NATURE_ADAMANT] = 0,
- [NATURE_NAUGHTY] = 1,
- [NATURE_BOLD] = 1,
- [NATURE_DOCILE] = 2,
- [NATURE_RELAXED] = 0,
- [NATURE_IMPISH] = 0,
- [NATURE_LAX] = 0,
- [NATURE_TIMID] = 1,
- [NATURE_HASTY] = 1,
- [NATURE_SERIOUS] = 1,
- [NATURE_JOLLY] = 0,
- [NATURE_NAIVE] = 2,
- [NATURE_MODEST] = 1,
- [NATURE_MILD] = 0,
- [NATURE_QUIET] = 1,
- [NATURE_BASHFUL] = 1,
- [NATURE_RASH] = 0,
- [NATURE_CALM] = 0,
- [NATURE_GENTLE] = 0,
- [NATURE_SASSY] = 1,
- [NATURE_CAREFUL] = 1,
- [NATURE_QUIRKY] = 0,
+const u8 gBattlePalaceNatureToMoveTarget[NUM_NATURES] =
+{
+ [NATURE_HARDY] = PALACE_TARGET_STRONGER,
+ [NATURE_LONELY] = PALACE_TARGET_STRONGER,
+ [NATURE_BRAVE] = PALACE_TARGET_WEAKER,
+ [NATURE_ADAMANT] = PALACE_TARGET_STRONGER,
+ [NATURE_NAUGHTY] = PALACE_TARGET_WEAKER,
+ [NATURE_BOLD] = PALACE_TARGET_WEAKER,
+ [NATURE_DOCILE] = PALACE_TARGET_RANDOM,
+ [NATURE_RELAXED] = PALACE_TARGET_STRONGER,
+ [NATURE_IMPISH] = PALACE_TARGET_STRONGER,
+ [NATURE_LAX] = PALACE_TARGET_STRONGER,
+ [NATURE_TIMID] = PALACE_TARGET_WEAKER,
+ [NATURE_HASTY] = PALACE_TARGET_WEAKER,
+ [NATURE_SERIOUS] = PALACE_TARGET_WEAKER,
+ [NATURE_JOLLY] = PALACE_TARGET_STRONGER,
+ [NATURE_NAIVE] = PALACE_TARGET_RANDOM,
+ [NATURE_MODEST] = PALACE_TARGET_WEAKER,
+ [NATURE_MILD] = PALACE_TARGET_STRONGER,
+ [NATURE_QUIET] = PALACE_TARGET_WEAKER,
+ [NATURE_BASHFUL] = PALACE_TARGET_WEAKER,
+ [NATURE_RASH] = PALACE_TARGET_STRONGER,
+ [NATURE_CALM] = PALACE_TARGET_STRONGER,
+ [NATURE_GENTLE] = PALACE_TARGET_STRONGER,
+ [NATURE_SASSY] = PALACE_TARGET_WEAKER,
+ [NATURE_CAREFUL] = PALACE_TARGET_WEAKER,
+ [NATURE_QUIRKY] = PALACE_TARGET_STRONGER,
};
static const struct CompressedSpriteSheet sSmokescreenImpactSpriteSheet =
diff --git a/src/battle_dome.c b/src/battle_dome.c
index 6f3d111ba..151bfc927 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -4692,7 +4692,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId)
allocatedArray[NUM_STATS] += allocatedArray[STAT_HP];
// Add the EVs with the nature modifier for this mon and and track number of negative natures
- for (j = 0; j < NUM_EV_STATS; j++)
+ for (j = 0; j < NUM_NATURE_STATS; j++)
{
if (trainerId == TRAINER_FRONTIER_BRAIN)
nature = GetFrontierBrainMonNature(i);
@@ -4706,7 +4706,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId)
else if (gNatureStatTable[nature][j] < 0)
{
allocatedArray[j + NUM_STATS + 1] += (allocatedArray[j + 1] * 90) / 100;
- allocatedArray[j + NUM_STATS + NUM_EV_STATS + 2]++;
+ allocatedArray[j + NUM_STATS + NUM_NATURE_STATS + 2]++;
}
else
{
@@ -4742,7 +4742,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId)
}
allocatedArray[NUM_STATS] += allocatedArray[STAT_HP];
- for (j = 0; j < NUM_EV_STATS; j++)
+ for (j = 0; j < NUM_NATURE_STATS; j++)
{
nature = gFacilityTrainerMons[DOME_MONS[trainerTourneyId][i]].nature;
if (gNatureStatTable[nature][j] > 0)
@@ -4752,7 +4752,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId)
else if (gNatureStatTable[nature][j] < 0)
{
allocatedArray[j + NUM_STATS + 1] += (allocatedArray[j + 1] * 90) / 100;
- allocatedArray[j + NUM_STATS + NUM_EV_STATS + 2]++;
+ allocatedArray[j + NUM_STATS + NUM_NATURE_STATS + 2]++;
}
else
{
diff --git a/src/battle_factory.c b/src/battle_factory.c
index 913b1b1a0..940e71f7d 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -39,7 +39,7 @@ static void GenerateInitialRentalMons(void);
static void GetOpponentMostCommonMonType(void);
static void GetOpponentBattleStyle(void);
static void RestorePlayerPartyHeldItems(void);
-static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2);
+static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 arg2);
static u8 GetMoveBattleStyle(u16 move);
// Const rom data.
@@ -159,24 +159,27 @@ static const u8 sFixedIVTable[][2] =
{31, 31},
};
-static const u16 sMonsToChooseFrom[][2] =
-{
- {0x006e, 0x00c7},
- {0x00a2, 0x010a},
- {0x010b, 0x0173},
- {0x0174, 0x01d3},
- {0x01d4, 0x0233},
- {0x0234, 0x0293},
- {0x0294, 0x02f3},
- {0x0174, 0x0351},
- {0x0174, 0x01d3},
- {0x01d4, 0x0233},
- {0x0234, 0x0293},
- {0x0294, 0x02f3},
- {0x0174, 0x0371},
- {0x0174, 0x0371},
- {0x0174, 0x0371},
- {0x0174, 0x0371},
+static const u16 sInitialRentalMonRanges[][2] =
+{
+ // Level 50
+ {FRONTIER_MON_GRIMER, FRONTIER_MON_FURRET_1}, // 110 - 199
+ {FRONTIER_MON_DELCATTY_1, FRONTIER_MON_CLOYSTER_1}, // 162 - 266
+ {FRONTIER_MON_DELCATTY_2, FRONTIER_MON_CLOYSTER_2}, // 267 - 371
+ {FRONTIER_MON_DUGTRIO_1, FRONTIER_MON_SLAKING_1}, // 372 - 467
+ {FRONTIER_MON_DUGTRIO_2, FRONTIER_MON_SLAKING_2}, // 468 - 563
+ {FRONTIER_MON_DUGTRIO_3, FRONTIER_MON_SLAKING_3}, // 564 - 659
+ {FRONTIER_MON_DUGTRIO_4, FRONTIER_MON_SLAKING_4}, // 660 - 755
+ {FRONTIER_MON_DUGTRIO_1, FRONTIER_MONS_HIGH_TIER}, // 372 - 849
+
+ // Open level
+ {FRONTIER_MON_DUGTRIO_1, FRONTIER_MON_SLAKING_1}, // 372 - 467
+ {FRONTIER_MON_DUGTRIO_2, FRONTIER_MON_SLAKING_2}, // 468 - 563
+ {FRONTIER_MON_DUGTRIO_3, FRONTIER_MON_SLAKING_3}, // 564 - 659
+ {FRONTIER_MON_DUGTRIO_4, FRONTIER_MON_SLAKING_4}, // 660 - 755
+ {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1}, // 372 - 881
+ {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1}, // 372 - 881
+ {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1}, // 372 - 881
+ {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1}, // 372 - 881
};
// code
@@ -320,24 +323,24 @@ static void GenerateOpponentMons(void)
i = 0;
while (i != FRONTIER_PARTY_SIZE)
{
- u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
- if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ u16 monId = GetFactoryMonId(lvlMode, challengeNum, FALSE);
+ if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN)
continue;
for (j = 0; j < 6; j++)
{
- if (gFacilityTrainerMons[monSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.rentalMons[j].monId].species)
+ if (gFacilityTrainerMons[monId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.rentalMons[j].monId].species)
break;
}
if (j != 6)
continue;
- if (lvlMode == FRONTIER_LVL_50 && monSetId > FRONTIER_MONS_HIGH_TIER)
+ if (lvlMode == FRONTIER_LVL_50 && monId > FRONTIER_MONS_HIGH_TIER)
continue;
for (k = firstMonId; k < firstMonId + i; k++)
{
- if (species[k] == gFacilityTrainerMons[monSetId].species)
+ if (species[k] == gFacilityTrainerMons[monId].species)
break;
}
if (k != firstMonId + i)
@@ -345,15 +348,15 @@ static void GenerateOpponentMons(void)
for (k = firstMonId; k < firstMonId + i; k++)
{
- if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])
break;
}
if (k != firstMonId + i)
continue;
- species[i] = gFacilityTrainerMons[monSetId].species;
- heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
- gUnknown_03006298[i] = monSetId;
+ species[i] = gFacilityTrainerMons[monId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId];
+ gUnknown_03006298[i] = monId;
i++;
}
}
@@ -388,7 +391,7 @@ static void SetPlayerAndOpponentParties(void)
int count = 0;
u8 bits = 0;
u8 monLevel;
- u16 monSetId;
+ u16 monId;
u16 evs;
u8 ivs;
u8 friendship;
@@ -412,17 +415,17 @@ static void SetPlayerAndOpponentParties(void)
ZeroPlayerPartyMons();
for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
- monSetId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;
+ monId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;
ivs = gSaveBlock2Ptr->frontier.rentalMons[i].ivs;
CreateMon(&gPlayerParty[i],
- gFacilityTrainerMons[monSetId].species,
+ gFacilityTrainerMons[monId].species,
monLevel,
ivs,
TRUE, gSaveBlock2Ptr->frontier.rentalMons[i].personality,
OT_ID_PLAYER_ID, 0);
count = 0;
- bits = gFacilityTrainerMons[monSetId].evSpread;
+ bits = gFacilityTrainerMons[monId].evSpread;
for (j = 0; j < NUM_STATS; bits >>= 1, j++)
{
if (bits & 1)
@@ -433,16 +436,16 @@ static void SetPlayerAndOpponentParties(void)
bits = 1;
for (j = 0; j < NUM_STATS; bits <<= 1, j++)
{
- if (gFacilityTrainerMons[monSetId].evSpread & bits)
+ if (gFacilityTrainerMons[monId].evSpread & bits)
SetMonData(&gPlayerParty[i], MON_DATA_HP_EV + j, &evs);
}
CalculateMonStats(&gPlayerParty[i]);
friendship = 0;
for (k = 0; k < MAX_MON_MOVES; k++)
- SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monId].moves[k], k);
SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
SetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM, &gSaveBlock2Ptr->frontier.rentalMons[i].abilityNum);
}
}
@@ -453,17 +456,17 @@ static void SetPlayerAndOpponentParties(void)
case 2:
for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
- monSetId = gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId;
+ monId = gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId;
ivs = gSaveBlock2Ptr->frontier.rentalMons[i + 3].ivs;
CreateMon(&gEnemyParty[i],
- gFacilityTrainerMons[monSetId].species,
+ gFacilityTrainerMons[monId].species,
monLevel,
ivs,
TRUE, gSaveBlock2Ptr->frontier.rentalMons[i + 3].personality,
OT_ID_PLAYER_ID, 0);
count = 0;
- bits = gFacilityTrainerMons[monSetId].evSpread;
+ bits = gFacilityTrainerMons[monId].evSpread;
for (j = 0; j < NUM_STATS; bits >>= 1, j++)
{
if (bits & 1)
@@ -474,14 +477,14 @@ static void SetPlayerAndOpponentParties(void)
bits = 1;
for (j = 0; j < NUM_STATS; bits <<= 1, j++)
{
- if (gFacilityTrainerMons[monSetId].evSpread & bits)
+ if (gFacilityTrainerMons[monId].evSpread & bits)
SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &evs);
}
CalculateMonStats(&gEnemyParty[i]);
for (k = 0; k < MAX_MON_MOVES; k++)
- SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
- SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monId].moves[k], k);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
SetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM, &gSaveBlock2Ptr->frontier.rentalMons[i + 3].abilityNum);
}
break;
@@ -497,8 +500,8 @@ static void GenerateInitialRentalMons(void)
u8 challengeNum;
u8 factoryLvlMode;
u8 factoryBattleMode;
- u8 var_40;
- u16 monSetId;
+ u8 rentalRank;
+ u16 monId;
u16 currSpecies;
u16 species[PARTY_SIZE];
u16 monIds[PARTY_SIZE];
@@ -530,30 +533,30 @@ static void GenerateInitialRentalMons(void)
factoryLvlMode = FRONTIER_LVL_50;
firstMonId = 0;
}
- var_40 = GetNumPastRentalsRank(factoryBattleMode, factoryLvlMode);
+ rentalRank = GetNumPastRentalsRank(factoryBattleMode, factoryLvlMode);
currSpecies = SPECIES_NONE;
i = 0;
while (i != PARTY_SIZE)
{
- if (i < var_40)
- monSetId = GetMonSetId(factoryLvlMode, challengeNum, TRUE);
+ if (i < rentalRank) // The more times the player has rented, the more initial rentals are generated from a better set of pokemon
+ monId = GetFactoryMonId(factoryLvlMode, challengeNum, TRUE);
else
- monSetId = GetMonSetId(factoryLvlMode, challengeNum, FALSE);
+ monId = GetFactoryMonId(factoryLvlMode, challengeNum, FALSE);
- if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN)
continue;
// Cannot have two pokemon of the same species.
for (j = firstMonId; j < firstMonId + i; j++)
{
- u16 monId = monIds[j];
- if (monId == monSetId)
+ u16 existingMonId = monIds[j];
+ if (existingMonId == monId)
break;
- if (species[j] == gFacilityTrainerMons[monSetId].species)
+ if (species[j] == gFacilityTrainerMons[monId].species)
{
if (currSpecies == SPECIES_NONE)
- currSpecies = gFacilityTrainerMons[monSetId].species;
+ currSpecies = gFacilityTrainerMons[monId].species;
else
break;
}
@@ -564,9 +567,9 @@ static void GenerateInitialRentalMons(void)
// Cannot have two same held items.
for (j = firstMonId; j < firstMonId + i; j++)
{
- if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])
{
- if (gFacilityTrainerMons[monSetId].species == currSpecies)
+ if (gFacilityTrainerMons[monId].species == currSpecies)
currSpecies = SPECIES_NONE;
break;
}
@@ -574,10 +577,10 @@ static void GenerateInitialRentalMons(void)
if (j != firstMonId + i)
continue;
- gSaveBlock2Ptr->frontier.rentalMons[i].monId = monSetId;
- species[i] = gFacilityTrainerMons[monSetId].species;
- heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
- monIds[i] = monSetId;
+ gSaveBlock2Ptr->frontier.rentalMons[i].monId = monId;
+ species[i] = gFacilityTrainerMons[monId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId];
+ monIds[i] = monId;
i++;
}
}
@@ -629,10 +632,10 @@ static void GetOpponentBattleStyle(void)
for (i = 0; i < FRONTIER_PARTY_SIZE; i++)
{
- u16 monSetId = gUnknown_03006298[i];
+ u16 monId = gUnknown_03006298[i];
for (j = 0; j < MAX_MON_MOVES; j++)
{
- u8 battleStyle = GetMoveBattleStyle(gFacilityTrainerMons[monSetId].moves[j]);
+ u8 battleStyle = GetMoveBattleStyle(gFacilityTrainerMons[monId].moves[j]);
stylePoints[battleStyle]++;
}
}
@@ -724,16 +727,16 @@ void FillFactoryBrainParty(void)
while (i != FRONTIER_PARTY_SIZE)
{
- u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE);
+ u16 monId = GetFactoryMonId(lvlMode, challengeNum, FALSE);
- if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN)
+ if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN)
continue;
- if (monLevel == 50 && monSetId > FRONTIER_MONS_HIGH_TIER)
+ if (monLevel == 50 && monId > FRONTIER_MONS_HIGH_TIER)
continue;
for (j = 0; j < 6; j++)
{
- if (monSetId == gSaveBlock2Ptr->frontier.rentalMons[j].monId)
+ if (monId == gSaveBlock2Ptr->frontier.rentalMons[j].monId)
break;
}
if (j != 6)
@@ -741,7 +744,7 @@ void FillFactoryBrainParty(void)
for (k = 0; k < i; k++)
{
- if (species[k] == gFacilityTrainerMons[monSetId].species)
+ if (species[k] == gFacilityTrainerMons[monId].species)
break;
}
if (k != i)
@@ -749,35 +752,35 @@ void FillFactoryBrainParty(void)
for (k = 0; k < i; k++)
{
- if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId])
+ if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])
break;
}
if (k != i)
continue;
- species[i] = gFacilityTrainerMons[monSetId].species;
- heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId];
+ species[i] = gFacilityTrainerMons[monId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId];
CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i],
- gFacilityTrainerMons[monSetId].species,
+ gFacilityTrainerMons[monId].species,
monLevel,
- gFacilityTrainerMons[monSetId].nature,
+ gFacilityTrainerMons[monId].nature,
fixedIV,
- gFacilityTrainerMons[monSetId].evSpread,
+ gFacilityTrainerMons[monId].evSpread,
otId);
friendship = 0;
for (k = 0; k < MAX_MON_MOVES; k++)
- SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
+ SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monId].moves[k], k);
SetMonData(&gEnemyParty[i], MON_DATA_FRIENDSHIP, &friendship);
- SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
i++;
}
}
-static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2)
+static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 useBetterRange)
{
- u16 range, monSetId;
- u16 adder;
+ u16 numMons, monId;
+ u16 adder; // Used to skip past early mons for open level
if (lvlMode == FRONTIER_LVL_50)
adder = 0;
@@ -786,30 +789,31 @@ static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2)
if (challengeNum < 7)
{
- if (arg2)
+ if (useBetterRange)
{
- range = (sMonsToChooseFrom[adder + challengeNum + 1][1] - sMonsToChooseFrom[adder + challengeNum + 1][0]) + 1;
- monSetId = Random() % range;
- monSetId += sMonsToChooseFrom[adder + challengeNum + 1][0];
+ numMons = (sInitialRentalMonRanges[adder + challengeNum + 1][1] - sInitialRentalMonRanges[adder + challengeNum + 1][0]) + 1;
+ monId = Random() % numMons;
+ monId += sInitialRentalMonRanges[adder + challengeNum + 1][0];
}
else
{
- range = (sMonsToChooseFrom[adder + challengeNum][1] - sMonsToChooseFrom[adder + challengeNum][0]) + 1;
- monSetId = Random() % range;
- monSetId += sMonsToChooseFrom[adder + challengeNum][0];
+ numMons = (sInitialRentalMonRanges[adder + challengeNum][1] - sInitialRentalMonRanges[adder + challengeNum][0]) + 1;
+ monId = Random() % numMons;
+ monId += sInitialRentalMonRanges[adder + challengeNum][0];
}
}
else
{
- u16 num = challengeNum;
- if (num != 7)
- num = 7;
- range = (sMonsToChooseFrom[adder + num][1] - sMonsToChooseFrom[adder + num][0]) + 1;
- monSetId = Random() % range;
- monSetId += sMonsToChooseFrom[adder + num][0];
+ u16 challenge = challengeNum;
+ if (challenge != 7)
+ challenge = 7; // why bother assigning it above at all
+
+ numMons = (sInitialRentalMonRanges[adder + challenge][1] - sInitialRentalMonRanges[adder + challenge][0]) + 1;
+ monId = Random() % numMons;
+ monId += sInitialRentalMonRanges[adder + challenge][0];
}
- return monSetId;
+ return monId;
}
u8 GetNumPastRentalsRank(u8 battleMode, u8 lvlMode)
diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c
index de2f3a10c..388881a1c 100644
--- a/src/battle_factory_screen.c
+++ b/src/battle_factory_screen.c
@@ -24,6 +24,7 @@
#include "pokedex.h"
#include "util.h"
#include "trainer_pokemon_sprites.h"
+#include "starter_choose.h"
#include "constants/battle_frontier.h"
#include "constants/songs.h"
#include "constants/rgb.h"
@@ -57,7 +58,7 @@
struct FactorySelecteableMon
{
- u16 monSetId;
+ u16 monId;
u16 spriteId;
u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon
struct Pokemon monData;
@@ -132,8 +133,6 @@ struct FactorySwapMonsStruct
bool8 unk30;
};
-extern const u32 gUnknown_085B18AC[];
-
// This file's functions.
static void sub_819A44C(struct Sprite *sprite);
static void CB2_InitSelectScreen(void);
@@ -168,7 +167,7 @@ static u8 sub_819BC9C(void);
static u8 Select_OptionSummary(void);
static u8 Select_OptionOthers(void);
static u8 Select_OptionRentDeselect(void);
-static bool32 Select_AreSpeciesValid(u16 monSetId);
+static bool32 Select_AreSpeciesValid(u16 monId);
static void Swap_DestroyAllSprites(void);
static void Swap_ShowYesNoOptions(void);
static void sub_819E8EC(void);
@@ -263,7 +262,7 @@ static const struct SpriteSheet gUnknown_086103BC[] =
static const struct CompressedSpriteSheet gUnknown_086103E4[] =
{
- {gUnknown_085B18AC, 0x800, TAG_TILE_64},
+ {gPokeballSelection_Gfx, 0x800, TAG_TILE_64},
{},
};
@@ -616,7 +615,7 @@ static const struct SpriteSheet gUnknown_08610650[] =
static const struct CompressedSpriteSheet gUnknown_086106A0[] =
{
- {gUnknown_085B18AC, 0x800, TAG_TILE_64},
+ {gPokeballSelection_Gfx, 0x800, TAG_TILE_64},
{},
};
@@ -1665,7 +1664,7 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId)
u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE);
u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u8 challengeNum = gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode] / 7;
- u8 var_28 = 0;
+ u8 rentalRank = 0;
gFacilityTrainerMons = gBattleFrontierMons;
if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50)
@@ -1673,29 +1672,29 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId)
else
level = 50;
- var_28 = GetNumPastRentalsRank(battleMode, lvlMode);
+ rentalRank = GetNumPastRentalsRank(battleMode, lvlMode);
otId = T1_READ_32(gSaveBlock2Ptr->playerTrainerId);
for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
{
- u16 monSetId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;
- sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
- if (i < var_28)
+ u16 monId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;
+ sFactorySelectScreen->mons[i + firstMonId].monId = monId;
+ if (i < rentalRank)
ivs = GetFactoryMonFixedIV(challengeNum + 1, 0);
else
ivs = GetFactoryMonFixedIV(challengeNum, 0);
CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
- gFacilityTrainerMons[monSetId].species,
+ gFacilityTrainerMons[monId].species,
level,
- gFacilityTrainerMons[monSetId].nature,
+ gFacilityTrainerMons[monId].nature,
ivs,
- gFacilityTrainerMons[monSetId].evSpread,
+ gFacilityTrainerMons[monId].evSpread,
otId);
happiness = 0;
for (j = 0; j < MAX_MON_MOVES; j++)
- SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
+ SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monId].moves[j], j);
SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
}
}
@@ -1712,20 +1711,20 @@ static void CreateTentFactorySelectableMons(u8 firstMonId)
for (i = 0; i < SELECTABLE_MONS_COUNT; i++)
{
- u16 monSetId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;
- sFactorySelectScreen->mons[i + firstMonId].monSetId = monSetId;
+ u16 monId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;
+ sFactorySelectScreen->mons[i + firstMonId].monId = monId;
CreateMonWithEVSpreadNatureOTID(&sFactorySelectScreen->mons[i + firstMonId].monData,
- gFacilityTrainerMons[monSetId].species,
+ gFacilityTrainerMons[monId].species,
level,
- gFacilityTrainerMons[monSetId].nature,
+ gFacilityTrainerMons[monId].nature,
ivs,
- gFacilityTrainerMons[monSetId].evSpread,
+ gFacilityTrainerMons[monId].evSpread,
otId);
happiness = 0;
for (j = 0; j < MAX_MON_MOVES; j++)
- SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].moves[j], j);
+ SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monId].moves[j], j);
SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness);
- SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
+ SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);
}
}
@@ -1740,7 +1739,7 @@ static void Select_CopyMonsToPlayerParty(void)
if (sFactorySelectScreen->mons[j].selectedId == i + 1)
{
gPlayerParty[i] = sFactorySelectScreen->mons[j].monData;
- gSaveBlock2Ptr->frontier.rentalMons[i].monId = sFactorySelectScreen->mons[j].monSetId;
+ gSaveBlock2Ptr->frontier.rentalMons[i].monId = sFactorySelectScreen->mons[j].monId;
gSaveBlock2Ptr->frontier.rentalMons[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY, NULL);
gSaveBlock2Ptr->frontier.rentalMons[i].abilityNum = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ABILITY_NUM, NULL);
gSaveBlock2Ptr->frontier.rentalMons[i].ivs = GetBoxMonData(&gPlayerParty[i].box, MON_DATA_ATK_IV, NULL);
@@ -1871,8 +1870,8 @@ static u8 Select_RunMenuOptionFunc(void)
static u8 Select_OptionRentDeselect(void)
{
u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId;
- u16 monSetId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monSetId;
- if (selectedId == 0 && !Select_AreSpeciesValid(monSetId))
+ u16 monId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monId;
+ if (selectedId == 0 && !Select_AreSpeciesValid(monId))
{
Select_PrintCantSelectSameMon();
sub_819B958(3);
@@ -2160,10 +2159,10 @@ static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V)
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ);
}
-static bool32 Select_AreSpeciesValid(u16 monSetId)
+static bool32 Select_AreSpeciesValid(u16 monId)
{
u8 i, j;
- u32 species = gFacilityTrainerMons[monSetId].species;
+ u32 species = gFacilityTrainerMons[monId].species;
u8 selectState = sFactorySelectScreen->selectingMonsState;
for (i = 1; i < selectState; i++)
@@ -2172,7 +2171,7 @@ static bool32 Select_AreSpeciesValid(u16 monSetId)
{
if (sFactorySelectScreen->mons[j].selectedId == i)
{
- if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monSetId].species == species)
+ if (gFacilityTrainerMons[sFactorySelectScreen->mons[j].monId].species == species)
return FALSE;
break;
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index 50001cebe..54fc88f24 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -24,20 +24,21 @@
#include "contest.h"
#include "constants/songs.h"
#include "constants/rgb.h"
+#include "constants/battle_palace.h"
extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
-extern const u8 gUnknown_0831C604[];
+extern const u8 gBattlePalaceNatureToMoveTarget[];
extern const u8 * const gBattleAnims_General[];
extern const u8 * const gBattleAnims_Special[];
extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow;
extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow;
// this file's functions
-static u8 sub_805D4A8(u16 move);
-static u16 BattlePalaceGetTargetRetValue(void);
+static u8 GetBattlePalaceMoveGroup(u16 move);
+static u16 GetBattlePalaceTarget(void);
static void sub_805D7EC(struct Sprite *sprite);
static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId);
static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId);
@@ -108,6 +109,7 @@ void FreeBattleSpritesData(void)
FREE_AND_SET_NULL(gBattleSpritesDataPtr);
}
+// Pokemon chooses move to use in Battle Palace rather than player
u16 ChooseMoveAndTargetInBattlePalace(void)
{
s32 i, var1, var2;
@@ -116,60 +118,88 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
u8 unusableMovesBits = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
s32 percent = Random() % 100;
- i = (gBattleStruct->field_92 & gBitTable[gActiveBattler]) ? 2 : 0;
- var2 = i;
- var1 = i + 2;
-
- for (; i < var1; i++)
+ // Heavy variable re-use here makes this hard to read without defines
+ // Possibly just optimization? might still match with additional vars
+ #define maxGroupNum var1
+ #define minGroupNum var2
+ #define selectedGroup percent
+ #define selectedMoves var2
+ #define moveTarget var1
+ #define validMoveFlags var1
+ #define numValidMoveGroups var2
+ #define validMoveGroup var2
+
+ // If battler is < 50% HP and not asleep, use second set of move group likelihoods
+ // otherwise use first set
+ i = (gBattleStruct->palaceFlags & gBitTable[gActiveBattler]) ? 2 : 0;
+ minGroupNum = i;
+
+ maxGroupNum = i + 2; // + 2 because there are two percentages per set of likelihoods
+
+ // Each nature has a different percent chance to select a move from one of 3 move groups
+ // If percent is less than 1st check, use move from "Attack" group
+ // If percent is less than 2nd check, use move from "Defense" group
+ // Otherwise use move from "Support" group
+ for (; i < maxGroupNum; i++)
{
- if (gUnknown_0831C494[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)][i] > percent)
+ if (gBattlePalaceNatureToMoveGroupLikelihood[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)][i] > percent)
break;
}
+ selectedGroup = i - minGroupNum;
+ if (i == maxGroupNum)
+ selectedGroup = PALACE_MOVE_GROUP_SUPPORT;
- percent = i - var2;
- if (i == var1)
- percent = 2;
-
- for (var2 = 0, i = 0; i < MAX_MON_MOVES; i++)
+ // Flag moves that match selected group, to be passed to AI
+ for (selectedMoves = 0, i = 0; i < MAX_MON_MOVES; i++)
{
if (moveInfo->moves[i] == MOVE_NONE)
break;
- if (percent == sub_805D4A8(moveInfo->moves[i]) && moveInfo->currentPp[i] != 0)
- var2 |= gBitTable[i];
+ if (selectedGroup == GetBattlePalaceMoveGroup(moveInfo->moves[i]) && moveInfo->currentPp[i] != 0)
+ selectedMoves |= gBitTable[i];
}
- if (var2 != 0)
+ // Pass selected moves to AI, pick one
+ if (selectedMoves != 0)
{
- gBattleStruct->field_92 &= 0xF;
- gBattleStruct->field_92 |= (var2 << 4);
- BattleAI_SetupAIData(var2);
+ gBattleStruct->palaceFlags &= 0xF;
+ gBattleStruct->palaceFlags |= (selectedMoves << 4);
+ BattleAI_SetupAIData(selectedMoves);
chosenMoveId = BattleAI_ChooseMoveOrAction();
}
+ // If no moves matched the selected group, pick a new move from groups the pokemon has
+ // In this case the AI is not checked again, so the choice may be worse
+ // If a move is chosen this way, there's a 50% chance that it will be unable to use it anyway
if (chosenMoveId == -1)
{
if (unusableMovesBits != 0xF)
{
- var1 = 0, var2 = 0;
+ validMoveFlags = 0, numValidMoveGroups = 0;
for (i = 0; i < MAX_MON_MOVES; i++)
{
- if (sub_805D4A8(moveInfo->moves[i]) == 0 && !(gBitTable[i] & unusableMovesBits))
- var1 += 0x1;
- if (sub_805D4A8(moveInfo->moves[i]) == 1 && !(gBitTable[i] & unusableMovesBits))
- var1 += 0x10;
- if (sub_805D4A8(moveInfo->moves[i]) == 2 && !(gBitTable[i] & unusableMovesBits))
- var1 += 0x100;
+ // validMoveFlags is used here as a bitfield for which moves can be used for each move group type
+ // first 4 bits are for attack (1 for each move), then 4 bits for defense, and 4 for support
+ if (GetBattlePalaceMoveGroup(moveInfo->moves[i]) == PALACE_MOVE_GROUP_ATTACK && !(gBitTable[i] & unusableMovesBits))
+ validMoveFlags += (1 << 0);
+ if (GetBattlePalaceMoveGroup(moveInfo->moves[i]) == PALACE_MOVE_GROUP_DEFENSE && !(gBitTable[i] & unusableMovesBits))
+ validMoveFlags += (1 << 4);
+ if (GetBattlePalaceMoveGroup(moveInfo->moves[i]) == PALACE_MOVE_GROUP_SUPPORT && !(gBitTable[i] & unusableMovesBits))
+ validMoveFlags += (1 << 8);
}
- if ((var1 & 0xF) > 1)
- var2++;
- if ((var1 & 0xF0) > 0x1F)
- var2++;
- if ((var1 & 0xF0) > 0x1FF)
- var2++;
-
- if (var2 > 1 || var2 == 0)
+ // Count the move groups the pokemon has
+ if ((validMoveFlags & 0xF) > 1)
+ numValidMoveGroups++;
+ if ((validMoveFlags & 0xF0) > 0x1F)
+ numValidMoveGroups++;
+ if ((validMoveFlags & 0xF0) > 0x1FF)
+ numValidMoveGroups++;
+
+
+ // If more than 1 possible move group, or no possible move groups
+ // then choose move randomly
+ if (numValidMoveGroups > 1 || numValidMoveGroups == 0)
{
do
{
@@ -178,32 +208,35 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
chosenMoveId = i;
} while (chosenMoveId == -1);
}
+ // Otherwise randomly choose move of only available move group
else
{
- if ((var1 & 0xF) > 1)
- var2 = 0;
- if ((var1 & 0xF0) > 0x1F)
- var2 = 1;
- if ((var1 & 0xF0) > 0x1FF)
- var2 = 2;
+ if ((validMoveFlags & 0xF) > 1)
+ validMoveGroup = PALACE_MOVE_GROUP_ATTACK;
+ if ((validMoveFlags & 0xF0) > 0x1F)
+ validMoveGroup = PALACE_MOVE_GROUP_DEFENSE;
+ if ((validMoveFlags & 0xF0) > 0x1FF)
+ validMoveGroup = PALACE_MOVE_GROUP_SUPPORT;
do
{
i = Random() % MAX_MON_MOVES;
- if (!(gBitTable[i] & unusableMovesBits) && var2 == sub_805D4A8(moveInfo->moves[i]))
+ if (!(gBitTable[i] & unusableMovesBits) && validMoveGroup == GetBattlePalaceMoveGroup(moveInfo->moves[i]))
chosenMoveId = i;
} while (chosenMoveId == -1);
}
+ // If a move was selected (and in this case was not from the Nature-chosen group)
+ // then there's a 50% chance it won't be used anyway
if (Random() % 100 > 49)
{
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
return 0;
}
}
else
{
- gProtectStructs[gActiveBattler].palaceUnableToUseMove = 1;
+ gProtectStructs[gActiveBattler].palaceUnableToUseMove = TRUE;
return 0;
}
}
@@ -211,26 +244,35 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
if (moveInfo->moves[chosenMoveId] == MOVE_CURSE)
{
if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST)
- var1 = MOVE_TARGET_USER;
+ moveTarget = MOVE_TARGET_USER;
else
- var1 = MOVE_TARGET_SELECTED;
+ moveTarget = MOVE_TARGET_SELECTED;
}
else
{
- var1 = gBattleMoves[moveInfo->moves[chosenMoveId]].target;
+ moveTarget = gBattleMoves[moveInfo->moves[chosenMoveId]].target;
}
- if (var1 & MOVE_TARGET_USER)
+ if (moveTarget & MOVE_TARGET_USER)
chosenMoveId |= (gActiveBattler << 8);
- else if (var1 == MOVE_TARGET_SELECTED)
- chosenMoveId |= (BattlePalaceGetTargetRetValue());
+ else if (moveTarget == MOVE_TARGET_SELECTED)
+ chosenMoveId |= GetBattlePalaceTarget();
else
chosenMoveId |= (GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & BIT_SIDE) ^ BIT_SIDE) << 8);
return chosenMoveId;
}
-static u8 sub_805D4A8(u16 move)
+#undef maxGroupNum
+#undef minGroupNum
+#undef selectedGroup
+#undef selectedMoves
+#undef moveTarget
+#undef validMoveFlags
+#undef numValidMoveGroups
+#undef validMoveGroup
+
+static u8 GetBattlePalaceMoveGroup(u16 move)
{
switch (gBattleMoves[move].target)
{
@@ -240,21 +282,21 @@ static u8 sub_805D4A8(u16 move)
case MOVE_TARGET_BOTH:
case MOVE_TARGET_FOES_AND_ALLY:
if (gBattleMoves[move].power == 0)
- return 2;
+ return PALACE_MOVE_GROUP_SUPPORT;
else
- return 0;
+ return PALACE_MOVE_GROUP_ATTACK;
break;
case MOVE_TARGET_DEPENDS:
case MOVE_TARGET_OPPONENTS_FIELD:
- return 2;
+ return PALACE_MOVE_GROUP_SUPPORT;
case MOVE_TARGET_USER:
- return 1;
+ return PALACE_MOVE_GROUP_DEFENSE;
default:
- return 0;
+ return PALACE_MOVE_GROUP_ATTACK;
}
}
-static u16 BattlePalaceGetTargetRetValue(void)
+static u16 GetBattlePalaceTarget(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
@@ -274,19 +316,19 @@ static u16 BattlePalaceGetTargetRetValue(void)
if (gBattleMons[opposing1].hp == gBattleMons[opposing2].hp)
return (((gActiveBattler & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8;
- switch (gUnknown_0831C604[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)])
+ switch (gBattlePalaceNatureToMoveTarget[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)])
{
- case 0:
+ case PALACE_TARGET_STRONGER:
if (gBattleMons[opposing1].hp > gBattleMons[opposing2].hp)
return opposing1 << 8;
else
return opposing2 << 8;
- case 1:
+ case PALACE_TARGET_WEAKER:
if (gBattleMons[opposing1].hp < gBattleMons[opposing2].hp)
return opposing1 << 8;
else
return opposing2 << 8;
- case 2:
+ case PALACE_TARGET_RANDOM:
return (((gActiveBattler & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8;
}
}
diff --git a/src/battle_main.c b/src/battle_main.c
index 42f0fb2ad..1d8aeab53 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -3112,7 +3112,7 @@ static void BattleStartClearSetData(void)
}
gBattleStruct->givenExpMons = 0;
- gBattleStruct->field_92 = 0;
+ gBattleStruct->palaceFlags = 0;
gRandomTurnNumber = Random();
@@ -3159,7 +3159,7 @@ void SwitchInClearSetData(void)
&& (gDisableStructs[i].battlerWithSureHit == gActiveBattler))
{
gStatuses3[i] &= ~(STATUS3_ALWAYS_HITS);
- gStatuses3[i] |= 0x10;
+ gStatuses3[i] |= STATUS3_ALWAYS_HITS_TURN(2);
}
}
}
@@ -3214,7 +3214,7 @@ void SwitchInClearSetData(void)
*(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;
*(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;
- gBattleStruct->field_92 &= ~(gBitTable[gActiveBattler]);
+ gBattleStruct->palaceFlags &= ~(gBitTable[gActiveBattler]);
for (i = 0; i < gBattlersCount; i++)
{
@@ -3309,7 +3309,7 @@ void FaintClearSetData(void)
*(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 0) = 0;
*(3 * 2 + gActiveBattler * 8 + (u8*)(gBattleStruct->lastTakenMoveFrom) + 1) = 0;
- gBattleStruct->field_92 &= ~(gBitTable[gActiveBattler]);
+ gBattleStruct->palaceFlags &= ~(gBitTable[gActiveBattler]);
for (i = 0; i < gBattlersCount; i++)
{
@@ -4052,7 +4052,7 @@ void BattleTurnPassed(void)
gRandomTurnNumber = Random();
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
- BattleScriptExecute(BattleScript_82DB881);
+ BattleScriptExecute(BattleScript_PalacePrintFlavorText);
else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->arenaTurnCounter == 0)
BattleScriptExecute(BattleScript_ArenaTurnBeginning);
}
diff --git a/src/battle_message.c b/src/battle_message.c
index 693058e2f..2a0ba4ded 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -312,23 +312,23 @@ static const u8 sText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}'s stats
static const u8 sText_StatsWontDecrease2[] = _("{B_DEF_NAME_WITH_PREFIX}'s stats won't\ngo any lower!");
static const u8 sText_CriticalHit[] = _("A critical hit!");
static const u8 sText_OneHitKO[] = _("It's a one-hit KO!");
-static const u8 sText_123Poof[] = _("{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p");
+static const u8 sText_123Poof[] = _("{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE SE_KON}Poof!\p");
static const u8 sText_AndEllipsis[] = _("And…\p");
static const u8 sText_HMMovesCantBeForgotten[] = _("HM moves can't be\nforgotten now.\p");
static const u8 sText_NotVeryEffective[] = _("It's not very effective…");
static const u8 sText_SuperEffective[] = _("It's super effective!");
-static const u8 sText_GotAwaySafely[] = _("{PLAY_SE 0x0011}Got away safely!\p");
-static const u8 sText_PkmnFledUsingIts[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing its {B_LAST_ITEM}!\p");
-static const u8 sText_PkmnFledUsing[] = _("{PLAY_SE 0x0011}{B_ATK_NAME_WITH_PREFIX} fled\nusing {B_ATK_ABILITY}!\p");
-static const u8 sText_WildPkmnFled[] = _("{PLAY_SE 0x0011}Wild {B_BUFF1} fled!");
+static const u8 sText_GotAwaySafely[] = _("{PLAY_SE SE_NIGERU}Got away safely!\p");
+static const u8 sText_PkmnFledUsingIts[] = _("{PLAY_SE SE_NIGERU}{B_ATK_NAME_WITH_PREFIX} fled\nusing its {B_LAST_ITEM}!\p");
+static const u8 sText_PkmnFledUsing[] = _("{PLAY_SE SE_NIGERU}{B_ATK_NAME_WITH_PREFIX} fled\nusing {B_ATK_ABILITY}!\p");
+static const u8 sText_WildPkmnFled[] = _("{PLAY_SE SE_NIGERU}Wild {B_BUFF1} fled!");
static const u8 sText_PlayerDefeatedLinkTrainer[] = _("Player defeated\n{B_LINK_OPPONENT1_NAME}!");
static const u8 sText_TwoLinkTrainersDefeated[] = _("Player beat {B_LINK_OPPONENT1_NAME}\nand {B_LINK_OPPONENT2_NAME}!");
static const u8 sText_PlayerLostAgainstLinkTrainer[] = _("Player lost against\n{B_LINK_OPPONENT1_NAME}!");
static const u8 sText_PlayerLostToTwo[] = _("Player lost to {B_LINK_OPPONENT1_NAME}\nand {B_LINK_OPPONENT2_NAME}!");
static const u8 sText_PlayerBattledToDrawLinkTrainer[] = _("Player battled to a draw against\n{B_LINK_OPPONENT1_NAME}!");
static const u8 sText_PlayerBattledToDrawVsTwo[] = _("Player battled to a draw against\n{B_LINK_OPPONENT1_NAME} and {B_LINK_OPPONENT2_NAME}!");
-static const u8 sText_WildFled[] = _("{PLAY_SE 0x0011}{B_LINK_OPPONENT1_NAME} fled!");
-static const u8 sText_TwoWildFled[] = _("{PLAY_SE 0x0011}{B_LINK_OPPONENT1_NAME} and\n{B_LINK_OPPONENT2_NAME} fled!");
+static const u8 sText_WildFled[] = _("{PLAY_SE SE_NIGERU}{B_LINK_OPPONENT1_NAME} fled!");
+static const u8 sText_TwoWildFled[] = _("{PLAY_SE SE_NIGERU}{B_LINK_OPPONENT1_NAME} and\n{B_LINK_OPPONENT2_NAME} fled!");
static const u8 sText_NoRunningFromTrainers[] = _("No! There's no running\nfrom a TRAINER battle!\p");
static const u8 sText_CantEscape[] = _("Can't escape!\p");
static const u8 sText_DontLeaveBirch[] = _("PROF. BIRCH: Don't leave me like this!\p");
@@ -378,7 +378,7 @@ static const u8 sText_PkmnCuriousAboutX[] = _("{B_OPPONENT_MON1_NAME} is curious
static const u8 sText_PkmnEnthralledByX[] = _("{B_OPPONENT_MON1_NAME} is enthralled by\nthe {B_BUFF1}!");
static const u8 sText_PkmnIgnoredX[] = _("{B_OPPONENT_MON1_NAME} completely ignored\nthe {B_BUFF1}!");
static const u8 sText_ThrewPokeblockAtPkmn[] = _("{B_PLAYER_NAME} threw a {POKEBLOCK}\nat the {B_OPPONENT_MON1_NAME}!");
-static const u8 sText_OutOfSafariBalls[] = _("{PLAY_SE 0x0049}ANNOUNCER: You're out of\nSAFARI BALLS! Game over!\p");
+static const u8 sText_OutOfSafariBalls[] = _("{PLAY_SE SE_PINPON}ANNOUNCER: You're out of\nSAFARI BALLS! Game over!\p");
static const u8 sText_OpponentMon1Appeared[] = _("{B_OPPONENT_MON1_NAME} appeared!\p");
static const u8 sText_WildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
static const u8 sText_WildPkmnAppeared2[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
@@ -1267,10 +1267,12 @@ static const u8 sText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PRE
static const u8 sText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!");
static const u8 sText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!");
-const u16 gStringIds_85CCF0A[] =
+const u16 gBattlePalaceFlavorTextTable[] =
{
- STRINGID_GLINTAPPEARSINEYE, STRINGID_PKMNGETTINGINTOPOSITION,
- STRINGID_PKMNBEGANGROWLINGDEEPLY, STRINGID_PKMNEAGERFORMORE
+ STRINGID_GLINTAPPEARSINEYE,
+ STRINGID_PKMNGETTINGINTOPOSITION,
+ STRINGID_PKMNBEGANGROWLINGDEEPLY,
+ STRINGID_PKMNEAGERFORMORE
};
static const u8 sText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!");
@@ -1303,7 +1305,7 @@ static const u8 sText_QuestionForfeitMatch[] = _("Would you like to forfeit the
static const u8 sText_ForfeitedMatch[] = _("{B_PLAYER_NAME} forfeited the match!");
static const u8 sText_Trainer1WinText[] = _("{B_TRAINER1_WIN_TEXT}");
static const u8 sText_Trainer2WinText[] = _("{B_TRAINER2_WIN_TEXT}");
-static const u8 sText_Trainer1Fled[] = _( "{PLAY_SE 0x0011}{B_TRAINER1_CLASS} {B_TRAINER1_NAME} fled!");
+static const u8 sText_Trainer1Fled[] = _( "{PLAY_SE SE_NIGERU}{B_TRAINER1_CLASS} {B_TRAINER1_NAME} fled!");
static const u8 sText_PlayerLostAgainstTrainer1[] = _("Player lost against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
static const u8 sText_PlayerBattledToDrawTrainer1[] = _("Player battled to a draw against\n{B_TRAINER1_CLASS} {B_TRAINER1_NAME}!");
const u8 gText_RecordBattleToPass[] = _("Would you like to record your battle\non your FRONTIER PASS?");
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 84f2b1f4d..4e0e087b6 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -606,111 +606,66 @@ static const struct StatFractions sAccuracyStageRatios[] =
// The chance is 1/N for each stage.
static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
-static const u32 sStatusFlagsForMoveEffects[] =
-{
- 0x00000000,
- STATUS1_SLEEP,
- STATUS1_POISON,
- STATUS1_BURN,
- STATUS1_FREEZE,
- STATUS1_PARALYSIS,
- STATUS1_TOXIC_POISON,
- STATUS2_CONFUSION,
- STATUS2_FLINCHED,
- 0x00000000,
- STATUS2_UPROAR,
- 0x00000000,
- STATUS2_MULTIPLETURNS,
- STATUS2_WRAPPED,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- STATUS2_RECHARGE,
- 0x00000000,
- 0x00000000,
- STATUS2_ESCAPE_PREVENTION,
- STATUS2_NIGHTMARE,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- STATUS2_LOCK_CONFUSE,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000,
- 0x00000000
+static const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] =
+{
+ [MOVE_EFFECT_SLEEP] = STATUS1_SLEEP,
+ [MOVE_EFFECT_POISON] = STATUS1_POISON,
+ [MOVE_EFFECT_BURN] = STATUS1_BURN,
+ [MOVE_EFFECT_FREEZE] = STATUS1_FREEZE,
+ [MOVE_EFFECT_PARALYSIS] = STATUS1_PARALYSIS,
+ [MOVE_EFFECT_TOXIC] = STATUS1_TOXIC_POISON,
+ [MOVE_EFFECT_CONFUSION] = STATUS2_CONFUSION,
+ [MOVE_EFFECT_FLINCH] = STATUS2_FLINCHED,
+ [MOVE_EFFECT_UPROAR] = STATUS2_UPROAR,
+ [MOVE_EFFECT_CHARGING] = STATUS2_MULTIPLETURNS,
+ [MOVE_EFFECT_WRAP] = STATUS2_WRAPPED,
+ [MOVE_EFFECT_RECHARGE] = STATUS2_RECHARGE,
+ [MOVE_EFFECT_PREVENT_ESCAPE] = STATUS2_ESCAPE_PREVENTION,
+ [MOVE_EFFECT_NIGHTMARE] = STATUS2_NIGHTMARE,
+ [MOVE_EFFECT_THRASH] = STATUS2_LOCK_CONFUSE,
};
static const u8* const sMoveEffectBS_Ptrs[] =
{
- [0] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_SLEEP] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_POISON] = BattleScript_MoveEffectPoison,
- [MOVE_EFFECT_BURN] = BattleScript_MoveEffectBurn,
- [MOVE_EFFECT_FREEZE] = BattleScript_MoveEffectFreeze,
- [MOVE_EFFECT_PARALYSIS] = BattleScript_MoveEffectParalysis,
- [MOVE_EFFECT_TOXIC] = BattleScript_MoveEffectToxic,
- [MOVE_EFFECT_CONFUSION] = BattleScript_MoveEffectConfusion,
- [MOVE_EFFECT_FLINCH] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_TRI_ATTACK] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar,
- [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay,
- [MOVE_EFFECT_CHARGING] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap,
- [MOVE_EFFECT_RECOIL_25] = BattleScript_MoveEffectRecoil,
- [MOVE_EFFECT_ATK_PLUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_DEF_PLUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_SPD_PLUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_SP_ATK_PLUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_SP_DEF_PLUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_ACC_PLUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_EVS_PLUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_ATK_MINUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_DEF_MINUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_SPD_MINUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_SP_ATK_MINUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_SP_DEF_MINUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_ACC_MINUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_EVS_MINUS_1] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_RECHARGE] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_RAGE] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_STEAL_ITEM] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_PREVENT_ESCAPE] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_NIGHTMARE] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_ALL_STATS_UP] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_RAPIDSPIN] = BattleScript_MoveEffectSleep,
+ [0] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_SLEEP] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_POISON] = BattleScript_MoveEffectPoison,
+ [MOVE_EFFECT_BURN] = BattleScript_MoveEffectBurn,
+ [MOVE_EFFECT_FREEZE] = BattleScript_MoveEffectFreeze,
+ [MOVE_EFFECT_PARALYSIS] = BattleScript_MoveEffectParalysis,
+ [MOVE_EFFECT_TOXIC] = BattleScript_MoveEffectToxic,
+ [MOVE_EFFECT_CONFUSION] = BattleScript_MoveEffectConfusion,
+ [MOVE_EFFECT_FLINCH] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_TRI_ATTACK] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_UPROAR] = BattleScript_MoveEffectUproar,
+ [MOVE_EFFECT_PAYDAY] = BattleScript_MoveEffectPayDay,
+ [MOVE_EFFECT_CHARGING] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_WRAP] = BattleScript_MoveEffectWrap,
+ [MOVE_EFFECT_RECOIL_25] = BattleScript_MoveEffectRecoil,
+ [MOVE_EFFECT_ATK_PLUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_DEF_PLUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_SPD_PLUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_SP_ATK_PLUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_SP_DEF_PLUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_ACC_PLUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_EVS_PLUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_ATK_MINUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_DEF_MINUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_SPD_MINUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_SP_ATK_MINUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_SP_DEF_MINUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_ACC_MINUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_EVS_MINUS_1] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_RECHARGE] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_RAGE] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_STEAL_ITEM] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_PREVENT_ESCAPE] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_NIGHTMARE] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_ALL_STATS_UP] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_RAPIDSPIN] = BattleScript_MoveEffectSleep,
[MOVE_EFFECT_REMOVE_PARALYSIS] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_ATK_DEF_DOWN] = BattleScript_MoveEffectSleep,
- [MOVE_EFFECT_RECOIL_33] = BattleScript_MoveEffectRecoil,
+ [MOVE_EFFECT_ATK_DEF_DOWN] = BattleScript_MoveEffectSleep,
+ [MOVE_EFFECT_RECOIL_33] = BattleScript_MoveEffectRecoil,
};
static const struct WindowTemplate sUnusedWinTemplate = {0, 1, 3, 7, 0xF, 0x1F, 0x3F};
@@ -797,16 +752,16 @@ static const u8 sFlailHpScaleToPowerTable[] =
static const u16 sNaturePowerMoves[] =
{
- MOVE_STUN_SPORE,
- MOVE_RAZOR_LEAF,
- MOVE_EARTHQUAKE,
- MOVE_HYDRO_PUMP,
- MOVE_SURF,
- MOVE_BUBBLE_BEAM,
- MOVE_ROCK_SLIDE,
- MOVE_SHADOW_BALL,
- MOVE_SWIFT,
- MOVE_SWIFT
+ [BATTLE_TERRAIN_GRASS] = MOVE_STUN_SPORE,
+ [BATTLE_TERRAIN_LONG_GRASS] = MOVE_RAZOR_LEAF,
+ [BATTLE_TERRAIN_SAND] = MOVE_EARTHQUAKE,
+ [BATTLE_TERRAIN_UNDERWATER] = MOVE_HYDRO_PUMP,
+ [BATTLE_TERRAIN_WATER] = MOVE_SURF,
+ [BATTLE_TERRAIN_POND] = MOVE_BUBBLE_BEAM,
+ [BATTLE_TERRAIN_MOUNTAIN] = MOVE_ROCK_SLIDE,
+ [BATTLE_TERRAIN_CAVE] = MOVE_SHADOW_BALL,
+ [BATTLE_TERRAIN_BUILDING] = MOVE_SWIFT,
+ [BATTLE_TERRAIN_PLAIN] = MOVE_SWIFT
};
// format: min. weight (hectograms), base power
@@ -864,58 +819,92 @@ static const u8 sPickupProbabilities[] =
static const u8 sTerrainToType[] =
{
- TYPE_GRASS, // tall grass
- TYPE_GRASS, // long grass
- TYPE_GROUND, // sand
- TYPE_WATER, // underwater
- TYPE_WATER, // water
- TYPE_WATER, // pond water
- TYPE_ROCK, // rock
- TYPE_ROCK, // cave
- TYPE_NORMAL, // building
- TYPE_NORMAL, // plain
+ [BATTLE_TERRAIN_GRASS] = TYPE_GRASS,
+ [BATTLE_TERRAIN_LONG_GRASS] = TYPE_GRASS,
+ [BATTLE_TERRAIN_SAND] = TYPE_GROUND,
+ [BATTLE_TERRAIN_UNDERWATER] = TYPE_WATER,
+ [BATTLE_TERRAIN_WATER] = TYPE_WATER,
+ [BATTLE_TERRAIN_POND] = TYPE_WATER,
+ [BATTLE_TERRAIN_MOUNTAIN] = TYPE_ROCK,
+ [BATTLE_TERRAIN_CAVE] = TYPE_ROCK,
+ [BATTLE_TERRAIN_BUILDING] = TYPE_NORMAL,
+ [BATTLE_TERRAIN_PLAIN] = TYPE_NORMAL,
};
+// - ITEM_ULTRA_BALL skips Master Ball and ITEM_NONE
static const u8 sBallCatchBonuses[] =
{
- 20, 15, 10, 15 // Ultra, Great, Poke, Safari
+ [ITEM_ULTRA_BALL - ITEM_ULTRA_BALL] = 20,
+ [ITEM_GREAT_BALL - ITEM_ULTRA_BALL] = 15,
+ [ITEM_POKE_BALL - ITEM_ULTRA_BALL] = 10,
+ [ITEM_SAFARI_BALL - ITEM_ULTRA_BALL] = 15
};
-const ALIGNED(4) u8 gUnknown_0831C494[][4] =
-{
- {0x3d, 0x44, 0x3d, 0x44},
- {0x14, 0x2d, 0x54, 0x5c},
- {0x46, 0x55, 0x20, 0x5c},
- {0x26, 0x45, 0x46, 0x55},
- {0x14, 0x5a, 0x46, 0x5c},
- {0x1e, 0x32, 0x20, 0x5a},
- {0x38, 0x4e, 0x38, 0x4e},
- {0x19, 0x28, 0x4b, 0x5a},
- {0x45, 0x4b, 0x1c, 0x53},
- {0x23, 0x2d, 0x1d, 0x23},
- {0x3e, 0x48, 0x1e, 0x32},
- {0x3a, 0x5f, 0x58, 0x5e},
- {0x22, 0x2d, 0x1d, 0x28},
- {0x23, 0x28, 0x23, 0x5f},
- {0x38, 0x4e, 0x38, 0x4e},
- {0x23, 0x50, 0x22, 0x5e},
- {0x2c, 0x5e, 0x22, 0x28},
- {0x38, 0x4e, 0x38, 0x4e},
- {0x1e, 0x58, 0x1e, 0x58},
- {0x1e, 0x2b, 0x1b, 0x21},
- {0x28, 0x5a, 0x19, 0x57},
- {0x12, 0x58, 0x5a, 0x5f},
- {0x58, 0x5e, 0x16, 0x2a},
- {0x2a, 0x5c, 0x2a, 0x2f},
- {0x38, 0x4e, 0x38, 0x4e}
+// In Battle Palace, moves are chosen based on the pokemons nature rather than by the player
+// Moves are grouped into "Attack", "Defense", or "Support" (see PALACE_MOVE_GROUP_*)
+// Each nature has a certain percent chance of selecting a move from a particular group
+// and a separate percent chance for each group when below 50% HP
+// The table below doesn't list percentages for Support because you can subtract the other two
+// Support percentages are listed in comments off to the side instead
+#define PALACE_STYLE(atk, def, atkLow, defLow) {atk, atk + def, atkLow, atkLow + defLow}
+
+const ALIGNED(4) u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4] =
+{
+ [NATURE_HARDY] = PALACE_STYLE(61, 7, 61, 7), // 32% support >= 50% HP, 32% support < 50% HP
+ [NATURE_LONELY] = PALACE_STYLE(20, 25, 84, 8), // 55%, 8%
+ [NATURE_BRAVE] = PALACE_STYLE(70, 15, 32, 60), // 15%, 8%
+ [NATURE_ADAMANT] = PALACE_STYLE(38, 31, 70, 15), // 31%, 15%
+ [NATURE_NAUGHTY] = PALACE_STYLE(20, 70, 70, 22), // 10%, 8%
+ [NATURE_BOLD] = PALACE_STYLE(30, 20, 32, 58), // 50%, 10%
+ [NATURE_DOCILE] = PALACE_STYLE(56, 22, 56, 22), // 22%, 22%
+ [NATURE_RELAXED] = PALACE_STYLE(25, 15, 75, 15), // 60%, 10%
+ [NATURE_IMPISH] = PALACE_STYLE(69, 6, 28, 55), // 25%, 17%
+ [NATURE_LAX] = PALACE_STYLE(35, 10, 29, 6), // 55%, 65%
+ [NATURE_TIMID] = PALACE_STYLE(62, 10, 30, 20), // 28%, 50%
+ [NATURE_HASTY] = PALACE_STYLE(58, 37, 88, 6), // 5%, 6%
+ [NATURE_SERIOUS] = PALACE_STYLE(34, 11, 29, 11), // 55%, 60%
+ [NATURE_JOLLY] = PALACE_STYLE(35, 5, 35, 60), // 60%, 5%
+ [NATURE_NAIVE] = PALACE_STYLE(56, 22, 56, 22), // 22%, 22%
+ [NATURE_MODEST] = PALACE_STYLE(35, 45, 34, 60), // 20%, 6%
+ [NATURE_MILD] = PALACE_STYLE(44, 50, 34, 6), // 6%, 60%
+ [NATURE_QUIET] = PALACE_STYLE(56, 22, 56, 22), // 22%, 22%
+ [NATURE_BASHFUL] = PALACE_STYLE(30, 58, 30, 58), // 12%, 12%
+ [NATURE_RASH] = PALACE_STYLE(30, 13, 27, 6), // 57%, 67%
+ [NATURE_CALM] = PALACE_STYLE(40, 50, 25, 62), // 10%, 13%
+ [NATURE_GENTLE] = PALACE_STYLE(18, 70, 90, 5), // 12%, 5%
+ [NATURE_SASSY] = PALACE_STYLE(88, 6, 22, 20), // 6%, 58%
+ [NATURE_CAREFUL] = PALACE_STYLE(42, 50, 42, 5), // 8%, 53%
+ [NATURE_QUIRKY] = PALACE_STYLE(56, 22, 56, 22) // 22%, 22%
};
-static const u8 sUnknown_0831C4F8[] =
-{
- 0x03, 0x00, 0x01, 0x00, 0x00, 0x01, 0x03, 0x00,
- 0x01, 0x02, 0x02, 0x00, 0x03, 0x01, 0x03, 0x01,
- 0x02, 0x03, 0x03, 0x02, 0x01, 0x00, 0x02, 0x02,
- 0x03, 0x00, 0x00, 0x00
+// Indices into gBattlePalaceFlavorTextTable
+static const u8 sBattlePalaceNatureToFlavorTextId[NUM_NATURES] =
+{
+ [NATURE_HARDY] = 3,
+ [NATURE_LONELY] = 0,
+ [NATURE_BRAVE] = 1,
+ [NATURE_ADAMANT] = 0,
+ [NATURE_NAUGHTY] = 0,
+ [NATURE_BOLD] = 1,
+ [NATURE_DOCILE] = 3,
+ [NATURE_RELAXED] = 0,
+ [NATURE_IMPISH] = 1,
+ [NATURE_LAX] = 2,
+ [NATURE_TIMID] = 2,
+ [NATURE_HASTY] = 0,
+ [NATURE_SERIOUS] = 3,
+ [NATURE_JOLLY] = 1,
+ [NATURE_NAIVE] = 3,
+ [NATURE_MODEST] = 1,
+ [NATURE_MILD] = 2,
+ [NATURE_QUIET] = 3,
+ [NATURE_BASHFUL] = 3,
+ [NATURE_RASH] = 2,
+ [NATURE_CALM] = 1,
+ [NATURE_GENTLE] = 0,
+ [NATURE_SASSY] = 2,
+ [NATURE_CAREFUL] = 2,
+ [NATURE_QUIRKY] = 3,
};
static void Cmd_attackcanceler(void)
@@ -2245,7 +2234,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
if (gBattleMons[gEffectBattler].status2 & STATUS2_SUBSTITUTE && affectsUser != MOVE_EFFECT_AFFECTS_USER)
INCREMENT_RESET_RETURN
- if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) // status change
+ if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT)
{
switch (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]])
{
@@ -2453,7 +2442,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
BattleScriptPush(gBattlescriptCurrInstr + 1);
if (sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS1_SLEEP)
- gBattleMons[gEffectBattler].status1 |= ((Random() & 3) + 2);
+ gBattleMons[gEffectBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns
else
gBattleMons[gEffectBattler].status1 |= sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
@@ -2513,7 +2502,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
else
{
- gBattleMons[gEffectBattler].status2 |= (((Random()) % 0x4)) + 2;
+ gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
@@ -2546,7 +2535,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;
gLockedMoves[gEffectBattler] = gCurrentMove;
- gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 2) << 4;
+ gBattleMons[gEffectBattler].status2 |= STATUS2_UPROAR_TURN((Random() & 3) + 2); // 2-5 turns
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
@@ -2591,7 +2580,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
}
else
{
- gBattleMons[gEffectBattler].status2 |= ((Random() & 3) + 3) << 0xD;
+ gBattleMons[gEffectBattler].status2 |= STATUS2_WRAPPED_TURN((Random() & 3) + 3); // 3-6 turns
*(gBattleStruct->wrappedMove + gEffectBattler * 2 + 0) = gCurrentMove;
*(gBattleStruct->wrappedMove + gEffectBattler * 2 + 1) = gCurrentMove >> 8;
@@ -2834,7 +2823,7 @@ void SetMoveEffect(bool8 primary, u8 certain)
{
gBattleMons[gEffectBattler].status2 |= STATUS2_MULTIPLETURNS;
gLockedMoves[gEffectBattler] = gCurrentMove;
- gBattleMons[gEffectBattler].status2 |= (((Random() & 1) + 2) << 0xA);
+ gBattleMons[gEffectBattler].status2 |= STATUS2_LOCK_CONFUSE_TURN((Random() & 1) + 2); // thrash for 2-3 turns
}
break;
case MOVE_EFFECT_KNOCK_OFF:
@@ -2929,7 +2918,7 @@ static void Cmd_clearstatusfromeffect(void)
{
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
- if (gBattleCommunication[MOVE_EFFECT_BYTE] <= MOVE_EFFECT_TOXIC)
+ if (gBattleCommunication[MOVE_EFFECT_BYTE] <= PRIMARY_STATUS_MOVE_EFFECT)
gBattleMons[gActiveBattler].status1 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
else
gBattleMons[gActiveBattler].status2 &= (~sStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]);
@@ -3482,7 +3471,7 @@ static void Cmd_getexp(void)
else
{
gBattleStruct->expGetterMonId++;
- if (gBattleStruct->expGetterMonId <= 5)
+ if (gBattleStruct->expGetterMonId < PARTY_SIZE)
gBattleScripting.getexpState = 2; // loop again
else
gBattleScripting.getexpState = 6; // we're done
@@ -3552,13 +3541,13 @@ static void Cmd_unknown_24(void)
// Impossible to decompile loops.
for (foundPlayer = 0, i = 0; i < gBattlersCount; i += 2)
{
- if (HITMARKER_UNK(i) & gHitMarker && !gSpecialStatuses[i].flag40)
+ if (HITMARKER_FAINTED2(i) & gHitMarker && !gSpecialStatuses[i].flag40)
foundPlayer++;
}
for (foundOpponent = 0, i = 1; i < gBattlersCount; i += 2)
{
- if (HITMARKER_UNK(i) & gHitMarker && !gSpecialStatuses[i].flag40)
+ if (HITMARKER_FAINTED2(i) & gHitMarker && !gSpecialStatuses[i].flag40)
foundOpponent++;
}
@@ -4914,10 +4903,12 @@ static void Cmd_switchindataupdate(void)
SwitchInClearSetData();
- if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gBattleMons[gActiveBattler].maxHP / 2 >= gBattleMons[gActiveBattler].hp
- && gBattleMons[gActiveBattler].hp != 0 && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
+ if (gBattleTypeFlags & BATTLE_TYPE_PALACE
+ && gBattleMons[gActiveBattler].maxHP / 2 >= gBattleMons[gActiveBattler].hp
+ && gBattleMons[gActiveBattler].hp != 0
+ && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
{
- gBattleStruct->field_92 |= gBitTable[gActiveBattler];
+ gBattleStruct->palaceFlags |= gBitTable[gActiveBattler];
}
gBattleScripting.battler = gActiveBattler;
@@ -5101,7 +5092,7 @@ static void Cmd_jumpifcantswitch(void)
break;
}
- if (i == 6)
+ if (i == PARTY_SIZE)
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
@@ -6588,11 +6579,11 @@ static void Cmd_various(void)
case VARIOUS_GET_MOVE_TARGET:
gBattlerTarget = GetMoveTarget(gCurrentMove, 0);
break;
- case 4:
+ case VARIOUS_GET_BATTLER_FAINTED:
if (gHitMarker & HITMARKER_FAINTED(gActiveBattler))
- gBattleCommunication[0] = 1;
+ gBattleCommunication[0] = TRUE;
else
- gBattleCommunication[0] = 0;
+ gBattleCommunication[0] = FALSE;
break;
case VARIOUS_RESET_INTIMIDATE_TRACE_BITS:
gSpecialStatuses[gActiveBattler].intimidatedMon = 0;
@@ -6628,17 +6619,19 @@ static void Cmd_various(void)
gHitMarker &= ~(HITMARKER_x400000);
}
break;
- case 8:
- gBattleCommunication[0] = 0;
+ case VARIOUS_PALACE_FLAVOR_TEXT:
+ // Try and print end-of-turn Battle Palace flavor text (e.g. "A glint appears in mon's eyes")
+ gBattleCommunication[0] = FALSE; // whether or not msg should be printed
gBattleScripting.battler = gActiveBattler = gBattleCommunication[1];
- if (!(gBattleStruct->field_92 & gBitTable[gActiveBattler])
+
+ if (!(gBattleStruct->palaceFlags & gBitTable[gActiveBattler])
&& gBattleMons[gActiveBattler].maxHP / 2 >= gBattleMons[gActiveBattler].hp
&& gBattleMons[gActiveBattler].hp != 0
&& !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
{
- gBattleStruct->field_92 |= gBitTable[gActiveBattler];
- gBattleCommunication[0] = 1;
- gBattleCommunication[MULTISTRING_CHOOSER] = sUnknown_0831C4F8[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)];
+ gBattleStruct->palaceFlags |= gBitTable[gActiveBattler];
+ gBattleCommunication[0] = TRUE;
+ gBattleCommunication[MULTISTRING_CHOOSER] = sBattlePalaceNatureToFlavorTextId[GetNatureFromPersonality(gBattleMons[gActiveBattler].personality)];
}
break;
case VARIOUS_ARENA_JUDGMENT_WINDOW:
@@ -7368,7 +7361,7 @@ static void Cmd_setbide(void)
gBattleMons[gBattlerAttacker].status2 |= STATUS2_MULTIPLETURNS;
gLockedMoves[gBattlerAttacker] = gCurrentMove;
gTakenDmg[gBattlerAttacker] = 0;
- gBattleMons[gBattlerAttacker].status2 |= (STATUS2_BIDE - 0x100); // 2 turns
+ gBattleMons[gBattlerAttacker].status2 |= STATUS2_BIDE_TURN(2);
gBattlescriptCurrInstr++;
}
@@ -8326,7 +8319,7 @@ static void Cmd_settypetorandomresistance(void) // conversion 2
static void Cmd_setalwayshitflag(void)
{
gStatuses3[gBattlerTarget] &= ~(STATUS3_ALWAYS_HITS);
- gStatuses3[gBattlerTarget] |= 0x10;
+ gStatuses3[gBattlerTarget] |= STATUS3_ALWAYS_HITS_TURN(2);
gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker;
gBattlescriptCurrInstr++;
}
@@ -9145,7 +9138,7 @@ static void Cmd_trydobeatup(void)
else
{
u8 beforeLoop = gBattleCommunication[0];
- for (;gBattleCommunication[0] < 6; gBattleCommunication[0]++)
+ for (;gBattleCommunication[0] < PARTY_SIZE; gBattleCommunication[0]++)
{
if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP)
&& GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES2)
@@ -9153,7 +9146,7 @@ static void Cmd_trydobeatup(void)
&& !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS))
break;
}
- if (gBattleCommunication[0] < 6)
+ if (gBattleCommunication[0] < PARTY_SIZE)
{
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0])
@@ -9520,7 +9513,7 @@ static void Cmd_setyawn(void)
}
else
{
- gStatuses3[gBattlerTarget] |= 0x1000;
+ gStatuses3[gBattlerTarget] |= STATUS3_YAWN_TURN(2);
gBattlescriptCurrInstr += 5;
}
}
@@ -9654,7 +9647,7 @@ static void Cmd_assistattackselect(void)
else
party = gPlayerParty;
- for (monId = 0; monId < 6; monId++)
+ for (monId = 0; monId < PARTY_SIZE; monId++)
{
if (monId == gBattlerPartyIndexes[gBattlerAttacker])
continue;
@@ -9865,7 +9858,7 @@ static void Cmd_pickup(void)
if (lvlDivBy10 > 9)
lvlDivBy10 = 9;
- for (j = 0; j < 9; j++)
+ for (j = 0; j < (int)ARRAY_COUNT(sPickupProbabilities); j++)
{
if (sPickupProbabilities[j] > rand)
{
@@ -10134,7 +10127,7 @@ static void Cmd_handleballthrow(void)
}
}
else
- ballMultiplier = sBallCatchBonuses[gLastUsedItem - 2];
+ ballMultiplier = sBallCatchBonuses[gLastUsedItem - ITEM_ULTRA_BALL];
odds = (catchRate * ballMultiplier / 10)
* (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2)
@@ -10436,7 +10429,7 @@ static void Cmd_trygivecaughtmonnick(void)
}
break;
case 4:
- if (CalculatePlayerPartyCount() == 6)
+ if (CalculatePlayerPartyCount() == PARTY_SIZE)
gBattlescriptCurrInstr += 5;
else
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 40e36d302..36fce2081 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -124,28 +124,43 @@ static const u8 sBattleTransitionTable_Trainer[][2] =
{B_TRANSITION_SWIRL, B_TRANSITION_RIPPLE}, // Water
};
-static const u8 sUnknown_0854FE98[] =
-{
- B_TRANSITION_29, B_TRANSITION_30, B_TRANSITION_31, B_TRANSITION_32,
- B_TRANSITION_34, B_TRANSITION_35, B_TRANSITION_36, B_TRANSITION_37,
- B_TRANSITION_38, B_TRANSITION_39, B_TRANSITION_40, B_TRANSITION_41
+// Battle Frontier (excluding Pyramid and Dome, which have their own tables below)
+static const u8 sBattleTransitionTable_BattleFrontier[] =
+{
+ B_TRANSITION_FRONTIER_LOGO_WIGGLE,
+ B_TRANSITION_FRONTIER_LOGO_WAVE,
+ B_TRANSITION_FRONTIER_SQUARES,
+ B_TRANSITION_FRONTIER_SQUARES_SCROLL,
+ B_TRANSITION_FRONTIER_CIRCLES_MEET,
+ B_TRANSITION_FRONTIER_CIRCLES_CROSS,
+ B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL,
+ B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL,
+ B_TRANSITION_FRONTIER_CIRCLES_MEET_IN_SEQ,
+ B_TRANSITION_FRONTIER_CIRCLES_CROSS_IN_SEQ,
+ B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL_IN_SEQ,
+ B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL_IN_SEQ
};
-static const u8 sUnknown_0854FEA4[] =
+static const u8 sBattleTransitionTable_BattlePyramid[] =
{
- B_TRANSITION_31, B_TRANSITION_32, B_TRANSITION_33
+ B_TRANSITION_FRONTIER_SQUARES,
+ B_TRANSITION_FRONTIER_SQUARES_SCROLL,
+ B_TRANSITION_FRONTIER_SQUARES_SPIRAL
};
-static const u8 sUnknown_0854FEA7[] =
+static const u8 sBattleTransitionTable_BattleDome[] =
{
- B_TRANSITION_29, B_TRANSITION_31, B_TRANSITION_32, B_TRANSITION_33
+ B_TRANSITION_FRONTIER_LOGO_WIGGLE,
+ B_TRANSITION_FRONTIER_SQUARES,
+ B_TRANSITION_FRONTIER_SQUARES_SCROLL,
+ B_TRANSITION_FRONTIER_SQUARES_SPIRAL
};
static const struct TrainerBattleParameter sOrdinaryBattleParams[] =
{
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
{&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
- {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
{&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
@@ -158,7 +173,7 @@ static const struct TrainerBattleParameter sContinueScriptBattleParams[] =
{
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
{&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
- {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
{&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
@@ -171,7 +186,7 @@ static const struct TrainerBattleParameter sDoubleBattleParams[] =
{
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
{&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
- {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
{&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
@@ -184,7 +199,7 @@ static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] =
{
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
{&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
- {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
{&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
{&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
@@ -197,7 +212,7 @@ static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] =
{
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
{&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT},
- {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
{&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
@@ -210,7 +225,7 @@ static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] =
{
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
{&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT},
- {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
{&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
@@ -223,7 +238,7 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[]
{
{&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
{&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT},
- {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
{&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
{&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
@@ -234,7 +249,7 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[]
#define REMATCH(trainer1, trainer2, trainer3, trainer4, trainer5, map) \
{ \
- .trainerIds = {trainer1, trainer2, trainer3, trainer4, trainer5}, \
+ .trainerIds = {trainer1, trainer2, trainer3, trainer4, trainer5}, \
.mapGroup = MAP_GROUP(map), \
.mapNum = MAP_NUM(map), \
}
@@ -449,9 +464,9 @@ static void DoTrainerBattle(void)
static void sub_80B0828(void)
{
if (InBattlePyramid())
- CreateBattleStartTask(sub_80B100C(10), 0);
+ CreateBattleStartTask(GetSpecialBattleTransition(10), 0);
else
- CreateBattleStartTask(sub_80B100C(11), 0);
+ CreateBattleStartTask(GetSpecialBattleTransition(11), 0);
IncrementGameStat(GAME_STAT_TOTAL_BATTLES);
IncrementGameStat(GAME_STAT_TRAINER_BATTLES);
@@ -839,7 +854,17 @@ static u8 GetTrainerBattleTransition(void)
return sBattleTransitionTable_Trainer[transitionType][1];
}
-u8 sub_80B100C(s32 arg0)
+// 0: Battle Tower
+// 3: Battle Dome
+// 4: Battle Palace
+// 5: Battle Arena
+// 6: Battle Factory
+// 7: Battle Pike
+// 10: Battle Pyramid
+// 11: Trainer Hill
+// 12: Secret Base
+// 13: E-Reader
+u8 GetSpecialBattleTransition(s32 id)
{
u16 var;
u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
@@ -847,43 +872,43 @@ u8 sub_80B100C(s32 arg0)
if (enemyLevel < playerLevel)
{
- switch (arg0)
+ switch (id)
{
case 11:
case 12:
case 13:
return B_TRANSITION_POKEBALLS_TRAIL;
case 10:
- return sUnknown_0854FEA4[Random() % ARRAY_COUNT(sUnknown_0854FEA4)];
+ return sBattleTransitionTable_BattlePyramid[Random() % ARRAY_COUNT(sBattleTransitionTable_BattlePyramid)];
case 3:
- return sUnknown_0854FEA7[Random() % ARRAY_COUNT(sUnknown_0854FEA7)];
+ return sBattleTransitionTable_BattleDome[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleDome)];
}
if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS)
- return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)];
+ return sBattleTransitionTable_BattleFrontier[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleFrontier)];
}
else
{
- switch (arg0)
+ switch (id)
{
case 11:
case 12:
case 13:
return B_TRANSITION_BIG_POKEBALL;
case 10:
- return sUnknown_0854FEA4[Random() % ARRAY_COUNT(sUnknown_0854FEA4)];
+ return sBattleTransitionTable_BattlePyramid[Random() % ARRAY_COUNT(sBattleTransitionTable_BattlePyramid)];
case 3:
- return sUnknown_0854FEA7[Random() % ARRAY_COUNT(sUnknown_0854FEA7)];
+ return sBattleTransitionTable_BattleDome[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleDome)];
}
if (VarGet(VAR_FRONTIER_BATTLE_MODE) != FRONTIER_MODE_LINK_MULTIS)
- return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)];
+ return sBattleTransitionTable_BattleFrontier[Random() % ARRAY_COUNT(sBattleTransitionTable_BattleFrontier)];
}
var = gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 0]
+ gSaveBlock2Ptr->frontier.trainerIds[gSaveBlock2Ptr->frontier.curChallengeBattleNum * 2 + 1];
- return sUnknown_0854FE98[var % ARRAY_COUNT(sUnknown_0854FE98)];
+ return sBattleTransitionTable_BattleFrontier[var % ARRAY_COUNT(sBattleTransitionTable_BattleFrontier)];
}
void ChooseStarter(void)
diff --git a/src/battle_tower.c b/src/battle_tower.c
index 4695d9aa0..8fcea1123 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -2028,7 +2028,7 @@ void DoSpecialTrainerBattle(void)
}
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(0));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(0));
break;
case SPECIAL_BATTLE_SECRET_BASE:
for (i = 0; i < PARTY_SIZE; i++)
@@ -2038,7 +2038,7 @@ void DoSpecialTrainerBattle(void)
}
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(12));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(12));
break;
case SPECIAL_BATTLE_EREADER:
ZeroEnemyPartyMons();
@@ -2048,7 +2048,7 @@ void DoSpecialTrainerBattle(void)
gTrainerBattleOpponent_A = 0;
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(13));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(13));
break;
case SPECIAL_BATTLE_DOME:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOME;
@@ -2058,7 +2058,7 @@ void DoSpecialTrainerBattle(void)
FillFrontierTrainerParty(DOME_BATTLE_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
sub_806E694(0);
- BattleTransition_StartOnField(sub_80B100C(3));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(3));
break;
case SPECIAL_BATTLE_PALACE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE;
@@ -2070,7 +2070,7 @@ void DoSpecialTrainerBattle(void)
FillTentTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(4));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(4));
break;
case SPECIAL_BATTLE_ARENA:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_ARENA;
@@ -2080,7 +2080,7 @@ void DoSpecialTrainerBattle(void)
FillTentTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(5));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(5));
break;
case SPECIAL_BATTLE_FACTORY:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_FACTORY;
@@ -2089,28 +2089,28 @@ void DoSpecialTrainerBattle(void)
FillFactoryTrainerParty();
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(6));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(6));
break;
case SPECIAL_BATTLE_PIKE_SINGLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_BATTLE_TOWER;
FillFrontierTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(7));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(7));
break;
case SPECIAL_BATTLE_PYRAMID:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID;
FillFrontierTrainerParty(FRONTIER_PARTY_SIZE);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(10));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(10));
break;
case SPECIAL_BATTLE_PIKE_DOUBLE:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS;
FillFrontierTrainersParties(1);
CreateTask(Task_StartBattleAfterTransition, 1);
PlayMapChosenOrBattleBGM(0);
- BattleTransition_StartOnField(sub_80B100C(7));
+ BattleTransition_StartOnField(GetSpecialBattleTransition(7));
break;
case SPECIAL_BATTLE_STEVEN:
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER;
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 8655c9e0e..2ffa28645 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "battle.h"
#include "battle_transition.h"
+#include "battle_transition_frontier.h"
#include "bg.h"
#include "decompress.h"
#include "event_object_movement.h"
@@ -18,7 +19,6 @@
#include "sprite.h"
#include "task.h"
#include "trig.h"
-#include "unk_transition.h"
#include "util.h"
#include "constants/field_effects.h"
#include "constants/songs.h"
@@ -93,11 +93,11 @@ static void Phase2Task_ShredSplit(u8 taskId);
static void Phase2Task_Blackhole1(u8 taskId);
static void Phase2Task_Blackhole2(u8 taskId);
static void Phase2Task_RectangularSpiral(u8 taskId);
-static void Phase2Task_29(u8 taskId);
-static void Phase2Task_30(u8 taskId);
-static void Phase2Task_31(u8 taskId);
-static void Phase2Task_32(u8 taskId);
-static void Phase2Task_33(u8 taskId);
+static void Phase2Task_FrontierLogoWiggle(u8 taskId);
+static void Phase2Task_FrontierLogoWave(u8 taskId);
+static void Phase2Task_FrontierSquares(u8 taskId);
+static void Phase2Task_FrontierSquaresScroll(u8 taskId);
+static void Phase2Task_FrontierSquaresSpiral(u8 taskId);
static void VBlankCB_BattleTransition(void);
static void VBlankCB_Phase2_Swirl(void);
static void HBlankCB_Phase2_Swirl(void);
@@ -192,12 +192,12 @@ static bool8 Phase2_Blackhole2_Func2(struct Task *task);
static bool8 Phase2_RectangularSpiral_Func1(struct Task *task);
static bool8 Phase2_RectangularSpiral_Func2(struct Task *task);
static bool8 Phase2_RectangularSpiral_Func3(struct Task *task);
-static bool8 Phase2_29_Func1(struct Task *task);
-static bool8 Phase2_29_Func2(struct Task *task);
-static bool8 Phase2_30_Func1(struct Task *task);
-static bool8 Phase2_30_Func2(struct Task *task);
-static bool8 Phase2_30_Func3(struct Task *task);
-static bool8 Phase2_30_Func4(struct Task *task);
+static bool8 Phase2_FrontierLogoWiggle_Func1(struct Task *task);
+static bool8 Phase2_FrontierLogoWiggle_Func2(struct Task *task);
+static bool8 Phase2_FrontierLogoWave_Func1(struct Task *task);
+static bool8 Phase2_FrontierLogoWave_Func2(struct Task *task);
+static bool8 Phase2_FrontierLogoWave_Func3(struct Task *task);
+static bool8 Phase2_FrontierLogoWave_Func4(struct Task *task);
static bool8 Phase2_Rayquaza_Func3(struct Task *task);
static bool8 Phase2_Rayquaza_Func4(struct Task *task);
static bool8 Phase2_Rayquaza_Func5(struct Task *task);
@@ -205,19 +205,19 @@ static bool8 Phase2_Rayquaza_Func6(struct Task *task);
static bool8 Phase2_Rayquaza_Func7(struct Task *task);
static bool8 Phase2_Rayquaza_Func8(struct Task *task);
static bool8 Phase2_Rayquaza_Func9(struct Task *task);
-static bool8 Phase2_31_Func1(struct Task *task);
-static bool8 Phase2_31_Func2(struct Task *task);
-static bool8 Phase2_31_Func3(struct Task *task);
-static bool8 Phase2_31_33_Func5(struct Task *task);
-static bool8 Phase2_33_Func1(struct Task *task);
-static bool8 Phase2_33_Func2(struct Task *task);
-static bool8 Phase2_33_Func3(struct Task *task);
-static bool8 Phase2_33_Func4(struct Task *task);
-static bool8 Phase2_32_Func1(struct Task *task);
-static bool8 Phase2_32_Func2(struct Task *task);
-static bool8 Phase2_32_Func3(struct Task *task);
-static bool8 Phase2_32_Func4(struct Task *task);
-static bool8 Phase2_32_Func5(struct Task *task);
+static bool8 Phase2_FrontierSquares_Func1(struct Task *task);
+static bool8 Phase2_FrontierSquares_Func2(struct Task *task);
+static bool8 Phase2_FrontierSquares_Func3(struct Task *task);
+static bool8 Phase2_FrontierSquares_End(struct Task *task);
+static bool8 Phase2_FrontierSquaresSpiral_Func1(struct Task *task);
+static bool8 Phase2_FrontierSquaresSpiral_Func2(struct Task *task);
+static bool8 Phase2_FrontierSquaresSpiral_Func3(struct Task *task);
+static bool8 Phase2_FrontierSquaresSpiral_Func4(struct Task *task);
+static bool8 Phase2_FrontierSquaresScroll_Func1(struct Task *task);
+static bool8 Phase2_FrontierSquaresScroll_Func2(struct Task *task);
+static bool8 Phase2_FrontierSquaresScroll_Func3(struct Task *task);
+static bool8 Phase2_FrontierSquaresScroll_Func4(struct Task *task);
+static bool8 Phase2_FrontierSquaresScroll_Func5(struct Task *task);
static bool8 Phase2_Mugshot_Func1(struct Task *task);
static bool8 Phase2_Mugshot_Func2(struct Task *task);
static bool8 Phase2_Mugshot_Func3(struct Task *task);
@@ -302,15 +302,15 @@ static const u16 sGroudon2_Palette[] = INCBIN_U16("graphics/battle_transitions/g
static const u16 sRayquaza_Palette[] = INCBIN_U16("graphics/battle_transitions/rayquaza.gbapal");
static const u32 sRayquaza_Tileset[] = INCBIN_U32("graphics/battle_transitions/rayquaza.4bpp");
static const u32 sRayquaza_Tilemap[] = INCBIN_U32("graphics/battle_transitions/rayquaza.bin");
-static const u16 gUnknown_085C7BE0[] = INCBIN_U16("graphics/battle_transitions/frontier_brain.gbapal");
-static const u32 gUnknown_085C7C00[] = INCBIN_U32("graphics/battle_transitions/frontier_brain.4bpp.lz");
-static const u32 gUnknown_085C828C[] = INCBIN_U32("graphics/battle_transitions/frontier_brain.bin.lz");
-static const u16 gUnknown_085C8578[] = INCBIN_U16("graphics/battle_transitions/frontier_squares_blanktiles.gbapal");
-static const u32 gUnknown_085C8598[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.lz");
-static const u32 gUnknown_085C86F4[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.lz");
-static const u32 gUnknown_085C87F4[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.lz");
-static const u32 gUnknown_085C88A4[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.lz");
-static const u32 gUnknown_085C8928[] = INCBIN_U32("graphics/battle_transitions/frontier_squares.bin");
+static const u16 sFrontierLogo_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_logo.gbapal");
+static const u32 sFrontierLogo_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.4bpp.lz");
+static const u32 sFrontierLogo_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo.bin.lz");
+static const u16 sFrontierSquares_Palette[] = INCBIN_U16("graphics/battle_transitions/frontier_squares_blanktiles.gbapal");
+static const u32 sFrontierSquares_FilledBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_1.4bpp.lz");
+static const u32 sFrontierSquares_EmptyBg_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_2.4bpp.lz");
+static const u32 sFrontierSquares_Shrink1_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_3.4bpp.lz");
+static const u32 sFrontierSquares_Shrink2_Tileset[] = INCBIN_U32("graphics/battle_transitions/frontier_square_4.4bpp.lz");
+static const u32 sFrontierSquares_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_squares.bin");
static const TaskFunc sPhase1_Tasks[B_TRANSITION_COUNT] =
{
@@ -348,19 +348,19 @@ static const TaskFunc sPhase2_Tasks[B_TRANSITION_COUNT] =
[B_TRANSITION_BLACKHOLE1] = Phase2Task_Blackhole1,
[B_TRANSITION_BLACKHOLE2] = Phase2Task_Blackhole2,
[B_TRANSITION_RECTANGULAR_SPIRAL] = Phase2Task_RectangularSpiral,
- [B_TRANSITION_29] = Phase2Task_29,
- [B_TRANSITION_30] = Phase2Task_30,
- [B_TRANSITION_31] = Phase2Task_31,
- [B_TRANSITION_32] = Phase2Task_32,
- [B_TRANSITION_33] = Phase2Task_33,
- [B_TRANSITION_34] = Phase2Task_34,
- [B_TRANSITION_35] = Phase2Task_35,
- [B_TRANSITION_36] = Phase2Task_36,
- [B_TRANSITION_37] = Phase2Task_37,
- [B_TRANSITION_38] = Phase2Task_38,
- [B_TRANSITION_39] = Phase2Task_39,
- [B_TRANSITION_40] = Phase2Task_40,
- [B_TRANSITION_41] = Phase2Task_41,
+ [B_TRANSITION_FRONTIER_LOGO_WIGGLE] = Phase2Task_FrontierLogoWiggle,
+ [B_TRANSITION_FRONTIER_LOGO_WAVE] = Phase2Task_FrontierLogoWave,
+ [B_TRANSITION_FRONTIER_SQUARES] = Phase2Task_FrontierSquares,
+ [B_TRANSITION_FRONTIER_SQUARES_SCROLL] = Phase2Task_FrontierSquaresScroll,
+ [B_TRANSITION_FRONTIER_SQUARES_SPIRAL] = Phase2Task_FrontierSquaresSpiral,
+ [B_TRANSITION_FRONTIER_CIRCLES_MEET] = Phase2Task_FrontierCirclesMeet,
+ [B_TRANSITION_FRONTIER_CIRCLES_CROSS] = Phase2Task_FrontierCirclesCross,
+ [B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL] = Phase2Task_FrontierCirclesAsymmetricSpiral,
+ [B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL] = Phase2Task_FrontierCirclesSymmetricSpiral,
+ [B_TRANSITION_FRONTIER_CIRCLES_MEET_IN_SEQ] = Phase2Task_FrontierCirclesMeetInSeq,
+ [B_TRANSITION_FRONTIER_CIRCLES_CROSS_IN_SEQ] = Phase2Task_FrontierCirclesCrossInSeq,
+ [B_TRANSITION_FRONTIER_CIRCLES_ASYMMETRIC_SPIRAL_IN_SEQ] = Phase2Task_FrontierCirclesAsymmetricSpiralInSeq,
+ [B_TRANSITION_FRONTIER_CIRCLES_SYMMETRIC_SPIRAL_IN_SEQ] = Phase2Task_FrontierCirclesSymmetricSpiralInSeq,
};
static const TransitionStateFunc sMainTransitionPhases[] =
@@ -850,48 +850,48 @@ static const struct SpritePalette sSpritePalette_UnusedTrainer = {sUnusedTrainer
static const u16 sBigPokeball_Tilemap[] = INCBIN_U16("graphics/battle_transitions/big_pokeball_map.bin");
static const u16 sMugshotsTilemap[] = INCBIN_U16("graphics/battle_transitions/elite_four_bg_map.bin");
-static const TransitionStateFunc sPhase2_29_Funcs[] =
+static const TransitionStateFunc sPhase2_FrontierLogoWiggle_Funcs[] =
{
- Phase2_29_Func1,
- Phase2_29_Func2,
+ Phase2_FrontierLogoWiggle_Func1,
+ Phase2_FrontierLogoWiggle_Func2,
Phase2_BigPokeball_Func3,
Phase2_BigPokeball_Func4,
Phase2_BigPokeball_Func5,
Phase2_BigPokeball_Func6
};
-static const TransitionStateFunc sPhase2_30_Funcs[] =
+static const TransitionStateFunc sPhase2_FrontierLogoWave_Funcs[] =
{
- Phase2_30_Func1,
- Phase2_30_Func2,
- Phase2_30_Func3,
- Phase2_30_Func4
+ Phase2_FrontierLogoWave_Func1,
+ Phase2_FrontierLogoWave_Func2,
+ Phase2_FrontierLogoWave_Func3,
+ Phase2_FrontierLogoWave_Func4
};
-static const TransitionStateFunc sPhase2_31_Funcs[] =
+static const TransitionStateFunc sPhase2_FrontierSquares_Funcs[] =
{
- Phase2_31_Func1,
- Phase2_31_Func2,
- Phase2_31_Func3,
- Phase2_31_33_Func5
+ Phase2_FrontierSquares_Func1,
+ Phase2_FrontierSquares_Func2,
+ Phase2_FrontierSquares_Func3,
+ Phase2_FrontierSquares_End
};
-static const TransitionStateFunc sPhase2_33_Funcs[] =
+static const TransitionStateFunc sPhase2_FrontierSquaresSpiral_Funcs[] =
{
- Phase2_33_Func1,
- Phase2_33_Func2,
- Phase2_33_Func3,
- Phase2_33_Func4,
- Phase2_31_33_Func5
+ Phase2_FrontierSquaresSpiral_Func1,
+ Phase2_FrontierSquaresSpiral_Func2,
+ Phase2_FrontierSquaresSpiral_Func3,
+ Phase2_FrontierSquaresSpiral_Func4,
+ Phase2_FrontierSquares_End
};
-static const TransitionStateFunc sPhase2_32_Funcs[] =
+static const TransitionStateFunc sPhase2_FrontierSquaresScroll_Funcs[] =
{
- Phase2_32_Func1,
- Phase2_32_Func2,
- Phase2_32_Func3,
- Phase2_32_Func4,
- Phase2_32_Func5
+ Phase2_FrontierSquaresScroll_Func1,
+ Phase2_FrontierSquaresScroll_Func2,
+ Phase2_FrontierSquaresScroll_Func3,
+ Phase2_FrontierSquaresScroll_Func4,
+ Phase2_FrontierSquaresScroll_Func5
};
static const u8 gUnknown_085C9A30[] = {0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x1b, 0x14, 0x0d, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x07, 0x0e, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x13, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x10, 0x11, 0x12};
@@ -3850,43 +3850,43 @@ static bool8 sub_814A228(s16 *data, bool8 a1, bool8 a2)
#define tData6 data[6]
#define tData7 data[7]
-static bool8 Phase2_29_Func1(struct Task *task)
+static bool8 Phase2_FrontierLogoWiggle_Func1(struct Task *task)
{
u16 *tilemap, *tileset;
sub_814669C(task);
GetBg0TilesDst(&tilemap, &tileset);
CpuFill16(0, tilemap, 0x800);
- LZ77UnCompVram(gUnknown_085C7C00, tileset);
- LoadPalette(gUnknown_085C7BE0, 0xF0, 0x20);
+ LZ77UnCompVram(sFrontierLogo_Tileset, tileset);
+ LoadPalette(sFrontierLogo_Palette, 0xF0, 0x20);
task->tState++;
return FALSE;
}
-static bool8 Phase2_29_Func2(struct Task *task)
+static bool8 Phase2_FrontierLogoWiggle_Func2(struct Task *task)
{
u16 *tilemap, *tileset;
GetBg0TilesDst(&tilemap, &tileset);
- LZ77UnCompVram(gUnknown_085C828C, tilemap);
+ LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap);
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 0x84, task->tData5, 160);
task->tState++;
return TRUE;
}
-static void Phase2Task_29(u8 taskId)
+static void Phase2Task_FrontierLogoWiggle(u8 taskId)
{
- while (sPhase2_29_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+ while (sPhase2_FrontierLogoWiggle_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
}
-static void Phase2Task_30(u8 taskId)
+static void Phase2Task_FrontierLogoWave(u8 taskId)
{
- while (sPhase2_30_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+ while (sPhase2_FrontierLogoWave_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
}
-static bool8 Phase2_30_Func1(struct Task *task)
+static bool8 Phase2_FrontierLogoWave_Func1(struct Task *task)
{
u16 *tilemap, *tileset;
@@ -3904,26 +3904,26 @@ static bool8 Phase2_30_Func1(struct Task *task)
REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
GetBg0TilesDst(&tilemap, &tileset);
CpuFill16(0, tilemap, 0x800);
- LZ77UnCompVram(gUnknown_085C7C00, tileset);
- LoadPalette(gUnknown_085C7BE0, 0xF0, 0x20);
+ LZ77UnCompVram(sFrontierLogo_Tileset, tileset);
+ LoadPalette(sFrontierLogo_Palette, 0xF0, 0x20);
sTransitionStructPtr->field_16 = 0;
task->tState++;
return FALSE;
}
-static bool8 Phase2_30_Func2(struct Task *task)
+static bool8 Phase2_FrontierLogoWave_Func2(struct Task *task)
{
u16 *tilemap, *tileset;
GetBg0TilesDst(&tilemap, &tileset);
- LZ77UnCompVram(gUnknown_085C828C, tilemap);
+ LZ77UnCompVram(sFrontierLogo_Tilemap, tilemap);
task->tState++;
return TRUE;
}
-static bool8 Phase2_30_Func3(struct Task *task)
+static bool8 Phase2_FrontierLogoWave_Func3(struct Task *task)
{
u8 i;
@@ -3940,7 +3940,7 @@ static bool8 Phase2_30_Func3(struct Task *task)
return TRUE;
}
-static bool8 Phase2_30_Func4(struct Task *task)
+static bool8 Phase2_FrontierLogoWave_Func4(struct Task *task)
{
u8 i;
u16 var6, amplitude, var8;
@@ -3985,7 +3985,7 @@ static bool8 Phase2_30_Func4(struct Task *task)
}
if (task->tData4 != 0 && !gPaletteFade.active)
- DestroyTask(FindTaskIdByFunc(Phase2Task_30));
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierLogoWave));
task->tData7 -= 17;
sTransitionStructPtr->VBlank_DMA++;
@@ -4008,33 +4008,33 @@ static void HBlankCB_Phase2_30(void)
REG_BG0VOFS = var;
}
-static void Phase2Task_31(u8 taskId)
+static void Phase2Task_FrontierSquares(u8 taskId)
{
- while (sPhase2_31_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+ while (sPhase2_FrontierSquares_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
}
-static void Phase2Task_33(u8 taskId)
+static void Phase2Task_FrontierSquaresSpiral(u8 taskId)
{
- while (sPhase2_33_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+ while (sPhase2_FrontierSquaresSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
}
-static void Phase2Task_32(u8 taskId)
+static void Phase2Task_FrontierSquaresScroll(u8 taskId)
{
- while (sPhase2_32_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+ while (sPhase2_FrontierSquaresScroll_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
}
-static bool8 Phase2_31_Func1(struct Task *task)
+static bool8 Phase2_FrontierSquares_Func1(struct Task *task)
{
u16 *tilemap, *tileset;
GetBg0TilesDst(&tilemap, &tileset);
- LZ77UnCompVram(gUnknown_085C8598, tileset);
+ LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF);
FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF);
CopyBgTilemapBufferToVram(0);
- LoadPalette(gUnknown_085C8578, 0xF0, 0x20);
+ LoadPalette(sFrontierSquares_Palette, 0xF0, 0x20);
task->tData2 = 1;
task->tData3 = 0;
@@ -4045,9 +4045,9 @@ static bool8 Phase2_31_Func1(struct Task *task)
return FALSE;
}
-static bool8 Phase2_31_Func2(struct Task *task)
+static bool8 Phase2_FrontierSquares_Func2(struct Task *task)
{
- CopyRectToBgTilemapBufferRect(0, gUnknown_085C8928, 0, 0, 4, 4, task->tData2, task->tData3, 4, 4, 0xF, 0, 0);
+ CopyRectToBgTilemapBufferRect(0, sFrontierSquares_Tilemap, 0, 0, 4, 4, task->tData2, task->tData3, 4, 4, 0xF, 0, 0);
CopyBgTilemapBufferToVram(0);
task->tData2 += 4;
@@ -4063,7 +4063,7 @@ static bool8 Phase2_31_Func2(struct Task *task)
return FALSE;
}
-static bool8 Phase2_31_Func3(struct Task *task)
+static bool8 Phase2_FrontierSquares_Func3(struct Task *task)
{
u8 i;
u16 *tilemap, *tileset;
@@ -4082,13 +4082,13 @@ static bool8 Phase2_31_Func3(struct Task *task)
break;
case 1:
BlendPalettes(0xFFFF7FFF, 0x10, 0);
- LZ77UnCompVram(gUnknown_085C86F4, tileset);
+ LZ77UnCompVram(sFrontierSquares_EmptyBg_Tileset, tileset);
break;
case 2:
- LZ77UnCompVram(gUnknown_085C87F4, tileset);
+ LZ77UnCompVram(sFrontierSquares_Shrink1_Tileset, tileset);
break;
case 3:
- LZ77UnCompVram(gUnknown_085C88A4, tileset);
+ LZ77UnCompVram(sFrontierSquares_Shrink2_Tileset, tileset);
break;
default:
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
@@ -4104,19 +4104,19 @@ static bool8 Phase2_31_Func3(struct Task *task)
return FALSE;
}
-static bool8 Phase2_33_Func1(struct Task *task)
+static bool8 Phase2_FrontierSquaresSpiral_Func1(struct Task *task)
{
u16 *tilemap, *tileset;
GetBg0TilesDst(&tilemap, &tileset);
- LZ77UnCompVram(gUnknown_085C8598, tileset);
+ LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
FillBgTilemapBufferRect(0, 1, 0, 0, 1, 0x20, 0xF);
FillBgTilemapBufferRect(0, 1, 0x1D, 0, 1, 0x20, 0xF);
CopyBgTilemapBufferToVram(0);
- LoadPalette(gUnknown_085C8578, 0xE0, 0x20);
- LoadPalette(gUnknown_085C8578, 0xF0, 0x20);
+ LoadPalette(sFrontierSquares_Palette, 0xE0, 0x20);
+ LoadPalette(sFrontierSquares_Palette, 0xF0, 0x20);
BlendPalette(0xE0, 0x10, 8, 0);
task->tData2 = 34;
@@ -4126,12 +4126,12 @@ static bool8 Phase2_33_Func1(struct Task *task)
return FALSE;
}
-static bool8 Phase2_33_Func2(struct Task *task)
+static bool8 Phase2_FrontierSquaresSpiral_Func2(struct Task *task)
{
u8 var = gUnknown_085C9A30[task->tData2];
u8 varMod = var % 7;
u8 varDiv = var / 7;
- CopyRectToBgTilemapBufferRect(0, &gUnknown_085C8928, 0, 0, 4, 4, 4 * varMod + 1, 4 * varDiv, 4, 4, 0xF, 0, 0);
+ CopyRectToBgTilemapBufferRect(0, &sFrontierSquares_Tilemap, 0, 0, 4, 4, 4 * varMod + 1, 4 * varDiv, 4, 4, 0xF, 0, 0);
CopyBgTilemapBufferToVram(0);
if (--task->tData2 < 0)
@@ -4139,7 +4139,7 @@ static bool8 Phase2_33_Func2(struct Task *task)
return FALSE;
}
-static bool8 Phase2_33_Func3(struct Task *task)
+static bool8 Phase2_FrontierSquaresSpiral_Func3(struct Task *task)
{
BlendPalette(0xE0, 0x10, 3, 0);
BlendPalettes(0xFFFF3FFF, 0x10, 0);
@@ -4151,13 +4151,13 @@ static bool8 Phase2_33_Func3(struct Task *task)
return FALSE;
}
-static bool8 Phase2_33_Func4(struct Task *task)
+static bool8 Phase2_FrontierSquaresSpiral_Func4(struct Task *task)
{
if ((task->tData3 ^= 1))
{
CopyRectToBgTilemapBufferRect(
0,
- gUnknown_085C8928,
+ sFrontierSquares_Tilemap,
0,
0,
4,
@@ -4194,7 +4194,7 @@ static bool8 Phase2_33_Func4(struct Task *task)
return FALSE;
}
-static bool8 Phase2_31_33_Func5(struct Task *task)
+static bool8 Phase2_FrontierSquares_End(struct Task *task)
{
FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20);
CopyBgTilemapBufferToVram(0);
@@ -4219,16 +4219,16 @@ static void sub_814ABE4(u8 taskId)
}
}
-static bool8 Phase2_32_Func1(struct Task *task)
+static bool8 Phase2_FrontierSquaresScroll_Func1(struct Task *task)
{
u8 taskId = 0;
u16 *tilemap, *tileset;
GetBg0TilesDst(&tilemap, &tileset);
- LZ77UnCompVram(gUnknown_085C8598, tileset);
+ LZ77UnCompVram(sFrontierSquares_FilledBg_Tileset, tileset);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
CopyBgTilemapBufferToVram(0);
- LoadPalette(gUnknown_085C8578, 0xF0, 0x20);
+ LoadPalette(sFrontierSquares_Palette, 0xF0, 0x20);
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
@@ -4261,7 +4261,7 @@ static bool8 Phase2_32_Func1(struct Task *task)
return FALSE;
}
-static bool8 Phase2_32_Func2(struct Task *task)
+static bool8 Phase2_FrontierSquaresScroll_Func2(struct Task *task)
{
u8 var = gUnknown_085C9A53[task->tData2];
u8 varDiv = var / 8;
@@ -4269,7 +4269,7 @@ static bool8 Phase2_32_Func2(struct Task *task)
CopyRectToBgTilemapBufferRect(
0,
- &gUnknown_085C8928,
+ &sFrontierSquares_Tilemap,
0,
0,
4,
@@ -4288,7 +4288,7 @@ static bool8 Phase2_32_Func2(struct Task *task)
return 0;
}
-static bool8 Phase2_32_Func3(struct Task *task)
+static bool8 Phase2_FrontierSquaresScroll_Func3(struct Task *task)
{
BlendPalettes(0xFFFF7FFF, 0x10, 0);
@@ -4298,7 +4298,7 @@ static bool8 Phase2_32_Func3(struct Task *task)
return FALSE;
}
-static bool8 Phase2_32_Func4(struct Task *task)
+static bool8 Phase2_FrontierSquaresScroll_Func4(struct Task *task)
{
u8 var = gUnknown_085C9A53[task->tData2];
u8 varDiv = var / 8;
@@ -4320,7 +4320,7 @@ static bool8 Phase2_32_Func4(struct Task *task)
#undef tSub32_Y_delta
#undef tSub32_Bool
-static bool8 Phase2_32_Func5(struct Task *task)
+static bool8 Phase2_FrontierSquaresScroll_Func5(struct Task *task)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
diff --git a/src/battle_transition_frontier.c b/src/battle_transition_frontier.c
new file mode 100644
index 000000000..931de5e44
--- /dev/null
+++ b/src/battle_transition_frontier.c
@@ -0,0 +1,650 @@
+#include "global.h"
+#include "sprite.h"
+#include "decompress.h"
+#include "battle_transition_frontier.h"
+#include "battle_transition.h"
+#include "task.h"
+#include "palette.h"
+#include "trig.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "constants/rgb.h"
+
+/*
+ There are 3 "categories" of Battle Frontier transition
+ 1. The full logo is used (B_TRANSITION_FRONTIER_LOGO_*)
+ 2. Small squares with the logo on it are used (B_TRANSITION_FRONTIER_SQUARES_*)
+ 3. The balls that make up the logo come together to form the full logo (B_TRANSITION_FRONTIER_CIRCLES_*)
+
+ This file handles category 3. Functions for the other two are handled in battle_transition.c
+*/
+
+typedef bool8 (*TransitionStateFunc)(struct Task *task);
+
+// this file's functions
+static void SpriteCB_LogoCircleSlide(struct Sprite *sprite);
+static void SpriteCB_LogoCircleSpiral(struct Sprite *sprite);
+static bool8 WaitForLogoCirclesAnim(struct Task *task);
+static bool8 FadeInCenterLogoCircle(struct Task *task);
+static bool8 Circles_Init(struct Task *task);
+static bool8 CirclesMeet_CreateSprites(struct Task *task);
+static bool8 CirclesMeet_End(struct Task *task);
+static bool8 CirclesCross_CreateSprites(struct Task *task);
+static bool8 CirclesCross_End(struct Task *task);
+static bool8 CirclesAsymmetricSpiral_CreateSprites(struct Task *task);
+static bool8 CirclesAsymmetricSpiral_End(struct Task *task);
+static bool8 CirclesSymmetricSpiral_CreateSprites(struct Task *task);
+static bool8 CirclesSymmetricSpiral_End(struct Task *task);
+static bool8 CirclesMeetInSeq_CreateSprites(struct Task *task);
+static bool8 CirclesMeetInSeq_End(struct Task *task);
+static bool8 CirclesCrossInSeq_CreateSprites(struct Task *task);
+static bool8 CirclesCrossInSeq_End(struct Task *task);
+static bool8 CirclesAsymmetricSpiralInSeq_CreateSprites(struct Task *task);
+static bool8 CirclesAsymmetricSpiralInSeq_End(struct Task *task);
+static bool8 CirclesSymmetricSpiralInSeq_CreateSprites(struct Task *task);
+static bool8 CirclesSymmetricSpiralInSeq_End(struct Task *task);
+
+#define PALTAG_LOGO_CIRCLES 0x2E90
+
+// const rom data
+static const u32 sLogoCenter_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.4bpp.lz");
+static const u32 sLogoCenter_Tilemap[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_center.bin");
+static const u32 sLogoCircles_Gfx[] = INCBIN_U32("graphics/battle_transitions/frontier_logo_circles.4bpp.lz");
+static const u16 sLogo_Pal[] = INCBIN_U16("graphics/battle_transitions/frontier_logo_circles.gbapal");
+
+// Unused Empty data.
+static const u8 sFiller[0x1C0] = {0};
+
+static const struct OamData sOamData_LogoCircles =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct CompressedSpriteSheet sSpriteSheet_LogoCircles =
+{
+ .data = sLogoCircles_Gfx,
+ .size = 0x1800,
+ .tag = PALTAG_LOGO_CIRCLES
+};
+
+static const struct SpritePalette sSpritePalette_LogoCircles =
+{
+ .data = sLogo_Pal,
+ .tag = PALTAG_LOGO_CIRCLES
+};
+
+static const union AnimCmd sAnim_LogoCircle_Top[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnim_LogoCircle_Left[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sAnim_LogoCircle_Right[] =
+{
+ ANIMCMD_FRAME(128, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sAnimTable_LogoCircles[] =
+{
+ sAnim_LogoCircle_Top,
+ sAnim_LogoCircle_Left,
+ sAnim_LogoCircle_Right
+};
+
+static const struct SpriteTemplate sSpriteTemplate_LogoCircles =
+{
+ .tileTag = PALTAG_LOGO_CIRCLES,
+ .paletteTag = PALTAG_LOGO_CIRCLES,
+ .oam = &sOamData_LogoCircles,
+ .anims = sAnimTable_LogoCircles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesMeet_Funcs[] =
+{
+ Circles_Init,
+ CirclesMeet_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesMeet_End
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesCross_Funcs[] =
+{
+ Circles_Init,
+ CirclesCross_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesCross_End
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesAsymmetricSpiral_Funcs[] =
+{
+ Circles_Init,
+ CirclesAsymmetricSpiral_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesAsymmetricSpiral_End
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesSymmetricSpiral_Funcs[] =
+{
+ Circles_Init,
+ CirclesSymmetricSpiral_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesSymmetricSpiral_End
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesMeetInSeq_Funcs[] =
+{
+ Circles_Init,
+ CirclesMeetInSeq_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesMeetInSeq_End
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesCrossInSeq_Funcs[] =
+{
+ Circles_Init,
+ CirclesCrossInSeq_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesCrossInSeq_End
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesAsymmetricSpiralInSeq_Funcs[] =
+{
+ Circles_Init,
+ CirclesAsymmetricSpiralInSeq_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesAsymmetricSpiralInSeq_End
+};
+
+static const TransitionStateFunc sPhase2_FrontierCirclesSymmetricSpiralInSeq_Funcs[] =
+{
+ Circles_Init,
+ CirclesSymmetricSpiralInSeq_CreateSprites,
+ WaitForLogoCirclesAnim,
+ FadeInCenterLogoCircle,
+ CirclesSymmetricSpiralInSeq_End
+};
+
+// code
+static void LoadLogoGfx(void)
+{
+ u16 *dst1, *dst2;
+
+ GetBg0TilesDst(&dst1, &dst2);
+ LZ77UnCompVram(sLogoCenter_Gfx, dst2);
+ LZ77UnCompVram(sLogoCenter_Tilemap, dst1);
+ LoadPalette(sLogo_Pal, 0xF0, 0x20);
+ LoadCompressedSpriteSheet(&sSpriteSheet_LogoCircles);
+ LoadSpritePalette(&sSpritePalette_LogoCircles);
+}
+
+static u8 CreateSlidingLogoCircleSprite(s16 x, s16 y, u8 arg2, u8 arg3, s8 arg4, s8 arg5, u8 spriteAnimNum)
+{
+ u8 spriteId = CreateSprite(&sSpriteTemplate_LogoCircles, x, y, 0);
+
+ switch (spriteAnimNum)
+ {
+ case 0:
+ gSprites[spriteId].data[0] = 120;
+ gSprites[spriteId].data[1] = 45;
+ break;
+ case 1:
+ gSprites[spriteId].data[0] = 89;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ case 2:
+ gSprites[spriteId].data[0] = 151;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ }
+
+ gSprites[spriteId].data[2] = arg4;
+ gSprites[spriteId].data[3] = arg5;
+ gSprites[spriteId].data[6] = arg2;
+ gSprites[spriteId].data[7] = arg3;
+ gSprites[spriteId].data[4] = 0;
+ gSprites[spriteId].data[5] = 0;
+
+ StartSpriteAnim(&gSprites[spriteId], spriteAnimNum);
+ gSprites[spriteId].callback = SpriteCB_LogoCircleSlide;
+
+ return spriteId;
+}
+
+static void SpriteCB_LogoCircleSlide(struct Sprite *sprite)
+{
+ s16 *data = sprite->data;
+
+ if (sprite->pos1.x == data[0] && sprite->pos1.y == data[1])
+ {
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else
+ {
+ if (data[4] == data[6])
+ {
+ sprite->pos1.x += data[2];
+ data[4] = 0;
+ }
+ else
+ {
+ data[4]++;
+ }
+
+ if (data[5] == data[7])
+ {
+ sprite->pos1.y += data[3];
+ data[5] = 0;
+ }
+ else
+ {
+ data[5]++;
+ }
+ }
+}
+
+static u8 CreateSpiralingLogoCircleSprite(s16 x, s16 y, s16 arg2, s16 arg3, s16 arg4, s16 arg5, s16 arg6, u8 spriteAnimNum)
+{
+ u8 spriteId = CreateSprite(&sSpriteTemplate_LogoCircles, x, y, 0);
+
+ switch (spriteAnimNum)
+ {
+ case 0:
+ gSprites[spriteId].data[0] = 120;
+ gSprites[spriteId].data[1] = 45;
+ break;
+ case 1:
+ gSprites[spriteId].data[0] = 89;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ case 2:
+ gSprites[spriteId].data[0] = 151;
+ gSprites[spriteId].data[1] = 97;
+ break;
+ }
+
+ gSprites[spriteId].data[2] = arg2;
+ gSprites[spriteId].data[3] = arg3;
+ gSprites[spriteId].data[4] = arg4;
+ gSprites[spriteId].data[5] = arg5;
+ gSprites[spriteId].data[6] = arg6;
+
+ StartSpriteAnim(&gSprites[spriteId], spriteAnimNum);
+ gSprites[spriteId].callback = SpriteCB_LogoCircleSpiral;
+
+ return spriteId;
+}
+
+static void SpriteCB_LogoCircleSpiral(struct Sprite *sprite)
+{
+ sprite->pos2.x = (Sin2(sprite->data[2]) * sprite->data[4]) >> 12; // div by 4096
+ sprite->pos2.y = (Cos2(sprite->data[2]) * sprite->data[4]) >> 12; // div by 4096
+
+ sprite->data[2] = (sprite->data[2] + sprite->data[3]) % 360;
+
+ if (sprite->data[4] != sprite->data[5])
+ sprite->data[4] += sprite->data[6];
+ else
+ sprite->callback = SpriteCallbackDummy;
+}
+
+#define tState data[0]
+
+static void DestroyLogoCirclesGfx(struct Task *task)
+{
+ FreeSpriteTilesByTag(PALTAG_LOGO_CIRCLES);
+ FreeSpritePaletteByTag(PALTAG_LOGO_CIRCLES);
+
+ DestroySprite(&gSprites[task->data[4]]);
+ DestroySprite(&gSprites[task->data[5]]);
+ DestroySprite(&gSprites[task->data[6]]);
+}
+
+static bool8 IsLogoCirclesAnimFinished(struct Task *task)
+{
+ if (gSprites[task->data[4]].callback == SpriteCallbackDummy
+ && gSprites[task->data[5]].callback == SpriteCallbackDummy
+ && gSprites[task->data[6]].callback == SpriteCallbackDummy)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 Circles_Init(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
+
+ task->data[1]++;
+ return FALSE;
+ }
+ else
+ {
+ LoadLogoGfx();
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgY(0, 0x500, 2);
+
+ task->data[1] = 0;
+ task->tState++;
+ return TRUE;
+ }
+}
+
+static bool8 FadeInCenterLogoCircle(struct Task *task)
+{
+ if (task->data[2] == 0)
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
+
+ if (task->data[2] == 16)
+ {
+ if (task->data[3] == 31)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, RGB_BLACK);
+ task->tState++;
+ }
+ else
+ {
+ task->data[3]++;
+ }
+ }
+ else
+ {
+ u16 blnd;
+
+ task->data[2]++;
+ blnd = task->data[2];
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(blnd, 16 - blnd));
+ }
+
+ return FALSE;
+}
+
+static bool8 WaitForLogoCirclesAnim(struct Task *task)
+{
+ if (IsLogoCirclesAnimFinished(task) == TRUE)
+ task->tState++;
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesMeet(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesMeet_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesMeet_CreateSprites(struct Task *task)
+{
+ task->data[4] = CreateSlidingLogoCircleSprite(120, -51, 0, 0, 0, 2, 0);
+ task->data[5] = CreateSlidingLogoCircleSprite(-7, 193, 0, 0, 2, -2, 1);
+ task->data[6] = CreateSlidingLogoCircleSprite(247, 193, 0, 0, -2, -2, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 CirclesMeet_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesMeet));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesCross(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesCross_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesCross_CreateSprites(struct Task *task)
+{
+ task->data[4] = CreateSlidingLogoCircleSprite(120, 197, 0, 0, 0, -4, 0);
+ task->data[5] = CreateSlidingLogoCircleSprite(241, 59, 0, 1, -4, 2, 1);
+ task->data[6] = CreateSlidingLogoCircleSprite(-1, 59, 0, 1, 4, 2, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 CirclesCross_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesCross));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesAsymmetricSpiral(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesAsymmetricSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesAsymmetricSpiral_CreateSprites(struct Task *task)
+{
+ task->data[4] = CreateSpiralingLogoCircleSprite(120, 45, 12, 4, 128, 0, -4, 0);
+ task->data[5] = CreateSpiralingLogoCircleSprite(89, 97, 252, 4, 128, 0, -4, 1);
+ task->data[6] = CreateSpiralingLogoCircleSprite(151, 97, 132, 4, 128, 0, -4, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 CirclesAsymmetricSpiral_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesAsymmetricSpiral));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesSymmetricSpiral(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesSymmetricSpiral_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesSymmetricSpiral_CreateSprites(struct Task *task)
+{
+ task->data[4] = CreateSpiralingLogoCircleSprite(120, 80, 284, 8, 131, 35, -3, 0);
+ task->data[5] = CreateSpiralingLogoCircleSprite(120, 80, 44, 8, 131, 35, -3, 1);
+ task->data[6] = CreateSpiralingLogoCircleSprite(121, 80, 164, 8, 131, 35, -3, 2);
+
+ task->tState++;
+ return FALSE;
+}
+
+static bool8 CirclesSymmetricSpiral_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesSymmetricSpiral));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesMeetInSeq(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesMeetInSeq_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesMeetInSeq_CreateSprites(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = CreateSlidingLogoCircleSprite(120, -51, 0, 0, 0, 4, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = CreateSlidingLogoCircleSprite(-7, 193, 0, 0, 4, -4, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = CreateSlidingLogoCircleSprite(247, 193, 0, 0, -4, -4, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 CirclesMeetInSeq_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesMeetInSeq));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesCrossInSeq(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesCrossInSeq_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesCrossInSeq_CreateSprites(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = CreateSlidingLogoCircleSprite(120, 197, 0, 0, 0, -8, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = CreateSlidingLogoCircleSprite(241, 78, 0, 0, -8, 1, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = CreateSlidingLogoCircleSprite(-1, 78, 0, 0, 8, 1, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 CirclesCrossInSeq_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesCrossInSeq));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesAsymmetricSpiralInSeq(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesAsymmetricSpiralInSeq_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesAsymmetricSpiralInSeq_CreateSprites(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = CreateSpiralingLogoCircleSprite(120, 45, 12, 4, 128, 0, -4, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = CreateSpiralingLogoCircleSprite(89, 97, 252, 4, 128, 0, -4, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = CreateSpiralingLogoCircleSprite(151, 97, 132, 4, 128, 0, -4, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 CirclesAsymmetricSpiralInSeq_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesAsymmetricSpiralInSeq));
+ }
+
+ return FALSE;
+}
+
+void Phase2Task_FrontierCirclesSymmetricSpiralInSeq(u8 taskId)
+{
+ while (sPhase2_FrontierCirclesSymmetricSpiralInSeq_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
+}
+
+static bool8 CirclesSymmetricSpiralInSeq_CreateSprites(struct Task *task)
+{
+ if (task->data[1] == 0)
+ {
+ task->data[4] = CreateSpiralingLogoCircleSprite(120, 80, 284, 8, 131, 35, -3, 0);
+ }
+ else if (task->data[1] == 16)
+ {
+ task->data[5] = CreateSpiralingLogoCircleSprite(120, 80, 44, 8, 131, 35, -3, 1);
+ }
+ else if (task->data[1] == 32)
+ {
+ task->data[6] = CreateSpiralingLogoCircleSprite(121, 80, 164, 8, 131, 35, -3, 2);
+ task->tState++;
+ }
+
+ task->data[1]++;
+ return FALSE;
+}
+
+static bool8 CirclesSymmetricSpiralInSeq_End(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyLogoCirclesGfx(task);
+ DestroyTask(FindTaskIdByFunc(Phase2Task_FrontierCirclesSymmetricSpiralInSeq));
+ }
+
+ return FALSE;
+}
diff --git a/src/battle_util.c b/src/battle_util.c
index da3d50648..9cc2252b6 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -864,9 +864,9 @@ u8 DoBattlerEndTurnEffects(void)
gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- if ((gBattleMons[gActiveBattler].status1 & 0xF00) != 0xF00) // not 16 turns
- gBattleMons[gActiveBattler].status1 += 0x100;
- gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & 0xF00) >> 8;
+ if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns
+ gBattleMons[gActiveBattler].status1 += STATUS1_TOXIC_TURN(1);
+ gBattleMoveDamage *= (gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_COUNTER) >> 8;
BattleScriptExecute(BattleScript_PoisonTurnDmg);
effect++;
}
@@ -917,7 +917,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_WRAP: // wrap
if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0)
{
- gBattleMons[gActiveBattler].status2 -= 0x2000;
+ gBattleMons[gActiveBattler].status2 -= STATUS2_WRAPPED_TURN(1);
if (gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) // damaged by wrap
{
// This is the only way I could get this array access to match.
@@ -973,7 +973,7 @@ u8 DoBattlerEndTurnEffects(void)
else
{
gBattlerAttacker = gActiveBattler;
- gBattleMons[gActiveBattler].status2 -= 0x10; // uproar timer goes down
+ gBattleMons[gActiveBattler].status2 -= STATUS2_UPROAR_TURN(1);
if (WasUnableToUseMove(gActiveBattler))
{
CancelMultiTurnMoves(gActiveBattler);
@@ -999,7 +999,7 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_THRASH: // thrash
if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)
{
- gBattleMons[gActiveBattler].status2 -= 0x400;
+ gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1);
if (WasUnableToUseMove(gActiveBattler))
CancelMultiTurnMoves(gActiveBattler);
else if (!(gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)
@@ -1062,7 +1062,7 @@ u8 DoBattlerEndTurnEffects(void)
break;
case ENDTURN_LOCK_ON: // lock-on decrement
if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS)
- gStatuses3[gActiveBattler] -= 0x8;
+ gStatuses3[gActiveBattler] -= STATUS3_ALWAYS_HITS_TURN(1);
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_CHARGE: // charge
@@ -1078,13 +1078,13 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_YAWN: // yawn
if (gStatuses3[gActiveBattler] & STATUS3_YAWN)
{
- gStatuses3[gActiveBattler] -= 0x800;
+ gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1);
if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY)
&& gBattleMons[gActiveBattler].ability != ABILITY_VITAL_SPIRIT
&& gBattleMons[gActiveBattler].ability != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler))
{
CancelMultiTurnMoves(gActiveBattler);
- gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2;
+ gBattleMons[gActiveBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns of sleep
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
MarkBattlerForControllerExec(gActiveBattler);
gEffectBattler = gActiveBattler;
@@ -1478,7 +1478,7 @@ u8 AtkCanceller_UnableToUseMove(void)
case CANCELLER_CONFUSED: // confusion
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION)
{
- gBattleMons[gBattlerAttacker].status2--;
+ gBattleMons[gBattlerAttacker].status2 -= STATUS2_CONFUSION_TURN(1);
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION)
{
if (Random() & 1)
@@ -1540,7 +1540,7 @@ u8 AtkCanceller_UnableToUseMove(void)
case CANCELLER_BIDE: // bide
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE)
{
- gBattleMons[gBattlerAttacker].status2 -= 0x100;
+ gBattleMons[gBattlerAttacker].status2 -= STATUS2_BIDE_TURN(1);
if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE)
{
gBattlescriptCurrInstr = BattleScript_BideStoringEnergy;
diff --git a/src/crt0.s b/src/crt0.s
index 3ab711713..cb7c93a6b 100644
--- a/src/crt0.s
+++ b/src/crt0.s
@@ -82,10 +82,10 @@ GPIOPortReadEnable: @ 80000C8
.align 2, 0
.global Init
Init: @ 8000204
- mov r0, PSR_IRQ_MODE
+ mov r0, #PSR_IRQ_MODE
msr cpsr_cf, r0
ldr sp, sp_irq
- mov r0, PSR_SYS_MODE
+ mov r0, #PSR_SYS_MODE
msr cpsr_cf, r0
ldr sp, sp_sys
ldr r1, =INTR_VECTOR
@@ -106,91 +106,91 @@ sp_irq: .word IWRAM_END - 0x60
.align 2, 0
.global IntrMain
IntrMain: @ 8000248
- mov r3, REG_BASE
- add r3, r3, 0x200
- ldr r2, [r3, OFFSET_REG_IE - 0x200]
- ldrh r1, [r3, OFFSET_REG_IME - 0x200]
+ mov r3, #REG_BASE
+ add r3, r3, #OFFSET_REG_IE
+ ldr r2, [r3]
+ ldrh r1, [r3, #OFFSET_REG_IME - 0x200]
mrs r0, spsr
- stmdb sp!, {r0-r3,lr}
- mov r0, 0
- strh r0, [r3, OFFSET_REG_IME - 0x200]
- and r1, r2, r2, lsr 16
- mov r12, 0
- ands r0, r1, INTR_FLAG_VCOUNT
+ stmfd sp!, {r0-r3,lr}
+ mov r0, #0
+ strh r0, [r3, #OFFSET_REG_IME - 0x200]
+ and r1, r2, r2, lsr #16
+ mov r12, #0
+ ands r0, r1, #INTR_FLAG_VCOUNT
bne IntrMain_FoundIntr
add r12, r12, 0x4
mov r0, 0x1
- strh r0, [r3, OFFSET_REG_IME - 0x200]
- ands r0, r1, INTR_FLAG_SERIAL
+ strh r0, [r3, #OFFSET_REG_IME - 0x200]
+ ands r0, r1, #INTR_FLAG_SERIAL
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_TIMER3
+ ands r0, r1, #INTR_FLAG_TIMER3
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_HBLANK
+ ands r0, r1, #INTR_FLAG_HBLANK
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_VBLANK
+ ands r0, r1, #INTR_FLAG_VBLANK
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_TIMER0
+ ands r0, r1, #INTR_FLAG_TIMER0
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_TIMER1
+ ands r0, r1, #INTR_FLAG_TIMER1
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_TIMER2
+ ands r0, r1, #INTR_FLAG_TIMER2
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_DMA0
+ ands r0, r1, #INTR_FLAG_DMA0
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_DMA1
+ ands r0, r1, #INTR_FLAG_DMA1
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_DMA2
+ ands r0, r1, #INTR_FLAG_DMA2
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_DMA3
+ ands r0, r1, #INTR_FLAG_DMA3
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_KEYPAD
+ ands r0, r1, #INTR_FLAG_KEYPAD
bne IntrMain_FoundIntr
add r12, r12, 0x4
- ands r0, r1, INTR_FLAG_GAMEPAK
- strbne r0, [r3, OFFSET_REG_SOUNDCNT_X - 0x200]
+ ands r0, r1, #INTR_FLAG_GAMEPAK
+ strbne r0, [r3, #REG_SOUNDCNT_X - REG_IE]
bne . @ spin
IntrMain_FoundIntr:
- strh r0, [r3, OFFSET_REG_IF - 0x200]
+ strh r0, [r3, #OFFSET_REG_IF - 0x200]
bic r2, r2, r0
ldr r0, =gSTWIStatus
ldr r0, [r0]
ldrb r0, [r0, 0xA]
mov r1, 0x8
- mov r0, r1, lsl r0
- orr r0, r0, INTR_FLAG_GAMEPAK
- orr r1, r0, INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK
+ lsl r0, r1, r0
+ orr r0, r0, #INTR_FLAG_GAMEPAK
+ orr r1, r0, #INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK
and r1, r1, r2
- strh r1, [r3, OFFSET_REG_IE - 0x200]
+ strh r1, [r3, #OFFSET_REG_IE - 0x200]
mrs r3, cpsr
- bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK
- orr r3, r3, PSR_SYS_MODE
+ bic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK
+ orr r3, r3, #PSR_SYS_MODE
msr cpsr_cf, r3
ldr r1, =gIntrTable
add r1, r1, r12
ldr r0, [r1]
- stmdb sp!, {lr}
+ stmfd sp!, {lr}
adr lr, IntrMain_RetAddr
bx r0
IntrMain_RetAddr:
- ldmia sp!, {lr}
+ ldmfd sp!, {lr}
mrs r3, cpsr
- bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK
- orr r3, r3, PSR_I_BIT | PSR_IRQ_MODE
+ bic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK
+ orr r3, r3, #PSR_I_BIT | PSR_IRQ_MODE
msr cpsr_cf, r3
ldmia sp!, {r0-r3,lr}
- strh r2, [r3, OFFSET_REG_IE - 0x200]
- strh r1, [r3, OFFSET_REG_IME - 0x200]
+ strh r2, [r3, #OFFSET_REG_IE - 0x200]
+ strh r1, [r3, #OFFSET_REG_IME - 0x200]
msr spsr_cf, r0
bx lr
diff --git a/src/data/text/nature_names.h b/src/data/text/nature_names.h
index d0d217d9b..601898445 100644
--- a/src/data/text/nature_names.h
+++ b/src/data/text/nature_names.h
@@ -24,7 +24,7 @@ static const u8 sSassyNatureName[] = _("SASSY");
static const u8 sCarefulNatureName[] = _("CAREFUL");
static const u8 sQuirkyNatureName[] = _("QUIRKY");
-const u8 *const gNatureNamePointers[] =
+const u8 *const gNatureNamePointers[NUM_NATURES] =
{
[NATURE_HARDY] = sHardyNatureName,
[NATURE_LONELY] = sLonelyNatureName,
diff --git a/src/field_specials.c b/src/field_specials.c
index f9b8a7bd0..98643b26e 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -2854,7 +2854,7 @@ void SetBattleTowerLinkPlayerGfx(void)
void ShowNatureGirlMessage(void)
{
- static const u8 *const sNatureGirlMessages[] = {
+ static const u8 *const sNatureGirlMessages[NUM_NATURES] = {
[NATURE_HARDY] = BattleFrontier_Lounge5_Text_NatureGirlHardy,
[NATURE_LONELY] = BattleFrontier_Lounge5_Text_NatureGirlLonely,
[NATURE_BRAVE] = BattleFrontier_Lounge5_Text_NatureGirlBrave,
@@ -3687,7 +3687,7 @@ void Unused_SetWeatherSunny(void)
SetCurrentAndNextWeather(WEATHER_SUNNY);
}
-// Always returns 1
+// All mart employees have a local id of 1, so function always returns 1
u32 GetMartEmployeeObjectEventId(void)
{
static const u8 sPokeMarts[][3] =
diff --git a/src/libgcnmultiboot.s b/src/libgcnmultiboot.s
index 0e418e51f..dbf70ccf8 100644
--- a/src/libgcnmultiboot.s
+++ b/src/libgcnmultiboot.s
@@ -22,7 +22,7 @@ GameCubeMultiBoot_Hash: @ 82DED70
movs r2, 0x20
GameCubeMultiBoot_Hash_Loop:
- lsrs r3, 1
+ lsrs r3, #1
bcc GameCubeMultiBoot_Hash_SkipEor
eors r3, r4
@@ -37,8 +37,8 @@ GameCubeMultiBoot_Hash_SkipEor:
thumb_func_start GameCubeMultiBoot_Main
@ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb);
GameCubeMultiBoot_Main: @ 82DED84
- ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
- cmp r1, 0
+ ldr r1, [r0, #GCMB_STRUCT_SERIAL_INTR_HANDLER]
+ cmp r1, #0
beq _082DEDAA
ldrb r1, [r0, 0x1]
adds r1, 0x1
@@ -47,30 +47,30 @@ GameCubeMultiBoot_Main: @ 82DED84
cmp r1, 0x2
beq _082DEDF4
ldr r3, pool_InterruptRegs
- ldrh r2, [r3, OFFSET_REG_IME - 0x200]
+ ldrh r2, [r3, #OFFSET_REG_IME - 0x200]
movs r1, 0
- strh r1, [r3, OFFSET_REG_IME - 0x200]
+ strh r1, [r3, #OFFSET_REG_IME - 0x200]
ldrb r1, [r0]
cmp r1, 0xA
bgt _082DEDA8
adds r1, 0x1
strb r1, [r0]
_082DEDA8:
- strh r2, [r3, OFFSET_REG_IME - 0x200]
+ strh r2, [r3, #OFFSET_REG_IME - 0x200]
_082DEDAA:
bcs GameCubeMultiBoot_Init
ldrb r1, [r0, 0x2]
cmp r1, 0
bne _082DEDF6
- ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
- ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ ldr r1, [r0, #GCMB_STRUCT_CUR_DEST_PTR]
+ ldr r2, [r0, #GCMB_STRUCT_BASE_DEST_PTR]
subs r1, r2
beq _082DEE76
cmp r1, 0xA0
bcc _082DEE76
push {r4-r6}
movs r1, 0x98
- adds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET
+ adds r2, #ROM_HEADER_NINTENDO_LOGO_OFFSET
ldr r4, pool_NintendoLogo
_082DEDC6:
ldm r2!, {r5}
@@ -82,8 +82,8 @@ _082DEDC6:
ldm r2!, {r5}
ldm r4!, {r6}
eors r5, r6
- lsrs r5, 8
- str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ lsrs r5, #8
+ str r2, [r0, #GCMB_STRUCT_BASE_DEST_PTR]
_082DEDDC:
pop {r4-r6}
bne GameCubeMultiBoot_Init
@@ -100,11 +100,11 @@ _082DEDDC:
_082DEDF4:
bx lr
_082DEDF6:
- ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ ldr r1, [r0, #GCMB_STRUCT_CUR_DEST_PTR]
mov r12, r1
ldr r3, [r0, 0x18]
push {r4-r7}
- ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ ldr r4, [r0, #GCMB_STRUCT_BASE_DEST_PTR]
ldr r5, pool_Kawa
ldr r6, [r0, 0x14]
ldr r7, pool_HashVal
@@ -118,7 +118,7 @@ _082DEE06:
eors r3, r1
movs r2, 0x20
_082DEE16:
- lsrs r3, 1
+ lsrs r3, #1
bcc _082DEE1C
eors r3, r7
_082DEE1C:
@@ -128,22 +128,22 @@ _082DEE1C:
adds r6, 0x1
b _082DEE06
_082DEE26:
- str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ str r4, [r0, #GCMB_STRUCT_BASE_DEST_PTR]
str r6, [r0, 0x14]
pop {r4-r7}
str r3, [r0, 0x18]
ldrh r1, [r0, 0x12]
- cmp r1, 0
+ cmp r1, #0
bne _082DEE76
- ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
- ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ ldr r1, [r0, #GCMB_STRUCT_CUR_DEST_PTR]
+ ldr r2, [r0, #GCMB_STRUCT_BASE_DEST_PTR]
cmp r1, r2
bne _082DEE76
ldr r1, [r0, 0xC]
- cmp r1, 0
+ cmp r1, #0
beq _082DEE60
ldrh r1, [r0, 0x10]
- cmp r1, 0
+ cmp r1, #0
beq _082DEDF4
mov r12, lr
movs r1, 0xBB
@@ -159,11 +159,11 @@ _082DEE26:
_082DEE60:
mov r12, lr
ldrb r1, [r0, 0x3]
- lsls r1, 24
+ lsls r1, #24
subs r1, 0x1
str r1, [r0, 0xC]
bl GameCubeMultiBoot_Hash
- lsls r3, 8
+ lsls r3, #8
adds r3, 0xFF
str r3, [r0, 0x1C]
bx r12
@@ -186,8 +186,8 @@ GameCubeMultiBoot_ExecuteProgram: @ 82DEE84
cmp r1, 0x2
bne GameCubeMultiBoot_ExecuteProgram_Fail
ldr r3, pool_InterruptRegs
- movs r1, 0
- strh r1, [r3, OFFSET_REG_IME - 0x200]
+ movs r1, #0
+ strh r1, [r3, #OFFSET_REG_IME - 0x200]
ldr r1, pool_MultiBootLoadAddr
adds r1, 0xC0
bx r1
@@ -201,25 +201,25 @@ GameCubeMultiBoot_Init: @ 82DEE98
ldr r3, pool_InterruptRegs
@ Save IME register.
- ldrh r2, [r3, OFFSET_REG_IME - 0x200]
+ ldrh r2, [r3, #OFFSET_REG_IME - 0x200]
@ Disable interrupts.
movs r1, 0
- strh r1, [r3, OFFSET_REG_IME - 0x200]
+ strh r1, [r3, #OFFSET_REG_IME - 0x200]
@ Set the handler to the "Stop" routine.
@ Unless the first command that is received is a device reset command, the
@ "Stop" routine will be executed and no further commands will be processed.
adr r3, GcMbIntrHandler_Stop
- str r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
+ str r3, [r0, #GCMB_STRUCT_SERIAL_INTR_HANDLER]
ldrb r3, [r0, 0x3]
push {r3}
ldrb r3, [r0, 0x1]
push {r0,r3}
- adds r3, r0, 0
- adds r3, GCMB_STRUCT_BASE_DEST_PTR
+ adds r3, r0, #0
+ adds r3, #GCMB_STRUCT_BASE_DEST_PTR
@ clear all but the last 3 fields of the struct
GameCubeMultiBoot_Init_ClearStructLoop:
@@ -261,7 +261,7 @@ GameCubeMultiBoot_Init_ClearStructLoop:
strh r1, [r3, OFFSET_REG_IE - 0x200]
@ Restore IME register.
- strh r2, [r3, OFFSET_REG_IME - 0x200]
+ strh r2, [r3, #OFFSET_REG_IME - 0x200]
bx lr
thumb_func_end GameCubeMultiBoot_Init
@@ -275,11 +275,11 @@ GameCubeMultiBoot_HandleSerialInterrupt: @ 82DEEE2
ldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120]
strh r1, [r3, OFFSET_REG_JOYCNT - 0x120]
- movs r2, 0
+ movs r2, #0
strb r2, [r0]
- ldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
- cmp r2, 0
+ ldr r2, [r0, #GCMB_STRUCT_SERIAL_INTR_HANDLER]
+ cmp r2, #0
beq GameCubeMultiBoot_HandleSerialInterruptDone
lsrs r1, 1 @ was a device reset command received?
@@ -297,7 +297,7 @@ GcMbIntrHandler_Stop:
strh r2, [r3, OFFSET_REG_JOYSTAT - 0x120]
GameCubeMultiBoot_SetInterruptHandler:
- str r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
+ str r2, [r0, #GCMB_STRUCT_SERIAL_INTR_HANDLER]
GameCubeMultiBoot_ReadVCount:
ldr r3, pool_RegDispstat
@@ -319,8 +319,8 @@ GameCubeMultiBoot_BeginHandshake:
cmp r1, 0
bne GcMbIntrHandler_Stop
ldr r1, pool_MultiBootLoadAddr
- str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]
- str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ str r1, [r0, #GCMB_STRUCT_BASE_DEST_PTR]
+ str r1, [r0, #GCMB_STRUCT_CUR_DEST_PTR]
adr r2, GcMbIntrHandler_CheckGameCodeSent
b GameCubeMultiBoot_SetInterruptHandler
@@ -417,8 +417,8 @@ _082DEF94:
_082DEFA6:
bne GcMbIntrHandler_Stop
ldr r1, pool_MultiBootLoadAddr
- str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]
- str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ str r1, [r0, #GCMB_STRUCT_BASE_DEST_PTR]
+ str r1, [r0, #GCMB_STRUCT_CUR_DEST_PTR]
adr r2, GcMbIntrHandler_82DEFB4
b GameCubeMultiBoot_SetInterruptHandler
@@ -427,7 +427,7 @@ _082DEFA6:
GcMbIntrHandler_82DEFB4: @ 82DEFB4
lsrs r1, 1 @ is receive complete?
bcc GcMbIntrHandler_Stop @ branch if not
- ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ ldr r2, [r0, #GCMB_STRUCT_CUR_DEST_PTR]
movs r1, 0x4
ands r1, r2
adds r1, 0x8
@@ -435,7 +435,7 @@ GcMbIntrHandler_82DEFB4: @ 82DEFB4
strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
stm r2!, {r1}
- str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ str r2, [r0, #GCMB_STRUCT_CUR_DEST_PTR]
ldrh r1, [r0, 0x12]
subs r1, 0x1
strh r1, [r0, 0x12]
@@ -500,11 +500,11 @@ GameCubeMultiBoot_Quit: @ 82DF012
ldr r3, pool_InterruptRegs
@ Save IME register.
- ldrh r2, [r3, OFFSET_REG_IME - 0x200]
+ ldrh r2, [r3, #OFFSET_REG_IME - 0x200]
@ Disable interrupts.
movs r1, 0
- strh r1, [r3, OFFSET_REG_IME - 0x200]
+ strh r1, [r3, #OFFSET_REG_IME - 0x200]
ldr r3, pool_SerialRegs
@@ -528,7 +528,7 @@ GameCubeMultiBoot_Quit: @ 82DF012
strh r1, [r3, OFFSET_REG_IE - 0x200]
@ Restore IME register.
- strh r2, [r3, OFFSET_REG_IME - 0x200]
+ strh r2, [r3, #OFFSET_REG_IME - 0x200]
bx lr
thumb_func_end GameCubeMultiBoot_Quit
diff --git a/src/pokeblock.c b/src/pokeblock.c
index 9be3ad24d..f654e0782 100644
--- a/src/pokeblock.c
+++ b/src/pokeblock.c
@@ -117,7 +117,7 @@ EWRAM_DATA static struct PokeblockSavedData sSavedPokeblockData = {0};
EWRAM_DATA static struct PokeblockMenuStruct *sPokeblockMenu = NULL;
// const rom data
-const s8 gPokeblockFlavorCompatibilityTable[] =
+const s8 gPokeblockFlavorCompatibilityTable[NUM_NATURES * FLAVOR_COUNT] =
{
// Cool, Beauty, Cute, Smart, Tough
0, 0, 0, 0, 0, // Hardy
@@ -1386,7 +1386,7 @@ s16 PokeblockGetGain(u8 nature, const struct Pokeblock *pokeblock)
{
curGain = GetPokeblockData(pokeblock, flavor + PBLOCK_SPICY);
if (curGain > 0)
- totalGain += curGain * gPokeblockFlavorCompatibilityTable[5 * nature + flavor];
+ totalGain += curGain * gPokeblockFlavorCompatibilityTable[FLAVOR_COUNT * nature + flavor];
}
return totalGain;
diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c
index 72e54ae4c..e15a005e6 100644
--- a/src/pokeblock_feed.c
+++ b/src/pokeblock_feed.c
@@ -84,7 +84,7 @@ EWRAM_DATA static struct PokeblockFeedStruct *sPokeblockFeed = NULL;
EWRAM_DATA static struct CompressedSpritePalette sPokeblockSpritePal = {0};
// const rom data
-static const u8 sNatureToMonPokeblockAnim[][2] =
+static const u8 sNatureToMonPokeblockAnim[NUM_NATURES][2] =
{
[NATURE_HARDY] = { 0, 0 },
[NATURE_LONELY] = { 3, 0 },
diff --git a/src/pokemon.c b/src/pokemon.c
index 329240f99..80e93c568 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -1349,7 +1349,7 @@ const struct SpindaSpot gSpindaSpotGraphics[] =
#include "data/pokemon/item_effects.h"
-const s8 gNatureStatTable[][NUM_EV_STATS] =
+const s8 gNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] =
{
// Atk Def Spd Sp.Atk Sp.Def
{ 0, 0, 0, 0, 0}, // Hardy
@@ -5372,12 +5372,12 @@ u8 *UseStatIncreaseItem(u16 itemId)
u8 GetNature(struct Pokemon *mon)
{
- return GetMonData(mon, MON_DATA_PERSONALITY, 0) % 25;
+ return GetMonData(mon, MON_DATA_PERSONALITY, 0) % NUM_NATURES;
}
u8 GetNatureFromPersonality(u32 personality)
{
- return personality % 25;
+ return personality % NUM_NATURES;
}
u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
@@ -5747,7 +5747,7 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId)
u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
{
// Dont modify HP, Accuracy, or Evasion by nature
- if (statIndex <= STAT_HP || statIndex > NUM_EV_STATS)
+ if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS)
{
// Should just be "return n", but it wouldn't match without this.
u16 retVal = n;
@@ -5836,7 +5836,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies)
u16 totalEVs = 0;
u16 heldItem;
u8 holdEffect;
- int i;
+ int i, multiplier;
for (i = 0; i < NUM_STATS; i++)
{
@@ -5846,43 +5846,37 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies)
for (i = 0; i < NUM_STATS; i++)
{
- u8 hasHadPokerus;
- int multiplier;
-
if (totalEVs >= MAX_TOTAL_EVS)
break;
-
- hasHadPokerus = CheckPartyHasHadPokerus(mon, 0);
-
- if (hasHadPokerus)
+
+ if (CheckPartyHasHadPokerus(mon, 0))
multiplier = 2;
else
multiplier = 1;
switch (i)
{
- case 0:
+ case STAT_HP:
evIncrease = gBaseStats[defeatedSpecies].evYield_HP * multiplier;
break;
- case 1:
+ case STAT_ATK:
evIncrease = gBaseStats[defeatedSpecies].evYield_Attack * multiplier;
break;
- case 2:
+ case STAT_DEF:
evIncrease = gBaseStats[defeatedSpecies].evYield_Defense * multiplier;
break;
- case 3:
+ case STAT_SPEED:
evIncrease = gBaseStats[defeatedSpecies].evYield_Speed * multiplier;
break;
- case 4:
+ case STAT_SPATK:
evIncrease = gBaseStats[defeatedSpecies].evYield_SpAttack * multiplier;
break;
- case 5:
+ case STAT_SPDEF:
evIncrease = gBaseStats[defeatedSpecies].evYield_SpDefense * multiplier;
break;
}
heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0);
-
if (heldItem == ITEM_ENIGMA_BERRY)
{
if (gMain.inBattle)
@@ -6410,13 +6404,13 @@ bool8 IsMonSpriteNotFlipped(u16 species)
s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
{
u8 nature = GetNature(mon);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+ return gPokeblockFlavorCompatibilityTable[nature * FLAVOR_COUNT + flavor];
}
s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)
{
u8 nature = GetNatureFromPersonality(personality);
- return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
+ return gPokeblockFlavorCompatibilityTable[nature * FLAVOR_COUNT + flavor];
}
bool8 IsTradedMon(struct Pokemon *mon)
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
index 1c07b0962..a388be39a 100644
--- a/src/pokemon_animation.c
+++ b/src/pokemon_animation.c
@@ -783,7 +783,7 @@ static const u8 sBackAnimationIds[] =
0x94, 0x95, 0x96, // 0x19
};
-static const u8 sBackAnimNatureModTable[] =
+static const u8 sBackAnimNatureModTable[NUM_NATURES] =
{
[NATURE_HARDY] = 0x00,
[NATURE_LONELY] = 0x02,
diff --git a/src/starter_choose.c b/src/starter_choose.c
index b919a8a17..2585f3408 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -14,6 +14,7 @@
#include "sound.h"
#include "sprite.h"
#include "starter_choose.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
#include "text_window.h"
@@ -27,54 +28,45 @@
#define STARTER_MON_COUNT 3
// Position of the sprite of the selected starter Pokemon
-#define STARTER_PKMN_POS_X 120
+#define STARTER_PKMN_POS_X (DISPLAY_WIDTH / 2)
#define STARTER_PKMN_POS_Y 64
-// text
-extern const u8 gText_BirchInTrouble[];
-extern const u8 gText_ConfirmStarterChoice[];
-
-// this file's functions
-static void MainCallback2_StarterChoose(void);
-static void sub_8134604(void);
-static void Task_StarterChoose1(u8 taskId);
-static void Task_StarterChoose2(u8 taskId);
-static void Task_StarterChoose3(u8 taskId);
-static void Task_StarterChoose4(u8 taskId);
-static void Task_StarterChoose5(u8 taskId);
-static void Task_StarterChoose6(u8 taskId);
+#define TAG_POKEBALL_SELECT 0x1000
+#define TAG_STARTER_CIRCLE 0x1001
+
+static void CB2_StarterChoose(void);
+static void ClearStarterLabel(void);
+static void Task_StarterChoose(u8 taskId);
+static void Task_HandleStarterChooseInput(u8 taskId);
+static void Task_WaitForStarterSprite(u8 taskId);
+static void Task_AskConfirmStarter(u8 taskId);
+static void Task_HandleConfirmStarterInput(u8 taskId);
+static void Task_DeclineStarter(u8 taskId);
static void Task_MoveStarterChooseCursor(u8 taskId);
-static void sub_8134668(u8 taskId);
+static void Task_CreateStarterLabel(u8 taskId);
static void CreateStarterPokemonLabel(u8 selection);
static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y);
-void sub_81346DC(struct Sprite *sprite);
-void sub_813473C(struct Sprite *sprite);
-void StarterPokemonSpriteCallback(struct Sprite *sprite);
+static void SpriteCB_SelectionHand(struct Sprite *sprite);
+static void SpriteCB_Pokeball(struct Sprite *sprite);
+static void SpriteCB_StarterPokemon(struct Sprite *sprite);
-static u16 sStarterChooseWindowId;
+static u16 sStarterLabelWindowId;
-// .rodata
const u16 gBirchBagGrassPal[][16] =
{
INCBIN_U16("graphics/misc/birch_bag.gbapal"),
INCBIN_U16("graphics/misc/birch_grass.gbapal"),
};
-const u16 gBirchBallarrow_Pal[] = INCBIN_U16("graphics/misc/birch_ballarrow.gbapal");
-
-const u16 gBirchCircle_Pal[] = INCBIN_U16("graphics/misc/birch_circle.gbapal");
-
+static const u16 sPokeballSelection_Pal[] = INCBIN_U16("graphics/misc/pokeball_selection.gbapal");
+static const u16 sStarterCircle_Pal[] = INCBIN_U16("graphics/misc/starter_circle.gbapal");
const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/misc/birch_bag_map.bin.lz");
-
const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/misc/birch_grass_map.bin.lz");
+const u32 gBirchHelpGfx[] = INCBIN_U32("graphics/misc/birch_help.4bpp.lz"); // Birch bag and grass combined
+const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/misc/pokeball_selection.4bpp.lz");
+static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/misc/starter_circle.4bpp.lz");
-const u32 gBirchHelpGfx[] = INCBIN_U32("graphics/misc/birch_help.4bpp.lz");
-
-const u32 gUnknown_085B18AC[] = INCBIN_U32("graphics/misc/birch_ballarrow.4bpp.lz");
-
-const u32 gUnknown_085B1BCC[] = INCBIN_U32("graphics/misc/birch_circle.4bpp.lz");
-
-static const struct WindowTemplate gUnknown_085B1DCC[] =
+static const struct WindowTemplate sWindowTemplates[] =
{
{
.bg = 0,
@@ -88,7 +80,7 @@ static const struct WindowTemplate gUnknown_085B1DCC[] =
DUMMY_WIN_TEMPLATE,
};
-static const struct WindowTemplate gUnknown_085B1DDC =
+static const struct WindowTemplate sWindowTemplate_ConfirmStarter =
{
.bg = 0,
.tilemapLeft = 24,
@@ -99,7 +91,7 @@ static const struct WindowTemplate gUnknown_085B1DDC =
.baseBlock = 0x0260
};
-static const struct WindowTemplate gUnknown_085B1DE4 =
+static const struct WindowTemplate sWindowTemplate_StarterLabel =
{
.bg = 0,
.tilemapLeft = 0,
@@ -117,7 +109,7 @@ static const u8 sPokeballCoords[STARTER_MON_COUNT][2] =
{180, 64},
};
-static const u8 sStarterLabelCoords[][2] =
+static const u8 sStarterLabelCoords[STARTER_MON_COUNT][2] =
{
{0, 9},
{16, 10},
@@ -131,7 +123,7 @@ static const u16 sStarterMon[STARTER_MON_COUNT] =
SPECIES_MUDKIP,
};
-static const struct BgTemplate gUnknown_085B1E00[3] =
+static const struct BgTemplate sBgTemplates[3] =
{
{
.bg = 0,
@@ -164,7 +156,7 @@ static const struct BgTemplate gUnknown_085B1E00[3] =
static const u8 sTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GREY};
-static const struct OamData gOamData_85B1E10 =
+static const struct OamData sOam_Hand =
{
.y = 160,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -181,7 +173,7 @@ static const struct OamData gOamData_85B1E10 =
.affineParam = 0,
};
-static const struct OamData gOamData_85B1E18 =
+static const struct OamData sOam_Pokeball =
{
.y = 160,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -198,7 +190,7 @@ static const struct OamData gOamData_85B1E18 =
.affineParam = 0,
};
-static const struct OamData gOamData_85B1E20 =
+static const struct OamData sOam_StarterCircle =
{
.y = 160,
.affineMode = ST_OAM_AFFINE_DOUBLE,
@@ -222,19 +214,19 @@ static const u8 sCursorCoords[][2] =
{180, 32},
};
-static const union AnimCmd gSpriteAnim_85B1E30[] =
+static const union AnimCmd sAnim_Hand[] =
{
ANIMCMD_FRAME(48, 30),
ANIMCMD_END,
};
-static const union AnimCmd gSpriteAnim_85B1E38[] =
+static const union AnimCmd sAnim_Pokeball_Still[] =
{
ANIMCMD_FRAME(0, 30),
ANIMCMD_END,
};
-static const union AnimCmd gSpriteAnim_85B1E40[] =
+static const union AnimCmd sAnim_Pokeball_Moving[] =
{
ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(0, 4),
@@ -256,109 +248,109 @@ static const union AnimCmd gSpriteAnim_85B1E40[] =
ANIMCMD_JUMP(0),
};
-static const union AnimCmd gSpriteAnim_85B1E88[] =
+static const union AnimCmd sAnim_StarterCircle[] =
{
ANIMCMD_FRAME(0, 8),
ANIMCMD_END,
};
-static const union AnimCmd * const gSpriteAnimTable_85B1E90[] =
+static const union AnimCmd * const sAnims_Hand[] =
{
- gSpriteAnim_85B1E30,
+ sAnim_Hand,
};
-static const union AnimCmd * const gSpriteAnimTable_85B1E94[] =
+static const union AnimCmd * const sAnims_Pokeball[] =
{
- gSpriteAnim_85B1E38,
- gSpriteAnim_85B1E40,
+ sAnim_Pokeball_Still,
+ sAnim_Pokeball_Moving,
};
-static const union AnimCmd * const gSpriteAnimTable_85B1E9C[] =
+static const union AnimCmd * const sAnims_StarterCircle[] =
{
- gSpriteAnim_85B1E88,
+ sAnim_StarterCircle,
};
-static const union AffineAnimCmd gSpriteAffineAnim_85B1EA0[] =
+static const union AffineAnimCmd sAffineAnim_StarterPokemon[] =
{
AFFINEANIMCMD_FRAME(16, 16, 0, 0),
AFFINEANIMCMD_FRAME(16, 16, 0, 15),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gSpriteAffineAnim_85B1EB8[] =
+static const union AffineAnimCmd sAffineAnim_StarterCircle[] =
{
AFFINEANIMCMD_FRAME(20, 20, 0, 0),
AFFINEANIMCMD_FRAME(20, 20, 0, 15),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd * const gUnknown_085B1ED0 = {gSpriteAffineAnim_85B1EA0};
-static const union AffineAnimCmd * const gSpriteAffineAnimTable_85B1ED4[] = {gSpriteAffineAnim_85B1EB8};
+static const union AffineAnimCmd * const sAffineAnims_StarterPokemon = {sAffineAnim_StarterPokemon};
+static const union AffineAnimCmd * const sAffineAnims_StarterCircle[] = {sAffineAnim_StarterCircle};
-static const struct CompressedSpriteSheet gUnknown_085B1ED8[] =
+static const struct CompressedSpriteSheet sSpriteSheet_PokeballSelect[] =
{
{
- .data = gUnknown_085B18AC,
+ .data = gPokeballSelection_Gfx,
.size = 0x0800,
- .tag = 0x1000
+ .tag = TAG_POKEBALL_SELECT
},
{}
};
-static const struct CompressedSpriteSheet gUnknown_085B1EE8[] =
+static const struct CompressedSpriteSheet sSpriteSheet_StarterCircle[] =
{
{
- .data = gUnknown_085B1BCC,
+ .data = sStarterCircle_Gfx,
.size = 0x0800,
- .tag = 0x1001
+ .tag = TAG_STARTER_CIRCLE
},
{}
};
-static const struct SpritePalette gUnknown_085B1EF8[] =
+static const struct SpritePalette sSpritePalettes_StarterChoose[] =
{
{
- .data = gBirchBallarrow_Pal,
- .tag = 0x1000
+ .data = sPokeballSelection_Pal,
+ .tag = TAG_POKEBALL_SELECT
},
{
- .data = gBirchCircle_Pal,
- .tag = 0x1001
+ .data = sStarterCircle_Pal,
+ .tag = TAG_STARTER_CIRCLE
},
{},
};
static const struct SpriteTemplate sSpriteTemplate_Hand =
{
- .tileTag = 0x1000,
- .paletteTag = 0x1000,
- .oam = &gOamData_85B1E10,
- .anims = gSpriteAnimTable_85B1E90,
+ .tileTag = TAG_POKEBALL_SELECT,
+ .paletteTag = TAG_POKEBALL_SELECT,
+ .oam = &sOam_Hand,
+ .anims = sAnims_Hand,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_81346DC
+ .callback = SpriteCB_SelectionHand
};
-static const struct SpriteTemplate sSpriteTemplate_PokeBall =
+static const struct SpriteTemplate sSpriteTemplate_Pokeball =
{
- .tileTag = 0x1000,
- .paletteTag = 0x1000,
- .oam = &gOamData_85B1E18,
- .anims = gSpriteAnimTable_85B1E94,
+ .tileTag = TAG_POKEBALL_SELECT,
+ .paletteTag = TAG_POKEBALL_SELECT,
+ .oam = &sOam_Pokeball,
+ .anims = sAnims_Pokeball,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_813473C
+ .callback = SpriteCB_Pokeball
};
-static const struct SpriteTemplate gUnknown_085B1F40 =
+static const struct SpriteTemplate sSpriteTemplate_StarterCircle =
{
- .tileTag = 0x1001,
- .paletteTag = 0x1001,
- .oam = &gOamData_85B1E20,
- .anims = gSpriteAnimTable_85B1E9C,
+ .tileTag = TAG_STARTER_CIRCLE,
+ .paletteTag = TAG_STARTER_CIRCLE,
+ .oam = &sOam_StarterCircle,
+ .anims = sAnims_StarterCircle,
.images = NULL,
- .affineAnims = gSpriteAffineAnimTable_85B1ED4,
- .callback = StarterPokemonSpriteCallback
+ .affineAnims = sAffineAnims_StarterCircle,
+ .callback = SpriteCB_StarterPokemon
};
// .text
@@ -376,10 +368,15 @@ static void VblankCB_StarterChoose(void)
TransferPlttBuffer();
}
+// Data for Task_StarterChoose
#define tStarterSelection data[0]
#define tPkmnSpriteId data[1]
#define tCircleSpriteId data[2]
+// Data for sSpriteTemplate_Pokeball
+#define sTaskId data[0]
+#define sBallId data[1]
+
void CB2_ChooseStarter(void)
{
u16 savedIme;
@@ -412,8 +409,8 @@ void CB2_ChooseStarter(void)
LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7)));
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_085B1E00, ARRAY_COUNT(gUnknown_085B1E00));
- InitWindows(gUnknown_085B1DCC);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
+ InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
LoadUserWindowBorderGfx(0, 0x2A8, 0xD0);
@@ -427,17 +424,17 @@ void CB2_ChooseStarter(void)
LoadPalette(GetOverworldTextboxPalettePtr(), 0xE0, 0x20);
LoadPalette(gBirchBagGrassPal, 0, 0x40);
- LoadCompressedSpriteSheet(&gUnknown_085B1ED8[0]);
- LoadCompressedSpriteSheet(&gUnknown_085B1EE8[0]);
- LoadSpritePalettes(gUnknown_085B1EF8);
+ LoadCompressedSpriteSheet(&sSpriteSheet_PokeballSelect[0]);
+ LoadCompressedSpriteSheet(&sSpriteSheet_StarterCircle[0]);
+ LoadSpritePalettes(sSpritePalettes_StarterChoose);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
EnableInterrupts(DISPSTAT_VBLANK);
SetVBlankCallback(VblankCB_StarterChoose);
- SetMainCallback2(MainCallback2_StarterChoose);
+ SetMainCallback2(CB2_StarterChoose);
- SetGpuReg(REG_OFFSET_WININ, 0x3F);
- SetGpuReg(REG_OFFSET_WINOUT, 0x1F);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ);
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);
@@ -449,7 +446,7 @@ void CB2_ChooseStarter(void)
ShowBg(2);
ShowBg(3);
- taskId = CreateTask(Task_StarterChoose1, 0);
+ taskId = CreateTask(Task_StarterChoose, 0);
gTasks[taskId].tStarterSelection = 1;
// Create hand sprite
@@ -457,22 +454,22 @@ void CB2_ChooseStarter(void)
gSprites[spriteId].data[0] = taskId;
// Create three Pokeball sprites
- spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[0][0], sPokeballCoords[0][1], 2);
- gSprites[spriteId].data[0] = taskId;
- gSprites[spriteId].data[1] = 0;
+ spriteId = CreateSprite(&sSpriteTemplate_Pokeball, sPokeballCoords[0][0], sPokeballCoords[0][1], 2);
+ gSprites[spriteId].sTaskId = taskId;
+ gSprites[spriteId].sBallId = 0;
- spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[1][0], sPokeballCoords[1][1], 2);
- gSprites[spriteId].data[0] = taskId;
- gSprites[spriteId].data[1] = 1;
+ spriteId = CreateSprite(&sSpriteTemplate_Pokeball, sPokeballCoords[1][0], sPokeballCoords[1][1], 2);
+ gSprites[spriteId].sTaskId = taskId;
+ gSprites[spriteId].sBallId = 1;
- spriteId = CreateSprite(&sSpriteTemplate_PokeBall, sPokeballCoords[2][0], sPokeballCoords[2][1], 2);
- gSprites[spriteId].data[0] = taskId;
- gSprites[spriteId].data[1] = 2;
+ spriteId = CreateSprite(&sSpriteTemplate_Pokeball, sPokeballCoords[2][0], sPokeballCoords[2][1], 2);
+ gSprites[spriteId].sTaskId = taskId;
+ gSprites[spriteId].sBallId = 2;
- sStarterChooseWindowId = 0xFF;
+ sStarterLabelWindowId = 0xFF;
}
-static void MainCallback2_StarterChoose(void)
+static void CB2_StarterChoose(void)
{
RunTasks();
AnimateSprites();
@@ -481,71 +478,71 @@ static void MainCallback2_StarterChoose(void)
UpdatePaletteFade();
}
-static void Task_StarterChoose1(u8 taskId)
+static void Task_StarterChoose(u8 taskId)
{
CreateStarterPokemonLabel(gTasks[taskId].tStarterSelection);
DrawStdFrameWithCustomTileAndPalette(0, FALSE, 0x2A8, 0xD);
AddTextPrinterParameterized(0, 1, gText_BirchInTrouble, 0, 1, 0, NULL);
PutWindowTilemap(0);
ScheduleBgCopyTilemapToVram(0);
- gTasks[taskId].func = Task_StarterChoose2;
+ gTasks[taskId].func = Task_HandleStarterChooseInput;
}
-static void Task_StarterChoose2(u8 taskId)
+static void Task_HandleStarterChooseInput(u8 taskId)
{
u8 selection = gTasks[taskId].tStarterSelection;
- if (gMain.newKeys & A_BUTTON)
+ if (JOY_NEW(A_BUTTON))
{
u8 spriteId;
- sub_8134604();
+ ClearStarterLabel();
// Create white circle background
- spriteId = CreateSprite(&gUnknown_085B1F40, sPokeballCoords[selection][0], sPokeballCoords[selection][1], 1);
+ spriteId = CreateSprite(&sSpriteTemplate_StarterCircle, sPokeballCoords[selection][0], sPokeballCoords[selection][1], 1);
gTasks[taskId].tCircleSpriteId = spriteId;
// Create Pokemon sprite
spriteId = CreatePokemonFrontSprite(GetStarterPokemon(gTasks[taskId].tStarterSelection), sPokeballCoords[selection][0], sPokeballCoords[selection][1]);
- gSprites[spriteId].affineAnims = &gUnknown_085B1ED0;
- gSprites[spriteId].callback = StarterPokemonSpriteCallback;
+ gSprites[spriteId].affineAnims = &sAffineAnims_StarterPokemon;
+ gSprites[spriteId].callback = SpriteCB_StarterPokemon;
gTasks[taskId].tPkmnSpriteId = spriteId;
- gTasks[taskId].func = Task_StarterChoose3;
+ gTasks[taskId].func = Task_WaitForStarterSprite;
}
- else if ((gMain.newKeys & DPAD_LEFT) && selection > 0)
+ else if (JOY_NEW(DPAD_LEFT) && selection > 0)
{
gTasks[taskId].tStarterSelection--;
gTasks[taskId].func = Task_MoveStarterChooseCursor;
}
- else if ((gMain.newKeys & DPAD_RIGHT) && selection < (STARTER_MON_COUNT - 1))
+ else if (JOY_NEW(DPAD_RIGHT) && selection < STARTER_MON_COUNT - 1)
{
gTasks[taskId].tStarterSelection++;
gTasks[taskId].func = Task_MoveStarterChooseCursor;
}
}
-static void Task_StarterChoose3(u8 taskId)
+static void Task_WaitForStarterSprite(u8 taskId)
{
if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded &&
- gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X &&
- gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y)
+ gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X &&
+ gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y)
{
- gTasks[taskId].func = Task_StarterChoose4;
+ gTasks[taskId].func = Task_AskConfirmStarter;
}
}
-static void Task_StarterChoose4(u8 taskId)
+static void Task_AskConfirmStarter(u8 taskId)
{
PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0);
FillWindowPixelBuffer(0, PIXEL_FILL(1));
AddTextPrinterParameterized(0, 1, gText_ConfirmStarterChoice, 0, 1, 0, NULL);
ScheduleBgCopyTilemapToVram(0);
- CreateYesNoMenu(&gUnknown_085B1DDC, 0x2A8, 0xD, 0);
- gTasks[taskId].func = Task_StarterChoose5;
+ CreateYesNoMenu(&sWindowTemplate_ConfirmStarter, 0x2A8, 0xD, 0);
+ gTasks[taskId].func = Task_HandleConfirmStarterInput;
}
-static void Task_StarterChoose5(u8 taskId)
+static void Task_HandleConfirmStarterInput(u8 taskId)
{
u8 spriteId;
@@ -558,7 +555,7 @@ static void Task_StarterChoose5(u8 taskId)
SetMainCallback2(gMain.savedCallback);
break;
case 1: // NO
- case -1: // B button
+ case MENU_B_PRESSED:
PlaySE(SE_SELECT);
spriteId = gTasks[taskId].tPkmnSpriteId;
FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
@@ -567,14 +564,14 @@ static void Task_StarterChoose5(u8 taskId)
spriteId = gTasks[taskId].tCircleSpriteId;
FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
DestroySprite(&gSprites[spriteId]);
- gTasks[taskId].func = Task_StarterChoose6;
+ gTasks[taskId].func = Task_DeclineStarter;
break;
}
}
-static void Task_StarterChoose6(u8 taskId)
+static void Task_DeclineStarter(u8 taskId)
{
- gTasks[taskId].func = Task_StarterChoose1;
+ gTasks[taskId].func = Task_StarterChoose;
}
static void CreateStarterPokemonLabel(u8 selection)
@@ -589,20 +586,20 @@ static void CreateStarterPokemonLabel(u8 selection)
CopyMonCategoryText(SpeciesToNationalPokedexNum(species), categoryText);
speciesName = gSpeciesNames[species];
- winTemplate = gUnknown_085B1DE4;
+ winTemplate = sWindowTemplate_StarterLabel;
winTemplate.tilemapLeft = sStarterLabelCoords[selection][0];
winTemplate.tilemapTop = sStarterLabelCoords[selection][1];
- sStarterChooseWindowId = AddWindow(&winTemplate);
- FillWindowPixelBuffer(sStarterChooseWindowId, PIXEL_FILL(0));
+ sStarterLabelWindowId = AddWindow(&winTemplate);
+ FillWindowPixelBuffer(sStarterLabelWindowId, PIXEL_FILL(0));
width = GetStringCenterAlignXOffset(7, categoryText, 0x68);
- AddTextPrinterParameterized3(sStarterChooseWindowId, 7, width, 1, sTextColors, 0, categoryText);
+ AddTextPrinterParameterized3(sStarterLabelWindowId, 7, width, 1, sTextColors, 0, categoryText);
width = GetStringCenterAlignXOffset(1, speciesName, 0x68);
- AddTextPrinterParameterized3(sStarterChooseWindowId, 1, width, 0x11, sTextColors, 0, speciesName);
+ AddTextPrinterParameterized3(sStarterLabelWindowId, 1, width, 17, sTextColors, 0, speciesName);
- PutWindowTilemap(sStarterChooseWindowId);
+ PutWindowTilemap(sStarterLabelWindowId);
ScheduleBgCopyTilemapToVram(0);
labelLeft = sStarterLabelCoords[selection][0] * 8 - 4;
@@ -613,12 +610,12 @@ static void CreateStarterPokemonLabel(u8 selection)
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(labelTop, labelBottom));
}
-static void sub_8134604(void)
+static void ClearStarterLabel(void)
{
- FillWindowPixelBuffer(sStarterChooseWindowId, PIXEL_FILL(0));
- ClearWindowTilemap(sStarterChooseWindowId);
- RemoveWindow(sStarterChooseWindowId);
- sStarterChooseWindowId = 0xFF;
+ FillWindowPixelBuffer(sStarterLabelWindowId, PIXEL_FILL(0));
+ ClearWindowTilemap(sStarterLabelWindowId);
+ RemoveWindow(sStarterLabelWindowId);
+ sStarterLabelWindowId = 0xFF;
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
ScheduleBgCopyTilemapToVram(0);
@@ -626,14 +623,14 @@ static void sub_8134604(void)
static void Task_MoveStarterChooseCursor(u8 taskId)
{
- sub_8134604();
- gTasks[taskId].func = sub_8134668;
+ ClearStarterLabel();
+ gTasks[taskId].func = Task_CreateStarterLabel;
}
-static void sub_8134668(u8 taskId)
+static void Task_CreateStarterLabel(u8 taskId)
{
CreateStarterPokemonLabel(gTasks[taskId].tStarterSelection);
- gTasks[taskId].func = Task_StarterChoose2;
+ gTasks[taskId].func = Task_HandleStarterChooseInput;
}
static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
@@ -645,25 +642,27 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
return spriteId;
}
-void sub_81346DC(struct Sprite *sprite)
+static void SpriteCB_SelectionHand(struct Sprite *sprite)
{
+ // Float up and down above selected pokeball
sprite->pos1.x = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][0];
sprite->pos1.y = sCursorCoords[gTasks[sprite->data[0]].tStarterSelection][1];
sprite->pos2.y = Sin(sprite->data[1], 8);
sprite->data[1] = (u8)(sprite->data[1]) + 4;
}
-void sub_813473C(struct Sprite *sprite)
+static void SpriteCB_Pokeball(struct Sprite *sprite)
{
- if (gTasks[sprite->data[0]].tStarterSelection == sprite->data[1])
+ // Animate pokeball if currently selected
+ if (gTasks[sprite->sTaskId].tStarterSelection == sprite->sBallId)
StartSpriteAnimIfDifferent(sprite, 1);
else
StartSpriteAnimIfDifferent(sprite, 0);
}
-void StarterPokemonSpriteCallback(struct Sprite *sprite)
+static void SpriteCB_StarterPokemon(struct Sprite *sprite)
{
- //Move sprite to upper center of screen
+ // Move sprite to upper center of screen
if (sprite->pos1.x > STARTER_PKMN_POS_X)
sprite->pos1.x -= 4;
if (sprite->pos1.x < STARTER_PKMN_POS_X)
diff --git a/src/strings.c b/src/strings.c
index 324e6098a..2ea06c1ad 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -402,7 +402,7 @@ const u8 gText_PkmnNeedsToReplaceMove[] = _("{STR_VAR_1} wants to learn the\nmov
const u8 gText_StopLearningMove2[] = _("Stop trying to teach\n{STR_VAR_2}?");
const u8 gText_MoveNotLearned[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
const u8 gText_WhichMoveToForget[] = _("Which move should be forgotten?{PAUSE_UNTIL_PRESS}");
-const u8 gText_12PoofForgotMove[] = _("1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p{STR_VAR_1} forgot how to\nuse {STR_VAR_2}.\pAnd…{PAUSE_UNTIL_PRESS}");
+const u8 gText_12PoofForgotMove[] = _("1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE SE_KON}Poof!\p{STR_VAR_1} forgot how to\nuse {STR_VAR_2}.\pAnd…{PAUSE_UNTIL_PRESS}");
const u8 gText_PkmnAlreadyKnows[] = _("{STR_VAR_1} already knows\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
const u8 gText_PkmnHPRestoredByVar2[] = _("{STR_VAR_1}'s HP was restored\nby {STR_VAR_2} point(s).{PAUSE_UNTIL_PRESS}");
const u8 gText_PkmnCuredOfPoison[] = _("{STR_VAR_1} was cured of its\npoisoning.{PAUSE_UNTIL_PRESS}");
@@ -1745,7 +1745,7 @@ const u8 gText_MoveRelearnerTeachMoveConfirm[] = _("Teach {STR_VAR_2}?");
const u8 gText_MoveRelearnerPkmnLearnedMove[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!");
const u8 gText_MoveRelearnerPkmnTryingToLearnMove[] = _("{STR_VAR_1} is trying to learn\n{STR_VAR_2}.\pBut {STR_VAR_1} can't learn more\nthan four moves.\pDelete an older move to make\nroom for {STR_VAR_2}?");
const u8 gText_MoveRelearnerStopTryingToTeachMove[] = _("Stop trying to teach\n{STR_VAR_2}?");
-const u8 gText_MoveRelearnerAndPoof[] = _("{PAUSE 32}1, {PAUSE 15}2, and {PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p");
+const u8 gText_MoveRelearnerAndPoof[] = _("{PAUSE 32}1, {PAUSE 15}2, and {PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE SE_KON}Poof!\p");
const u8 gText_MoveRelearnerPkmnForgotMoveAndLearnedNew[] = _("{STR_VAR_1} forgot {STR_VAR_3}.\pAnd…\p{STR_VAR_1} learned {STR_VAR_2}.");
const u8 gText_MoveRelearnedPkmnDidNotLearnMove[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}."); // Unused
const u8 gText_MoveRelearnerGiveUp[] = _("Give up trying to teach a new\nmove to {STR_VAR_1}?");
diff --git a/src/unk_transition.c b/src/unk_transition.c
deleted file mode 100644
index dff165bc9..000000000
--- a/src/unk_transition.c
+++ /dev/null
@@ -1,639 +0,0 @@
-#include "global.h"
-#include "sprite.h"
-#include "decompress.h"
-#include "unk_transition.h"
-#include "battle_transition.h"
-#include "task.h"
-#include "palette.h"
-#include "trig.h"
-#include "bg.h"
-#include "gpu_regs.h"
-#include "constants/rgb.h"
-
-typedef bool8 (*TransitionStateFunc)(struct Task *task);
-
-// this file's functions
-static void sub_81DA848(struct Sprite *sprite);
-static void sub_81DA9BC(struct Sprite *sprite);
-static bool8 sub_81DAACC(struct Task *task);
-static bool8 sub_81DAC14(struct Task *task);
-static bool8 sub_81DABBC(struct Task *task);
-static bool8 sub_81DAB4C(struct Task *task);
-static bool8 sub_81DAC80(struct Task *task);
-static bool8 sub_81DACEC(struct Task *task);
-static bool8 sub_81DAD58(struct Task *task);
-static bool8 sub_81DADC4(struct Task *task);
-static bool8 sub_81DAE44(struct Task *task);
-static bool8 sub_81DAEB0(struct Task *task);
-static bool8 sub_81DAF34(struct Task *task);
-static bool8 sub_81DAFA0(struct Task *task);
-static bool8 sub_81DB02C(struct Task *task);
-static bool8 sub_81DB098(struct Task *task);
-static bool8 sub_81DB124(struct Task *task);
-static bool8 sub_81DB190(struct Task *task);
-static bool8 sub_81DB224(struct Task *task);
-static bool8 sub_81DB290(struct Task *task);
-static bool8 sub_81DB328(struct Task *task);
-
-// const rom data
-static const u32 gUnknown_0862AD54[] = INCBIN_U32("graphics/battle_transitions/frontier_transition.4bpp.lz");
-static const u32 gUnknown_0862AF30[] = INCBIN_U32("graphics/battle_transitions/frontier_transition.bin");
-static const u32 gUnknown_0862B0DC[] = INCBIN_U32("graphics/battle_transitions/frontier_transition_circles.4bpp.lz");
-static const u16 gUnknown_0862B53C[] = INCBIN_U16("graphics/battle_transitions/frontier_transition.gbapal");
-
-// Unused Empty data.
-static const u8 sFiller[0x1C0] = {0};
-
-static const struct OamData sOamData_862B71C =
-{
- .y = 0,
- .affineMode = ST_OAM_AFFINE_OFF,
- .objMode = ST_OAM_OBJ_NORMAL,
- .mosaic = 0,
- .bpp = ST_OAM_4BPP,
- .shape = SPRITE_SHAPE(64x64),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(64x64),
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 0,
- .affineParam = 0
-};
-
-static const struct CompressedSpriteSheet sUnknown_0862B724 =
-{
- .data = gUnknown_0862B0DC,
- .size = 0x1800,
- .tag = 11920
-};
-
-static const struct SpritePalette sUnknown_0862B72C =
-{
- .data = gUnknown_0862B53C,
- .tag = 11920
-};
-
-static const union AnimCmd sSpriteAnim_862B734[] =
-{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END
-};
-
-static const union AnimCmd sSpriteAnim_862B73C[] =
-{
- ANIMCMD_FRAME(64, 1),
- ANIMCMD_END
-};
-
-static const union AnimCmd sSpriteAnim_862B744[] =
-{
- ANIMCMD_FRAME(128, 1),
- ANIMCMD_END
-};
-
-static const union AnimCmd *const sSpriteAnimTable_862B74C[] =
-{
- sSpriteAnim_862B734,
- sSpriteAnim_862B73C,
- sSpriteAnim_862B744
-};
-
-static const struct SpriteTemplate sUnknown_0862B758 =
-{
- .tileTag = 11920,
- .paletteTag = 11920,
- .oam = &sOamData_862B71C,
- .anims = sSpriteAnimTable_862B74C,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy,
-};
-
-static const TransitionStateFunc sPhase2_34_Funcs[] =
-{
- sub_81DAACC,
- sub_81DAC14,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DAC80
-};
-
-static const TransitionStateFunc sPhase2_35_Funcs[] =
-{
- sub_81DAACC,
- sub_81DACEC,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DAD58
-};
-
-static const TransitionStateFunc sPhase2_36_Funcs[] =
-{
- sub_81DAACC,
- sub_81DADC4,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DAE44
-};
-
-static const TransitionStateFunc sPhase2_37_Funcs[] =
-{
- sub_81DAACC,
- sub_81DAEB0,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DAF34
-};
-
-static const TransitionStateFunc sPhase2_38_Funcs[] =
-{
- sub_81DAACC,
- sub_81DAFA0,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DB02C
-};
-
-static const TransitionStateFunc sPhase2_39_Funcs[] =
-{
- sub_81DAACC,
- sub_81DB098,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DB124
-};
-
-static const TransitionStateFunc sPhase2_40_Funcs[] =
-{
- sub_81DAACC,
- sub_81DB190,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DB224
-};
-
-static const TransitionStateFunc sPhase2_41_Funcs[] =
-{
- sub_81DAACC,
- sub_81DB290,
- sub_81DABBC,
- sub_81DAB4C,
- sub_81DB328
-};
-
-// code
-static void sub_81DA700(void)
-{
- u16 *dst1, *dst2;
-
- GetBg0TilesDst(&dst1, &dst2);
- LZ77UnCompVram(gUnknown_0862AD54, dst2);
- LZ77UnCompVram(gUnknown_0862AF30, dst1);
- LoadPalette(gUnknown_0862B53C, 0xF0, 0x20);
- LoadCompressedSpriteSheet(&sUnknown_0862B724);
- LoadSpritePalette(&sUnknown_0862B72C);
-}
-
-static u8 sub_81DA74C(s16 x, s16 y, u8 arg2, u8 arg3, s8 arg4, s8 arg5, u8 spriteAnimNum)
-{
- u8 spriteId = CreateSprite(&sUnknown_0862B758, x, y, 0);
-
- switch (spriteAnimNum)
- {
- case 0:
- gSprites[spriteId].data[0] = 120;
- gSprites[spriteId].data[1] = 45;
- break;
- case 1:
- gSprites[spriteId].data[0] = 89;
- gSprites[spriteId].data[1] = 97;
- break;
- case 2:
- gSprites[spriteId].data[0] = 151;
- gSprites[spriteId].data[1] = 97;
- break;
- }
-
- gSprites[spriteId].data[2] = arg4;
- gSprites[spriteId].data[3] = arg5;
- gSprites[spriteId].data[6] = arg2;
- gSprites[spriteId].data[7] = arg3;
- gSprites[spriteId].data[4] = 0;
- gSprites[spriteId].data[5] = 0;
-
- StartSpriteAnim(&gSprites[spriteId], spriteAnimNum);
- gSprites[spriteId].callback = sub_81DA848;
-
- return spriteId;
-}
-
-static void sub_81DA848(struct Sprite *sprite)
-{
- s16 *data = sprite->data;
-
- if (sprite->pos1.x == data[0] && sprite->pos1.y == data[1])
- {
- sprite->callback = SpriteCallbackDummy;
- }
- else
- {
- if (data[4] == data[6])
- {
- sprite->pos1.x += data[2];
- data[4] = 0;
- }
- else
- {
- data[4]++;
- }
-
- if (data[5] == data[7])
- {
- sprite->pos1.y += data[3];
- data[5] = 0;
- }
- else
- {
- data[5]++;
- }
- }
-}
-
-static u8 sub_81DA8BC(s16 x, s16 y, s16 arg2, s16 arg3, s16 arg4, s16 arg5, s16 arg6, u8 spriteAnimNum)
-{
- u8 spriteId = CreateSprite(&sUnknown_0862B758, x, y, 0);
-
- switch (spriteAnimNum)
- {
- case 0:
- gSprites[spriteId].data[0] = 120;
- gSprites[spriteId].data[1] = 45;
- break;
- case 1:
- gSprites[spriteId].data[0] = 89;
- gSprites[spriteId].data[1] = 97;
- break;
- case 2:
- gSprites[spriteId].data[0] = 151;
- gSprites[spriteId].data[1] = 97;
- break;
- }
-
- gSprites[spriteId].data[2] = arg2;
- gSprites[spriteId].data[3] = arg3;
- gSprites[spriteId].data[4] = arg4;
- gSprites[spriteId].data[5] = arg5;
- gSprites[spriteId].data[6] = arg6;
-
- StartSpriteAnim(&gSprites[spriteId], spriteAnimNum);
- gSprites[spriteId].callback = sub_81DA9BC;
-
- return spriteId;
-}
-
-static void sub_81DA9BC(struct Sprite *sprite)
-{
- sprite->pos2.x = (Sin2(sprite->data[2]) * sprite->data[4]) >> 12; // div by 4096
- sprite->pos2.y = (Cos2(sprite->data[2]) * sprite->data[4]) >> 12; // div by 4096
-
- sprite->data[2] = (sprite->data[2] + sprite->data[3]) % 360;
-
- if (sprite->data[4] != sprite->data[5])
- sprite->data[4] += sprite->data[6];
- else
- sprite->callback = SpriteCallbackDummy;
-}
-
-#define tState data[0]
-
-static void sub_81DAA20(struct Task *task)
-{
- FreeSpriteTilesByTag(11920);
- FreeSpritePaletteByTag(11920);
-
- DestroySprite(&gSprites[task->data[4]]);
- DestroySprite(&gSprites[task->data[5]]);
- DestroySprite(&gSprites[task->data[6]]);
-}
-
-static bool8 sub_81DAA74(struct Task *task)
-{
- if (gSprites[task->data[4]].callback == SpriteCallbackDummy
- && gSprites[task->data[5]].callback == SpriteCallbackDummy
- && gSprites[task->data[6]].callback == SpriteCallbackDummy)
- return TRUE;
- else
- return FALSE;
-}
-
-static bool8 sub_81DAACC(struct Task *task)
-{
- if (task->data[1] == 0)
- {
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
- ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
-
- task->data[1]++;
- return FALSE;
- }
- else
- {
- sub_81DA700();
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- ChangeBgY(0, 0x500, 2);
-
- task->data[1] = 0;
- task->tState++;
- return TRUE;
- }
-}
-
-static bool8 sub_81DAB4C(struct Task *task)
-{
- if (task->data[2] == 0)
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON);
-
- if (task->data[2] == 16)
- {
- if (task->data[3] == 31)
- {
- BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, RGB_BLACK);
- task->tState++;
- }
- else
- {
- task->data[3]++;
- }
- }
- else
- {
- u16 blnd;
-
- task->data[2]++;
- blnd = task->data[2];
- SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(blnd, 16 - blnd));
- }
-
- return FALSE;
-}
-
-static bool8 sub_81DABBC(struct Task *task)
-{
- if (sub_81DAA74(task) == TRUE)
- task->tState++;
-
- return FALSE;
-}
-
-void Phase2Task_34(u8 taskId)
-{
- while (sPhase2_34_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DAC14(struct Task *task)
-{
- task->data[4] = sub_81DA74C(120, -51, 0, 0, 0, 2, 0);
- task->data[5] = sub_81DA74C(-7, 193, 0, 0, 2, -2, 1);
- task->data[6] = sub_81DA74C(247, 193, 0, 0, -2, -2, 2);
-
- task->tState++;
- return FALSE;
-}
-
-static bool8 sub_81DAC80(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_34));
- }
-
- return FALSE;
-}
-
-void Phase2Task_35(u8 taskId)
-{
- while (sPhase2_35_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DACEC(struct Task *task)
-{
- task->data[4] = sub_81DA74C(120, 197, 0, 0, 0, -4, 0);
- task->data[5] = sub_81DA74C(241, 59, 0, 1, -4, 2, 1);
- task->data[6] = sub_81DA74C(-1, 59, 0, 1, 4, 2, 2);
-
- task->tState++;
- return FALSE;
-}
-
-static bool8 sub_81DAD58(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_35));
- }
-
- return FALSE;
-}
-
-void Phase2Task_36(u8 taskId)
-{
- while (sPhase2_36_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DADC4(struct Task *task)
-{
- task->data[4] = sub_81DA8BC(120, 45, 12, 4, 128, 0, -4, 0);
- task->data[5] = sub_81DA8BC(89, 97, 252, 4, 128, 0, -4, 1);
- task->data[6] = sub_81DA8BC(151, 97, 132, 4, 128, 0, -4, 2);
-
- task->tState++;
- return FALSE;
-}
-
-static bool8 sub_81DAE44(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_36));
- }
-
- return FALSE;
-}
-
-void Phase2Task_37(u8 taskId)
-{
- while (sPhase2_37_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DAEB0(struct Task *task)
-{
- task->data[4] = sub_81DA8BC(120, 80, 284, 8, 131, 35, -3, 0);
- task->data[5] = sub_81DA8BC(120, 80, 44, 8, 131, 35, -3, 1);
- task->data[6] = sub_81DA8BC(121, 80, 164, 8, 131, 35, -3, 2);
-
- task->tState++;
- return FALSE;
-}
-
-static bool8 sub_81DAF34(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_37));
- }
-
- return FALSE;
-}
-
-void Phase2Task_38(u8 taskId)
-{
- while (sPhase2_38_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DAFA0(struct Task *task)
-{
- if (task->data[1] == 0)
- {
- task->data[4] = sub_81DA74C(120, -51, 0, 0, 0, 4, 0);
- }
- else if (task->data[1] == 16)
- {
- task->data[5] = sub_81DA74C(-7, 193, 0, 0, 4, -4, 1);
- }
- else if (task->data[1] == 32)
- {
- task->data[6] = sub_81DA74C(247, 193, 0, 0, -4, -4, 2);
- task->tState++;
- }
-
- task->data[1]++;
- return FALSE;
-}
-
-static bool8 sub_81DB02C(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_38));
- }
-
- return FALSE;
-}
-
-void Phase2Task_39(u8 taskId)
-{
- while (sPhase2_39_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DB098(struct Task *task)
-{
- if (task->data[1] == 0)
- {
- task->data[4] = sub_81DA74C(120, 197, 0, 0, 0, -8, 0);
- }
- else if (task->data[1] == 16)
- {
- task->data[5] = sub_81DA74C(241, 78, 0, 0, -8, 1, 1);
- }
- else if (task->data[1] == 32)
- {
- task->data[6] = sub_81DA74C(-1, 78, 0, 0, 8, 1, 2);
- task->tState++;
- }
-
- task->data[1]++;
- return FALSE;
-}
-
-static bool8 sub_81DB124(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_39));
- }
-
- return FALSE;
-}
-
-void Phase2Task_40(u8 taskId)
-{
- while (sPhase2_40_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DB190(struct Task *task)
-{
- if (task->data[1] == 0)
- {
- task->data[4] = sub_81DA8BC(120, 45, 12, 4, 128, 0, -4, 0);
- }
- else if (task->data[1] == 16)
- {
- task->data[5] = sub_81DA8BC(89, 97, 252, 4, 128, 0, -4, 1);
- }
- else if (task->data[1] == 32)
- {
- task->data[6] = sub_81DA8BC(151, 97, 132, 4, 128, 0, -4, 2);
- task->tState++;
- }
-
- task->data[1]++;
- return FALSE;
-}
-
-static bool8 sub_81DB224(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_40));
- }
-
- return FALSE;
-}
-
-void Phase2Task_41(u8 taskId)
-{
- while (sPhase2_41_Funcs[gTasks[taskId].tState](&gTasks[taskId]));
-}
-
-static bool8 sub_81DB290(struct Task *task)
-{
- if (task->data[1] == 0)
- {
- task->data[4] = sub_81DA8BC(120, 80, 284, 8, 131, 35, -3, 0);
- }
- else if (task->data[1] == 16)
- {
- task->data[5] = sub_81DA8BC(120, 80, 44, 8, 131, 35, -3, 1);
- }
- else if (task->data[1] == 32)
- {
- task->data[6] = sub_81DA8BC(121, 80, 164, 8, 131, 35, -3, 2);
- task->tState++;
- }
-
- task->data[1]++;
- return FALSE;
-}
-
-static bool8 sub_81DB328(struct Task *task)
-{
- if (!gPaletteFade.active)
- {
- sub_81DAA20(task);
- DestroyTask(FindTaskIdByFunc(Phase2Task_41));
- }
-
- return FALSE;
-}
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index e486cd2f8..492a10101 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -296,29 +296,27 @@ static u8 PickWildMonNature(void)
u8 i;
u8 j;
struct Pokeblock *safariPokeblock;
- u8 natures[25];
+ u8 natures[NUM_NATURES];
if (GetSafariZoneFlag() == TRUE && Random() % 100 < 80)
{
safariPokeblock = SafariZoneGetActivePokeblock();
if (safariPokeblock != NULL)
{
- for (i = 0; i < 25; i++)
+ for (i = 0; i < NUM_NATURES; i++)
natures[i] = i;
- for (i = 0; i < 24; i++)
+ for (i = 0; i < NUM_NATURES - 1; i++)
{
- for (j = i + 1; j < 25; j++)
+ for (j = i + 1; j < NUM_NATURES; j++)
{
if (Random() & 1)
{
- u8 temp = natures[i];
-
- natures[i] = natures[j];
- natures[j] = temp;
+ u8 temp;
+ SWAP(natures[i], natures[j], temp);
}
}
}
- for (i = 0; i < 25; i++)
+ for (i = 0; i < NUM_NATURES; i++)
{
if (PokeblockGetGain(natures[i], safariPokeblock) > 0)
return natures[i];
@@ -330,11 +328,11 @@ static u8 PickWildMonNature(void)
&& GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE
&& Random() % 2 == 0)
{
- return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % 25;
+ return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % NUM_NATURES;
}
// random nature
- return Random() % 25;
+ return Random() % NUM_NATURES;
}
static void CreateWildMon(u16 species, u8 level)