Merge branch 'master' into doc-overworld
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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[] =
|
||||
const u8 gBattlePalaceNatureToMoveTarget[NUM_NATURES] =
|
||||
{
|
||||
[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,
|
||||
[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 =
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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] =
|
||||
static const u16 sInitialRentalMonRanges[][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},
|
||||
// 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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
// 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
|
||||
|
||||
for (; i < var1; i++)
|
||||
// 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++;
|
||||
// Count the move groups the pokemon has
|
||||
if ((validMoveFlags & 0xF) > 1)
|
||||
numValidMoveGroups++;
|
||||
if ((validMoveFlags & 0xF0) > 0x1F)
|
||||
numValidMoveGroups++;
|
||||
if ((validMoveFlags & 0xF0) > 0x1FF)
|
||||
numValidMoveGroups++;
|
||||
|
||||
if (var2 > 1 || var2 == 0)
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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?");
|
||||
|
||||
@@ -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[] =
|
||||
static const u32 sStatusFlagsForMoveEffects[NUM_MOVE_EFFECTS] =
|
||||
{
|
||||
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
|
||||
[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] =
|
||||
// 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] =
|
||||
{
|
||||
{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}
|
||||
[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[] =
|
||||
// Indices into gBattlePalaceFlavorTextTable
|
||||
static const u8 sBattlePalaceNatureToFlavorTextId[NUM_NATURES] =
|
||||
{
|
||||
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
|
||||
[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);
|
||||
|
||||
@@ -124,28 +124,43 @@ static const u8 sBattleTransitionTable_Trainer[][2] =
|
||||
{B_TRANSITION_SWIRL, B_TRANSITION_RIPPLE}, // Water
|
||||
};
|
||||
|
||||
static const u8 sUnknown_0854FE98[] =
|
||||
// Battle Frontier (excluding Pyramid and Dome, which have their own tables below)
|
||||
static const u8 sBattleTransitionTable_BattleFrontier[] =
|
||||
{
|
||||
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
|
||||
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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
650
src/battle_transition_frontier.c
Normal file
650
src/battle_transition_frontier.c
Normal file
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
80
src/crt0.s
80
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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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] =
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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[];
|
||||
#define TAG_POKEBALL_SELECT 0x1000
|
||||
#define TAG_STARTER_CIRCLE 0x1001
|
||||
|
||||
// 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);
|
||||
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)
|
||||
|
||||
@@ -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}?");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user