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