summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/apprentice.c17
-rw-r--r--src/battle_ai_script_commands.c70
-rw-r--r--src/battle_ai_switch_items.c16
-rw-r--r--src/battle_anim.c16
-rw-r--r--src/battle_anim_80A5C6C.c60
-rw-r--r--src/battle_anim_80A9C70.c4
-rwxr-xr-xsrc/battle_anim_8170478.c18
-rw-r--r--src/battle_anim_effects_1.c12
-rwxr-xr-xsrc/battle_anim_effects_2.c10
-rwxr-xr-xsrc/battle_anim_effects_3.c813
-rw-r--r--src/battle_anim_utility_funcs.c2
-rw-r--r--src/battle_arena.c8
-rw-r--r--src/battle_bg.c11
-rw-r--r--src/battle_controller_link_opponent.c12
-rw-r--r--src/battle_controller_link_partner.c12
-rw-r--r--src/battle_controller_opponent.c10
-rw-r--r--src/battle_controller_player.c35
-rw-r--r--src/battle_controller_player_partner.c10
-rw-r--r--src/battle_controller_recorded_opponent.c10
-rw-r--r--src/battle_controller_recorded_player.c10
-rw-r--r--src/battle_controller_wally.c10
-rw-r--r--src/battle_controllers.c21
-rw-r--r--src/battle_dome.c40
-rw-r--r--src/battle_factory.c11
-rw-r--r--src/battle_factory_screen.c15
-rw-r--r--src/battle_gfx_sfx_util.c59
-rw-r--r--src/battle_interface.c6
-rw-r--r--src/battle_intro.c20
-rw-r--r--src/battle_main.c158
-rw-r--r--src/battle_message.c15
-rw-r--r--src/battle_palace.c2
-rw-r--r--src/battle_pike.c10
-rw-r--r--src/battle_pyramid.c25
-rw-r--r--src/battle_pyramid_bag.c6
-rw-r--r--src/battle_script_commands.c70
-rw-r--r--src/battle_setup.c13
-rw-r--r--src/battle_tent.c6
-rw-r--r--src/battle_tower.c122
-rw-r--r--src/battle_transition.c6
-rw-r--r--src/battle_tv.c14
-rw-r--r--src/battle_util.c28
-rw-r--r--src/battle_util2.c5
-rw-r--r--src/berry_blender.c16
-rw-r--r--src/berry_fix_program.c18
-rw-r--r--src/berry_tag_screen.c4
-rw-r--r--src/bg.c246
-rw-r--r--src/bike.c2
-rw-r--r--src/blit.c10
-rwxr-xr-xsrc/cable_car.c6
-rw-r--r--src/cable_club.c10
-rw-r--r--src/clock.c11
-rw-r--r--src/contest.c19
-rw-r--r--src/contest_ai.c17
-rw-r--r--src/contest_painting_effects.c771
-rw-r--r--src/credits.c17
-rw-r--r--src/dark.c820
-rw-r--r--src/data/pokemon/base_stats.h862
-rw-r--r--src/data/pokemon/tutor_learnsets.h5783
-rw-r--r--src/daycare.c39
-rw-r--r--src/decompress.c24
-rw-r--r--src/decoration.c8
-rw-r--r--src/dma3_manager.c46
-rw-r--r--src/dragon.c4
-rw-r--r--src/easy_chat.c4
-rw-r--r--src/egg_hatch.c27
-rw-r--r--src/electric.c270
-rw-r--r--src/event_obj_lock.c11
-rw-r--r--src/event_object_movement.c4
-rw-r--r--src/evolution_graphics.c2
-rw-r--r--src/evolution_scene.c63
-rw-r--r--src/field_control_avatar.c78
-rw-r--r--src/field_effect.c23
-rwxr-xr-xsrc/field_effect_helpers.c18
-rwxr-xr-xsrc/field_message_box.c56
-rw-r--r--src/field_player_avatar.c15
-rw-r--r--src/field_poison.c2
-rw-r--r--src/field_screen_effect.c22
-rw-r--r--src/field_special_scene.c32
-rw-r--r--src/field_specials.c147
-rw-r--r--src/fieldmap.c277
-rw-r--r--src/fight.c4
-rw-r--r--src/fldeff_cut.c7
-rw-r--r--src/fldeff_dig.c63
-rw-r--r--src/fldeff_escalator.c13
-rw-r--r--src/fldeff_flash.c4
-rw-r--r--src/fldeff_groundshake.c320
-rw-r--r--src/fldeff_misc.c472
-rw-r--r--src/fldeff_rocksmash.c (renamed from src/rom6.c)52
-rw-r--r--src/fldeff_strength.c2
-rw-r--r--src/fldeff_sweetscent.c9
-rw-r--r--src/fldeff_teleport.c2
-rw-r--r--src/fossil_specials.c561
-rw-r--r--src/frontier_util.c12
-rw-r--r--src/ghost.c6
-rw-r--r--src/gpu_regs.c30
-rw-r--r--src/graphics.c6
-rw-r--r--src/hall_of_fame.c49
-rw-r--r--src/ice.c1531
-rw-r--r--src/intro.c26
-rw-r--r--src/intro_credits_graphics.c12
-rw-r--r--src/item_icon.c4
-rwxr-xr-xsrc/item_menu.c8
-rw-r--r--src/item_menu_icons.c2
-rwxr-xr-xsrc/item_use.c13
-rw-r--r--src/lilycove_lady.c4
-rw-r--r--src/link.c2
-rw-r--r--src/link_rfu.c6
-rw-r--r--src/list_menu.c6
-rw-r--r--src/load_save.c32
-rw-r--r--src/mail.c46
-rw-r--r--src/main_menu.c2
-rw-r--r--src/menu.c92
-rw-r--r--src/menu_helpers.c4
-rw-r--r--src/mirage_tower.c868
-rw-r--r--src/mon_markings.c1
-rw-r--r--src/money.c4
-rw-r--r--src/mossdeep_gym.c3
-rw-r--r--src/naming_screen.c2
-rw-r--r--src/new_game.c5
-rw-r--r--src/overworld.c199
-rw-r--r--src/palette.c2
-rwxr-xr-xsrc/party_menu.c5804
-rw-r--r--src/player_pc.c10
-rw-r--r--src/pokeball.c14
-rw-r--r--src/pokeblock.c13
-rw-r--r--src/pokeblock_feed.c10
-rw-r--r--src/pokedex.c4
-rwxr-xr-xsrc/pokedex_area_screen.c6
-rw-r--r--src/pokemon.c116
-rw-r--r--src/pokemon_animation.c3
-rw-r--r--src/pokemon_icon.c31
-rw-r--r--src/pokemon_size_record.c2
-rw-r--r--src/pokemon_storage_system.c10183
-rw-r--r--src/pokemon_summary_screen.c128
-rw-r--r--src/post_battle_event_funcs.c10
-rw-r--r--src/psychic.c778
-rw-r--r--src/rayquaza_scene.c54
-rw-r--r--src/record_mixing.c771
-rw-r--r--src/recorded_battle.c26
-rw-r--r--src/region_map.c207
-rw-r--r--src/reshow_battle_screen.c4
-rw-r--r--src/rock.c2
-rw-r--r--src/rom_8011DC0.c35
-rw-r--r--src/rom_8034C54.c5
-rwxr-xr-xsrc/roulette_util.c424
-rw-r--r--src/save.c13
-rw-r--r--src/save_location.c19
-rw-r--r--src/scrcmd.c57
-rw-r--r--src/script_menu.c12
-rwxr-xr-xsrc/script_pokemon_util_80F87D8.c10
-rw-r--r--src/secret_base.c13
-rw-r--r--src/smokescreen.c4
-rw-r--r--src/sound.c3
-rw-r--r--src/start_menu.c24
-rw-r--r--src/starter_choose.c6
-rw-r--r--src/text.c9
-rw-r--r--src/title_screen.c16
-rw-r--r--src/trade.c6389
-rw-r--r--src/trainer_pokemon_sprites.c4
-rw-r--r--src/tv.c9
-rw-r--r--src/unk_pokedex_area_screen_helper.c8
-rw-r--r--src/unk_transition.c24
-rw-r--r--src/walda_phrase.c11
-rw-r--r--src/wallclock.c18
-rw-r--r--src/wild_encounter.c24
-rw-r--r--src/window.c78
166 files changed, 33087 insertions, 8392 deletions
diff --git a/src/apprentice.c b/src/apprentice.c
index ec8fea27b..5d636d05d 100644
--- a/src/apprentice.c
+++ b/src/apprentice.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "apprentice.h"
+#include "battle.h"
#include "battle_tower.h"
#include "data2.h"
#include "event_data.h"
@@ -1298,7 +1299,7 @@ static u16 sub_819FF98(u8 arg0)
knownMovesCount = j;
i = 0;
- while (i < 5)
+ while (i <= MAX_MON_MOVES)
{
if (Random() % 2 == 0 || var_24 == TRUE)
{
@@ -1317,7 +1318,7 @@ static u16 sub_819FF98(u8 arg0)
if (knownMovesCount < 5)
j = 0;
else
- j = knownMovesCount - 4;
+ j = knownMovesCount - MAX_MON_MOVES;
for (; j < knownMovesCount; j++)
{
@@ -1331,7 +1332,7 @@ static u16 sub_819FF98(u8 arg0)
}
else
{
- if (knownMovesCount < 5)
+ if (knownMovesCount <= MAX_MON_MOVES)
{
var_24 = TRUE;
continue;
@@ -1340,10 +1341,10 @@ static u16 sub_819FF98(u8 arg0)
{
do
{
- u8 learnsetId = Random() % (knownMovesCount - 4);
+ u8 learnsetId = Random() % (knownMovesCount - MAX_MON_MOVES);
moveId = learnset[learnsetId] & 0x1FF;
valid = TRUE;
- for (j = knownMovesCount - 4; j < knownMovesCount; j++)
+ for (j = knownMovesCount - MAX_MON_MOVES; j < knownMovesCount; j++)
{
if ((learnset[j] & 0x1FF) == moveId)
{
@@ -1400,8 +1401,8 @@ static void GetLatestLearnedMoves(u16 species, u16 *moves)
}
knownMovesCount = i;
- if (knownMovesCount > 4)
- knownMovesCount = 4;
+ if (knownMovesCount > MAX_MON_MOVES)
+ knownMovesCount = MAX_MON_MOVES;
for (j = 0; j < knownMovesCount; j++)
moves[j] = learnset[(i - 1) - j] & 0x1FF;
@@ -1447,7 +1448,7 @@ static void sub_81A0390(u8 arg0)
{
gSaveBlock2Ptr->apprentices[0].party[i].species = 0;
gSaveBlock2Ptr->apprentices[0].party[i].item = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
gSaveBlock2Ptr->apprentices[0].party[i].moves[j] = 0;
}
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index a88189870..6098e2d3a 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -320,7 +320,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
data[i] = 0;
// Conditional score reset, unlike Ruby.
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (defaultScoreMoves & 1)
AI_THINKING_STRUCT->score[i] = 100;
@@ -333,7 +333,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
// Ignore moves that aren't possible to use.
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBitTable[i] & moveLimitations)
AI_THINKING_STRUCT->score[i] = 0;
@@ -424,7 +424,7 @@ static u8 ChooseMoveOrAction_Singles(void)
currentMoveArray[0] = AI_THINKING_STRUCT->score[0];
consideredMoveArray[0] = 0;
- for (i = 1; i < 4; i++)
+ for (i = 1; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[sBattler_AI].moves[i] != MOVE_NONE)
{
@@ -459,7 +459,7 @@ static u8 ChooseMoveOrAction_Doubles(void)
s32 mostViableMovesNo;
s16 mostMovePoints;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (i == sBattler_AI || gBattleMons[i].hp == 0)
{
@@ -506,7 +506,7 @@ static u8 ChooseMoveOrAction_Doubles(void)
mostViableMovesScores[0] = AI_THINKING_STRUCT->score[0];
mostViableMovesIndices[0] = 0;
mostViableMovesNo = 1;
- for (j = 1; j < 4; j++)
+ for (j = 1; j < MAX_MON_MOVES; j++)
{
if (gBattleMons[sBattler_AI].moves[j] != 0)
{
@@ -541,7 +541,7 @@ static u8 ChooseMoveOrAction_Doubles(void)
mostViableTargetsArray[0] = 0;
mostViableTargetsNo = 1;
- for (i = 1; i < 4; i++)
+ for (i = 1; i < MAX_MON_MOVES; i++)
{
if (mostMovePoints == bestMovePointsForTarget[i])
{
@@ -594,7 +594,7 @@ static void BattleAI_DoAIProcessing(void)
{
AI_THINKING_STRUCT->movesetIndex++;
- if (AI_THINKING_STRUCT->movesetIndex < 4 && !(AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK))
+ if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && !(AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK))
AI_THINKING_STRUCT->aiState = AIState_SettingUp;
else
AI_THINKING_STRUCT->aiState++;
@@ -610,7 +610,7 @@ static void RecordLastUsedMoveByTarget(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
break;
@@ -627,7 +627,7 @@ void ClearBattlerMoveHistory(u8 battlerId)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE;
}
@@ -1067,14 +1067,14 @@ static void BattleAICmd_if_user_has_attacking_move(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[sBattler_AI].moves[i] != 0
&& gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0)
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
gAIScriptPtr += 5;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@@ -1084,14 +1084,14 @@ static void BattleAICmd_if_user_has_no_attacking_moves(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[sBattler_AI].moves[i] != 0
&& gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0)
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
gAIScriptPtr += 5;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@@ -1182,7 +1182,7 @@ static void BattleAICmd_get_how_powerful_move_is(void)
gMoveResultFlags = 0;
gCritMultiplier = 1;
- for (checkedMove = 0; checkedMove < 4; checkedMove++)
+ for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
{
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
{
@@ -1207,13 +1207,13 @@ static void BattleAICmd_get_how_powerful_move_is(void)
}
}
- for (checkedMove = 0; checkedMove < 4; checkedMove++)
+ for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
{
if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])
break;
}
- if (checkedMove == 4)
+ if (checkedMove == MAX_MON_MOVES)
AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful.
else
AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.
@@ -1464,7 +1464,7 @@ static void BattleAICmd_get_highest_type_effectiveness(void)
gCritMultiplier = 1;
AI_THINKING_STRUCT->funcResult = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
gBattleMoveDamage = 40;
gCurrentMove = gBattleMons[sBattler_AI].moves[i];
@@ -1765,12 +1765,12 @@ static void BattleAICmd_if_has_move(void)
switch (gAIScriptPtr[1])
{
case AI_USER:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[sBattler_AI].moves[i] == *movePtr)
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
gAIScriptPtr += 8;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
@@ -1783,25 +1783,25 @@ static void BattleAICmd_if_has_move(void)
}
else
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[sBattler_AI ^ BIT_FLANK].moves[i] == *movePtr)
break;
}
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
gAIScriptPtr += 8;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
break;
case AI_TARGET:
case AI_TARGET_PARTNER:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr)
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
gAIScriptPtr += 8;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
@@ -1818,24 +1818,24 @@ static void BattleAICmd_if_doesnt_have_move(void)
{
case AI_USER:
case AI_USER_PARTNER: // UB: no separate check for user partner.
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[sBattler_AI].moves[i] == *movePtr)
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
gAIScriptPtr += 8;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
break;
case AI_TARGET:
case AI_TARGET_PARTNER:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr)
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
gAIScriptPtr += 8;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
@@ -1851,25 +1851,25 @@ static void BattleAICmd_if_has_move_with_effect(void)
{
case AI_USER:
case AI_USER_PARTNER:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2])
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
gAIScriptPtr += 7;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
break;
case AI_TARGET:
case AI_TARGET_PARTNER:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
// UB: checks sBattler_AI instead of gBattlerTarget.
if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
gAIScriptPtr += 7;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
@@ -1885,24 +1885,24 @@ static void BattleAICmd_if_doesnt_have_move_with_effect(void)
{
case AI_USER:
case AI_USER_PARTNER:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if(gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2])
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
gAIScriptPtr += 7;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
break;
case AI_TARGET:
case AI_TARGET_PARTNER:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
gAIScriptPtr += 7;
else
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c
index ad25b483c..a5958ebc6 100644
--- a/src/battle_ai_switch_items.c
+++ b/src/battle_ai_switch_items.c
@@ -49,7 +49,7 @@ static bool8 ShouldSwitchIfWonderGuard(void)
return FALSE;
// Check if Pokemon has a super effective move.
- for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; i++)
+ for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < MAX_MON_MOVES; i++)
{
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
@@ -93,7 +93,7 @@ static bool8 ShouldSwitchIfWonderGuard(void)
GetMonData(&party[i], MON_DATA_SPECIES); // Unused return value.
GetMonData(&party[i], MON_DATA_ALT_ABILITY); // Unused return value.
- for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; j++)
+ for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < MAX_MON_MOVES; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
if (move == MOVE_NONE)
@@ -262,7 +262,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
if (!(gAbsentBattlerFlags & gBitTable[opposingBattler]))
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
@@ -285,7 +285,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
if (!(gAbsentBattlerFlags & gBitTable[opposingBattler]))
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
@@ -400,7 +400,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
{
battlerIn1 = gLastHitBy[gActiveBattler];
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
if (move == 0)
@@ -715,14 +715,14 @@ u8 GetMostSuitableMonToSwitchInto(void)
// Ok, we know the mon has the right typing but does it have at least one super effective move?
if (bestMonId != PARTY_SIZE)
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i);
if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE)
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
return bestMonId; // Has both the typing and at least one super effective move.
invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better.
@@ -757,7 +757,7 @@ u8 GetMostSuitableMonToSwitchInto(void)
if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2))
continue;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
gBattleMoveDamage = 0;
diff --git a/src/battle_anim.c b/src/battle_anim.c
index 1e1219800..7dd1526dd 100644
--- a/src/battle_anim.c
+++ b/src/battle_anim.c
@@ -1605,8 +1605,8 @@ static void ScriptCmd_loadspritegfx(void)
sBattleAnimScriptPtr++;
index = T1_READ_16(sBattleAnimScriptPtr);
- LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
- LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
sBattleAnimScriptPtr += 2;
AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
gAnimFramesToWait = 1;
@@ -1870,7 +1870,7 @@ static void ScriptCmd_monbg(void)
else
toBG_2 = TRUE;
- sub_80A438C(battlerId, toBG_2, FALSE);
+ MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE);
taskId = CreateTask(sub_80A40F4, 10);
gAnimVisualTaskCount++;
gTasks[taskId].data[t1_MONBG_BATTLER] = battlerId;
@@ -1889,7 +1889,7 @@ static void ScriptCmd_monbg(void)
else
toBG_2 = TRUE;
- sub_80A438C(battlerId, toBG_2, FALSE);
+ MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE);
taskId = CreateTask(sub_80A40F4, 10);
gAnimVisualTaskCount++;
gTasks[taskId].data[0] = battlerId;
@@ -1922,7 +1922,7 @@ bool8 IsBattlerSpriteVisible(u8 battlerId)
return FALSE;
}
-void sub_80A438C(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible)
+void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible)
{
struct UnknownAnimStruct2 unknownStruct;
u8 battlerSpriteId;
@@ -2194,7 +2194,7 @@ static void ScriptCmd_monbg_22(void)
else
toBG_2 = TRUE;
- sub_80A438C(battlerId, toBG_2, FALSE);
+ MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE);
}
battlerId ^= BIT_FLANK;
@@ -2206,7 +2206,7 @@ static void ScriptCmd_monbg_22(void)
else
toBG_2 = TRUE;
- sub_80A438C(battlerId, toBG_2, FALSE);
+ MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE);
}
sBattleAnimScriptPtr++;
@@ -2283,7 +2283,7 @@ static void ScriptCmd_setalpha(void)
sBattleAnimScriptPtr++;
half1 = *(sBattleAnimScriptPtr++);
half2 = *(sBattleAnimScriptPtr++) << 8;
- SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2);
}
diff --git a/src/battle_anim_80A5C6C.c b/src/battle_anim_80A5C6C.c
index e17dde078..92815b56c 100644
--- a/src/battle_anim_80A5C6C.c
+++ b/src/battle_anim_80A5C6C.c
@@ -788,7 +788,7 @@ void InitSpritePosToAnimTarget(struct Sprite *sprite, bool8 respectMonPicOffsets
sprite->pos1.y += gBattleAnimArgs[1];
}
-void InitSpritePosToAnimAttacker(struct Sprite *sprite, u8 respectMonPicOffsets)
+void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets)
{
if (!respectMonPicOffsets)
{
@@ -948,7 +948,7 @@ void sub_80A6C68(u32 bgId)
CopyBgTilemapBufferToVram(unkStruct.bgId);
}
-void sub_80A6CC0(u32 bgId, const void *src, u32 tilesOffset)
+void sub_80A6CC0(u32 bgId, const u32 *src, u32 tilesOffset)
{
CpuFill32(0, gUnknown_0202305C, 0x2000);
LZDecompressWram(src, gUnknown_0202305C);
@@ -2092,17 +2092,17 @@ u8 sub_80A8394(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority
return spriteId;
}
-void sub_80A8610(struct Sprite *sprite)
+void DestroySpriteAndFreeResources_(struct Sprite *sprite)
{
DestroySpriteAndFreeResources(sprite);
}
-s16 sub_80A861C(u8 battlerId, u8 a2)
+s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr)
{
u16 species;
u32 personality;
u16 letter;
- u16 var;
+ u16 unownSpecies;
int ret;
const struct MonCoords *coords;
struct BattleSpriteInfo *spriteInfo;
@@ -2123,10 +2123,10 @@ s16 sub_80A861C(u8 battlerId, u8 a2)
{
letter = GET_UNOWN_LETTER(personality);
if (!letter)
- var = SPECIES_UNOWN;
+ unownSpecies = SPECIES_UNOWN;
else
- var = letter + SPECIES_UNOWN_B - 1;
- coords = &gMonBackPicCoords[var];
+ unownSpecies = letter + SPECIES_UNOWN_B - 1;
+ coords = &gMonBackPicCoords[unownSpecies];
}
else if (species == SPECIES_CASTFORM)
{
@@ -2156,16 +2156,17 @@ s16 sub_80A861C(u8 battlerId, u8 a2)
species = spriteInfo[battlerId].transformSpecies;
personality = gTransformedPersonalities[battlerId];
}
+
if (species == SPECIES_UNOWN)
{
letter = GET_UNOWN_LETTER(personality);
if (!letter)
- var = SPECIES_UNOWN;
+ unownSpecies = SPECIES_UNOWN;
else
- var = letter + SPECIES_UNOWN_B - 1;
- coords = &gMonBackPicCoords[var];
+ unownSpecies = letter + SPECIES_UNOWN_B - 1;
+ coords = &gMonBackPicCoords[unownSpecies];
}
- else if (species > SPECIES_EGG)
+ else if (species > NUM_SPECIES)
{
coords = &gMonBackPicCoords[0];
}
@@ -2187,20 +2188,21 @@ s16 sub_80A861C(u8 battlerId, u8 a2)
species = spriteInfo[battlerId].transformSpecies;
personality = gTransformedPersonalities[battlerId];
}
+
if (species == SPECIES_UNOWN)
{
letter = GET_UNOWN_LETTER(personality);
if (!letter)
- var = SPECIES_UNOWN;
+ unownSpecies = SPECIES_UNOWN;
else
- var = letter + SPECIES_UNOWN_B - 1;
- coords = &gMonFrontPicCoords[var];
+ unownSpecies = letter + SPECIES_UNOWN_B - 1;
+ coords = &gMonFrontPicCoords[unownSpecies];
}
else if (species == SPECIES_CASTFORM)
{
coords = &gCastformFrontSpriteCoords[gBattleMonForms[battlerId]];
}
- else if (species > SPECIES_EGG)
+ else if (species > NUM_SPECIES)
{
coords = &gMonFrontPicCoords[0];
}
@@ -2211,22 +2213,22 @@ s16 sub_80A861C(u8 battlerId, u8 a2)
}
}
- switch (a2)
+ switch (attr)
{
- case 0:
+ case BATTLER_COORD_ATTR_HEIGHT:
return (coords->coords & 0xf) * 8;
- case 1:
+ case BATTLER_COORD_ATTR_WIDTH:
return (coords->coords >> 4) * 8;
- case 4:
- return GetBattlerSpriteCoord(battlerId, 2) - ((coords->coords >> 4) * 4);
- case 5:
- return GetBattlerSpriteCoord(battlerId, 2) + ((coords->coords >> 4) * 4);
- case 2:
- return GetBattlerSpriteCoord(battlerId, 3) - ((coords->coords & 0xf) * 4);
- case 3:
- return GetBattlerSpriteCoord(battlerId, 3) + ((coords->coords & 0xf) * 4);
- case 6:
- ret = GetBattlerSpriteCoord(battlerId, 1) + 0x1f;
+ case BATTLER_COORD_ATTR_LEFT:
+ return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - ((coords->coords >> 4) * 4);
+ case BATTLER_COORD_ATTR_RIGHT:
+ return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + ((coords->coords >> 4) * 4);
+ case BATTLER_COORD_ATTR_TOP:
+ return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - ((coords->coords & 0xf) * 4);
+ case BATTLER_COORD_ATTR_BOTTOM:
+ return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + ((coords->coords & 0xf) * 4);
+ case BATTLER_COORD_ATTR_RAW_BOTTOM:
+ ret = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 31;
return ret - coords->y_offset;
default:
return 0;
diff --git a/src/battle_anim_80A9C70.c b/src/battle_anim_80A9C70.c
index 2eea276a1..001f99d7f 100644
--- a/src/battle_anim_80A9C70.c
+++ b/src/battle_anim_80A9C70.c
@@ -71,8 +71,8 @@ u8 sub_80A9C70(u8 battlerId, bool8 b)
u8 spriteId2;
u8 i;
- LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);
- LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);
gTasks[taskId].data[0] = battlerId;
if (b)
{
diff --git a/src/battle_anim_8170478.c b/src/battle_anim_8170478.c
index 32214b58d..5b7a4ec1c 100755
--- a/src/battle_anim_8170478.c
+++ b/src/battle_anim_8170478.c
@@ -388,7 +388,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_085E535C =
};
extern const struct SpriteTemplate gUnknown_085CE388;
-extern const struct SpriteTemplate gUnknown_085CE3A0;
+extern const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate;
void unref_sub_8170478(u8 taskId)
{
@@ -1376,8 +1376,8 @@ static void sub_8171D60(u8 ballId)
if (GetSpriteTileStartByTag(gBallOpenParticleSpritesheets[ballId].tag) == 0xFFFF)
{
- LoadCompressedObjectPicUsingHeap(&gBallOpenParticleSpritesheets[ballId]);
- LoadCompressedObjectPaletteUsingHeap(&gBallOpenParticlePalettes[ballId]);
+ LoadCompressedSpriteSheetUsingHeap(&gBallOpenParticleSpritesheets[ballId]);
+ LoadCompressedSpritePaletteUsingHeap(&gBallOpenParticlePalettes[ballId]);
}
}
@@ -2032,8 +2032,8 @@ void sub_8172EF0(u8 battler, struct Pokemon *mon)
{
if (GetSpriteTileStartByTag(0x27F9) == 0xFFFF)
{
- LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[233]);
- LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[233]);
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[233]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[233]);
}
taskId1 = CreateTask(sub_8172FEC, 10);
@@ -2081,12 +2081,12 @@ static void sub_8172FEC(u8 taskId)
}
else if (state >= 0 && gTasks[taskId].data[11] < 4)
{
- spriteId = CreateSprite(&gUnknown_085CE3A0, x, y, 5);
+ spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5);
gSprites[spriteId].oam.tileNum += 4;
}
else
{
- spriteId = CreateSprite(&gUnknown_085CE3A0, x, y, 5);
+ spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5);
gSprites[spriteId].oam.tileNum += 5;
}
@@ -2173,8 +2173,8 @@ void sub_81732B0(u8 taskId)
{
u8 paletteIndex;
- LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[269]);
- LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[269]);
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[269]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[269]);
paletteIndex = IndexOfSpritePaletteTag(0x281D); // unused
DestroyAnimVisualTask(taskId);
}
diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c
index e37d2b5b8..25eb14637 100644
--- a/src/battle_anim_effects_1.c
+++ b/src/battle_anim_effects_1.c
@@ -3297,8 +3297,8 @@ void sub_80FFFC0(u8 taskId)
task->data[4] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1;
task->data[6] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
- task->data[10] = sub_80A861C(gBattleAnimTarget, 1);
- task->data[11] = sub_80A861C(gBattleAnimTarget, 0);
+ task->data[10] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH);
+ task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT);
task->data[5] = (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) ? 1 : -1;
task->data[9] = 56 - (task->data[5] * 64);
task->data[8] = task->data[7] - task->data[9] + task->data[6];
@@ -5452,11 +5452,11 @@ static void sub_81030B0(struct Sprite* sprite)
void sub_810310C(u8 battler, struct Sprite* sprite)
{
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
- sprite->pos1.x = sub_80A861C(battler, 5) + 8;
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8;
else
- sprite->pos1.x = sub_80A861C(battler, 4) - 8;
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;
- sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) - (s16)sub_80A861C(battler, 0) / 4;
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;
}
void sub_8103164(struct Sprite* sprite)
@@ -5520,7 +5520,7 @@ void sub_8103284(struct Sprite* sprite)
battler = gBattleAnimTarget;
sprite->pos1.x = GetBattlerSpriteCoord(battler, 0);
- sprite->pos1.y = sub_80A861C(battler, 2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP);
if (sprite->pos1.y <= 9)
sprite->pos1.y = 10;
diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c
index 8acbf62d4..8306ada1c 100755
--- a/src/battle_anim_effects_2.c
+++ b/src/battle_anim_effects_2.c
@@ -2446,7 +2446,7 @@ void sub_8104E74(u8 taskId)
task->data[3] = 0;
task->data[4] = 0;
task->data[5] = 0;
- task->data[15] = sub_80A861C(gBattleAnimTarget, 0);
+ task->data[15] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT);
if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)
{
@@ -2531,7 +2531,7 @@ void sub_810501C(struct Sprite *sprite)
sprite->data[2] = 0;
sprite->data[3] = 16;
sprite->data[4] = 0;
- sprite->data[5] = sub_80A861C(gBattleAnimTarget, 0) + 2;
+ sprite->data[5] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) + 2;
sprite->data[6] = BattleAnimAdjustPanning(63);
sprite->callback = sub_8105078;
}
@@ -3134,7 +3134,7 @@ void sub_8105EB0(u8 taskId)
SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);
SetGpuReg(REG_OFFSET_WININ, 0x3F1F);
SetGpuReg(REG_OFFSET_WINOUT, 0x3F3F);
- SetGpuReg(REG_OFFSET_BLDCNT, 0xC8);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN);
SetGpuReg(REG_OFFSET_BLDY, 0x10);
gTasks[taskId].data[0] = win0v;
gTasks[taskId].data[1] = win0h;
@@ -3390,8 +3390,8 @@ void sub_81064F8(u8 taskId)
else
sub_80A6D60(&unknownStruct, &gBattleAnimBackgroundTilemap_ScaryFaceOpponent, 0);
- sub_80A6CC0(unknownStruct.bgId, &gUnknown_08C249F8, unknownStruct.tilesOffset);
- LoadCompressedPalette(&gUnknown_08C249D0, unknownStruct.unk8 << 4, 32);
+ sub_80A6CC0(unknownStruct.bgId, gUnknown_08C249F8, unknownStruct.tilesOffset);
+ LoadCompressedPalette(gUnknown_08C249D0, unknownStruct.unk8 << 4, 32);
gTasks[taskId].func = sub_81065EC;
}
diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c
index d887eeabf..018cc48e4 100755
--- a/src/battle_anim_effects_3.c
+++ b/src/battle_anim_effects_3.c
@@ -22,6 +22,7 @@
#include "constants/rgb.h"
#include "constants/songs.h"
#include "constants/species.h"
+#include "constants/weather.h"
extern u8 sub_807521C(s16 x, s16 y, u8 a3);
extern void sub_810E2C8(struct Sprite *);
@@ -45,7 +46,7 @@ void sub_815ACD0(struct Sprite *);
void sub_815B27C(struct Sprite *);
void sub_815B394(struct Sprite *);
void sub_815B49C(struct Sprite *);
-void sub_815B570(struct Sprite *);
+void AnimMiniTwinklingStar(struct Sprite *);
void sub_815B70C(struct Sprite *);
void sub_815BE04(struct Sprite *);
void sub_815C400(struct Sprite *);
@@ -61,15 +62,15 @@ void sub_815E01C(struct Sprite *);
void sub_815E404(struct Sprite *);
void sub_815E444(struct Sprite *);
void sub_815E6D8(struct Sprite *);
-void sub_815E954(struct Sprite *);
-void sub_815EA14(struct Sprite *);
-void sub_815EE84(struct Sprite *);
-void sub_815F18C(struct Sprite *);
-void sub_815F48C(struct Sprite *);
+void AnimSmellingSaltExclamation(struct Sprite *);
+void AnimHelpingHandClap(struct Sprite *);
+void AnimForesightMagnifyingGlass(struct Sprite *);
+void AnimMeteorMashStar(struct Sprite *);
+void AnimBlockX(struct Sprite *);
void sub_815FE80(struct Sprite *);
void sub_81061C4(struct Sprite *);
-void sub_8160338(struct Sprite *);
-void sub_81603A8(struct Sprite *);
+void AnimKnockOffStrike(struct Sprite *);
+void AnimRecycle(struct Sprite *);
static void sub_815A114(struct Sprite *);
static void sub_815A1F4(struct Sprite *);
static void sub_815A234(struct Sprite *);
@@ -111,15 +112,18 @@ static void sub_815E20C(u8);
static void sub_815E34C(s16, s16, s16, s16, u8, u8, s16 *, s16 *);
static void sub_815E5CC(u8);
static void sub_815E784(struct Sprite *);
-static void sub_815E898(u8);
-static void sub_815E9BC(struct Sprite *);
-static void sub_815EA60(struct Sprite *);
-static void sub_815ECE4(u8);
-static void sub_815EF08(struct Sprite *);
-static void sub_815F330(u8);
-static void sub_815F4F0(struct Sprite *);
-static void sub_815F79C(u8);
-static void sub_815F7C4(struct Sprite *);
+static void AnimTask_SmellingSaltSquishStep(u8);
+static void AnimSmellingSaltExclamationStep(struct Sprite *);
+static void AnimHelpingHandClapStep(struct Sprite *);
+static void AnimTask_HelpingHandAttackerMovementStep(u8);
+static void AnimForesightMagnifyingGlassStep(struct Sprite *);
+static void AnimTask_MonToSubstituteDoll(u8);
+static void AnimBlockXStep(struct Sprite *);
+static void AnimTask_OdorSleuthMovementWaitFinish(u8);
+static void MoveOdorSleuthClone(struct Sprite *);
+static void AnimTask_TeeterDanceMovementStep(u8);
+static void AnimRecycleStep(struct Sprite *);
+static void AnimTask_SlackOffSquishStep(u8);
const union AnimCmd gUnknown_085CE004[] =
{
@@ -535,7 +539,7 @@ const struct SpriteTemplate gUnknown_085CE388 =
.callback = sub_815B49C,
};
-const struct SpriteTemplate gUnknown_085CE3A0 =
+const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate =
{
.tileTag = ANIM_TAG_GOLD_STARS,
.paletteTag = ANIM_TAG_GOLD_STARS,
@@ -543,7 +547,7 @@ const struct SpriteTemplate gUnknown_085CE3A0 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_815B570,
+ .callback = AnimMiniTwinklingStar,
};
const union AffineAnimCmd gUnknown_085CE3B8[] =
@@ -589,9 +593,9 @@ const union AffineAnimCmd gUnknown_085CE430[] =
const s8 gUnknown_085CE460[] =
{
- 0xE8,
- 0x18,
- 0xFC,
+ 0xE8,
+ 0x18,
+ 0xFC,
0x00,
};
@@ -995,14 +999,14 @@ const struct SpriteTemplate gUnknown_085CE864 =
.callback = sub_815E6D8,
};
-const union AffineAnimCmd gUnknown_085CE87C[] =
+const union AffineAnimCmd gSmellingSaltSquishAffineAnimCmds[] =
{
AFFINEANIMCMD_FRAME(0, -16, 0, 6),
AFFINEANIMCMD_FRAME(0, 16, 0, 6),
AFFINEANIMCMD_END,
};
-const struct SpriteTemplate gUnknown_085CE894 =
+const struct SpriteTemplate gSmellingSaltExclamationSpriteTemplate =
{
.tileTag = ANIM_TAG_SMELLINGSALT_EFFECT,
.paletteTag = ANIM_TAG_SMELLINGSALT_EFFECT,
@@ -1010,10 +1014,10 @@ const struct SpriteTemplate gUnknown_085CE894 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_815E954,
+ .callback = AnimSmellingSaltExclamation,
};
-const struct SpriteTemplate gUnknown_085CE8AC =
+const struct SpriteTemplate gHelpingHandClapSpriteTemplate =
{
.tileTag = ANIM_TAG_TAG_HAND,
.paletteTag = ANIM_TAG_TAG_HAND,
@@ -1021,10 +1025,10 @@ const struct SpriteTemplate gUnknown_085CE8AC =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_815EA14,
+ .callback = AnimHelpingHandClap,
};
-const struct SpriteTemplate gUnknown_085CE8C4 =
+const struct SpriteTemplate gForesightMagnifyingGlassSpriteTemplate =
{
.tileTag = ANIM_TAG_MAGNIFYING_GLASS,
.paletteTag = ANIM_TAG_MAGNIFYING_GLASS,
@@ -1032,10 +1036,10 @@ const struct SpriteTemplate gUnknown_085CE8C4 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_815EE84,
+ .callback = AnimForesightMagnifyingGlass,
};
-const struct SpriteTemplate gUnknown_085CE8DC =
+const struct SpriteTemplate gMeteorMashStarSpriteTemplate =
{
.tileTag = ANIM_TAG_GOLD_STARS,
.paletteTag = ANIM_TAG_GOLD_STARS,
@@ -1043,7 +1047,7 @@ const struct SpriteTemplate gUnknown_085CE8DC =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_815F18C,
+ .callback = AnimMeteorMashStar,
};
const struct SpriteTemplate gUnknown_085CE8F4 =
@@ -1057,7 +1061,7 @@ const struct SpriteTemplate gUnknown_085CE8F4 =
.callback = sub_81061C4,
};
-const struct SpriteTemplate gUnknown_085CE90C =
+const struct SpriteTemplate gBlockXSpriteTemplate =
{
.tileTag = ANIM_TAG_X_SIGN,
.paletteTag = ANIM_TAG_X_SIGN,
@@ -1065,7 +1069,7 @@ const struct SpriteTemplate gUnknown_085CE90C =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_815F48C,
+ .callback = AnimBlockX,
};
const struct SpriteTemplate gUnknown_085CE924 =
@@ -1079,72 +1083,72 @@ const struct SpriteTemplate gUnknown_085CE924 =
.callback = sub_815FE80,
};
-const union AnimCmd gUnknown_085CE93C[] =
+const union AnimCmd gKnockOffStrikeAnimCmds[] =
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(64, 4),
ANIMCMD_END,
};
-const union AnimCmd *const gUnknown_085CE948[] =
+const union AnimCmd *const gKnockOffStrikeAnimTable[] =
{
- gUnknown_085CE93C,
+ gKnockOffStrikeAnimCmds,
};
-const union AffineAnimCmd gUnknown_085CE94C[] =
+const union AffineAnimCmd gKnockOffStrikeAffineanimCmds1[] =
{
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, -4, 8),
AFFINEANIMCMD_END,
};
-const union AffineAnimCmd gUnknown_085CE964[] =
+const union AffineAnimCmd gKnockOffStrikeAffineanimCmds2[] =
{
AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, 4, 8),
AFFINEANIMCMD_END,
};
-const union AffineAnimCmd *const gUnknown_085CE97C[] =
+const union AffineAnimCmd *const gKnockOffStrikeAffineAnimTable[] =
{
- gUnknown_085CE94C,
- gUnknown_085CE964,
+ gKnockOffStrikeAffineanimCmds1,
+ gKnockOffStrikeAffineanimCmds2,
};
-const struct SpriteTemplate gUnknown_085CE984 =
+const struct SpriteTemplate gKnockOffStrikeSpriteTemplate =
{
.tileTag = ANIM_TAG_SLAM_HIT_2,
.paletteTag = ANIM_TAG_SLAM_HIT_2,
.oam = &gUnknown_0852497C,
- .anims = gUnknown_085CE948,
+ .anims = gKnockOffStrikeAnimTable,
.images = NULL,
- .affineAnims = gUnknown_085CE97C,
- .callback = sub_8160338,
+ .affineAnims = gKnockOffStrikeAffineAnimTable,
+ .callback = AnimKnockOffStrike,
};
-const union AffineAnimCmd gUnknown_085CE99C[] =
+const union AffineAnimCmd gRecycleSpriteAffineAnimCmds[] =
{
AFFINEANIMCMD_FRAME(0, 0, -4, 64),
AFFINEANIMCMD_JUMP(0),
};
-const union AffineAnimCmd *const gUnknown_085CE9AC[] =
+const union AffineAnimCmd *const gRecycleSpriteAffineAnimTable[] =
{
- gUnknown_085CE99C,
+ gRecycleSpriteAffineAnimCmds,
};
-const struct SpriteTemplate gUnknown_085CE9B0 =
+const struct SpriteTemplate gRecycleSpriteTemplate =
{
.tileTag = ANIM_TAG_RECYCLE,
.paletteTag = ANIM_TAG_RECYCLE,
.oam = &gUnknown_08524A9C,
.anims = gDummySpriteAnimTable,
.images = NULL,
- .affineAnims = gUnknown_085CE9AC,
- .callback = sub_81603A8,
+ .affineAnims = gRecycleSpriteAffineAnimTable,
+ .callback = AnimRecycle,
};
-const union AffineAnimCmd gUnknown_085CE9C8[] =
+const union AffineAnimCmd gSlackOffSquishAffineAnimCmds[] =
{
AFFINEANIMCMD_FRAME(0, 16, 0, 4),
AFFINEANIMCMD_FRAME(-2, 0, 0, 8),
@@ -1450,11 +1454,9 @@ void sub_815A7B0(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
-// This is likely fakematching due to some strange type casting behavior.
void sub_815A7EC(struct Sprite *sprite)
{
int var0;
- int var1;
if (sprite->data[0] == 0)
{
SetSpriteCoordsToAnimAttackerCoords(sprite);
@@ -1468,16 +1470,13 @@ void sub_815A7EC(struct Sprite *sprite)
}
else
{
- var1 = -gBattleAnimArgs[2];
- sprite->data[1] = var1;
- var1 = -gBattleAnimArgs[3];
- sprite->data[2] = var1;
+ sprite->data[1] = -1 * gBattleAnimArgs[2];
+ sprite->data[2] = -1 * gBattleAnimArgs[3];
}
}
else
{
- var1 = -gBattleAnimArgs[2];
- sprite->data[1] = var1;
+ sprite->data[1] = -1 * gBattleAnimArgs[2];
sprite->data[2] = gBattleAnimArgs[3];
}
}
@@ -1486,8 +1485,8 @@ void sub_815A7EC(struct Sprite *sprite)
var0 = (sprite->data[0] * 20) & 0xFF;
sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2];
- sprite->pos2.x = (sprite->data[3] + (s32)((u32)sprite->data[3] >> 31)) >> 1;
- sprite->pos2.y = Sin(var0 & 0xFF, 5) + ((s32)(sprite->data[4] + ((u32)sprite->data[4] >> 31)) >> 1);
+ sprite->pos2.x = sprite->data[3] / 2;
+ sprite->pos2.y = Sin(var0 & 0xFF, 5) + (sprite->data[4] / 2);
if ((u16)(sprite->pos1.x + sprite->pos2.x) > 240)
DestroyAnimSprite(sprite);
@@ -1688,7 +1687,6 @@ void sub_815AC8C(u8 taskId)
void sub_815ACD0(struct Sprite *sprite)
{
- int var0;
if (gBattleAnimArgs[0] == 0)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[1];
@@ -1701,11 +1699,8 @@ void sub_815ACD0(struct Sprite *sprite)
}
sprite->pos2.y = gBattleAnimArgs[2];
- var0 = 0;
- if (sprite->pos2.y > gBattleAnimArgs[3])
- var0 = 1;
- sprite->data[0] = var0;
+ sprite->data[0] = (sprite->pos2.y > gBattleAnimArgs[3]);
sprite->data[1] = 0;
sprite->data[2] = gBattleAnimArgs[4];
sprite->data[3] = gBattleAnimArgs[5];
@@ -1846,7 +1841,7 @@ static void sub_815AED8(u8 taskId)
if (task->data[7])
task->data[12] = task->data[8];
else
- task->data[12] = task->data[9];
+ task->data[12] = task->data[9];
}
i = task->data[0];
@@ -2113,7 +2108,7 @@ static void sub_815B4D4(struct Sprite *sprite)
if (++sprite->data[2] % 3 == 0)
{
CreateSpriteAndAnimate(
- &gUnknown_085CE3A0,
+ &gMiniTwinklingStarSpriteTemplate,
sprite->pos1.x + sprite->pos2.x,
sprite->pos1.y + sprite->pos2.y,
sprite->subpriority + 1);
@@ -2124,7 +2119,7 @@ static void sub_815B4D4(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
-void sub_815B570(struct Sprite *sprite)
+void AnimMiniTwinklingStar(struct Sprite *sprite)
{
u8 rand;
s8 y;
@@ -2388,8 +2383,8 @@ void sub_815BB84(u8 taskId)
gBattle_BG1_Y = 0;
}
- sub_80A6CC0(unknownStruct.bgId, &gUnknown_08C2A634, unknownStruct.tilesOffset);
- LoadCompressedPalette(&gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32);
+ sub_80A6CC0(unknownStruct.bgId, gUnknown_08C2A634, unknownStruct.tilesOffset);
+ LoadCompressedPalette(gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32);
gTasks[taskId].data[10] = gBattle_BG1_X;
gTasks[taskId].data[11] = gBattle_BG1_Y;
@@ -2403,7 +2398,7 @@ void sub_815BB84(u8 taskId)
gTasks[taskId].data[4] = 0;
if (++gTasks[taskId].data[1] > 12)
gTasks[taskId].data[1] = 12;
-
+
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
if (gTasks[taskId].data[1] == 12)
@@ -2459,7 +2454,7 @@ void sub_815BE04(struct Sprite *sprite)
xOffset &= 0x3F;
if (xOffset > 31)
xOffset = 32 - xOffset;
-
+
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + xOffset;
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 32;
sprite->data[1] = gBattleAnimArgs[0];
@@ -2490,7 +2485,7 @@ static void sub_815BF44(struct Sprite *sprite)
{
int var0;
s8 var1;
-
+
var0 = (u16)sprite->data[2] + (u16)sprite->data[3];
var1 = var0 >> 8;
sprite->pos2.y -= var1;
@@ -2531,7 +2526,7 @@ static void sub_815C050(struct Sprite *sprite)
register u16 d3 asm("r1");
int var0;
s8 var1;
-
+
if (!sprite->invisible)
{
d2 = sprite->data[2];
@@ -2594,8 +2589,8 @@ void sub_815C0A4(u8 taskId)
gBattle_BG1_Y = 0;
}
- sub_80A6CC0(unknownStruct.bgId, &gUnknown_08C2A634, unknownStruct.tilesOffset);
- LoadCompressedPalette(&gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32);
+ sub_80A6CC0(unknownStruct.bgId, gUnknown_08C2A634, unknownStruct.tilesOffset);
+ LoadCompressedPalette(gUnknown_08C2A6D4, unknownStruct.unk8 << 4, 32);
gTasks[taskId].data[10] = gBattle_BG1_X;
gTasks[taskId].data[11] = gBattle_BG1_Y;
gTasks[taskId].data[0]++;
@@ -2637,7 +2632,7 @@ void sub_815C0A4(u8 taskId)
sub_80A6C68(unknownStruct.bgId);
if (!IsContest())
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
-
+
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
gBattle_BG1_X = 0;
gBattle_BG1_Y = 0;
@@ -2893,7 +2888,7 @@ static void sub_815C7C4(u8 taskId)
SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);
SetBattlerSpriteYOffsetFromRotation(task->data[15]);
gSprites[task->data[15]].pos2.x = -(((temp = task->data[2]) >= 0 ? task->data[2] : temp + 63) >> 6);
-
+
if (++task->data[1] > 8)
{
if (task->data[12])
@@ -3143,8 +3138,6 @@ static void sub_815CDFC(struct Sprite *sprite)
}
}
-
-
extern void sub_815D160(u8);
void sub_815CED8(u8 taskId)
@@ -3220,7 +3213,7 @@ void sub_815CED8(u8 taskId)
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
FillPalette(RGB(31, 31, 31), (gSprites[spriteId].oam.paletteNum << 4) + 0x100, 32);
gSprites[spriteId].oam.priority = priority;
- SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
gTasks[taskId].data[0] = spriteId;
@@ -3253,7 +3246,7 @@ static void sub_815D1BC(u8 taskId)
if (++gTasks[taskId].data[12] == 9)
{
sub_80A749C(&gSprites[spriteId]);
- sub_80A8610(&gSprites[spriteId]);
+ DestroySpriteAndFreeResources_(&gSprites[spriteId]);
gTasks[taskId].func = sub_80A6814;
}
}
@@ -3679,7 +3672,7 @@ void sub_815DCA4(u8 taskId)
if (!gBattleAnimArgs[1])
DestroyAnimVisualTask(taskId);
-
+
task->data[0] = 0;
task->data[1] = 0;
task->data[2] = 0;
@@ -3801,7 +3794,7 @@ static void sub_815DF64(u8 taskId)
BlendPalette(gTasks[taskId].data[2], 16, 8, gUnknown_085CE784[gTasks[taskId].data[0]]);
if (++gTasks[taskId].data[0] > 23)
gTasks[taskId].data[0] = 0;
-
+
gTasks[taskId].data[1]--;
}
else
@@ -3831,7 +3824,7 @@ void sub_815E01C(struct Sprite *sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
-
+
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[0];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[1];
if (gBattleAnimArgs[2] == 0)
@@ -3888,11 +3881,11 @@ void sub_815E114(u8 taskId)
}
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
- task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + sub_80A861C(gBattleAnimAttacker, 0) / 4;
+ task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;
else
- task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - sub_80A861C(gBattleAnimAttacker, 0) / 4;
+ task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;
- task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - sub_80A861C(gBattleAnimAttacker, 0) / 4;
+ task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;
task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
task->func = sub_815E20C;
@@ -4019,7 +4012,7 @@ void sub_815E47C(u8 taskId)
task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
- task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + sub_80A861C(gBattleAnimTarget, 0) / 4;
+ task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) / 4;
task->data[15] = CreateSprite(&gUnknown_085CE84C, task->data[11], task->data[12], GetBattlerSpriteSubpriority(gBattleAnimTarget) - 5);
if (task->data[15] != MAX_SPRITES)
{
@@ -4030,7 +4023,7 @@ void sub_815E47C(u8 taskId)
InitAnimArcTranslation(&gSprites[task->data[15]]);
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
StartSpriteAffineAnim(&gSprites[task->data[15]], 1);
-
+
task->func = sub_815E5CC;
}
else
@@ -4098,11 +4091,11 @@ void sub_815E6D8(struct Sprite *sprite)
if (gBattleAnimArgs[1] == 0)
{
sprite->oam.matrixNum |= 0x8;
- sprite->pos1.x = sub_80A861C(battler, 4) - 8;
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;
}
else
{
- sprite->pos1.x = sub_80A861C(battler, 5) + 8;
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8;
}
sprite->callback = sub_815E784;
@@ -4154,9 +4147,12 @@ static void sub_815E784(struct Sprite *sprite)
}
}
-void sub_815E840(u8 taskId)
+// Squishes the mon horizontally a few times.
+// arg 0: which mon
+// arg 1: number of squishes
+void AnimTask_SmellingSaltSquish(u8 taskId)
{
- if (gBattleAnimArgs[0] == 0)
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
DestroyAnimVisualTask(taskId);
}
@@ -4164,12 +4160,12 @@ void sub_815E840(u8 taskId)
{
gTasks[taskId].data[0] = gBattleAnimArgs[1];
gTasks[taskId].data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
- PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gUnknown_085CE87C);
- gTasks[taskId].func = sub_815E898;
+ PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gSmellingSaltSquishAffineAnimCmds);
+ gTasks[taskId].func = AnimTask_SmellingSaltSquishStep;
}
}
-static void sub_815E898(u8 taskId)
+static void AnimTask_SmellingSaltSquishStep(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -4187,7 +4183,7 @@ static void sub_815E898(u8 taskId)
gSprites[task->data[15]].pos2.x = 0;
if (--task->data[0])
{
- PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gUnknown_085CE87C);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], gSmellingSaltSquishAffineAnimCmds);
task->data[1] = 0;
task->data[2] = 0;
}
@@ -4198,17 +4194,21 @@ static void sub_815E898(u8 taskId)
}
}
-void sub_815E954(struct Sprite *sprite)
+// Blinks an exclamation image over the mon a few times.
+// arg 0: which mon
+// arg 1: blink delay
+// arg 2: number of blinks
+void AnimSmellingSaltExclamation(struct Sprite *sprite)
{
- if (gBattleAnimArgs[0] == 0)
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
- sprite->pos1.y = sub_80A861C(gBattleAnimAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP);
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
- sprite->pos1.y = sub_80A861C(gBattleAnimTarget, 2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP);
}
if (sprite->pos1.y < 8)
@@ -4218,10 +4218,10 @@ void sub_815E954(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[1];
sprite->data[2] = 0;
sprite->data[3] = gBattleAnimArgs[2];
- sprite->callback = sub_815E9BC;
+ sprite->callback = AnimSmellingSaltExclamationStep;
}
-static void sub_815E9BC(struct Sprite *sprite)
+static void AnimSmellingSaltExclamationStep(struct Sprite *sprite)
{
if (++sprite->data[0] >= sprite->data[1])
{
@@ -4233,11 +4233,14 @@ static void sub_815E9BC(struct Sprite *sprite)
}
}
-void sub_815EA14(struct Sprite *sprite)
+// Claps a hand several times.
+// arg 0: which hand
+// arg 1:
+void AnimHelpingHandClap(struct Sprite *sprite)
{
if (gBattleAnimArgs[0] == 0)
{
- sprite->oam.matrixNum |= 0x8;
+ sprite->oam.matrixNum |= 0x8; // horizontal flip
sprite->pos1.x = 100;
sprite->data[7] = 1;
}
@@ -4248,10 +4251,10 @@ void sub_815EA14(struct Sprite *sprite)
}
sprite->pos1.y = 56;
- sprite->callback = sub_815EA60;
+ sprite->callback = AnimHelpingHandClapStep;
}
-static void sub_815EA60(struct Sprite *sprite)
+static void AnimHelpingHandClapStep(struct Sprite *sprite)
{
switch (sprite->data[0])
{
@@ -4303,7 +4306,7 @@ static void sub_815EA60(struct Sprite *sprite)
sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3);
if (sprite->data[1] == 15)
sprite->oam.tileNum += 16;
-
+
if (sprite->data[1] == 18)
{
sprite->data[1] = 0;
@@ -4334,7 +4337,9 @@ static void sub_815EA60(struct Sprite *sprite)
}
}
-void sub_815EC48(u8 taskId)
+// Repeatedly moves the attacking mon in a horizontal lunging motion.
+// No args.
+void AnimTask_HelpingHandAttackerMovement(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -4363,10 +4368,10 @@ void sub_815EC48(u8 taskId)
task->data[14] = 1;
}
- task->func = sub_815ECE4;
+ task->func = AnimTask_HelpingHandAttackerMovementStep;
}
-static void sub_815ECE4(u8 taskId)
+static void AnimTask_HelpingHandAttackerMovementStep(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -4448,9 +4453,11 @@ static void sub_815ECE4(u8 taskId)
}
}
-void sub_815EE84(struct Sprite *sprite)
+// Moves a magnifying glass around in straight lines.
+// arg 0: magnifying glass target mon
+void AnimForesightMagnifyingGlass(struct Sprite *sprite)
{
- if (gBattleAnimArgs[0] == 0)
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
{
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[7] = gBattleAnimAttacker;
@@ -4461,14 +4468,14 @@ void sub_815EE84(struct Sprite *sprite)
}
if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT)
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = 8; // horizontal flip
sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);
sprite->oam.objMode = ST_OAM_OBJ_BLEND;
- sprite->callback = sub_815EF08;
+ sprite->callback = AnimForesightMagnifyingGlassStep;
}
-static void sub_815EF08(struct Sprite *sprite)
+static void AnimForesightMagnifyingGlassStep(struct Sprite *sprite)
{
u16 x, y;
@@ -4481,20 +4488,20 @@ static void sub_815EF08(struct Sprite *sprite)
sprite->data[6] = 0;
case 0:
case 4:
- x = sub_80A861C(sprite->data[7], 5) - 4;
- y = sub_80A861C(sprite->data[7], 3) - 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4;
break;
case 1:
- x = sub_80A861C(sprite->data[7], 5) - 4;
- y = sub_80A861C(sprite->data[7], 2) + 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) + 4;
break;
case 2:
- x = sub_80A861C(sprite->data[7], 4) + 4;
- y = sub_80A861C(sprite->data[7], 3) - 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4;
break;
case 3:
- x = sub_80A861C(sprite->data[7], 4) + 4;
- y = sub_80A861C(sprite->data[7], 2) - 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) - 4;
break;
case 5:
x = GetBattlerSpriteCoord(sprite->data[7], 2);
@@ -4570,28 +4577,34 @@ static void sub_815EF08(struct Sprite *sprite)
}
}
-static void sub_815F10C(struct Sprite *sprite)
+static void AnimMeteorMashStarStep(struct Sprite *sprite)
{
sprite->pos2.x = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4];
sprite->pos2.y = ((sprite->data[3] - sprite->data[1]) * sprite->data[5]) / sprite->data[4];
if (!(sprite->data[5] & 1))
{
CreateSprite(
- &gUnknown_085CE3A0,
+ &gMiniTwinklingStarSpriteTemplate,
sprite->pos1.x + sprite->pos2.x,
sprite->pos1.y + sprite->pos2.y, 5);
}
-
+
if (sprite->data[5] == sprite->data[4])
DestroyAnimSprite(sprite);
sprite->data[5]++;
}
-void sub_815F18C(struct Sprite *sprite)
+// Moves a shooting star across the screen that leaves little twinkling stars behind its path.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: destination x pixel offset
+// arg 3: destination y pixel offset
+// arg 4: duration
+void AnimMeteorMashStar(struct Sprite *sprite)
{
- GetBattlerSpriteCoord(gBattleAnimTarget, 2); // unused local variable
- GetBattlerSpriteCoord(gBattleAnimTarget, 3); // unused local variable
+ s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); // unused local variable
+ s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); // unused local variable
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER || IsContest())
{
@@ -4609,13 +4622,13 @@ void sub_815F18C(struct Sprite *sprite)
sprite->data[4] = gBattleAnimArgs[4];
sprite->pos1.x = sprite->data[0];
sprite->pos1.y = sprite->data[1];
- sprite->callback = sub_815F10C;
+ sprite->callback = AnimMeteorMashStarStep;
}
void AnimTask_MonToSubstitute(u8 taskId)
{
int i;
- u8 spriteId = GetAnimBattlerSpriteId(0);
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
if (gTasks[taskId].data[0] == 0)
{
@@ -4648,12 +4661,12 @@ void AnimTask_MonToSubstitute(u8 taskId)
for (i = 0; i < 16; i++)
gTasks[taskId].data[i] = 0;
-
- gTasks[taskId].func = sub_815F330;
+
+ gTasks[taskId].func = AnimTask_MonToSubstituteDoll;
}
}
-static void sub_815F330(u8 taskId)
+static void AnimTask_MonToSubstituteDoll(u8 taskId)
{
u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
@@ -4706,27 +4719,29 @@ static void sub_815F330(u8 taskId)
}
}
-void sub_815F48C(struct Sprite *sprite)
+// Moves down an X that flickers and disappears.
+// No args.
+void AnimBlockX(struct Sprite *sprite)
{
- s16 y2;
+ s16 y;
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
{
sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2;
- y2 = -144;
+ y = -144;
}
else
{
sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 2;
- y2 = -96;
+ y = -96;
}
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
- sprite->pos2.y = y2;
- sprite->callback = sub_815F4F0;
+ sprite->pos2.y = y;
+ sprite->callback = AnimBlockXStep;
}
-static void sub_815F4F0(struct Sprite *sprite)
+static void AnimBlockXStep(struct Sprite *sprite)
{
switch (sprite->data[0])
{
@@ -4742,7 +4757,7 @@ static void sub_815F4F0(struct Sprite *sprite)
case 1:
sprite->data[1] += 4;
sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 3);
- if (sprite->data[1] > 127)
+ if (sprite->data[1] > 0x7F)
{
PlaySE12WithPanning(SE_W166, BattleAnimAdjustPanning(63));
sprite->data[1] = 0;
@@ -4753,7 +4768,7 @@ static void sub_815F4F0(struct Sprite *sprite)
case 2:
sprite->data[1] += 6;
sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 4);
- if (sprite->data[1] > 127)
+ if (sprite->data[1] > 0x7F)
{
sprite->data[1] = 0;
sprite->pos2.y = 0;
@@ -4781,7 +4796,9 @@ static void sub_815F4F0(struct Sprite *sprite)
}
}
-void sub_815F620(u8 taskId)
+// Quickly moves two clones of the target mon back and forth.
+// No args.
+void AnimTask_OdorSleuthMovement(u8 taskId)
{
s16 spriteId1, spriteId2;
@@ -4837,21 +4854,20 @@ void sub_815F620(u8 taskId)
gSprites[spriteId1].invisible = 1;
}
-
gSprites[spriteId2].oam.objMode = ST_OAM_OBJ_NORMAL;
gSprites[spriteId1].oam.objMode = ST_OAM_OBJ_NORMAL;
- gSprites[spriteId2].callback = sub_815F7C4;
- gSprites[spriteId1].callback = sub_815F7C4;
- gTasks[taskId].func = sub_815F79C;
+ gSprites[spriteId2].callback = MoveOdorSleuthClone;
+ gSprites[spriteId1].callback = MoveOdorSleuthClone;
+ gTasks[taskId].func = AnimTask_OdorSleuthMovementWaitFinish;
}
-static void sub_815F79C(u8 taskId)
+static void AnimTask_OdorSleuthMovementWaitFinish(u8 taskId)
{
if (gTasks[taskId].data[0] == 0)
DestroyAnimVisualTask(taskId);
}
-static void sub_815F7C4(struct Sprite *sprite)
+static void MoveOdorSleuthClone(struct Sprite *sprite)
{
int zero = 0;
if (++sprite->data[1] > 1)
@@ -4887,3 +4903,492 @@ static void sub_815F7C4(struct Sprite *sprite)
break;
}
}
+
+void AnimTask_GetReturnPowerLevel(u8 taskId)
+{
+ gBattleAnimArgs[7] = 0;
+ if (gAnimFriendship < 60)
+ gBattleAnimArgs[7] = 0;
+ if (gAnimFriendship > 60 && gAnimFriendship < 92)
+ gBattleAnimArgs[7] = 1;
+ if (gAnimFriendship > 91 && gAnimFriendship < 201)
+ gBattleAnimArgs[7] = 2;
+ if (gAnimFriendship > 200)
+ gBattleAnimArgs[7] = 3;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// Makes the mon run out of screen, run past the opposing mon, and return to its original position.
+// No args.
+void AnimTask_SnatchOpposingMonMove(u8 taskId)
+{
+ u8 spriteId, spriteId2;
+ int personality;
+ int otId;
+ u16 species;
+ u8 subpriority;
+ u8 isBackPic;
+ s16 x;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ gTasks[taskId].data[1] += 0x800;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8);
+ else
+ gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8);
+
+ gTasks[taskId].data[1] &= 0xFF;
+ x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ if ((u16)(x + 32) > 304)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (IsContest())
+ {
+ personality = gContestResources->field_18->unk8;
+ otId = gContestResources->field_18->unkC;
+ species = gContestResources->field_18->species;
+ subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
+ isBackPic = 0;
+ x = -32;
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE)
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ else
+ species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies;
+
+ subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1;
+ isBackPic = 0;
+ x = 272;
+ }
+ else
+ {
+ personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE)
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ else
+ species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies;
+
+ subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1;
+ isBackPic = 1;
+ x = -32;
+ }
+ }
+
+ spriteId2 = sub_80A8394(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, 0);
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies != SPECIES_NONE)
+ BlendPalette((gSprites[spriteId2].oam.paletteNum * 16) | 0x100, 16, 6, RGB_WHITE);
+
+ gTasks[taskId].data[15] = spriteId2;
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ spriteId2 = gTasks[taskId].data[15];
+ gTasks[taskId].data[1] += 0x800;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ gSprites[spriteId2].pos2.x -= (gTasks[taskId].data[1] >> 8);
+ else
+ gSprites[spriteId2].pos2.x += (gTasks[taskId].data[1] >> 8);
+
+ gTasks[taskId].data[1] &= 0xFF;
+ x = gSprites[spriteId2].pos1.x + gSprites[spriteId2].pos2.x;
+ if (gTasks[taskId].data[14] == 0)
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ if (x < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X))
+ {
+ gTasks[taskId].data[14]++;
+ gBattleAnimArgs[7] = 0xFFFF;
+ }
+ }
+ else
+ {
+ if (x > GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X))
+ {
+ gTasks[taskId].data[14]++;
+ gBattleAnimArgs[7] = 0xFFFF;
+ }
+ }
+ }
+
+ if ((u16)(x + 32) > 304)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ spriteId2 = gTasks[taskId].data[15];
+ DestroySpriteAndFreeResources_(&gSprites[spriteId2]);
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos1.x - 32;
+ else
+ gSprites[spriteId].pos2.x = 272 - gSprites[spriteId].pos1.x;
+
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ gTasks[taskId].data[1] += 0x800;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8);
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x >= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X))
+ gSprites[spriteId].pos2.x = 0;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8);
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x <= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X))
+ gSprites[spriteId].pos2.x = 0;
+ }
+
+ gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1];
+ if (gSprites[spriteId].pos2.x == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_815FE80(struct Sprite *sprite)
+{
+ switch (sprite->data[7])
+ {
+ case 0:
+ if (gBattleAnimArgs[7] == -1)
+ {
+ PlaySE12WithPanning(SE_W233, BattleAnimAdjustPanning(63));
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 16;
+ sprite->data[0] = -32;
+ sprite->data[7]++;
+ sprite->invisible = 0;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT && !IsContest())
+ sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1;
+ }
+ else
+ {
+ sprite->invisible = 1;
+ }
+ break;
+ case 1:
+ sprite->pos2.y = Sin(sprite->data[1], sprite->data[0]);
+ sprite->data[1] += 5;
+ if (sprite->data[1] > 0x7F)
+ {
+ sprite->data[0] = sprite->data[0] / 2;
+ sprite->data[3]++;
+ sprite->data[1] -= 0x7F;
+ }
+
+ sprite->data[2] += 0x100;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ sprite->pos2.x -= (sprite->data[2] >> 8);
+ else
+ sprite->pos2.x += (sprite->data[2] >> 8);
+
+ sprite->data[2] &= 0xFF;
+ if (sprite->data[3] == 2)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+// Quickly moves the mon towards its partner and back.
+// No args.
+void AnimTask_SnatchPartnerMove(u8 taskId)
+{
+ s16 attackerX, targetX;
+ u8 spriteId;
+
+ switch (gTasks[taskId].data[15])
+ {
+ case 0:
+ attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ gTasks[taskId].data[0] = 6;
+ if (attackerX > targetX)
+ gTasks[taskId].data[0] *= -1;
+
+ gTasks[taskId].data[1] = attackerX;
+ gTasks[taskId].data[2] = targetX;
+ gTasks[taskId].data[15]++;
+ break;
+ case 1:
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[0];
+ if (gTasks[taskId].data[0] > 0)
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[2])
+ gTasks[taskId].data[15]++;
+ }
+ else
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[2])
+ gTasks[taskId].data[15]++;
+ }
+ break;
+ case 2:
+ gTasks[taskId].data[0] *= -1;
+ gTasks[taskId].data[15]++;
+ break;
+ case 3:
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[0];
+ if (gTasks[taskId].data[0] < 0)
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[1])
+ gTasks[taskId].data[15]++;
+ }
+ else
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[1])
+ gTasks[taskId].data[15]++;
+ }
+ break;
+ case 4:
+ default:
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ gSprites[spriteId].pos2.x = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Moves the mon's sprite back and forth in an unpredictable swaying motion.
+// No args.
+void AnimTask_TeeterDanceMovement(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ task->data[3] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ task->data[4] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1;
+ task->data[6] = gSprites[task->data[3]].pos1.y;
+ task->data[5] = gSprites[task->data[3]].pos1.x;
+ task->data[9] = 0;
+ task->data[11] = 0;
+ task->data[10] = 1;
+ task->data[12] = 0;
+ task->func = AnimTask_TeeterDanceMovementStep;
+}
+
+static void AnimTask_TeeterDanceMovementStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[11] += 8;
+ task->data[11] &= 0xFF;
+ gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5;
+ task->data[9] += 2;
+ task->data[9] &= 0xFF;
+ gSprites[task->data[3]].pos1.x = (gSineTable[task->data[9]] >> 3) * task->data[4] + task->data[5];
+ if (task->data[9] == 0)
+ {
+ gSprites[task->data[3]].pos1.x = task->data[5];
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ task->data[11] += 8;
+ task->data[11] &= 0xFF;
+ gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5;
+ if (task->data[11] == 0)
+ {
+ gSprites[task->data[3]].pos2.x = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void AnimKnockOffStrikeStep(struct Sprite *sprite)
+{
+ // These two cases are identical.
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ sprite->data[1] += sprite->data[0];
+ sprite->data[1] &= 0xFF;
+ }
+ else
+ {
+ sprite->data[1] += sprite->data[0];
+ sprite->data[1] &= 0xFF;
+ }
+
+ sprite->pos2.x = Cos(sprite->data[1], 20);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+
+ sprite->data[2]++;
+}
+
+// Animates a strike that swipes downard at the target mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+void AnimKnockOffStrike(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = -11;
+ sprite->data[1] = 192;
+ StartSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->data[0] = 11;
+ sprite->data[1] = 192;
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->callback = AnimKnockOffStrikeStep;
+}
+
+// Gradually fades a rotating recyle arrow sprite in and back out.
+// No args.
+void AnimRecycle(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP);
+ if (sprite->pos1.y < 16)
+ sprite->pos1.y = 16;
+
+ sprite->data[6] = 0;
+ sprite->data[7] = 16;
+ sprite->callback = AnimRecycleStep;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+}
+
+static void AnimRecycleStep(struct Sprite *sprite)
+{
+ switch (sprite->data[2])
+ {
+ case 0:
+ if (++sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ if (!(sprite->data[1] & 1))
+ {
+ if (sprite->data[6] < 16)
+ sprite->data[6]++;
+ }
+ else
+ {
+ if (sprite->data[7] != 0)
+ sprite->data[7]--;
+ }
+
+ sprite->data[1]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+ if (sprite->data[7] == 0)
+ sprite->data[2]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[0] == 10)
+ {
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2]++;
+ }
+ break;
+ case 2:
+ if (++sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ if (!(sprite->data[1] & 1))
+ {
+ if (sprite->data[6] != 0)
+ sprite->data[6]--;
+ }
+ else
+ {
+ if (sprite->data[7] < 16)
+ sprite->data[7]++;
+ }
+
+ sprite->data[1]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+ if (sprite->data[7] == 16)
+ sprite->data[2]++;
+ }
+ break;
+ case 3:
+ DestroySpriteAndMatrix(sprite);
+ break;
+ }
+}
+
+void AnimTask_GetWeather(u8 taskId)
+{
+ gBattleAnimArgs[7] = ANIM_WEATHER_NONE;
+ if (gWeatherMoveAnim & WEATHER_SUN_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_SUN;
+ else if (gWeatherMoveAnim & WEATHER_RAIN_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_RAIN;
+ else if (gWeatherMoveAnim & WEATHER_SANDSTORM_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_SANDSTORM;
+ else if (gWeatherMoveAnim & WEATHER_HAIL_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_HAIL;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// Squishes the mon sprite vertically, and shakes it back and forth.
+// arg 0: which battler
+void AnimTask_SlackOffSquish(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ PrepareAffineAnimInTaskData(task, task->data[15], gSlackOffSquishAffineAnimCmds);
+ task->func = AnimTask_SlackOffSquishStep;
+}
+
+static void AnimTask_SlackOffSquishStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] > 16 && gTasks[taskId].data[0] < 40)
+ {
+ if (++task->data[1] > 2)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ if (!(task->data[2] & 1))
+ gSprites[task->data[15]].pos2.x = -1;
+ else
+ gSprites[task->data[15]].pos2.x = 1;
+ }
+ }
+ else
+ {
+ gSprites[task->data[15]].pos2.x = 0;
+ }
+
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c
index f99b1aeac..c9d9bb99c 100644
--- a/src/battle_anim_utility_funcs.c
+++ b/src/battle_anim_utility_funcs.c
@@ -767,7 +767,7 @@ void sub_81177E4(u8 taskId)
DestroyAnimVisualTask(taskId);
}
-void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u8 *arg8, const u8 *arg9, const u16 *palette)
+void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *arg8, const u32 *arg9, const u32 *palette)
{
u16 species;
u8 spriteId, spriteId2;
diff --git a/src/battle_arena.c b/src/battle_arena.c
index cd2c976da..cfcb10a0d 100644
--- a/src/battle_arena.c
+++ b/src/battle_arena.c
@@ -8,6 +8,7 @@
#include "decompress.h"
#include "event_data.h"
#include "frontier_util.h"
+#include "graphics.h"
#include "gpu_regs.h"
#include "item.h"
#include "m4a.h"
@@ -23,9 +24,6 @@
#include "constants/battle_frontier.h"
#include "constants/moves.h"
-extern const u32 gUnknown_08D854E8[];
-extern const u16 gUnknown_08D855E8[];
-
// This file's functions.
static void sub_81A58B4(void);
static void sub_81A5964(void);
@@ -499,7 +497,7 @@ u8 BattleArena_ShowJudgmentWindow(u8 *state)
case 0:
BeginNormalPaletteFade(0x7FFFFF1C, 4, 0, 8, 0);
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
- LoadCompressedObjectPic(gUnknown_08611F74);
+ LoadCompressedSpriteSheet(gUnknown_08611F74);
LoadCompressedPalette(gUnknown_08D855E8, 0x1F0, 0x20);
gBattle_WIN0H = 0xFF;
gBattle_WIN0V = 0x70;
@@ -784,7 +782,7 @@ static void sub_81A58B4(void)
if (!isCurrent)
gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0;
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
gTrainerBattleOpponent_A = 0;
}
diff --git a/src/battle_bg.c b/src/battle_bg.c
index bb66a41fd..a072a2cda 100644
--- a/src/battle_bg.c
+++ b/src/battle_bg.c
@@ -11,6 +11,7 @@
#include "link.h"
#include "main.h"
#include "menu.h"
+#include "overworld.h"
#include "palette.h"
#include "sound.h"
#include "sprite.h"
@@ -31,8 +32,6 @@ struct BattleBackground
const void *palette;
};
-extern u8 GetCurrentMapBattleScene(void);
-
// .rodata
static const u16 sUnrefArray[] = {0x0300, 0x0000}; //OamData?
@@ -1093,7 +1092,7 @@ void DrawBattleEntryBackground(void)
LZDecompressVram(gUnknown_08D778F0, (void*)(VRAM + 0x4000));
LZDecompressVram(gUnknown_08D77B0C, (void*)(VRAM + 0x10000));
LoadCompressedPalette(gUnknown_08D77AE4, 0x60, 0x20);
- SetBgAttribute(1, BG_CTRL_ATTR_MAPBASEINDEX, 1);
+ SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1);
SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04);
CopyToBgTilemapBuffer(1, gUnknown_08D779D8, 0, 0);
CopyToBgTilemapBuffer(2, gUnknown_08D779D8, 0, 0);
@@ -1103,7 +1102,7 @@ void DrawBattleEntryBackground(void)
SetGpuReg(REG_OFFSET_WINOUT, 0x36);
gBattle_BG1_Y = 0xFF5C;
gBattle_BG2_Y = 0xFF5C;
- LoadCompressedObjectPicUsingHeap(&gUnknown_0831AA00);
+ LoadCompressedSpriteSheetUsingHeap(&gUnknown_0831AA00);
}
else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
{
@@ -1114,8 +1113,8 @@ void DrawBattleEntryBackground(void)
}
else
{
- SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 2);
- SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 2);
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 2);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 2);
CopyToBgTilemapBuffer(1, gUnknown_08D857A8, 0, 0);
CopyToBgTilemapBuffer(2, gUnknown_08D85A1C, 0, 0);
CopyBgTilemapBufferToVram(1);
diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c
index e81035fc7..33f557388 100644
--- a/src/battle_controller_link_opponent.c
+++ b/src/battle_controller_link_opponent.c
@@ -6,6 +6,7 @@
#include "battle_interface.h"
#include "battle_message.h"
#include "battle_setup.h"
+#include "battle_tower.h"
#include "battle_tv.h"
#include "bg.h"
#include "data2.h"
@@ -33,7 +34,6 @@ extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
extern void sub_81851A8(u8 *);
extern u16 sub_8068B48(void);
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
// this file's functions
static void LinkOpponentHandleGetMonData(void);
@@ -581,7 +581,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
@@ -628,7 +628,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
@@ -648,7 +648,7 @@ static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -913,7 +913,7 @@ static void SetLinkOpponentMonData(u8 monId)
SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -952,7 +952,7 @@ static void SetLinkOpponentMonData(u8 monId)
SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c
index 533ec39de..78c2c409d 100644
--- a/src/battle_controller_link_partner.c
+++ b/src/battle_controller_link_partner.c
@@ -6,6 +6,7 @@
#include "battle_interface.h"
#include "battle_message.h"
#include "battle_setup.h"
+#include "battle_tower.h"
#include "battle_tv.h"
#include "bg.h"
#include "data2.h"
@@ -31,7 +32,6 @@ extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon);
extern void sub_81851A8(u8 *);
-extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId);
// this file's functions
static void LinkPartnerHandleGetMonData(void);
@@ -466,7 +466,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -513,7 +513,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -533,7 +533,7 @@ static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -798,7 +798,7 @@ static void SetLinkPartnerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -837,7 +837,7 @@ static void SetLinkPartnerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index 30aa3217b..4e600ea71 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -564,7 +564,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
@@ -611,7 +611,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
@@ -631,7 +631,7 @@ static u32 GetOpponentMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -905,7 +905,7 @@ static void SetOpponentMonData(u8 monId)
SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -944,7 +944,7 @@ static void SetOpponentMonData(u8 monId)
SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c
index 2d8fba63a..12ffca381 100644
--- a/src/battle_controller_player.c
+++ b/src/battle_controller_player.c
@@ -34,9 +34,6 @@
#include "constants/songs.h"
#include "constants/trainers.h"
-extern u8 gUnknown_0203CEE8;
-extern u8 gUnknown_0203CEE9;
-extern u8 gUnknown_0203CF00[];
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
@@ -406,7 +403,7 @@ static void HandleInputChooseTarget(void)
do
{
if (--i < 0)
- i = 4; // UB: array out of range
+ i = MAX_BATTLERS_COUNT; // UB: array out of range
gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]);
} while (gMultiUsePlayerCursor == gBattlersCount);
@@ -707,7 +704,7 @@ static void HandleMoveSwitching(void)
MoveSelectionDisplayMoveNames();
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
perMovePPBonuses[i] = (gBattleMons[gActiveBattler].ppBonuses & (3 << (i * 2))) >> (i * 2);
totalPPBonuses = perMovePPBonuses[gMoveSelectionCursor[gActiveBattler]];
@@ -715,12 +712,12 @@ static void HandleMoveSwitching(void)
perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses;
totalPPBonuses = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
totalPPBonuses |= perMovePPBonuses[i] << (i * 2);
gBattleMons[gActiveBattler].ppBonuses = totalPPBonuses;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
gBattleMons[gActiveBattler].moves[i] = moveInfo->moves[i];
gBattleMons[gActiveBattler].pp[i] = moveInfo->currentPp[i];
@@ -728,14 +725,14 @@ static void HandleMoveSwitching(void)
if (!(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED))
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
moveStruct.moves[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i);
moveStruct.currentPp[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i);
}
totalPPBonuses = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP_BONUSES);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
perMovePPBonuses[i] = (totalPPBonuses & (3 << (i * 2))) >> (i * 2);
i = moveStruct.moves[gMoveSelectionCursor[gActiveBattler]];
@@ -751,10 +748,10 @@ static void HandleMoveSwitching(void)
perMovePPBonuses[gMultiUsePlayerCursor] = totalPPBonuses;
totalPPBonuses = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
totalPPBonuses |= perMovePPBonuses[i] << (i * 2);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + i, &moveStruct.moves[i]);
SetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_PP1 + i, &moveStruct.currentPp[i]);
@@ -872,7 +869,7 @@ static void sub_80586F8(void)
}
else
{
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
m4aSongNumStop(SE_HINSI);
gMain.inBattle = 0;
@@ -891,7 +888,7 @@ void sub_80587B0(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
if (gWirelessCommType == 0)
sub_800AC34();
@@ -1449,7 +1446,7 @@ static void MoveSelectionDisplayMoveNames(void)
struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
gNumberOfMovesToChoose = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
MoveSelectionDestroyCursorAt(i);
StringCopy(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]);
@@ -1612,7 +1609,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -1659,7 +1656,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -1679,7 +1676,7 @@ static u32 CopyPlayerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -1953,7 +1950,7 @@ static void SetPlayerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -1992,7 +1989,7 @@ static void SetPlayerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c
index 22018add4..ddb241b30 100644
--- a/src/battle_controller_player_partner.c
+++ b/src/battle_controller_player_partner.c
@@ -653,7 +653,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -700,7 +700,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -720,7 +720,7 @@ static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -985,7 +985,7 @@ static void SetPlayerPartnerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -1024,7 +1024,7 @@ static void SetPlayerPartnerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c
index 1cf780264..b1b271bac 100644
--- a/src/battle_controller_recorded_opponent.c
+++ b/src/battle_controller_recorded_opponent.c
@@ -564,7 +564,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
@@ -611,7 +611,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
@@ -631,7 +631,7 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -896,7 +896,7 @@ static void SetRecordedOpponentMonData(u8 monId)
SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -935,7 +935,7 @@ static void SetRecordedOpponentMonData(u8 monId)
SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c
index a788d6be3..301c1f009 100644
--- a/src/battle_controller_recorded_player.c
+++ b/src/battle_controller_recorded_player.c
@@ -547,7 +547,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -594,7 +594,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -614,7 +614,7 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -879,7 +879,7 @@ static void SetRecordedPlayerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -918,7 +918,7 @@ static void SetRecordedPlayerMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c
index c0b496e47..ac3604054 100644
--- a/src/battle_controller_wally.c
+++ b/src/battle_controller_wally.c
@@ -463,7 +463,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst)
case REQUEST_ALL_BATTLE:
battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM);
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -510,7 +510,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_MOVES_PP_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
{
moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size);
moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
@@ -530,7 +530,7 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst)
size = 2;
break;
case REQUEST_PP_DATA_BATTLE:
- for (size = 0; size < 4; size++)
+ for (size = 0; size < MAX_MON_MOVES; size++)
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size);
dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES);
size++;
@@ -795,7 +795,7 @@ static void SetWallyMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species);
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]);
@@ -834,7 +834,7 @@ static void SetWallyMonData(u8 monId)
SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]);
break;
case REQUEST_MOVES_PP_BATTLE:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]);
SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]);
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index a6d6e9294..70a53f332 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -6,6 +6,7 @@
#include "battle_message.h"
#include "cable_club.h"
#include "link.h"
+#include "party_menu.h"
#include "pokemon.h"
#include "recorded_battle.h"
#include "task.h"
@@ -19,8 +20,6 @@ static EWRAM_DATA u8 sUnknown_02022D0A = 0;
EWRAM_DATA struct UnusedControllerStruct gUnknown_02022D0C = {};
static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {};
-extern void sub_81B8D64(u8 battlerId, u8 arg1); // party_menu
-
// this file's funcionts
static void CreateTasksForSendRecvLinkBuffers(void);
static void InitLinkBtlControllers(void);
@@ -143,7 +142,7 @@ static void InitSinglePlayerBtlControllers(void)
gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
}
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
sub_81B8D64(0, 0);
sub_81B8D64(1, 0);
@@ -226,7 +225,7 @@ static void InitSinglePlayerBtlControllers(void)
gBattlerControllerFuncs[3] = SetControllerToOpponent;
gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
{
@@ -246,7 +245,7 @@ static void InitSinglePlayerBtlControllers(void)
gBattlerControllerFuncs[3] = SetControllerToOpponent;
gBattlerPositions[3] = 3;
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
sub_81B8D64(0, 0);
sub_81B8D64(1, 0);
@@ -432,7 +431,7 @@ static void InitLinkBtlControllers(void)
gBattlerControllerFuncs[3] = SetControllerToLinkOpponent;
gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
}
else
{
@@ -448,7 +447,7 @@ static void InitLinkBtlControllers(void)
gBattlerControllerFuncs[2] = SetControllerToLinkOpponent;
gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT;
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
@@ -469,7 +468,7 @@ static void InitLinkBtlControllers(void)
gBattlerControllerFuncs[3] = SetControllerToOpponent;
gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
}
else
{
@@ -485,7 +484,7 @@ static void InitLinkBtlControllers(void)
gBattlerControllerFuncs[3] = SetControllerToLinkOpponent;
gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT;
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
}
sub_81B8D64(0, 0);
@@ -575,7 +574,7 @@ static void InitLinkBtlControllers(void)
}
}
- gBattlersCount = 4;
+ gBattlersCount = MAX_BATTLERS_COUNT;
}
}
@@ -801,7 +800,7 @@ static void Task_HandleSendLinkBuffersData(u8 taskId)
}
break;
case 4:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
blockSize = gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8);
gTasks[taskId].data[13] = 1;
diff --git a/src/battle_dome.c b/src/battle_dome.c
index 514b57c97..00ae84d09 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -19,6 +19,7 @@
#include "window.h"
#include "palette.h"
#include "decompress.h"
+#include "party_menu.h"
#include "menu.h"
#include "sound.h"
#include "pokemon_icon.h"
@@ -57,12 +58,6 @@ struct UnkStruct_860DD10
u16 src;
};
-extern void sub_81B8558(void);
-
-extern u8 gSelectedOrderFromParty[];
-
-extern const struct SpriteTemplate gUnknown_0860CFA8;
-
// text
extern const u8 gTrainerClassNames[][0xD];
@@ -2393,7 +2388,7 @@ static void sub_818E9CC(void)
if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860D0EC[battleMode][lvlMode]))
gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode] = 0;
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
gTrainerBattleOpponent_A = 0;
}
@@ -2559,7 +2554,7 @@ static void InitDomeTrainers(void)
for (i = 0; i < 3; i++)
{
gSaveBlock2Ptr->frontier.domeMonIds[0][i] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_SPECIES, NULL);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
gSaveBlock2Ptr->frontier.field_EFC[i].moves[j] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + j, NULL);
for (j = 0; j < 6; j++)
gSaveBlock2Ptr->frontier.field_EFC[i].evs[j] = GetMonData(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_HP_EV + j, NULL);
@@ -2819,7 +2814,7 @@ static void CreateDomeMon(u8 monPartyId, u16 tournamentTrainerId, u8 tournamentM
gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].evSpread, otId);
happiness = 0xFF;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonMoveSlot(&gEnemyParty[monPartyId],
gFacilityTrainerMons[gSaveBlock2Ptr->frontier.domeMonIds[tournamentTrainerId][tournamentMonId]].moves[i], i);
@@ -2894,7 +2889,7 @@ static s32 sub_818FCBC(u16 tournamentTrainerId, bool8 arg1)
for (i = 0; i < 3; i++)
{
array[i] = 0;
- for (moveId = 0; moveId < 4; moveId++)
+ for (moveId = 0; moveId < MAX_MON_MOVES; moveId++)
{
for (playerMonId = 0; playerMonId < 3; playerMonId++)
{
@@ -2922,7 +2917,7 @@ static s32 sub_818FDB8(u16 tournamentTrainerId, bool8 arg1)
for (i = 0; i < 3; i++)
{
array[i] = 0;
- for (moveId = 0; moveId < 4; moveId++)
+ for (moveId = 0; moveId < MAX_MON_MOVES; moveId++)
{
for (playerMonId = 0; playerMonId < 3; playerMonId++)
{
@@ -3536,7 +3531,7 @@ static void sub_8190400(u8 taskId)
DecompressAndLoadBgGfxUsingHeap(2, gUnknown_08D83D50, 0x2000, 0, 0);
DecompressAndLoadBgGfxUsingHeap(2, gUnknown_08D84970, 0x2000, 0, 1);
DecompressAndLoadBgGfxUsingHeap(3, gUnknown_08D84F00, 0x800, 0, 1);
- LoadCompressedObjectPic(gUnknown_0860CF50);
+ LoadCompressedSpriteSheet(gUnknown_0860CF50);
LoadCompressedPalette(gUnknown_08D85358, 0, 0x200);
LoadCompressedPalette(gUnknown_08D85444, 0x100, 0x200);
LoadCompressedPalette(gUnknown_08D85600, 0xF0, 0x20);
@@ -4853,7 +4848,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTournamentId)
for (i = 0; i < 3; i++)
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
for (k = 0; k < DOME_TOURNAMENT_TRAINERS_COUNT; k++)
{
@@ -5543,8 +5538,9 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun
// Calc move points of all 4 moves for all 3 pokemon hitting all 3 target mons.
for (i = 0; i < 3; i++)
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
+ // TODO: Clean this up, looks like a different data structure
moveScores[i * 4 + j] = 0;
if (gSaveBlock2Ptr->frontier.domeTrainers[winnerTournamentId].trainerId == TRAINER_FRONTIER_BRAIN)
moveIds[i * 4 + j] = GetFrontierBrainMonMove(i, j);
@@ -5605,7 +5601,7 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun
goto LABEL;
while (j != 0)
{
- for (j = 0, k = 0; k < 4 * 3; k++)
+ for (j = 0, k = 0; k < MAX_MON_MOVES * 3; k++)
{
if (bestScore < moveScores[k])
{
@@ -5632,7 +5628,7 @@ static u16 GetWinningMove(s32 winnerTournamentId, s32 loserTournamentId, u8 roun
moveScores[j] = 0;
bestScore = 0;
j = 0;
- for (k = 0; k < 4 * 3; k++)
+ for (k = 0; k < MAX_MON_MOVES * 3; k++)
j += moveScores[k];
}
}
@@ -5707,7 +5703,7 @@ static void sub_8194220(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 3:
- LoadCompressedObjectPic(gUnknown_0860CF50);
+ LoadCompressedSpriteSheet(gUnknown_0860CF50);
if (r10 == 0)
{
for (i = 0; i < (unsigned) 31; i++)
@@ -6064,16 +6060,16 @@ static void sub_8194D68(void)
s32 playerMonId = gSaveBlock2Ptr->frontier.selectedPartyMons[gSelectedOrderFromParty[i] - 1] - 1;
s32 count;
- for (moveSlot = 0; moveSlot < 4; moveSlot++)
+ for (moveSlot = 0; moveSlot < MAX_MON_MOVES; moveSlot++)
{
count = 0;
- while (count < 4)
+ while (count < MAX_MON_MOVES)
{
if (GetMonData(&gSaveBlock1Ptr->playerParty[playerMonId], MON_DATA_MOVE1 + count, NULL) == GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveSlot, NULL))
break;
count++;
}
- if (count == 4)
+ if (count == MAX_MON_MOVES)
SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, moveSlot);
}
@@ -6326,7 +6322,7 @@ static void DecideRoundWinners(u8 roundId)
// Calculate points for both trainers.
for (monId1 = 0; monId1 < 3; monId1++)
{
- for (moveSlot = 0; moveSlot < 4; moveSlot++)
+ for (moveSlot = 0; moveSlot < MAX_MON_MOVES; moveSlot++)
{
for (monId2 = 0; monId2 < 3; monId2++)
{
@@ -6349,7 +6345,7 @@ static void DecideRoundWinners(u8 roundId)
for (monId1 = 0; monId1 < 3; monId1++)
{
- for (moveSlot = 0; moveSlot < 4; moveSlot++)
+ for (moveSlot = 0; moveSlot < MAX_MON_MOVES; moveSlot++)
{
for (monId2 = 0; monId2 < 3; monId2++)
{
diff --git a/src/battle_factory.c b/src/battle_factory.c
index 801b33ba7..0445d5dea 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "battle_factory.h"
#include "battle_factory_screen.h"
#include "event_data.h"
@@ -201,7 +202,7 @@ static void sub_81A5E94(void)
for (i = 0; i < 3; i++)
gUnknown_03006298[i] |= 0xFFFF;
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
gTrainerBattleOpponent_A = 0;
}
@@ -433,7 +434,7 @@ static void sub_81A64C4(void)
CalculateMonStats(&gPlayerParty[i]);
friendship = 0;
- for (k = 0; k < 4; k++)
+ for (k = 0; k < MAX_MON_MOVES; k++)
SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship);
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
@@ -473,7 +474,7 @@ static void sub_81A64C4(void)
}
CalculateMonStats(&gEnemyParty[i]);
- for (k = 0; k < 4; k++)
+ 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]);
SetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY, &gSaveBlock2Ptr->frontier.field_E70[i + 3].abilityBit);
@@ -623,7 +624,7 @@ static void sub_81A6AEC(void)
for (i = 0; i < 3; i++)
{
u16 monSetId = gUnknown_03006298[i];
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
u8 id = GetStyleForMove(gFacilityTrainerMons[monSetId].moves[j]);
stylePoints[id]++;
@@ -756,7 +757,7 @@ void FillFactoryBrainParty(void)
otId);
friendship = 0;
- for (k = 0; k < 4; k++)
+ for (k = 0; k < MAX_MON_MOVES; k++)
SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k);
SetMonData(&gEnemyParty[i], MON_DATA_FRIENDSHIP, &friendship);
SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]);
diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c
index 60b233daf..7831ef750 100644
--- a/src/battle_factory_screen.c
+++ b/src/battle_factory_screen.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "battle_factory_screen.h"
#include "battle_factory.h"
#include "sprite.h"
@@ -131,12 +132,6 @@ struct FactorySwapMonsStruct
bool8 unk30;
};
-extern u8 gUnknown_0203CF20;
-
-extern const u16 gBattleFrontierHeldItems[];
-extern const struct FacilityMon gBattleFrontierMons[];
-extern const struct FacilityMon gSlateportBattleTentMons[];
-extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
extern const u32 gUnknown_085B18AC[];
// This file's functions.
@@ -1167,7 +1162,7 @@ static void CB2_InitSelectScreen(void)
case 4:
LoadSpritePalettes(gUnknown_086103F4);
LoadSpriteSheets(gUnknown_086103BC);
- LoadCompressedObjectPic(gUnknown_086103E4);
+ LoadCompressedSpriteSheet(gUnknown_086103E4);
ShowBg(0);
ShowBg(1);
SetVBlankCallback(Select_VblankCb);
@@ -1697,7 +1692,7 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId)
gFacilityTrainerMons[monSetId].evSpread,
otId);
happiness = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].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]);
@@ -1727,7 +1722,7 @@ static void CreateTentFactorySelectableMons(u8 firstMonId)
gFacilityTrainerMons[monSetId].evSpread,
otId);
happiness = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monSetId].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]);
@@ -3171,7 +3166,7 @@ static void CB2_InitSwapScreen(void)
case 4:
LoadSpritePalettes(gUnknown_086106B0);
LoadSpriteSheets(gUnknown_08610650);
- LoadCompressedObjectPic(gUnknown_086106A0);
+ LoadCompressedSpriteSheet(gUnknown_086106A0);
SetVBlankCallback(Swap_VblankCb);
gMain.state++;
break;
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index f53a6281d..3ceaef983 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -15,6 +15,7 @@
#include "task.h"
#include "sprite.h"
#include "sound.h"
+#include "party_menu.h"
#include "m4a.h"
#include "constants/species.h"
#include "decompress.h"
@@ -42,10 +43,6 @@ extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow;
extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow;
extern const u8 gEnemyMonElevation[];
-extern u8 sub_80688F8(u8, u8 battlerId);
-extern u8 pokemon_order_func(u8); // party menu
-extern void sub_81B8C68(void);
-
// this file's functions
static u8 sub_805D4A8(u16 move);
static u16 BattlePalaceGetTargetRetValue(void);
@@ -141,7 +138,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
if (i == var1)
percent = 2;
- for (var2 = 0, i = 0; i < 4; i++)
+ for (var2 = 0, i = 0; i < MAX_MON_MOVES; i++)
{
if (moveInfo->moves[i] == MOVE_NONE)
break;
@@ -163,7 +160,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
{
var1 = 0, var2 = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (sub_805D4A8(moveInfo->moves[i]) == 0 && !(gBitTable[i] & unusableMovesBits))
var1 += 0x1;
@@ -184,7 +181,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
{
do
{
- i = Random() % 4;
+ i = Random() % MAX_MON_MOVES;
if (!(gBitTable[i] & unusableMovesBits))
chosenMoveId = i;
} while (chosenMoveId == -1);
@@ -200,7 +197,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
do
{
- i = Random() % 4;
+ i = Random() % MAX_MON_MOVES;
if (!(gBitTable[i] & unusableMovesBits) && var2 == sub_805D4A8(moveInfo->moves[i]))
chosenMoveId = i;
} while (chosenMoveId == -1);
@@ -643,7 +640,7 @@ void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId)
DecompressPicFromTable_2(&gTrainerFrontPicTable[frontPicId],
gMonSpritesGfxPtr->sprites[position],
SPECIES_NONE);
- LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[frontPicId]);
+ LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[frontPicId]);
}
void DecompressTrainerBackPic(u16 backPicId, u8 battlerId)
@@ -675,20 +672,20 @@ void BattleLoadAllHealthBoxesGfxAtOnce(void)
LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]);
if (!IsDoubleBattle())
{
- LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox);
- LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox);
+ LoadCompressedSpriteSheet(&sSpriteSheet_SinglesPlayerHealthbox);
+ LoadCompressedSpriteSheet(&sSpriteSheet_SinglesOpponentHealthbox);
numberOfBattlers = 2;
}
else
{
- LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]);
- LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]);
- LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]);
- LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]);
- numberOfBattlers = 4;
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[0]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[1]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[0]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[1]);
+ numberOfBattlers = MAX_BATTLERS_COUNT;
}
for (i = 0; i < numberOfBattlers; i++)
- LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[i]]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[i]]);
}
bool8 BattleLoadAllHealthBoxesGfx(u8 state)
@@ -707,37 +704,37 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state)
if (state == 2)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- LoadCompressedObjectPic(&sSpriteSheet_SafariHealthbox);
+ LoadCompressedSpriteSheet(&sSpriteSheet_SafariHealthbox);
else
- LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox);
+ LoadCompressedSpriteSheet(&sSpriteSheet_SinglesPlayerHealthbox);
}
else if (state == 3)
- LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox);
+ LoadCompressedSpriteSheet(&sSpriteSheet_SinglesOpponentHealthbox);
else if (state == 4)
- LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);
else if (state == 5)
- LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);
else
retVal = TRUE;
}
else
{
if (state == 2)
- LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[0]);
else if (state == 3)
- LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesPlayerHealthbox[1]);
else if (state == 4)
- LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[0]);
else if (state == 5)
- LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[1]);
else if (state == 6)
- LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[0]]);
else if (state == 7)
- LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[1]]);
else if (state == 8)
- LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[2]]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[2]]);
else if (state == 9)
- LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[3]]);
+ LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[3]]);
else
retVal = TRUE;
}
@@ -1116,7 +1113,7 @@ void LoadAndCreateEnemyShadowSprites(void)
{
u8 battlerId;
- LoadCompressedObjectPic(&gSpriteSheet_EnemyShadow);
+ LoadCompressedSpriteSheet(&gSpriteSheet_EnemyShadow);
battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, GetBattlerSpriteCoord(battlerId, 0), GetBattlerSpriteCoord(battlerId, 1) + 29, 0xC8);
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 9fd8e116a..0eb494db4 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -1523,7 +1523,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
bar_data0 = 5;
}
- LoadCompressedObjectPicUsingHeap(&sStatusSummaryBarSpriteSheet);
+ LoadCompressedSpriteSheetUsingHeap(&sStatusSummaryBarSpriteSheet);
LoadSpriteSheet(&sStatusSummaryBallsSpriteSheet);
LoadSpritePalette(&sStatusSummaryBarSpritePal);
LoadSpritePalette(&sStatusSummaryBallsSpritePal);
@@ -1753,7 +1753,7 @@ static void sub_8073E08(u8 taskId)
if (--gTasks[taskId].tData15 < 0)
return;
- SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8));
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15]));
}
if (gTasks[taskId].tData15 == 0)
gTasks[taskId].func = sub_8073E64;
@@ -1806,7 +1806,7 @@ static void sub_8073F98(u8 taskId)
if (--gTasks[taskId].tData15 >= 0)
{
- SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tData15) | ((16 - gTasks[taskId].tData15) << 8));
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[15], 16 - gTasks[taskId].data[15]));
}
else if (gTasks[taskId].tData15 == -1)
{
diff --git a/src/battle_intro.c b/src/battle_intro.c
index 736e35a87..21e83ed29 100644
--- a/src/battle_intro.c
+++ b/src/battle_intro.c
@@ -221,8 +221,8 @@ static void BattleIntroSlide1(u8 taskId)
gScanlineEffect.state = 3;
gTasks[taskId].data[0]++;
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
- SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
- SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
}
@@ -330,8 +330,8 @@ static void BattleIntroSlide2(u8 taskId)
gScanlineEffect.state = 3;
gTasks[taskId].data[0]++;
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
- SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
- SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
}
@@ -418,8 +418,8 @@ static void BattleIntroSlide3(u8 taskId)
gScanlineEffect.state = 3;
gTasks[taskId].data[0]++;
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
- SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
- SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
}
@@ -499,8 +499,8 @@ static void BattleIntroSlideLink(u8 taskId)
{
gScanlineEffect.state = 3;
gTasks[taskId].data[0]++;
- SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
- SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
}
@@ -567,8 +567,8 @@ static void BattleIntroSlidePartner(u8 taskId)
{
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE * 4);
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_WIN1_ON);
- SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
- SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
gScanlineEffect.state = 3;
diff --git a/src/battle_main.c b/src/battle_main.c
index 42f204508..df1828d18 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -17,6 +17,7 @@
#include "dma3.h"
#include "event_data.h"
#include "evolution_scene.h"
+#include "graphics.h"
#include "gpu_regs.h"
#include "international_string_util.h"
#include "item.h"
@@ -39,6 +40,7 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
#include "trig.h"
@@ -58,9 +60,7 @@
extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
-extern u8 gUnknown_0203CF00[];
-extern const u16 gBattleTextboxPalette[];
extern const struct BgTemplate gBattleBgTemplates[];
extern const struct WindowTemplate *const gBattleWindowTemplates[];
extern const u8 *const gBattleScriptsForMoveEffects[];
@@ -68,25 +68,9 @@ extern const u8 *const gBattlescriptsForBallThrow[];
extern const u8 *const gBattlescriptsForRunningByItem[];
extern const u8 *const gBattlescriptsForUsingItem[];
extern const u8 *const gBattlescriptsForSafariActions[];
-extern const struct ScanlineEffectParams gBattleIntroSlideScanlineEffectParams;
-
-// strings
-extern const u8 gText_LinkStandby3[];
-extern const u8 gText_BattleRecordCouldntBeSaved[];
-extern const u8 gText_ShedinjaJapaneseName[];
-extern const u8 gText_Poison[];
-extern const u8 gText_Sleep[];
-extern const u8 gText_Paralysis[];
-extern const u8 gText_Burn[];
-extern const u8 gText_Ice[];
-extern const u8 gText_Confusion[];
-extern const u8 gText_Love[];
// functions
-extern void sub_81B9150(void);
extern void sub_80B3AF8(u8 taskId); // cable club
-extern void sub_81B8FB0(u8, u8); // party menu
-extern u8 pokemon_order_func(u8); // party menu
// this file's functions
static void CB2_InitBattleInternal(void);
@@ -104,9 +88,9 @@ static void sub_8038F34(void);
static void sub_80392A8(void);
static void sub_803937C(void);
static void sub_803939C(void);
-static void sub_803980C(struct Sprite *sprite);
-static void sub_8039838(struct Sprite *sprite);
-static void sub_8039894(struct Sprite *sprite);
+static void SpriteCb_MoveWildMonToRight(struct Sprite *sprite);
+static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite);
+static void SpriteCb_WildMonAnimate(struct Sprite *sprite);
static void sub_80398D0(struct Sprite *sprite);
static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite);
static void sub_8039AF4(struct Sprite *sprite);
@@ -283,6 +267,70 @@ u8 gNumberOfMovesToChoose;
u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT];
// rom const data
+static const struct ScanlineEffectParams sIntroScanlineParams16Bit =
+{
+ (void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_16BIT, 1
+};
+
+// unused
+static const struct ScanlineEffectParams sIntroScanlineParams32Bit =
+{
+ (void *)REG_ADDR_BG3HOFS, SCANLINE_EFFECT_DMACNT_32BIT, 1
+};
+
+const struct SpriteTemplate gUnknown_0831AC88 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8038528,
+};
+
+static const u8 sText_ShedinjaJpnName[] = _("ヌケニン"); // Nukenin
+
+const struct OamData gOamData_831ACA8 =
+{
+ .y = 0,
+ .affineMode = 1,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+const struct OamData gOamData_831ACB0 =
+{
+ .y = 0,
+ .affineMode = 1,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 2,
+ .affineParam = 0
+};
+
+// Unknown and unused data. Feel free to remove.
+static const u16 gUnknown_0831ACB8[] = {0, 5, 0xfffe, 0};
+static const u16 *const gUnknown_0831ACC0 = gUnknown_0831ACB8;
+static const u16 gUnknown_0831ACC4[] = {0xfff0, 0, 0x0400, 0, 0, 0, 0x3c00, 0, 0x7ffe, 1, 0, 0};
+static const u16 *const gUnknown_0831ACDC = gUnknown_0831ACC4;
+
static const s8 gUnknown_0831ACE0[] ={-32, -16, -16, -32, -32, 0, 0, 0};
// format: attacking type, defending type, damage multiplier
@@ -620,7 +668,7 @@ static void CB2_InitBattleInternal(void)
gScanlineEffectRegBuffers[1][i] = 0xFF10;
}
- ScanlineEffect_SetParams(gBattleIntroSlideScanlineEffectParams);
+ ScanlineEffect_SetParams(sIntroScanlineParams16Bit);
}
ResetPaletteFade();
@@ -938,7 +986,7 @@ static void CB2_HandleStartBattle(void)
{
if (gReceivedRemoteLinkPlayers != 0)
{
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
*(&gBattleStruct->field_180) = 0;
*(&gBattleStruct->field_181) = 3;
@@ -987,7 +1035,7 @@ static void CB2_HandleStartBattle(void)
}
break;
case 3:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1002,7 +1050,7 @@ static void CB2_HandleStartBattle(void)
}
break;
case 7:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1017,7 +1065,7 @@ static void CB2_HandleStartBattle(void)
}
break;
case 11:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1059,7 +1107,7 @@ static void CB2_HandleStartBattle(void)
}
break;
case 16:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), &gRecordedBattleRngSeed, sizeof(gRecordedBattleRngSeed));
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1146,7 +1194,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
GetBattleTowerTrainerLanguage(&language, gTrainerBattleOpponent_B);
gLinkPlayers[3].language = language;
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
*(&gBattleStruct->field_180) = 0;
*(&gBattleStruct->field_181) = 3;
@@ -1186,7 +1234,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 3:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1210,7 +1258,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 5:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon));
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1234,7 +1282,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 7:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gEnemyParty, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1252,7 +1300,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 9:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gEnemyParty + 2, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1270,7 +1318,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 11:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gEnemyParty + 4, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1312,7 +1360,7 @@ static void CB2_HandleStartMultiPartnerBattle(void)
}
break;
case 14:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), &gRecordedBattleRngSeed, sizeof(gRecordedBattleRngSeed));
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1392,7 +1440,7 @@ static void CB2_PreInitMultiBattle(void)
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
- if (gReceivedRemoteLinkPlayers != 0 && sub_800A520())
+ if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished())
{
gUnknown_02023058 = Alloc(sizeof(struct UnknownPokemonStruct4) * 3);
sub_80379F8(0);
@@ -1430,7 +1478,7 @@ static void CB2_PreInitMultiBattle(void)
}
break;
case 2:
- if (sub_800A520() && !gPaletteFade.active)
+ if (IsLinkTaskFinished() && !gPaletteFade.active)
{
gBattleCommunication[MULTIUSE_STATE]++;
if (gWirelessCommType)
@@ -1533,7 +1581,7 @@ static void CB2_HandleStartMultiBattle(void)
{
if (gReceivedRemoteLinkPlayers != 0)
{
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
*(&gBattleStruct->field_180) = 0;
*(&gBattleStruct->field_181) = 3;
@@ -1595,7 +1643,7 @@ static void CB2_HandleStartMultiBattle(void)
break;
// fall through
case 3:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(struct Pokemon) * 2);
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1658,7 +1706,7 @@ static void CB2_HandleStartMultiBattle(void)
}
break;
case 5:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(struct Pokemon));
gBattleCommunication[MULTIUSE_STATE]++;
@@ -1754,7 +1802,7 @@ static void CB2_HandleStartMultiBattle(void)
}
break;
case 8:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
u32* ptr = (u32*)(&gBattleStruct->field_180);
ptr[0] = gBattleTypeFlags;
@@ -1957,7 +2005,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
fixedIV = partyData[i].iv * 31 / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
@@ -1991,7 +2039,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]);
SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
@@ -2313,7 +2361,7 @@ static void sub_8038F34(void)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 6:
- if (sub_800A520() == TRUE)
+ if (IsLinkTaskFinished() == TRUE)
{
sub_800ADF8();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
@@ -2323,7 +2371,7 @@ static void sub_8038F34(void)
case 7:
if (!IsTextPrinterActive(0))
{
- if (sub_800A520() == TRUE)
+ if (IsLinkTaskFinished() == TRUE)
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@@ -2498,7 +2546,7 @@ static void sub_803939C(void)
}
break;
case 6:
- if (sub_800A520() == TRUE)
+ if (IsLinkTaskFinished() == TRUE)
{
HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR);
if (gMain.field_439_x4)
@@ -2548,7 +2596,7 @@ static void sub_803939C(void)
}
break;
case 11:
- if (sub_800A520() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0)
+ if (IsLinkTaskFinished() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0)
{
if (gMain.field_439_x4)
{
@@ -2564,7 +2612,7 @@ static void sub_803939C(void)
{
if (gMain.field_439_x4)
{
- if (sub_800A520() == TRUE)
+ if (IsLinkTaskFinished() == TRUE)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
gBattleCommunication[1] = 0x20;
@@ -2592,7 +2640,7 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon)
&& GetMonData(mon, MON_DATA_LANGUAGE) != language)
{
GetMonData(mon, MON_DATA_NICKNAME, nickname);
- if (StringCompareWithoutExtCtrlCodes(nickname, gText_ShedinjaJapaneseName) == 0)
+ if (StringCompareWithoutExtCtrlCodes(nickname, sText_ShedinjaJpnName) == 0)
SetMonData(mon, MON_DATA_LANGUAGE, &language);
}
}
@@ -2605,38 +2653,38 @@ u32 sub_80397C4(u32 setId, u32 tableId)
#define sBattler data[0]
#define sSpeciesId data[2]
-void oac_poke_opponent(struct Sprite *sprite)
+void SpriteCb_WildMon(struct Sprite *sprite)
{
- sprite->callback = sub_803980C;
+ sprite->callback = SpriteCb_MoveWildMonToRight;
StartSpriteAnimIfDifferent(sprite, 0);
BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8));
}
-static void sub_803980C(struct Sprite *sprite)
+static void SpriteCb_MoveWildMonToRight(struct Sprite *sprite)
{
if ((gIntroSlideFlags & 1) == 0)
{
sprite->pos2.x += 2;
if (sprite->pos2.x == 0)
{
- sprite->callback = sub_8039838;
+ sprite->callback = SpriteCb_WildMonShowHealthbox;
}
}
}
-static void sub_8039838(struct Sprite *sprite)
+static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite)
{
if (sprite->animEnded)
{
sub_8076918(sprite->sBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]);
- sprite->callback = sub_8039894;
+ sprite->callback = SpriteCb_WildMonAnimate;
StartSpriteAnimIfDifferent(sprite, 0);
BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8));
}
}
-static void sub_8039894(struct Sprite *sprite)
+static void SpriteCb_WildMonAnimate(struct Sprite *sprite)
{
if (!gPaletteFade.active)
{
diff --git a/src/battle_message.c b/src/battle_message.c
index 75f9b1da8..112ab9630 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -14,6 +14,7 @@
#include "palette.h"
#include "recorded_battle.h"
#include "string_util.h"
+#include "strings.h"
#include "text.h"
#include "window.h"
#include "constants/battle_string_ids.h"
@@ -40,15 +41,7 @@ extern u8 gUnknown_0203C7B4;
extern const u8 gTrainerClassNames[][13];
extern const u16 gUnknown_08D85620[];
-// strings
-extern const u8 gText_PkmnBoxSomeonesPCFull[];
-extern const u8 gText_PkmnBoxLanettesPCFull[];
-extern const u8 gText_PkmnTransferredSomeonesPC[];
-extern const u8 gText_PkmnTransferredLanettesPC[];
-
-extern u8 GetFrontierBrainTrainerClass(void); // battle_frontier_2
extern u8 GetTrainerHillOpponentClass(u16 trainerId); // pokenav
-extern void CopyFrontierBrainTrainerName(u8 *txtPtr); // battle_frontier_2
extern void GetTrainerHillTrainerName(u8 *txtPtr, u16 trainerId); // pokenav
extern void CopyTrainerHillTrainerText(u8 arg0, u16 trainerId); // pokenav
@@ -2864,7 +2857,7 @@ static void ChooseMoveUsedParticle(u8* textBuff)
s32 counter = 0;
u32 i = 0;
- while (counter != 4)
+ while (counter != MAX_MON_MOVES)
{
if (sGrammarMoveUsedTable[i] == 0)
counter++;
@@ -2876,7 +2869,7 @@ static void ChooseMoveUsedParticle(u8* textBuff)
{
if (counter <= 2)
StringCopy(textBuff, sText_SpaceIs); // is
- else if (counter <= 4)
+ else if (counter <= MAX_MON_MOVES)
StringCopy(textBuff, sText_ApostropheS); // 's
}
}
@@ -2907,7 +2900,7 @@ static void ChooseTypeOfMoveUsedString(u8* dst)
while (*dst != EOS)
dst++;
- while (counter != 4)
+ while (counter != MAX_MON_MOVES)
{
if (sGrammarMoveUsedTable[i] == MOVE_NONE)
counter++;
diff --git a/src/battle_palace.c b/src/battle_palace.c
index 4033712b6..fb8cc0729 100644
--- a/src/battle_palace.c
+++ b/src/battle_palace.c
@@ -69,7 +69,7 @@ static void sub_8195980(void)
if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]))
gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0;
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
gTrainerBattleOpponent_A = 0;
}
diff --git a/src/battle_pike.c b/src/battle_pike.c
index 893796790..a4b429bd5 100644
--- a/src/battle_pike.c
+++ b/src/battle_pike.c
@@ -793,7 +793,7 @@ static void HealMon(struct Pokemon *mon)
SetMonData(mon, MON_DATA_HP, data);
ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
u16 move = GetMonData(mon, MON_DATA_MOVE1 + i);
data[0] = CalculatePPWithBonus(move, ppBonuses, i);
@@ -1137,7 +1137,7 @@ bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate)
else
abilityBit = 0;
SetMonData(&gEnemyParty[0], MON_DATA_ALT_ABILITY, &abilityBit);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(&gEnemyParty[0], wildMons[headerId][pikeMonId].moves[i], i);
CalculateMonStats(&gEnemyParty[0]);
@@ -1285,7 +1285,7 @@ static void TryHealMons(u8 healCount)
else
{
u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
u16 move = GetMonData(mon, MON_DATA_MOVE1 + j);
max = CalculatePPWithBonus(move, ppBonuses, j);
@@ -1546,7 +1546,7 @@ static void sub_81A86C0(void)
if (curr >= max && pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)) == 0)
{
u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
u16 move = GetMonData(mon, MON_DATA_MOVE1 + j);
max = CalculatePPWithBonus(move, ppBonuses, j);
@@ -1611,7 +1611,7 @@ static void sub_81A8830(void)
static bool8 CanEncounterWildMon(u8 enemyMonLevel)
{
- if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u8 monAbility = GetMonAbility(&gPlayerParty[0]);
if (monAbility == ABILITY_KEEN_EYE || monAbility == ABILITY_INTIMIDATE)
diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c
index 45aca91c8..2f0d35feb 100644
--- a/src/battle_pyramid.c
+++ b/src/battle_pyramid.c
@@ -8,7 +8,9 @@
#include "save.h"
#include "strings.h"
#include "fieldmap.h"
+#include "party_menu.h"
#include "palette.h"
+#include "field_screen_effect.h"
#include "field_message_box.h"
#include "random.h"
#include "item.h"
@@ -32,9 +34,6 @@
#include "constants/moves.h"
#include "constants/species.h"
-extern u8 gSelectedOrderFromParty[3];
-extern void door_upload_tiles(void);
-
extern const struct MapLayout *const gMapLayouts[];
extern const u16 gUnknown_08D856C8[][16];
@@ -1178,14 +1177,14 @@ static void sub_81A9834(void)
{
if (GetMonData(&gSaveBlock1Ptr->playerParty[id], MON_DATA_SPECIES, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL))
{
- for (k = 0; k < 4; k++)
+ for (k = 0; k < MAX_MON_MOVES; k++)
{
- for (l = 0; l < 4; l++)
+ for (l = 0; l < MAX_MON_MOVES; l++)
{
if (GetMonData(&gSaveBlock1Ptr->playerParty[id], MON_DATA_MOVE1 + l, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_MOVE1 + k, NULL))
break;
}
- if (l == 4)
+ if (l == MAX_MON_MOVES)
SetMonMoveSlot(&gPlayerParty[j], MOVE_SKETCH, k);
}
gSaveBlock1Ptr->playerParty[id] = gPlayerParty[j];
@@ -1203,8 +1202,8 @@ static u8 sub_81A9998(s32 *arg0, u8 arg1, u8 arg2)
{
s32 i, j;
u8 ret = 0;
- u16 *map = gUnknown_03005DC0.map;
- map += gUnknown_03005DC0.width * 7 + 7;
+ u16 *map = gBackupMapLayout.map;
+ map += gBackupMapLayout.width * 7 + 7;
for (i = 0; i < 32; map += 47, i++)
{
@@ -1361,7 +1360,7 @@ void GenerateBattlePyramidWildMon(void)
break;
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(&gEnemyParty[0], wildMons[id].moves[i], i);
if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvl] >= 140) // BUG: Reading outside the array as lvl was used for mon level instead of frontier lvl mode.
@@ -1494,11 +1493,11 @@ void sub_81AA078(u16 *mapArg, u8 arg1)
const struct MapLayout *mapLayout = gMapLayouts[allocated[i] + 0x169];
const u16 *layoutMap = mapLayout->map;
- gUnknown_03005DC0.map = mapArg;
- gUnknown_03005DC0.width = mapLayout->width * 4 + 15;
- gUnknown_03005DC0.height = mapLayout->height * 4 + 14;
+ gBackupMapLayout.map = mapArg;
+ gBackupMapLayout.width = mapLayout->width * 4 + 15;
+ gBackupMapLayout.height = mapLayout->height * 4 + 14;
map = mapArg;
- heightAdd = (((i / 4 * mapLayout->height) + 7) * (gUnknown_03005DC0.width));
+ heightAdd = (((i / 4 * mapLayout->height) + 7) * (gBackupMapLayout.width));
widthAdd = ((i % 4 * mapLayout->width) + 7);
map += heightAdd + widthAdd;
for (j = 0; j < mapLayout->height; j++)
diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c
index 8a6348522..50baf48fd 100644
--- a/src/battle_pyramid_bag.c
+++ b/src/battle_pyramid_bag.c
@@ -365,7 +365,7 @@ static void sub_81C4F44(u8 taskId)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
gFieldCallback2 = hm_add_c3_without_phase_2;
sub_81C4F98(3, CB2_ReturnToField);
DestroyTask(taskId);
@@ -547,7 +547,7 @@ static bool8 sub_81C5238(void)
gPyramidBagResources->state++;
break;
case 3:
- LoadCompressedObjectPic(&gUnknown_0861F3CC);
+ LoadCompressedSpriteSheet(&gUnknown_0861F3CC);
gPyramidBagResources->state++;
break;
case 4:
@@ -964,7 +964,7 @@ static void HandleMenuActionInput(u8 taskId)
{
if (sub_81221EC() != TRUE)
{
- s8 id = GetMenuCursorPos();
+ s8 id = Menu_GetCursorPos();
if (gMain.newKeys & DPAD_UP)
{
if (id > 0 && IsValidMenuAction(id - 2))
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index d399cddbb..2490d6e13 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -46,22 +46,18 @@
#include "battle_arena.h"
#include "battle_pike.h"
#include "battle_pyramid.h"
+#include "field_specials.h"
+#include "pokemon_summary_screen.h"
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern const u8* const gBattleScriptsForMoveEffects[];
// functions
-extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon* party, u8 monPartyId, u8 monCount, void (*callback)(void), u16 move); // pokemon summary screen
-extern u8 sub_81C1B94(void); // pokemon summary screen
extern void sub_81D388C(struct Pokemon* mon, void* statStoreLocation); // pokenav.s
extern void sub_81D3640(u16 arg0, void* statStoreLocation1, void* statStoreLocation2, u8 arg3, u8 arg4, u8 arg5); // pokenav.s
extern void sub_81D3784(u16 arg0, void* statStoreLocation1, u8 arg2, u8 arg3, u8 arg4); // pokenav.s
-extern u8* GetMonNickname(struct Pokemon* mon, u8* dst); // party_menu
-extern void sub_81B8E80(u8 battlerId, u8, u8); // party menu
-extern bool8 IsMultiBattle(void); // ?
extern u8 sub_813B21C(void);
-extern u16 get_unknown_box_id(void);
#define DEFENDER_IS_PROTECTED ((gProtectStructs[gBattlerTarget].protected) && (gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED))
@@ -4603,12 +4599,12 @@ static void atk49_moveend(void)
*choicedMoveAtk = gChosenMove;
LOOP:
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerAttacker].moves[i] == *choicedMoveAtk)
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
*choicedMoveAtk = 0;
gBattleScripting.atk49_state++;
@@ -5961,7 +5957,7 @@ static void atk5E(void)
{
s32 i;
struct BattlePokemon *bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4];
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i];
gBattleMons[gActiveBattler].pp[i] = bufferPoke->pp[i];
@@ -6241,7 +6237,7 @@ static void atk6C_drawlvlupbox(void)
{
case 1:
gBattle_BG2_Y = 0x60;
- SetBgAttribute(2, BG_CTRL_ATTR_MOSAIC, 0);
+ SetBgAttribute(2, BG_ATTR_PRIORITY, 0);
ShowBg(2);
sub_804F17C();
gBattleScripting.atk6C_state = 2;
@@ -6253,8 +6249,8 @@ static void atk6C_drawlvlupbox(void)
case 3:
gBattle_BG1_X = 0;
gBattle_BG1_Y = 0x100;
- SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 1);
- SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, 0);
+ SetBgAttribute(0, BG_ATTR_PRIORITY, 1);
+ SetBgAttribute(1, BG_ATTR_PRIORITY, 0);
ShowBg(0);
ShowBg(1);
HandleBattleWindow(0x12, 7, 0x1D, 0x13, WINDOW_x80);
@@ -6300,7 +6296,7 @@ static void atk6C_drawlvlupbox(void)
ClearWindowTilemap(13);
CopyWindowToVram(13, 1);
- SetBgAttribute(2, BG_CTRL_ATTR_MOSAIC, 2);
+ SetBgAttribute(2, BG_ATTR_PRIORITY, 2);
ShowBg(2);
gBattleScripting.atk6C_state = 10;
@@ -6309,8 +6305,8 @@ static void atk6C_drawlvlupbox(void)
case 10:
if (!IsDma3ManagerBusyWithBgCopy())
{
- SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 0);
- SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, 1);
+ SetBgAttribute(0, BG_ATTR_PRIORITY, 0);
+ SetBgAttribute(1, BG_ATTR_PRIORITY, 1);
ShowBg(0);
ShowBg(1);
gBattlescriptCurrInstr++;
@@ -6656,12 +6652,12 @@ static void atk76_various(void)
choicedMove = &gBattleStruct->choicedMove[gActiveBattler];
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gActiveBattler].moves[i] == *choicedMove)
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
*choicedMove = 0;
}
break;
@@ -7637,7 +7633,7 @@ static void atk90_tryconversiontypechange(void) // randomly changes user's type
u8 moveChecked;
u8 moveType;
- while (validMoves < 4)
+ while (validMoves < MAX_MON_MOVES)
{
if (gBattleMons[gBattlerAttacker].moves[validMoves] == 0)
break;
@@ -8035,7 +8031,7 @@ static void atk9B_transformdataexecution(void)
for (i = 0; i < offsetof(struct BattlePokemon, pp); i++)
battleMonAttacker[i] = battleMonTarget[i];
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp < 5)
gBattleMons[gBattlerAttacker].pp[i] = gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp;
@@ -8101,13 +8097,13 @@ static void atk9D_mimicattackcopy(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerAttacker].moves[i] == gLastMoves[gBattlerTarget])
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
{
gBattleMons[gBattlerAttacker].moves[gCurrMovePos] = gLastMoves[gBattlerTarget];
if (gBattleMoves[gLastMoves[gBattlerTarget]].pp < 5)
@@ -8138,7 +8134,7 @@ static void atk9E_metronome(void)
if (gCurrentMove >= MOVES_COUNT)
continue;
- for (i = 0; i < 4; i++); // ?
+ for (i = 0; i < MAX_MON_MOVES; i++); // ?
i = -1;
while (1)
@@ -8229,13 +8225,13 @@ static void atkA3_disablelastusedattack(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
break;
}
if (gDisableStructs[gBattlerTarget].disabledMove == 0
- && i != 4 && gBattleMons[gBattlerTarget].pp[i] != 0)
+ && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0)
{
PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i])
@@ -8254,7 +8250,7 @@ static void atkA4_trysetencore(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
break;
@@ -8386,7 +8382,7 @@ static void atkA8_copymovepermanently(void) // sketch
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerAttacker].moves[i] == MOVE_SKETCH)
continue;
@@ -8394,7 +8390,7 @@ static void atkA8_copymovepermanently(void) // sketch
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
{
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
@@ -8406,7 +8402,7 @@ static void atkA8_copymovepermanently(void) // sketch
gBattleMons[gBattlerAttacker].pp[gCurrMovePos] = gBattleMoves[gLastPrintedMoves[gBattlerTarget]].pp;
gActiveBattler = gBattlerAttacker;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
movePpData.moves[i] = gBattleMons[gBattlerAttacker].moves[i];
movePpData.pp[i] = gBattleMons[gBattlerAttacker].pp[i];
@@ -8474,7 +8470,7 @@ static void atkA9_trychoosesleeptalkmove(void)
s32 i;
u8 unusableMovesBits = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (IsInvalidForSleepTalkOrAssist(gBattleMons[gBattlerAttacker].moves[i])
|| gBattleMons[gBattlerAttacker].moves[i] == MOVE_FOCUS_PUNCH
@@ -8554,13 +8550,13 @@ static void atkAD_tryspiteppreduce(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gLastMoves[gBattlerTarget] == gBattleMons[gBattlerTarget].moves[i])
break;
}
- if (i != 4 && gBattleMons[gBattlerTarget].pp[i] > 1)
+ if (i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] > 1)
{
s32 ppToDeduct = (Random() & 3) + 2;
if (gBattleMons[gBattlerTarget].pp[i] < ppToDeduct)
@@ -9630,19 +9626,19 @@ static void atkDB_tryimprision(void)
if (sideAttacker != GetBattlerSide(battlerId))
{
s32 attackerMoveId;
- for (attackerMoveId = 0; attackerMoveId < 4; attackerMoveId++)
+ for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i]
&& gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE)
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
break;
}
- if (attackerMoveId != 4)
+ if (attackerMoveId != MAX_MON_MOVES)
{
gStatuses3[gBattlerAttacker] |= STATUS3_IMPRISONED_OTHERS;
gBattlescriptCurrInstr += 5;
@@ -9706,7 +9702,7 @@ static void atkDE_asistattackselect(void)
if (GetMonData(&party[monId], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
- for (moveId = 0; moveId < 4; moveId++)
+ for (moveId = 0; moveId < MAX_MON_MOVES; moveId++)
{
s32 i = 0;
u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId);
@@ -10142,7 +10138,7 @@ static void atkEF_handleballthrow(void)
ballMultiplier = 10;
break;
case ITEM_DIVE_BALL:
- if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER)
+ if (GetCurrentMapType() == MAP_TYPE_UNDERWATER)
ballMultiplier = 35;
else
ballMultiplier = 10;
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 83ced1b7c..21386016f 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -24,6 +24,7 @@
#include "window.h"
#include "event_object_movement.h"
#include "event_scripts.h"
+#include "tv.h"
#include "trainer_see.h"
#include "field_message_box.h"
#include "sound.h"
@@ -36,6 +37,10 @@
#include "gym_leader_rematch.h"
#include "battle_pike.h"
#include "battle_pyramid.h"
+#include "fldeff.h"
+#include "fldeff_misc.h"
+#include "field_control_avatar.h"
+#include "mirage_tower.h"
#include "constants/map_types.h"
#include "constants/battle_frontier.h"
@@ -57,12 +62,8 @@ struct TrainerBattleParameter
};
extern bool32 InTrainerHill(void);
-extern bool32 FldEffPoison_IsActive(void);
-extern void RestartWildEncounterImmunitySteps(void);
extern void ClearPoisonStepCounter(void);
-extern void sub_81BE72C(void);
extern void sub_808BCF4(void);
-extern void sub_80EECC8(void);
extern void sub_80AF6F0(void);
extern u16 sub_81D6180(u8 localId);
extern bool8 GetTrainerHillTrainerFlag(u8 eventObjId);
@@ -341,14 +342,14 @@ static void Task_BattleStart(u8 taskId)
if (!FldEffPoison_IsActive()) // is poison not active?
{
BattleTransition_StartOnField(tTransition);
- sub_81BE72C();
+ ClearMirageTowerPulseBlendEffect();
tState++; // go to case 1.
}
break;
case 1:
if (IsBattleTransitionDone() == TRUE)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_InitBattle);
RestartWildEncounterImmunitySteps();
ClearPoisonStepCounter();
diff --git a/src/battle_tent.c b/src/battle_tent.c
index c358deaa5..de4d9d374 100644
--- a/src/battle_tent.c
+++ b/src/battle_tent.c
@@ -100,7 +100,7 @@ static void sub_81B99D4(void)
gSaveBlock2Ptr->frontier.field_CA8 = 0;
gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
static void sub_81B9A28(void)
@@ -162,7 +162,7 @@ static void sub_81B9BA0(void)
gSaveBlock2Ptr->frontier.field_CA8 = 0;
gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
static void sub_81B9BF4(void)
@@ -217,7 +217,7 @@ static void sub_81B9D28(void)
gSaveBlock2Ptr->frontier.field_CA8 = 0;
gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = FALSE;
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
static void sub_81B9D7C(void)
diff --git a/src/battle_tower.c b/src/battle_tower.c
index 4a9e0dbc4..9e546b0c8 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -31,8 +31,6 @@
#include "constants/species.h"
#include "constants/easy_chat.h"
-extern const u16 gUnknown_085DFA46[];
-
extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_224157[];
extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_224166[];
@@ -942,55 +940,55 @@ struct
const u8 *const *strings;
} const gUnknown_085DD500[] =
{
- {FACILITY_CLASS_LASS, gUnknown_085DD118},
- {FACILITY_CLASS_YOUNGSTER, gUnknown_085DD12C},
- {FACILITY_CLASS_HIKER, gUnknown_085DD140},
- {FACILITY_CLASS_BEAUTY, gUnknown_085DD154},
- {FACILITY_CLASS_FISHERMAN, gUnknown_085DD168},
- {FACILITY_CLASS_LADY, gUnknown_085DD17C},
- {FACILITY_CLASS_CYCLING_TRIATHLETE_F, gUnknown_085DD190},
- {FACILITY_CLASS_BUG_CATCHER, gUnknown_085DD1A4},
- {FACILITY_CLASS_SCHOOL_KID_M, gUnknown_085DD1B8},
- {FACILITY_CLASS_RICH_BOY, gUnknown_085DD1CC},
- {FACILITY_CLASS_BLACK_BELT, gUnknown_085DD1E0},
- {FACILITY_CLASS_TUBER_F, gUnknown_085DD1F4},
- {FACILITY_CLASS_HEX_MANIAC, gUnknown_085DD208},
- {FACILITY_CLASS_PKMN_BREEDER_M, gUnknown_085DD21C},
- {FACILITY_CLASS_RUNNING_TRIATHLETE_F, gUnknown_085DD230},
- {FACILITY_CLASS_RUNNING_TRIATHLETE_M, gUnknown_085DD244},
- {FACILITY_CLASS_BATTLE_GIRL, gUnknown_085DD258},
- {FACILITY_CLASS_CYCLING_TRIATHLETE_M, gUnknown_085DD26C},
- {FACILITY_CLASS_TUBER_M, gUnknown_085DD280},
- {FACILITY_CLASS_GUITARIST, gUnknown_085DD294},
- {FACILITY_CLASS_GENTLEMAN, gUnknown_085DD2A8},
- {FACILITY_CLASS_POKEFAN_M, gUnknown_085DD2BC},
- {FACILITY_CLASS_EXPERT_M, gUnknown_085DD2D0},
- {FACILITY_CLASS_EXPERT_F, gUnknown_085DD2E4},
- {FACILITY_CLASS_DRAGON_TAMER, gUnknown_085DD2F8},
- {FACILITY_CLASS_BIRD_KEEPER, gUnknown_085DD30C},
- {FACILITY_CLASS_NINJA_BOY, gUnknown_085DD320},
- {FACILITY_CLASS_PARASOL_LADY, gUnknown_085DD334},
- {FACILITY_CLASS_BUG_MANIAC, gUnknown_085DD348},
- {FACILITY_CLASS_SAILOR, gUnknown_085DD35C},
- {FACILITY_CLASS_COLLECTOR, gUnknown_085DD370},
- {FACILITY_CLASS_PKMN_RANGER_M, gUnknown_085DD384},
- {FACILITY_CLASS_PKMN_RANGER_F, gUnknown_085DD398},
- {FACILITY_CLASS_AROMA_LADY, gUnknown_085DD3AC},
- {FACILITY_CLASS_RUIN_MANIAC, gUnknown_085DD3C0},
- {FACILITY_CLASS_COOLTRAINER_M, gUnknown_085DD3D4},
- {FACILITY_CLASS_COOLTRAINER_F, gUnknown_085DD3E8},
- {FACILITY_CLASS_POKEMANIAC, gUnknown_085DD3FC},
- {FACILITY_CLASS_KINDLER, gUnknown_085DD410},
- {FACILITY_CLASS_CAMPER, gUnknown_085DD424},
- {FACILITY_CLASS_PICNICKER, gUnknown_085DD438},
- {FACILITY_CLASS_PSYCHIC_M, gUnknown_085DD44C},
- {FACILITY_CLASS_PSYCHIC_F, gUnknown_085DD460},
- {FACILITY_CLASS_SCHOOL_KID_F, gUnknown_085DD474},
- {FACILITY_CLASS_POKEMON_BREEDER_F, gUnknown_085DD488},
- {FACILITY_CLASS_POKEFAN_F, gUnknown_085DD49C},
- {FACILITY_CLASS_SWIMMER_F, gUnknown_085DD4B0},
- {FACILITY_CLASS_SWIMMING_TRIATHLETE_M, gUnknown_085DD4C4},
- {FACILITY_CLASS_SWIMMING_TRIATHLETE_F, gUnknown_085DD4D8},
+ {FACILITY_CLASS_LASS, gUnknown_085DD118},
+ {FACILITY_CLASS_YOUNGSTER, gUnknown_085DD12C},
+ {FACILITY_CLASS_HIKER, gUnknown_085DD140},
+ {FACILITY_CLASS_BEAUTY, gUnknown_085DD154},
+ {FACILITY_CLASS_FISHERMAN, gUnknown_085DD168},
+ {FACILITY_CLASS_LADY, gUnknown_085DD17C},
+ {FACILITY_CLASS_CYCLING_TRIATHLETE_F, gUnknown_085DD190},
+ {FACILITY_CLASS_BUG_CATCHER, gUnknown_085DD1A4},
+ {FACILITY_CLASS_SCHOOL_KID_M, gUnknown_085DD1B8},
+ {FACILITY_CLASS_RICH_BOY, gUnknown_085DD1CC},
+ {FACILITY_CLASS_BLACK_BELT, gUnknown_085DD1E0},
+ {FACILITY_CLASS_TUBER_F, gUnknown_085DD1F4},
+ {FACILITY_CLASS_HEX_MANIAC, gUnknown_085DD208},
+ {FACILITY_CLASS_PKMN_BREEDER_M, gUnknown_085DD21C},
+ {FACILITY_CLASS_RUNNING_TRIATHLETE_F, gUnknown_085DD230},
+ {FACILITY_CLASS_RUNNING_TRIATHLETE_M, gUnknown_085DD244},
+ {FACILITY_CLASS_BATTLE_GIRL, gUnknown_085DD258},
+ {FACILITY_CLASS_CYCLING_TRIATHLETE_M, gUnknown_085DD26C},
+ {FACILITY_CLASS_TUBER_M, gUnknown_085DD280},
+ {FACILITY_CLASS_GUITARIST, gUnknown_085DD294},
+ {FACILITY_CLASS_GENTLEMAN, gUnknown_085DD2A8},
+ {FACILITY_CLASS_POKEFAN_M, gUnknown_085DD2BC},
+ {FACILITY_CLASS_EXPERT_M, gUnknown_085DD2D0},
+ {FACILITY_CLASS_EXPERT_F, gUnknown_085DD2E4},
+ {FACILITY_CLASS_DRAGON_TAMER, gUnknown_085DD2F8},
+ {FACILITY_CLASS_BIRD_KEEPER, gUnknown_085DD30C},
+ {FACILITY_CLASS_NINJA_BOY, gUnknown_085DD320},
+ {FACILITY_CLASS_PARASOL_LADY, gUnknown_085DD334},
+ {FACILITY_CLASS_BUG_MANIAC, gUnknown_085DD348},
+ {FACILITY_CLASS_SAILOR, gUnknown_085DD35C},
+ {FACILITY_CLASS_COLLECTOR, gUnknown_085DD370},
+ {FACILITY_CLASS_PKMN_RANGER_M, gUnknown_085DD384},
+ {FACILITY_CLASS_PKMN_RANGER_F, gUnknown_085DD398},
+ {FACILITY_CLASS_AROMA_LADY, gUnknown_085DD3AC},
+ {FACILITY_CLASS_RUIN_MANIAC, gUnknown_085DD3C0},
+ {FACILITY_CLASS_COOLTRAINER_M, gUnknown_085DD3D4},
+ {FACILITY_CLASS_COOLTRAINER_F, gUnknown_085DD3E8},
+ {FACILITY_CLASS_POKEMANIAC, gUnknown_085DD3FC},
+ {FACILITY_CLASS_KINDLER, gUnknown_085DD410},
+ {FACILITY_CLASS_CAMPER, gUnknown_085DD424},
+ {FACILITY_CLASS_PICNICKER, gUnknown_085DD438},
+ {FACILITY_CLASS_PSYCHIC_M, gUnknown_085DD44C},
+ {FACILITY_CLASS_PSYCHIC_F, gUnknown_085DD460},
+ {FACILITY_CLASS_SCHOOL_KID_F, gUnknown_085DD474},
+ {FACILITY_CLASS_POKEMON_BREEDER_F, gUnknown_085DD488},
+ {FACILITY_CLASS_POKEFAN_F, gUnknown_085DD49C},
+ {FACILITY_CLASS_SWIMMER_F, gUnknown_085DD4B0},
+ {FACILITY_CLASS_SWIMMING_TRIATHLETE_M, gUnknown_085DD4C4},
+ {FACILITY_CLASS_SWIMMING_TRIATHLETE_F, gUnknown_085DD4D8},
{FACILITY_CLASS_SWIMMER_M, gUnknown_085DD4EC}
};
@@ -1165,7 +1163,7 @@ static void sub_8161F94(void)
gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = 0;
ValidateBattleTowerRecordChecksums();
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
gTrainerBattleOpponent_A = 0;
}
@@ -1975,7 +1973,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
friendship = 255;
// Give the chosen pokemon its specified moves.
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
@@ -2014,7 +2012,7 @@ static void Unused_CreateApprenticeMons(u16 trainerId, u8 firstMonId)
{
CreateMonWithEVSpread(&gEnemyParty[firstMonId + i], apprentice->party[i].species, level, fixedIV, 8);
friendship = 0xFF;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
if (apprentice->party[i].moves[j] == MOVE_FRUSTRATION)
friendship = 0;
@@ -2104,7 +2102,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId)
otID);
friendship = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
SetMonData(&gEnemyParty[firstMonId + i], MON_DATA_FRIENDSHIP, &friendship);
@@ -2132,7 +2130,7 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId)
otID);
friendship = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonMoveAvoidReturn(&gEnemyParty[firstMonId + i], gFacilityTrainerMons[monSetId].moves[j], j);
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
@@ -2147,7 +2145,7 @@ static void FillFactoryTentTrainerParty(u16 trainerId, u8 firstMonId)
void FrontierSpeechToString(const u16 *words)
{
ConvertEasyChatWordsToString(gStringVar4, words, 3, 2);
- if (GetStringWidth(1, gStringVar4, -1) > 204)
+ if (GetStringWidth(1, gStringVar4, -1) > 204u)
{
s32 i = 0;
@@ -2801,7 +2799,7 @@ static void sub_8164B74(void)
if (battleMode == FRONTIER_MODE_LINK_MULTIS)
{
challengeNum = gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7;
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), &challengeNum, sizeof(challengeNum));
gSpecialVar_Result = 1;
@@ -2838,7 +2836,7 @@ static void sub_8164B74(void)
}
break;
case 2:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), &gSaveBlock2Ptr->frontier.field_CB4, sizeof(gSaveBlock2Ptr->frontier.field_CB4));
gSpecialVar_Result = 3;
@@ -3195,7 +3193,7 @@ static void FillPartnerParty(u16 trainerId)
TRUE, STEVEN_OTID);
for (j = 0; j < 6; j++)
SetMonData(&gPlayerParty[3 + i], MON_DATA_HP_EV + j, &sStevenMons[i].evs[j]);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
SetMonMoveSlot(&gPlayerParty[3 + i], sStevenMons[i].moves[j], j);
SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, gTrainers[TRAINER_STEVEN].trainerName);
j = MALE;
@@ -3224,7 +3222,7 @@ static void FillPartnerParty(u16 trainerId)
gFacilityTrainerMons[monSetId].evSpread,
otID);
friendship = 0xFF;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonMoveSlot(&gPlayerParty[3 + i], gFacilityTrainerMons[monSetId].moves[j], j);
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
@@ -3649,7 +3647,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
friendship = 255;
// Give the chosen pokemon its specified moves.
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonMoveSlot(&gEnemyParty[i + firstMonId], gFacilityTrainerMons[monSetId].moves[j], j);
if (gFacilityTrainerMons[monSetId].moves[j] == MOVE_FRUSTRATION)
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 37a8cd63f..786d5e869 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -3,8 +3,10 @@
#include "battle_transition.h"
#include "bg.h"
#include "decompress.h"
+#include "event_object_movement.h"
#include "field_camera.h"
#include "field_effect.h"
+#include "field_weather.h"
#include "gpu_regs.h"
#include "main.h"
#include "alloc.h"
@@ -57,10 +59,6 @@ struct StructRectangularSpiral
typedef bool8 (*TransitionStateFunc)(struct Task *task);
typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite);
-extern const struct OamData gEventObjectBaseOam_32x32;
-
-extern void SetWeatherScreenFadeOut(void);
-
// this file's functions
static void LaunchBattleTransitionTask(u8 transitionId);
static void Task_BattleTransitionMain(u8 taskId);
diff --git a/src/battle_tv.c b/src/battle_tv.c
index 487b6baac..d3ca9b61f 100644
--- a/src/battle_tv.c
+++ b/src/battle_tv.c
@@ -746,7 +746,7 @@ void TryPutLinkBattleTvShowOnAir(void)
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL);
if (species != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG, NULL))
{
- for (sum = 0, j = 0; j < 4; j++)
+ for (sum = 0, j = 0; j < MAX_MON_MOVES; j++)
sum += movePoints->points[0][i * 4 + j];
if (playerBestSum < sum)
@@ -760,7 +760,7 @@ void TryPutLinkBattleTvShowOnAir(void)
species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL);
if (species != SPECIES_NONE && !GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG, NULL))
{
- for (sum = 0, j = 0; j < 4; j++)
+ for (sum = 0, j = 0; j < MAX_MON_MOVES; j++)
sum += movePoints->points[1][i * 4 + j];
if (opponentBestSum == sum)
@@ -781,7 +781,7 @@ void TryPutLinkBattleTvShowOnAir(void)
}
}
- for (sum = 0, i = 0, j = 0; j < 4; j++)
+ for (sum = 0, i = 0, j = 0; j < MAX_MON_MOVES; j++)
{
if (sum < movePoints->points[0][playerBestMonId * 4 + j])
{
@@ -1422,7 +1422,7 @@ static void TrySetBattleSeminarShow(void)
dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleMoveDamage;
currMoveSaved = gCurrentMove;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
gCurrentMove = gBattleMons[gBattlerAttacker].moves[i];
powerOverride = 0;
@@ -1446,7 +1446,7 @@ static void TrySetBattleSeminarShow(void)
}
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (i != gMoveSelectionCursor[gBattlerAttacker] && dmgByMove[i] > dmgByMove[gMoveSelectionCursor[gBattlerAttacker]])
{
@@ -1458,7 +1458,7 @@ static void TrySetBattleSeminarShow(void)
else
bestMoveId = 1;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (i != gMoveSelectionCursor[gBattlerAttacker] && dmgByMove[i] > dmgByMove[bestMoveId])
bestMoveId = i;
@@ -1551,7 +1551,7 @@ u8 GetBattlerMoveSlotId(u8 battlerId, u16 moveId)
i = 0;
while (1)
{
- if (i >= 4)
+ if (i >= MAX_MON_MOVES)
break;
if (GetMonData(&party[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + i, NULL) == moveId)
break;
diff --git a/src/battle_util.c b/src/battle_util.c
index 2ddd4f550..5d8e42482 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -85,13 +85,13 @@ void PressurePPLose(u8 defender, u8 attacker, u16 move)
if (gBattleMons[defender].ability != ABILITY_PRESSURE)
return;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[attacker].moves[i] == move)
break;
}
- if (i == 4) // mons don't share any moves
+ if (i == MAX_MON_MOVES) // mons don't share any moves
return;
if (gBattleMons[attacker].pp[i] != 0)
@@ -116,12 +116,12 @@ void PressurePPLoseOnUsingImprision(u8 attacker)
{
if (atkSide != GetBattlerSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE)
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
if (gBattleMons[attacker].moves[j] == MOVE_IMPRISON)
break;
}
- if (j != 4)
+ if (j != MAX_MON_MOVES)
{
imprisionPos = j;
if (gBattleMons[attacker].pp[j] != 0)
@@ -149,12 +149,12 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker)
{
if (gBattleMons[i].ability == ABILITY_PRESSURE && i != attacker)
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
if (gBattleMons[attacker].moves[j] == MOVE_PERISH_SONG)
break;
}
- if (j != 4)
+ if (j != MAX_MON_MOVES)
{
perishSongPos = j;
if (gBattleMons[attacker].pp[j] != 0)
@@ -163,7 +163,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker)
}
}
- if (perishSongPos != 4
+ if (perishSongPos != MAX_MON_MOVES
&& !(gBattleMons[attacker].status2 & STATUS2_TRANSFORMED)
&& !(gDisableStructs[attacker].unk18_b & gBitTable[perishSongPos]))
{
@@ -426,7 +426,7 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check)
gPotentialItemEffectBattler = battlerId;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE)
unusableMoves |= gBitTable[i];
@@ -477,12 +477,12 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move)
if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS)
{
s32 j;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
if (move == gBattleMons[i].moves[j])
break;
}
- if (j < 4)
+ if (j < MAX_MON_MOVES)
imprisionedMoves++;
}
}
@@ -1021,12 +1021,12 @@ u8 DoBattlerEndTurnEffects(void)
if (gDisableStructs[gActiveBattler].disableTimer != 0)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i])
break;
}
- if (i == 4) // pokemon does not have the disabled move anymore
+ if (i == MAX_MON_MOVES) // pokemon does not have the disabled move anymore
{
gDisableStructs[gActiveBattler].disabledMove = 0;
gDisableStructs[gActiveBattler].disableTimer = 0;
@@ -2661,7 +2661,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]];
else
mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]];
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
move = GetMonData(mon, MON_DATA_MOVE1 + i);
changedPP = GetMonData(mon, MON_DATA_PP1 + i);
@@ -2669,7 +2669,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
if (move && changedPP == 0)
break;
}
- if (i != 4)
+ if (i != MAX_MON_MOVES)
{
u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i);
if (changedPP + battlerHoldEffectParam > maxPP)
diff --git a/src/battle_util2.c b/src/battle_util2.c
index 70c722298..0a0f65b95 100644
--- a/src/battle_util2.c
+++ b/src/battle_util2.c
@@ -3,17 +3,14 @@
#include "battle_controllers.h"
#include "alloc.h"
#include "pokemon.h"
+#include "party_menu.h"
#include "event_data.h"
#include "constants/abilities.h"
#include "random.h"
#include "battle_scripts.h"
-extern u8 gUnknown_0203CF00[];
-
extern void sub_81D55D0(void);
extern void sub_81D5694(void);
-extern u8 pokemon_order_func(u8);
-extern void sub_81B8FB0(u8, u8);
void AllocateBattleResources(void)
{
diff --git a/src/berry_blender.c b/src/berry_blender.c
index 1ffdb1c38..ea9c6c4ff 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -1240,7 +1240,7 @@ static void sub_8080018(void)
sBerryBlenderData->framesToWait = 0;
break;
case 9:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
ResetBlockReceivedFlags();
if (GetMultiplayerId() == 0)
@@ -1297,7 +1297,7 @@ static void sub_8080018(void)
}
break;
case 13:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sBerryBlenderData->mainState++;
sub_8082CB4(&sBerryBlenderData->bgAffineSrc);
@@ -1342,7 +1342,7 @@ static void sub_8080018(void)
sBerryBlenderData->mainState++;
break;
case 20:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sub_800A418();
sBerryBlenderData->mainState++;
@@ -2412,7 +2412,7 @@ static void CB2_HandleBlenderEndGame(void)
{
sBerryBlenderData->gameEndState++;
}
- else if (sub_800A520())
+ else if (IsLinkTaskFinished())
{
if (gReceivedRemoteLinkPlayers != 0 && gWirelessCommType)
{
@@ -2593,7 +2593,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
sBerryBlenderData->framesToWait = 0;
break;
case 1:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sBerryBlenderData->field_1A0++;
gSoftResetDisabled = TRUE;
@@ -2612,7 +2612,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
}
break;
case 4:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
if (sub_8153474())
{
@@ -2687,7 +2687,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
sBerryBlenderData->gameEndState++;
break;
case 6:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sBerryBlenderData->framesToWait = 0;
sBerryBlenderData->gameEndState++;
@@ -2706,7 +2706,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
sub_800ADF8();
break;
case 9:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
sBerryBlenderData->gameEndState++;
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
index d87509e10..3631c083a 100644
--- a/src/berry_fix_program.c
+++ b/src/berry_fix_program.c
@@ -67,7 +67,7 @@ static const u16 sUnknown_08618138[] = {
0x7fff, 0x7fff, 0x318c, 0x675a,
0x043c, 0x3aff, 0x0664, 0x4bd2,
0x6546, 0x7b14, 0x7fff, 0x318c,
- 0x675a, 0x0000, 0x0000, 0x0000
+ 0x675a, 0, 0, 0
};
static const u8 sUnknown_08618158[] = {10, 11, 12};
@@ -124,7 +124,7 @@ void CB2_InitBerryFixProgram(void)
ResetSpriteData();
ResetTasks();
ScanlineEffect_Stop();
- SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
berry_fix_mb_manager = AllocZeroed(0x50);
berry_fix_mb_manager->state = 0;
berry_fix_mb_manager->unk1 = 6;
@@ -203,13 +203,13 @@ static void berry_fix_gpu_set(void)
{
s32 width, left;
- SetGpuReg(REG_OFFSET_BG0CNT, 0x0000);
- SetGpuReg(REG_OFFSET_BG1CNT, 0x0000);
- SetGpuReg(REG_OFFSET_BG0HOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG0VOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG1HOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG1VOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
DmaFill32(3, 0, VRAM, VRAM_SIZE);
DmaFill32(3, 0, OAM, OAM_SIZE);
diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c
index 22f99a426..6e968fc0a 100644
--- a/src/berry_tag_screen.c
+++ b/src/berry_tag_screen.c
@@ -349,11 +349,11 @@ static bool8 LoadBerryTagGfx(void)
sBerryTag->gfxState++;
break;
case 5:
- LoadCompressedObjectPic(&gUnknown_0857FDEC);
+ LoadCompressedSpriteSheet(&gUnknown_0857FDEC);
sBerryTag->gfxState++;
break;
default:
- LoadCompressedObjectPalette(&gUnknown_0857FDF4);
+ LoadCompressedSpritePalette(&gUnknown_0857FDF4);
return TRUE; // done
}
diff --git a/src/bg.c b/src/bg.c
index a41075ad7..54ec3b347 100644
--- a/src/bg.c
+++ b/src/bg.c
@@ -33,8 +33,8 @@ struct BgConfig2
u32 unk_3:18;
void* tilemap;
- u32 bg_x;
- u32 bg_y;
+ s32 bg_x;
+ s32 bg_y;
};
static IWRAM_DATA struct BgControl sGpuBgConfigs;
@@ -77,15 +77,27 @@ void ResetBgControlStructs(void)
void Unused_ResetBgControlStruct(u8 bg)
{
- if (IsInvalidBg(bg) == FALSE)
+ if (!IsInvalidBg(bg))
{
sGpuBgConfigs.configs[bg] = sZeroedBgControlStruct;
}
}
-void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound)
+enum
{
- if (IsInvalidBg(bg) == FALSE)
+ BG_CTRL_ATTR_VISIBLE = 1,
+ BG_CTRL_ATTR_CHARBASEINDEX = 2,
+ BG_CTRL_ATTR_MAPBASEINDEX = 3,
+ BG_CTRL_ATTR_SCREENSIZE = 4,
+ BG_CTRL_ATTR_PALETTEMODE = 5,
+ BG_CTRL_ATTR_PRIORITY = 6,
+ BG_CTRL_ATTR_MOSAIC = 7,
+ BG_CTRL_ATTR_WRAPAROUND = 8,
+};
+
+static void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound)
+{
+ if (!IsInvalidBg(bg))
{
if (charBaseIndex != 0xFF)
{
@@ -129,9 +141,9 @@ void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenS
}
}
-u16 GetBgControlAttribute(u8 bg, u8 attributeId)
+static u16 GetBgControlAttribute(u8 bg, u8 attributeId)
{
- if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)
+ if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible)
{
switch (attributeId)
{
@@ -162,7 +174,7 @@ u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode)
u16 offset;
s8 cursor;
- if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)
+ if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible)
{
switch (mode)
{
@@ -198,7 +210,7 @@ end:
static void ShowBgInternal(u8 bg)
{
u16 value;
- if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)
+ if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible)
{
value = sGpuBgConfigs.configs[bg].priority |
(sGpuBgConfigs.configs[bg].charBaseIndex << 2) |
@@ -217,7 +229,7 @@ static void ShowBgInternal(u8 bg)
static void HideBgInternal(u8 bg)
{
- if (IsInvalidBg(bg) == FALSE)
+ if (!IsInvalidBg(bg))
{
sGpuBgConfigs.bgVisibilityAndMode &= ~(1 << (bg + 8));
sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS;
@@ -226,12 +238,12 @@ static void HideBgInternal(u8 bg)
static void SyncBgVisibilityAndMode(void)
{
- SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode);
+ SetGpuReg(REG_OFFSET_DISPCNT, (GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode);
}
void SetTextModeAndHideBgs(void)
{
- SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS);
+ SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) & ~DISPCNT_ALL_BG_AND_MODE_BITS);
}
static void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle)
@@ -312,7 +324,8 @@ void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numT
for (i = 0; i < numTemplates; i++)
{
bg = templates[i].bg;
- if (bg < 4) {
+ if (bg < 4)
+ {
SetBgControlAttributes(bg,
templates[i].charBaseIndex,
templates[i].mapBaseIndex,
@@ -396,9 +409,7 @@ u16 LoadBgTiles(u8 bg, const void* src, u16 size, u16 destOffset)
u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset)
{
- u8 cursor;
-
- cursor = LoadBgVram(bg, src, size, destOffset * 2, DISPCNT_MODE_2);
+ u8 cursor = LoadBgVram(bg, src, size, destOffset * 2, DISPCNT_MODE_2);
if (cursor == 0xFF)
{
@@ -412,12 +423,11 @@ u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset)
u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset)
{
- u16 paletteOffset;
s8 cursor;
- if (IsInvalidBg32(bg) == FALSE)
+ if (!IsInvalidBg32(bg))
{
- paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2);
+ u16 paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2);
cursor = RequestDma3Copy(src, (void*)(paletteOffset + BG_PLTT), size, 0);
if (cursor == -1)
@@ -437,20 +447,16 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset)
bool8 IsDma3ManagerBusyWithBgCopy(void)
{
- u8 mod;
- u8 div;
- s8 reqSpace;
-
int i;
for (i = 0; i < 0x80; i++)
{
- div = i / 0x20;
- mod = i % 0x20;
+ u8 div = i / 0x20;
+ u8 mod = i % 0x20;
- if ((sDmaBusyBitfield[div] & (1 << mod)) != FALSE)
+ if ((sDmaBusyBitfield[div] & (1 << mod)))
{
- reqSpace = CheckForSpaceForDma3Request(i);
+ s8 reqSpace = CheckForSpaceForDma3Request(i);
if (reqSpace == -1)
{
return TRUE;
@@ -479,25 +485,25 @@ void SetBgAttribute(u8 bg, u8 attributeId, u8 value)
{
switch (attributeId)
{
- case 1:
+ case BG_ATTR_CHARBASEINDEX:
SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
break;
- case 2:
+ case BG_ATTR_MAPBASEINDEX:
SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
break;
- case 3:
+ case BG_ATTR_SCREENSIZE:
SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF);
break;
- case 4:
+ case BG_ATTR_PALETTEMODE:
SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF);
break;
- case 7:
+ case BG_ATTR_PRIORITY:
SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF);
break;
- case 5:
+ case BG_ATTR_MOSAIC:
SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF);
break;
- case 6:
+ case BG_ATTR_WRAPAROUND:
SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value);
break;
}
@@ -507,46 +513,46 @@ u16 GetBgAttribute(u8 bg, u8 attributeId)
{
switch (attributeId)
{
- case 1:
+ case BG_ATTR_CHARBASEINDEX:
return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX);
- case 2:
+ case BG_ATTR_MAPBASEINDEX:
return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX);
- case 3:
+ case BG_ATTR_SCREENSIZE:
return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
- case 4:
+ case BG_ATTR_PALETTEMODE:
return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE);
- case 7:
+ case BG_ATTR_PRIORITY:
return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY);
- case 5:
+ case BG_ATTR_MOSAIC:
return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC);
- case 6:
+ case BG_ATTR_WRAPAROUND:
return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND);
- case 8:
+ case BG_ATTR_METRIC:
switch (GetBgType(bg))
{
- case 0:
- return GetBgMetricTextMode(bg, 0) * 0x800;
- case 1:
- return GetBgMetricAffineMode(bg, 0) * 0x100;
- default:
- return 0;
+ case 0:
+ return GetBgMetricTextMode(bg, 0) * 0x800;
+ case 1:
+ return GetBgMetricAffineMode(bg, 0) * 0x100;
+ default:
+ return 0;
}
- case 9:
+ case BG_ATTR_TYPE:
return GetBgType(bg);
- case 10:
+ case BG_ATTR_BASETILE:
return sGpuBgConfigs2[bg].baseTile;
default:
return -1;
}
}
-u32 ChangeBgX(u8 bg, u32 value, u8 op)
+s32 ChangeBgX(u8 bg, s32 value, u8 op)
{
u8 mode;
u16 temp1;
u16 temp2;
- if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
{
return -1;
}
@@ -610,23 +616,23 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op)
return sGpuBgConfigs2[bg].bg_x;
}
-u32 GetBgX(u8 bg)
+s32 GetBgX(u8 bg)
{
- if (IsInvalidBg32(bg) != FALSE)
+ if (IsInvalidBg32(bg))
return -1;
- else if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
return -1;
else
return sGpuBgConfigs2[bg].bg_x;
}
-u32 ChangeBgY(u8 bg, u32 value, u8 op)
+s32 ChangeBgY(u8 bg, s32 value, u8 op)
{
u8 mode;
u16 temp1;
u16 temp2;
- if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
{
return -1;
}
@@ -690,13 +696,13 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op)
return sGpuBgConfigs2[bg].bg_y;
}
-u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op)
+s32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op)
{
u8 mode;
u16 temp1;
u16 temp2;
- if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ if (IsInvalidBg32(bg) || !GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
{
return -1;
}
@@ -761,11 +767,11 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op)
return sGpuBgConfigs2[bg].bg_y;
}
-u32 GetBgY(u8 bg)
+s32 GetBgY(u8 bg)
{
- if (IsInvalidBg32(bg) != FALSE)
+ if (IsInvalidBg32(bg))
return -1;
- else if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
return -1;
else
return sGpuBgConfigs2[bg].bg_y;
@@ -778,14 +784,10 @@ void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dis
u8 Unused_AdjustBgMosaic(u8 a1, u8 a2)
{
- u16 result;
- s16 test1;
- s16 test2;
+ u16 result = GetGpuReg(REG_OFFSET_MOSAIC);
+ s16 test1 = result & 0xF;
+ s16 test2 = (result >> 4) & 0xF;
- result = GetGpuReg(REG_OFFSET_MOSAIC);
-
- test1 = result & 0xF;
- test2 = (result >> 4) & 0xF;
result &= 0xFF00;
switch (a2)
@@ -853,7 +855,7 @@ u8 Unused_AdjustBgMosaic(u8 a1, u8 a2)
void SetBgTilemapBuffer(u8 bg, void *tilemap)
{
- if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0)
+ if (!IsInvalidBg32(bg) && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
{
sGpuBgConfigs2[bg].tilemap = tilemap;
}
@@ -861,7 +863,7 @@ void SetBgTilemapBuffer(u8 bg, void *tilemap)
void UnsetBgTilemapBuffer(u8 bg)
{
- if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0)
+ if (!IsInvalidBg32(bg) && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
{
sGpuBgConfigs2[bg].tilemap = NULL;
}
@@ -869,9 +871,9 @@ void UnsetBgTilemapBuffer(u8 bg)
void* GetBgTilemapBuffer(u8 bg)
{
- if (IsInvalidBg32(bg) != FALSE)
+ if (IsInvalidBg32(bg))
return NULL;
- else if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ else if (!GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE))
return NULL;
else
return sGpuBgConfigs2[bg].tilemap;
@@ -879,7 +881,7 @@ void* GetBgTilemapBuffer(u8 bg)
void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset)
{
- if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))
{
if (mode != 0)
CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode);
@@ -892,7 +894,7 @@ void CopyBgTilemapBufferToVram(u8 bg)
{
u16 sizeToLoad;
- if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))
{
switch (GetBgType(bg))
{
@@ -912,12 +914,12 @@ void CopyBgTilemapBufferToVram(u8 bg)
void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 width, u8 height)
{
- const void* srcCopy;
+ const void *srcCopy;
u16 destX16;
u16 destY16;
u16 mode;
- if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))
{
switch (GetBgType(bg))
{
@@ -1001,29 +1003,29 @@ void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width,
u16 y16;
u16 mode;
- if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))
{
switch (GetBgType(bg))
{
- case 0:
- for (y16 = y; y16 < (y + height); y16++)
+ case 0:
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
{
- for (x16 = x; x16 < (x + width); x16++)
- {
- ((u16*)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum;
- }
+ ((u16*)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum;
}
- break;
- case 1:
- mode = GetBgMetricAffineMode(bg, 0x1);
- for (y16 = y; y16 < (y + height); y16++)
+ }
+ break;
+ case 1:
+ mode = GetBgMetricAffineMode(bg, 0x1);
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
{
- for (x16 = x; x16 < (x + width); x16++)
- {
- ((u8*)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum;
- }
+ ((u8*)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum;
}
- break;
+ }
+ break;
}
}
}
@@ -1039,52 +1041,48 @@ void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 widt
u16 mode2;
u16 attribute;
u16 mode3;
+ u16 x16, y16;
- u16 x16;
- u16 y16;
-
- if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))
{
attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
mode = GetBgMetricTextMode(bg, 0x1) * 0x20;
mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20;
switch (GetBgType(bg))
{
- case 0:
- for (y16 = y; y16 < (y + height); y16++)
+ case 0:
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
{
- for (x16 = x; x16 < (x + width); x16++)
- {
- CopyTileMapEntry(&firstTileNum, &((u16*)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0);
- firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);
- }
+ CopyTileMapEntry(&firstTileNum, &((u16*)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0);
+ firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);
}
- break;
- case 1:
- mode3 = GetBgMetricAffineMode(bg, 0x1);
- for (y16 = y; y16 < (y + height); y16++)
+ }
+ break;
+ case 1:
+ mode3 = GetBgMetricAffineMode(bg, 0x1);
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
{
- for (x16 = x; x16 < (x + width); x16++)
- {
- ((u8*)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum;
- firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);
- }
+ ((u8*)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum;
+ firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);
}
- break;
+ }
+ break;
}
}
}
u16 GetBgMetricTextMode(u8 bg, u8 whichMetric)
{
- u8 attribute;
-
- attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+ u8 screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
switch (whichMetric)
{
case 0:
- switch (attribute)
+ switch (screenSize)
{
case 0:
return 1;
@@ -1096,7 +1094,7 @@ u16 GetBgMetricTextMode(u8 bg, u8 whichMetric)
}
break;
case 1:
- switch (attribute)
+ switch (screenSize)
{
case 0:
return 1;
@@ -1109,7 +1107,7 @@ u16 GetBgMetricTextMode(u8 bg, u8 whichMetric)
}
break;
case 2:
- switch (attribute)
+ switch (screenSize)
{
case 0:
case 1:
@@ -1125,14 +1123,12 @@ u16 GetBgMetricTextMode(u8 bg, u8 whichMetric)
u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric)
{
- u8 attribute;
-
- attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+ u8 screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
switch (whichMetric)
{
case 0:
- switch (attribute)
+ switch (screenSize)
{
case 0:
return 0x1;
@@ -1146,7 +1142,7 @@ u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric)
break;
case 1:
case 2:
- return 0x10 << attribute;
+ return 0x10 << screenSize;
}
return 0;
}
diff --git a/src/bike.c b/src/bike.c
index b9d247c5d..1e91baab0 100644
--- a/src/bike.c
+++ b/src/bike.c
@@ -19,8 +19,6 @@ extern u8 sub_808B9BC(u8 direction);
extern u8 sub_808B9A4(u8 direction);
extern u8 sub_808C1B4(u8 direction);
extern u8 sub_808B9D4(u8 direction);
-extern void Overworld_ClearSavedMusic(void);
-extern void Overworld_PlaySpecialMapMusic(void);
// this file's functions
static void MovePlayerOnMachBike(u8, u16, u16);
diff --git a/src/blit.c b/src/blit.c
index b4d5f7de5..26a63fe9b 100644
--- a/src/blit.c
+++ b/src/blit.c
@@ -1,12 +1,12 @@
#include "global.h"
#include "blit.h"
-void BlitBitmapRect4BitWithoutColorKey(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)
+void BlitBitmapRect4BitWithoutColorKey(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)
{
BlitBitmapRect4Bit(src, dst, srcX, srcY, dstX, dstY, width, height, 0xFF);
}
-void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey)
+void BlitBitmapRect4Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey)
{
s32 xEnd;
s32 yEnd;
@@ -14,7 +14,7 @@ void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 sr
s32 multiplierDstY;
s32 loopSrcY, loopDstY;
s32 loopSrcX, loopDstX;
- u8 *pixelsSrc;
+ const u8 *pixelsSrc;
u8 *pixelsDst;
s32 toOrr;
s32 toAnd;
@@ -103,7 +103,7 @@ void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 hei
}
}
-void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset)
+void BlitBitmapRect4BitTo8Bit(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset)
{
s32 palOffsetBits;
s32 xEnd;
@@ -112,7 +112,7 @@ void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX,
s32 multiplierDstY;
s32 loopSrcY, loopDstY;
s32 loopSrcX, loopDstX;
- u8 *pixelsSrc;
+ const u8 *pixelsSrc;
u8 *pixelsDst;
s32 colorKeyBits;
diff --git a/src/cable_car.c b/src/cable_car.c
index 00606c905..207a0c22d 100755
--- a/src/cable_car.c
+++ b/src/cable_car.c
@@ -259,7 +259,7 @@ static void CableCarMainCallback_Setup(void)
break;
case 2:
for (i = 0; i < 3; i++)
- LoadCompressedObjectPic(&gUnknown_085CDB54[i]);
+ LoadCompressedSpriteSheet(&gUnknown_085CDB54[i]);
LoadSpritePalettes(gUnknown_085CDB74);
sCableCar->mtChimneyTilemap = malloc_and_decompress(gCableCarMtChimneyTilemap, &sizeOut);
@@ -351,7 +351,7 @@ static void CableCarMainCallback_Run(void)
static void CleanupCableCar(void)
{
u8 i = 0;
-
+
HideBg(0);
HideBg(1);
HideBg(2);
@@ -361,7 +361,7 @@ static void CleanupCableCar(void)
sub_80AB130(WEATHER_NONE);
for (i = 0; i < 20; i++)
gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
-
+
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
diff --git a/src/cable_club.c b/src/cable_club.c
index 56154d5bf..784426d53 100644
--- a/src/cable_club.c
+++ b/src/cable_club.c
@@ -845,7 +845,7 @@ static void sub_80B32B4(u8 taskId)
PlayMapChosenOrBattleBGM(MUS_BATTLE20);
sub_80B3260(gSpecialVar_0x8004);
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
gTrainerBattleOpponent_A = 0x800;
SetMainCallback2(CB2_InitBattle);
gMain.savedCallback = sub_80B360C;
@@ -898,7 +898,7 @@ static void sub_80B33BC(u8 taskId)
data[0] = 6;
break;
case 6:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
data[0] = 7;
}
@@ -911,7 +911,7 @@ static void sub_80B33BC(u8 taskId)
gLinkPlayers[0].linkType = 0x2211;
sub_80B3260(gSpecialVar_0x8004);
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
gTrainerBattleOpponent_A = 0x800;
SetMainCallback2(CB2_InitBattle);
gMain.savedCallback = sub_80B360C;
@@ -1008,7 +1008,7 @@ void sub_80B36EC(void)
LoadPlayerParty();
SavePlayerBag();
}
- copy_saved_warp2_bank_and_enter_x_to_warp1(0x7F);
+ SetWarpDestinationToDynamicWarp(0x7F);
}
void sub_80B371C(void)
@@ -1123,7 +1123,7 @@ static void sub_80B3894(u8 taskId)
data[0]++;
break;
case 3:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sub_8013F78();
DestroyTask(taskId);
diff --git a/src/clock.c b/src/clock.c
index aea6c2088..d52fde22e 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -1,7 +1,8 @@
#include "global.h"
-#include "rom6.h"
#include "event_data.h"
#include "rtc.h"
+#include "time_events.h"
+#include "field_specials.h"
#include "lottery_corner.h"
#include "dewford_trend.h"
#include "tv.h"
@@ -11,17 +12,9 @@
#include "overworld.h"
#include "wallclock.h"
-// static types
-
-// static declarations
-
static void UpdatePerDay(struct Time *localTime);
static void UpdatePerMinute(struct Time *localTime);
-// rodata
-
-// text
-
static void InitTimeBasedEvents(void)
{
FlagSet(FLAG_SYS_CLOCK_SET);
diff --git a/src/contest.c b/src/contest.c
index 3d74109cb..949be7941 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -217,7 +217,6 @@ extern const u8 gText_0827D597[];
extern const struct ContestPokemon gContestOpponents[96];
extern const u8 gUnknown_085898A4[96];
extern const struct CompressedSpriteSheet gUnknown_08587C00;
-extern const u8 gContest2Pal[];
extern const struct SpriteTemplate gSpriteTemplate_8587BE8;
extern const struct CompressedSpriteSheet gUnknown_08587C08;
extern const struct CompressedSpritePalette gUnknown_08587C10;
@@ -271,7 +270,7 @@ void LoadContestBgAfterMoveAnim(void)
CopyBgTilemapBufferToVram(3);
LoadCompressedPalette(gUnknown_08C16E90, 0, 0x200);
sub_80D782C();
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
u32 var = 5 + i;
@@ -285,7 +284,7 @@ void sub_80D779C(void)
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_08587F34, ARRAY_COUNT(gUnknown_08587F34));
- SetBgAttribute(3, BG_CTRL_ATTR_PRIORITY, 1);
+ SetBgAttribute(3, BG_ATTR_WRAPAROUND, 1);
for (i = 0; i < 4; i++)
{
SetBgTilemapBuffer(i, gContestResources->field_24[i]);
@@ -474,14 +473,14 @@ void sub_80D7CB4(u8 taskId)
gTasks[taskId].data[0]++;
// fallthrough
case 1:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sub_800ADF8();
gTasks[taskId].data[0]++;
}
return;
case 2:
- if (sub_800A520() != TRUE)
+ if (IsLinkTaskFinished() != TRUE)
return;
gTasks[taskId].data[0]++;
break;
@@ -747,7 +746,7 @@ void sub_80D8490(u8 taskId)
gBattle_BG0_Y = 0xA0;
gBattle_BG2_Y = 0xA0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
u16 move = gContestMons[gContestPlayerMonIndex].moves[i];
u8 *r5 = sp8;
@@ -782,7 +781,7 @@ void sub_80D8610(u8 taskId)
u8 numMoves = 0;
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gContestMons[gContestPlayerMonIndex].moves[i] != MOVE_NONE)
numMoves++;
@@ -2484,7 +2483,7 @@ u8 sub_80DB0C4(void)
{
u8 spriteId;
- LoadCompressedObjectPic(&gUnknown_08587C00);
+ LoadCompressedSpriteSheet(&gUnknown_08587C00);
LoadCompressedPalette(gContest2Pal, 0x110, 32);
spriteId = CreateSprite(&gSpriteTemplate_8587BE8, 112, 36, 30);
gSprites[spriteId].oam.paletteNum = 1;
@@ -2496,8 +2495,8 @@ u8 sub_80DB120(void)
{
u8 spriteId;
- LoadCompressedObjectPic(&gUnknown_08587C08);
- LoadCompressedObjectPalette(&gUnknown_08587C10);
+ LoadCompressedSpriteSheet(&gUnknown_08587C08);
+ LoadCompressedSpritePalette(&gUnknown_08587C10);
spriteId = CreateSprite(&gSpriteTemplate_8587C18, 96, 10, 29);
gSprites[spriteId].invisible = TRUE;
gSprites[spriteId].data[0] = gSprites[spriteId].oam.tileNum;
diff --git a/src/contest_ai.c b/src/contest_ai.c
index 1342ea102..97e8c8f29 100644
--- a/src/contest_ai.c
+++ b/src/contest_ai.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "contest.h"
#include "random.h"
#include "contest_ai.h"
@@ -807,14 +808,14 @@ static void ContestAICmd_check_move_has_highest_appeal(void)
u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4];
u8 appeal = gContestEffects[gContestMoves[move].effect].appeal;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
u16 newMove = gContestMons[eContestAI->contestantId].moves[i];
if (newMove != 0 && appeal < gContestEffects[gContestMoves[newMove].effect].appeal)
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
eContestAI->scriptResult = TRUE;
else
eContestAI->scriptResult = FALSE;
@@ -838,14 +839,14 @@ static void ContestAICmd_unk_2F(void)
u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4];
u8 jam = gContestEffects[gContestMoves[move].effect].jam;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
u16 newMove = gContestMons[eContestAI->contestantId].moves[i];
if (newMove != 0 && jam < gContestEffects[gContestMoves[newMove].effect].jam)
break;
}
- if (i == 4)
+ if (i == MAX_MON_MOVES)
eContestAI->scriptResult = TRUE;
else
eContestAI->scriptResult = FALSE;
@@ -1019,7 +1020,7 @@ static void ContestAICmd_check_combo_starter(void)
int i;
u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4];
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gContestMons[eContestAI->contestantId].moves[i])
{
@@ -1065,7 +1066,7 @@ static void ContestAICmd_check_combo_finisher(void)
int i;
u16 move = gContestMons[eContestAI->contestantId].moves[eContestAI->unk4];
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gContestMons[eContestAI->contestantId].moves[i])
{
@@ -1677,7 +1678,7 @@ static void ContestAICmd_check_for_exciting_move(void)
int result = 0;
int i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gContestMons[eContestAI->contestantId].moves[i])
{
@@ -1719,7 +1720,7 @@ static void ContestAICmd_unk_85(void)
int i;
u16 arg = T1_READ_16(gAIScriptPtr + 1);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
u16 move = gContestMons[eContestAI->contestantId].moves[i];
if (move == arg)
diff --git a/src/contest_painting_effects.c b/src/contest_painting_effects.c
new file mode 100644
index 000000000..187a0f196
--- /dev/null
+++ b/src/contest_painting_effects.c
@@ -0,0 +1,771 @@
+#include "global.h"
+#include "contest_painting_effects.h"
+#include "contest_painting.h"
+#include "constants/rgb.h"
+
+extern u8 gUnknown_03006164;
+extern u16 (*gUnknown_03006168)[][32];
+extern u8 gUnknown_0300616C;
+extern u8 gUnknown_03006170;
+extern u8 gUnknown_03006174;
+extern u8 gUnknown_03006178;
+extern u8 gUnknown_0300617C;
+extern u8 gUnknown_03006180;
+
+// this file's functions
+void sub_8125230(void);
+void sub_81252E8(void);
+void sub_81254E0(void);
+void sub_8125630(void);
+void sub_8125448(void);
+void sub_81257F8(void);
+void sub_81258A0(void);
+void sub_81256C8(void);
+void sub_8125250(void);
+void sub_81253A4(u8);
+void sub_81250B8(u8);
+void sub_8125170(u8);
+void sub_8125954(u16);
+u16 ConvertColorToGrayscale(u16*);
+u16 sub_8125E18(u16*, u16*, u16*);
+u16 ConvertCoolColor(u16*, u8);
+u16 ConvertToBlackOrWhite(u16*);
+u16 sub_8125C98(u16*, u16*);
+u16 InvertColor(u16*);
+u16 sub_8125F38(u16*, u16*, u16*);
+u16 sub_8125CF4(u16*, u16*);
+u16 GetCoolColorFromPersonality(u8);
+
+void sub_8124F2C(struct Unk030061A0 *info)
+{
+ gUnknown_03006168 = info->var_4;
+ gUnknown_0300617C = info->var_1F;
+ gUnknown_03006164 = info->var_19;
+ gUnknown_03006178 = info->var_1A;
+ gUnknown_03006174 = info->var_1B;
+ gUnknown_0300616C = info->var_1C;
+ gUnknown_03006180 = info->var_1D;
+ gUnknown_03006170 = info->var_1E;
+ switch (info->var_0)
+ {
+ case 2:
+ sub_8125230();
+ break;
+ case 8:
+ sub_81252E8();
+ break;
+ case 9:
+ sub_81254E0();
+ sub_81253A4(gUnknown_0300617C);
+ break;
+ case 10:
+ sub_81254E0();
+ sub_8125630();
+ sub_8125448();
+ case 31:
+ sub_8125630();
+ break;
+ case 11:
+ sub_81254E0();
+ sub_81257F8();
+ sub_81257F8();
+ sub_81258A0();
+ sub_8125448();
+ break;
+ case 13:
+ sub_81256C8();
+ break;
+ case 30:
+ sub_81254E0();
+ break;
+ case 32:
+ sub_81257F8();
+ break;
+ case 33:
+ sub_81258A0();
+ break;
+ case 6:
+ sub_8125250();
+ sub_81250B8(3);
+ break;
+ case 36:
+ sub_81254E0();
+ sub_81257F8();
+ sub_81258A0();
+ sub_8125448();
+ sub_81252E8();
+ sub_81252E8();
+ sub_81250B8(2);
+ sub_8125170(4);
+ break;
+ }
+}
+
+void sub_81250B8(u8 a0) // it changes palette someway somehow... .__.
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16* var2 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ u16* pal = &var2[gUnknown_03006164];
+ for (j = 0; j < gUnknown_03006174; j++, pal++)
+ {
+ if (!(0x8000 & *pal))
+ {
+ u8 val = (31 & *pal);
+ val += a0;
+ if (val > 31)
+ val = 31;
+
+ *pal = RGB2(val, val, val);
+ }
+ }
+ }
+}
+
+void sub_8125170(u8 a0)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16* var2 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ u16* pal = &var2[gUnknown_03006164];
+ for (j = 0; j < gUnknown_03006174; j++, pal++)
+ {
+ if (!(0x8000 & *pal))
+ {
+ u8 val = (31 & *pal);
+ if (val > 31 - a0)
+ val = 31 - (a0 >> 1);
+
+ *pal = RGB2(val, val, val);
+ }
+ }
+ }
+}
+
+void sub_8125230(void)
+{
+ u32 i;
+ for (i = 0; i < 3200; i++)
+ sub_8125954(i);
+}
+
+void sub_8125250(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16* var2 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ u16* color = &var2[gUnknown_03006164];
+ for (j = 0; j < gUnknown_03006174; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = ConvertColorToGrayscale(color);
+ }
+ }
+ }
+}
+
+void sub_81252E8(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_03006174; i++)
+ {
+ u16* var0 = &(*gUnknown_03006168)[0][gUnknown_03006178 * gUnknown_03006180];
+ u16* palette = &var0[gUnknown_03006164 + i];
+ u16 color = *palette;
+
+ j = 1;
+ palette += gUnknown_03006180;
+ while (j < gUnknown_0300616C - 1)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_8125E18(&color, palette, palette + gUnknown_03006180);
+ color = *palette;
+ }
+
+ j++;
+ palette += gUnknown_03006180;
+ }
+ }
+}
+
+void sub_81253A4(u8 arg0)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16* var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ u16* color = &var0[gUnknown_03006164];
+ for (j = 0; j < gUnknown_03006174; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = ConvertCoolColor(color, arg0);
+ }
+ }
+ }
+}
+
+void sub_8125448(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16* var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ u16* color = &var0[gUnknown_03006164];
+ for (j = 0; j < gUnknown_03006174; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = ConvertToBlackOrWhite(color);
+ }
+ }
+ }
+}
+
+void sub_81254E0(void)
+{
+ u8 i, j;
+ u16 *palette;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16 *var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ palette = &var0[gUnknown_03006164];
+ *palette = sub_8125C98(palette, palette + 1);
+ for (j = 1, palette = palette + 1; j < gUnknown_03006174 - 1; j++, palette++)
+ {
+ *palette = sub_8125C98(palette, palette + 1);
+ *palette = sub_8125C98(palette, palette - 1);
+ }
+
+ *palette = sub_8125C98(palette, palette - 1);
+ }
+
+ for (j = 0; j < gUnknown_03006174; j++)
+ {
+ u16 *var0 = &(*gUnknown_03006168)[0][gUnknown_03006178 * gUnknown_03006180];
+ palette = &var0[gUnknown_03006164 + j];
+ *palette = sub_8125C98(palette, palette + gUnknown_03006180);
+ for (i = 1, palette = palette + gUnknown_03006180; i < gUnknown_0300616C - 1; i++, palette += gUnknown_03006180)
+ {
+ *palette = sub_8125C98(palette, palette + gUnknown_03006180);
+ *palette = sub_8125C98(palette, palette - gUnknown_03006180);
+ }
+
+ *palette = sub_8125C98(palette, palette - gUnknown_03006180);
+ }
+}
+
+void sub_8125630(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16 *var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ u16 *color = &var0[gUnknown_03006164];
+ for (j = 0; j < gUnknown_03006174; j++, color++)
+ {
+ if (!(0x8000 & *color))
+ {
+ *color = InvertColor(color);
+ }
+ }
+ }
+}
+
+void sub_81256C8(void)
+{
+ u8 i, j;
+ u16 *palette;
+ u16 color;
+
+ palette = (*gUnknown_03006168)[0];
+ for (i = 0; i < 64; i++)
+ {
+ for (j = 0; j < 64; j++, palette++)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = InvertColor(palette);
+ }
+ }
+ }
+
+ for (j = 0; j < 64; j++)
+ {
+ palette = &(*gUnknown_03006168)[0][j];
+ color = *palette;
+ *palette = 0x8000;
+ for (i = 1, palette += 64; i < 63; i++, palette += 64)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_8125F38(&color, palette, palette + 64);
+ color = *palette;
+ }
+ }
+
+ *palette = 0x8000;
+ palette = &(*gUnknown_03006168)[0][j];
+ color = *palette;
+ *palette = 0x8000;
+ for (i = 1, palette += 64; i < 63; i++, palette += 64)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_8125F38(&color, palette, palette + 64);
+ color = *palette;
+ }
+ }
+
+ *palette = 0x8000;
+ }
+
+ palette = (*gUnknown_03006168)[0];
+ for (i = 0; i < 64; i++)
+ {
+ for (j = 0; j < 64; j++, palette++)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = InvertColor(palette);
+ }
+ }
+ }
+}
+
+void sub_81257F8(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_0300616C; i++)
+ {
+ u16 *var0 = &(*gUnknown_03006168)[0][(gUnknown_03006178 + i) * gUnknown_03006180];
+ u16 *palette = &var0[gUnknown_03006164];
+ u16 color = *palette;
+ for (j = 1, palette++; j < gUnknown_03006174 - 1; j++, palette++)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_8125CF4(&color, palette);
+ color = *palette;
+ }
+ }
+ }
+}
+
+void sub_81258A0(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < gUnknown_03006174; i++)
+ {
+ u16* var0 = &(*gUnknown_03006168)[0][gUnknown_03006178 * gUnknown_03006180];
+ u16* palette = &var0[gUnknown_03006164 + i];
+ u16 color = *palette;
+ for (j = 1, palette += gUnknown_03006180; j < gUnknown_0300616C - 1; j++, palette += gUnknown_03006180)
+ {
+ if (!(0x8000 & *palette))
+ {
+ *palette = sub_8125CF4(&color, palette);
+ color = *palette;
+ }
+ }
+ }
+}
+
+struct Unk8125954
+{
+ u8 unk0;
+ u8 unk1;
+ u16 unk2;
+};
+
+extern const u8 gUnknown_085A1F94[][3];
+
+void sub_8125954(u16 arg0)
+{
+ u8 i;
+ u8 r5, r9;
+ struct Unk8125954 unkStruct[6];
+
+ unkStruct[0].unk0 = gUnknown_085A1F94[arg0][0];
+ unkStruct[0].unk1 = gUnknown_085A1F94[arg0][1];
+ unkStruct[0].unk2 = (gUnknown_085A1F94[arg0][2] >> 3) & 7;
+
+ r9 = (gUnknown_085A1F94[arg0][2] >> 1) & 3;
+ r5 = gUnknown_085A1F94[arg0][2] & 1;
+ for (i = 1; i < unkStruct[0].unk2; i++)
+ {
+ if (!r5)
+ {
+ unkStruct[i].unk0 = unkStruct[0].unk0 - i;
+ unkStruct[i].unk1 = unkStruct[0].unk1 + i;
+ }
+ else
+ {
+ unkStruct[i].unk0 = unkStruct[0].unk0 + 1;
+ unkStruct[i].unk1 = unkStruct[0].unk1 - 1;
+ }
+
+ if (unkStruct[i].unk0 > 63 || unkStruct[i].unk1 > 63)
+ {
+ unkStruct[0].unk2 = i - 1;
+ break;
+ }
+
+ unkStruct[i].unk2 = unkStruct[0].unk2 - i;
+ }
+
+ for (i = 0; i < unkStruct[0].unk2; i++)
+ {
+ u16 *pal = &(*gUnknown_03006168)[unkStruct[i].unk1 * 2][unkStruct[i].unk0];
+
+ if (!(0x8000 & *pal))
+ {
+ u16 r = (*pal) & 0x1F;
+ u16 g = (*pal >> 5) & 0x1F;
+ u16 b = (*pal >> 10) & 0x1F;
+
+ switch (r9)
+ {
+ case 0:
+ case 1:
+ switch (((gUnknown_085A1F94[arg0][2] >> 3) & 7) % 3)
+ {
+ case 0:
+ if (r >= unkStruct[i].unk2)
+ r -= unkStruct[i].unk2;
+ else
+ r = 0;
+ break;
+ case 1:
+ if (g >= unkStruct[i].unk2)
+ g -= unkStruct[i].unk2;
+ else
+ g = 0;
+ break;
+ case 2:
+ if (b >= unkStruct[i].unk2)
+ b -= unkStruct[i].unk2;
+ else
+ b = 0;
+ break;
+ }
+ break;
+ case 2:
+ case 3:
+ r += unkStruct[i].unk2;
+ g += unkStruct[i].unk2;
+ b += unkStruct[i].unk2;
+ if (r > 31)
+ r = 31;
+ if (g > 31)
+ g = 31;
+ if (b > 31)
+ b = 31;
+ break;
+ }
+
+ *pal = RGB2(r, g, b);
+ }
+ }
+}
+
+u16 ConvertColorToGrayscale(u16 *color)
+{
+ s32 clr = *color;
+ s32 r = clr & 0x1F;
+ s32 g = (clr >> 5) & 0x1F;
+ s32 b = (clr >> 10) & 0x1F;
+ s32 gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
+ return RGB2(gray, gray, gray);
+}
+
+// The dark colors are the colored edges of the Cool painting effect.
+// Everything else is white.
+u16 ConvertCoolColor(u16 *color, u8 personality)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+
+ if (red < 17 && green < 17 && blue < 17)
+ return GetCoolColorFromPersonality(personality);
+ else
+ return RGB_WHITE;
+}
+
+// Based on the given value, which comes from the first 8 bits of
+// the mon's personality value, return a color.
+u16 GetCoolColorFromPersonality(u8 personality)
+{
+ u16 red = 0;
+ u16 green = 0;
+ u16 blue = 0;
+ u8 strength = (personality / 6) % 3;
+ u8 colorType = personality % 6;
+
+ switch (colorType)
+ {
+ case 0:
+ // Teal color
+ green = 21 - strength;
+ blue = green;
+ red = 0;
+ break;
+ case 1:
+ // Yellow color
+ blue = 0;
+ red = 21 - strength;
+ green = red;
+ break;
+ case 2:
+ // Purple color
+ blue = 21 - strength;
+ green = 0;
+ red = blue;
+ break;
+ case 3:
+ // Red color
+ blue = 0;
+ green = 0;
+ red = 23 - strength;
+ break;
+ case 4:
+ // Blue color
+ blue = 23 - strength;
+ green = 0;
+ red = 0;
+ break;
+ case 5:
+ // Green color
+ blue = 0;
+ green = 23 - strength;
+ red = 0;
+ break;
+ }
+
+ return RGB2(red, green, blue);
+}
+
+u16 ConvertToBlackOrWhite(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+
+ if (red < 17 && green < 17 && blue < 17)
+ return RGB_BLACK;
+ else
+ return RGB_WHITE;
+}
+
+u16 sub_8125C98(u16 *colorA, u16 *colorB)
+{
+ if (*colorA)
+ {
+ if (*colorA & 0x8000)
+ return 0x8000;
+ if (*colorB & 0x8000)
+ return RGB_BLACK;
+
+ return *colorA;
+ }
+
+ return RGB_BLACK;
+}
+
+u16 InvertColor(u16 *color)
+{
+ u16 red = *color & 0x1F;
+ u16 green = (*color >> 5) & 0x1F;
+ u16 blue = (*color >> 10) & 0x1F;
+
+ red = 31 - red;
+ green = 31 - green;
+ blue = 31 - blue;
+
+ return RGB2(red, green, blue);
+}
+
+u16 sub_8125CF4(u16 *a0, u16 *a1)
+{
+ u16 sp0[2][3];
+ u16 spC[3];
+ u8 r4;
+ u16 r2;
+ u16 r, g, b;
+
+ if (*a0 == *a1)
+ return *a1;
+
+ sp0[0][0] = (*a0 >> 0) & 0x1F;
+ sp0[0][1] = (*a0 >> 5) & 0x1F;
+ sp0[0][2] = (*a0 >> 10) & 0x1F;
+ sp0[1][0] = (*a1 >> 0) & 0x1F;
+ sp0[1][1] = (*a1 >> 5) & 0x1F;
+ sp0[1][2] = (*a1 >> 10) & 0x1F;
+
+ if (sp0[0][0] > 25 && sp0[0][1] > 25 && sp0[0][2] > 25)
+ return *a1;
+ if (sp0[1][0] > 25 && sp0[1][1] > 25 && sp0[1][2] > 25)
+ return *a1;
+
+ for (r4 = 0; r4 < 3; r4++)
+ {
+ if (sp0[0][r4] > sp0[1][r4])
+ spC[r4] = sp0[0][r4] - sp0[1][r4];
+ else
+ spC[r4] = sp0[1][r4] - sp0[0][r4];
+ }
+
+ if (spC[0] >= spC[1])
+ {
+ if (spC[0] >= spC[2])
+ r2 = spC[0];
+ else if (spC[1] >= spC[2])
+ r2 = spC[1];
+ else
+ r2 = spC[2];
+ }
+ else
+ {
+ if (spC[1] >= spC[2])
+ r2 = spC[1];
+ else if (spC[2] >= spC[0])
+ r2 = spC[2];
+ else
+ r2 = spC[0];
+ }
+
+ r = (sp0[1][0] * (31 - r2 / 2)) / 31;
+ g = (sp0[1][1] * (31 - r2 / 2)) / 31;
+ b = (sp0[1][2] * (31 - r2 / 2)) / 31;
+ return RGB2(r, g, b);
+}
+
+u16 sub_8125E18(u16 * a0, u16 * a1, u16 * a2)
+{
+ u16 red, green, blue;
+ u16 avg0, avg1, avg2;
+ u16 diff1, diff2;
+ u32 minimum;
+ u16 factor;
+
+ if (*a0 == *a1 && *a2 == *a1)
+ return *a1;
+
+ red = (*a1 >> 0) & 0x1F;
+ green = (*a1 >> 5) & 0x1F;
+ blue = (*a1 >> 10) & 0x1F;
+
+ avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3;
+ avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3;
+ avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3;
+
+ if (avg0 == avg1 && avg2 == avg1)
+ return *a1;
+
+ if (avg0 > avg1)
+ diff1 = avg0 - avg1;
+ else
+ diff1 = avg1 - avg0;
+
+ if (avg2 > avg1)
+ diff2 = avg2 - avg1;
+ else
+ diff2 = avg1 - avg2;
+
+ if (diff1 >= diff2)
+ minimum = diff1;
+ else
+ minimum = diff2;
+
+ factor = 31 - minimum / 2;
+ red = red * factor / 31;
+ green = green * factor / 31;
+ blue = blue * factor / 31;
+ return RGB2(red, green, blue);
+}
+
+u16 sub_8125F38(u16 *a0, u16 *a1, u16 *a2)
+{
+ u16 red, green, blue;
+ u16 avg0, avg1, avg2;
+ u16 diff1, diff2;
+ u32 minimum;
+ u16 factor;
+
+ if (*a0 == *a1 && *a2 == *a1)
+ return *a1;
+
+ red = (*a1 >> 0) & 0x1F;
+ green = (*a1 >> 5) & 0x1F;
+ blue = (*a1 >> 10) & 0x1F;
+
+ avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3;
+ avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3;
+ avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3;
+
+ if (avg0 == avg1 && avg2 == avg1)
+ return *a1;
+
+ if (avg0 > avg1)
+ diff1 = avg0 - avg1;
+ else
+ diff1 = avg1 - avg0;
+
+ if (avg2 > avg1)
+ diff2 = avg2 - avg1;
+ else
+ diff2 = avg1 - avg2;
+
+ if (diff1 >= diff2)
+ minimum = diff1;
+ else
+ minimum = diff2;
+
+ factor = 31 - minimum;
+ red = red * factor / 31;
+ green = green * factor / 31;
+ blue = blue * factor / 31;
+ return RGB2(red, green, blue);
+}
+
+/*
+void sub_8126058(struct Unk030061A0 *arg0)
+{
+ u16 i, j, k;
+ u8 r5 = arg0->var_1D >> 3;
+ u8 var_24 = arg0->var_1E >> 3;
+ u16 (*var_2C)[][32] = arg0->var_4;
+ u32 var_28 = arg0->var_10;
+
+ if (arg0->var_16 == 2)
+ {
+ for (i = 0; i < var_24; i++)
+ {
+ for (j = 0; j < r5; j++)
+ {
+ for (k = 0; k < 8; k++)
+ {
+ (*var_2C)[][];
+ }
+ }
+ }
+ }
+}
+*/
diff --git a/src/credits.c b/src/credits.c
index 67ab97481..3639d36e4 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -1102,7 +1102,6 @@ static const struct SpriteTemplate gUnknown_085E7068 =
.callback = sub_81772B8,
};
-void sub_8175620(void);
static void sub_8175744(u8 taskIdA);
static void sub_8175774(u8 taskIdA);
static void sub_8175808(u8 taskIdA);
@@ -1964,9 +1963,9 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA)
case 2:
if (gSaveBlock2Ptr->playerGender == MALE)
{
- LoadCompressedObjectPic(gUnknown_085F5334);
- LoadCompressedObjectPic(gUnknown_085F53BC);
- LoadCompressedObjectPic(gUnknown_085F5354);
+ LoadCompressedSpriteSheet(gUnknown_085F5334);
+ LoadCompressedSpriteSheet(gUnknown_085F53BC);
+ LoadCompressedSpriteSheet(gUnknown_085F5354);
LoadSpritePalettes(gUnknown_085F5384);
spriteId = intro_create_brendan_sprite(120, 46);
@@ -1981,9 +1980,9 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA)
}
else
{
- LoadCompressedObjectPic(gUnknown_085F5344);
- LoadCompressedObjectPic(gUnknown_085F53AC);
- LoadCompressedObjectPic(gUnknown_085F5354);
+ LoadCompressedSpriteSheet(gUnknown_085F5344);
+ LoadCompressedSpriteSheet(gUnknown_085F53AC);
+ LoadCompressedSpriteSheet(gUnknown_085F5354);
LoadSpritePalettes(gUnknown_085F5384);
spriteId = intro_create_may_sprite(120, 46);
@@ -2220,8 +2219,8 @@ static void sub_8177050(struct Sprite *sprite)
}
else
{
- SetGpuReg(REG_OFFSET_BLDCNT, 0xF40);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x10);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
sprite->oam.objMode = 1;
sprite->data[3] = 16;
sprite->data[0] += 1;
diff --git a/src/dark.c b/src/dark.c
index d4a4f0b8a..ecd466da8 100644
--- a/src/dark.c
+++ b/src/dark.c
@@ -1,11 +1,29 @@
#include "global.h"
#include "battle_anim.h"
+#include "contest.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "palette.h"
+#include "scanline_effect.h"
+#include "trig.h"
+#include "util.h"
#include "constants/rgb.h"
-extern void sub_81138D4(struct Sprite *);
-extern void sub_81139DC(struct Sprite *);
-extern void sub_8113A90(struct Sprite *);
-extern void sub_81144BC(struct Sprite *);
+void sub_81138D4(struct Sprite *);
+void sub_81139DC(struct Sprite *);
+void sub_8113A90(struct Sprite *);
+void sub_81144BC(struct Sprite *);
+static void sub_811375C(u8);
+static void sub_811381C(u8);
+static void sub_8113950(struct Sprite *);
+static void sub_8113A18(struct Sprite *);
+static void sub_8113A58(struct Sprite *);
+static void sub_8113B90(struct Sprite *);
+static void sub_8113D60(u8);
+static void sub_81140C8(u8);
+static void sub_8114244(struct Task *);
+static void sub_8114374(u8);
+static void sub_8114748(u8);
const struct SpriteTemplate gUnknown_08596FC8 =
{
@@ -167,3 +185,797 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_8597138 =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_81144BC,
};
+
+void sub_81136E8(u8 taskId)
+{
+ int battler;
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ battler = gBattleAnimAttacker;
+ gTasks[taskId].data[1] = 16;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
+ if (GetBattlerSpriteBGPriorityRank(battler) == 1)
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ else
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
+
+ gTasks[taskId].func = sub_811375C;
+}
+
+static void sub_811375C(u8 taskId)
+{
+ u8 blendA = gTasks[taskId].data[1] >> 8;
+ u8 blendB = gTasks[taskId].data[1];
+ if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])
+ {
+ blendA++;
+ blendB--;
+ gTasks[taskId].data[1] = BLDALPHA_BLEND(blendB, blendA);
+ SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
+ gTasks[taskId].data[2] = 0;
+ if (blendA == 16)
+ {
+ gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = 1;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[2]++;
+ }
+}
+
+void sub_81137E4(u8 taskId)
+{
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = BLDALPHA_BLEND(0, 16);
+ gTasks[taskId].func = sub_811381C;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
+}
+
+static void sub_811381C(u8 taskId)
+{
+ u8 blendA = gTasks[taskId].data[1] >> 8;
+ u8 blendB = gTasks[taskId].data[1];
+ if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])
+ {
+ blendA--;
+ blendB++;
+ gTasks[taskId].data[1] = (blendA << 8) | blendB;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
+ gTasks[taskId].data[2] = 0;
+ if (blendA == 0)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[2]++;
+ }
+}
+
+void sub_8113888(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ else
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_81138D4(struct Sprite *sprite)
+{
+ sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->data[3] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[0] = 0x7E;
+ InitSpriteDataForLinearTranslation(sprite);
+ sprite->data[3] = -sprite->data[1];
+ sprite->data[4] = -sprite->data[2];
+ sprite->data[6] = 0xFFD8;
+ sprite->callback = sub_8113950;
+ sprite->callback(sprite);
+}
+
+static void sub_8113950(struct Sprite *sprite)
+{
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x = sprite->data[3] >> 8;
+ sprite->pos2.y = sprite->data[4] >> 8;
+ if (sprite->data[7] == 0)
+ {
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x = sprite->data[3] >> 8;
+ sprite->pos2.y = sprite->data[4] >> 8;
+ sprite->data[0]--;
+ }
+
+ sprite->pos2.y += Sin(sprite->data[5], sprite->data[6]);
+ sprite->data[5] = (sprite->data[5] + 3) & 0xFF;
+ if (sprite->data[5] > 0x7F)
+ {
+ sprite->data[5] = 0;
+ sprite->data[6] += 20;
+ sprite->data[7]++;
+ }
+
+ if (--sprite->data[0] == 0)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_81139DC(struct Sprite *sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = gBattleAnimArgs[4];
+ sprite->data[2] = gBattleAnimArgs[5];
+ sprite->callback = sub_8113A18;
+}
+
+static void sub_8113A18(struct Sprite *sprite)
+{
+ sprite->data[4] += sprite->data[0];
+ sprite->data[5] += sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = sprite->data[5] >> 8;
+ if (++sprite->data[3] == sprite->data[2])
+ sprite->callback = sub_8113A58;
+}
+
+static void sub_8113A58(struct Sprite *sprite)
+{
+ sprite->data[4] -= sprite->data[0];
+ sprite->data[5] -= sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = sprite->data[5] >> 8;
+ if (--sprite->data[3] == 0)
+ DestroySpriteAndMatrix(sprite);
+}
+
+void sub_8113A90(struct Sprite *sprite)
+{
+ u8 battler;
+ s8 xOffset;
+
+ if (gBattleAnimArgs[0] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ xOffset = 20;
+ sprite->oam.tileNum += 4;
+
+ switch (gBattleAnimArgs[1])
+ {
+ case 0:
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 8;
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;
+ break;
+ case 1:
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 14;
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;
+ break;
+ case 2:
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 8;
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;
+ StartSpriteAffineAnim(sprite, 1);
+ xOffset = -20;
+ break;
+ case 3:
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 14;
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;
+ StartSpriteAffineAnim(sprite, 1);
+ xOffset = -20;
+ break;
+ }
+
+ sprite->data[0] = 32;
+ sprite->data[2] = sprite->pos1.x + xOffset;
+ sprite->data[4] = sprite->pos1.y + 12;
+ sprite->data[5] = -12;
+
+ InitAnimArcTranslation(sprite);
+ sprite->callback = sub_8113B90;
+}
+
+static void sub_8113B90(struct Sprite *sprite)
+{
+ if (TranslateAnimArc(sprite))
+ DestroySpriteAndMatrix(sprite);
+}
+
+void sub_8113BAC(u8 taskId)
+{
+ struct ScanlineEffectParams scanlineParams;
+ struct UnknownAnimStruct2 unknownStruct;
+ u16 i;
+ u8 pos;
+ int var0;
+ struct Task *task = &gTasks[taskId];
+
+ task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 31;
+ task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) - 7;
+ task->data[5] = task->data[7];
+ task->data[4] = task->data[6];
+ task->data[13] = (task->data[7] - task->data[6]) << 8;
+
+ pos = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ task->data[14] = pos - 32;
+ task->data[15] = pos + 32;
+
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ task->data[8] = -12;
+ else
+ task->data[8] = -64;
+
+ task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
+ if (task->data[3] == 1)
+ {
+ sub_80A6B30(&unknownStruct);
+ task->data[10] = gBattle_BG1_Y;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ FillPalette(0, unknownStruct.unk8 << 4, 32);
+ scanlineParams.dmaDest = &REG_BG1VOFS;
+ var0 = WINOUT_WIN01_BG1;
+ if (!IsContest())
+ gBattle_BG2_X += 240;
+ }
+ else
+ {
+ task->data[10] = gBattle_BG2_Y;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
+ FillPalette(0, 144, 32);
+ scanlineParams.dmaDest = &REG_BG2VOFS;
+ var0 = WINOUT_WIN01_BG2;
+ if (!IsContest())
+ gBattle_BG1_X += 240;
+ }
+
+ scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ task->data[11] = 0;
+ task->data[12] = 16;
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ sub_8114374(3);
+ for (i = 0; i < 112; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[10];
+ gScanlineEffectRegBuffers[1][i] = task->data[10];
+ }
+
+ ScanlineEffect_SetParams(scanlineParams);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)));
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+ gBattle_WIN0V = 160;
+
+ task->func = sub_8113D60;
+}
+
+static void sub_8113D60(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ if (++task->data[2] & 1)
+ {
+ if (task->data[11] != 12)
+ task->data[11]++;
+ }
+ else
+ {
+ if (task->data[12] != 8)
+ task->data[12]--;
+ }
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));
+
+ if (task->data[11] == 12 && task->data[12] == 8)
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ task->data[4] -= 8;
+ sub_8114244(task);
+
+ if (task->data[4] < task->data[8])
+ task->data[0]++;
+ break;
+ case 2:
+ task->data[4] -= 8;
+ sub_8114244(task);
+ task->data[14] += 4;
+ task->data[15] -= 4;
+
+ if (task->data[14] >= task->data[15])
+ task->data[14] = task->data[15];
+
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+
+ if (task->data[14] == task->data[15])
+ task->data[0]++;
+ break;
+ case 3:
+ gScanlineEffect.state = 3;
+ task->data[0]++;
+ break;
+ case 4:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_8113E78(u8 taskId)
+{
+ struct UnknownAnimStruct2 unknownStruct;
+ struct ScanlineEffectParams scanlineParams;
+ u8 x;
+ u16 i;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (IsContest() == TRUE)
+ {
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
+ if (task->data[3] == 1)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ gBattle_BG2_X += 240;
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
+ gBattle_BG1_X += 240;
+ }
+
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (task->data[3] == 1)
+ {
+ sub_80A6B30(&unknownStruct);
+ task->data[10] = gBattle_BG1_Y;
+ FillPalette(0, unknownStruct.unk8 << 4, 32);
+ }
+ else
+ {
+ task->data[10] = gBattle_BG2_Y;
+ FillPalette(0, 144, 32);
+ }
+
+ sub_8114374(3);
+ task->data[0]++;
+ break;
+ case 2:
+ task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 31;
+ task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) - 7;
+ task->data[13] = (task->data[7] - task->data[6]) << 8;
+ x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ task->data[14] = x - 4;
+ task->data[15] = x + 4;
+
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ task->data[8] = -12;
+ else
+ task->data[8] = -64;
+
+ task->data[4] = task->data[8];
+ task->data[5] = task->data[8];
+ task->data[11] = 12;
+ task->data[12] = 8;
+ task->data[0]++;
+ break;
+ case 3:
+ if (task->data[3] == 1)
+ scanlineParams.dmaDest = &REG_BG1VOFS;
+ else
+ scanlineParams.dmaDest = &REG_BG2VOFS;
+
+ for (i = 0; i < 112; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i);
+ gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i);
+ }
+
+ scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ ScanlineEffect_SetParams(scanlineParams);
+ task->data[0]++;
+ break;
+ case 4:
+ if (task->data[3] == 1)
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ else
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+ gBattle_WIN0V = 160;
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));
+ task->func = sub_81140C8;
+ break;
+ }
+}
+
+static void sub_81140C8(u8 taskId)
+{
+ u8 pos;
+ u16 i;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[5] += 8;
+ if (task->data[5] >= task->data[7])
+ task->data[5] = task->data[7];
+
+ sub_8114244(task);
+ if (task->data[5] == task->data[7])
+ task->data[0]++;
+ break;
+ case 1:
+ if (task->data[15] - task->data[14] < 0x40)
+ {
+ task->data[14] -= 4;
+ task->data[15] += 4;
+ }
+ else
+ {
+ task->data[1] = 1;
+ }
+
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+ task->data[4] += 8;
+ if (task->data[4] >= task->data[6])
+ task->data[4] = task->data[6];
+
+ sub_8114244(task);
+ if (task->data[4] == task->data[6] && task->data[1])
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ if (task->data[2] & 1)
+ {
+ if (task->data[11])
+ task->data[11]--;
+ }
+ else
+ {
+ if (task->data[12] < 16)
+ task->data[12]++;
+ }
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));
+ if (task->data[11] == 0 && task->data[12] == 16)
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ gScanlineEffect.state = 3;
+ task->data[0]++;
+ break;
+ case 4:
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void sub_8114244(struct Task *task)
+{
+ int var0, var1;
+ s16 var2;
+ s16 i;
+ int var4;
+
+ var2 = task->data[5] - task->data[4];
+ if (var2 != 0)
+ {
+ var0 = task->data[13] / var2;
+ var1 = task->data[6] << 8;
+
+ for (i = 0; i < task->data[4]; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159);
+ }
+
+ for (i = task->data[4]; i <= task->data[5]; i++)
+ {
+ if (i >= 0)
+ {
+ s16 var3 = (var1 >> 8) - i;
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10];
+ }
+
+ var1 += var0;
+ }
+
+ var4 = task->data[10] - (i - 159);
+ for (i = i; i < task->data[7]; i++)
+ {
+ if (i >= 0)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4;
+ var4--;
+ }
+ }
+ }
+ else
+ {
+ var4 = task->data[10] + 159;
+ for (i = 0; i < 112; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = var4;
+ gScanlineEffectRegBuffers[1][i] = var4;
+ var4--;
+ }
+ }
+}
+
+static void sub_8114374(u8 priority)
+{
+ u16 i;
+
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
+ {
+ u8 spriteId = GetAnimBattlerSpriteId(i);
+ if (spriteId != 0xFF)
+ gSprites[spriteId].oam.priority = priority;
+ }
+}
+
+void sub_81143C0(u8 taskId)
+{
+ u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0;
+ MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2, TRUE);
+ gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = 0;
+
+ if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
+ {
+ MoveBattlerSpriteToBG(gBattleAnimAttacker ^ 2, toBG2 ^ 1, TRUE);
+ gSprites[gBattlerSpriteIds[gBattleAnimAttacker ^ 2]].invisible = 0;
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8114470(u8 taskId)
+{
+ u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0;
+ sub_80A477C(toBG2);
+
+ if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
+ sub_80A477C(toBG2 ^ 1);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_81144BC(struct Sprite *sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void sub_81144F8(u8 taskId)
+{
+ u16 species;
+ u8 spriteId;
+ u8 newSpriteId;
+ u16 paletteNum;
+ struct UnknownAnimStruct2 unknownStruct;
+ int var0 = 0;
+
+ gBattle_WIN0H = var0;
+ gBattle_WIN0V = var0;
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+
+ if (IsDoubleBattle() && !IsContest())
+ {
+ if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT)
+ {
+ if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE)
+ {
+ gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority--;
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ var0 = 1;
+ }
+ }
+ }
+
+ if (IsContest())
+ {
+ species = gContestResources->field_18->species;
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ else
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ }
+
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ newSpriteId = sub_80A89C8(gBattleAnimAttacker, spriteId, species);
+
+ sub_80A6B30(&unknownStruct);
+ sub_80A6D48(unknownStruct.bgId, gUnknown_08C1D210);
+ sub_80A6CC0(unknownStruct.bgId, gUnknown_08C1D0AC, unknownStruct.tilesOffset);
+ LoadCompressedPalette(gUnknown_08C1D1E8, unknownStruct.unk8 << 4, 32);
+
+ gBattle_BG1_X = -gSprites[spriteId].pos1.x + 96;
+ gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32;
+ paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
+
+ if (gBattleAnimArgs[1] == 0)
+ SetGreyscaleOrOriginalPalette(paletteNum, FALSE);
+ else
+ BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]);
+
+ gTasks[taskId].data[0] = newSpriteId;
+ gTasks[taskId].data[1] = gBattleAnimArgs[0];
+ gTasks[taskId].data[2] = gBattleAnimArgs[1];
+ gTasks[taskId].data[3] = gBattleAnimArgs[2];
+ gTasks[taskId].data[6] = var0;
+ gTasks[taskId].func = sub_8114748;
+}
+
+static void sub_8114748(u8 taskId)
+{
+ struct UnknownAnimStruct2 unknownStruct;
+ u16 paletteNum;
+ u8 spriteId;
+ u8 taskIdCopy = taskId;
+
+ gTasks[taskIdCopy].data[10] += 4;
+ gBattle_BG1_X -= 4;
+ if (gTasks[taskIdCopy].data[10] == 128)
+ {
+ gTasks[taskIdCopy].data[10] = 0;
+ gBattle_BG1_X += 128;
+ gTasks[taskIdCopy].data[11]++;
+ if (gTasks[taskIdCopy].data[11] == 2)
+ {
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
+ if (gTasks[taskIdCopy].data[1] == 0)
+ SetGreyscaleOrOriginalPalette(paletteNum, 1);
+
+ DestroySprite(&gSprites[gTasks[taskIdCopy].data[0]]);
+ sub_80A6B30(&unknownStruct);
+ sub_80A6C68(unknownStruct.bgId);
+ if (gTasks[taskIdCopy].data[6] == 1)
+ gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++;
+ }
+ else if (gTasks[taskIdCopy].data[11] == 3)
+ {
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void sub_811489C(u8 taskId)
+{
+ u8 spriteId;
+ u8 battler;
+ bool8 calcSpriteId = FALSE;
+ u8 position = B_POSITION_PLAYER_LEFT;
+
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ break;
+ case 4:
+ position = B_POSITION_PLAYER_LEFT;
+ calcSpriteId = TRUE;
+ break;
+ case 5:
+ position = B_POSITION_PLAYER_RIGHT;
+ calcSpriteId = TRUE;
+ break;
+ case 6:
+ position = B_POSITION_OPPONENT_LEFT;
+ calcSpriteId = TRUE;
+ break;
+ case 7:
+ position = B_POSITION_OPPONENT_RIGHT;
+ calcSpriteId = TRUE;
+ break;
+ default:
+ spriteId = 0xFF;
+ break;
+ }
+
+ if (calcSpriteId)
+ {
+ battler = GetBattlerAtPosition(position);
+ if (IsBattlerSpriteVisible(battler))
+ spriteId = gBattlerSpriteIds[battler];
+ else
+ spriteId = 0xFF;
+ }
+
+ if (spriteId != 0xFF)
+ SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8114960(u8 taskId)
+{
+ if (gAnimMoveTurn < 2)
+ gBattleAnimArgs[7] = 0;
+
+ if (gAnimMoveTurn == 2)
+ gBattleAnimArgs[7] = 1;
+
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h
index 078304888..86ebb620b 100644
--- a/src/data/pokemon/base_stats.h
+++ b/src/data/pokemon/base_stats.h
@@ -1,7 +1,40 @@
-// Maximum value for a female pokemon is 254 (MON_FEMALE) which is 100% female.
-// 255 (MON_GENDERLESS) is reserved for genderless pokemon.
+// Maximum value for a female Pokmon is 254 (MON_FEMALE) which is 100% female.
+// 255 (MON_GENDERLESS) is reserved for genderless Pokmon.
#define PERCENT_FEMALE(percent) min(254, ((percent * 255) / 100))
+#define OLD_UNOWN_BASE_STATS \
+ { \
+ .baseHP = 50, \
+ .baseAttack = 150, \
+ .baseDefense = 50, \
+ .baseSpAttack = 150, \
+ .baseSpDefense = 50, \
+ .baseSpeed = 150, \
+ .type1 = TYPE_NORMAL, \
+ .type2 = TYPE_NORMAL, \
+ .catchRate = 3, \
+ .expYield = 1, \
+ .evYield_HP = 2, \
+ .evYield_Attack = 2, \
+ .evYield_Defense = 2, \
+ .evYield_Speed = 2, \
+ .evYield_SpAttack = 2, \
+ .evYield_SpDefense = 2, \
+ .item1 = ITEM_NONE, \
+ .item2 = ITEM_NONE, \
+ .genderRatio = MON_GENDERLESS, \
+ .eggCycles = 120, \
+ .friendship = 0, \
+ .growthRate = GROWTH_MEDIUM_FAST, \
+ .eggGroup1 = EGG_GROUP_UNDISCOVERED,\
+ .eggGroup2 = EGG_GROUP_UNDISCOVERED,\
+ .ability1 = ABILITY_NONE, \
+ .ability2 = ABILITY_NONE, \
+ .safariZoneFleeRate = 0, \
+ .bodyColor = BODY_COLOR_BLACK, \
+ .noFlip = FALSE, \
+ }
+
const struct BaseStats gBaseStats[] =
{
[SPECIES_NONE] = {0},
@@ -8289,830 +8322,55 @@ const struct BaseStats gBaseStats[] =
.noFlip = FALSE,
},
- [SPECIES_OLD_UNOWN_B] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_B] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_C] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_C] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_D] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_D] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_E] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_E] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_F] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_F] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_G] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_G] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_H] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_H] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_I] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_I] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_J] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_J] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_K] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_K] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_L] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_L] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_M] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_M] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_N] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_N] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_O] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_O] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_P] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_P] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_Q] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_Q] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_R] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_R] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_S] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_S] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_T] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_T] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_U] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_U] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_V] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_V] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_W] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_W] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_X] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_X] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_Y] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_Y] = OLD_UNOWN_BASE_STATS,
- [SPECIES_OLD_UNOWN_Z] =
- {
- .baseHP = 50,
- .baseAttack = 150,
- .baseDefense = 50,
- .baseSpeed = 150,
- .baseSpAttack = 150,
- .baseSpDefense = 50,
- .type1 = TYPE_NORMAL,
- .type2 = TYPE_NORMAL,
- .catchRate = 3,
- .expYield = 1,
- .evYield_HP = 2,
- .evYield_Attack = 2,
- .evYield_Defense = 2,
- .evYield_Speed = 2,
- .evYield_SpAttack = 2,
- .evYield_SpDefense = 2,
- .item1 = ITEM_NONE,
- .item2 = ITEM_NONE,
- .genderRatio = MON_GENDERLESS,
- .eggCycles = 120,
- .friendship = 0,
- .growthRate = GROWTH_MEDIUM_FAST,
- .eggGroup1 = EGG_GROUP_UNDISCOVERED,
- .eggGroup2 = EGG_GROUP_UNDISCOVERED,
- .ability1 = ABILITY_NONE,
- .ability2 = ABILITY_NONE,
- .safariZoneFleeRate = 0,
- .bodyColor = BODY_COLOR_BLACK,
- .noFlip = FALSE,
- },
+ [SPECIES_OLD_UNOWN_Z] = OLD_UNOWN_BASE_STATS,
[SPECIES_TREECKO] =
{
diff --git a/src/data/pokemon/tutor_learnsets.h b/src/data/pokemon/tutor_learnsets.h
new file mode 100644
index 000000000..27fb40621
--- /dev/null
+++ b/src/data/pokemon/tutor_learnsets.h
@@ -0,0 +1,5783 @@
+#define TUTOR_MOVE_MEGA_PUNCH 0
+#define TUTOR_MOVE_SWORDS_DANCE 1
+#define TUTOR_MOVE_MEGA_KICK 2
+#define TUTOR_MOVE_BODY_SLAM 3
+#define TUTOR_MOVE_DOUBLE_EDGE 4
+#define TUTOR_MOVE_COUNTER 5
+#define TUTOR_MOVE_SEISMIC_TOSS 6
+#define TUTOR_MOVE_MIMIC 7
+#define TUTOR_MOVE_METRONOME 8
+#define TUTOR_MOVE_SOFT_BOILED 9
+#define TUTOR_MOVE_DREAM_EATER 10
+#define TUTOR_MOVE_THUNDER_WAVE 11
+#define TUTOR_MOVE_EXPLOSION 12
+#define TUTOR_MOVE_ROCK_SLIDE 13
+#define TUTOR_MOVE_SUBSTITUTE 14
+#define TUTOR_MOVE_DYNAMIC_PUNCH 15
+#define TUTOR_MOVE_ROLLOUT 16
+#define TUTOR_MOVE_PSYCH_UP 17
+#define TUTOR_MOVE_SNORE 18
+#define TUTOR_MOVE_ICY_WIND 19
+#define TUTOR_MOVE_ENDURE 20
+#define TUTOR_MOVE_MUD_SLAP 21
+#define TUTOR_MOVE_ICE_PUNCH 22
+#define TUTOR_MOVE_SWAGGER 23
+#define TUTOR_MOVE_SLEEP_TALK 24
+#define TUTOR_MOVE_SWIFT 25
+#define TUTOR_MOVE_DEFENSE_CURL 26
+#define TUTOR_MOVE_THUNDER_PUNCH 27
+#define TUTOR_MOVE_FIRE_PUNCH 28
+#define TUTOR_MOVE_FURY_CUTTER 29
+
+const u16 gTutorMoves[] =
+{
+ [TUTOR_MOVE_MEGA_PUNCH] = MOVE_MEGA_PUNCH,
+ [TUTOR_MOVE_SWORDS_DANCE] = MOVE_SWORDS_DANCE,
+ [TUTOR_MOVE_MEGA_KICK] = MOVE_MEGA_KICK,
+ [TUTOR_MOVE_BODY_SLAM] = MOVE_BODY_SLAM,
+ [TUTOR_MOVE_DOUBLE_EDGE] = MOVE_DOUBLE_EDGE,
+ [TUTOR_MOVE_COUNTER] = MOVE_COUNTER,
+ [TUTOR_MOVE_SEISMIC_TOSS] = MOVE_SEISMIC_TOSS,
+ [TUTOR_MOVE_MIMIC] = MOVE_MIMIC,
+ [TUTOR_MOVE_METRONOME] = MOVE_METRONOME,
+ [TUTOR_MOVE_SOFT_BOILED] = MOVE_SOFT_BOILED,
+ [TUTOR_MOVE_DREAM_EATER] = MOVE_DREAM_EATER,
+ [TUTOR_MOVE_THUNDER_WAVE] = MOVE_THUNDER_WAVE,
+ [TUTOR_MOVE_EXPLOSION] = MOVE_EXPLOSION,
+ [TUTOR_MOVE_ROCK_SLIDE] = MOVE_ROCK_SLIDE,
+ [TUTOR_MOVE_SUBSTITUTE] = MOVE_SUBSTITUTE,
+ [TUTOR_MOVE_DYNAMIC_PUNCH] = MOVE_DYNAMIC_PUNCH,
+ [TUTOR_MOVE_ROLLOUT] = MOVE_ROLLOUT,
+ [TUTOR_MOVE_PSYCH_UP] = MOVE_PSYCH_UP,
+ [TUTOR_MOVE_SNORE] = MOVE_SNORE,
+ [TUTOR_MOVE_ICY_WIND] = MOVE_ICY_WIND,
+ [TUTOR_MOVE_ENDURE] = MOVE_ENDURE,
+ [TUTOR_MOVE_MUD_SLAP] = MOVE_MUD_SLAP,
+ [TUTOR_MOVE_ICE_PUNCH] = MOVE_ICE_PUNCH,
+ [TUTOR_MOVE_SWAGGER] = MOVE_SWAGGER,
+ [TUTOR_MOVE_SLEEP_TALK] = MOVE_SLEEP_TALK,
+ [TUTOR_MOVE_SWIFT] = MOVE_SWIFT,
+ [TUTOR_MOVE_DEFENSE_CURL] = MOVE_DEFENSE_CURL,
+ [TUTOR_MOVE_THUNDER_PUNCH] = MOVE_THUNDER_PUNCH,
+ [TUTOR_MOVE_FIRE_PUNCH] = MOVE_FIRE_PUNCH,
+ [TUTOR_MOVE_FURY_CUTTER] = MOVE_FURY_CUTTER,
+};
+
+#define TUTOR_LEARNSET(moves) ((u32)(moves))
+#define TUTOR(move) ((u64)1 << (TUTOR_##move))
+
+static const u32 sTutorLearnsets[] =
+{
+ [SPECIES_NONE] = TUTOR_LEARNSET(0),
+
+ [SPECIES_BULBASAUR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_IVYSAUR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_VENUSAUR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CHARMANDER] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CHARMELEON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CHARIZARD] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SQUIRTLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_WARTORTLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_BLASTOISE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_CATERPIE] = TUTOR_LEARNSET(0),
+
+ [SPECIES_METAPOD] = TUTOR_LEARNSET(0),
+
+ [SPECIES_BUTTERFREE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_WEEDLE] = TUTOR_LEARNSET(0),
+
+ [SPECIES_KAKUNA] = TUTOR_LEARNSET(0),
+
+ [SPECIES_BEEDRILL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_PIDGEY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_PIDGEOTTO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_PIDGEOT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_RATTATA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_RATICATE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SPEAROW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_FEAROW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_EKANS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_ARBOK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_PIKACHU] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_RAICHU] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_SANDSHREW] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SANDSLASH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_NIDORAN_F] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_NIDORINA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_NIDOQUEEN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_NIDORAN_M] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_NIDORINO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_NIDOKING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CLEFAIRY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_CLEFABLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_VULPIX] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_NINETALES] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_JIGGLYPUFF] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_WIGGLYTUFF] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_ZUBAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_GOLBAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_ODDISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_GLOOM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_VILEPLUME] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_PARAS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_PARASECT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_VENONAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_VENOMOTH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_DIGLETT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_DUGTRIO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_MEOWTH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_PERSIAN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_PSYDUCK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_GOLDUCK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_MANKEY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_PRIMEAPE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_GROWLITHE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_ARCANINE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_POLIWAG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_POLIWHIRL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_POLIWRATH] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_ABRA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_KADABRA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_ALAKAZAM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MACHOP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MACHOKE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MACHAMP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_BELLSPROUT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_WEEPINBELL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_VICTREEBEL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_TENTACOOL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_TENTACRUEL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_GEODUDE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_GRAVELER] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_GOLEM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_PONYTA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_RAPIDASH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SLOWPOKE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SLOWBRO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_MAGNEMITE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MAGNETON] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_FARFETCHD] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_DODUO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_DODRIO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SEEL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_DEWGONG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_GRIMER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MUK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_SHELLDER] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_CLOYSTER] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_GASTLY] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_HAUNTER] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_GENGAR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_ONIX] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_DROWZEE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_HYPNO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_KRABBY] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_KINGLER] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_VOLTORB] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_ELECTRODE] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_EXEGGCUTE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_EXEGGUTOR] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_CUBONE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MAROWAK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_HITMONLEE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_HITMONCHAN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_LICKITUNG] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_KOFFING] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_WEEZING] = TUTOR_LEARNSET(TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_RHYHORN] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_RHYDON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CHANSEY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_TANGELA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_KANGASKHAN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_HORSEA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SEADRA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_GOLDEEN] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SEAKING] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_STARYU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_STARMIE] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MR_MIME] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_SCYTHER] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_JYNX] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_ELECTABUZZ] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MAGMAR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_PINSIR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_TAUROS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_MAGIKARP] = TUTOR_LEARNSET(0),
+
+ [SPECIES_GYARADOS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_LAPRAS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_DITTO] = TUTOR_LEARNSET(0),
+
+ [SPECIES_EEVEE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_VAPOREON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_JOLTEON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_FLAREON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_PORYGON] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_OMANYTE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_OMASTAR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_KABUTO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_KABUTOPS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_AERODACTYL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SNORLAX] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_ARTICUNO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_ZAPDOS] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MOLTRES] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_DRATINI] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_DRAGONAIR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_DRAGONITE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_MEWTWO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MEW] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CHIKORITA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_BAYLEEF] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_MEGANIUM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CYNDAQUIL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_QUILAVA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_TYPHLOSION] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_TOTODILE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_CROCONAW] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_FERALIGATR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SENTRET] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_FURRET] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_HOOTHOOT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_NOCTOWL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_LEDYBA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_LEDIAN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_SPINARAK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_ARIADOS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_CROBAT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_CHINCHOU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_LANTURN] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_PICHU] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_CLEFFA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_IGGLYBUFF] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_TOGEPI] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_TOGETIC] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_NATU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_XATU] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MAREEP] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_FLAAFFY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_AMPHAROS] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_BELLOSSOM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_MARILL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_AZUMARILL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SUDOWOODO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_POLITOED] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_HOPPIP] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SKIPLOOM] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_JUMPLUFF] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_AIPOM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SUNKERN] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_SUNFLORA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_YANMA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_WOOPER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_QUAGSIRE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_ESPEON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_UMBREON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MURKROW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SLOWKING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_MISDREAVUS] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_UNOWN] = TUTOR_LEARNSET(0),
+
+ [SPECIES_WOBBUFFET] = TUTOR_LEARNSET(0),
+
+ [SPECIES_GIRAFARIG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_PINECO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_FORRETRESS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_DUNSPARCE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_GLIGAR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_STEELIX] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SNUBBULL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_GRANBULL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_QWILFISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SCIZOR] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SHUCKLE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_HERACROSS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SNEASEL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_TEDDIURSA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_URSARING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SLUGMA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_MAGCARGO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SWINUB] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_PILOSWINE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_CORSOLA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_REMORAID] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_OCTILLERY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_DELIBIRD] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MANTINE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SKARMORY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_HOUNDOUR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_HOUNDOOM] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_KINGDRA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_PHANPY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_DONPHAN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_PORYGON2] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_STANTLER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SMEARGLE] = TUTOR_LEARNSET(0),
+
+ [SPECIES_TYROGUE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_HITMONTOP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SMOOCHUM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_ELEKID] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MAGBY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MILTANK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_BLISSEY] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SOFT_BOILED)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_RAIKOU] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_ENTEI] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SUICUNE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_LARVITAR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_PUPITAR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_TYRANITAR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_LUGIA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_HO_OH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_CELEBI] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_TREECKO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_GROVYLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SCEPTILE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_TORCHIC] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_COMBUSKEN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_BLAZIKEN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_MUDKIP] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_MARSHTOMP] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SWAMPERT] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_POOCHYENA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_MIGHTYENA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_ZIGZAGOON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_LINOONE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_WURMPLE] = TUTOR_LEARNSET(0),
+
+ [SPECIES_SILCOON] = TUTOR_LEARNSET(0),
+
+ [SPECIES_BEAUTIFLY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_CASCOON] = TUTOR_LEARNSET(0),
+
+ [SPECIES_DUSTOX] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_LOTAD] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_LOMBRE] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_LUDICOLO] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_SEEDOT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_NUZLEAF] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SHIFTRY] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_NINCADA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_NINJASK] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SHEDINJA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_TAILLOW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SWELLOW] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SHROOMISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_BRELOOM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SPINDA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_WINGULL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_PELIPPER] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_SURSKIT] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MASQUERAIN] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_WAILMER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_WAILORD] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SKITTY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_DELCATTY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_KECLEON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_BALTOY] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_CLAYDOL] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_NOSEPASS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_TORKOAL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_SABLEYE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_BARBOACH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_WHISCASH] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_LUVDISC] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_CORPHISH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CRAWDAUNT] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_FEEBAS] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MILOTIC] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_CARVANHA] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SHARPEDO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_TRAPINCH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_VIBRAVA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_FLYGON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_MAKUHITA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_HARIYAMA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_ELECTRIKE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_MANECTRIC] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_NUMEL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_CAMERUPT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SPHEAL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SEALEO] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_WALREIN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_CACNEA] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CACTURNE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SNORUNT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_GLALIE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_LUNATONE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SOLROCK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_AZURILL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_SPOINK] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_GRUMPIG] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_PLUSLE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_MINUN] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_MAWILE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_MEDITITE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_MEDICHAM] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_SWABLU] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_ALTARIA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_WYNAUT] = TUTOR_LEARNSET(0),
+
+ [SPECIES_DUSKULL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_DUSCLOPS] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_ROSELIA] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SLAKOTH] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_VIGOROTH] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SLAKING] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_GULPIN] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_SWALOT] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_TROPIUS] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_WHISMUR] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_LOUDRED] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_EXPLOUD] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_CLAMPERL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_HUNTAIL] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_GOREBYSS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)),
+
+ [SPECIES_ABSOL] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SHUPPET] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_BANETTE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_SEVIPER] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_ZANGOOSE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_RELICANTH] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_ARON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_LAIRON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_AGGRON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_CASTFORM] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_VOLBEAT] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_ILLUMISE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_LILEEP] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_CRADILY] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)),
+
+ [SPECIES_ANORITH] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_ARMALDO] = TUTOR_LEARNSET(TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_RALTS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_KIRLIA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_GARDEVOIR] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_BAGON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SHELGON] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_SALAMENCE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_BELDUM] = TUTOR_LEARNSET(0),
+
+ [SPECIES_METANG] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_METAGROSS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_REGIROCK] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_REGICE] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_REGISTEEL] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_EXPLOSION)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)),
+
+ [SPECIES_KYOGRE] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+ [SPECIES_GROUDON] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_SWORDS_DANCE)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_RAYQUAZA] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_LATIAS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_LATIOS] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_FURY_CUTTER)),
+
+ [SPECIES_JIRACHI] = TUTOR_LEARNSET(TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_METRONOME)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_DEFENSE_CURL)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_DEOXYS] = TUTOR_LEARNSET(TUTOR(MOVE_MEGA_PUNCH)
+ | TUTOR(MOVE_MEGA_KICK)
+ | TUTOR(MOVE_BODY_SLAM)
+ | TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_COUNTER)
+ | TUTOR(MOVE_SEISMIC_TOSS)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_THUNDER_WAVE)
+ | TUTOR(MOVE_ROCK_SLIDE)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_DYNAMIC_PUNCH)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_MUD_SLAP)
+ | TUTOR(MOVE_ICE_PUNCH)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_SWIFT)
+ | TUTOR(MOVE_THUNDER_PUNCH)
+ | TUTOR(MOVE_FIRE_PUNCH)),
+
+ [SPECIES_CHIMECHO] = TUTOR_LEARNSET(TUTOR(MOVE_DOUBLE_EDGE)
+ | TUTOR(MOVE_MIMIC)
+ | TUTOR(MOVE_DREAM_EATER)
+ | TUTOR(MOVE_SUBSTITUTE)
+ | TUTOR(MOVE_ROLLOUT)
+ | TUTOR(MOVE_PSYCH_UP)
+ | TUTOR(MOVE_SNORE)
+ | TUTOR(MOVE_ICY_WIND)
+ | TUTOR(MOVE_ENDURE)
+ | TUTOR(MOVE_SWAGGER)
+ | TUTOR(MOVE_SLEEP_TALK)
+ | TUTOR(MOVE_DEFENSE_CURL)),
+
+};
+
diff --git a/src/daycare.c b/src/daycare.c
index 131540f6e..6bdbd987e 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -16,33 +16,16 @@
#include "menu.h"
#include "international_string_util.h"
#include "script.h"
+#include "strings.h"
#include "task.h"
#include "window.h"
+#include "party_menu.h"
#include "list_menu.h"
#include "overworld.h"
#define EGG_MOVES_ARRAY_COUNT 10
#define EGG_LVL_UP_MOVES_ARRAY_COUNT 50
-// text
-extern const u8 gText_MaleSymbol4[];
-extern const u8 gText_FemaleSymbol4[];
-extern const u8 gText_GenderlessSymbol[];
-extern const u8 gText_NewLine2[];
-extern const u8 gText_Exit4[];
-extern const u8 gText_Lv[];
-extern const u8 gExpandedPlaceholder_Empty[];
-extern const u8 gText_Exit[];
-extern const u8 gDaycareText_GetAlongVeryWell[];
-extern const u8 gDaycareText_GetAlong[];
-extern const u8 gDaycareText_DontLikeOther[];
-extern const u8 gDaycareText_PlayOther[];
-
-extern u8 GetCursorSelectionMonId(void);
-extern u16 ItemIdToBattleMoveId(u16);
-extern void sub_819746C(u8, bool8);
-extern void sub_81B9328(void);
-
// this file's functions
static void ClearDaycareMonMail(struct DayCareMail *mail);
static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare);
@@ -653,7 +636,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
u16 i, j;
numSharedParentMoves = 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
sHatchedEggMotherMoves[i] = 0;
sHatchedEggFatherMoves[i] = 0;
@@ -665,7 +648,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
sHatchedEggLevelUpMoves[i] = 0;
numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), sHatchedEggLevelUpMoves);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
sHatchedEggFatherMoves[i] = GetBoxMonData(father, MON_DATA_MOVE1 + i);
sHatchedEggMotherMoves[i] = GetBoxMonData(mother, MON_DATA_MOVE1 + i);
@@ -673,7 +656,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
numEggMoves = GetEggMoves(egg, sHatchedEggEggMoves);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (sHatchedEggFatherMoves[i] != MOVE_NONE)
{
@@ -692,7 +675,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
break;
}
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (sHatchedEggFatherMoves[i] != MOVE_NONE)
{
@@ -706,18 +689,18 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
}
}
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (sHatchedEggFatherMoves[i] == MOVE_NONE)
break;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
if (sHatchedEggFatherMoves[i] == sHatchedEggMotherMoves[j] && sHatchedEggFatherMoves[i] != MOVE_NONE)
sHatchedEggFinalMoves[numSharedParentMoves++] = sHatchedEggFatherMoves[i];
}
}
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (sHatchedEggFinalMoves[i] == MOVE_NONE)
break;
@@ -901,7 +884,7 @@ static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare)
for (i = 0; i < DAYCARE_MON_COUNT; i++)
{
- if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SANITY_BIT2))
+ if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SANITY_HAS_SPECIES))
daycare->mons[i].steps++, validEggs++;
}
@@ -922,7 +905,7 @@ static bool8 _DoEggActions_CheckHatch(struct DayCare *daycare)
{
if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
continue;
- if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT1))
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG))
continue;
steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP);
diff --git a/src/decompress.c b/src/decompress.c
index 24d23209f..949b96990 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -22,7 +22,7 @@ void LZDecompressVram(const u32 *src, void *dest)
LZ77UnCompVram(src, dest);
}
-u16 LoadCompressedObjectPic(const struct CompressedSpriteSheet *src)
+u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src)
{
struct SpriteSheet dest;
@@ -33,7 +33,7 @@ u16 LoadCompressedObjectPic(const struct CompressedSpriteSheet *src)
return LoadSpriteSheet(&dest);
}
-void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)
+void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer)
{
struct SpriteSheet dest;
@@ -44,7 +44,7 @@ void LoadCompressedObjectPicOverrideBuffer(const struct CompressedSpriteSheet *s
LoadSpriteSheet(&dest);
}
-void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src)
+void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src)
{
struct SpritePalette dest;
@@ -54,7 +54,7 @@ void LoadCompressedObjectPalette(const struct CompressedSpritePalette *src)
LoadSpritePalette(&dest);
}
-void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)
+void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer)
{
struct SpritePalette dest;
@@ -66,7 +66,7 @@ void LoadCompressedObjectPaletteOverrideBuffer(const struct CompressedSpritePale
void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
{
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
else
LZ77UnCompWram(src->data, buffer);
@@ -102,7 +102,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32
else
LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
}
- else if (species > SPECIES_EGG) // is species unknown? draw the ? icon
+ else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
else
LZ77UnCompWram(src->data, dest);
@@ -465,7 +465,7 @@ u32 GetDecompressedDataSize(const u32 *ptr)
return (ptr8[3] << 16) | (ptr8[2] << 8) | (ptr8[1]);
}
-bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src)
+bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src)
{
struct SpriteSheet dest;
void* buffer;
@@ -482,7 +482,7 @@ bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src)
return FALSE;
}
-bool8 LoadCompressedObjectPaletteUsingHeap(const struct CompressedSpritePalette *src)
+bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src)
{
struct SpritePalette dest;
void* buffer;
@@ -499,7 +499,7 @@ bool8 LoadCompressedObjectPaletteUsingHeap(const struct CompressedSpritePalette
void DecompressPicFromTable_2(const struct CompressedSpriteSheet *src, void* buffer, s32 species) // a copy of DecompressPicFromTable
{
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
else
LZ77UnCompWram(src->data, buffer);
@@ -523,7 +523,7 @@ void LoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s
else
LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
}
- else if (species > SPECIES_EGG) // is species unknown? draw the ? icon
+ else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
else
LZ77UnCompWram(src->data, dest);
@@ -546,7 +546,7 @@ void HandleLoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *d
void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species)
{
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
LZ77UnCompWram(gMonFrontPicTable[0].data, buffer);
else
LZ77UnCompWram(src->data, buffer);
@@ -581,7 +581,7 @@ void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src
else
LZ77UnCompWram(gMonFrontPicTable[i].data, dest);
}
- else if (species > SPECIES_EGG) // is species unknown? draw the ? icon
+ else if (species > NUM_SPECIES) // is species unknown? draw the ? icon
LZ77UnCompWram(gMonFrontPicTable[0].data, dest);
else
LZ77UnCompWram(src->data, dest);
diff --git a/src/decoration.c b/src/decoration.c
index dd691721a..438f2cbd1 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -519,7 +519,7 @@ void sub_8126B80(u8 taskId)
if (!gPaletteFade.active)
{
- menuPos = GetMenuCursorPos();
+ menuPos = Menu_GetCursorPos();
switch (Menu_ProcessInput())
{
default:
@@ -527,7 +527,7 @@ void sub_8126B80(u8 taskId)
sSecretBasePCMenuActions[sSecretBasePCMenuCursorPos].func.void_u8(taskId);
break;
case -2:
- sSecretBasePCMenuCursorPos = GetMenuCursorPos();
+ sSecretBasePCMenuCursorPos = Menu_GetCursorPos();
if ((s8)menuPos != sSecretBasePCMenuCursorPos)
{
sub_8126C08();
@@ -1131,7 +1131,7 @@ void sub_8127ACC(u8 taskId)
void sub_8127B04(u8 taskId)
{
DrawWholeMapView();
- Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]);
+ SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]);
WarpIntoMap();
}
@@ -2065,7 +2065,7 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
LoadSpriteSheet(&sheet);
palette.data = GetDecorationIconPicOrPalette(decor, 1);
palette.tag = paletteTag;
- LoadCompressedObjectPalette(&palette);
+ LoadCompressedSpritePalette(&palette);
template = malloc(sizeof(struct SpriteTemplate));
*template = gItemIconSpriteTemplate;
template->tileTag = tilesTag;
diff --git a/src/dma3_manager.c b/src/dma3_manager.c
index 28df9d932..51fa7072d 100644
--- a/src/dma3_manager.c
+++ b/src/dma3_manager.c
@@ -1,9 +1,6 @@
#include "global.h"
#include "dma3.h"
-// Maximum amount of data we will transfer in one operation
-#define MAX_DMA_BLOCK_SIZE 0x1000
-
#define MAX_DMA_REQUESTS 128
#define DMA_REQUEST_COPY32 1
@@ -40,49 +37,6 @@ void ClearDma3Requests(void)
gDma3ManagerLocked = FALSE;
}
-#define Dma3CopyLarge_(src, dest, size, bit) \
-{ \
- const void *_src = src; \
- void *_dest = dest; \
- u32 _size = size; \
- while (1) \
- { \
- if (_size <= MAX_DMA_BLOCK_SIZE) \
- { \
- DmaCopy##bit(3, _src, _dest, _size); \
- break; \
- } \
- DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
- _src += MAX_DMA_BLOCK_SIZE; \
- _dest += MAX_DMA_BLOCK_SIZE; \
- _size -= MAX_DMA_BLOCK_SIZE; \
- } \
-}
-
-#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
-#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
-
-#define Dma3FillLarge_(value, dest, size, bit) \
-{ \
- void *_dest = dest; \
- u32 _size = size; \
- while (1) \
- { \
- if (_size <= MAX_DMA_BLOCK_SIZE) \
- { \
- DmaFill##bit(3, value, _dest, _size); \
- break; \
- } \
- DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
- _dest += MAX_DMA_BLOCK_SIZE; \
- _size -= MAX_DMA_BLOCK_SIZE; \
- } \
-}
-
-#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
-#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
-
-
void ProcessDma3Requests(void)
{
u16 bytesTransferred;
diff --git a/src/dragon.c b/src/dragon.c
index 68577988e..4a2ac1c51 100644
--- a/src/dragon.c
+++ b/src/dragon.c
@@ -274,8 +274,8 @@ void sub_8113250(struct Sprite *sprite)
sprite->data[4] = 0;
sprite->data[5] = 1;
sprite->data[6] = gBattleAnimArgs[0];
- r5 = sub_80A861C(gBattlerAttacker, 0);
- r0 = sub_80A861C(gBattlerAttacker, 1);
+ r5 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_HEIGHT);
+ r0 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_WIDTH);
if (r5 > r0)
sprite->data[7] = r5 / 2;
else
diff --git a/src/easy_chat.c b/src/easy_chat.c
index c4bc02e42..c84895df5 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -364,7 +364,7 @@ void easy_chat_input_maybe(void)
default:
return;
}
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
sub_811A20C(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript, sizeParam);
}
@@ -383,7 +383,7 @@ static void sub_811A7E4(void)
{
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
lilycoveLady->quiz.unk_016 = -1;
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
sub_811A8F0();
}
return;
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index ed25a2c68..e1d94889a 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -23,6 +23,7 @@
#include "bg.h"
#include "m4a.h"
#include "window.h"
+#include "graphics.h"
#include "constants/abilities.h"
#include "daycare.h"
#include "overworld.h"
@@ -30,6 +31,7 @@
#include "field_weather.h"
#include "international_string_util.h"
#include "naming_screen.h"
+#include "pokemon_storage_system.h"
#include "field_screen_effect.h"
#include "battle.h" // to get rid of later
@@ -51,19 +53,10 @@ struct EggHatchData
};
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
-extern const u8 gBattleTextboxTiles[];
-extern const u8 gBattleTextboxTilemap[];
-extern const u8 gBattleTextboxPalette[];
-extern const u16 gTradeGba2_Pal[]; // palette, gameboy advance
-extern const u32 gTradeGba_Gfx[]; // tileset gameboy advance
extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle
extern const u8 gText_HatchedFromEgg[];
extern const u8 gText_NickHatchPrompt[];
-extern void PlayRainSoundEffect(void);
-extern u16 sub_80D22D0(void);
-extern u8 CountPartyAliveNonEggMonsExcept(u8);
-
static void Task_EggHatch(u8 taskID);
static void CB2_EggHatch_0(void);
static void CB2_EggHatch_1(void);
@@ -382,7 +375,7 @@ static void AddHatchedMonToParty(u8 id)
caughtLvl = 0;
SetMonData(mon, MON_DATA_MET_LEVEL, &caughtLvl);
- mapNameID = sav1_map_get_name();
+ mapNameID = GetCurrentRegionMapSectionId();
SetMonData(mon, MON_DATA_MET_LOCATION, &mapNameID);
MonRestorePP(mon);
@@ -442,7 +435,7 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species],
gMonSpritesGfxPtr->sprites[(a0 * 2) + 1],
species, pid);
- LoadCompressedObjectPalette(GetMonSpritePalStruct(mon));
+ LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
*speciesLoc = species;
}
break;
@@ -474,7 +467,7 @@ static void Task_EggHatch(u8 taskID)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_EggHatch_0);
gFieldCallback = sub_80AF168;
DestroyTask(taskID);
@@ -505,7 +498,7 @@ static void CB2_EggHatch_0(void)
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
- SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, 2);
+ SetBgAttribute(1, BG_ATTR_PRIORITY, 2);
SetBgTilemapBuffer(1, Alloc(0x1000));
SetBgTilemapBuffer(0, Alloc(0x2000));
@@ -876,7 +869,7 @@ u8 GetEggStepsToSubtract(void)
u8 count, i;
for (count = CalculatePlayerPartyCount(), i = 0; i < count; i++)
{
- if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3))
+ if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG))
{
u8 ability = GetMonAbility(&gPlayerParty[i]);
if (ability == ABILITY_MAGMA_ARMOR || ability == ABILITY_FLAME_BODY)
@@ -888,7 +881,7 @@ u8 GetEggStepsToSubtract(void)
u16 sub_80722E0(void)
{
- u16 value = sub_80D22D0();
- value += CountPartyAliveNonEggMonsExcept(6);
- return value;
+ u16 aliveNonEggMonsCount = CountStorageNonEggMons();
+ aliveNonEggMonsCount += CountPartyAliveNonEggMonsExcept(6);
+ return aliveNonEggMonsCount;
}
diff --git a/src/electric.c b/src/electric.c
index ed495fa59..142a9ca09 100644
--- a/src/electric.c
+++ b/src/electric.c
@@ -6,7 +6,6 @@
#include "sound.h"
extern void sub_810E2C8(struct Sprite *);
-extern bool8 sub_810B614(struct Task *task, u8 taskId);
extern void TranslateAnimSpriteToTargetMonLocation(struct Sprite *);
static void sub_810A1A8(struct Sprite *);
@@ -38,6 +37,8 @@ static void sub_810B1F0(struct Sprite *);
static void sub_810B23C(struct Sprite *);
static bool8 sub_810B430(struct Task *task, u8 taskId);
static void sub_810B51C(struct Sprite *);
+static bool8 sub_810B614(struct Task *task, u8 taskId);
+static void sub_810B684(struct Sprite *sprite);
const union AnimCmd gUnknown_085956A4[] =
{
@@ -462,7 +463,7 @@ static void sub_810A1A8(struct Sprite *sprite)
sprite->pos1.x -= gBattleAnimArgs[0];
else
sprite->pos1.x += gBattleAnimArgs[0];
-
+
sprite->pos1.y += gBattleAnimArgs[1];
sprite->callback = sub_810A1F8;
}
@@ -479,7 +480,7 @@ static void sub_810A214(struct Sprite *sprite)
sprite->pos1.x -= gBattleAnimArgs[0];
else
sprite->pos1.x += gBattleAnimArgs[0];
-
+
sprite->callback = sub_810A258;
}
@@ -493,7 +494,7 @@ static void sub_810A274(struct Sprite *sprite)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
-
+
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
sprite->pos1.x -= gBattleAnimArgs[0];
@@ -615,7 +616,7 @@ static void sub_810A5BC(struct Sprite *sprite)
{
if (IsContest() || GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
-
+
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
sprite->data[3] = gBattleAnimArgs[0];
@@ -686,17 +687,16 @@ void sub_810A7DC(u8 taskId)
gTasks[taskId].func = sub_810A834;
}
-#ifdef NONMATCHING // couldn't get the proper tail merging in the "CreateSprite" switch cases.(ported from ruby)
static void sub_810A834(u8 taskId)
{
u16 r8;
+ u16 r2;
s16 r12;
- s16 r2;
u8 spriteId = 0;
u8 r7 = 0;
u8 sp = gTasks[taskId].data[2];
- s16 r4 = gTasks[taskId].data[0];
- s16 r6 = gTasks[taskId].data[1];
+ s16 x = gTasks[taskId].data[0];
+ s16 y = gTasks[taskId].data[1];
if (!gTasks[taskId].data[2])
{
@@ -714,27 +714,31 @@ static void sub_810A834(u8 taskId)
switch (gTasks[taskId].data[10])
{
case 0:
- r8 += r2 * 0;
- spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 1), 2);
+ r12 *= 1;
+ spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2);
r7++;
break;
case 2:
+ r12 *= 2;
r8 += r2;
- spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 2), 2);
+ spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2);
r7++;
break;
case 4:
+ r12 *= 3;
r8 += r2 * 2;
- spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 3), 2);
+ spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2);
r7++;
break;
case 6:
+ r12 *= 4;
r8 += r2 * 3;
- spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 4), 2);
+ spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2);
r7++;
break;
case 8:
- spriteId = CreateSprite(&gUnknown_08595828, r4, r6 + (r12 * 5), 2);
+ r12 *= 5;
+ spriteId = CreateSprite(&gUnknown_08595828, x, y + r12, 2);
r7++;
break;
case 10:
@@ -751,211 +755,6 @@ static void sub_810A834(u8 taskId)
gTasks[taskId].data[10]++;
}
-#else
-NAKED
-static void sub_810A834(u8 taskId)
-{
- asm_unified("\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x4\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- movs r5, 0\n\
- movs r7, 0\n\
- ldr r1, =gTasks\n\
- lsls r0, 2\n\
- add r0, r9\n\
- lsls r0, 3\n\
- adds r0, r1\n\
- ldrb r2, [r0, 0xC]\n\
- str r2, [sp]\n\
- ldrh r4, [r0, 0x8]\n\
- ldrh r6, [r0, 0xA]\n\
- movs r3, 0xC\n\
- ldrsh r0, [r0, r3]\n\
- mov r10, r1\n\
- cmp r0, 0\n\
- bne _0810A878\n\
- movs r0, 0\n\
- mov r8, r0\n\
- movs r2, 0x1\n\
- movs r1, 0x10\n\
- mov r12, r1\n\
- b _0810A882\n\
- .pool\n\
-_0810A878:\n\
- movs r2, 0x10\n\
- mov r12, r2\n\
- movs r3, 0x8\n\
- mov r8, r3\n\
- movs r2, 0x4\n\
-_0810A882:\n\
- mov r0, r9\n\
- lsls r1, r0, 2\n\
- adds r0, r1, r0\n\
- lsls r0, 3\n\
- add r0, r10\n\
- movs r3, 0x1C\n\
- ldrsh r0, [r0, r3]\n\
- mov r10, r1\n\
- cmp r0, 0xA\n\
- bhi _0810A978\n\
- lsls r0, 2\n\
- ldr r1, =_0810A8A4\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
-_0810A8A4:\n\
- .4byte _0810A8D0\n\
- .4byte _0810A978\n\
- .4byte _0810A8E4\n\
- .4byte _0810A978\n\
- .4byte _0810A904\n\
- .4byte _0810A978\n\
- .4byte _0810A91A\n\
- .4byte _0810A978\n\
- .4byte _0810A93C\n\
- .4byte _0810A978\n\
- .4byte _0810A970\n\
-_0810A8D0:\n\
- ldr r0, =gUnknown_08595828\n\
- lsls r1, r4, 16\n\
- asrs r1, 16\n\
- lsls r2, r6, 16\n\
- asrs r2, 16\n\
- mov r4, r12\n\
- lsls r3, r4, 16\n\
- b _0810A952\n\
- .pool\n\
-_0810A8E4:\n\
- mov r0, r12\n\
- lsls r3, r0, 17\n\
- mov r1, r8\n\
- adds r0, r1, r2\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- ldr r0, =gUnknown_08595828\n\
- lsls r1, r4, 16\n\
- asrs r1, 16\n\
- lsls r2, r6, 16\n\
- asrs r2, 16\n\
- b _0810A952\n\
- .pool\n\
-_0810A904:\n\
- mov r3, r12\n\
- lsls r0, r3, 16\n\
- asrs r0, 16\n\
- lsls r3, r0, 1\n\
- adds r3, r0\n\
- lsls r0, r2, 1\n\
- add r0, r8\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- b _0810A946\n\
-_0810A91A:\n\
- mov r0, r12\n\
- lsls r3, r0, 18\n\
- lsls r0, r2, 1\n\
- adds r0, r2\n\
- add r0, r8\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- ldr r0, =gUnknown_08595828\n\
- lsls r1, r4, 16\n\
- asrs r1, 16\n\
- lsls r2, r6, 16\n\
- asrs r2, 16\n\
- b _0810A952\n\
- .pool\n\
-_0810A93C:\n\
- mov r1, r12\n\
- lsls r0, r1, 16\n\
- asrs r0, 16\n\
- lsls r3, r0, 2\n\
- adds r3, r0\n\
-_0810A946:\n\
- ldr r0, =gUnknown_08595828\n\
- lsls r1, r4, 16\n\
- asrs r1, 16\n\
- lsls r2, r6, 16\n\
- asrs r2, 16\n\
- lsls r3, 16\n\
-_0810A952:\n\
- asrs r3, 16\n\
- adds r2, r3\n\
- lsls r2, 16\n\
- asrs r2, 16\n\
- movs r3, 0x2\n\
- bl CreateSprite\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- adds r0, r7, 0x1\n\
- lsls r0, 24\n\
- lsrs r7, r0, 24\n\
- b _0810A978\n\
- .pool\n\
-_0810A970:\n\
- mov r0, r9\n\
- bl DestroyAnimVisualTask\n\
- b _0810A9BC\n\
-_0810A978:\n\
- cmp r7, 0\n\
- beq _0810A9AC\n\
- ldr r4, =gSprites\n\
- lsls r3, r5, 4\n\
- adds r3, r5\n\
- lsls r3, 2\n\
- adds r0, r3, r4\n\
- ldrh r5, [r0, 0x4]\n\
- lsls r2, r5, 22\n\
- lsrs r2, 22\n\
- add r2, r8\n\
- ldr r6, =0x000003ff\n\
- adds r1, r6, 0\n\
- ands r2, r1\n\
- ldr r1, =0xfffffc00\n\
- ands r1, r5\n\
- orrs r1, r2\n\
- strh r1, [r0, 0x4]\n\
- mov r1, sp\n\
- ldrh r1, [r1]\n\
- strh r1, [r0, 0x2E]\n\
- adds r4, 0x1C\n\
- adds r3, r4\n\
- ldr r1, [r3]\n\
- bl _call_via_r1\n\
-_0810A9AC:\n\
- ldr r0, =gTasks\n\
- mov r1, r10\n\
- add r1, r9\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- ldrh r0, [r1, 0x1C]\n\
- adds r0, 0x1\n\
- strh r0, [r1, 0x1C]\n\
-_0810A9BC:\n\
- add sp, 0x4\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- ");
-}
-#endif
static void sub_810A9DC(struct Sprite *sprite)
{
@@ -1002,7 +801,7 @@ void sub_810AAFC(u8 taskId)
{
struct Task *task = &gTasks[taskId];
- if (!gBattleAnimArgs[0])
+ if (!gBattleAnimArgs[0])
{
task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
task->data[15] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
@@ -1188,7 +987,7 @@ void sub_810AE5C(u8 taskId)
}
else
task->data[0]++;
-
+
}
break;
case 2:
@@ -1334,6 +1133,7 @@ static void sub_810B23C(struct Sprite *sprite)
case 1:
if (sprite->affineAnimEnded)
DestroySpriteAndMatrix(sprite);
+ break;
}
}
@@ -1493,3 +1293,29 @@ void sub_810B55C(u8 taskId)
break;
}
}
+
+bool8 sub_810B614(struct Task *task, u8 taskId)
+{
+ u8 spriteId = CreateSprite(&gUnknown_085956C0, task->data[13], task->data[14], task->data[12]);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].callback = sub_810B684;
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = 10;
+ task->data[10]++;
+ }
+ if (task->data[14] >= task->data[15])
+ return TRUE;
+ task->data[14] += 32;
+ return FALSE;
+}
+
+static void sub_810B684(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ DestroySprite(sprite);
+ }
+}
diff --git a/src/event_obj_lock.c b/src/event_obj_lock.c
index 8c324ea82..566b4931d 100644
--- a/src/event_obj_lock.c
+++ b/src/event_obj_lock.c
@@ -6,6 +6,7 @@
#include "script_movement.h"
#include "task.h"
#include "trainer_see.h"
+#include "constants/event_objects.h"
bool8 walkrun_is_standing_still(void)
{
@@ -89,20 +90,20 @@ void LockSelectedEventObject(void)
void ScriptUnfreezeEventObjects(void)
{
- u8 objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
- EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
+ u8 playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]);
sub_80D338C();
UnfreezeEventObjects();
}
void sub_8098524(void)
{
- u8 objectId;
+ u8 playerObjectId;
if (gEventObjects[gSelectedEventObject].active)
EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]);
- objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
- EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
+ playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]);
sub_80D338C();
UnfreezeEventObjects();
}
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index ffa8f53c9..7cee717bf 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -6420,7 +6420,7 @@ bool8 MovementAction_FacePlayer_Step0(struct EventObject *eventObject, struct Sp
{
u8 playerObjectId;
- if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId))
+ if (!TryGetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0, &playerObjectId))
{
FaceDirection(eventObject, sprite, GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y));
}
@@ -6432,7 +6432,7 @@ bool8 MovementAction_FaceAwayPlayer_Step0(struct EventObject *eventObject, struc
{
u8 playerObjectId;
- if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId))
+ if (!TryGetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0, &playerObjectId))
{
FaceDirection(eventObject, sprite, GetOppositeDirection(GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y)));
}
diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c
index 022599dfb..bfd46978c 100644
--- a/src/evolution_graphics.c
+++ b/src/evolution_graphics.c
@@ -251,7 +251,7 @@ static void CreatePostEvoSparkleSet2(u8 arg0)
void LoadEvoSparkleSpriteAndPal(void)
{
- LoadCompressedObjectPicUsingHeap(&sEvoSparkleSpriteSheets[0]);
+ LoadCompressedSpriteSheetUsingHeap(&sEvoSparkleSpriteSheets[0]);
LoadSpritePalettes(sEvoSparkleSpritePals);
}
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index 1070c69e9..c97e2d10f 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -1,33 +1,34 @@
#include "global.h"
-#include "evolution_scene.h"
-#include "evolution_graphics.h"
-#include "sprite.h"
#include "alloc.h"
-#include "task.h"
-#include "palette.h"
-#include "main.h"
-#include "text.h"
-#include "text_window.h"
-#include "pokemon.h"
-#include "string_util.h"
#include "battle.h"
-#include "scanline_effect.h"
+#include "battle_message.h"
+#include "bg.h"
+#include "data2.h"
#include "decompress.h"
+#include "evolution_scene.h"
+#include "evolution_graphics.h"
+#include "gpu_regs.h"
+#include "link.h"
#include "m4a.h"
+#include "main.h"
#include "menu.h"
+#include "overworld.h"
+#include "palette.h"
#include "pokedex.h"
-#include "constants/species.h"
+#include "pokemon.h"
+#include "scanline_effect.h"
#include "sound.h"
-#include "constants/songs.h"
-#include "overworld.h"
-#include "battle_message.h"
-#include "constants/battle_string_ids.h"
-#include "gpu_regs.h"
-#include "bg.h"
-#include "link.h"
-#include "util.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.h"
#include "trig.h"
-#include "data2.h"
+#include "trade.h"
+#include "util.h"
+#include "constants/battle_string_ids.h"
+#include "constants/species.h"
+#include "constants/songs.h"
struct EvoInfo
{
@@ -50,12 +51,8 @@ extern const struct CompressedSpriteSheet gMonFrontPicTable[];
// strings
extern const u8 gText_CommunicationStandby5[];
-extern void sub_807B154(void);
-extern void sub_807F19C(void);
-extern void sub_807B140(void);
extern void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monId, u8 partyCount, void *CB2_ptr, u16 move);
extern u8 sub_81C1B94(void);
-extern void sub_807F1A8(u8 arg0, const u8 *arg1, u8 arg2);
extern void sub_800E084(void);
// this file's functions
@@ -1479,20 +1476,20 @@ static void InitMovingBackgroundTask(bool8 isLink)
if (!isLink)
{
- SetGpuReg(REG_OFFSET_BLDCNT, 0x442);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x808);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
- SetBgAttribute(innerBgId, BG_CTRL_ATTR_MOSAIC, 2);
- SetBgAttribute(outerBgId, BG_CTRL_ATTR_MOSAIC, 2);
+ SetBgAttribute(innerBgId, BG_ATTR_PRIORITY, 2);
+ SetBgAttribute(outerBgId, BG_ATTR_PRIORITY, 2);
ShowBg(1);
ShowBg(2);
}
else
{
- SetGpuReg(REG_OFFSET_BLDCNT, 0x842);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x808);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
}
@@ -1529,8 +1526,8 @@ static void sub_8140174(void)
gBattle_BG1_X = 0;
gBattle_BG1_Y = 0;
gBattle_BG2_X = 0;
- SetBgAttribute(1, BG_CTRL_ATTR_MOSAIC, sub_80391E0(1, 5));
- SetBgAttribute(2, BG_CTRL_ATTR_MOSAIC, sub_80391E0(2, 5));
+ SetBgAttribute(1, BG_ATTR_PRIORITY, sub_80391E0(1, 5));
+ SetBgAttribute(2, BG_ATTR_PRIORITY, sub_80391E0(2, 5));
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
Free(sEvoMovingBgPtr);
}
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index 3774ef2b3..e6a859c84 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -27,7 +27,9 @@
#include "trainer_see.h"
#include "wild_encounter.h"
#include "constants/bg_event_constants.h"
+#include "constants/event_objects.h"
#include "constants/map_types.h"
+#include "constants/maps.h"
#include "constants/songs.h"
extern bool32 sub_8196034(void);
@@ -50,12 +52,12 @@ static bool32 TrySetupDiveDownScript(void);
static bool32 TrySetupDiveEmergeScript(void);
static bool8 TryStartStepBasedScript(struct MapPosition *, u16, u16);
static bool8 CheckStandardWildEncounter(u16);
-static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8);
+static bool8 TryArrowWarp(struct MapPosition *, u16, u8);
static bool8 IsWarpMetatileBehavior(u16);
static bool8 IsArrowWarpMetatileBehavior(u16, u8);
static s8 GetWarpEventAtMapPosition(struct MapHeader *, struct MapPosition *);
-static void sub_809CEB0(struct MapHeader *, s8, struct MapPosition *);
-static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8);
+static void SetupWarp(struct MapHeader *, s8, struct MapPosition *);
+static bool8 TryDoorWarp(struct MapPosition *, u16, u8);
static s8 GetWarpEventAtPosition(struct MapHeader *, u16, u16, u8);
static u8 *GetCoordEventScriptAtPosition(struct MapHeader *, u16, u16, u8);
static struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *, u16, u16, u8);
@@ -72,8 +74,8 @@ void FieldClearPlayerInput(struct FieldInput *input)
input->checkStandardWildEncounter = FALSE;
input->pressedStartButton = FALSE;
input->pressedSelectButton = FALSE;
- input->input_field_0_4 = FALSE;
- input->input_field_0_5 = FALSE;
+ input->heldDirection = FALSE;
+ input->heldDirection2 = FALSE;
input->tookStep = FALSE;
input->pressedBButton = FALSE;
input->input_field_1_0 = FALSE;
@@ -105,8 +107,8 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)
if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT))
{
- input->input_field_0_4 = TRUE;
- input->input_field_0_5 = TRUE;
+ input->heldDirection = TRUE;
+ input->heldDirection2 = TRUE;
}
}
@@ -152,15 +154,15 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
if (input->tookStep)
{
IncrementGameStat(GAME_STAT_STEPS);
- increment_var_x4026_on_birth_island_modulo_100();
+ IncrementBirthIslandRockStepCount();
if (TryStartStepBasedScript(&position, metatileBehavior, playerDirection) == TRUE)
return TRUE;
}
if (input->checkStandardWildEncounter && CheckStandardWildEncounter(metatileBehavior) == TRUE)
return TRUE;
- if (input->input_field_0_4 && input->dpadDirection == playerDirection)
+ if (input->heldDirection && input->dpadDirection == playerDirection)
{
- if (mapheader_run_first_tag2_script_list_match_conditionally(&position, metatileBehavior, playerDirection) == TRUE)
+ if (TryArrowWarp(&position, metatileBehavior, playerDirection) == TRUE)
return TRUE;
}
@@ -169,9 +171,9 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
if (input->pressedAButton && TryStartInteractionScript(&position, metatileBehavior, playerDirection) == TRUE)
return TRUE;
- if (input->input_field_0_5 && input->dpadDirection == playerDirection)
+ if (input->heldDirection2 && input->dpadDirection == playerDirection)
{
- if (map_warp_consider_2_to_inside(&position, metatileBehavior, playerDirection) == TRUE)
+ if (TryDoorWarp(&position, metatileBehavior, playerDirection) == TRUE)
return TRUE;
}
if (input->pressedAButton && TrySetupDiveDownScript() == TRUE)
@@ -265,7 +267,7 @@ const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatil
else
eventObjectId = GetEventObjectIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height);
- if (eventObjectId == 16 || gEventObjects[eventObjectId].localId == 0xFF)
+ if (eventObjectId == EVENT_OBJECTS_COUNT || gEventObjects[eventObjectId].localId == EVENT_OBJ_ID_PLAYER)
return NULL;
for (i = 0; i < 4; i++)
@@ -286,14 +288,14 @@ static const u8 *GetInteractedEventObjectScript(struct MapPosition *position, u8
const u8 *script;
eventObjectId = GetEventObjectIdByXYZ(position->x, position->y, position->height);
- if (eventObjectId == 16 || gEventObjects[eventObjectId].localId == 0xFF)
+ if (eventObjectId == EVENT_OBJECTS_COUNT || gEventObjects[eventObjectId].localId == EVENT_OBJ_ID_PLAYER)
{
if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE)
return NULL;
// Look for an event object on the other side of the counter.
eventObjectId = GetEventObjectIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height);
- if (eventObjectId == 16 || gEventObjects[eventObjectId].localId == 0xFF)
+ if (eventObjectId == EVENT_OBJECTS_COUNT || gEventObjects[eventObjectId].localId == EVENT_OBJ_ID_PLAYER)
return NULL;
}
@@ -302,13 +304,10 @@ static const u8 *GetInteractedEventObjectScript(struct MapPosition *position, u8
gSpecialVar_Facing = direction;
if (InTrainerHill() == TRUE)
- {
script = sub_81D62AC();
- }
else
- {
script = GetEventObjectScriptPointerByEventObjectId(eventObjectId);
- }
+
script = GetRamScript(gSpecialVar_LastTalked, script);
return script;
}
@@ -379,7 +378,7 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me
if (MetatileBehavior_IsCableBoxResults1(metatileBehavior) == TRUE)
return EventScript_CableBoxResults;
if (MetatileBehavior_IsPokeblockFeeder(metatileBehavior) == TRUE)
- return EventScript_2A4BAC;
+ return EventScript_PokeBlockFeeder;
if (MetatileBehavior_IsTrickHousePuzzleDoor(metatileBehavior) == TRUE)
return Route110_TrickHouseEntrance_EventScript_26A22A;
if (MetatileBehavior_IsRegionMap(metatileBehavior) == TRUE)
@@ -685,15 +684,15 @@ static bool8 CheckStandardWildEncounter(u16 metatileBehavior)
return FALSE;
}
-static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 metatileBehavior, u8 direction)
+static bool8 TryArrowWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction)
{
s8 warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position);
if (IsArrowWarpMetatileBehavior(metatileBehavior, direction) == TRUE && warpEventId != -1)
{
StoreInitialPlayerAvatarState();
- sub_809CEB0(&gMapHeader, warpEventId, position);
- sub_80AF734();
+ SetupWarp(&gMapHeader, warpEventId, position);
+ DoWarp();
return TRUE;
}
return FALSE;
@@ -706,7 +705,7 @@ static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileB
if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE)
{
StoreInitialPlayerAvatarState();
- sub_809CEB0(&gMapHeader, warpEventId, position);
+ SetupWarp(&gMapHeader, warpEventId, position);
if (MetatileBehavior_IsEscalator(metatileBehavior) == TRUE)
{
sub_80AF80C(metatileBehavior);
@@ -742,7 +741,7 @@ static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileB
sub_80AF87C();
return TRUE;
}
- sub_80AF734();
+ DoWarp();
return TRUE;
}
return FALSE;
@@ -785,7 +784,7 @@ static s8 GetWarpEventAtMapPosition(struct MapHeader *mapHeader, struct MapPosit
return GetWarpEventAtPosition(mapHeader, position->x - 7, position->y - 7, position->height);
}
-static void sub_809CEB0(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position)
+static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position)
{
const struct WarpEvent *warpEvent;
@@ -818,23 +817,23 @@ static void sub_809CEB0(struct MapHeader *unused, s8 warpEventId, struct MapPosi
warpEvent = &gMapHeader.events->warps[warpEventId];
}
- if (warpEvent->mapNum == 0x7F)
+ if (warpEvent->mapNum == MAP_NUM(NONE))
{
- copy_saved_warp2_bank_and_enter_x_to_warp1(warpEvent->warpId);
+ SetWarpDestinationToDynamicWarp(warpEvent->warpId);
}
else
{
const struct MapHeader *mapHeader;
- warp1_set_2(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId);
- sub_8084D5C(position->x, position->y);
+ SetWarpDestinationToMapWarp(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId);
+ UpdateEscapeWarp(position->x, position->y);
mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->mapGroup, warpEvent->mapNum);
- if (mapHeader->events->warps[warpEvent->warpId].mapNum == 0x7F)
- saved_warp2_set(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId);
+ if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(NONE))
+ SetDynamicWarp(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId);
}
}
-static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 metatileBehavior, u8 direction)
+static bool8 TryDoorWarp(struct MapPosition *position, u16 metatileBehavior, u8 direction)
{
s8 warpEventId;
@@ -842,17 +841,18 @@ static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 met
{
if (MetatileBehavior_IsOpenSecretBaseDoor(metatileBehavior) == TRUE)
{
- sub_80E9668(position, gMapHeader.events);
+ WarpIntoSecretBase(position, gMapHeader.events);
return TRUE;
}
+
if (MetatileBehavior_IsWarpDoor(metatileBehavior) == TRUE)
{
warpEventId = GetWarpEventAtMapPosition(&gMapHeader, position);
if (warpEventId != -1 && IsWarpMetatileBehavior(metatileBehavior) == TRUE)
{
StoreInitialPlayerAvatarState();
- sub_809CEB0(&gMapHeader, warpEventId, position);
- sub_80AF7D0();
+ SetupWarp(&gMapHeader, warpEventId, position);
+ DoDoorWarp();
return TRUE;
}
}
@@ -947,7 +947,7 @@ bool8 dive_warp(struct MapPosition *position, u16 metatileBehavior)
if (SetDiveWarpEmerge(position->x - 7, position->y - 7))
{
StoreInitialPlayerAvatarState();
- sp13E_warp_to_last_warp();
+ DoDiveWarp();
PlaySE(SE_W291);
return TRUE;
}
@@ -957,7 +957,7 @@ bool8 dive_warp(struct MapPosition *position, u16 metatileBehavior)
if (SetDiveWarpDive(position->x - 7, position->y - 7))
{
StoreInitialPlayerAvatarState();
- sp13E_warp_to_last_warp();
+ DoDiveWarp();
PlaySE(SE_W291);
return TRUE;
}
@@ -1002,6 +1002,6 @@ int SetCableClubWarp(void)
GetPlayerMovementDirection(); //unnecessary
GetPlayerPosition(&position);
MapGridGetMetatileBehaviorAt(position.x, position.y); //unnecessary
- sub_809CEB0(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position);
+ SetupWarp(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position);
return 0;
}
diff --git a/src/field_effect.c b/src/field_effect.c
index 1442c611a..badf57b16 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -9,9 +9,10 @@
#include "field_screen_effect.h"
#include "field_weather.h"
#include "fieldmap.h"
-#include "fldeff_groundshake.h"
+#include "fldeff.h"
#include "gpu_regs.h"
#include "main.h"
+#include "mirage_tower.h"
#include "menu.h"
#include "metatile_behavior.h"
#include "overworld.h"
@@ -229,7 +230,7 @@ static void sub_80B9A60(struct Task *);
static void sub_80B9BE8(u8 taskId);
static void sub_80B9DB8(struct Sprite* sprite);
-static void sub_80B9EDC(u8 taskId);
+static void Fldeff_MoveDeoxysRock_Step(u8 taskId);
// Static RAM declarations
@@ -733,8 +734,8 @@ bool8 FieldEffectActiveListContains(u8 id)
u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer)
{
struct SpriteTemplate spriteTemplate;
- LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer);
- LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer);
+ LoadCompressedSpritePaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer);
+ LoadCompressedSpriteSheetOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer);
spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag;
spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag;
spriteTemplate.oam = &gNewGameBirchOamAttributes;
@@ -2170,7 +2171,7 @@ static void EscapeRopeFieldEffect_Step1(struct Task *task)
if (task->data[14] == 0 && !gPaletteFade.active && BGMusicStopped() == TRUE)
{
SetEventObjectDirection(eventObject, task->data[15]);
- sub_8084E14();
+ SetWarpDestinationToEscapeWarp();
WarpIntoMap();
gFieldCallback = mapldr_080859D4;
SetMainCallback2(CB2_LoadMap);
@@ -2325,13 +2326,13 @@ static void TeleportFieldEffectTask4(struct Task *task)
{
if (task->data[5] == FALSE)
{
- sub_81BE72C();
+ ClearMirageTowerPulseBlendEffect();
task->data[5] = TRUE;
}
if (BGMusicStopped() == TRUE)
{
- Overworld_SetWarpDestToLastHealLoc();
+ SetWarpDestinationToLastHealLocation();
WarpIntoMap();
SetMainCallback2(CB2_LoadMap);
gFieldCallback = mapldr_08085D88;
@@ -2442,7 +2443,7 @@ static void sub_80B8410(struct Task *task)
bool8 FldEff_FieldMoveShowMon(void)
{
u8 taskId;
- if (is_map_type_1_2_3_5_or_6(Overworld_GetMapTypeOfSaveblockLocation()) == TRUE)
+ if (is_map_type_1_2_3_5_or_6(GetCurrentMapType()) == TRUE)
{
taskId = CreateTask(sub_80B8554, 0xff);
} else
@@ -3643,7 +3644,7 @@ static void sub_80B9DB8(struct Sprite* sprite)
DestroySprite(sprite);
}
-bool8 sub_80B9E28(struct Sprite* sprite)
+bool8 Fldeff_MoveDeoxysRock(struct Sprite* sprite)
{
u8 eventObjectIdBuffer;
if (!TryGetEventObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &eventObjectIdBuffer))
@@ -3657,7 +3658,7 @@ bool8 sub_80B9E28(struct Sprite* sprite)
xPos = (gFieldEffectArguments[3] - xPos) * 16;
yPos = (gFieldEffectArguments[4] - yPos) * 16;
ShiftEventObjectCoords(object, gFieldEffectArguments[3] + 7, gFieldEffectArguments[4] + 7);
- taskId = CreateTask(sub_80B9EDC, 0x50);
+ taskId = CreateTask(Fldeff_MoveDeoxysRock_Step, 0x50);
gTasks[taskId].data[1] = object->spriteId;
gTasks[taskId].data[2] = gSprites[object->spriteId].pos1.x + xPos;
gTasks[taskId].data[3] = gSprites[object->spriteId].pos1.y + yPos;
@@ -3667,7 +3668,7 @@ bool8 sub_80B9E28(struct Sprite* sprite)
return FALSE;
}
-static void sub_80B9EDC(u8 taskId)
+static void Fldeff_MoveDeoxysRock_Step(u8 taskId)
{
// BUG: Possible divide by zero
s16 *data = gTasks[taskId].data;
diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c
index 3046eccd5..53fd87e61 100755
--- a/src/field_effect_helpers.c
+++ b/src/field_effect_helpers.c
@@ -1228,13 +1228,11 @@ u32 ShowTreeDisguiseFieldEffect(void)
return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 24, 4);
}
-
u32 ShowMountainDisguiseFieldEffect(void)
{
return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 25, 3);
}
-
u32 ShowSandDisguiseFieldEffect(void)
{
return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 28, 2);
@@ -1579,3 +1577,19 @@ static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset)
}
}
}
+
+// Unused data. Feel free to remove.
+static const u8 gUnknown_085CDC6E[] =
+{
+ 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02,
+ 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02,
+ 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01,
+ 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00
+};
diff --git a/src/field_message_box.c b/src/field_message_box.c
index 46da9e9e5..5e23b5f6b 100755
--- a/src/field_message_box.c
+++ b/src/field_message_box.c
@@ -8,21 +8,21 @@
extern bool32 sub_8196094(void);
extern void sub_8196080(u8*);
-EWRAM_DATA u8 gUnknown_020375BC = 0;
+static EWRAM_DATA u8 sFieldMessageBoxMode = 0;
-void textbox_fdecode_auto_and_task_add(u8*, int);
-void textbox_auto_and_task_add(void);
+static void textbox_fdecode_auto_and_task_add(u8*, bool32);
+static void textbox_auto_and_task_add(void);
-void sub_8098128(void)
+void InitFieldMessageBox(void)
{
- gUnknown_020375BC = 0;
+ sFieldMessageBoxMode = 0;
gTextFlags.canABSpeedUpPrint = 0;
gTextFlags.useAlternateDownArrow = 0;
gTextFlags.autoScroll = 0;
gTextFlags.forceMidTextSpeed = 0;
}
-void sub_8098154(u8 taskId)
+static void sub_8098154(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -39,18 +39,18 @@ void sub_8098154(u8 taskId)
case 2:
if (RunTextPrintersAndIsPrinter0Active() != 1)
{
- gUnknown_020375BC = 0;
+ sFieldMessageBoxMode = 0;
DestroyTask(taskId);
}
}
}
-void task_add_textbox(void)
+static void task_add_textbox(void)
{
CreateTask(sub_8098154, 0x50);
}
-void task_del_textbox(void)
+static void task_del_textbox(void)
{
u8 taskId = FindTaskIdByFunc(sub_8098154);
if (taskId != 0xFF)
@@ -59,10 +59,10 @@ void task_del_textbox(void)
bool8 ShowFieldMessage(u8 *str)
{
- if (gUnknown_020375BC != 0)
+ if (sFieldMessageBoxMode != 0)
return FALSE;
textbox_fdecode_auto_and_task_add(str, 1);
- gUnknown_020375BC = 2;
+ sFieldMessageBoxMode = 2;
return TRUE;
}
@@ -70,57 +70,57 @@ void sub_8098214(u8 taskId)
{
if (!sub_8196094())
{
- gUnknown_020375BC = 0;
+ sFieldMessageBoxMode = 0;
DestroyTask(taskId);
}
}
bool8 sub_8098238(u8 *str)
{
- if (gUnknown_020375BC != 0)
+ if (sFieldMessageBoxMode != 0)
return FALSE;
StringExpandPlaceholders(gStringVar4, str);
CreateTask(sub_8098214, 0);
sub_8196080(str);
- gUnknown_020375BC = 2;
+ sFieldMessageBoxMode = 2;
return TRUE;
}
bool8 ShowFieldAutoScrollMessage(u8 *str)
{
- if (gUnknown_020375BC != 0)
+ if (sFieldMessageBoxMode != 0)
return FALSE;
- gUnknown_020375BC = 3;
+ sFieldMessageBoxMode = 3;
textbox_fdecode_auto_and_task_add(str, 0);
return TRUE;
}
bool8 sub_80982A0(u8 *str)
{
- gUnknown_020375BC = 3;
+ sFieldMessageBoxMode = 3;
textbox_fdecode_auto_and_task_add(str, 1);
return TRUE;
}
bool8 sub_80982B8(void)
{
- if (gUnknown_020375BC != 0)
+ if (sFieldMessageBoxMode != 0)
return FALSE;
- gUnknown_020375BC = 2;
+ sFieldMessageBoxMode = 2;
textbox_auto_and_task_add();
return TRUE;
}
-void textbox_fdecode_auto_and_task_add(u8* str, int a)
+static void textbox_fdecode_auto_and_task_add(u8* str, bool32 allowSkippingDelayWithButtonPress)
{
StringExpandPlaceholders(gStringVar4, str);
- AddTextPrinterForMessage(a);
+ AddTextPrinterForMessage(allowSkippingDelayWithButtonPress);
task_add_textbox();
}
-void textbox_auto_and_task_add(void)
+static void textbox_auto_and_task_add(void)
{
- AddTextPrinterForMessage(1);
+ AddTextPrinterForMessage(TRUE);
task_add_textbox();
}
@@ -128,17 +128,17 @@ void HideFieldMessageBox(void)
{
task_del_textbox();
sub_8197434(0, 1);
- gUnknown_020375BC = 0;
+ sFieldMessageBoxMode = 0;
}
u8 GetFieldMessageBoxMode(void)
{
- return gUnknown_020375BC;
+ return sFieldMessageBoxMode;
}
bool8 IsFieldMessageBoxHidden(void)
{
- if (gUnknown_020375BC == 0)
+ if (sFieldMessageBoxMode == 0)
return TRUE;
return FALSE;
}
@@ -147,11 +147,11 @@ void sub_8098358(void)
{
task_del_textbox();
NewMenuHelpers_DrawStdWindowFrame(0, 1);
- gUnknown_020375BC = 0;
+ sFieldMessageBoxMode = 0;
}
void sub_8098374(void)
{
task_del_textbox();
- gUnknown_020375BC = 0;
+ sFieldMessageBoxMode = 0;
}
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index a5aa23e32..7423216a4 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -723,7 +723,7 @@ static bool8 sub_808B1BC(s16 x, s16 y, u8 direction)
{
if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
&& MapGridGetZCoordAt(x, y) == 3
- && GetEventObjectIdByXYZ(x, y, 3) == 16)
+ && GetEventObjectIdByXYZ(x, y, 3) == EVENT_OBJECTS_COUNT)
{
sub_808C750(direction);
return TRUE;
@@ -791,12 +791,9 @@ bool8 IsPlayerCollidingWithFarawayIslandMew(u8 direction)
playerY = object->currentCoords.y;
MoveCoords(direction, &playerX, &playerY);
- mewObjectId = GetEventObjectIdByLocalIdAndMap(1, 0x39, 0x1A);
-
- if (mewObjectId == 16)
- {
+ mewObjectId = GetEventObjectIdByLocalIdAndMap(1, MAP_NUM(FARAWAY_ISLAND_INTERIOR), MAP_GROUP(FARAWAY_ISLAND_INTERIOR));
+ if (mewObjectId == EVENT_OBJECTS_COUNT)
return FALSE;
- }
object = &gEventObjects[mewObjectId];
mewPrevX = object->previousCoords.x;
@@ -1310,7 +1307,7 @@ bool8 PartyHasMonWithSurf(void)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE)
break;
- if (pokemon_has_move(&gPlayerParty[i], MOVE_SURF))
+ if (MonKnowsMove(&gPlayerParty[i], MOVE_SURF))
return TRUE;
}
}
@@ -1389,7 +1386,7 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender)
u8 eventObjectId;
struct EventObject *eventObject;
- playerEventObjTemplate.localId = 0xFF;
+ playerEventObjTemplate.localId = EVENT_OBJ_ID_PLAYER;
playerEventObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, gender);
playerEventObjTemplate.x = x - 7;
playerEventObjTemplate.y = y - 7;
@@ -1845,7 +1842,7 @@ static bool8 Fishing6(struct Task *task)
}
else
{
- if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u8 ability = GetMonAbility(&gPlayerParty[0]);
if (ability == ABILITY_SUCTION_CUPS || ability == ABILITY_STICKY_HOLD)
diff --git a/src/field_poison.c b/src/field_poison.c
index 7aaab902f..fac17dea9 100644
--- a/src/field_poison.c
+++ b/src/field_poison.c
@@ -122,7 +122,7 @@ s32 DoPoisonFieldEffect(void)
u32 numFainted = 0;
for (i = 0; i < PARTY_SIZE; i++)
{
- if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
+ if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
{
hp = GetMonData(pokemon, MON_DATA_HP);
if (hp == 0 || --hp == 0)
diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c
index b0572b393..b9e9272d4 100644
--- a/src/field_screen_effect.c
+++ b/src/field_screen_effect.c
@@ -17,6 +17,7 @@
#include "load_save.h"
#include "main.h"
#include "menu.h"
+#include "mirage_tower.h"
#include "event_obj_lock.h"
#include "metatile_behavior.h"
#include "palette.h"
@@ -34,7 +35,6 @@
extern bool32 sub_81D6534(void);
extern bool8 walkrun_is_standing_still(void);
extern void ScriptUnfreezeEventObjects(void);
-extern void sub_81BE72C(void);
extern void sub_80FB768(void);
extern void sub_808D194(void);
extern void sub_808D1C8(void);
@@ -89,7 +89,7 @@ static void palette_bg_faded_fill_black(void)
void pal_fill_for_maplights(void)
{
u8 previousMapType = GetLastUsedWarpMapType();
- switch (GetMapPairFadeFromType(previousMapType, Overworld_GetMapTypeOfSaveblockLocation()))
+ switch (GetMapPairFadeFromType(previousMapType, GetCurrentMapType()))
{
case 0:
palette_bg_faded_fill_black();
@@ -115,7 +115,7 @@ void pal_fill_black(void)
void WarpFadeScreen(void)
{
- u8 currentMapType = Overworld_GetMapTypeOfSaveblockLocation();
+ u8 currentMapType = GetCurrentMapType();
switch (GetMapPairFadeToType(currentMapType, GetDestinationWarpMapHeader()->mapType))
{
case 0:
@@ -215,7 +215,7 @@ static void sub_80AF234(u8 taskId)
task->data[0]++;
break;
case 1:
- if (!sub_800A520())
+ if (!IsLinkTaskFinished())
{
if (++task->data[1] > 1800)
sub_8011170(0x6000);
@@ -248,7 +248,7 @@ void sub_80AF2B4(u8 taskId)
task->data[0]++;
break;
case 1:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
task->data[0]++;
}
@@ -498,7 +498,7 @@ static bool32 sub_80AF71C(void)
return FALSE;
}
-void sub_80AF734(void)
+void DoWarp(void)
{
ScriptContext2_Enable();
TryFadeOutOldMapMusic();
@@ -509,7 +509,7 @@ void sub_80AF734(void)
CreateTask(sub_80AFA0C, 10);
}
-void sp13E_warp_to_last_warp(void)
+void DoDiveWarp(void)
{
ScriptContext2_Enable();
TryFadeOutOldMapMusic();
@@ -529,16 +529,16 @@ void sub_80AF79C(void)
CreateTask(sub_80AFA0C, 10);
}
-void sub_80AF7D0(void)
+void DoDoorWarp(void)
{
ScriptContext2_Enable();
gFieldCallback = mapldr_default;
CreateTask(sub_80AFA88, 10);
}
-void sp13F_fall_to_last_warp(void)
+void DoFallWarp(void)
{
- sp13E_warp_to_last_warp();
+ DoDiveWarp();
gFieldCallback = sub_80B6B68;
}
@@ -673,7 +673,7 @@ static void sub_80AFA0C(u8 taskId)
{
if (task->data[1] == 0)
{
- sub_81BE72C();
+ ClearMirageTowerPulseBlendEffect();
task->data[1] = 1;
}
if (BGMusicStopped())
diff --git a/src/field_special_scene.c b/src/field_special_scene.c
index 1cabf63d6..579188f36 100644
--- a/src/field_special_scene.c
+++ b/src/field_special_scene.c
@@ -1,7 +1,12 @@
#include "global.h"
#include "event_data.h"
#include "event_object_movement.h"
+#include "field_camera.h"
+#include "field_screen_effect.h"
+#include "field_specials.h"
+#include "fieldmap.h"
#include "main.h"
+#include "overworld.h"
#include "palette.h"
#include "script.h"
#include "script_movement.h"
@@ -13,14 +18,6 @@
#define SECONDS(value) ((signed) (60.0 * value + 0.5))
-extern u8 GetSSTidalLocation(s8 *, s8 *, s16 *, s16 *); // should be in field_specials.h
-extern void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y);
-extern bool32 CountSSTidalStep(u16);
-extern void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused);
-extern void sp13E_warp_to_last_warp(void);
-extern void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId);
-extern void sub_80AF8B8(void);
-
// porthole states
enum
{
@@ -30,20 +27,13 @@ enum
EXIT_PORTHOLE,
};
-extern void SetCameraPanning(s16 x, s16 y);
-extern void SetCameraPanningCallback(void ( *callback)());
-extern void InstallCameraPanAheadCallback();
-extern void pal_fill_black(void);
-extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId);
-extern void DrawWholeMapView();
-
//. rodata
static const s8 gTruckCamera_HorizontalTable[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, -1, -1, -1, 0};
const u8 gUnknown_0858E8AB[] = {0x18, 0xFE};
const u8 gUnknown_0858E8AD[] = {0x17, 0xFE};
// .text
-void Task_Truck3(u8);
+static void Task_Truck3(u8);
s16 GetTruckCameraBobbingY(int a1)
{
@@ -121,7 +111,7 @@ void Task_Truck2(u8 taskId)
}
}
-void Task_Truck3(u8 taskId)
+static void Task_Truck3(u8 taskId)
{
s16 *data = gTasks[taskId].data;
s16 cameraXpan;
@@ -256,7 +246,7 @@ bool8 sub_80FB59C(void)
}
else
{
- Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y);
+ SetWarpDestination(mapGroup, mapNum, -1, x, y);
return TRUE;
}
}
@@ -312,8 +302,8 @@ void Task_HandlePorthole(u8 taskId)
case EXIT_PORTHOLE: // exit porthole.
FlagClear(0x4001);
FlagClear(0x4000);
- copy_saved_warp2_bank_and_enter_x_to_warp1(0);
- sp13E_warp_to_last_warp();
+ SetWarpDestinationToDynamicWarp(0);
+ DoDiveWarp();
DestroyTask(taskId);
break;
}
@@ -349,7 +339,7 @@ void sub_80FB7A4(void)
FlagSet(FLAG_SYS_CRUISE_MODE);
FlagSet(0x4001);
FlagSet(0x4000);
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
sub_80FB59C();
sub_80AF8B8();
}
diff --git a/src/field_specials.c b/src/field_specials.c
index 3f945fcfb..5883e0245 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -47,6 +47,7 @@
#include "constants/event_objects.h"
#include "constants/field_effects.h"
#include "constants/items.h"
+#include "constants/map_types.h"
#include "constants/maps.h"
#include "constants/songs.h"
#include "constants/species.h"
@@ -115,9 +116,9 @@ static void sub_813A738(u8 taskId);
static void sub_813A600(u8 taskId);
static void sub_813A664(u8 taskId);
static void sub_813ABD4(u16 a0);
-static void task_deoxys_sound(u8 taskId);
-static void sub_813B0B4(u8 a0);
-static void sub_813B160(u8 taskId);
+static void Task_DeoxysRockInteraction(u8 taskId);
+static void ChangeDeoxysRockLevel(u8 a0);
+static void WaitForDeoxysRockMovement(u8 taskId);
static void sub_813B57C(u8 taskId);
static void sub_813B824(u8 taskId);
static void _fwalk(u8 taskId);
@@ -391,11 +392,11 @@ bool32 sub_8138120(void)
{
switch (gMapHeader.mapType)
{
- case 1:
- case 2:
- case 3:
- case 6:
- if (++(*GetVarPointer(VAR_0x40F3)) < 0xA)
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ case MAP_TYPE_6:
+ if (++(*GetVarPointer(VAR_0x40F3)) < 10)
{
return FALSE;
}
@@ -945,11 +946,11 @@ void CableCarWarp(void)
{
if (gSpecialVar_0x8004 != 0)
{
- Overworld_SetWarpDestination(MAP_GROUP(ROUTE112_CABLE_CAR_STATION), MAP_NUM(ROUTE112_CABLE_CAR_STATION), -1, 6, 4);
+ SetWarpDestination(MAP_GROUP(ROUTE112_CABLE_CAR_STATION), MAP_NUM(ROUTE112_CABLE_CAR_STATION), -1, 6, 4);
}
else
{
- Overworld_SetWarpDestination(MAP_GROUP(MT_CHIMNEY_CABLE_CAR_STATION), MAP_NUM(MT_CHIMNEY_CABLE_CAR_STATION), -1, 6, 4);
+ SetWarpDestination(MAP_GROUP(MT_CHIMNEY_CABLE_CAR_STATION), MAP_NUM(MT_CHIMNEY_CABLE_CAR_STATION), -1, 6, 4);
}
}
@@ -1266,7 +1267,7 @@ void IsGrassTypeInParty(void)
for (i = 0; i < PARTY_SIZE; i++)
{
pokemon = &gPlayerParty[i];
- if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && !GetMonData(pokemon, MON_DATA_IS_EGG))
+ if (GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG))
{
species = GetMonData(pokemon, MON_DATA_SPECIES);
if (gBaseStats[species].type1 == TYPE_GRASS || gBaseStats[species].type2 == TYPE_GRASS)
@@ -1658,7 +1659,7 @@ bool8 sub_813990C(void)
for (i = 0; i < partyCount; i++)
{
- if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT1) == 1)
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG) == 1)
return TRUE;
}
@@ -1725,7 +1726,7 @@ const u16 gUnknown_085B2C06[][3] =
void SetDepartmentStoreFloorVar(void)
{
u8 deptStoreFloor;
- switch (gSaveBlock1Ptr->warp2.mapNum)
+ switch (gSaveBlock1Ptr->dynamicWarp.mapNum)
{
case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F):
deptStoreFloor = 4;
@@ -1757,9 +1758,9 @@ u16 sub_81399F4(void)
gUnknown_0203AB60 = 0;
gUnknown_0203AB62 = 0;
- if (gSaveBlock1Ptr->warp2.mapGroup == 13)
+ if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_1F))
{
- switch (gSaveBlock1Ptr->warp2.mapNum)
+ switch (gSaveBlock1Ptr->dynamicWarp.mapNum)
{
case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F):
gUnknown_0203AB60 = 0;
@@ -3193,7 +3194,7 @@ void sub_813AEB4(void)
i = 0;
do
{
- if (gUnknown_0861500C[i] == gUnknown_085B320C[temp2])
+ if (gTutorMoves[i] == gUnknown_085B320C[temp2])
{
gSpecialVar_0x8005 = i;
break;
@@ -3206,7 +3207,7 @@ void sub_813AEB4(void)
i = 0;
do
{
- if (gUnknown_0861500C[i] == gUnknown_085B31F8[temp2])
+ if (gTutorMoves[i] == gUnknown_085B31F8[temp2])
{
gSpecialVar_0x8005 = i;
break;
@@ -3233,12 +3234,12 @@ void sub_813AF48(void)
}
}
-void sub_813AFC8(void)
+void DoDeoxysRockInteraction(void)
{
- CreateTask(task_deoxys_sound, 8);
+ CreateTask(Task_DeoxysRockInteraction, 8);
}
-static const u16 gUnknown_085B3280[][16] = {
+static const u16 sDeoxysRockPalettes[][16] = {
INCBIN_U16("graphics/misc/deoxys1.gbapal"),
INCBIN_U16("graphics/misc/deoxys2.gbapal"),
INCBIN_U16("graphics/misc/deoxys3.gbapal"),
@@ -3252,25 +3253,25 @@ static const u16 gUnknown_085B3280[][16] = {
INCBIN_U16("graphics/misc/deoxys11.gbapal"),
};
-static const u8 gUnknown_085B33E0[][2] = {
- { 0x0f, 0x0c },
- { 0x0b, 0x0e },
- { 0x0f, 0x08 },
- { 0x13, 0x0e },
- { 0x0c, 0x0b },
- { 0x12, 0x0b },
- { 0x0f, 0x0e },
- { 0x0b, 0x0e },
- { 0x13, 0x0e },
- { 0x0f, 0x0f },
- { 0x0f, 0x0a },
+static const u8 sDeoxysRockCoords[][2] = {
+ { 15, 12 },
+ { 11, 14 },
+ { 15, 8 },
+ { 19, 14 },
+ { 12, 11 },
+ { 18, 11 },
+ { 15, 14 },
+ { 11, 14 },
+ { 19, 14 },
+ { 15, 15 },
+ { 15, 10 },
};
-static void task_deoxys_sound(u8 taskId)
+static void Task_DeoxysRockInteraction(u8 taskId)
{
- static const u8 gUnknown_085B33F6[] = { 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x06, 0x03, 0x03 };
+ static const u8 sStoneMaxStepCounts[] = { 4, 8, 8, 8, 4, 4, 4, 6, 3, 3 };
- if (FlagGet(FLAG_0x8D4) == TRUE)
+ if (FlagGet(FLAG_DEOXYS_ROCK_COMPLETE) == TRUE)
{
gSpecialVar_Result = 3;
EnableBothScriptContexts();
@@ -3278,100 +3279,92 @@ static void task_deoxys_sound(u8 taskId)
}
else
{
- u16 temp1 = VarGet(VAR_0x4035);
- u16 temp2 = VarGet(VAR_0x4034);
+ u16 rockLevel = VarGet(VAR_DEOXYS_ROCK_LEVEL);
+ u16 stepCount = VarGet(VAR_DEOXYS_ROCK_STEP_COUNT);
- VarSet(VAR_0x4034, 0);
- if (temp1 != 0 && gUnknown_085B33F6[temp1 - 1] < temp2)
+ VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, 0);
+ if (rockLevel != 0 && sStoneMaxStepCounts[rockLevel - 1] < stepCount)
{
- sub_813B0B4(0);
- VarSet(VAR_0x4035, 0);
+ // Player failed to take the shortest path to the stone, so it resets.
+ ChangeDeoxysRockLevel(0);
+ VarSet(VAR_DEOXYS_ROCK_LEVEL, 0);
gSpecialVar_Result = 0;
DestroyTask(taskId);
}
- else if (temp1 == 10)
+ else if (rockLevel == 10)
{
- FlagSet(FLAG_0x8D4);
+ FlagSet(FLAG_DEOXYS_ROCK_COMPLETE);
gSpecialVar_Result = 2;
EnableBothScriptContexts();
DestroyTask(taskId);
}
else
{
- temp1++;
- sub_813B0B4(temp1);
- VarSet(VAR_0x4035, temp1);
+ rockLevel++;
+ ChangeDeoxysRockLevel(rockLevel);
+ VarSet(VAR_DEOXYS_ROCK_LEVEL, rockLevel);
gSpecialVar_Result = 1;
DestroyTask(taskId);
}
}
}
-static void sub_813B0B4(u8 a0)
+static void ChangeDeoxysRockLevel(u8 rockLevel)
{
u8 eventObjectId;
- LoadPalette(&gUnknown_085B3280[a0], 0x1A0, 8);
+ LoadPalette(&sDeoxysRockPalettes[rockLevel], 0x1A0, 8);
TryGetEventObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectId);
- if (a0 == 0)
- {
+ if (rockLevel == 0)
PlaySE(SE_W109);
- }
else
- {
PlaySE(SE_RG_DEOMOV);
- }
-
- CreateTask(sub_813B160, 8);
+ CreateTask(WaitForDeoxysRockMovement, 8);
gFieldEffectArguments[0] = 1;
gFieldEffectArguments[1] = 58;
gFieldEffectArguments[2] = 26;
- gFieldEffectArguments[3] = gUnknown_085B33E0[a0][0];
- gFieldEffectArguments[4] = gUnknown_085B33E0[a0][1];
+ gFieldEffectArguments[3] = sDeoxysRockCoords[rockLevel][0];
+ gFieldEffectArguments[4] = sDeoxysRockCoords[rockLevel][1];
- if (a0 == 0)
- {
+ if (rockLevel == 0)
gFieldEffectArguments[5] = 60;
- }
else
- {
gFieldEffectArguments[5] = 5;
- }
- FieldEffectStart(FLDEFF_66);
- Overworld_SetEventObjTemplateCoords(1, gUnknown_085B33E0[a0][0], gUnknown_085B33E0[a0][1]);
+ FieldEffectStart(FLDEFF_MOVE_DEOXYS_ROCK);
+ Overworld_SetEventObjTemplateCoords(1, sDeoxysRockCoords[rockLevel][0], sDeoxysRockCoords[rockLevel][1]);
}
-static void sub_813B160(u8 taskId)
+static void WaitForDeoxysRockMovement(u8 taskId)
{
- if (FieldEffectActiveListContains(FLDEFF_66) == FALSE)
+ if (FieldEffectActiveListContains(FLDEFF_MOVE_DEOXYS_ROCK) == FALSE)
{
EnableBothScriptContexts();
DestroyTask(taskId);
}
}
-void increment_var_x4026_on_birth_island_modulo_100(void)
+void IncrementBirthIslandRockStepCount(void)
{
- u16 var = VarGet(VAR_0x4034);
+ u16 var = VarGet(VAR_DEOXYS_ROCK_STEP_COUNT);
if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR))
{
var++;
if (var > 99)
{
- VarSet(VAR_0x4034, 0);
+ VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, 0);
}
else
{
- VarSet(VAR_0x4034, var);
+ VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, var);
}
}
}
void sub_813B1D0(void)
{
- LoadPalette(&gUnknown_085B3280[(u8)VarGet(VAR_0x4035)], 0x1A0, 8);
+ LoadPalette(&sDeoxysRockPalettes[(u8)VarGet(VAR_DEOXYS_ROCK_LEVEL)], 0x1A0, 8);
BlendPalettes(0x04000000, 16, 0);
}
@@ -3616,7 +3609,7 @@ static void sub_813B57C(u8 taskId)
}
break;
case 1:
- if (sub_800A520() == TRUE)
+ if (IsLinkTaskFinished() == TRUE)
{
if (GetMultiplayerId() == 0)
{
@@ -3657,7 +3650,7 @@ static void sub_813B57C(u8 taskId)
}
break;
case 3:
- if (sub_800A520() == TRUE)
+ if (IsLinkTaskFinished() == TRUE)
{
if (GetMultiplayerId() != 0)
{
@@ -3709,14 +3702,14 @@ static void sub_813B57C(u8 taskId)
}
break;
case 7:
- if (sub_800A520() == 1)
+ if (IsLinkTaskFinished() == 1)
{
sub_800ADF8();
gTasks[taskId].data[0]++;
}
break;
case 8:
- if (sub_800A520() == 1)
+ if (IsLinkTaskFinished() == 1)
{
gTasks[taskId].data[0]++;
}
@@ -3813,11 +3806,11 @@ void sub_813B9A0(void)
{
if (gSaveBlock1Ptr->lastHealLocation.mapGroup == MAP_GROUP(DEWFORD_TOWN) && gSaveBlock1Ptr->lastHealLocation.mapNum == MAP_NUM(DEWFORD_TOWN))
{
- Overworld_SetHealLocationWarp(3);
+ SetLastHealLocationWarp(3);
}
}
-bool32 sub_813B9C0(void)
+bool8 sub_813B9C0(void)
{
static const u16 gUnknown_085B3444[] = {
MAP_OLDALE_TOWN_POKEMON_CENTER_1F,
diff --git a/src/fieldmap.c b/src/fieldmap.c
index 11161b8df..d2ff34b1c 100644
--- a/src/fieldmap.c
+++ b/src/fieldmap.c
@@ -1,11 +1,11 @@
#include "global.h"
#include "bg.h"
#include "fieldmap.h"
+#include "fldeff.h"
#include "fldeff_misc.h"
-#include "fldeff_cut.h"
-#include "fldeff_groundshake.h"
#include "frontier_util.h"
#include "menu.h"
+#include "mirage_tower.h"
#include "overworld.h"
#include "palette.h"
#include "pokenav.h"
@@ -24,84 +24,94 @@ struct ConnectionFlags
u8 east:1;
};
-EWRAM_DATA static u16 gUnknown_02032318[0x2800] = {0};
+EWRAM_DATA static u16 gBackupMapData[MAX_MAP_DATA_SIZE] = {0};
EWRAM_DATA struct MapHeader gMapHeader = {0};
EWRAM_DATA struct Camera gCamera = {0};
-EWRAM_DATA static struct ConnectionFlags gUnknown_02037340 = {0};
+EWRAM_DATA static struct ConnectionFlags gMapConnectionFlags = {0};
EWRAM_DATA static u32 sFiller_02037344 = 0; // without this, the next file won't align properly
-struct BackupMapLayout gUnknown_03005DC0;
+struct BackupMapLayout gBackupMapLayout;
static const struct ConnectionFlags sDummyConnectionFlags = {0};
+static void InitMapLayoutData(struct MapHeader *mapHeader);
+static void InitBackupMapLayoutData(u16 *map, u16 width, u16 height);
+static void FillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void FillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void FillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
+static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader);
+static void LoadSavedMapView(void);
+static bool8 SkipCopyingMetatileFromSavedMap(u16* mapMetatilePtr, u16 mapWidth, u8 yMode);
+
struct MapHeader const *const mapconnection_get_mapheader(struct MapConnection *connection)
{
return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum);
}
-void not_trainer_hill_battle_pyramid(void)
+void InitMap(void)
{
- mapheader_copy_mapdata_with_padding(&gMapHeader);
+ InitMapLayoutData(&gMapHeader);
sub_80E8EE0(gMapHeader.events);
mapheader_run_script_with_tag_x1();
}
-void sub_8087D74(void)
+void InitMapFromSavedGame(void)
{
- mapheader_copy_mapdata_with_padding(&gMapHeader);
+ InitMapLayoutData(&gMapHeader);
sub_80E9238(0);
sub_80E8EE0(gMapHeader.events);
- mapdata_from_sav2();
+ LoadSavedMapView();
mapheader_run_script_with_tag_x1();
- UpdateTVScreensOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height);
+ UpdateTVScreensOnMap(gBackupMapLayout.width, gBackupMapLayout.height);
}
-void battle_pyramid_map_load_related(u8 a0)
+void InitBattlePyramidMap(u8 a0)
{
- CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318));
- sub_81AA078(gUnknown_02032318, a0);
+ CpuFastFill(0x03ff03ff, gBackupMapData, sizeof(gBackupMapData));
+ sub_81AA078(gBackupMapData, a0);
}
-void trainer_hill_map_load_related(void)
+void InitTrainerHillMap(void)
{
- CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318));
- sub_81D5FB4(gUnknown_02032318);
+ CpuFastFill(0x03ff03ff, gBackupMapData, sizeof(gBackupMapData));
+ sub_81D5FB4(gBackupMapData);
}
-void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader)
+static void InitMapLayoutData(struct MapHeader *mapHeader)
{
struct MapLayout const *mapLayout;
int width;
int height;
mapLayout = mapHeader->mapLayout;
- CpuFastFill16(0x03ff, gUnknown_02032318, sizeof(gUnknown_02032318));
- gUnknown_03005DC0.map = gUnknown_02032318;
+ CpuFastFill16(0x03ff, gBackupMapData, sizeof(gBackupMapData));
+ gBackupMapLayout.map = gBackupMapData;
width = mapLayout->width + 15;
- gUnknown_03005DC0.width = width;
+ gBackupMapLayout.width = width;
height = mapLayout->height + 14;
- gUnknown_03005DC0.height = height;
- if (width * height <= 0x2800)
+ gBackupMapLayout.height = height;
+ if (width * height <= MAX_MAP_DATA_SIZE)
{
- map_copy_with_padding(mapLayout->map, mapLayout->width, mapLayout->height);
- mapheader_copy_mapdata_of_adjacent_maps(mapHeader);
+ InitBackupMapLayoutData(mapLayout->map, mapLayout->width, mapLayout->height);
+ InitBackupMapLayoutConnections(mapHeader);
}
}
-void map_copy_with_padding(u16 *map, u16 width, u16 height)
+static void InitBackupMapLayoutData(u16 *map, u16 width, u16 height)
{
u16 *dest;
int y;
- dest = gUnknown_03005DC0.map;
- dest += gUnknown_03005DC0.width * 7 + 7;
+ dest = gBackupMapLayout.map;
+ dest += gBackupMapLayout.width * 7 + 7;
for (y = 0; y < height; y++)
{
CpuCopy16(map, dest, width * 2);
- dest += width + 0xf;
+ dest += width + 15;
map += width;
}
}
-void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader)
+static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader)
{
int count;
struct MapConnection *connection;
@@ -111,56 +121,54 @@ void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader)
{
count = mapHeader->connections->count;
connection = mapHeader->connections->connections;
-
- gUnknown_02037340 = sDummyConnectionFlags;
+ gMapConnectionFlags = sDummyConnectionFlags;
for (i = 0; i < count; i++, connection++)
{
struct MapHeader const *cMap = mapconnection_get_mapheader(connection);
u32 offset = connection->offset;
-
switch (connection->direction)
{
case CONNECTION_SOUTH:
- fillSouthConnection(mapHeader, cMap, offset);
- gUnknown_02037340.south = 1;
+ FillSouthConnection(mapHeader, cMap, offset);
+ gMapConnectionFlags.south = 1;
break;
case CONNECTION_NORTH:
- fillNorthConnection(mapHeader, cMap, offset);
- gUnknown_02037340.north = 1;
+ FillNorthConnection(mapHeader, cMap, offset);
+ gMapConnectionFlags.north = 1;
break;
case CONNECTION_WEST:
- fillWestConnection(mapHeader, cMap, offset);
- gUnknown_02037340.west = 1;
+ FillWestConnection(mapHeader, cMap, offset);
+ gMapConnectionFlags.west = 1;
break;
case CONNECTION_EAST:
- fillEastConnection(mapHeader, cMap, offset);
- gUnknown_02037340.east = 1;
+ FillEastConnection(mapHeader, cMap, offset);
+ gMapConnectionFlags.east = 1;
break;
}
}
}
}
-void sub_8087F54(int x, int y, struct MapHeader const *mapHeader, int x2, int y2, int width, int height)
+static void sub_8087F54(int x, int y, struct MapHeader const *connectedMapHeader, int x2, int y2, int width, int height)
{
int i;
u16 *src;
u16 *dest;
int mapWidth;
- mapWidth = mapHeader->mapLayout->width;
- src = &mapHeader->mapLayout->map[mapWidth * y2 + x2];
- dest = &gUnknown_03005DC0.map[gUnknown_03005DC0.width * y + x];
+ mapWidth = connectedMapHeader->mapLayout->width;
+ src = &connectedMapHeader->mapLayout->map[mapWidth * y2 + x2];
+ dest = &gBackupMapLayout.map[gBackupMapLayout.width * y + x];
for (i = 0; i < height; i++)
{
CpuCopy16(src, dest, width * 2);
- dest += gUnknown_03005DC0.width;
+ dest += gBackupMapLayout.width;
src += mapWidth;
}
}
-void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void FillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
int x, y;
int x2;
@@ -176,26 +184,26 @@ void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader con
{
x2 = -x;
x += cWidth;
- if (x < gUnknown_03005DC0.width)
+ if (x < gBackupMapLayout.width)
{
width = x;
}
else
{
- width = gUnknown_03005DC0.width;
+ width = gBackupMapLayout.width;
}
x = 0;
}
else
{
x2 = 0;
- if (x + cWidth < gUnknown_03005DC0.width)
+ if (x + cWidth < gBackupMapLayout.width)
{
width = cWidth;
}
else
{
- width = gUnknown_03005DC0.width - x;
+ width = gBackupMapLayout.width - x;
}
}
@@ -207,7 +215,7 @@ void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader con
}
}
-void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void FillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
int x;
int x2, y2;
@@ -224,26 +232,26 @@ void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader con
{
x2 = -x;
x += cWidth;
- if (x < gUnknown_03005DC0.width)
+ if (x < gBackupMapLayout.width)
{
width = x;
}
else
{
- width = gUnknown_03005DC0.width;
+ width = gBackupMapLayout.width;
}
x = 0;
}
else
{
x2 = 0;
- if (x + cWidth < gUnknown_03005DC0.width)
+ if (x + cWidth < gBackupMapLayout.width)
{
width = cWidth;
}
else
{
- width = gUnknown_03005DC0.width - x;
+ width = gBackupMapLayout.width - x;
}
}
@@ -256,7 +264,7 @@ void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader con
}
}
-void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void FillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
int y;
int x2, y2;
@@ -271,26 +279,26 @@ void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader cons
if (y < 0)
{
y2 = -y;
- if (y + cHeight < gUnknown_03005DC0.height)
+ if (y + cHeight < gBackupMapLayout.height)
{
height = y + cHeight;
}
else
{
- height = gUnknown_03005DC0.height;
+ height = gBackupMapLayout.height;
}
y = 0;
}
else
{
y2 = 0;
- if (y + cHeight < gUnknown_03005DC0.height)
+ if (y + cHeight < gBackupMapLayout.height)
{
height = cHeight;
}
else
{
- height = gUnknown_03005DC0.height - y;
+ height = gBackupMapLayout.height - y;
}
}
@@ -302,7 +310,7 @@ void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader cons
}
}
-void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
+static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset)
{
int x, y;
int y2;
@@ -316,26 +324,26 @@ void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader cons
if (y < 0)
{
y2 = -y;
- if (y + cHeight < gUnknown_03005DC0.height)
+ if (y + cHeight < gBackupMapLayout.height)
{
height = y + cHeight;
}
else
{
- height = gUnknown_03005DC0.height;
+ height = gBackupMapLayout.height;
}
y = 0;
}
else
{
y2 = 0;
- if (y + cHeight < gUnknown_03005DC0.height)
+ if (y + cHeight < gBackupMapLayout.height)
{
height = cHeight;
}
else
{
- height = gUnknown_03005DC0.height - y;
+ height = gBackupMapLayout.height - y;
}
}
@@ -364,10 +372,10 @@ u8 MapGridGetZCoordAt(int x, int y)
int i;
u16 *border;
- if (x >= 0 && x < gUnknown_03005DC0.width
- && y >= 0 && y < gUnknown_03005DC0.height)
+ if (x >= 0 && x < gBackupMapLayout.width
+ && y >= 0 && y < gBackupMapLayout.height)
{
- block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y];
+ block = gBackupMapLayout.map[x + gBackupMapLayout.width * y];
}
else
{
@@ -392,10 +400,10 @@ u8 MapGridIsImpassableAt(int x, int y)
int i;
u16 *border;
- if (x >= 0 && x < gUnknown_03005DC0.width
- && y >= 0 && y < gUnknown_03005DC0.height)
+ if (x >= 0 && x < gBackupMapLayout.width
+ && y >= 0 && y < gBackupMapLayout.height)
{
- block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y];
+ block = gBackupMapLayout.map[x + gBackupMapLayout.width * y];
}
else
{
@@ -421,10 +429,10 @@ u32 MapGridGetMetatileIdAt(int x, int y)
u16 *border;
u16 block2;
- if (x >= 0 && x < gUnknown_03005DC0.width
- && y >= 0 && y < gUnknown_03005DC0.height)
+ if (x >= 0 && x < gBackupMapLayout.width
+ && y >= 0 && y < gBackupMapLayout.height)
{
- block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y];
+ block = gBackupMapLayout.map[x + gBackupMapLayout.width * y];
}
else
{
@@ -462,22 +470,22 @@ u8 MapGridGetMetatileLayerTypeAt(int x, int y)
void MapGridSetMetatileIdAt(int x, int y, u16 metatile)
{
int i;
- if (x >= 0 && x < gUnknown_03005DC0.width
- && y >= 0 && y < gUnknown_03005DC0.height)
+ if (x >= 0 && x < gBackupMapLayout.width
+ && y >= 0 && y < gBackupMapLayout.height)
{
- i = x + y * gUnknown_03005DC0.width;
- gUnknown_03005DC0.map[i] = (gUnknown_03005DC0.map[i] & 0xf000) | (metatile & 0xfff);
+ i = x + y * gBackupMapLayout.width;
+ gBackupMapLayout.map[i] = (gBackupMapLayout.map[i] & 0xf000) | (metatile & 0xfff);
}
}
void MapGridSetMetatileEntryAt(int x, int y, u16 metatile)
{
int i;
- if (x >= 0 && x < gUnknown_03005DC0.width
- && y >= 0 && y < gUnknown_03005DC0.height)
+ if (x >= 0 && x < gBackupMapLayout.width
+ && y >= 0 && y < gBackupMapLayout.height)
{
- i = x + gUnknown_03005DC0.width * y;
- gUnknown_03005DC0.map[i] = metatile;
+ i = x + gBackupMapLayout.width * y;
+ gBackupMapLayout.map[i] = metatile;
}
}
@@ -507,76 +515,75 @@ void save_serialize_map(void)
u16 *mapView;
int width;
mapView = gSaveBlock1Ptr->mapView;
- width = gUnknown_03005DC0.width;
+ width = gBackupMapLayout.width;
x = gSaveBlock1Ptr->pos.x;
y = gSaveBlock1Ptr->pos.y;
for (i = y; i < y + 14; i++)
{
for (j = x; j < x + 15; j++)
{
- *mapView++ = gUnknown_02032318[width * i + j];
+ *mapView++ = gBackupMapData[width * i + j];
}
}
}
-int sub_8088438(void)
+static bool32 SavedMapViewIsEmpty(void)
{
u16 i;
- u32 r2;
- r2 = 0;
+ u32 marker = 0;
+
+ // BUG: This loop extends past the bounds of the mapView array. Its size is only 0x100.
for (i = 0; i < 0x200; i++)
- {
- r2 |= gSaveBlock1Ptr->mapView[i];
- }
- if (r2 == 0)
- {
- return 1;
- }
- return 0;
+ marker |= gSaveBlock1Ptr->mapView[i];
+
+ if (marker == 0)
+ return TRUE;
+ else
+ return FALSE;
}
-void sav2_mapdata_clear(void)
+static void ClearSavedMapView(void)
{
CpuFill16(0, gSaveBlock1Ptr->mapView, sizeof(gSaveBlock1Ptr->mapView));
}
-void mapdata_from_sav2(void)
+static void LoadSavedMapView(void)
{
- u8 a0;
+ u8 yMode;
int i, j;
int x, y;
u16 *mapView;
int width;
mapView = gSaveBlock1Ptr->mapView;
- if (!sub_8088438())
+ if (!SavedMapViewIsEmpty())
{
- width = gUnknown_03005DC0.width;
+ width = gBackupMapLayout.width;
x = gSaveBlock1Ptr->pos.x;
y = gSaveBlock1Ptr->pos.y;
for (i = y; i < y + 14; i++)
{
if (i == y && i != 0)
- a0 = 0;
+ yMode = 0;
else if (i == y + 13 && i != gMapHeader.mapLayout->height - 1)
- a0 = 1;
+ yMode = 1;
else
- a0 = -1;
+ yMode = 0xFF;
for (j = x; j < x + 15; j++)
{
- if (!sub_8088BF0(&gUnknown_02032318[j + width * i], width, a0))
- gUnknown_02032318[j + width * i] = *mapView;
+ if (!SkipCopyingMetatileFromSavedMap(&gBackupMapData[j + width * i], width, yMode))
+ gBackupMapData[j + width * i] = *mapView;
mapView++;
}
}
for (j = x; j < x + 15; j++)
{
if (y != 0)
- sub_80D423C(j, y - 1);
+ FixLongGrassMetatilesWindowTop(j, y - 1);
if (i < gMapHeader.mapLayout->height - 1)
- sub_80D42B8(j, y + 13);
+ FixLongGrassMetatilesWindowBottom(j, y + 13);
}
- sav2_mapdata_clear();
+ ClearSavedMapView();
}
}
@@ -592,7 +599,7 @@ void sub_80885C4(u8 a1)
int x, y;
int i, j;
mapView = gSaveBlock1Ptr->mapView;
- width = gUnknown_03005DC0.width;
+ width = gBackupMapLayout.width;
r9 = 0;
r8 = 0;
x0 = gSaveBlock1Ptr->pos.x;
@@ -627,13 +634,13 @@ void sub_80885C4(u8 a1)
desti = width * (y + y0);
srci = (y + r8) * 15 + r9;
src = &mapView[srci + i];
- dest = &gUnknown_02032318[x0 + desti + j];
+ dest = &gBackupMapData[x0 + desti + j];
*dest = *src;
i++;
j++;
}
}
- sav2_mapdata_clear();
+ ClearSavedMapView();
}
int GetMapBorderIdAt(int x, int y)
@@ -641,12 +648,12 @@ int GetMapBorderIdAt(int x, int y)
struct MapLayout const *mapLayout;
u16 block, block2;
int i, j;
- if (x >= 0 && x < gUnknown_03005DC0.width
- && y >= 0 && y < gUnknown_03005DC0.height)
+ if (x >= 0 && x < gBackupMapLayout.width
+ && y >= 0 && y < gBackupMapLayout.height)
{
- i = gUnknown_03005DC0.width;
+ i = gBackupMapLayout.width;
i *= y;
- block = gUnknown_03005DC0.map[x + i];
+ block = gBackupMapLayout.map[x + i];
if (block == 0x3ff)
{
goto fail;
@@ -668,9 +675,9 @@ fail:
return -1;
success:
- if (x >= (gUnknown_03005DC0.width - 8))
+ if (x >= (gBackupMapLayout.width - 8))
{
- if (!gUnknown_02037340.east)
+ if (!gMapConnectionFlags.east)
{
return -1;
}
@@ -678,15 +685,15 @@ success:
}
else if (x < 7)
{
- if (!gUnknown_02037340.west)
+ if (!gMapConnectionFlags.west)
{
return -1;
}
return CONNECTION_WEST;
}
- else if (y >= (gUnknown_03005DC0.height - 7))
+ else if (y >= (gBackupMapLayout.height - 7))
{
- if (!gUnknown_02037340.south)
+ if (!gMapConnectionFlags.south)
{
return -1;
}
@@ -694,7 +701,7 @@ success:
}
else if (y < 7)
{
- if (!gUnknown_02037340.north)
+ if (!gMapConnectionFlags.north)
{
return -1;
}
@@ -763,7 +770,7 @@ bool8 CameraMove(int x, int y)
else
{
save_serialize_map();
- sub_81BE72C();
+ ClearMirageTowerPulseBlendEffect();
old_x = gSaveBlock1Ptr->pos.x;
old_y = gSaveBlock1Ptr->pos.y;
connection = sub_8088950(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y);
@@ -891,13 +898,13 @@ void sub_8088B3C(u16 x, u16 y)
gSaveBlock1Ptr->pos.y = y - 7;
}
-void sav1_camera_get_focus_coords(u16 *x, u16 *y)
+void GetCameraFocusCoords(u16 *x, u16 *y)
{
*x = gSaveBlock1Ptr->pos.x + 7;
*y = gSaveBlock1Ptr->pos.y + 7;
}
-void SetCameraCoords(u16 x, u16 y)
+void SetPlayerCoords(u16 x, u16 y)
{
gSaveBlock1Ptr->pos.x = x;
gSaveBlock1Ptr->pos.y = y;
@@ -911,26 +918,26 @@ void GetCameraCoords(u16 *x, u16 *y)
void sub_8088B94(int x, int y, int a2)
{
- if (x >= 0 && x < gUnknown_03005DC0.width && y >= 0 && y < gUnknown_03005DC0.height)
+ if (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height)
{
if (a2 != 0)
- gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] |= 0xC00;
+ gBackupMapLayout.map[x + gBackupMapLayout.width * y] |= 0xC00;
else
- gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] &= 0xF3FF;
+ gBackupMapLayout.map[x + gBackupMapLayout.width * y] &= 0xF3FF;
}
}
-bool8 sub_8088BF0(u16* a0, u16 a1, u8 a2)
+static bool8 SkipCopyingMetatileFromSavedMap(u16* mapMetatilePtr, u16 mapWidth, u8 yMode)
{
- if (a2 == 0xFF)
+ if (yMode == 0xFF)
return FALSE;
- if (a2 == 0)
- a0 -= a1;
+ if (yMode == 0)
+ mapMetatilePtr -= mapWidth;
else
- a0 += a1;
+ mapMetatilePtr += mapWidth;
- if (sub_80FADE4(*a0 & 0x3FF, a2) == 1)
+ if (sub_80FADE4(*mapMetatilePtr & 0x3FF, yMode) == 1)
return TRUE;
return FALSE;
}
@@ -986,7 +993,7 @@ void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u1
}
else
{
- LoadCompressedPalette((u16*)tileset->palettes, destOffset, size);
+ LoadCompressedPalette((u32*)tileset->palettes, destOffset, size);
nullsub_3(destOffset, size >> 1);
}
}
diff --git a/src/fight.c b/src/fight.c
index b7ca2e87a..c924effae 100644
--- a/src/fight.c
+++ b/src/fight.c
@@ -486,8 +486,8 @@ void sub_810CF30(struct Sprite *sprite)
sprite->pos1.x = GetBattlerSpriteCoord(battler, 2);
sprite->pos1.y = GetBattlerSpriteCoord(battler, 3);
- xMod = sub_80A861C(battler, 1) / 2;
- yMod = sub_80A861C(battler, 0) / 4;
+ xMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 2;
+ yMod = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;
x = Random2() % xMod;
y = Random2() % yMod;
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
index 6a310efd2..348a1f46c 100644
--- a/src/fldeff_cut.c
+++ b/src/fldeff_cut.c
@@ -5,12 +5,11 @@
#include "field_effect.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
-#include "fldeff_cut.h"
+#include "fldeff.h"
#include "alloc.h"
#include "metatile_behavior.h"
#include "overworld.h"
#include "party_menu.h"
-#include "rom6.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
@@ -625,7 +624,7 @@ static void CutGrassSpriteCallbackEnd(struct Sprite *sprite)
ScriptContext1_SetupScript(FarawayIsland_Interior_EventScript_267EDB);
}
-void sub_80D423C(s16 x, s16 y)
+void FixLongGrassMetatilesWindowTop(s16 x, s16 y)
{
u8 metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);
if (MetatileBehavior_IsLongGrass_Duplicate(metatileBehavior))
@@ -648,7 +647,7 @@ void sub_80D423C(s16 x, s16 y)
}
}
-void sub_80D42B8(s16 x, s16 y)
+void FixLongGrassMetatilesWindowBottom(s16 x, s16 y)
{
if (MapGridGetMetatileIdAt(x, y) == METATILE_ID_GRASS)
{
diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c
new file mode 100644
index 000000000..b39d25182
--- /dev/null
+++ b/src/fldeff_dig.c
@@ -0,0 +1,63 @@
+#include "global.h"
+#include "braille_puzzles.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "fldeff.h"
+#include "item_use.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "sprite.h"
+#include "constants/field_effects.h"
+
+// static functions
+static void hm2_dig(void);
+static void sub_8135780(void);
+
+// text
+bool8 SetUpFieldMove_Dig(void)
+{
+ if (CanUseEscapeRopeOnCurrMap() == TRUE)
+ {
+ gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
+ gPostMenuFieldCallback = hm2_dig;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void hm2_dig(void)
+{
+ Overworld_ResetStateAfterDigEscRope();
+ FieldEffectStart(FLDEFF_USE_DIG);
+ gFieldEffectArguments[0] = GetCursorSelectionMonId();
+}
+
+bool8 FldEff_UseDig(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_8135780 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_8135780;
+ if (!ShouldDoBrailleDigEffect())
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
+ return FALSE;
+}
+
+static void sub_8135780(void)
+{
+ u8 taskId;
+
+ FieldEffectActiveListRemove(FLDEFF_USE_DIG);
+ if (ShouldDoBrailleDigEffect())
+ {
+ DoBrailleDigEffect();
+ }
+ else
+ {
+ taskId = CreateTask(task08_080A1C44, 8);
+ gTasks[taskId].data[0] = 0;
+ }
+}
diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c
index 7d3e07123..3d00fb162 100644
--- a/src/fldeff_escalator.c
+++ b/src/fldeff_escalator.c
@@ -2,18 +2,19 @@
#include "field_camera.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
+#include "fldeff.h"
#include "task.h"
static EWRAM_DATA u8 sEscalatorAnim_TaskId = 0;
-void sub_80E12E8(u8 taskId, const s16 *list, u16 c)
+static void sub_80E12E8(u8 taskId, const s16 *list, u16 c)
{
s16 r5 = gTasks[taskId].data[4] - 1;
s16 r3 = gTasks[taskId].data[5] - 1;
s16 r4 = gTasks[taskId].data[1];
s16 y;
s16 x;
-
+
if (gTasks[taskId].data[2] == 0)
{
for (y = 0; y < 3; y++)
@@ -21,7 +22,7 @@ void sub_80E12E8(u8 taskId, const s16 *list, u16 c)
for (x = 0; x < 3; x++)
{
s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
-
+
if (list[r4] == metatileId)
{
if (r4 != 2)
@@ -39,7 +40,7 @@ void sub_80E12E8(u8 taskId, const s16 *list, u16 c)
for (x = 0; x < 3; x++)
{
s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y);
-
+
if (list[2 - r4] == metatileId)
{
if (r4 != 2)
@@ -60,7 +61,7 @@ static const u16 gUnknown_08589AD2[] = {0x2A0, 0x2A2, 0x2A4};
static const u16 gUnknown_08589AD8[] = {0x2A1, 0x2A3, 0x2A5};
static const u16 gUnknown_08589ADE[] = {0x2A8, 0x2AA, 0x2AC};
-void sub_80E1444(u8 taskId)
+static void sub_80E1444(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -100,7 +101,7 @@ void sub_80E1444(u8 taskId)
}
}
-u8 sub_80E150C(u16 var)
+static u8 sub_80E150C(u16 var)
{
u8 taskId = CreateTask(sub_80E1444, 0);
s16 *data = gTasks[taskId].data;
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
index 8862caa9f..f3bd76cbf 100644
--- a/src/fldeff_flash.c
+++ b/src/fldeff_flash.c
@@ -3,12 +3,12 @@
#include "event_data.h"
#include "event_scripts.h"
#include "field_effect.h"
+#include "fldeff.h"
#include "gpu_regs.h"
#include "main.h"
#include "overworld.h"
#include "palette.h"
#include "party_menu.h"
-#include "rom6.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
@@ -156,7 +156,7 @@ static bool8 sub_8137304(void)
{
u8 i;
u8 v0 = GetLastUsedWarpMapType();
- u8 v1 = Overworld_GetMapTypeOfSaveblockLocation();
+ u8 v1 = GetCurrentMapType();
for (i = 0; gUnknown_085B27C8[i].unk0; i++)
{
diff --git a/src/fldeff_groundshake.c b/src/fldeff_groundshake.c
deleted file mode 100644
index 44ffd60f9..000000000
--- a/src/fldeff_groundshake.c
+++ /dev/null
@@ -1,320 +0,0 @@
-#include "global.h"
-#include "event_data.h"
-#include "event_object_movement.h"
-#include "field_camera.h"
-#include "alloc.h"
-#include "random.h"
-#include "roulette_util.h"
-#include "script.h"
-#include "sound.h"
-#include "sprite.h"
-#include "task.h"
-#include "constants/flags.h"
-#include "constants/songs.h"
-
-// structures
-struct Struct203CF18 {
- u8 taskId;
- struct InnerStruct203CF18 unk4;
-}; //size = 0xC8
-
-// extern data
-extern const struct SpriteSheet gUnknown_08617D94[];
-extern const s16 gUnknown_08617D64[][3];
-
-// static functions
-static void sub_81BE808(u8 taskId);
-static void sub_81BE900(u8 taskId);
-static void sub_81BE968(void);
-static void sub_81BE9C0(u8 taskId);
-static void sub_81BEA00(u8 taskId);
-static void sub_81BEA20(void);
-static void sub_81BEAD8(struct Sprite* sprite);
-
-// rodata
-const struct InnerStruct203CF18_3 gUnknown_08617E18 = {
- .unk0 = 0x433b,
- .unk2 = 0x61,
- .unk4 = 0x0F,
- .unk5 = 0x05,
- .unk6 = 0xFF,
- .unk7_0 = 0xB,
- .unk7_4 = 0x1,
- .unk7_6 = 0,
- .unk7_7 = 1,
-};
-
-static const union AnimCmd gSpriteAnim_8617E20[] =
-{
- ANIMCMD_FRAME(0, 12),
- ANIMCMD_JUMP(0),
-};
-
-static const union AnimCmd *const gSpriteAnimTable_8617E28[] =
-{
- gSpriteAnim_8617E20,
-};
-
-static const struct OamData gUnknown_08617E2C =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 0,
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct SpriteTemplate gUnknown_08617E34 = {
- .tileTag = 0x0FA0,
- .paletteTag = 0xFFFF,
- .oam = &gUnknown_08617E2C,
- .anims = gSpriteAnimTable_8617E28,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_81BEAD8
-};
-
-static const union AnimCmd gSpriteAnim_8617E4C[] =
-{
- ANIMCMD_FRAME(0, 12),
- ANIMCMD_JUMP(0),
-};
-
-static const union AnimCmd *const gSpriteAnim_8617E54[] =
-{
- gSpriteAnim_8617E4C,
-};
-
-static const struct OamData gSpriteAnim_8617E58 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-static const struct SpriteTemplate gUnknown_08617E60 = {
- .tileTag = 0x0FA0,
- .paletteTag = 0xFFFF,
- .oam = &gSpriteAnim_8617E58,
- .anims = gSpriteAnim_8617E54,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_81BEAD8
-};
-
-// ewram
-EWRAM_DATA struct Struct203CF18 *gUnknown_0203CF18 = NULL;
-
-// text
-bool8 sub_81BE66C(void)
-{
- if (!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A))
- return 0;
- return FlagGet(FLAG_0x14E);
-}
-
-void sub_81BE698(u8 taskId)
-{
- sub_8151E50(&(gUnknown_0203CF18->unk4));
-}
-
-void sub_81BE6AC(void)
-{
- gUnknown_0203CF18 = NULL;
-}
-
-void sub_81BE6B8(void)
-{
- if(gUnknown_0203CF18 != NULL)
- {
- gUnknown_0203CF18 = NULL;
- return;
- }
- if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E))
- return;
-
- gUnknown_0203CF18 = (struct Struct203CF18 *)AllocZeroed(sizeof(struct Struct203CF18));
- sub_8151B3C(&(gUnknown_0203CF18->unk4));
- sub_8151B68(&(gUnknown_0203CF18->unk4), &gUnknown_08617E18);
- sub_8151CA8(&(gUnknown_0203CF18->unk4), 1, 1);
- gUnknown_0203CF18->taskId = CreateTask(sub_81BE698, 0xFF);
-}
-
-void sub_81BE72C(void)
-{
- if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E) || gUnknown_0203CF18 == NULL)
- return;
- if(FuncIsActiveTask(sub_81BE698))
- DestroyTask(gUnknown_0203CF18->taskId);
- sub_8151D28(&(gUnknown_0203CF18->unk4), 1, 1);
- sub_8151C50(&(gUnknown_0203CF18->unk4), 1, 1);
- Free(gUnknown_0203CF18);
- gUnknown_0203CF18 = NULL;
-}
-
-void sub_81BE79C(void)
-{
- u16 rand;
- bool8 chance;
-
- if(VarGet(VAR_0x40CB) != 0)
- {
- FlagClear(FLAG_0x14E);
- return;
- }
- rand = Random();
- chance = rand & 1;
- if(FlagGet(FLAG_0x09D) == TRUE)
- chance = TRUE;
- if(chance)
- {
- FlagSet(FLAG_0x14E);
- sub_81BE6B8();
- return;
- }
- FlagClear(FLAG_0x14E);
-}
-
-void sub_81BE7F4(void)
-{
- CreateTask(sub_81BE808, 0x8);
-}
-
-static void sub_81BE808(u8 taskId)
-{
- u8 eventObjectIdBuffer;
- struct EventObject *fieldEventObject;
- struct EventObject *playerAvatarEventObject;
-
- TryGetEventObjectIdByLocalIdAndMap(0x2D, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectIdBuffer);
- fieldEventObject = &(gEventObjects[eventObjectIdBuffer]);
- gSprites[fieldEventObject->spriteId].pos2.y += 4;
- playerAvatarEventObject = &(gEventObjects[gPlayerAvatar.eventObjectId]);
-
- if((gSprites[fieldEventObject->spriteId].pos1.y + gSprites[fieldEventObject->spriteId].pos2.y) >=
- (gSprites[playerAvatarEventObject->spriteId].pos1.y + gSprites[playerAvatarEventObject->spriteId].pos2.y))
- {
- DestroyTask(taskId);
- EnableBothScriptContexts();
- }
-}
-
-static void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d)
-{
- u8 taskId;
-
- taskId = CreateTask(sub_81BE900, 0x9);
- gTasks[taskId].data[0] = b;
- gTasks[taskId].data[1] = 0;
- gTasks[taskId].data[2] = c;
- gTasks[taskId].data[3] = d;
- gTasks[taskId].data[4] = a;
- SetCameraPanningCallback(NULL);
- PlaySE(SE_W070);
-}
-
-static void sub_81BE900(u8 taskId)
-{
- s16 *data;
-
- data = gTasks[taskId].data;
- data[1]++;
- if((data[1] % data[3]) == 0)
- {
- data[1] = 0;
- data[2]--;
- data[0] = -data[0];
- data[4] = -data[4];
- SetCameraPanning(data[0], data[4]);
- if(!data[2])
- {
- sub_81BE968();
- DestroyTask(taskId);
- InstallCameraPanAheadCallback();
- }
- }
-}
-
-static void sub_81BE968(void)
-{
- u8 taskId;
-
- taskId = FindTaskIdByFunc(sub_81BE9C0);
- if(taskId != 0xFF)
- gTasks[taskId].data[0]++;
-}
-
-void sub_81BE994(void)
-{
- LoadSpriteSheets(gUnknown_08617D94);
- sub_81BEA20();
- CreateTask(sub_81BE9C0, 0x8);
- sp136_strengh_sound(2, 1, 16, 3);
-}
-
-static void sub_81BE9C0(u8 taskId)
-{
- u16 *data;
-
- data = gTasks[taskId].data;
- data[1]++;
- if(data[1] == 1000 || data[0] == 17)
- gTasks[taskId].func = sub_81BEA00;
-}
-
-static void sub_81BEA00(u8 taskId)
-{
- FreeSpriteTilesByTag(4000);
- DestroyTask(taskId);
- EnableBothScriptContexts();
-}
-
-static void sub_81BEA20(void)
-{
- u8 i;
- u8 spriteId;
-
- for(i = 0; i < 8; i++)
- {
- spriteId = CreateSprite(&gUnknown_08617E60, gUnknown_08617D64[i][0] + 120, gUnknown_08617D64[i][1], 8);
- gSprites[spriteId].oam.priority = 0;
- gSprites[spriteId].oam.paletteNum = 0;
- gSprites[spriteId].data[0] = i;
- }
- for(i = 0; i < 8; i++)
- {
- spriteId = CreateSprite(&gUnknown_08617E34, gUnknown_08617D64[i][0] + 115, gUnknown_08617D64[i][1] - 3, 8);
- gSprites[spriteId].oam.priority = 0;
- gSprites[spriteId].oam.paletteNum = 0;
- gSprites[spriteId].data[0] = i;
- }
-}
-
-static void sub_81BEAD8(struct Sprite* sprite)
-{
- sprite->data[1] += 2;
- sprite->pos2.y = (sprite->data[1] / 2);
- if(((sprite->pos1.y) + (sprite->pos2.y)) > gUnknown_08617D64[sprite->data[0]][2])
- {
- DestroySprite(sprite);
- sub_81BE968();
- }
-}
diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c
index 79f0a8ede..df4576a7f 100644
--- a/src/fldeff_misc.c
+++ b/src/fldeff_misc.c
@@ -4,15 +4,17 @@
#include "script.h"
#include "sound.h"
#include "task.h"
-#include "rom6.h"
#include "strings.h"
#include "party_menu.h"
#include "fieldmap.h"
#include "field_effect.h"
#include "field_camera.h"
#include "field_player_avatar.h"
+#include "fldeff.h"
+#include "fldeff_misc.h"
#include "secret_base.h"
#include "event_data.h"
+#include "event_scripts.h"
#include "event_object_movement.h"
#include "metatile_behavior.h"
#include "string_util.h"
@@ -20,70 +22,71 @@
#include "constants/metatile_behaviors.h"
#include "constants/songs.h"
#include "constants/vars.h"
-#include "fldeff_misc.h"
-void sub_80F9C90(u8);
-void sub_80F9DFC(u8);
+extern struct MapPosition gPlayerFacingPosition;
-void Task_SecretBasePCTurnOn(u8);
+static void sub_80F9C90(u8);
+static void sub_80F9DFC(u8);
-void Task_PopSecretBaseBalloon(u8);
-void DoBalloonSoundEffect(s16);
+static void Task_SecretBasePCTurnOn(u8);
-void Task_WateringBerryTreeAnim_1(u8);
-void Task_WateringBerryTreeAnim_2(u8);
-void Task_WateringBerryTreeAnim_3(u8);
+static void Task_PopSecretBaseBalloon(u8);
+static void DoBalloonSoundEffect(s16);
-void sub_80F9C44(TaskFunc, u16, u16, u8);
+static void Task_WateringBerryTreeAnim_1(u8);
+static void Task_WateringBerryTreeAnim_2(u8);
+static void Task_WateringBerryTreeAnim_3(u8);
-void FieldCallback_SecretBaseCave(void);
+static void sub_80F9C44(TaskFunc, u16, u16, u8);
+
+static void FieldCallback_SecretBaseCave(void);
static void CaveEntranceSpriteCallback1(struct Sprite *);
static void CaveEntranceSpriteCallback2(struct Sprite *);
static void CaveEntranceSpriteCallbackEnd(struct Sprite *);
static void StartSecretBaseCaveFieldEffect(void);
-void FieldCallback_SecretBaseTree(void);
+static void FieldCallback_SecretBaseTree(void);
static void TreeEntranceSpriteCallback1(struct Sprite *);
static void TreeEntranceSpriteCallback2(struct Sprite *);
static void TreeEntranceSpriteCallbackEnd(struct Sprite *);
static void StartSecretBaseTreeFieldEffect(void);
-void FieldCallback_SecretBaseShrub(void);
+static void FieldCallback_SecretBaseShrub(void);
static void ShrubEntranceSpriteCallback1(struct Sprite *);
static void ShrubEntranceSpriteCallback2(struct Sprite *);
static void ShrubEntranceSpriteCallbackEnd(struct Sprite *);
static void StartSecretBaseShrubFieldEffect(void);
-void SpriteCB_SandPillar_0(struct Sprite *);
-void SpriteCB_SandPillar_1(struct Sprite *);
-void SpriteCB_SandPillar_2(struct Sprite *);
-
-const u8 gSpriteImage_858D978[] = INCBIN_U8("graphics/unknown/858E588/0.4bpp");
-const u8 gSpriteImage_858D9F8[] = INCBIN_U8("graphics/unknown/858E588/1.4bpp");
-const u8 gSpriteImage_858DA78[] = INCBIN_U8("graphics/unknown/858E588/2.4bpp");
-const u8 gSpriteImage_858DAF8[] = INCBIN_U8("graphics/unknown/858E588/3.4bpp");
-const u8 gSpriteImage_858DB78[] = INCBIN_U8("graphics/unknown/858E588/4.4bpp");
-
-const u8 gUnusedEmptySpace_858DBF8[32] = {0};
-
-const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_07.gbapal");
-const u8 gSpriteImage_858DC38[] = INCBIN_U8("graphics/unknown/858E5D8/0.4bpp");
-const u8 gSpriteImage_858DCB8[] = INCBIN_U8("graphics/unknown/858E5D8/1.4bpp");
-const u8 gSpriteImage_858DD38[] = INCBIN_U8("graphics/unknown/858E5D8/2.4bpp");
-const u8 gSpriteImage_858DDB8[] = INCBIN_U8("graphics/unknown/858E5D8/3.4bpp");
-const u8 gSpriteImage_858DE38[] = INCBIN_U8("graphics/unknown/858E5D8/4.4bpp");
-const u8 gSpriteImage_858DEB8[] = INCBIN_U8("graphics/unknown/858E5B0/0.4bpp");
-const u8 gSpriteImage_858DF38[] = INCBIN_U8("graphics/unknown/858E5B0/1.4bpp");
-const u8 gSpriteImage_858DFB8[] = INCBIN_U8("graphics/unknown/858E5B0/2.4bpp");
-const u8 gSpriteImage_858E038[] = INCBIN_U8("graphics/unknown/858E5B0/3.4bpp");
-const u8 gSpriteImage_858E0B8[] = INCBIN_U8("graphics/unknown/858E5B0/4.4bpp");
-const u8 gSpriteImage_858E138[] = INCBIN_U8("graphics/unknown/858E5B0/5.4bpp");
-const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_08.gbapal");
-const u8 gSpriteImage_858E1D8[] = INCBIN_U8("graphics/unknown/858E674/0.4bpp");
-const u8 gSpriteImage_858E2D8[] = INCBIN_U8("graphics/unknown/858E674/1.4bpp");
-const u8 gSpriteImage_858E3D8[] = INCBIN_U8("graphics/unknown/858E674/2.4bpp");
-
-const struct OamData gOamData_858E4D8 =
+static void SpriteCB_SandPillar_0(struct Sprite *);
+static void SpriteCB_SandPillar_1(struct Sprite *);
+static void SpriteCB_SandPillar_2(struct Sprite *);
+
+static const u8 gSpriteImage_858D978[] = INCBIN_U8("graphics/unknown/858E588/0.4bpp");
+static const u8 gSpriteImage_858D9F8[] = INCBIN_U8("graphics/unknown/858E588/1.4bpp");
+static const u8 gSpriteImage_858DA78[] = INCBIN_U8("graphics/unknown/858E588/2.4bpp");
+static const u8 gSpriteImage_858DAF8[] = INCBIN_U8("graphics/unknown/858E588/3.4bpp");
+static const u8 gSpriteImage_858DB78[] = INCBIN_U8("graphics/unknown/858E588/4.4bpp");
+
+static const u8 gUnusedEmptySpace_858DBF8[32] = {0};
+
+static const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_07.gbapal");
+static const u8 gSpriteImage_858DC38[] = INCBIN_U8("graphics/unknown/858E5D8/0.4bpp");
+static const u8 gSpriteImage_858DCB8[] = INCBIN_U8("graphics/unknown/858E5D8/1.4bpp");
+static const u8 gSpriteImage_858DD38[] = INCBIN_U8("graphics/unknown/858E5D8/2.4bpp");
+static const u8 gSpriteImage_858DDB8[] = INCBIN_U8("graphics/unknown/858E5D8/3.4bpp");
+static const u8 gSpriteImage_858DE38[] = INCBIN_U8("graphics/unknown/858E5D8/4.4bpp");
+static const u8 gSpriteImage_858DEB8[] = INCBIN_U8("graphics/unknown/858E5B0/0.4bpp");
+static const u8 gSpriteImage_858DF38[] = INCBIN_U8("graphics/unknown/858E5B0/1.4bpp");
+static const u8 gSpriteImage_858DFB8[] = INCBIN_U8("graphics/unknown/858E5B0/2.4bpp");
+static const u8 gSpriteImage_858E038[] = INCBIN_U8("graphics/unknown/858E5B0/3.4bpp");
+static const u8 gSpriteImage_858E0B8[] = INCBIN_U8("graphics/unknown/858E5B0/4.4bpp");
+static const u8 gSpriteImage_858E138[] = INCBIN_U8("graphics/unknown/858E5B0/5.4bpp");
+static const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_08.gbapal");
+static const u8 gSpriteImage_858E1D8[] = INCBIN_U8("graphics/unknown/858E674/0.4bpp");
+static const u8 gSpriteImage_858E2D8[] = INCBIN_U8("graphics/unknown/858E674/1.4bpp");
+static const u8 gSpriteImage_858E3D8[] = INCBIN_U8("graphics/unknown/858E674/2.4bpp");
+
+static const struct OamData gOamData_858E4D8 =
{
.y = 0,
.x = 0,
@@ -95,7 +98,7 @@ const struct OamData gOamData_858E4D8 =
.priority = 2,
};
-const union AnimCmd gSpriteAnim_858E4E0[] =
+static const union AnimCmd gSpriteAnim_858E4E0[] =
{
ANIMCMD_FRAME(0, 8),
ANIMCMD_FRAME(1, 8),
@@ -105,7 +108,7 @@ const union AnimCmd gSpriteAnim_858E4E0[] =
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_858E4F8[] =
+static const union AnimCmd gSpriteAnim_858E4F8[] =
{
ANIMCMD_FRAME(0, 8),
ANIMCMD_FRAME(1, 8),
@@ -115,7 +118,7 @@ const union AnimCmd gSpriteAnim_858E4F8[] =
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_858E510[] =
+static const union AnimCmd gSpriteAnim_858E510[] =
{
ANIMCMD_FRAME(4, 8),
ANIMCMD_FRAME(3, 8),
@@ -125,7 +128,7 @@ const union AnimCmd gSpriteAnim_858E510[] =
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_858E528[] =
+static const union AnimCmd gSpriteAnim_858E528[] =
{
ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
ANIMCMD_FRAME(1, 8, .hFlip = TRUE),
@@ -135,7 +138,7 @@ const union AnimCmd gSpriteAnim_858E528[] =
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_858E540[] =
+static const union AnimCmd gSpriteAnim_858E540[] =
{
ANIMCMD_FRAME(4, 8, .hFlip = TRUE),
ANIMCMD_FRAME(3, 8, .hFlip = TRUE),
@@ -145,7 +148,7 @@ const union AnimCmd gSpriteAnim_858E540[] =
ANIMCMD_END,
};
-const union AnimCmd gSpriteAnim_858E558[] =
+static const union AnimCmd gSpriteAnim_858E558[] =
{
ANIMCMD_FRAME(0, 8),
ANIMCMD_FRAME(1, 8),
@@ -155,12 +158,12 @@ const union AnimCmd gSpriteAnim_858E558[] =
ANIMCMD_END,
};
-const union AnimCmd *const gSpriteAnimTable_858E570[] =
+static const union AnimCmd *const gSpriteAnimTable_858E570[] =
{
gSpriteAnim_858E4E0,
};
-const union AnimCmd *const gSpriteAnimTable_858E574[] =
+static const union AnimCmd *const gSpriteAnimTable_858E574[] =
{
gSpriteAnim_858E4F8,
gSpriteAnim_858E510,
@@ -168,12 +171,12 @@ const union AnimCmd *const gSpriteAnimTable_858E574[] =
gSpriteAnim_858E540,
};
-const union AnimCmd *const gSpriteAnimTable_858E584[] =
+static const union AnimCmd *const gSpriteAnimTable_858E584[] =
{
gSpriteAnim_858E558,
};
-const struct SpriteFrameImage gUnknown_858E588[] =
+static const struct SpriteFrameImage gUnknown_858E588[] =
{
{gSpriteImage_858D978, 0x80},
{gSpriteImage_858D9F8, 0x80},
@@ -182,7 +185,7 @@ const struct SpriteFrameImage gUnknown_858E588[] =
{gSpriteImage_858DB78, 0x80},
};
-const struct SpriteFrameImage gUnknown_858E5B0[] =
+static const struct SpriteFrameImage gUnknown_858E5B0[] =
{
{gSpriteImage_858DEB8, 0x80},
{gSpriteImage_858DF38, 0x80},
@@ -191,7 +194,7 @@ const struct SpriteFrameImage gUnknown_858E5B0[] =
{gSpriteImage_858E0B8, 0x80},
};
-const struct SpriteFrameImage gUnknown_858E5D8[] =
+static const struct SpriteFrameImage gUnknown_858E5D8[] =
{
{gSpriteImage_858DC38, 0x80},
{gSpriteImage_858DCB8, 0x80},
@@ -200,7 +203,7 @@ const struct SpriteFrameImage gUnknown_858E5D8[] =
{gSpriteImage_858DE38, 0x80},
};
-const struct SpriteTemplate gUnknown_0858E600 =
+static const struct SpriteTemplate gUnknown_0858E600 =
{
.tileTag = 0xFFFF,
.paletteTag = 0x1003,
@@ -211,7 +214,7 @@ const struct SpriteTemplate gUnknown_0858E600 =
.callback = CaveEntranceSpriteCallback1,
};
-const struct SpriteTemplate gUnknown_0858E618 =
+static const struct SpriteTemplate gUnknown_0858E618 =
{
.tileTag = 0xFFFF,
.paletteTag = 0x1008,
@@ -222,7 +225,7 @@ const struct SpriteTemplate gUnknown_0858E618 =
.callback = TreeEntranceSpriteCallback1,
};
-const struct SpriteTemplate gUnknown_0858E630 =
+static const struct SpriteTemplate gUnknown_0858E630 =
{
.tileTag = 0xFFFF,
.paletteTag = 0x1008,
@@ -236,7 +239,7 @@ const struct SpriteTemplate gUnknown_0858E630 =
const struct SpritePalette gFieldEffectObjectPaletteInfo7 = {gFieldEffectObjectPalette7, 0x1003};
const struct SpritePalette gFieldEffectObjectPaletteInfo8 = {gFieldEffectObjectPalette8, 0x1008};
-const struct OamData gOamData_858E658 =
+static const struct OamData gOamData_858E658 =
{
.x = 0,
.y = 0,
@@ -248,7 +251,7 @@ const struct OamData gOamData_858E658 =
.priority = 2,
};
-const union AnimCmd gSpriteAnim_858E660[] =
+static const union AnimCmd gSpriteAnim_858E660[] =
{
ANIMCMD_FRAME(0, 6),
ANIMCMD_FRAME(1, 6),
@@ -256,19 +259,19 @@ const union AnimCmd gSpriteAnim_858E660[] =
ANIMCMD_END,
};
-const union AnimCmd *const gSpriteAnimTable_858E670[] =
+static const union AnimCmd *const gSpriteAnimTable_858E670[] =
{
gSpriteAnim_858E660,
};
-const struct SpriteFrameImage gUnknown_0858E674[] =
+static const struct SpriteFrameImage gUnknown_0858E674[] =
{
{gSpriteImage_858E1D8, 0x100},
{gSpriteImage_858E2D8, 0x100},
{gSpriteImage_858E3D8, 0x100},
};
-const struct SpriteTemplate gUnknown_0858E68C =
+static const struct SpriteTemplate gUnknown_0858E68C =
{
.tileTag = 0xFFFF,
.paletteTag = 0x100E,
@@ -340,7 +343,7 @@ bool8 sub_80F9C30(void)
return FuncIsActiveTask(sub_80F9DFC);
}
-void sub_80F9C44(void (*taskfunc) (u8), u16 a1, u16 a2, u8 a3)
+static void sub_80F9C44(void (*taskfunc) (u8), u16 a1, u16 a2, u8 a3)
{
u8 taskId = CreateTask(taskfunc, a3);
@@ -350,12 +353,11 @@ void sub_80F9C44(void (*taskfunc) (u8), u16 a1, u16 a2, u8 a3)
gTasks[taskId].func(taskId);
}
-#ifdef NONMATCHING
-void sub_80F9C90(u8 taskId)
+static void sub_80F9C90(u8 taskId)
{
struct Task *task = &gTasks[taskId];
- switch(task->data[0])
+ switch (task->data[0])
{
case 0:
task->data[3] = 0x78;
@@ -365,7 +367,7 @@ void sub_80F9C90(u8 taskId)
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[4]));
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[5], task->data[6]));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6]));
SetGpuReg(REG_OFFSET_WININ, 0x3F);
SetGpuReg(REG_OFFSET_WINOUT, 0);
@@ -374,7 +376,7 @@ void sub_80F9C90(u8 taskId)
task->data[7] = GetGpuReg(REG_OFFSET_BLDCNT);
task->data[8] = GetGpuReg(REG_OFFSET_BLDY);
- SetGpuReg(REG_OFFSET_BLDCNT, 0xBF);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN);
SetGpuReg(REG_OFFSET_BLDY, 0x10);
break;
@@ -400,7 +402,7 @@ void sub_80F9C90(u8 taskId)
task->data[5] -= task->data[2];
task->data[6] += task->data[2];
- if (task->data[5] < 1 || task->data[2] > 0x9F)
+ if (task->data[5] < 1 || task->data[6] > 0x9F)
{
task->data[5] = 0;
task->data[6] = 0xA0;
@@ -416,189 +418,10 @@ void sub_80F9C90(u8 taskId)
DestroyTask(taskId);
return;
}
- task->data[0] += 1;
+ task->data[0]++;
}
-#else
-NAKED
-void sub_80F9C90(u8 taskId)
-{
- asm_unified("\tpush {r4,r5,lr}\n"
- "\tlsls r0, 24\n"
- "\tlsrs r5, r0, 24\n"
- "\tlsls r0, r5, 2\n"
- "\tadds r0, r5\n"
- "\tlsls r0, 3\n"
- "\tldr r1, =gTasks\n"
- "\tadds r4, r0, r1\n"
- "\tmovs r1, 0x8\n"
- "\tldrsh r0, [r4, r1]\n"
- "\tcmp r0, 0x1\n"
- "\tbeq _080F9D10\n"
- "\tcmp r0, 0x1\n"
- "\tbgt _080F9CB8\n"
- "\tcmp r0, 0\n"
- "\tbeq _080F9CC2\n"
- "\tb _080F9DDE\n"
- "\t.pool\n"
- "_080F9CB8:\n"
- "\tcmp r0, 0x2\n"
- "\tbeq _080F9D32\n"
- "\tcmp r0, 0x3\n"
- "\tbeq _080F9D94\n"
- "\tb _080F9DDE\n"
- "_080F9CC2:\n"
- "\tmovs r0, 0x78\n"
- "\tstrh r0, [r4, 0xE]\n"
- "\tstrh r0, [r4, 0x10]\n"
- "\tmovs r0, 0x50\n"
- "\tstrh r0, [r4, 0x12]\n"
- "\tmovs r0, 0x51\n"
- "\tstrh r0, [r4, 0x14]\n"
- "\tmovs r1, 0x80\n"
- "\tlsls r1, 6\n"
- "\tmovs r0, 0\n"
- "\tbl SetGpuRegBits\n"
- "\tldrh r1, [r4, 0xE]\n"
- "\tlsls r1, 8\n"
- "\tldrh r0, [r4, 0x10]\n"
- "\torrs r1, r0\n"
- "\tlsls r1, 16\n"
- "\tlsrs r1, 16\n"
- "\tmovs r0, 0x40\n"
- "\tbl SetGpuReg\n"
- "\tldrh r1, [r4, 0x12]\n"
- "\tlsls r1, 8\n"
- "\tldrh r0, [r4, 0x14]\n"
- "\torrs r1, r0\n"
- "\tlsls r1, 16\n"
- "\tlsrs r1, 16\n"
- "\tmovs r0, 0x44\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x48\n"
- "\tmovs r1, 0x3F\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x4A\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tb _080F9DEE\n"
- "_080F9D10:\n"
- "\tmovs r0, 0x50\n"
- "\tbl GetGpuReg\n"
- "\tstrh r0, [r4, 0x16]\n"
- "\tmovs r0, 0x54\n"
- "\tbl GetGpuReg\n"
- "\tstrh r0, [r4, 0x18]\n"
- "\tmovs r0, 0x50\n"
- "\tmovs r1, 0xBF\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x54\n"
- "\tmovs r1, 0x10\n"
- "\tbl SetGpuReg\n"
- "\tb _080F9DEE\n"
- "_080F9D32:\n"
- "\tldrh r0, [r4, 0xE]\n"
- "\tldrh r1, [r4, 0xA]\n"
- "\tsubs r0, r1\n"
- "\tmovs r5, 0\n"
- "\tstrh r0, [r4, 0xE]\n"
- "\tldrh r2, [r4, 0x10]\n"
- "\tadds r1, r2\n"
- "\tstrh r1, [r4, 0x10]\n"
- "\tlsls r0, 16\n"
- "\tcmp r0, 0\n"
- "\tble _080F9D50\n"
- "\tlsls r0, r1, 16\n"
- "\tasrs r0, 16\n"
- "\tcmp r0, 0xEF\n"
- "\tble _080F9D76\n"
- "_080F9D50:\n"
- "\tstrh r5, [r4, 0xE]\n"
- "\tmovs r0, 0xF0\n"
- "\tstrh r0, [r4, 0x10]\n"
- "\tmovs r0, 0x54\n"
- "\tmovs r1, 0\n"
- "\tbl SetGpuReg\n"
- "\tldrh r1, [r4, 0x16]\n"
- "\tmovs r0, 0x50\n"
- "\tbl SetGpuReg\n"
- "\tmovs r0, 0x1\n"
- "\tnegs r0, r0\n"
- "\tmovs r1, 0\n"
- "\tmovs r2, 0\n"
- "\tbl BlendPalettes\n"
- "\tldr r0, =gPlttBufferFaded\n"
- "\tstrh r5, [r0]\n"
- "_080F9D76:\n"
- "\tldrh r1, [r4, 0xE]\n"
- "\tlsls r1, 8\n"
- "\tldrh r0, [r4, 0x10]\n"
- "\torrs r1, r0\n"
- "\tlsls r1, 16\n"
- "\tlsrs r1, 16\n"
- "\tmovs r0, 0x40\n"
- "\tbl SetGpuReg\n"
- "\tmovs r1, 0xE\n"
- "\tldrsh r0, [r4, r1]\n"
- "\tb _080F9DD8\n"
- "\t.pool\n"
- "_080F9D94:\n"
- "\tldrh r0, [r4, 0x12]\n"
- "\tldrh r1, [r4, 0xC]\n"
- "\tsubs r0, r1\n"
- "\tstrh r0, [r4, 0x12]\n"
- "\tldrh r2, [r4, 0x14]\n"
- "\tadds r1, r2\n"
- "\tstrh r1, [r4, 0x14]\n"
- "\tlsls r0, 16\n"
- "\tcmp r0, 0\n"
- "\tble _080F9DB0\n"
- "\tlsls r0, r1, 16\n"
- "\tasrs r0, 16\n"
- "\tcmp r0, 0x9F\n"
- "\tble _080F9DC2\n"
- "_080F9DB0:\n"
- "\tmovs r0, 0\n"
- "\tstrh r0, [r4, 0x12]\n"
- "\tmovs r0, 0xA0\n"
- "\tstrh r0, [r4, 0x14]\n"
- "\tmovs r1, 0x80\n"
- "\tlsls r1, 6\n"
- "\tmovs r0, 0\n"
- "\tbl ClearGpuRegBits\n"
- "_080F9DC2:\n"
- "\tldrh r1, [r4, 0x12]\n"
- "\tlsls r1, 8\n"
- "\tldrh r0, [r4, 0x14]\n"
- "\torrs r1, r0\n"
- "\tlsls r1, 16\n"
- "\tlsrs r1, 16\n"
- "\tmovs r0, 0x44\n"
- "\tbl SetGpuReg\n"
- "\tmovs r1, 0x12\n"
- "\tldrsh r0, [r4, r1]\n"
- "_080F9DD8:\n"
- "\tcmp r0, 0\n"
- "\tbne _080F9DF4\n"
- "\tb _080F9DEE\n"
- "_080F9DDE:\n"
- "\tldrh r1, [r4, 0x16]\n"
- "\tmovs r0, 0x50\n"
- "\tbl SetGpuReg\n"
- "\tadds r0, r5, 0\n"
- "\tbl DestroyTask\n"
- "\tb _080F9DF4\n"
- "_080F9DEE:\n"
- "\tldrh r0, [r4, 0x8]\n"
- "\tadds r0, 0x1\n"
- "\tstrh r0, [r4, 0x8]\n"
- "_080F9DF4:\n"
- "\tpop {r4,r5}\n"
- "\tpop {r0}\n"
- "\tbx r0");
-}
-#endif
-void sub_80F9DFC(u8 taskId)
+static void sub_80F9DFC(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -629,7 +452,7 @@ void sub_80F9DFC(u8 taskId)
{
task->data[5] = 0x50;
task->data[6] = 0x51;
- SetGpuReg(REG_OFFSET_BLDCNT, 0xBF);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN);
SetGpuReg(REG_OFFSET_BLDY, 0x10);
}
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[6]));
@@ -660,16 +483,16 @@ void sub_80F9DFC(u8 taskId)
DestroyTask(taskId);
return;
}
- task->data[0] += 1;
+ task->data[0]++;
}
-void SetCurrentSecretBase(void)
+static void SetCurrentSecretBase(void)
{
sub_80E9608(&gPlayerFacingPosition, gMapHeader.events);
sub_80E8B6C();
}
-void AdjustSecretPowerSpritePixelOffsets(void)
+static void AdjustSecretPowerSpritePixelOffsets(void)
{
if (gPlayerAvatar.flags & 0x6)
{
@@ -756,7 +579,7 @@ bool8 SetUpFieldMove_SecretPower(void)
return FALSE;
}
-void FieldCallback_SecretBaseCave(void)
+static void FieldCallback_SecretBaseCave(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
ScriptContext1_SetupScript(EventScript_275A86);
@@ -818,7 +641,7 @@ static void CaveEntranceSpriteCallbackEnd(struct Sprite *sprite)
EnableBothScriptContexts();
}
-void FieldCallback_SecretBaseTree(void)
+static void FieldCallback_SecretBaseTree(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
ScriptContext1_SetupScript(EventScript_275ADF);
@@ -892,7 +715,7 @@ static void TreeEntranceSpriteCallbackEnd(struct Sprite *sprite)
EnableBothScriptContexts();
}
-void FieldCallback_SecretBaseShrub(void)
+static void FieldCallback_SecretBaseShrub(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
ScriptContext1_SetupScript(EventScript_275B38);
@@ -956,7 +779,7 @@ static void ShrubEntranceSpriteCallbackEnd(struct Sprite *sprite)
EnableBothScriptContexts();
}
-u32 FldEff_SecretBasePCTurnOn(void)
+bool8 FldEff_SecretBasePCTurnOn(void)
{
s16 x, y;
u8 taskId;
@@ -968,10 +791,10 @@ u32 FldEff_SecretBasePCTurnOn(void)
gTasks[taskId].data[1] = y;
gTasks[taskId].data[2] = 0;
- return 0;
+ return FALSE;
}
-void Task_SecretBasePCTurnOn(u8 taskId)
+static void Task_SecretBasePCTurnOn(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -1025,7 +848,7 @@ void PopSecretBaseBalloon(s16 metatileId, s16 x, s16 y)
gTasks[taskId].data[4] = 1;
}
-void Task_PopSecretBaseBalloon(u8 taskId)
+static void Task_PopSecretBaseBalloon(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -1049,7 +872,7 @@ void Task_PopSecretBaseBalloon(u8 taskId)
}
}
-void DoBalloonSoundEffect(s16 metatileId)
+static void DoBalloonSoundEffect(s16 metatileId)
{
switch (metatileId)
{
@@ -1078,7 +901,7 @@ bool8 FldEff_NopA700(void)
return FALSE;
}
-void DoSecretBaseBreakableDoorEffect(s16 x, s16 y)
+static void DoSecretBaseBreakableDoorEffect(s16 x, s16 y)
{
PlaySE(SE_TOY_KABE);
MapGridSetMetatileIdAt(x, y, 630);
@@ -1087,7 +910,7 @@ void DoSecretBaseBreakableDoorEffect(s16 x, s16 y)
CurrentMapDrawMetatileAt(x, y - 1);
}
-void Task_ShatterSecretBaseBreakableDoor(u8 taskId)
+static void Task_ShatterSecretBaseBreakableDoor(u8 taskId)
{
if (gTasks[taskId].data[0] == 7)
{
@@ -1118,7 +941,7 @@ void ShatterSecretBaseBreakableDoor(s16 x, s16 y)
}
#define tMetatileID data[0]
-void Task_SecretBaseMusicNoteMatSound(u8 taskId)
+static void Task_SecretBaseMusicNoteMatSound(u8 taskId)
{
if (gTasks[taskId].data[1] == 7)
{
@@ -1167,7 +990,7 @@ void PlaySecretBaseMusicNoteMatSound(s16 metatileId)
}
#undef tMetatileID
-void SpriteCB_GlitterMatSparkle(struct Sprite *sprite)
+static void SpriteCB_GlitterMatSparkle(struct Sprite *sprite)
{
sprite->data[0]++;
@@ -1222,30 +1045,30 @@ bool8 FldEff_SandPillar(void)
gSprites[gPlayerAvatar.spriteId].oam.x + 8,
gSprites[gPlayerAvatar.spriteId].oam.y,
148);
-
+
break;
-
+
case DIR_WEST:
CreateSprite(&gUnknown_0858E68C,
gSprites[gPlayerAvatar.spriteId].oam.x - 8,
gSprites[gPlayerAvatar.spriteId].oam.y + 16,
148);
-
+
break;
-
+
case DIR_EAST:
CreateSprite(&gUnknown_0858E68C,
gSprites[gPlayerAvatar.spriteId].oam.x + 24,
gSprites[gPlayerAvatar.spriteId].oam.y + 16,
148);
-
+
break;
}
return FALSE;
}
-void SpriteCB_SandPillar_0(struct Sprite *sprite)
+static void SpriteCB_SandPillar_0(struct Sprite *sprite)
{
PlaySE(SE_W088);
@@ -1253,16 +1076,16 @@ void SpriteCB_SandPillar_0(struct Sprite *sprite)
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 3586);
else
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 644);
-
+
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 522);
CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1);
CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
-
+
sprite->data[0] = 0;
sprite->callback = SpriteCB_SandPillar_1;
}
-void SpriteCB_SandPillar_1(struct Sprite *sprite)
+static void SpriteCB_SandPillar_1(struct Sprite *sprite)
{
if (sprite->data[0] < 18)
{
@@ -1277,7 +1100,7 @@ void SpriteCB_SandPillar_1(struct Sprite *sprite)
}
}
-void SpriteCB_SandPillar_2(struct Sprite *sprite)
+static void SpriteCB_SandPillar_2(struct Sprite *sprite)
{
FieldEffectStop(sprite, FLDEFF_SAND_PILLAR);
EnableBothScriptContexts();
@@ -1343,71 +1166,30 @@ void GetShieldToyTVDecorationInfo(void)
}
}
-#ifdef NONMATCHING
-bool8 sub_80FADE4(u16 arg0, u8 arg1)
+bool8 sub_80FADE4(u16 metatileId, u8 arg1)
{
- if (CurrentMapIsSecretBase())
+ if (!CurrentMapIsSecretBase())
+ return FALSE;
+
+ if (!arg1)
{
- if (arg1 == 0)
- {
- if ((u16)(arg0 + 0xfffffd7b) <= 1 || (arg0 == 0x237))
- return TRUE;
- }
- else
- {
- if (arg0 == 0x28d || arg0 == 0x23f)
- return TRUE;
- }
+ if (metatileId == 0x285 || metatileId == 0x286)
+ return TRUE;
+ if (metatileId == 0x237)
+ return TRUE;
+ }
+ else
+ {
+ if (metatileId == 0x28d)
+ return TRUE;
+ if (metatileId == 0x23F)
+ return TRUE;
}
+
return FALSE;
}
-#else
-NAKED
-bool8 sub_80FADE4(u16 arg0, u8 arg1)
-{
- asm_unified("\tpush {r4-r6,lr}\n"
- "\tlsls r0, 16\n"
- "\tlsrs r4, r0, 16\n"
- "\tadds r6, r4, 0\n"
- "\tlsls r1, 24\n"
- "\tlsrs r5, r1, 24\n"
- "\tbl CurrentMapIsSecretBase\n"
- "\tlsls r0, 24\n"
- "\tcmp r0, 0\n"
- "\tbeq _080FAE28\n"
- "\tcmp r5, 0\n"
- "\tbne _080FAE1C\n"
- "\tldr r1, =0xfffffd7b\n"
- "\tadds r0, r4, r1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tcmp r0, 0x1\n"
- "\tbls _080FAE10\n"
- "\tldr r0, =0x00000237\n"
- "\tcmp r4, r0\n"
- "\tbne _080FAE28\n"
- "_080FAE10:\n"
- "\tmovs r0, 0x1\n"
- "\tb _080FAE2A\n"
- "\t.pool\n"
- "_080FAE1C:\n"
- "\tldr r0, =0x0000028d\n"
- "\tcmp r4, r0\n"
- "\tbeq _080FAE10\n"
- "\tldr r0, =0x0000023f\n"
- "\tcmp r6, r0\n"
- "\tbeq _080FAE10\n"
- "_080FAE28:\n"
- "\tmovs r0, 0\n"
- "_080FAE2A:\n"
- "\tpop {r4-r6}\n"
- "\tpop {r1}\n"
- "\tbx r1\n"
- "\t.pool");
-}
-#endif
-void Task_FieldPoisonEffect(u8 taskId)
+static void Task_FieldPoisonEffect(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -1441,15 +1223,15 @@ bool32 FldEffPoison_IsActive(void)
return FuncIsActiveTask(Task_FieldPoisonEffect);
}
-void Task_WateringBerryTreeAnim_0(u8 taskId)
+static void Task_WateringBerryTreeAnim_0(u8 taskId)
{
gTasks[taskId].func = Task_WateringBerryTreeAnim_1;
}
-void Task_WateringBerryTreeAnim_1(u8 taskId)
+static void Task_WateringBerryTreeAnim_1(u8 taskId)
{
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
-
+
if (!EventObjectIsMovementOverridden(playerEventObj)
|| EventObjectClearHeldMovementIfFinished(playerEventObj))
{
@@ -1459,23 +1241,23 @@ void Task_WateringBerryTreeAnim_1(u8 taskId)
}
}
-void Task_WateringBerryTreeAnim_2(u8 taskId)
+static void Task_WateringBerryTreeAnim_2(u8 taskId)
{
struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId];
-
+
if (EventObjectClearHeldMovementIfFinished(playerEventObj))
{
s16 value = gTasks[taskId].data[1]++;
-
+
if (value < 10)
EventObjectSetHeldMovement(playerEventObj, GetWalkInPlaceNormalMovementAction(GetPlayerFacingDirection()));
-
+
else
gTasks[taskId].func = Task_WateringBerryTreeAnim_3;
}
}
-void Task_WateringBerryTreeAnim_3(u8 taskId)
+static void Task_WateringBerryTreeAnim_3(u8 taskId)
{
SetPlayerAvatarTransitionFlags(sub_808BCD0());
DestroyTask(taskId);
diff --git a/src/rom6.c b/src/fldeff_rocksmash.c
index 8043730d2..9181b5532 100644
--- a/src/rom6.c
+++ b/src/fldeff_rocksmash.c
@@ -5,10 +5,10 @@
#include "event_scripts.h"
#include "field_effect.h"
#include "field_player_avatar.h"
+#include "fldeff.h"
#include "item_use.h"
#include "overworld.h"
#include "party_menu.h"
-#include "rom6.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
@@ -26,8 +26,6 @@ static void sub_813552C(u8 taskId);
static void sub_813561C(u8 taskId);
static void sub_81356C4(void);
static void sub_8135714(void);
-static void hm2_dig(void);
-static void sub_8135780(void);
// extern RAM loc
extern struct MapPosition gPlayerFacingPosition;
@@ -162,51 +160,3 @@ static void sub_8135714(void)
FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);
EnableBothScriptContexts();
}
-
-bool8 SetUpFieldMove_Dig(void)
-{
- if (CanUseEscapeRopeOnCurrMap() == TRUE)
- {
- gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
- gPostMenuFieldCallback = hm2_dig;
- return TRUE;
- }
- else
- {
- return FALSE;
- }
-}
-
-static void hm2_dig(void)
-{
- Overworld_ResetStateAfterDigEscRope();
- FieldEffectStart(FLDEFF_USE_DIG);
- gFieldEffectArguments[0] = GetCursorSelectionMonId();
-}
-
-bool8 FldEff_UseDig(void)
-{
- u8 taskId = oei_task_add();
-
- gTasks[taskId].data[8] = (u32)sub_8135780 >> 16;
- gTasks[taskId].data[9] = (u32)sub_8135780;
- if (!ShouldDoBrailleDigEffect())
- SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
- return FALSE;
-}
-
-static void sub_8135780(void)
-{
- u8 taskId;
-
- FieldEffectActiveListRemove(FLDEFF_USE_DIG);
- if (ShouldDoBrailleDigEffect())
- {
- DoBrailleDigEffect();
- }
- else
- {
- taskId = CreateTask(task08_080A1C44, 8);
- gTasks[taskId].data[0] = 0;
- }
-}
diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c
index f796ecea6..c57ab8cdc 100644
--- a/src/fldeff_strength.c
+++ b/src/fldeff_strength.c
@@ -2,8 +2,8 @@
#include "event_data.h"
#include "event_scripts.h"
#include "field_effect.h"
+#include "fldeff.h"
#include "party_menu.h"
-#include "rom6.h"
#include "script.h"
#include "string_util.h"
#include "task.h"
diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c
index cd8fa400d..a187353ff 100644
--- a/src/fldeff_sweetscent.c
+++ b/src/fldeff_sweetscent.c
@@ -5,9 +5,10 @@
#include "field_player_avatar.h"
#include "field_screen_effect.h"
#include "field_weather.h"
+#include "fldeff.h"
+#include "mirage_tower.h"
#include "palette.h"
#include "party_menu.h"
-#include "rom6.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
@@ -21,8 +22,6 @@ static void FieldCallback_SweetScent(void);
static void StartSweetScentFieldEffect(void);
static void TrySweetScentEncounter(u8 taskId);
static void FailSweetScentEncounter(u8 taskId);
-void sub_81BE6B8(void);
-void sub_81BE72C(void);
bool8 SetUpFieldMove_SweetScent(void)
{
@@ -65,7 +64,7 @@ static void TrySweetScentEncounter(u8 taskId)
{
if (!gPaletteFade.active)
{
- sub_81BE72C();
+ ClearMirageTowerPulseBlendEffect();
BlendPalettes(0x00000040, 8, RGB_RED);
if (gTasks[taskId].data[0] == 64)
{
@@ -78,7 +77,7 @@ static void TrySweetScentEncounter(u8 taskId)
{
gTasks[taskId].func = FailSweetScentEncounter;
BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB_RED);
- sub_81BE6B8();
+ TryStartMirageTowerPulseBlendEffect();
}
}
else
diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c
index 8562908bd..cbf8ee6cc 100644
--- a/src/fldeff_teleport.c
+++ b/src/fldeff_teleport.c
@@ -1,9 +1,9 @@
#include "global.h"
#include "field_effect.h"
#include "field_player_avatar.h"
+#include "fldeff.h"
#include "party_menu.h"
#include "overworld.h"
-#include "rom6.h"
#include "task.h"
#include "constants/field_effects.h"
diff --git a/src/fossil_specials.c b/src/fossil_specials.c
deleted file mode 100644
index dfdb999a9..000000000
--- a/src/fossil_specials.c
+++ /dev/null
@@ -1,561 +0,0 @@
-#include "global.h"
-#include "constants/flags.h"
-#include "constants/songs.h"
-#include "bg.h"
-#include "event_data.h"
-#include "field_camera.h"
-#include "event_object_movement.h"
-#include "fieldmap.h"
-#include "global.fieldmap.h"
-#include "gpu_regs.h"
-#include "alloc.h"
-#include "menu.h"
-#include "random.h"
-#include "script.h"
-#include "sound.h"
-#include "sprite.h"
-#include "task.h"
-#include "window.h"
-
-#define MIRAGE_TOWER_GFX_LENGTH (32 + sizeof(gMirageTower_Gfx))
-#define MIRAGE_TOWER_PALETTE_LENGTH 0x800
-#define ROOT_FOSSIL_GFX_LENGTH sizeof(gRootFossil_Gfx)
-#define ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH 0x100
-
-struct Struct8617DA4
-{
- u8 x;
- u8 y;
- u16 tileId;
-};
-
-struct Struct203CF10
-{
- u8 *buffer;
- u8 currIndex;
-};
-
-struct DynamicSpriteFrameImage
-{
- u8 *data;
- u16 size;
-};
-
-struct Struct203CF0C
-{
- u8 *frameImageTiles;
- struct DynamicSpriteFrameImage *frameImage;
- u8 spriteId;
- u16 *unkC;
- u16 unk10;
-};
-
-// static functions
-static void sub_81BED50(u8 taskId);
-static void sub_81BEBF4(u8 taskId);
-static void sub_81BF028(u8 taskId);
-static void sub_81BF248(struct Sprite *);
-static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e);
-
-// .rodata
-static const u8 gUnknown_08617274[32] = {0};
-static const u8 gMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp");
-static const u16 gUnknown_08617B94[] = INCBIN_U16("graphics/misc/mirage_tower.bin");
-static const u16 gRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal");
-static const u8 gRootFossil_Gfx[] = INCBIN_U8("graphics/misc/fossil.4bpp");
-static const u8 gMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower_crumbles.4bpp");
-static const u16 gMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal");
-
-const s16 gUnknown_08617D64[][3] =
-{
- { 0, 10, 65},
- { 17, 3, 50},
- {-12, 0, 75},
- { 10, 15, 90},
- { 7, 8, 65},
- {-18, 5, 75},
- { 22, -10, 55},
- {-24, -4, 65},
-};
-
-const struct SpriteSheet gUnknown_08617D94[] =
-{
- {gMirageTowerCrumbles_Gfx, 0x0080, 0x0fa0},
- {NULL}
-};
-
-static const struct Struct8617DA4 gUnknown_08617DA4[] =
-{
- {0x12, 0x35, 0x251},
- {0x13, 0x35, 0x251},
- {0x14, 0x35, 0x251},
- {0x12, 0x36, 0x251},
- {0x13, 0x36, 0x251},
- {0x14, 0x36, 0x251},
- {0x12, 0x37, 0x251},
- {0x13, 0x37, 0x251},
- {0x14, 0x37, 0x251},
- {0x12, 0x38, 0x251},
- {0x13, 0x38, 0x251},
- {0x14, 0x38, 0x251},
- {0x12, 0x39, 0x259},
- {0x13, 0x39, 0x259},
- {0x14, 0x39, 0x259},
- {0x12, 0x3A, 0x121},
- {0x13, 0x3A, 0x121},
- {0x14, 0x3A, 0x121},
-};
-
-static const union AnimCmd gSpriteAnim_8617DEC[] =
-{
- ANIMCMD_FRAME(0, 1),
- ANIMCMD_END,
-};
-
-static const struct OamData gOamData_8617DF4 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 1,
- .tileNum = 0,
- .priority = 0,
- .paletteNum = 3,
- .affineParam = 0,
-};
-
-static const union AnimCmd *const gSpriteAnimTable_8617DFC[] =
-{
- gSpriteAnim_8617DEC,
-};
-
-static const struct SpriteTemplate gUnknown_08617E00 =
-{
- 0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
-};
-
-// EWRAM
-EWRAM_DATA static u8* sUnknown_0203CF04 = NULL;
-EWRAM_DATA static u8* sUnknown_0203CF08 = NULL;
-EWRAM_DATA static struct Struct203CF0C *sUnknown_0203CF0C = NULL;
-EWRAM_DATA static struct Struct203CF10 *sUnknown_0203CF10 = NULL;
-EWRAM_DATA static u16 *sUnknown_0203CF14 = NULL;
-
-// IWRAM bss
-IWRAM_DATA static u16 gUnknown_030012A8[8];
-
-// text
-void sub_81BEB24(void)
-{
- u8 i;
- for (i = 0; i < (sizeof(gUnknown_08617DA4)/sizeof(gUnknown_08617DA4[0])); i++)
- MapGridSetMetatileIdAt(gUnknown_08617DA4[i].x + 7, gUnknown_08617DA4[i].y + 7, gUnknown_08617DA4[i].tileId);
- DrawWholeMapView();
-}
-
-void sub_81BEB54(void)
-{
- CreateTask(sub_81BED50, 9);
-}
-
-void sub_81BEB68(void)
-{
- CreateTask(sub_81BEBF4, 9);
-}
-
-void sub_81BEB7C(void)
-{
- CreateTask(sub_81BF028, 9);
-}
-
-void sub_81BEB90(void)
-{
- SetGpuReg(REG_OFFSET_BG0HOFS, sUnknown_0203CF14[0]);
- SetGpuReg(REG_OFFSET_BG0VOFS, sUnknown_0203CF14[1]);
-}
-
-void sub_81BEBB4(u8 taskId)
-{
- if (!(gTasks[taskId].data[0]))
- {
- sUnknown_0203CF14[0] = -sUnknown_0203CF14[0];
- gTasks[taskId].data[0] = 2;
- sub_81BEB90();
- }
- else
- {
- gTasks[taskId].data[0]--;
- }
-}
-
-static void sub_81BEBF4(u8 taskId)
-{
- u8 zero;
-
- switch (gTasks[taskId].data[0])
- {
- case 0:
- FreeAllWindowBuffers();
- SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 2);
- gTasks[taskId].data[0]++;
- break;
- case 1:
- sUnknown_0203CF04 = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH);
- sUnknown_0203CF08 = (u8 *)AllocZeroed(MIRAGE_TOWER_PALETTE_LENGTH);
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- gTasks[taskId].data[0]++;
- break;
- case 2:
- CpuSet(gUnknown_08617274, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH / 2);
- LoadBgTiles(0, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0);
- gTasks[taskId].data[0]++;
- break;
- case 3:
- SetBgTilemapBuffer(0, sUnknown_0203CF08);
- CopyToBgTilemapBufferRect_ChangePalette(0, &gUnknown_08617B94, 12, 29, 6, 12, 17);
- CopyBgTilemapBufferToVram(0);
- gTasks[taskId].data[0]++;
- break;
- case 4:
- ShowBg(0);
- gTasks[taskId].data[0]++;
- break;
- case 5:
- sub_81BEB24();
- gTasks[taskId].data[0]++;
- break;
- case 6:
- sUnknown_0203CF14 = Alloc(4);
- zero = 0;
- sUnknown_0203CF14[0] = 2;
- sUnknown_0203CF14[1] = zero;
- CreateTask(sub_81BEBB4, 0xA);
- DestroyTask(taskId);
- EnableBothScriptContexts();
- break;
- }
-}
-
-#define OUTER_BUFFER_LENGTH 0x60
-#define INNER_BUFFER_LENGTH 0x30
-static void sub_81BED50(u8 taskId)
-{
- u8 anotherTaskId, j;
- u16 i;
- u8 index;
-
- switch (gTasks[taskId].data[0])
- {
- case 1:
- sUnknown_0203CF10 = AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10));
- break;
- case 3:
- if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
- {
- if (gTasks[taskId].data[1] > 1)
- {
- index = gTasks[taskId].data[3];
- sUnknown_0203CF10[index].buffer = Alloc(INNER_BUFFER_LENGTH);
- for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
- sUnknown_0203CF10[index].buffer[i] = i;
- for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
- {
- u16 rand1, rand2, temp;
-
- rand1 = Random() % 0x30;
- rand2 = Random() % 0x30;
- SWAP(sUnknown_0203CF10[index].buffer[rand2], sUnknown_0203CF10[index].buffer[rand1], temp);
- }
- if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
- gTasks[taskId].data[3]++;
- gTasks[taskId].data[1] = 0;
- }
- gTasks[taskId].data[1]++;
- }
- index = gTasks[taskId].data[3];
- for (i = (u8)(gTasks[taskId].data[2]); i < index; i++)
- {
- for (j = 0; j < 1; j++)
- {
- sub_81BF2B8(sUnknown_0203CF04,
- ((((OUTER_BUFFER_LENGTH - 1) - i) * INNER_BUFFER_LENGTH) + sUnknown_0203CF10[i].buffer[(sUnknown_0203CF10[i].currIndex)++]),
- 0, INNER_BUFFER_LENGTH, 1);
- }
- if (sUnknown_0203CF10[i].currIndex > (INNER_BUFFER_LENGTH - 1))
- {
- FREE_AND_SET_NULL(sUnknown_0203CF10[i].buffer);
- gTasks[taskId].data[2]++;
- if ((i % 2) == 1)
- sUnknown_0203CF14[1]--;
- }
- }
- LoadBgTiles(0, sUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0);
- if (sUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].currIndex > (INNER_BUFFER_LENGTH - 1))
- break;
- return;
- case 4:
- UnsetBgTilemapBuffer(0);
- anotherTaskId = FindTaskIdByFunc(sub_81BEBB4);
- if (anotherTaskId != 0xFF)
- DestroyTask(anotherTaskId);
- sUnknown_0203CF14[1] = sUnknown_0203CF14[0] = 0;
- sub_81BEB90();
- break;
- case 5:
- FREE_AND_SET_NULL(sUnknown_0203CF14);
- FREE_AND_SET_NULL(sUnknown_0203CF10);
- FREE_AND_SET_NULL(sUnknown_0203CF04);
- FREE_AND_SET_NULL(sUnknown_0203CF08);
- break;
- case 6:
- SetGpuRegBits(REG_OFFSET_BG2CNT, 0x2);
- SetGpuRegBits(REG_OFFSET_BG0CNT, 0x0);
- SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 0);
- sub_81971D0();
- break;
- case 7:
- ShowBg(0);
- break;
- case 8:
- DestroyTask(taskId);
- EnableBothScriptContexts();
- break;
- }
- gTasks[taskId].data[0]++;
-}
-
-static void sub_81BF028(u8 taskId)
-{
- u16 i;
- u8 *buffer;
-
- switch (gTasks[taskId].data[0])
- {
- case 1:
- sUnknown_0203CF0C = AllocZeroed(sizeof(*sUnknown_0203CF0C));
- sUnknown_0203CF0C->frameImageTiles = AllocZeroed(ROOT_FOSSIL_GFX_LENGTH);
- sUnknown_0203CF0C->frameImage = AllocZeroed(sizeof(*sUnknown_0203CF0C->frameImage));
- sUnknown_0203CF0C->unkC = AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16));
- sUnknown_0203CF0C->unk10 = 0;
- break;
- case 2:
- buffer = sUnknown_0203CF0C->frameImageTiles;
- for (i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++)
- *buffer = gRootFossil_Gfx[i];
- break;
- case 3:
- sUnknown_0203CF0C->frameImage->data = sUnknown_0203CF0C->frameImageTiles;
- sUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH;
- break;
- case 4:
- {
- struct SpriteTemplate fossilTemplate;
-
- fossilTemplate = gUnknown_08617E00;
- fossilTemplate.images = (struct SpriteFrameImage *)(sUnknown_0203CF0C->frameImage);
- sUnknown_0203CF0C->spriteId = CreateSprite(&fossilTemplate, 128, -16, 1);
- gSprites[sUnknown_0203CF0C->spriteId].centerToCornerVecX = 0;
- gSprites[sUnknown_0203CF0C->spriteId].data[0] = gSprites[sUnknown_0203CF0C->spriteId].pos1.x;
- gSprites[sUnknown_0203CF0C->spriteId].data[1] = 1;
- }
- case 5:
- for (i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++)
- sUnknown_0203CF0C->unkC[i] = i;
- break;
- case 6:
- for (i = 0; i < (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); i++)
- {
- u16 rand1, rand2, temp;
-
- rand1 = Random() % 0x100;
- rand2 = Random() % 0x100;
- SWAP(sUnknown_0203CF0C->unkC[rand2], sUnknown_0203CF0C->unkC[rand1], temp);
- }
- gSprites[sUnknown_0203CF0C->spriteId].callback = sub_81BF248;
- break;
- case 7:
- if (gSprites[sUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy)
- return;
- DestroySprite(&gSprites[sUnknown_0203CF0C->spriteId]);
- FREE_AND_SET_NULL(sUnknown_0203CF0C->unkC);;
- FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImage);
- FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImageTiles);
- FREE_AND_SET_NULL(sUnknown_0203CF0C);
- break;
- case 8:
- EnableBothScriptContexts();
- break;
- }
-
- gTasks[taskId].data[0]++;
-}
-
-static void sub_81BF248(struct Sprite *sprite)
-{
- if (sUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH))
- {
- sprite->callback = SpriteCallbackDummy;
- }
- else if (sprite->pos1.y >= 0x60)
- {
- u8 i;
- for (i = 0; i < 2; i++)
- {
- sub_81BF2B8(sUnknown_0203CF0C->frameImageTiles, sUnknown_0203CF0C->unkC[sUnknown_0203CF0C->unk10++], 0, 16, 0);
- }
- StartSpriteAnim(sprite, 0);
- }
- else
- {
- sprite->pos1.y++;
- }
-}
-
-#ifdef NONMATCHING
-static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e)
-{
- u8 r5, r4, r0, r2;
- u16 var;
-
- r4 = r5 = b / d;
- gUnknown_030012A8[0] = r4;
-
- r0 = r2 = b % d;
- gUnknown_030012A8[1] = r2;
-
- r4 &= 7;
- r2 &= 7;
- gUnknown_030012A8[2] = r4;
- gUnknown_030012A8[3] = r2;
-
- r0 /= 8;
- r5 /= 8;
- gUnknown_030012A8[4] = r0;
- gUnknown_030012A8[5] = r5;
-
- var = ((d / 8) * (r5 * 64)) + (r0 * 64);
- gUnknown_030012A8[6] = var;
-
- var += (r4 * 8) + r2;
- gUnknown_030012A8[7] = var;
-
- // This part is non-matching. 99% sure it IS functionally equivalent, though.
- b = (b & 1) ^ 1;
- c = (c << ((b) << 2)) | (15 << ((b ^ 1) << 2));
-
- a[(var / 2) + (e * 32)] &= c;
-}
-
-#else
-NAKED
-static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e)
-{
- asm_unified("\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x8\n\
- str r0, [sp]\n\
- mov r10, r1\n\
- adds r6, r2, 0\n\
- mov r8, r3\n\
- ldr r0, [sp, 0x28]\n\
- mov r9, r0\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- mov r10, r1\n\
- lsls r6, 24\n\
- lsrs r6, 24\n\
- mov r0, r8\n\
- lsls r0, 24\n\
- mov r8, r0\n\
- lsrs r7, r0, 24\n\
- mov r1, r9\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r9, r1\n\
- mov r0, r10\n\
- adds r1, r7, 0\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- lsls r5, 24\n\
- lsrs r4, r5, 24\n\
- ldr r3, =gUnknown_030012A8\n\
- strh r4, [r3]\n\
- mov r0, r10\n\
- adds r1, r7, 0\n\
- str r3, [sp, 0x4]\n\
- bl __modsi3\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- ldr r3, [sp, 0x4]\n\
- strh r2, [r3, 0x2]\n\
- movs r1, 0x7\n\
- ands r4, r1\n\
- ands r2, r1\n\
- strh r4, [r3, 0x4]\n\
- strh r2, [r3, 0x6]\n\
- lsrs r0, 27\n\
- lsrs r5, 27\n\
- strh r0, [r3, 0x8]\n\
- strh r5, [r3, 0xA]\n\
- mov r1, r8\n\
- lsrs r1, 27\n\
- lsls r1, 6\n\
- mov r8, r1\n\
- mov r1, r8\n\
- muls r1, r5\n\
- lsls r0, 6\n\
- adds r1, r0\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- strh r1, [r3, 0xC]\n\
- lsls r4, 3\n\
- adds r4, r2\n\
- adds r1, r4\n\
- lsls r4, r1, 16\n\
- lsrs r4, 17\n\
- strh r1, [r3, 0xE]\n\
- movs r1, 0x1\n\
- mov r0, r10\n\
- ands r1, r0\n\
- movs r2, 0x1\n\
- eors r1, r2\n\
- lsls r0, r1, 2\n\
- lsls r6, r0\n\
- eors r1, r2\n\
- lsls r1, 2\n\
- movs r0, 0xF\n\
- lsls r0, r1\n\
- orrs r6, r0\n\
- lsls r6, 24\n\
- lsrs r6, 24\n\
- mov r1, r9\n\
- lsls r1, 5\n\
- mov r9, r1\n\
- add r9, r4\n\
- ldr r1, [sp]\n\
- add r1, r9\n\
- ldrb r0, [r1]\n\
- ands r6, r0\n\
- strb r6, [r1]\n\
- add sp, 0x8\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- ");
-}
-#endif // NONMATCHING
diff --git a/src/frontier_util.c b/src/frontier_util.c
index 2fc58241a..40b1edbe3 100644
--- a/src/frontier_util.c
+++ b/src/frontier_util.c
@@ -2185,15 +2185,15 @@ static void sub_81A447C(void)
u16 monId = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1;
if (monId < PARTY_SIZE)
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
- for (k = 0; k < 4; k++)
+ for (k = 0; k < MAX_MON_MOVES; k++)
{
if (GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], MON_DATA_MOVE1 + k, NULL)
== GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j, NULL))
break;
}
- if (k == 4)
+ if (k == MAX_MON_MOVES)
SetMonMoveSlot(&gPlayerParty[i], MOVE_SKETCH, j);
}
gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1] = gPlayerParty[i];
@@ -2407,9 +2407,9 @@ void sub_81A4C30(void)
i = gPlayerPartyCount;
LoadPlayerParty();
- sub_8076D5C();
+ SetContinueGameWarpStatusToDynamicWarp();
TrySavingData(SAVE_LINK);
- sav2_gender2_inplace_and_xFE();
+ ClearContinueGameWarpStatus2();
gPlayerPartyCount = i;
for (i = 0; i < PARTY_SIZE; i++)
@@ -2511,7 +2511,7 @@ void CreateFrontierBrainPokemon(void)
for (j = 0; j < NUM_STATS; j++)
SetMonData(&gEnemyParty[monPartyId], MON_DATA_HP_EV + j, &sFrontierBrainsMons[facility][symbol][i].evs[j]);
friendship = 0xFF;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonMoveSlot(&gEnemyParty[monPartyId], sFrontierBrainsMons[facility][symbol][i].moves[j], j);
if (sFrontierBrainsMons[facility][symbol][i].moves[j] == MOVE_FRUSTRATION)
diff --git a/src/ghost.c b/src/ghost.c
index a755783b7..d26a4d1cb 100644
--- a/src/ghost.c
+++ b/src/ghost.c
@@ -800,7 +800,7 @@ void sub_81123C4(u8 taskId)
task->data[10] = gBattleAnimArgs[0];
baseX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
- baseY = sub_80A861C(gBattleAnimAttacker, 3);
+ baseY = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM);
if (!IsContest())
{
for (battler = 0; battler < 4; battler++)
@@ -813,7 +813,7 @@ void sub_81123C4(u8 taskId)
if (spriteId != MAX_SPRITES)
{
x = GetBattlerSpriteCoord(battler, 2);
- y = sub_80A861C(battler, 3);
+ y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_BOTTOM);
gSprites[spriteId].data[0] = baseX << 4;
gSprites[spriteId].data[1] = baseY << 4;
gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1];
@@ -1168,7 +1168,7 @@ void sub_8112C6C(u8 taskId)
task->data[1] = 16;
task->data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
- task->data[11] = (sub_80A861C(gBattleAnimAttacker, 1) / 2) + 8;
+ task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2) + 8;
task->data[7] = 0;
task->data[5] = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 2;
diff --git a/src/gpu_regs.c b/src/gpu_regs.c
index 2d48b304a..e5ff4fe8f 100644
--- a/src/gpu_regs.c
+++ b/src/gpu_regs.c
@@ -72,16 +72,20 @@ void SetGpuReg(u8 regOffset, u16 value)
GPU_REG_BUF(regOffset) = value;
vcount = REG_VCOUNT & 0xFF;
- if ((vcount >= 161 && vcount <= 225)
- || (REG_DISPCNT & DISPCNT_FORCED_BLANK)) {
+ if ((vcount >= 161 && vcount <= 225) || (REG_DISPCNT & DISPCNT_FORCED_BLANK))
+ {
CopyBufferedValueToGpuReg(regOffset);
- } else {
+ }
+ else
+ {
s32 i;
sGpuRegBufferLocked = TRUE;
- for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) {
- if (sGpuRegWaitingList[i] == regOffset) {
+ for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++)
+ {
+ if (sGpuRegWaitingList[i] == regOffset)
+ {
sGpuRegBufferLocked = FALSE;
return;
}
@@ -99,15 +103,20 @@ void SetGpuReg_ForcedBlank(u8 regOffset, u16 value)
{
GPU_REG_BUF(regOffset) = value;
- if (REG_DISPCNT & DISPCNT_FORCED_BLANK) {
+ if (REG_DISPCNT & DISPCNT_FORCED_BLANK)
+ {
CopyBufferedValueToGpuReg(regOffset);
- } else {
+ }
+ else
+ {
s32 i;
sGpuRegBufferLocked = TRUE;
- for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++) {
- if (sGpuRegWaitingList[i] == regOffset) {
+ for (i = 0; i < GPU_REG_BUF_SIZE && sGpuRegWaitingList[i] != EMPTY_SLOT; i++)
+ {
+ if (sGpuRegWaitingList[i] == regOffset)
+ {
sGpuRegBufferLocked = FALSE;
return;
}
@@ -144,7 +153,8 @@ void ClearGpuRegBits(u8 regOffset, u16 mask)
static void SyncRegIE(void)
{
- if (sShouldSyncRegIE) {
+ if (sShouldSyncRegIE)
+ {
u16 temp = REG_IME;
REG_IME = 0;
REG_IE = sRegIE;
diff --git a/src/graphics.c b/src/graphics.c
index c0deb2883..b2de074bc 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -897,9 +897,9 @@ const u32 gBattleStatMask6_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat6
const u32 gBattleStatMask7_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat7.gbapal.lz");
const u32 gBattleStatMask8_Pal[] = INCBIN_U32("graphics/battle_anims/masks/stat8.gbapal.lz");
-const u8 gUnknown_08C2DC68[] = INCBIN_U8("graphics/battle_anims/masks/cure_bubbles.4bpp.lz");
-const u16 gUnknown_08C2DDA4[] = INCBIN_U16("graphics/battle_anims/masks/cure_bubbles.gbapal.lz");
-const u8 gUnknown_08C2DDC4[] = INCBIN_U8("graphics/battle_anims/masks/cure_bubbles.bin.lz");
+const u32 gUnknown_08C2DC68[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.4bpp.lz");
+const u32 gUnknown_08C2DDA4[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.gbapal.lz");
+const u32 gUnknown_08C2DDC4[] = INCBIN_U32("graphics/battle_anims/masks/cure_bubbles.bin.lz");
const u32 gBattleAnimSpritePalette_245[] = INCBIN_U32("graphics/battle_anims/sprites/245.gbapal.lz");
const u32 gBattleAnimSpriteSheet_245[] = INCBIN_U32("graphics/battle_anims/sprites/245.4bpp.lz");
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index f7792e935..3f217b782 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -14,7 +14,9 @@
#include "constants/songs.h"
#include "decompress.h"
#include "save.h"
+#include "strings.h"
#include "window.h"
+#include "credits.h"
#include "bg.h"
#include "constants/species.h"
#include "constants/game_stat.h"
@@ -28,6 +30,7 @@
#include "event_data.h"
#include "overworld.h"
#include "menu.h"
+#include "fldeff_misc.h"
#include "trainer_pokemon_sprites.h"
#include "data2.h"
#include "rom_81520A8.h"
@@ -59,37 +62,11 @@ static EWRAM_DATA u32 sUnknown_0203BCD4 = 0;
static EWRAM_DATA struct HallofFameTeam *sHofMonPtr = NULL;
static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL;
-extern bool8 gHasHallOfFameRecords;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
#define HALL_OF_FAME_MAX_TEAMS 50
-// strings
-extern const u8 gText_SavingDontTurnOffPower[];
-extern const u8 gText_LeagueChamp[];
-extern const u8 gText_HOFNumber[];
-extern const u8 gText_PickNextCancel[];
-extern const u8 gText_PickCancel[];
-extern const u8 gText_UnkCtrlF800Exit[];
-extern const u8 gText_HOFCorrupted[];
-extern const u8 gText_WelcomeToHOF[];
-extern const u8 gText_Number[];
-extern const u8 gText_Level[];
-extern const u8 gText_IDNumber[];
-extern const u8 gText_Name[];
-extern const u8 gText_MainMenuTime[];
-
-extern void sub_8175620(void);
-extern bool8 sub_80F9C30(void);
-extern void sub_8198314(void);
extern void ReturnFromHallOfFamePC(void);
-extern void sub_8198180(const u8 *src, u8, u8);
-extern void sub_80F9BF4(u16, u16, u8);
-extern void sub_81980F0(u8, u8, u8, u8, u16);
-extern void sub_80F9BCC(u16, u16, u8);
-extern bool8 sub_80F9C1C(void);
-extern void sub_81971D0(void);
-extern void sub_8197200(void);
// this file's functions
static void ClearVramOamPltt_LoadHofPal(void);
@@ -378,8 +355,8 @@ static bool8 InitHallOfFameScreen(void)
gMain.state++;
break;
case 2:
- SetGpuReg(REG_OFFSET_BLDCNT, 0x3F42);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x710);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7));
SetGpuReg(REG_OFFSET_BLDY, 0);
sub_8174FAC();
sHofGfxPtr->state = 0;
@@ -840,8 +817,8 @@ void CB2_DoHallOfFamePC(void)
{
u8 taskId, i;
- SetGpuReg(REG_OFFSET_BLDCNT, 0x3F42);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x710);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 7));
SetGpuReg(REG_OFFSET_BLDY, 0);
taskId = CreateTask(Task_HofPC_CopySaveData, 0);
@@ -1088,7 +1065,7 @@ static void Task_HofPC_HandleExit(u8 taskId)
static void Task_HofPC_PrintDataIsCorrupted(u8 taskId)
{
- sub_8198180(gText_UnkCtrlF800Exit, 8, 1);
+ sub_8198180(gText_UnkCtrlF800Exit, 8, TRUE);
NewMenuHelpers_DrawDialogueFrame(0, 0);
AddTextPrinterParameterized2(0, 1, gText_HOFCorrupted, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
@@ -1283,8 +1260,8 @@ static void sub_8174F70(void)
ResetAllPicSprites();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 8;
- LoadCompressedObjectPic(sHallOfFame_ConfettiSpriteSheet);
- LoadCompressedObjectPalette(sHallOfFame_ConfettiSpritePalette);
+ LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet);
+ LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette);
}
static void sub_8174FAC(void)
@@ -1322,7 +1299,7 @@ static bool8 sub_8175024(void)
CopyBgTilemapBufferToVram(3);
break;
case 3:
- sub_81971D0();
+ InitStandardTextBoxWindows();
sub_8197200();
break;
case 4:
@@ -1475,8 +1452,8 @@ static void sub_8175364(u8 taskId)
gSpecialVar_0x8004 = var;
gSpecialVar_0x8005 = 0xFFFF;
}
- LoadCompressedObjectPic(sHallOfFame_ConfettiSpriteSheet);
- LoadCompressedObjectPalette(sHallOfFame_ConfettiSpritePalette);
+ LoadCompressedSpriteSheet(sHallOfFame_ConfettiSpriteSheet);
+ LoadCompressedSpritePalette(sHallOfFame_ConfettiSpritePalette);
data[0]++;
break;
case 1:
diff --git a/src/ice.c b/src/ice.c
index ebd0d3cf6..77b3700ef 100644
--- a/src/ice.c
+++ b/src/ice.c
@@ -1,21 +1,54 @@
#include "global.h"
#include "battle_anim.h"
+#include "bg.h"
+#include "field_weather.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "main.h"
+#include "palette.h"
+#include "random.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "constants/battle_anim.h"
#include "constants/rgb.h"
-extern void sub_810B6C4(struct Sprite *);
-extern void sub_810B8AC(struct Sprite *);
-extern void sub_810B8EC(struct Sprite *);
-extern void sub_810B974(struct Sprite *);
-extern void sub_810BA24(struct Sprite *);
-extern void sub_810BC94(struct Sprite *);
-extern void sub_810BE48(struct Sprite *);
-extern void sub_810BED0(struct Sprite *);
-extern void sub_810C2F0(struct Sprite *);
-extern void sub_810C560(struct Sprite *);
-extern void sub_810CB58(struct Sprite *);
+struct HailStruct {
+ s32 unk0:10;
+ s32 unk1:10;
+ s32 unk2:8;
+ s32 unk3:4;
+};
+
+static void sub_810B6C4(struct Sprite *);
+extern void sub_810B848(struct Sprite *);
+extern void AnimIcePunchSwirlingParticle(struct Sprite *);
+extern void AnimIceBeamParticle(struct Sprite *);
+extern void AnimIceEffectParticle(struct Sprite *);
+extern void AnimFlickerIceEffectParticle(struct Sprite *);
+extern void AnimSwirlingSnowball_Step1(struct Sprite *);
+extern void AnimSwirlingSnowball_Step2(struct Sprite *);
+extern void AnimSwirlingSnowball_Step3(struct Sprite *);
+extern void AnimSwirlingSnowball_End(struct Sprite *);
+extern void AnimMoveParticleBeyondTarget(struct Sprite *);
+extern void AnimWiggleParticleTowardsTarget(struct Sprite *);
+extern void AnimWaveFromCenterOfTarget(struct Sprite *);
+extern void InitSwirlingFogAnim(struct Sprite *);
+extern void AnimSwirlingFogAnim(struct Sprite *);
+extern void AnimThrowMistBall(struct Sprite *);
+extern void InitPoisonGasCloudAnim(struct Sprite *);
+extern void MovePoisonGasCloud(struct Sprite *);
+extern void AnimHailBegin(struct Sprite *);
+extern void AnimHailContinue(struct Sprite *);
extern void sub_80A8EE4(struct Sprite *);
-extern void unc_080B06FC(struct Sprite *);
-extern void sub_810CD4C(struct Sprite *);
+extern void InitIceBallAnim(struct Sprite *);
+extern void AnimThrowIceBall(struct Sprite *);
+extern void InitIceBallParticle(struct Sprite *);
+extern void AnimIceBallParticle(struct Sprite *);
+void AnimTask_Haze2(u8);
+void AnimTask_OverlayFogTiles(u8);
+void AnimTask_Hail2(u8);
+bool8 GenerateHailParticle(u8, u8, u8, u8);
const union AnimCmd gUnknown_08595A48[] =
{
@@ -127,7 +160,7 @@ const struct SpriteTemplate gUnknown_08595AD0 =
.anims = gUnknown_08595AA8,
.images = NULL,
.affineAnims = gUnknown_08595ACC,
- .callback = sub_810B8AC,
+ .callback = AnimIcePunchSwirlingParticle,
};
const struct SpriteTemplate gUnknown_08595AE8 =
@@ -138,7 +171,7 @@ const struct SpriteTemplate gUnknown_08595AE8 =
.anims = gUnknown_08595AAC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810B8AC,
+ .callback = AnimIcePunchSwirlingParticle,
};
const union AffineAnimCmd gUnknown_08595B00[] =
@@ -160,7 +193,7 @@ const struct SpriteTemplate gUnknown_08595B14 =
.anims = gUnknown_08595AA8,
.images = NULL,
.affineAnims = gUnknown_08595B10,
- .callback = sub_810B8EC,
+ .callback = AnimIceBeamParticle,
};
const struct SpriteTemplate gUnknown_08595B2C =
@@ -171,7 +204,7 @@ const struct SpriteTemplate gUnknown_08595B2C =
.anims = gUnknown_08595AAC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810B8EC,
+ .callback = AnimIceBeamParticle,
};
const union AffineAnimCmd gUnknown_08595B44[] =
@@ -195,7 +228,7 @@ const struct SpriteTemplate gUnknown_08595B68 =
.anims = gUnknown_08595AA8,
.images = NULL,
.affineAnims = gUnknown_08595B64,
- .callback = sub_810B974,
+ .callback = AnimIceEffectParticle,
};
const struct SpriteTemplate gUnknown_08595B80 =
@@ -206,7 +239,7 @@ const struct SpriteTemplate gUnknown_08595B80 =
.anims = gUnknown_08595AAC,
.images = NULL,
.affineAnims = gUnknown_08595B64,
- .callback = sub_810B974,
+ .callback = AnimIceEffectParticle,
};
const struct SpriteTemplate gUnknown_08595B98 =
@@ -217,7 +250,7 @@ const struct SpriteTemplate gUnknown_08595B98 =
.anims = gUnknown_08595AB0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810BA24,
+ .callback = AnimSwirlingSnowball_Step1,
};
const struct SpriteTemplate gUnknown_08595BB0 =
@@ -228,7 +261,7 @@ const struct SpriteTemplate gUnknown_08595BB0 =
.anims = gUnknown_08595AB4,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810BC94,
+ .callback = AnimMoveParticleBeyondTarget,
};
const struct SpriteTemplate gUnknown_08595BC8 =
@@ -239,7 +272,7 @@ const struct SpriteTemplate gUnknown_08595BC8 =
.anims = gUnknown_08595AB0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810BC94,
+ .callback = AnimMoveParticleBeyondTarget,
};
const union AnimCmd gUnknown_08595BE0[] =
@@ -267,7 +300,7 @@ const struct SpriteTemplate gUnknown_08595C04 =
.anims = gUnknown_08595C00,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810BE48,
+ .callback = AnimWaveFromCenterOfTarget,
};
const union AnimCmd gUnknown_08595C1C[] =
@@ -290,7 +323,7 @@ const struct SpriteTemplate gUnknown_08595C2C =
.anims = gUnknown_08595C28,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810BED0,
+ .callback = InitSwirlingFogAnim,
};
const struct SpriteTemplate gUnknown_08595C44 =
@@ -301,7 +334,7 @@ const struct SpriteTemplate gUnknown_08595C44 =
.anims = gUnknown_08595C28,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810BED0,
+ .callback = InitSwirlingFogAnim,
};
const u8 gUnknown_08595C5C[] =
@@ -317,7 +350,7 @@ const struct SpriteTemplate gUnknown_08595C70 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810C2F0,
+ .callback = AnimThrowMistBall,
};
const u8 gUnknown_08595C88[] =
@@ -333,21 +366,21 @@ const struct SpriteTemplate gUnknown_08595C9C =
.anims = gUnknown_08595C28,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810C560,
+ .callback = InitPoisonGasCloudAnim,
};
-const u8 gUnknown_08595CB4[][4] =
+const struct HailStruct gUnknown_08595CB4[] =
{
- {0x64, 0xE0, 0x01, 0x20},
- {0x55, 0xE0, 0x01, 0x00},
- {0xF2, 0xE0, 0x11, 0x10},
- {0x42, 0xE0, 0x21, 0x10},
- {0xB6, 0xE0, 0x31, 0x00},
- {0x3C, 0xE0, 0x01, 0x20},
- {0xD6, 0xE0, 0x11, 0x00},
- {0x71, 0xE0, 0x01, 0x10},
- {0xD2, 0xE0, 0x31, 0x10},
- {0x26, 0xE0, 0x21, 0x00},
+ {100, 120, 0, 2},
+ {85, 120, 0, 0},
+ {242, 120, 1, 1},
+ {66, 120, 2, 1},
+ {182, 120, 3, 0},
+ {60, 120, 0, 2},
+ {214, 120, 1, 0},
+ {113, 120, 0, 1},
+ {210, 120, 3, 1},
+ {38, 120, 2, 0},
};
const union AffineAnimCmd gUnknown_08595CDC[] =
@@ -394,7 +427,7 @@ const struct SpriteTemplate gUnknown_08595D2C =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_08595D1C,
- .callback = sub_810CB58,
+ .callback = AnimHailBegin,
};
const struct SpriteTemplate gUnknown_08595D44 =
@@ -476,7 +509,7 @@ const struct SpriteTemplate gUnknown_08595DE4 =
.anims = gUnknown_08595D78,
.images = NULL,
.affineAnims = gUnknown_08595DD0,
- .callback = unc_080B06FC,
+ .callback = InitIceBallAnim,
};
const struct SpriteTemplate gUnknown_08595DFC =
@@ -487,5 +520,1421 @@ const struct SpriteTemplate gUnknown_08595DFC =
.anims = gUnknown_08595AAC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_810CD4C,
+ .callback = InitIceBallParticle,
};
+
+
+// probably unused
+#ifdef NONMATCHING
+static void sub_810B6C4(struct Sprite *sprite)
+{
+ s16 targetX, targetY, attackerX, attackerY;
+ s16 i;
+
+ sprite->oam.tileNum += 7;
+ targetX = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ targetY = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
+ attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
+ attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gBattleAnimArgs[0] + attackerX;
+ sprite->data[2] = gBattleAnimArgs[2] + targetX;
+ sprite->data[3] = gBattleAnimArgs[1] + attackerY;
+ sprite->data[4] = gBattleAnimArgs[3] + targetY;
+ sub_80A64EC(sprite);
+ while ((targetX >= -32 && targetX <= 272) && (targetY >= -32 && targetY <= 192))
+ {
+ targetX += sprite->data[1];
+ targetY += sprite->data[2];
+ }
+ sprite->data[1] = -sprite->data[1];
+ sprite->data[2] = -sprite->data[2];
+ while ((attackerX >= -32 && attackerX <= 272) && (attackerY >= -32 && attackerY <= 192))
+ {
+ attackerX += sprite->data[1];
+ attackerY += sprite->data[2];
+ }
+ sprite->pos1.x = attackerX;
+ sprite->pos1.y = attackerY;
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = attackerX;
+ sprite->data[2] = targetX;
+ sprite->data[3] = attackerY;
+ sprite->data[4] = targetY;
+ sub_80A64EC(sprite);
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->data[4] = gBattleAnimArgs[6];
+ sprite->callback = sub_810B848;
+}
+#else
+NAKED
+static void sub_810B6C4(struct Sprite *sprite)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x4\n\
+ adds r5, r0, 0\n\
+ ldrh r2, [r5, 0x4]\n\
+ lsls r1, r2, 22\n\
+ lsrs r1, 22\n\
+ adds r1, 0x7\n\
+ ldr r3, =0x000003ff\n\
+ adds r0, r3, 0\n\
+ ands r1, r0\n\
+ ldr r0, =0xfffffc00\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strh r0, [r5, 0x4]\n\
+ ldr r4, =gBattleAnimTarget\n\
+ ldrb r0, [r4]\n\
+ movs r1, 0x2\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+ ldrb r0, [r4]\n\
+ movs r1, 0x3\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ ldr r4, =gBattleAnimAttacker\n\
+ ldrb r0, [r4]\n\
+ movs r1, 0x2\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ ldrb r0, [r4]\n\
+ movs r1, 0x3\n\
+ str r3, [sp]\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ ldr r1, =gBattleAnimArgs\n\
+ ldrh r0, [r1, 0x8]\n\
+ strh r0, [r5, 0x2E]\n\
+ ldrh r0, [r1]\n\
+ ldr r3, [sp]\n\
+ adds r0, r3\n\
+ strh r0, [r5, 0x30]\n\
+ ldrh r0, [r1, 0x4]\n\
+ mov r4, r9\n\
+ adds r0, r4, r0\n\
+ strh r0, [r5, 0x32]\n\
+ ldrh r0, [r1, 0x2]\n\
+ adds r0, r6\n\
+ strh r0, [r5, 0x34]\n\
+ ldrh r0, [r1, 0x6]\n\
+ mov r7, r8\n\
+ adds r0, r7, r0\n\
+ strh r0, [r5, 0x36]\n\
+ adds r0, r5, 0\n\
+ bl sub_80A64EC\n\
+ adds r4, 0x20\n\
+ movs r0, 0x98\n\
+ lsls r0, 1\n\
+ mov r12, r0\n\
+ ldr r3, [sp]\n\
+ cmp r4, r12\n\
+ bhi _0810B79E\n\
+ adds r0, r7, 0\n\
+ adds r0, 0x20\n\
+ ldrh r1, [r5, 0x30]\n\
+ ldrh r2, [r5, 0x32]\n\
+ cmp r0, 0xE0\n\
+ bhi _0810B79E\n\
+ adds r4, r1, 0\n\
+ mov r10, r12\n\
+_0810B76A:\n\
+ mov r7, r9\n\
+ lsls r1, r7, 16\n\
+ asrs r1, 16\n\
+ adds r1, r4\n\
+ lsls r1, 16\n\
+ mov r7, r8\n\
+ lsls r0, r7, 16\n\
+ asrs r0, 16\n\
+ adds r0, r2\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
+ lsrs r0, r1, 16\n\
+ mov r9, r0\n\
+ movs r7, 0x80\n\
+ lsls r7, 14\n\
+ adds r1, r7\n\
+ lsrs r1, 16\n\
+ cmp r1, r10\n\
+ bhi _0810B79E\n\
+ mov r1, r8\n\
+ lsls r0, r1, 16\n\
+ adds r0, r7\n\
+ lsrs r0, 16\n\
+ cmp r0, 0xE0\n\
+ bls _0810B76A\n\
+_0810B79E:\n\
+ ldrh r0, [r5, 0x30]\n\
+ negs r7, r0\n\
+ strh r7, [r5, 0x30]\n\
+ ldrh r0, [r5, 0x32]\n\
+ negs r4, r0\n\
+ strh r4, [r5, 0x32]\n\
+ lsls r0, r3, 16\n\
+ movs r1, 0x80\n\
+ lsls r1, 14\n\
+ adds r0, r1\n\
+ lsrs r0, 16\n\
+ movs r2, 0x98\n\
+ lsls r2, 1\n\
+ mov r12, r2\n\
+ ldr r1, =gBattleAnimArgs\n\
+ mov r10, r1\n\
+ cmp r0, r12\n\
+ bhi _0810B80A\n\
+ lsls r1, r6, 16\n\
+ movs r2, 0x80\n\
+ lsls r2, 14\n\
+ adds r0, r1, r2\n\
+ b _0810B802\n\
+ .pool\n\
+_0810B7E0:\n\
+ lsls r1, r3, 16\n\
+ asrs r1, 16\n\
+ adds r1, r7\n\
+ lsls r1, 16\n\
+ asrs r0, r2, 16\n\
+ adds r0, r4\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ lsrs r3, r1, 16\n\
+ movs r0, 0x80\n\
+ lsls r0, 14\n\
+ adds r1, r0\n\
+ lsrs r1, 16\n\
+ cmp r1, r12\n\
+ bhi _0810B80A\n\
+ lsls r1, r6, 16\n\
+ adds r0, r1, r0\n\
+_0810B802:\n\
+ lsrs r0, 16\n\
+ adds r2, r1, 0\n\
+ cmp r0, 0xE0\n\
+ bls _0810B7E0\n\
+_0810B80A:\n\
+ strh r3, [r5, 0x20]\n\
+ strh r6, [r5, 0x22]\n\
+ mov r1, r10\n\
+ ldrh r0, [r1, 0x8]\n\
+ strh r0, [r5, 0x2E]\n\
+ strh r3, [r5, 0x30]\n\
+ mov r2, r9\n\
+ strh r2, [r5, 0x32]\n\
+ strh r6, [r5, 0x34]\n\
+ mov r3, r8\n\
+ strh r3, [r5, 0x36]\n\
+ adds r0, r5, 0\n\
+ bl sub_80A64EC\n\
+ mov r7, r10\n\
+ ldrh r0, [r7, 0xA]\n\
+ strh r0, [r5, 0x34]\n\
+ ldrh r0, [r7, 0xC]\n\
+ strh r0, [r5, 0x36]\n\
+ ldr r0, =sub_810B848\n\
+ str r0, [r5, 0x1C]\n\
+ add sp, 0x4\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n");
+}
+#endif
+
+void sub_810B848(struct Sprite *sprite)
+{
+ if (sprite->data[0] != 0)
+ {
+ sprite->data[5] += sprite->data[1];
+ sprite->data[6] += sprite->data[2];
+ sprite->pos2.x = sprite->data[5];
+ sprite->pos2.y = sprite->data[6];
+ sprite->pos2.x += Sin(sprite->data[7], sprite->data[3]);
+ sprite->pos2.y += Sin(sprite->data[7], sprite->data[3]);
+ sprite->data[7] = (sprite->data[7] + sprite->data[4]) & 0xFF;
+ sprite->data[0]--;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Animates the swirling ice crystals in Ice Punch.
+// arg 0: initial position angle around circle (0-256)
+void AnimIcePunchSwirlingParticle(struct Sprite *sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = 60;
+ sprite->data[2] = 9;
+ sprite->data[3] = 30;
+ sprite->data[4] = -512;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = TranslateSpriteInGrowingCircleOverDuration;
+ sprite->callback(sprite);
+}
+
+// Animates the ice particles in Ice Beam.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x offset
+// arg 3: target y offset
+// arg 4: duration
+void AnimIceBeamParticle(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->data[2] -= gBattleAnimArgs[2];
+ else
+ sprite->data[2] += gBattleAnimArgs[2];
+
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
+ sprite->data[0] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = StartAnimLinearTranslation;
+}
+
+// Animates the ice crystals at the end of Ice Punch, Ice Beam, Tri Attack,
+// Weather Ball (Hail), Blizzard, and Powder Snow.
+// arg 0: target x offset
+// arg 1: target y offset
+// arg 2: ??? unknown boolean
+void AnimIceEffectParticle(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[2] == 0)
+ {
+ InitSpritePosToAnimTarget(sprite, TRUE);
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->pos1.x, &sprite->pos1.y);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ StoreSpriteCallbackInData6(sprite, AnimFlickerIceEffectParticle);
+ sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+}
+
+void AnimFlickerIceEffectParticle(struct Sprite *sprite)
+{
+ sprite->invisible ^= 1;
+ sprite->data[0] += 1;
+ if (sprite->data[0] == 20)
+ DestroySpriteAndMatrix(sprite);
+}
+
+// Animates the small snowballs that swirl around the target in Blizzard and Icy Wind.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x offset
+// arg 3: target y offset
+// arg 4: particle speed
+// arg 5: multiple targets? (boolean)
+void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
+{
+ int i;
+ s16 tempDataHolder[8];
+
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
+
+ if (!gBattleAnimArgs[5])
+ {
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
+ }
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->data[2] -= gBattleAnimArgs[2];
+ else
+ sprite->data[2] += gBattleAnimArgs[2];
+
+ for (i = 0; i < 8; i++)
+ tempDataHolder[i] = sprite->data[i];
+
+ InitAnimFastLinearTranslationWithSpeed(sprite);
+ sprite->data[1] ^= 1;
+ sprite->data[2] ^= 1;
+
+ while (1)
+ {
+ sprite->data[0] = 1;
+ AnimFastTranslateLinear(sprite);
+
+ if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272
+ || sprite->pos1.y + sprite->pos2.y > 160
+ || sprite->pos1.y + sprite->pos2.y < -16)
+ break;
+ }
+
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ for (i = 0; i < 8; i++)
+ sprite->data[i] = tempDataHolder[i];
+
+ sprite->callback = sub_80A718C;
+ StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step2);
+}
+
+void AnimSwirlingSnowball_Step2(struct Sprite *sprite)
+{
+ s16 tempVar;
+
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 128;
+
+ tempVar = GetBattlerSide(gBattleAnimAttacker) != 0 ? 20 : -20;
+
+ sprite->data[3] = Sin(sprite->data[0], tempVar);
+ sprite->data[4] = Cos(sprite->data[0], 0xF);
+ sprite->data[5] = 0;
+ sprite->callback = AnimSwirlingSnowball_Step3;
+ sprite->callback(sprite);
+}
+
+void AnimSwirlingSnowball_Step3(struct Sprite *sprite)
+{
+ s16 tempVar;
+ tempVar = GetBattlerSide(gBattleAnimAttacker) != 0 ? 20 : -20;
+
+ if (sprite->data[5] <= 31)
+ {
+ sprite->pos2.x = Sin(sprite->data[0], tempVar) - sprite->data[3];
+ sprite->pos2.y = Cos(sprite->data[0], 15) - sprite->data[4];
+ sprite->data[0] = (sprite->data[0] + 16) & 0xFF;
+ sprite->data[5] += 1;
+ }
+ else
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ sprite->callback = AnimSwirlingSnowball_End;
+ }
+}
+
+void AnimSwirlingSnowball_End(struct Sprite *sprite)
+{
+ sprite->data[0] = 1;
+ AnimFastTranslateLinear(sprite);
+
+ if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272
+ || sprite->pos1.y + sprite->pos2.y > 256
+ || sprite->pos1.y + sprite->pos2.y < -16)
+ DestroyAnimSprite(sprite);
+}
+
+// Moves particles towards the target mon and off the screen. Used to animate
+// the large snowballs in Blizzard and the small snowballs in Powder Snow.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x offset
+// arg 3: target y offset
+// arg 4: speed
+// arg 5: wave amplitude
+// arg 6: wave frequency
+// arg 7: multiple targets? (boolean)
+void AnimMoveParticleBeyondTarget(struct Sprite *sprite)
+{
+ int i;
+ s16 tempDataHolder[8];
+
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
+
+ if (!gBattleAnimArgs[7])
+ {
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
+ }
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->data[2] -= gBattleAnimArgs[2];
+ else
+ sprite->data[2] += gBattleAnimArgs[2];
+
+ sprite->data[4] += gBattleAnimArgs[3];
+ InitAnimFastLinearTranslationWithSpeed(sprite);
+ for (i = 0; i < 8; i++)
+ tempDataHolder[i] = sprite->data[i];
+
+ sprite->data[1] ^= 1;
+ sprite->data[2] ^= 1;
+
+ while (1)
+ {
+ sprite->data[0] = 1;
+ AnimFastTranslateLinear(sprite);
+ if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272
+ || sprite->pos1.y + sprite->pos2.y > 160
+ || sprite->pos1.y + sprite->pos2.y < -16)
+ break;
+ }
+
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ for (i = 0; i < 8; i++)
+ sprite->data[i] = tempDataHolder[i];
+
+ sprite->data[5] = gBattleAnimArgs[5];
+ sprite->data[6] = gBattleAnimArgs[6];
+ sprite->callback = AnimWiggleParticleTowardsTarget;
+}
+
+// Moves particles in a sine wave towards the target.
+void AnimWiggleParticleTowardsTarget(struct Sprite *sprite)
+{
+ AnimFastTranslateLinear(sprite);
+ if (sprite->data[0] == 0)
+ sprite->data[0] = 1;
+
+ sprite->pos2.y += Sin(sprite->data[7], sprite->data[5]);
+ sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF;
+ if (sprite->data[0] == 1)
+ {
+ if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272
+ || sprite->pos1.y + sprite->pos2.y > 160
+ || sprite->pos1.y + sprite->pos2.y < -16)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Animates the ice pilar wave used by Icy Wind.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: ??? unknown boolean
+void AnimWaveFromCenterOfTarget(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (gBattleAnimArgs[2] == 0)
+ {
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->data[0]++;
+ }
+ else
+ {
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Animates the fog that swirls around the mon in Mist and Smog.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: change in y pixels per rotation
+// arg 3: duration
+// arg 4: animate on opponent? (boolean)
+// arg 5: ??? unknown boolean
+void InitSwirlingFogAnim(struct Sprite *sprite)
+{
+ s16 tempVar;
+ u8 battler;
+
+ if (gBattleAnimArgs[4] == 0)
+ {
+ if (gBattleAnimArgs[5] == 0)
+ {
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->pos1.x, &sprite->pos1.y);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ else
+ sprite->pos1.x += gBattleAnimArgs[0];
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ battler = gBattleAnimAttacker;
+ }
+ else
+ {
+ if (gBattleAnimArgs[5] == 0)
+ {
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
+ if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ else
+ sprite->pos1.x += gBattleAnimArgs[0];
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ battler = gBattleAnimTarget;
+ }
+
+ sprite->data[7] = battler;
+ if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle())
+ tempVar = 0x20;
+ else
+ tempVar = 0x40;
+
+ sprite->data[6] = tempVar;
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ sprite->pos1.y += 8;
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2];
+
+ InitAnimLinearTranslation(sprite);
+
+ sprite->data[5] = 64;
+ sprite->callback = AnimSwirlingFogAnim;
+ sprite->callback(sprite);
+}
+
+// Animates swirling fog initialized by InitSwirlingFogAnim.
+void AnimSwirlingFogAnim(struct Sprite *sprite)
+{
+ if (!AnimTranslateLinear(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], sprite->data[6]);
+ sprite->pos2.y += Cos(sprite->data[5], -6);
+
+ if ((u16)(sprite->data[5] - 64) <= 0x7F)
+ sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);
+ else
+ sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]) + 1;
+
+ sprite->data[5] = (sprite->data[5] + 3) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Fades mons to black and places foggy overlay in Haze.
+void AnimTask_Haze1(u8 taskId)
+{
+ struct UnknownAnimStruct2 subStruct;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+
+ sub_80A6B30(&subStruct);
+ LoadBgTiles(subStruct.bgId, gWeatherFog1Tiles, 0x800, subStruct.tilesOffset);
+ sub_80A6D60(&subStruct, gBattleAnimFogTilemap, 0);
+ LoadPalette(&gUnknown_083970E8, subStruct.unk8 * 16, 32);
+
+ gTasks[taskId].func = AnimTask_Haze2;
+}
+
+void AnimTask_Haze2(u8 taskId)
+{
+ struct UnknownAnimStruct2 subStruct;
+
+ gBattle_BG1_X += -1;
+ gBattle_BG1_Y += 0;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[9]++;
+ gTasks[taskId].data[11] = gUnknown_08595C5C[gTasks[taskId].data[9]];
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 9)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 0x51)
+ {
+ gTasks[taskId].data[11] = 9;
+ gTasks[taskId].data[12]++;
+ }
+ break;
+ case 2:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]--;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_80A6B30(&subStruct);
+ sub_80A6C68(1);
+ sub_80A6C68(2);
+
+ gTasks[taskId].data[12]++;
+
+ // fall through
+ case 4:
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// Throws the ball in Mist Ball.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: targey x offset
+// arg 3: target y offset
+// arg 4: duration
+// arg 5: ??? unknown (seems to vibrate target mon somehow)
+void AnimThrowMistBall(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
+ sprite->callback = TranslateAnimSpriteToTargetMonLocation;
+}
+
+// Displays misty background in Mist Ball.
+void AnimTask_LoadMistTiles(u8 taskId)
+{
+ struct UnknownAnimStruct2 subStruct;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+
+ sub_80A6B30(&subStruct);
+ LoadBgTiles(subStruct.bgId, gWeatherFog1Tiles, 0x800, subStruct.tilesOffset);
+ sub_80A6D60(&subStruct, gBattleAnimFogTilemap, 0);
+ LoadPalette(&gUnknown_083970E8, subStruct.unk8 * 16, 32);
+
+ gTasks[taskId].data[15] = -1;
+ gTasks[taskId].func = AnimTask_OverlayFogTiles;
+}
+
+void AnimTask_OverlayFogTiles(u8 taskId)
+{
+ struct UnknownAnimStruct2 subStruct;
+
+ gBattle_BG1_X += gTasks[taskId].data[15];
+ gBattle_BG1_Y += 0;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ gTasks[taskId].data[9] += 1;
+ gTasks[taskId].data[11] = gUnknown_08595C88[gTasks[taskId].data[9]];
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 5)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 0x51)
+ {
+ gTasks[taskId].data[11] = 5;
+ gTasks[taskId].data[12]++;
+ }
+ break;
+ case 2:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11] -= 1;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_80A6B30(&subStruct);
+ sub_80A6C68(1);
+ sub_80A6C68(2);
+
+ gTasks[taskId].data[12]++;
+
+ // fall through
+ case 4:
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// Initializes gas clouds in the Poison Gas animation.
+// arg 0: duration
+// arg 1: ? target x offset
+// arg 2: ? target y offset
+// arg 3: ? swirl start x
+// arg 4: ? swirl start y
+// arg 5: ??? unknown
+// arg 6: ??? unknown
+// arg 7: ??? unknown boolean
+void InitPoisonGasCloudAnim(struct Sprite *sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[0];
+
+ if (GetBattlerSpriteCoord(gBattleAnimAttacker, 2) < GetBattlerSpriteCoord(gBattleAnimTarget, 2))
+ sprite->data[7] = 0x8000;
+
+ if (!(gBattlerPositions[gBattleAnimTarget] & 1))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+
+ if ((sprite->data[7] & 0x8000) && !(gBattlerPositions[gBattleAnimAttacker] & 1))
+ sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1;
+
+ sprite->data[6] = 1;
+ }
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
+ if (gBattleAnimArgs[7])
+ {
+ sprite->data[1] = sprite->pos1.x + gBattleAnimArgs[1];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[3];
+ sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[4];
+ sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8;
+ }
+ else
+ {
+ sprite->data[1] = sprite->pos1.x + gBattleAnimArgs[1];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[3];
+ sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[4];
+ sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8;
+ }
+
+ if (IsContest())
+ {
+ sprite->data[6] = 1;
+ sprite->subpriority = 0x80;
+ }
+
+ InitAnimLinearTranslation(sprite);
+ sprite->callback = MovePoisonGasCloud;
+}
+
+void MovePoisonGasCloud(struct Sprite *sprite)
+{
+ int value;
+ register s16 value2 asm("r5");
+ int unused;
+
+ switch (sprite->data[7] & 0xFF)
+ {
+ case 0:
+ AnimTranslateLinear(sprite);
+ value = gSineTable[sprite->data[5]];
+ sprite->pos2.x += value >> 4;
+ if (sprite->data[6])
+ sprite->data[5] = (sprite->data[5] - 8) & 0xFF;
+ else
+ sprite->data[5] = (sprite->data[5] + 8) & 0xFF;
+
+ if (sprite->data[0] <= 0)
+ {
+ value2 = 80;
+ sprite->data[0] = value2;
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->pos1.y + 29;
+ sprite->data[7]++;
+ if (!IsContest() && gBattlerPositions[gBattleAnimTarget] & 1)
+ sprite->data[5] = 204;
+ else
+ sprite->data[5] = value2;
+
+ sprite->pos2.y = 0;
+ value = gSineTable[sprite->data[5]];
+ sprite->pos2.x = value >> 3;
+ sprite->data[5] = (sprite->data[5] + 2) & 0xFF;
+ InitAnimLinearTranslation(sprite);
+ }
+ break;
+ case 1:
+ AnimTranslateLinear(sprite);
+ value = gSineTable[sprite->data[5]];
+ sprite->pos2.x += value >> 3;
+ sprite->pos2.y += (gSineTable[sprite->data[5] + 0x40] * -3) >> 8;
+ if (!IsContest())
+ {
+ u16 var0 = sprite->data[5] - 0x40;
+ if (var0 <= 0x7F)
+ sprite->oam.priority = sprite->data[7] >> 8;
+ else
+ sprite->oam.priority = (sprite->data[7] >> 8) + 1;
+
+ sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
+ }
+ else
+ {
+ u16 var0 = sprite->data[5] - 0x40;
+ if (var0 <= 0x7F)
+ sprite->subpriority = 128;
+ else
+ sprite->subpriority = 140;
+
+ sprite->data[5] = (sprite->data[5] - 4) & 0xFF;
+ }
+
+ if (sprite->data[0] <= 0)
+ {
+ asm("mov r5, #0"); // unused local variable?
+ unused = 0;
+ sprite->data[0] = 0x300;
+ sprite->data[1] = sprite->pos1.x += sprite->pos2.x;
+ sprite->data[3] = sprite->pos1.y += sprite->pos2.y;
+ sprite->data[4] = sprite->pos1.y + 4;
+ if (!IsContest() && gBattlerPositions[gBattleAnimTarget] & 1)
+ sprite->data[2] = 0x100;
+ else
+ sprite->data[2] = -0x10;
+
+ sprite->data[7]++;
+ sprite->pos2.x = sprite->pos2.y = 0;
+ sub_80A6FD4(sprite);
+ }
+ break;
+ case 2:
+ if (AnimTranslateLinear(sprite))
+ {
+ if (sprite->oam.affineMode & 1)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ }
+
+ DestroySprite(sprite);
+ gAnimVisualTaskCount--;
+ }
+ break;
+ }
+}
+
+// Creates Hail.
+void AnimTask_Hail1(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->func = AnimTask_Hail2;
+}
+
+void AnimTask_Hail2(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[4] > 2)
+ {
+ task->data[4] = 0;
+ task->data[5] = 0;
+ task->data[2] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (task->data[5] == 0)
+ {
+ if (GenerateHailParticle(task->data[3], task->data[2], taskId, 1))
+ task->data[1]++;
+
+ if (++task->data[2] == 3)
+ {
+ if (++task->data[3] == 10)
+ task->data[0]++;
+ else
+ task->data[0]--;
+ }
+ else
+ {
+ task->data[5] = 1;
+ }
+
+ }
+ else
+ {
+ task->data[5]--;
+ }
+ break;
+ case 2:
+ if (task->data[1] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+bool8 GenerateHailParticle(u8 a, u8 b, u8 taskId, u8 c)
+{
+ bool8 possibleBool = FALSE;
+ // s8 unk = gUnknown_08595CB4[a].unk3;
+ const struct HailStruct *hailData = &gUnknown_08595CB4[a];
+ s8 unk = hailData->unk3;
+ u8 battler;
+ s16 battlerX, battlerY;
+ u8 spriteId;
+ // struct Sprite *sprite;
+ s16 spriteX;
+
+ if (unk != 2)
+ {
+ battler = GetBattlerAtPosition(hailData->unk2);
+ if (IsBattlerSpriteVisible(battler))
+ {
+ possibleBool = TRUE;
+ battlerX = GetBattlerSpriteCoord(battler, 2);
+ battlerY = GetBattlerSpriteCoord(battler, 3);
+ switch (unk)
+ {
+ case 0:
+ battlerX -= GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 6;
+ battlerY -= GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 6;
+ break;
+ case 1:
+ battlerX += GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_WIDTH) / 6;
+ battlerY += GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 6;
+ break;
+ }
+ }
+ }
+ else
+ {
+ battlerX = (hailData->unk0);
+ battlerY = (hailData->unk1);
+ }
+ spriteX = battlerX - ((battlerY + 8) / 2);
+ spriteId = CreateSprite(&gUnknown_08595D2C, spriteX, -8, 18);
+ if (spriteId == MAX_SPRITES)
+ return FALSE;
+ // sprite = &gSprites[spriteId];
+ StartSpriteAffineAnim(&gSprites[spriteId], b);
+ gSprites[spriteId].data[0] = possibleBool;
+ gSprites[spriteId].data[3] = battlerX;
+ gSprites[spriteId].data[4] = battlerY;
+ gSprites[spriteId].data[5] = b;
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = c;
+ return TRUE;
+}
+#else
+NAKED
+bool8 GenerateHailParticle(u8 a, u8 b, u8 taskId, u8 c)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x8\n\
+ lsls r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r9, r1\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r2, [sp]\n\
+ lsls r3, 24\n\
+ lsrs r3, 24\n\
+ mov r10, r3\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x4]\n\
+ ldr r1, =gUnknown_08595CB4\n\
+ lsrs r0, 22\n\
+ adds r4, r0, r1\n\
+ ldrb r0, [r4, 0x3]\n\
+ lsls r0, 24\n\
+ asrs r0, 28\n\
+ mov r8, r0\n\
+ cmp r0, 0x2\n\
+ beq _0810CAD0\n\
+ ldrh r0, [r4, 0x2]\n\
+ lsls r0, 20\n\
+ lsrs r0, 24\n\
+ bl GetBattlerAtPosition\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ adds r0, r5, 0\n\
+ bl IsBattlerSpriteVisible\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0810CAD0\n\
+ movs r0, 0x1\n\
+ str r0, [sp, 0x4]\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x2\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x3\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ mov r1, r8\n\
+ cmp r1, 0\n\
+ beq _0810CA60\n\
+ cmp r1, 0x1\n\
+ beq _0810CA96\n\
+ b _0810CAE2\n\
+ .pool\n\
+_0810CA60:\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x1\n\
+ bl GetBattlerSpriteCoordAttr\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x6\n\
+ bl __divsi3\n\
+ lsls r1, r7, 16\n\
+ asrs r1, 16\n\
+ subs r1, r0\n\
+ lsls r1, 16\n\
+ lsrs r7, r1, 16\n\
+ adds r0, r5, 0\n\
+ movs r1, 0\n\
+ bl GetBattlerSpriteCoordAttr\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x6\n\
+ bl __divsi3\n\
+ lsls r1, r6, 16\n\
+ asrs r1, 16\n\
+ subs r1, r0\n\
+ b _0810CACA\n\
+_0810CA96:\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x1\n\
+ bl GetBattlerSpriteCoordAttr\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x6\n\
+ bl __divsi3\n\
+ lsls r1, r7, 16\n\
+ asrs r1, 16\n\
+ adds r1, r0\n\
+ lsls r1, 16\n\
+ lsrs r7, r1, 16\n\
+ adds r0, r5, 0\n\
+ movs r1, 0\n\
+ bl GetBattlerSpriteCoordAttr\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x6\n\
+ bl __divsi3\n\
+ lsls r1, r6, 16\n\
+ asrs r1, 16\n\
+ adds r1, r0\n\
+_0810CACA:\n\
+ lsls r1, 16\n\
+ lsrs r6, r1, 16\n\
+ b _0810CAE2\n\
+_0810CAD0:\n\
+ ldrh r0, [r4]\n\
+ lsls r0, 22\n\
+ asrs r0, 6\n\
+ lsrs r7, r0, 16\n\
+ ldr r0, [r4]\n\
+ lsls r0, 12\n\
+ asrs r0, 22\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+_0810CAE2:\n\
+ lsls r0, r6, 16\n\
+ asrs r0, 16\n\
+ adds r0, 0x8\n\
+ lsrs r1, r0, 31\n\
+ adds r0, r1\n\
+ asrs r0, 1\n\
+ lsls r1, r7, 16\n\
+ asrs r1, 16\n\
+ subs r1, r0\n\
+ ldr r0, =gUnknown_08595D2C\n\
+ lsls r1, 16\n\
+ asrs r1, 16\n\
+ movs r2, 0x8\n\
+ negs r2, r2\n\
+ movs r3, 0x12\n\
+ bl CreateSprite\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x40\n\
+ beq _0810CB44\n\
+ lsls r4, r5, 4\n\
+ adds r4, r5\n\
+ lsls r4, 2\n\
+ ldr r0, =gSprites\n\
+ adds r4, r0\n\
+ adds r0, r4, 0\n\
+ mov r1, r9\n\
+ bl StartSpriteAffineAnim\n\
+ mov r0, sp\n\
+ ldrh r0, [r0, 0x4]\n\
+ strh r0, [r4, 0x2E]\n\
+ strh r7, [r4, 0x34]\n\
+ strh r6, [r4, 0x36]\n\
+ mov r1, r9\n\
+ strh r1, [r4, 0x38]\n\
+ mov r0, sp\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r4, 0x3A]\n\
+ mov r1, r10\n\
+ strh r1, [r4, 0x3C]\n\
+ movs r0, 0x1\n\
+ b _0810CB46\n\
+ .pool\n\
+_0810CB44:\n\
+ movs r0, 0\n\
+_0810CB46:\n\
+ add sp, 0x8\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n");
+}
+#endif
+
+void AnimHailBegin(struct Sprite *sprite)
+{
+ u8 spriteId;
+
+ sprite->pos1.x += 4;
+ sprite->pos1.y += 8;
+
+ if (sprite->pos1.x < sprite->data[3] && sprite->pos1.y < sprite->data[4])
+ return;
+
+ if (sprite->data[0] == 1 && sprite->data[5] == 0)
+ {
+ spriteId = CreateSprite(&gUnknown_08595B68,
+ sprite->data[3], sprite->data[4], sprite->subpriority);
+
+ sprite->data[0] = spriteId;
+ if (spriteId != 64)
+ {
+ gSprites[sprite->data[0]].callback = AnimHailContinue;
+ gSprites[sprite->data[0]].data[6] = sprite->data[6];
+ gSprites[sprite->data[0]].data[7] = sprite->data[7];
+ }
+
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+ }
+ else
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+ }
+}
+
+void AnimHailContinue(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 20)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+ }
+}
+
+// Initializes the animation for Ice Ball.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x offset
+// arg 3: target y offset
+// arg 4: duration
+// arg 5: arc height (negative)
+void InitIceBallAnim(struct Sprite *sprite)
+{
+ u8 animNum = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1;
+
+ if (animNum > 4)
+ animNum = 4;
+
+ StartSpriteAffineAnim(sprite, animNum);
+ InitSpritePosToAnimAttacker(sprite, 1);
+
+ sprite->data[0] = gBattleAnimArgs[4];
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[5];
+
+ InitAnimArcTranslation(sprite);
+
+ sprite->callback = AnimThrowIceBall;
+}
+
+// Throws the ball of ice in Ice Ball.
+void AnimThrowIceBall(struct Sprite *sprite)
+{
+ if (!TranslateAnimArc(sprite))
+ return;
+
+ StartSpriteAnim(sprite, 1);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+// Initializes the particles that scatter at the end of the Ice Ball animation.
+void InitIceBallParticle(struct Sprite *sprite)
+{
+ s16 randA, randB;
+
+ sprite->oam.tileNum += 8;
+ InitSpritePosToAnimTarget(sprite, TRUE);
+
+ randA = (Random2() & 0xFF) + 256;
+ randB = Random2() & 0x1FF;
+
+ if (randB > 0xFF)
+ randB = 256 - randB;
+
+ sprite->data[1] = randA;
+ sprite->data[2] = randB;
+ sprite->callback = AnimIceBallParticle;
+}
+
+// Animates the particles created by InitIceBallParticle.
+void AnimIceBallParticle(struct Sprite *sprite)
+{
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+
+ if (sprite->data[1] & 1)
+ sprite->pos2.x = -(sprite->data[3] >> 8);
+ else
+ sprite->pos2.x = sprite->data[3] >> 8;
+
+ sprite->pos2.y = sprite->data[4] >> 8;
+
+ if (++sprite->data[0] == 21)
+ DestroyAnimSprite(sprite);
+}
+
+// Counter for Ice Ball.
+void AnimTask_GetRolloutCounter(u8 taskId)
+{
+ u8 arg = gBattleAnimArgs[0];
+
+ gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1;
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/intro.c b/src/intro.c
index 94692e6ec..18a899fb0 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -1044,10 +1044,10 @@ static void Task_IntroLoadPart1Graphics(u8 taskId)
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512);
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512);
- LoadCompressedObjectPic(gUnknown_085E4FDC);
- LoadCompressedObjectPic(gUnknown_085E4FEC);
+ LoadCompressedSpriteSheet(gUnknown_085E4FDC);
+ LoadCompressedSpriteSheet(gUnknown_085E4FEC);
LoadSpritePalettes(gUnknown_085E4FFC);
- LoadCompressedObjectPic(gUnknown_085E4A74);
+ LoadCompressedSpriteSheet(gUnknown_085E4A74);
LoadSpritePalettes(gUnknown_085E4A84);
CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20);
CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E);
@@ -1204,16 +1204,16 @@ static void Task_IntroStartBikeRide(u8 taskId)
u8 spriteId;
if (gUnknown_0203BCC8 == 0)
- LoadCompressedObjectPic(gIntro2BrendanSpriteSheet);
+ LoadCompressedSpriteSheet(gIntro2BrendanSpriteSheet);
else
- LoadCompressedObjectPic(gIntro2MaySpriteSheet);
+ LoadCompressedSpriteSheet(gIntro2MaySpriteSheet);
- LoadCompressedObjectPic(gIntro2BicycleSpriteSheet);
- LoadCompressedObjectPic(gIntro2FlygonSpriteSheet);
+ LoadCompressedSpriteSheet(gIntro2BicycleSpriteSheet);
+ LoadCompressedSpriteSheet(gIntro2FlygonSpriteSheet);
for (spriteId = 0; spriteId < 3; spriteId++)
{
- LoadCompressedObjectPic(&gUnknown_085E4AE8[spriteId]);
+ LoadCompressedSpriteSheet(&gUnknown_085E4AE8[spriteId]);
}
LoadSpritePalettes(gUnknown_085F530C);
@@ -1542,8 +1542,8 @@ static void Task_IntroLoadPart1Graphics3(u8 taskId)
LZDecompressVram(gIntro3GroudonTilemap, (void *)(VRAM + 0xC000));
LZDecompressVram(gIntro3LegendBgGfx, (void *)(VRAM + 0x4000));
LZDecompressVram(gIntro3GroudonBgTilemap, (void *)(VRAM + 0xE000));
- LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]);
- LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]);
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]);
CpuCopy16(gIntro3BgPal, gPlttBufferUnfaded, sizeof(gIntro3BgPal));
gTasks[taskId].func = Task_IntroLoadPart1Graphics4;
}
@@ -1764,7 +1764,7 @@ static void Task_IntroLoadPart1Graphics9(u8 taskId)
LZDecompressVram(gIntro3KyogreGfx, (void *)VRAM);
LZDecompressVram(gIntro3KyogreTilemap, (void *)(VRAM + 0xC000));
LZDecompressVram(gIntro3KyogreBgTilemap, (void *)(VRAM + 0xE000));
- LoadCompressedObjectPic(gUnknown_085E4C88);
+ LoadCompressedSpriteSheet(gUnknown_085E4C88);
LoadSpritePalette(gUnknown_085E4C98);
BeginNormalPaletteFade(0xFFFFFFFE, 0, 0x10, 0, RGB_WHITEALPHA);
gTasks[taskId].func = Task_IntroFadeIn0;
@@ -2092,7 +2092,7 @@ static void Task_IntroFadeIn5(u8 taskId)
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[6] = 1;
gTasks[taskId].data[7] = 0;
- LoadCompressedObjectPicUsingHeap(gUnknown_085E4BF4);
+ LoadCompressedSpriteSheetUsingHeap(gUnknown_085E4BF4);
LoadSpritePalettes(gUnknown_085E4C04);
}
@@ -2169,7 +2169,7 @@ static void Task_IntroFadeIn7(u8 taskId)
{
u8 newTaskId;
- LoadCompressedObjectPic(gUnknown_085E5048);
+ LoadCompressedSpriteSheet(gUnknown_085E5048);
LoadSpritePalettes(gUnknown_085E5058);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
| DISPCNT_OBJ_1D_MAP
diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c
index 20a360901..d85e58938 100644
--- a/src/intro_credits_graphics.c
+++ b/src/intro_credits_graphics.c
@@ -341,7 +341,7 @@ void load_intro_part2_graphics(u8 a)
LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM));
LZ77UnCompVram(gUnknown_085F1398, (void *)(VRAM + 0x3000));
LoadPalette(&gUnknown_085F0CFC, 0, 96);
- LoadCompressedObjectPic(gUnknown_085F5064);
+ LoadCompressedSpriteSheet(gUnknown_085F5064);
LoadPalette(&gUnknown_085F1668, 256, 32);
sub_817B76C();
break;
@@ -349,7 +349,7 @@ void load_intro_part2_graphics(u8 a)
LZ77UnCompVram(gUnknown_085F1824, (void *)(VRAM));
LZ77UnCompVram(gUnknown_085F1EAC, (void *)(VRAM + 0x3000));
LoadPalette(&gUnknown_085F17E4, 0, 32);
- LoadCompressedObjectPic(gUnknown_085F50EC);
+ LoadCompressedSpriteSheet(gUnknown_085F50EC);
LoadPalette(&gUnknown_085F21B0, 256, 32);
sub_817B788();
break;
@@ -447,7 +447,7 @@ void sub_817B1C8(u8 a)
LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM));
LZ77UnCompVram(gUnknown_085F1398, (void *)(VRAM + 0x3000));
LoadPalette(&gUnknown_085F0CFC, 0, 96);
- LoadCompressedObjectPic(gUnknown_085F5064);
+ LoadCompressedSpriteSheet(gUnknown_085F5064);
LZ77UnCompVram(gUnknown_085F16A8, (void *)(VRAM + 0x10000));
LoadPalette(&gUnknown_085F1668, 256, 32);
sub_817B76C();
@@ -457,7 +457,7 @@ void sub_817B1C8(u8 a)
LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM));
LZ77UnCompVram(gUnknown_085F1398, (void *)(VRAM + 0x3000));
LoadPalette(&gUnknown_085F0D5C, 0, 96);
- LoadCompressedObjectPic(gUnknown_085F5064);
+ LoadCompressedSpriteSheet(gUnknown_085F5064);
LZ77UnCompVram(gUnknown_085F16A8, (void *)(VRAM + 0x10000));
LoadPalette(&gUnknown_085F1688, 256, 32);
sub_817B76C();
@@ -468,7 +468,7 @@ void sub_817B1C8(u8 a)
LZ77UnCompVram(gUnknown_085F1824, (void *)(VRAM));
LZ77UnCompVram(gUnknown_085F1EAC, (void *)(VRAM + 0x3000));
LoadPalette(&gUnknown_085F1804, 0, 32);
- LoadCompressedObjectPic(gUnknown_085F50EC);
+ LoadCompressedSpriteSheet(gUnknown_085F50EC);
LoadPalette(&gUnknown_085F1804, 256, 32);
sub_817B788();
break;
@@ -477,7 +477,7 @@ void sub_817B1C8(u8 a)
LZ77UnCompVram(gUnknown_085F235C, (void *)(VRAM));
LZ77UnCompVram(gUnknown_085F2568, (void *)(VRAM + 0x3000));
LoadPalette(&gUnknown_085F231C, 0, 64);
- LoadCompressedObjectPic(gUnknown_085F5180);
+ LoadCompressedSpriteSheet(gUnknown_085F5180);
LoadPalette(&gUnknown_085F2548, 256, 32);
sub_817B7A4();
break;
diff --git a/src/item_icon.c b/src/item_icon.c
index d037782bd..e9379dbba 100644
--- a/src/item_icon.c
+++ b/src/item_icon.c
@@ -107,7 +107,7 @@ u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId)
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
spritePalette.tag = paletteTag;
- LoadCompressedObjectPalette(&spritePalette);
+ LoadCompressedSpritePalette(&spritePalette);
spriteTemplate = Alloc(sizeof(*spriteTemplate));
CpuCopy16(&gItemIconSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
@@ -144,7 +144,7 @@ u8 AddCustomItemIconSprite(struct SpriteTemplate *customSpriteTemplate, u16 tile
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
spritePalette.tag = paletteTag;
- LoadCompressedObjectPalette(&spritePalette);
+ LoadCompressedSpritePalette(&spritePalette);
spriteTemplate = Alloc(sizeof(*spriteTemplate));
CpuCopy16(customSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
diff --git a/src/item_menu.c b/src/item_menu.c
index 32c42ac31..a220f02ef 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -713,13 +713,13 @@ bool8 load_bag_menu_graphics(void)
break;
case 3:
if (IsWallysBag() == TRUE || gSaveBlock2Ptr->playerGender == MALE)
- LoadCompressedObjectPic(&gUnknown_0857FB34);
+ LoadCompressedSpriteSheet(&gUnknown_0857FB34);
else
- LoadCompressedObjectPic(&gUnknown_0857FB3C);
+ LoadCompressedSpriteSheet(&gUnknown_0857FB3C);
gUnknown_0203CE54->unk834++;
break;
case 4:
- LoadCompressedObjectPalette(&gUnknown_0857FB44);
+ LoadCompressedSpritePalette(&gUnknown_0857FB44);
gUnknown_0203CE54->unk834++;
break;
default:
@@ -1564,7 +1564,7 @@ void Task_HandleOutOfBattleItemMenuInput(u8 taskId)
{
if (sub_81221EC() != TRUE)
{
- s8 cursorPos = GetMenuCursorPos();
+ s8 cursorPos = Menu_GetCursorPos();
if (gMain.newKeys & DPAD_UP)
{
if (cursorPos > 0 && sub_81ACDFC(cursorPos - 2))
diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c
index 894574ec9..669195b33 100644
--- a/src/item_menu_icons.c
+++ b/src/item_menu_icons.c
@@ -583,7 +583,7 @@ static void sub_80D5070(u8 berryId)
pal.data = gBerryPicTable[berryId].pal;
pal.tag = 0x7544;
- LoadCompressedObjectPalette(&pal);
+ LoadCompressedSpritePalette(&pal);
LZDecompressWram(gBerryPicTable[berryId].tiles, &gDecompressionBuffer[0x1000]);
sub_80D5018(&gDecompressionBuffer[0x1000], &gDecompressionBuffer[0]);
}
diff --git a/src/item_use.c b/src/item_use.c
index f82071a17..91fdc81c8 100755
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -32,6 +32,7 @@
#include "task.h"
#include "text.h"
#include "constants/bg_event_constants.h"
+#include "constants/event_objects.h"
#include "constants/flags.h"
#include "constants/items.h"
#include "constants/songs.h"
@@ -570,15 +571,15 @@ u8 sub_80FD9B0(s16 itemX, s16 itemY)
void sub_80FDA24(u8 direction)
{
- EventObjectClearHeldMovementIfFinished(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
- EventObjectClearHeldMovement(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
- UnfreezeEventObject(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]);
+ EventObjectClearHeldMovement(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]);
+ UnfreezeEventObject(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]);
PlayerTurnInPlace(direction);
}
void sub_80FDA94(u8 taskId)
{
- if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE)
+ if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]) == TRUE)
DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, sub_80FD5CC);
}
@@ -586,7 +587,7 @@ void sub_80FDADC(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE
+ if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0)]) == TRUE
|| data[2] == FALSE)
{
sub_80FDA24(gUnknown_085920E4[data[5]]);
@@ -627,7 +628,7 @@ void sub_80FDC00(u8 taskId)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
OpenPokeblockCase(0, CB2_ReturnToField);
DestroyTask(taskId);
}
diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c
index 1012a8e08..3d4f8a90d 100644
--- a/src/lilycove_lady.c
+++ b/src/lilycove_lady.c
@@ -5,7 +5,9 @@
#include "global.h"
#include "main.h"
#include "overworld.h"
-#include "rom6.h"
+#include "fldeff.h"
+#include "field_specials.h"
+#include "pokeblock.h"
#include "event_data.h"
#include "script.h"
#include "random.h"
diff --git a/src/link.c b/src/link.c
index 79df699ef..69373f773 100644
--- a/src/link.c
+++ b/src/link.c
@@ -1080,7 +1080,7 @@ bool8 sub_800A4D8(u8 a0)
return FALSE;
}
-bool8 sub_800A520(void)
+bool8 IsLinkTaskFinished(void)
{
if (gWirelessCommType == TRUE)
{
diff --git a/src/link_rfu.c b/src/link_rfu.c
index 2c6e22475..0625e4af4 100644
--- a/src/link_rfu.c
+++ b/src/link_rfu.c
@@ -2244,7 +2244,7 @@ void sub_800E0E8(void)
{
if (GetSpriteTileStartByTag(sWirelessStatusIndicatorSpriteSheet.tag) == 0xFFFF)
{
- LoadCompressedObjectPic(&sWirelessStatusIndicatorSpriteSheet);
+ LoadCompressedSpriteSheet(&sWirelessStatusIndicatorSpriteSheet);
}
LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette);
gWirelessStatusIndicatorSpriteId = 0xFF;
@@ -4123,7 +4123,7 @@ void sub_8010AAC(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 5:
- if (sub_800A520() && GetBlockReceivedStatus() & 1)
+ if (IsLinkTaskFinished() && GetBlockReceivedStatus() & 1)
{
CpuFill16(0, gBlockRecvBuffer, sizeof(struct UnkRfuStruct_8010A14));
ResetBlockReceivedFlag(0);
@@ -4162,7 +4162,7 @@ void sub_8010D0C(u8 taskId)
}
break;
case 1:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
gTasks[taskId].data[0]++;
break;
case 2:
diff --git a/src/list_menu.c b/src/list_menu.c
index caf4b798d..2476fae26 100644
--- a/src/list_menu.c
+++ b/src/list_menu.c
@@ -1074,7 +1074,7 @@ u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16
spriteSheet.data = sRedArrowOtherGfx;
spriteSheet.size = 0x100;
spriteSheet.tag = arrowInfo->tileTag;
- LoadCompressedObjectPic(&spriteSheet);
+ LoadCompressedSpriteSheet(&spriteSheet);
if (arrowInfo->palTag == SPRITE_INVALID_TAG)
{
@@ -1320,7 +1320,7 @@ static u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor)
spriteSheet.data = sSelectorOutlineGfx;
spriteSheet.size = 0x100;
spriteSheet.tag = cursor->tileTag;
- LoadCompressedObjectPic(&spriteSheet);
+ LoadCompressedSpriteSheet(&spriteSheet);
if (cursor->palTag == SPRITE_INVALID_TAG)
{
@@ -1405,7 +1405,7 @@ static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor)
spriteSheet.data = sRedArrowGfx;
spriteSheet.size = 0x80;
spriteSheet.tag = cursor->tileTag;
- LoadCompressedObjectPic(&spriteSheet);
+ LoadCompressedSpriteSheet(&spriteSheet);
if (cursor->palTag == SPRITE_INVALID_TAG)
{
diff --git a/src/load_save.c b/src/load_save.c
index 8ecf89959..a7593d007 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -1,12 +1,14 @@
#include "global.h"
-#include "gba/flash_internal.h"
+#include "alloc.h"
+#include "item.h"
#include "load_save.h"
#include "main.h"
+#include "overworld.h"
#include "pokemon.h"
+#include "pokemon_storage_system.h"
#include "random.h"
-#include "alloc.h"
-#include "item.h"
-#include "overworld.h"
+#include "save_location.h"
+#include "gba/flash_internal.h"
#include "decoration_inventory.h"
static void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey);
@@ -135,30 +137,30 @@ void MoveSaveBlocks_ResetHeap(void)
gSaveBlock2Ptr->encryptionKey = encryptionKey;
}
-u32 GetSecretBase2Field_9(void)
+u32 UseContinueGameWarp(void)
{
- return gSaveBlock2Ptr->specialSaveWarp & 1;
+ return gSaveBlock2Ptr->specialSaveWarpFlags & CONTINUE_GAME_WARP;
}
-void ClearSecretBase2Field_9(void)
+void ClearContinueGameWarpStatus(void)
{
- gSaveBlock2Ptr->specialSaveWarp &= ~1;
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;
}
-void SetSecretBase2Field_9(void)
+void SetContinueGameWarpStatus(void)
{
- gSaveBlock2Ptr->specialSaveWarp |= 1;
+ gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
}
-void sub_8076D5C(void)
+void SetContinueGameWarpStatusToDynamicWarp(void)
{
- sub_8084FAC(0);
- gSaveBlock2Ptr->specialSaveWarp |= 1;
+ SetContinueGameWarpToDynamicWarp(0);
+ gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
}
-void sav2_gender2_inplace_and_xFE(void)
+void ClearContinueGameWarpStatus2(void)
{
- gSaveBlock2Ptr->specialSaveWarp &= ~1;
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;
}
void SavePlayerParty(void)
diff --git a/src/mail.c b/src/mail.c
index 7b096ed00..45e96e85e 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -170,29 +170,29 @@ static const u16 sUnknown_0859F2B0[][2] = {
static const struct MailGraphics sUnknown_0859F2B8[] = {
{
- gMailPalette_Orange, gMailTiles_Orange, gMailTilemap_Orange, 0x02c0, 0x0000, 0x294a, 0x6739
+ gMailPalette_Orange, gMailTiles_Orange, gMailTilemap_Orange, 0x02c0, 0, 0x294a, 0x6739
}, {
- gMailPalette_Harbor, gMailTiles_Harbor, gMailTilemap_Harbor, 0x02e0, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Harbor, gMailTiles_Harbor, gMailTilemap_Harbor, 0x02e0, 0, 0x7fff, 0x4631
}, {
- gMailPalette_Glitter, gMailTiles_Glitter, gMailTilemap_Glitter, 0x0400, 0x0000, 0x294a, 0x6739
+ gMailPalette_Glitter, gMailTiles_Glitter, gMailTilemap_Glitter, 0x0400, 0, 0x294a, 0x6739
}, {
- gMailPalette_Mech, gMailTiles_Mech, gMailTilemap_Mech, 0x01e0, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Mech, gMailTiles_Mech, gMailTilemap_Mech, 0x01e0, 0, 0x7fff, 0x4631
}, {
- gMailPalette_Wood, gMailTiles_Wood, gMailTilemap_Wood, 0x02e0, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Wood, gMailTiles_Wood, gMailTilemap_Wood, 0x02e0, 0, 0x7fff, 0x4631
}, {
- gMailPalette_Wave, gMailTiles_Wave, gMailTilemap_Wave, 0x0300, 0x0000, 0x294a, 0x6739
+ gMailPalette_Wave, gMailTiles_Wave, gMailTilemap_Wave, 0x0300, 0, 0x294a, 0x6739
}, {
- gMailPalette_Bead, gMailTiles_Bead, gMailTilemap_Bead, 0x0140, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Bead, gMailTiles_Bead, gMailTilemap_Bead, 0x0140, 0, 0x7fff, 0x4631
}, {
- gMailPalette_Shadow, gMailTiles_Shadow, gMailTilemap_Shadow, 0x0300, 0x0000, 0x7fff, 0x4631
+ gMailPalette_Shadow, gMailTiles_Shadow, gMailTilemap_Shadow, 0x0300, 0, 0x7fff, 0x4631
}, {
- gMailPalette_Tropic, gMailTiles_Tropic, gMailTilemap_Tropic, 0x0220, 0x0000, 0x294a, 0x6739
+ gMailPalette_Tropic, gMailTiles_Tropic, gMailTilemap_Tropic, 0x0220, 0, 0x294a, 0x6739
}, {
- gMailPalette_Dream, gMailTiles_Dream, gMailTilemap_Dream, 0x0340, 0x0000, 0x294a, 0x6739
+ gMailPalette_Dream, gMailTiles_Dream, gMailTilemap_Dream, 0x0340, 0, 0x294a, 0x6739
}, {
- gMailPalette_Fab, gMailTiles_Fab, gMailTilemap_Fab, 0x02a0, 0x0000, 0x294a, 0x6739
+ gMailPalette_Fab, gMailTiles_Fab, gMailTilemap_Fab, 0x02a0, 0, 0x294a, 0x6739
}, {
- gMailPalette_Retro, gMailTiles_Retro, gMailTilemap_Retro, 0x0520, 0x0000, 0x294a, 0x6739
+ gMailPalette_Retro, gMailTiles_Retro, gMailTilemap_Retro, 0x0520, 0, 0x294a, 0x6739
}
};
@@ -306,7 +306,7 @@ static bool8 MailReadBuildGraphics(void)
case 0:
SetVBlankCallback(NULL);
ScanlineEffect_Stop();
- SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
break;
case 1:
CpuFill16(0, (void *)OAM, OAM_SIZE);
@@ -323,16 +323,16 @@ static bool8 MailReadBuildGraphics(void)
case 5:
FreeAllSpritePalettes();
reset_temp_tile_data_buffers();
- SetGpuReg(REG_OFFSET_BG0HOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG0VOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG1HOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG1VOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG2VOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG2HOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG3HOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BG3VOFS, 0x0000);
- SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
break;
case 6:
ResetBgsAndClearDma3BusyFlags(0);
diff --git a/src/main_menu.c b/src/main_menu.c
index e11f783eb..4cd5c8e14 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -1394,7 +1394,7 @@ static void Task_NewGameBirchSpeech_ChooseGender(u8 taskId)
gTasks[taskId].func = Task_NewGameBirchSpeech_WhatsYourName;
break;
}
- gender2 = GetMenuCursorPos();
+ gender2 = Menu_GetCursorPos();
if (gender2 != gTasks[taskId].tPlayerGender)
{
gTasks[taskId].tPlayerGender = gender2;
diff --git a/src/menu.c b/src/menu.c
index 61096138a..f1b35b42e 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -48,8 +48,8 @@ struct Menu
bool8 APressMuted;
};
-static EWRAM_DATA u8 gStartMenuWindowId = 0;
-static EWRAM_DATA u8 gUnknown_0203CD8D = 0;
+static EWRAM_DATA u8 sStartMenuWindowId = 0;
+static EWRAM_DATA u8 sMapNamePopupWindowId = 0;
static EWRAM_DATA struct Menu gUnknown_0203CD90 = {0};
static EWRAM_DATA u16 gUnknown_0203CD9C = 0;
static EWRAM_DATA u8 gUnknown_0203CD9E = 0;
@@ -63,7 +63,7 @@ static EWRAM_DATA void *gUnknown_0203CDAC[0x20] = {NULL};
const u16 gUnknown_0860F074[] = INCBIN_U16("graphics/interface/860F074.gbapal");
static const u8 gUnknown_0860F094[] = { 8, 4, 1 };
-static const struct WindowTemplate gUnknown_0860F098[] =
+static const struct WindowTemplate sStandardTextBox_WindowTemplates[] =
{
{
.bg = 0,
@@ -77,7 +77,7 @@ static const struct WindowTemplate gUnknown_0860F098[] =
DUMMY_WIN_TEMPLATE
};
-static const struct WindowTemplate gUnknown_0860F0A8 =
+static const struct WindowTemplate sYesNo_WindowTemplates =
{
.bg = 0,
.tilemapLeft = 21,
@@ -132,19 +132,19 @@ extern void sub_8197BB4(u8, u8, u8, u8, u8, u8);
extern void sub_8197E30(u8, u8, u8, u8, u8, u8);
extern void DrawWindowBorder(u8, u8, u8, u8, u8, u8);
extern void sub_81980A8(u8, u8, u8, u8, u8, u8);
-extern u8 MoveMenuCursor(s8);
+extern u8 Menu_MoveCursor(s8);
extern u8 sub_8199134(s8, s8);
extern void sub_8198C78(void);
extern void task_free_buf_after_copying_tile_data_to_vram(u8 taskId);
-void sub_81971D0(void)
+void InitStandardTextBoxWindows(void)
{
- InitWindows(gUnknown_0860F098);
- gStartMenuWindowId = 0xFF;
- gUnknown_0203CD8D = 0xFF;
+ InitWindows(sStandardTextBox_WindowTemplates);
+ sStartMenuWindowId = 0xFF;
+ sMapNamePopupWindowId = 0xFF;
}
-void sub_81971F4(void)
+void FreeAllOverworldWindowBuffers(void)
{
FreeAllWindowBuffers();
}
@@ -460,12 +460,12 @@ void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback)
void DisplayYesNoMenu(void)
{
- CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0);
+ CreateYesNoMenu(&sYesNo_WindowTemplates, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0);
}
void sub_8197948(u8 initialCursorPos)
{
- CreateYesNoMenu(&gUnknown_0860F0A8, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, initialCursorPos);
+ CreateYesNoMenu(&sYesNo_WindowTemplates, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, initialCursorPos);
}
u32 GetPlayerTextSpeed(void)
@@ -486,22 +486,22 @@ u8 GetPlayerTextSpeedDelay(void)
u8 sub_81979C4(u8 a1)
{
- if (gStartMenuWindowId == 0xFF)
- gStartMenuWindowId = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139);
- return gStartMenuWindowId;
+ if (sStartMenuWindowId == 0xFF)
+ sStartMenuWindowId = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139);
+ return sStartMenuWindowId;
}
u8 GetStartMenuWindowId(void)
{
- return gStartMenuWindowId;
+ return sStartMenuWindowId;
}
void RemoveStartMenuWindow(void)
{
- if (gStartMenuWindowId != 0xFF)
+ if (sStartMenuWindowId != 0xFF)
{
- RemoveWindow(gStartMenuWindowId);
- gStartMenuWindowId = 0xFF;
+ RemoveWindow(sStartMenuWindowId);
+ sStartMenuWindowId = 0xFF;
}
}
@@ -517,22 +517,22 @@ u16 sub_8197A38(void)
u8 AddMapNamePopUpWindow(void)
{
- if (gUnknown_0203CD8D == 0xFF)
- gUnknown_0203CD8D = sub_8198AA4(0, 1, 1, 10, 3, 14, 0x107);
- return gUnknown_0203CD8D;
+ if (sMapNamePopupWindowId == 0xFF)
+ sMapNamePopupWindowId = sub_8198AA4(0, 1, 1, 10, 3, 14, 0x107);
+ return sMapNamePopupWindowId;
}
u8 GetMapNamePopUpWindowId(void)
{
- return gUnknown_0203CD8D;
+ return sMapNamePopupWindowId;
}
void RemoveMapNamePopUpWindow(void)
{
- if (gUnknown_0203CD8D != 0xFF)
+ if (sMapNamePopupWindowId != 0xFF)
{
- RemoveWindow(gUnknown_0203CD8D);
- gUnknown_0203CD8D = 0xFF;
+ RemoveWindow(sMapNamePopupWindowId);
+ sMapNamePopupWindowId = 0xFF;
}
}
@@ -910,7 +910,7 @@ u8 sub_8198348(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numC
else
gUnknown_0203CD90.cursorPos = pos;
- MoveMenuCursor(0);
+ Menu_MoveCursor(0);
return gUnknown_0203CD90.cursorPos;
}
@@ -935,7 +935,7 @@ void RedrawMenuCursor(u8 oldPos, u8 newPos)
AddTextPrinterParameterized(gUnknown_0203CD90.windowId, gUnknown_0203CD90.fontId, gText_SelectorArrow3, gUnknown_0203CD90.left, gUnknown_0203CD90.optionHeight * newPos + gUnknown_0203CD90.top, 0, 0);
}
-u8 MoveMenuCursor(s8 cursorDelta)
+u8 Menu_MoveCursor(s8 cursorDelta)
{
u8 oldPos = gUnknown_0203CD90.cursorPos;
int newPos = gUnknown_0203CD90.cursorPos + cursorDelta;
@@ -951,7 +951,7 @@ u8 MoveMenuCursor(s8 cursorDelta)
return gUnknown_0203CD90.cursorPos;
}
-u8 MoveMenuCursorNoWrapAround(s8 cursorDelta)
+u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta)
{
u8 oldPos = gUnknown_0203CD90.cursorPos;
int newPos = gUnknown_0203CD90.cursorPos + cursorDelta;
@@ -967,7 +967,7 @@ u8 MoveMenuCursorNoWrapAround(s8 cursorDelta)
return gUnknown_0203CD90.cursorPos;
}
-u8 GetMenuCursorPos(void)
+u8 Menu_GetCursorPos(void)
{
return gUnknown_0203CD90.cursorPos;
}
@@ -987,13 +987,13 @@ s8 Menu_ProcessInput(void)
else if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
return MENU_NOTHING_CHOSEN;
}
else if (gMain.newKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
return MENU_NOTHING_CHOSEN;
}
@@ -1016,13 +1016,13 @@ s8 Menu_ProcessInputNoWrap(void)
}
else if (gMain.newKeys & DPAD_UP)
{
- if (oldPos != MoveMenuCursorNoWrapAround(-1))
+ if (oldPos != Menu_MoveCursorNoWrapAround(-1))
PlaySE(SE_SELECT);
return MENU_NOTHING_CHOSEN;
}
else if (gMain.newKeys & DPAD_DOWN)
{
- if (oldPos != MoveMenuCursorNoWrapAround(1))
+ if (oldPos != Menu_MoveCursorNoWrapAround(1))
PlaySE(SE_SELECT);
return MENU_NOTHING_CHOSEN;
}
@@ -1045,13 +1045,13 @@ s8 ProcessMenuInput_other(void)
else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(-1);
+ Menu_MoveCursor(-1);
return MENU_NOTHING_CHOSEN;
}
else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
{
PlaySE(SE_SELECT);
- MoveMenuCursor(1);
+ Menu_MoveCursor(1);
return MENU_NOTHING_CHOSEN;
}
@@ -1074,13 +1074,13 @@ s8 Menu_ProcessInputNoWrapAround_other(void)
}
else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
{
- if (oldPos != MoveMenuCursorNoWrapAround(-1))
+ if (oldPos != Menu_MoveCursorNoWrapAround(-1))
PlaySE(SE_SELECT);
return MENU_NOTHING_CHOSEN;
}
else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
{
- if (oldPos != MoveMenuCursorNoWrapAround(1))
+ if (oldPos != Menu_MoveCursorNoWrapAround(1))
PlaySE(SE_SELECT);
return MENU_NOTHING_CHOSEN;
}
@@ -1588,7 +1588,7 @@ u8 InitMenuInUpperLeftCorner(u8 windowId, u8 itemCount, u8 initialCursorPos, boo
else
gUnknown_0203CD90.cursorPos = pos;
- return MoveMenuCursor(0);
+ return Menu_MoveCursor(0);
}
u8 InitMenuInUpperLeftCornerPlaySoundWhenAPressed(u8 windowId, u8 itemCount, u8 initialCursorPos)
@@ -1797,9 +1797,9 @@ bool8 free_temp_tile_data_buffers_if_possible(void)
}
}
-void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, int size, u16 offset, u8 mode)
+void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
{
- int sizeOut;
+ u32 sizeOut;
if (gUnknown_0203CDA8 < ARRAY_COUNT(gUnknown_0203CDAC))
{
void *ptr = malloc_and_decompress(src, &sizeOut);
@@ -1815,9 +1815,9 @@ void *decompress_and_copy_tile_data_to_vram(u8 bgId, const void *src, int size,
return NULL;
}
-void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, int size, u16 offset, u8 mode)
+void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode)
{
- int sizeOut;
+ u32 sizeOut;
void *ptr = malloc_and_decompress(src, &sizeOut);
if (!size)
size = sizeOut;
@@ -1838,7 +1838,7 @@ void task_free_buf_after_copying_tile_data_to_vram(u8 taskId)
}
}
-void *malloc_and_decompress(const void *src, int *size)
+void *malloc_and_decompress(const void *src, u32 *size)
{
void *ptr;
u8 *sizeAsBytes = (u8 *)size;
@@ -1934,8 +1934,8 @@ void sub_8199D98(void)
void sub_8199DF0(u32 bg, u8 a1, int a2, int a3)
{
- int temp = (!GetBgAttribute(bg, 4)) ? 0x20 : 0x40;
- void *addr = (void *)((GetBgAttribute(bg, 1) * 0x4000) + (GetBgAttribute(bg, 10) + a2) * temp);
+ int temp = (!GetBgAttribute(bg, BG_ATTR_PALETTEMODE)) ? 0x20 : 0x40;
+ void *addr = (void *)((GetBgAttribute(bg, BG_ATTR_CHARBASEINDEX) * 0x4000) + (GetBgAttribute(bg, BG_ATTR_BASETILE) + a2) * temp);
RequestDma3Fill(a1 << 24 | a1 << 16 | a1 << 8 | a1, addr + VRAM, a3 * temp, 1);
}
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
index a3c0be36a..0adc6228e 100644
--- a/src/menu_helpers.c
+++ b/src/menu_helpers.c
@@ -394,8 +394,8 @@ void sub_8122298(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3, u8 arg4)
void LoadListMenuArrowsGfx(void)
{
- LoadCompressedObjectPic(&gUnknown_0859F514);
- LoadCompressedObjectPalette(&gUnknown_0859F51C);
+ LoadCompressedSpriteSheet(&gUnknown_0859F514);
+ LoadCompressedSpritePalette(&gUnknown_0859F51C);
}
void sub_8122344(u8 *spriteIds, u8 count)
diff --git a/src/mirage_tower.c b/src/mirage_tower.c
new file mode 100644
index 000000000..a8dd5d9de
--- /dev/null
+++ b/src/mirage_tower.c
@@ -0,0 +1,868 @@
+#include "global.h"
+#include "alloc.h"
+#include "bg.h"
+#include "event_data.h"
+#include "event_object_movement.h"
+#include "field_camera.h"
+#include "fieldmap.h"
+#include "gpu_regs.h"
+#include "menu.h"
+#include "random.h"
+#include "roulette_util.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "window.h"
+#include "constants/flags.h"
+#include "constants/maps.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+
+struct MirageTowerPulseBlend {
+ u8 taskId;
+ struct PulseBlend pulseBlend;
+};
+
+struct MetatileCoords
+{
+ u8 x;
+ u8 y;
+ u16 metatileId;
+};
+
+struct BgRegOffsets
+{
+ u16 bgHOFS;
+ u16 bgVOFS;
+};
+
+struct Struct203CF10
+{
+ u8 *buffer;
+ u8 currIndex;
+};
+
+struct DynamicSpriteFrameImage
+{
+ u8 *data;
+ u16 size;
+};
+
+struct Struct203CF0C
+{
+ u8 *frameImageTiles;
+ struct DynamicSpriteFrameImage *frameImage;
+ u8 spriteId;
+ u16 *unkC;
+ u16 unk10;
+};
+
+#define MIRAGE_TOWER_GFX_LENGTH (sizeof(sBlankTile_Gfx) + sizeof(sMirageTower_Gfx))
+#define ROOT_FOSSIL_GFX_LENGTH sizeof(sRootFossil_Gfx)
+#define ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH 0x100
+
+// extern data
+extern const struct SpriteSheet gMirageTowerCeilingCrumbleSpriteSheets[];
+extern const s16 sCeilingCrumblePositions[][3];
+
+// static functions
+static void PlayerDescendMirageTower(u8 taskId);
+static void DoScreenShake(u8 taskId);
+static void IncrementCeilingCrumbleFinishedCount(void);
+static void WaitCeilingCrumble(u8 taskId);
+static void FinishCeilingCrumbleTask(u8 taskId);
+static void CreateCeilingCrumbleSprites(void);
+static void MoveCeilingCrumbleSprite(struct Sprite* sprite);
+static void DoMirageTowerDisintegration(u8 taskId);
+static void InitMirageTowerShake(u8 taskId);
+static void DoFossilFallAndSink(u8 taskId);
+static void sub_81BF248(struct Sprite *);
+static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e);
+
+// rodata
+static const u8 sBlankTile_Gfx[32] = {0};
+static const u8 sMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp");
+static const u16 sMirageTowerTilemap[] = INCBIN_U16("graphics/misc/mirage_tower.bin");
+static const u16 sRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal");
+static const u8 sRootFossil_Gfx[] = INCBIN_U8("graphics/misc/fossil.4bpp");
+static const u8 sMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower_crumbles.4bpp");
+static const u16 sMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal");
+
+const s16 sCeilingCrumblePositions[][3] =
+{
+ { 0, 10, 65},
+ { 17, 3, 50},
+ {-12, 0, 75},
+ { 10, 15, 90},
+ { 7, 8, 65},
+ {-18, 5, 75},
+ { 22, -10, 55},
+ {-24, -4, 65},
+};
+
+const struct SpriteSheet gMirageTowerCeilingCrumbleSpriteSheets[] =
+{
+ {sMirageTowerCrumbles_Gfx, 0x0080, 4000},
+ {NULL}
+};
+
+static const struct MetatileCoords sInvisibleMirageTowerMetatiles[] =
+{
+ {18, 53, 0x251},
+ {19, 53, 0x251},
+ {20, 53, 0x251},
+ {18, 54, 0x251},
+ {19, 54, 0x251},
+ {20, 54, 0x251},
+ {18, 55, 0x251},
+ {19, 55, 0x251},
+ {20, 55, 0x251},
+ {18, 56, 0x251},
+ {19, 56, 0x251},
+ {20, 56, 0x251},
+ {18, 57, 0x259},
+ {19, 57, 0x259},
+ {20, 57, 0x259},
+ {18, 58, 0x121},
+ {19, 58, 0x121},
+ {20, 58, 0x121},
+};
+
+static const union AnimCmd gSpriteAnim_8617DEC[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const struct OamData gOamData_8617DF4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 3,
+ .affineParam = 0,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8617DFC[] =
+{
+ gSpriteAnim_8617DEC,
+};
+
+static const struct SpriteTemplate gUnknown_08617E00 =
+{
+ 0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+const struct PulseBlendSettings gMirageTowerPulseBlendSettings = {
+ .blendColor = RGB(27, 25, 16),
+ .paletteOffset = 0x61,
+ .numColors = 15,
+ .delay = 5,
+ .numFadeCycles = -1,
+ .maxBlendCoeff = 11,
+ .fadeType = 1,
+ .restorePaletteOnUnload = FALSE,
+ .unk7_7 = 1,
+};
+
+static const union AnimCmd sCeilingCrumble2AnimCmd[] =
+{
+ ANIMCMD_FRAME(0, 12),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sCeilingCrumble2AnimCmds[] =
+{
+ sCeilingCrumble2AnimCmd,
+};
+
+static const struct OamData sCeilingCrumble2OamData =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct SpriteTemplate sCeilingCrumbleSpriteTemplate2 = {
+ .tileTag = 4000,
+ .paletteTag = 0xFFFF,
+ .oam = &sCeilingCrumble2OamData,
+ .anims = sCeilingCrumble2AnimCmds,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = MoveCeilingCrumbleSprite
+};
+
+static const union AnimCmd sCeilingCrumble1AnimCmd[] =
+{
+ ANIMCMD_FRAME(0, 12),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sCeilingCrumble1AnimCmds[] =
+{
+ sCeilingCrumble1AnimCmd,
+};
+
+static const struct OamData sCeilingCrumble1OamData =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct SpriteTemplate sCeilingCrumbleSpriteTemplate1 = {
+ .tileTag = 4000,
+ .paletteTag = 0xFFFF,
+ .oam = &sCeilingCrumble1OamData,
+ .anims = sCeilingCrumble1AnimCmds,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = MoveCeilingCrumbleSprite
+};
+
+EWRAM_DATA static u8* sMirageTowerGfxBuffer = NULL;
+EWRAM_DATA static u8* sMirageTowerTilemapBuffer = NULL;
+EWRAM_DATA static struct Struct203CF0C *sUnknown_0203CF0C = NULL;
+EWRAM_DATA static struct Struct203CF10 *sUnknown_0203CF10 = NULL;
+EWRAM_DATA static struct BgRegOffsets *sBgShakeOffsets = NULL;
+EWRAM_DATA struct MirageTowerPulseBlend *sMirageTowerPulseBlend = NULL;
+
+IWRAM_DATA static u16 gUnknown_030012A8[8];
+
+bool8 IsMirageTowerVisible(void)
+{
+ if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE111) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE111)))
+ return FALSE;
+ return FlagGet(FLAG_MIRAGE_TOWER_VISIBLE);
+}
+
+static void UpdateMirageTowerPulseBlend(u8 taskId)
+{
+ UpdatePulseBlend(&sMirageTowerPulseBlend->pulseBlend);
+}
+
+void ClearMirageTowerPulseBlend(void)
+{
+ sMirageTowerPulseBlend = NULL;
+}
+
+void TryStartMirageTowerPulseBlendEffect(void)
+{
+ if (sMirageTowerPulseBlend)
+ {
+ sMirageTowerPulseBlend = NULL;
+ return;
+ }
+
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(ROUTE111)
+ || gSaveBlock1Ptr->location.mapNum != MAP_NUM(ROUTE111)
+ || !FlagGet(FLAG_MIRAGE_TOWER_VISIBLE))
+ return;
+
+ sMirageTowerPulseBlend = AllocZeroed(sizeof(*sMirageTowerPulseBlend));
+ InitPulseBlend(&sMirageTowerPulseBlend->pulseBlend);
+ InitPulseBlendPaletteSettings(&sMirageTowerPulseBlend->pulseBlend, &gMirageTowerPulseBlendSettings);
+ MarkUsedPulseBlendPalettes(&sMirageTowerPulseBlend->pulseBlend, 0x1, TRUE);
+ sMirageTowerPulseBlend->taskId = CreateTask(UpdateMirageTowerPulseBlend, 0xFF);
+}
+
+void ClearMirageTowerPulseBlendEffect(void)
+{
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(ROUTE111)
+ || gSaveBlock1Ptr->location.mapNum != MAP_NUM(ROUTE111)
+ || !FlagGet(FLAG_MIRAGE_TOWER_VISIBLE)
+ || sMirageTowerPulseBlend == NULL)
+ return;
+
+ if (FuncIsActiveTask(UpdateMirageTowerPulseBlend))
+ DestroyTask(sMirageTowerPulseBlend->taskId);
+
+ UnmarkUsedPulseBlendPalettes(&sMirageTowerPulseBlend->pulseBlend, 0x1, TRUE);
+ UnloadUsedPulseBlendPalettes(&sMirageTowerPulseBlend->pulseBlend, 0x1, TRUE);
+ FREE_AND_SET_NULL(sMirageTowerPulseBlend);
+}
+
+void SetMirageTowerVisibility(void)
+{
+ u16 rand;
+ bool8 visible;
+
+ if (VarGet(VAR_0x40CB))
+ {
+ FlagClear(FLAG_MIRAGE_TOWER_VISIBLE);
+ return;
+ }
+
+ rand = Random();
+ visible = rand & 1;
+ if (FlagGet(FLAG_FORCE_MIRAGE_TOWER_VISIBLE) == TRUE)
+ visible = TRUE;
+
+ if (visible)
+ {
+ FlagSet(FLAG_MIRAGE_TOWER_VISIBLE);
+ TryStartMirageTowerPulseBlendEffect();
+ return;
+ }
+
+ FlagClear(FLAG_MIRAGE_TOWER_VISIBLE);
+}
+
+void StartPlayerDescendMirageTower(void)
+{
+ CreateTask(PlayerDescendMirageTower, 8);
+}
+
+static void PlayerDescendMirageTower(u8 taskId)
+{
+ u8 eventObjectId;
+ struct EventObject *fakePlayerEventObject;
+ struct EventObject *playerEventObject;
+
+ TryGetEventObjectIdByLocalIdAndMap(45, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectId);
+ fakePlayerEventObject = &gEventObjects[eventObjectId];
+ gSprites[fakePlayerEventObject->spriteId].pos2.y += 4;
+ playerEventObject = &gEventObjects[gPlayerAvatar.eventObjectId];
+ if ((gSprites[fakePlayerEventObject->spriteId].pos1.y + gSprites[fakePlayerEventObject->spriteId].pos2.y) >=
+ (gSprites[playerEventObject->spriteId].pos1.y + gSprites[playerEventObject->spriteId].pos2.y))
+ {
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}
+
+static void StartScreenShake(u8 yShakeOffset, u8 xShakeOffset, u8 numShakes, u8 shakeDelay)
+{
+ u8 taskId = CreateTask(DoScreenShake, 9);
+ gTasks[taskId].data[0] = xShakeOffset;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = numShakes;
+ gTasks[taskId].data[3] = shakeDelay;
+ gTasks[taskId].data[4] = yShakeOffset;
+ SetCameraPanningCallback(NULL);
+ PlaySE(SE_W070);
+}
+
+static void DoScreenShake(u8 taskId)
+{
+ s16 *data;
+
+ data = gTasks[taskId].data;
+ data[1]++;
+ if (data[1] % data[3] == 0)
+ {
+ data[1] = 0;
+ data[2]--;
+ data[0] = -data[0];
+ data[4] = -data[4];
+ SetCameraPanning(data[0], data[4]);
+ if (data[2] == 0)
+ {
+ IncrementCeilingCrumbleFinishedCount();
+ DestroyTask(taskId);
+ InstallCameraPanAheadCallback();
+ }
+ }
+}
+
+static void IncrementCeilingCrumbleFinishedCount(void)
+{
+ u8 taskId = FindTaskIdByFunc(WaitCeilingCrumble);
+ if (taskId != 0xFF)
+ gTasks[taskId].data[0]++;
+}
+
+void DoMirageTowerCeilingCrumble(void)
+{
+ LoadSpriteSheets(gMirageTowerCeilingCrumbleSpriteSheets);
+ CreateCeilingCrumbleSprites();
+ CreateTask(WaitCeilingCrumble, 8);
+ StartScreenShake(2, 1, 16, 3);
+}
+
+static void WaitCeilingCrumble(u8 taskId)
+{
+ u16 *data = gTasks[taskId].data;
+ data[1]++;
+ // Either wait 1000 frames, or until all 16 crumble sprites and the one screen-shake task are completed.
+ if (data[1] == 1000 || data[0] == 17)
+ gTasks[taskId].func = FinishCeilingCrumbleTask;
+}
+
+static void FinishCeilingCrumbleTask(u8 taskId)
+{
+ FreeSpriteTilesByTag(4000);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+static void CreateCeilingCrumbleSprites(void)
+{
+ u8 i;
+ u8 spriteId;
+
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sCeilingCrumbleSpriteTemplate1, sCeilingCrumblePositions[i][0] + 120, sCeilingCrumblePositions[i][1], 8);
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].oam.paletteNum = 0;
+ gSprites[spriteId].data[0] = i;
+ }
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sCeilingCrumbleSpriteTemplate2, sCeilingCrumblePositions[i][0] + 115, sCeilingCrumblePositions[i][1] - 3, 8);
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].oam.paletteNum = 0;
+ gSprites[spriteId].data[0] = i;
+ }
+}
+
+static void MoveCeilingCrumbleSprite(struct Sprite* sprite)
+{
+ sprite->data[1] += 2;
+ sprite->pos2.y = sprite->data[1] / 2;
+ if(((sprite->pos1.y) + (sprite->pos2.y)) > sCeilingCrumblePositions[sprite->data[0]][2])
+ {
+ DestroySprite(sprite);
+ IncrementCeilingCrumbleFinishedCount();
+ }
+}
+
+static void SetInvisibleMirageTowerMetatiles(void)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sInvisibleMirageTowerMetatiles); i++)
+ MapGridSetMetatileIdAt(sInvisibleMirageTowerMetatiles[i].x + 7, sInvisibleMirageTowerMetatiles[i].y + 7, sInvisibleMirageTowerMetatiles[i].metatileId);
+ DrawWholeMapView();
+}
+
+void StartMirageTowerDisintegration(void)
+{
+ CreateTask(DoMirageTowerDisintegration, 9);
+}
+
+void StartMirageTowerShake(void)
+{
+ CreateTask(InitMirageTowerShake, 9);
+}
+
+void StartMirageTowerFossilFallAndSink(void)
+{
+ CreateTask(DoFossilFallAndSink, 9);
+}
+
+static void SetBgShakeOffsets(void)
+{
+ SetGpuReg(REG_OFFSET_BG0HOFS, sBgShakeOffsets->bgHOFS);
+ SetGpuReg(REG_OFFSET_BG0VOFS, sBgShakeOffsets->bgVOFS);
+}
+
+static void UpdateBgShake(u8 taskId)
+{
+ if (!gTasks[taskId].data[0])
+ {
+ sBgShakeOffsets->bgHOFS = -sBgShakeOffsets->bgHOFS;
+ gTasks[taskId].data[0] = 2;
+ SetBgShakeOffsets();
+ }
+ else
+ {
+ gTasks[taskId].data[0]--;
+ }
+}
+
+static void InitMirageTowerShake(u8 taskId)
+{
+ u8 zero;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ FreeAllWindowBuffers();
+ SetBgAttribute(0, BG_ATTR_PRIORITY, 2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ sMirageTowerGfxBuffer = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH);
+ sMirageTowerTilemapBuffer = (u8 *)AllocZeroed(BG_SCREEN_SIZE);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ CpuSet(sBlankTile_Gfx, sMirageTowerGfxBuffer, MIRAGE_TOWER_GFX_LENGTH / 2);
+ LoadBgTiles(0, sMirageTowerGfxBuffer, MIRAGE_TOWER_GFX_LENGTH, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ SetBgTilemapBuffer(0, sMirageTowerTilemapBuffer);
+ CopyToBgTilemapBufferRect_ChangePalette(0, &sMirageTowerTilemap, 12, 29, 6, 12, 17);
+ CopyBgTilemapBufferToVram(0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ ShowBg(0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 5:
+ SetInvisibleMirageTowerMetatiles();
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ sBgShakeOffsets = Alloc(sizeof(*sBgShakeOffsets));
+ zero = 0;
+ sBgShakeOffsets->bgHOFS = 2;
+ sBgShakeOffsets->bgVOFS = zero;
+ CreateTask(UpdateBgShake, 10);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+}
+
+#define OUTER_BUFFER_LENGTH 0x60
+#define INNER_BUFFER_LENGTH 0x30
+static void DoMirageTowerDisintegration(u8 taskId)
+{
+ u8 bgShakeTaskId, j;
+ u16 i;
+ u8 index;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 1:
+ sUnknown_0203CF10 = AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10));
+ break;
+ case 3:
+ if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
+ {
+ if (gTasks[taskId].data[1] > 1)
+ {
+ index = gTasks[taskId].data[3];
+ sUnknown_0203CF10[index].buffer = Alloc(INNER_BUFFER_LENGTH);
+ for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
+ sUnknown_0203CF10[index].buffer[i] = i;
+ for (i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
+ {
+ u16 rand1, rand2, temp;
+
+ rand1 = Random() % 0x30;
+ rand2 = Random() % 0x30;
+ SWAP(sUnknown_0203CF10[index].buffer[rand2], sUnknown_0203CF10[index].buffer[rand1], temp);
+ }
+ if (gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
+ gTasks[taskId].data[3]++;
+ gTasks[taskId].data[1] = 0;
+ }
+ gTasks[taskId].data[1]++;
+ }
+ index = gTasks[taskId].data[3];
+ for (i = (u8)(gTasks[taskId].data[2]); i < index; i++)
+ {
+ for (j = 0; j < 1; j++)
+ {
+ sub_81BF2B8(sMirageTowerGfxBuffer,
+ ((((OUTER_BUFFER_LENGTH - 1) - i) * INNER_BUFFER_LENGTH) + sUnknown_0203CF10[i].buffer[(sUnknown_0203CF10[i].currIndex)++]),
+ 0, INNER_BUFFER_LENGTH, 1);
+ }
+ if (sUnknown_0203CF10[i].currIndex > (INNER_BUFFER_LENGTH - 1))
+ {
+ FREE_AND_SET_NULL(sUnknown_0203CF10[i].buffer);
+ gTasks[taskId].data[2]++;
+ if ((i % 2) == 1)
+ sBgShakeOffsets->bgVOFS--;
+ }
+ }
+ LoadBgTiles(0, sMirageTowerGfxBuffer, MIRAGE_TOWER_GFX_LENGTH, 0);
+ if (sUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].currIndex > (INNER_BUFFER_LENGTH - 1))
+ break;
+ return;
+ case 4:
+ UnsetBgTilemapBuffer(0);
+ bgShakeTaskId = FindTaskIdByFunc(UpdateBgShake);
+ if (bgShakeTaskId != 0xFF)
+ DestroyTask(bgShakeTaskId);
+ sBgShakeOffsets->bgVOFS = sBgShakeOffsets->bgHOFS = 0;
+ SetBgShakeOffsets();
+ break;
+ case 5:
+ FREE_AND_SET_NULL(sBgShakeOffsets);
+ FREE_AND_SET_NULL(sUnknown_0203CF10);
+ FREE_AND_SET_NULL(sMirageTowerGfxBuffer);
+ FREE_AND_SET_NULL(sMirageTowerTilemapBuffer);
+ break;
+ case 6:
+ SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2));
+ SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0));
+ SetBgAttribute(0, BG_ATTR_PRIORITY, 0);
+ InitStandardTextBoxWindows();
+ break;
+ case 7:
+ ShowBg(0);
+ break;
+ case 8:
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+ gTasks[taskId].data[0]++;
+}
+
+static void DoFossilFallAndSink(u8 taskId)
+{
+ u16 i;
+ u8 *buffer;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 1:
+ sUnknown_0203CF0C = AllocZeroed(sizeof(*sUnknown_0203CF0C));
+ sUnknown_0203CF0C->frameImageTiles = AllocZeroed(ROOT_FOSSIL_GFX_LENGTH);
+ sUnknown_0203CF0C->frameImage = AllocZeroed(sizeof(*sUnknown_0203CF0C->frameImage));
+ sUnknown_0203CF0C->unkC = AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16));
+ sUnknown_0203CF0C->unk10 = 0;
+ break;
+ case 2:
+ buffer = sUnknown_0203CF0C->frameImageTiles;
+ for (i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++)
+ *buffer = sRootFossil_Gfx[i];
+ break;
+ case 3:
+ sUnknown_0203CF0C->frameImage->data = sUnknown_0203CF0C->frameImageTiles;
+ sUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH;
+ break;
+ case 4:
+ {
+ struct SpriteTemplate fossilTemplate;
+
+ fossilTemplate = gUnknown_08617E00;
+ fossilTemplate.images = (struct SpriteFrameImage *)(sUnknown_0203CF0C->frameImage);
+ sUnknown_0203CF0C->spriteId = CreateSprite(&fossilTemplate, 128, -16, 1);
+ gSprites[sUnknown_0203CF0C->spriteId].centerToCornerVecX = 0;
+ gSprites[sUnknown_0203CF0C->spriteId].data[0] = gSprites[sUnknown_0203CF0C->spriteId].pos1.x;
+ gSprites[sUnknown_0203CF0C->spriteId].data[1] = 1;
+ }
+ case 5:
+ for (i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++)
+ sUnknown_0203CF0C->unkC[i] = i;
+ break;
+ case 6:
+ for (i = 0; i < (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)); i++)
+ {
+ u16 rand1, rand2, temp;
+
+ rand1 = Random() % 0x100;
+ rand2 = Random() % 0x100;
+ SWAP(sUnknown_0203CF0C->unkC[rand2], sUnknown_0203CF0C->unkC[rand1], temp);
+ }
+ gSprites[sUnknown_0203CF0C->spriteId].callback = sub_81BF248;
+ break;
+ case 7:
+ if (gSprites[sUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy)
+ return;
+ DestroySprite(&gSprites[sUnknown_0203CF0C->spriteId]);
+ FREE_AND_SET_NULL(sUnknown_0203CF0C->unkC);;
+ FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImage);
+ FREE_AND_SET_NULL(sUnknown_0203CF0C->frameImageTiles);
+ FREE_AND_SET_NULL(sUnknown_0203CF0C);
+ break;
+ case 8:
+ EnableBothScriptContexts();
+ break;
+ }
+
+ gTasks[taskId].data[0]++;
+}
+
+static void sub_81BF248(struct Sprite *sprite)
+{
+ if (sUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH))
+ {
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else if (sprite->pos1.y >= 96)
+ {
+ u8 i;
+ for (i = 0; i < 2; i++)
+ sub_81BF2B8(sUnknown_0203CF0C->frameImageTiles, sUnknown_0203CF0C->unkC[sUnknown_0203CF0C->unk10++], 0, 16, 0);
+
+ StartSpriteAnim(sprite, 0);
+ }
+ else
+ {
+ sprite->pos1.y++;
+ }
+}
+
+#ifdef NONMATCHING
+static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e)
+{
+ u8 r5, r4, r0, r2;
+ u16 var;
+
+ r4 = r5 = b / d;
+ gUnknown_030012A8[0] = r4;
+
+ r0 = r2 = b % d;
+ gUnknown_030012A8[1] = r2;
+
+ r4 &= 7;
+ r2 &= 7;
+ gUnknown_030012A8[2] = r4;
+ gUnknown_030012A8[3] = r2;
+
+ r0 /= 8;
+ r5 /= 8;
+ gUnknown_030012A8[4] = r0;
+ gUnknown_030012A8[5] = r5;
+
+ var = ((d / 8) * (r5 * 64)) + (r0 * 64);
+ gUnknown_030012A8[6] = var;
+
+ var += (r4 * 8) + r2;
+ gUnknown_030012A8[7] = var;
+
+ // This part is non-matching. 99% sure it IS functionally equivalent, though.
+ b = (b & 1) ^ 1;
+ c = (c << ((b) << 2)) | (15 << ((b ^ 1) << 2));
+
+ a[(var / 2) + (e * 32)] &= c;
+}
+
+#else
+NAKED
+static void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x8\n\
+ str r0, [sp]\n\
+ mov r10, r1\n\
+ adds r6, r2, 0\n\
+ mov r8, r3\n\
+ ldr r0, [sp, 0x28]\n\
+ mov r9, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ mov r10, r1\n\
+ lsls r6, 24\n\
+ lsrs r6, 24\n\
+ mov r0, r8\n\
+ lsls r0, 24\n\
+ mov r8, r0\n\
+ lsrs r7, r0, 24\n\
+ mov r1, r9\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r9, r1\n\
+ mov r0, r10\n\
+ adds r1, r7, 0\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ lsls r5, 24\n\
+ lsrs r4, r5, 24\n\
+ ldr r3, =gUnknown_030012A8\n\
+ strh r4, [r3]\n\
+ mov r0, r10\n\
+ adds r1, r7, 0\n\
+ str r3, [sp, 0x4]\n\
+ bl __modsi3\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ ldr r3, [sp, 0x4]\n\
+ strh r2, [r3, 0x2]\n\
+ movs r1, 0x7\n\
+ ands r4, r1\n\
+ ands r2, r1\n\
+ strh r4, [r3, 0x4]\n\
+ strh r2, [r3, 0x6]\n\
+ lsrs r0, 27\n\
+ lsrs r5, 27\n\
+ strh r0, [r3, 0x8]\n\
+ strh r5, [r3, 0xA]\n\
+ mov r1, r8\n\
+ lsrs r1, 27\n\
+ lsls r1, 6\n\
+ mov r8, r1\n\
+ mov r1, r8\n\
+ muls r1, r5\n\
+ lsls r0, 6\n\
+ adds r1, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ strh r1, [r3, 0xC]\n\
+ lsls r4, 3\n\
+ adds r4, r2\n\
+ adds r1, r4\n\
+ lsls r4, r1, 16\n\
+ lsrs r4, 17\n\
+ strh r1, [r3, 0xE]\n\
+ movs r1, 0x1\n\
+ mov r0, r10\n\
+ ands r1, r0\n\
+ movs r2, 0x1\n\
+ eors r1, r2\n\
+ lsls r0, r1, 2\n\
+ lsls r6, r0\n\
+ eors r1, r2\n\
+ lsls r1, 2\n\
+ movs r0, 0xF\n\
+ lsls r0, r1\n\
+ orrs r6, r0\n\
+ lsls r6, 24\n\
+ lsrs r6, 24\n\
+ mov r1, r9\n\
+ lsls r1, 5\n\
+ mov r9, r1\n\
+ add r9, r4\n\
+ ldr r1, [sp]\n\
+ add r1, r9\n\
+ ldrb r0, [r1]\n\
+ ands r6, r0\n\
+ strb r6, [r1]\n\
+ add sp, 0x8\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n\
+ ");
+}
+#endif // NONMATCHING
diff --git a/src/mon_markings.c b/src/mon_markings.c
index 30015dbef..48f0f5ecb 100644
--- a/src/mon_markings.c
+++ b/src/mon_markings.c
@@ -390,7 +390,6 @@ void sub_811FAF8(void)
}
}
-
bool8 sub_811FBA4(void)
{
u16 i;
diff --git a/src/money.c b/src/money.c
index a347f818d..faf830637 100644
--- a/src/money.c
+++ b/src/money.c
@@ -186,8 +186,8 @@ void HideMoneyBox(void)
void AddMoneyLabelObject(u16 x, u16 y)
{
- LoadCompressedObjectPic(&sSpriteSheet_MoneyLabel);
- LoadCompressedObjectPalette(&sSpritePalette_MoneyLabel);
+ LoadCompressedSpriteSheet(&sSpriteSheet_MoneyLabel);
+ LoadCompressedSpritePalette(&sSpritePalette_MoneyLabel);
sMoneyLabelSpriteId = CreateSprite(&sSpriteTemplate_MoneyLabel, x, y, 0);
}
diff --git a/src/mossdeep_gym.c b/src/mossdeep_gym.c
index 07920fe4c..d8adbe0c6 100644
--- a/src/mossdeep_gym.c
+++ b/src/mossdeep_gym.c
@@ -5,6 +5,7 @@
#include "mossdeep_gym.h"
#include "script_movement.h"
#include "constants/event_object_movement_constants.h"
+#include "constants/event_objects.h"
// Movement scripts.
extern const u8 gUnknown_08612698[];
@@ -52,7 +53,7 @@ void FinishMossdeepGymTiles(void)
if (gUnknown_0203CE50 != NULL)
FREE_AND_SET_NULL(gUnknown_0203CE50);
- id = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
+ id = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0);
EventObjectClearHeldMovementIfFinished(&gEventObjects[id]);
sub_80D338C();
}
diff --git a/src/naming_screen.c b/src/naming_screen.c
index e6d146b85..c310ceb9f 100644
--- a/src/naming_screen.c
+++ b/src/naming_screen.c
@@ -362,7 +362,7 @@ static void NamingScreen_InitBGs(void)
ChangeBgX(3, 0, 0);
ChangeBgY(3, 0, 0);
- sub_81971D0();
+ InitStandardTextBoxWindows();
sub_8197200();
for (i = 0; i < 5; i++)
diff --git a/src/new_game.c b/src/new_game.c
index 4804b28f3..8ecd48bc7 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -27,6 +27,7 @@
#include "pokedex.h"
#include "apprentice.h"
#include "frontier_util.h"
+#include "constants/maps.h"
extern u16 gSaveFileStatus;
extern u8 gUnknown_030060B0;
@@ -135,7 +136,7 @@ static void ClearFrontierRecord(void)
static void WarpToTruck(void)
{
- Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck
+ SetWarpDestination(MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK), -1, -1, -1);
WarpIntoMap();
}
@@ -168,7 +169,7 @@ void NewGameInitData(void)
ClearFrontierRecord();
ClearSav1();
ClearMailData();
- gSaveBlock2Ptr->specialSaveWarp = 0;
+ gSaveBlock2Ptr->specialSaveWarpFlags = 0;
gSaveBlock2Ptr->field_A8 = 0;
InitPlayerTrainerId();
PlayTimeCounter_Reset();
diff --git a/src/overworld.c b/src/overworld.c
index 6998c9d98..ef424cff8 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -31,6 +31,7 @@
#include "map_name_popup.h"
#include "menu.h"
#include "metatile_behavior.h"
+#include "mirage_tower.h"
#include "money.h"
#include "new_game.h"
#include "palette.h"
@@ -56,8 +57,10 @@
#include "constants/abilities.h"
#include "constants/map_types.h"
#include "constants/maps.h"
+#include "constants/region_map_sections.h"
#include "constants/songs.h"
#include "constants/species.h"
+#include "constants/weather.h"
// event scripts
extern const u8 EventScript_WhiteOut[];
@@ -99,7 +102,6 @@ extern void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey);
extern void mapheader_run_script_with_tag_x5(void);
extern void ResetFieldTasksArgs(void);
extern void sub_80A0A2C(void);
-extern void not_trainer_hill_battle_pyramid(void);
extern void apply_map_tileset2_palette(const struct MapLayout *);
extern void copy_map_tileset2_to_vram_2(const struct MapLayout *);
extern void RestartWildEncounterImmunitySteps(void);
@@ -112,9 +114,7 @@ extern void sub_81AA1D8(void);
extern void c2_change_map(void);
extern void sub_81D5DF8(void);
extern void sub_80EB218(void);
-extern void sub_81BE72C(void);
extern void sub_80AF3C8(void);
-extern void sub_81971F4(void);
extern void sub_808B578(void);
extern void sub_80AF314(void);
extern void sub_80AF214(void);
@@ -125,17 +125,12 @@ extern void sub_80AF168(void);
extern void sub_80AF3C8(void);
extern void ExecuteTruckSequence(void);
extern void sub_80A0A38(void);
-extern void trainer_hill_map_load_related(void);
-extern void sub_8087D74(void);
-extern void battle_pyramid_map_load_related(u8);
extern void WriteFlashScanlineEffectBuffer(u8);
-extern void sub_80E9238(u8);
extern void sub_81AA2F8(void);
extern void sub_8195E10(void);
extern void sub_80EDB44(void);
extern void sub_81D64C0(void);
-extern void sub_81BE6AC(void);
-extern void sub_8098128(void);
+extern void InitFieldMessageBox(void);
extern void copy_map_tileset1_to_vram(const struct MapLayout *);
extern void copy_map_tileset2_to_vram(const struct MapLayout *);
extern void FieldUpdateBgTilemapScroll(void);
@@ -146,11 +141,9 @@ extern bool8 warp0_in_pokecenter(void);
extern void ResetAllPicSprites(void);
extern void FieldEffectActiveListClear(void);
extern void SetUpFieldTasks(void);
-extern void sub_81BE6B8(void);
extern void ShowStartMenu(void);
extern void sub_80AEE84(void);
extern void mapldr_default(void);
-extern void sub_8088B3C(u16, u16);
extern bool32 sub_800F0B8(void);
extern bool32 sub_8009F3C(void);
extern void sub_8010198(void);
@@ -341,7 +334,7 @@ const struct UCoords32 gDirectionToVectors[] =
},
};
-static const struct BgTemplate gUnknown_08339DAC[] =
+static const struct BgTemplate sOverworldBgTemplates[] =
{
{
.bg = 0,
@@ -435,7 +428,7 @@ void DoWhiteOut(void)
SetMoney(&gSaveBlock1Ptr->money, GetMoney(&gSaveBlock1Ptr->money) / 2);
HealPlayerParty();
Overworld_ResetStateAfterWhiteOut();
- Overworld_SetWarpDestToLastHealLoc();
+ SetWarpDestinationToLastHealLocation();
WarpIntoMap();
}
@@ -617,7 +610,7 @@ void ApplyCurrentWarp(void)
gFixedHoleWarp = sDummyWarpData;
}
-void set_warp2_warp3_to_neg_1(void)
+static void ClearDiveAndHoleWarps(void)
{
gFixedDiveWarp = sDummyWarpData;
gFixedHoleWarp = sDummyWarpData;
@@ -698,68 +691,66 @@ void WarpIntoMap(void)
SetPlayerCoordsFromWarp();
}
-void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+void SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
{
SetWarpData(&sWarpDestination, mapGroup, mapNum, warpId, x, y);
}
-void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId)
+void SetWarpDestinationToMapWarp(s8 mapGroup, s8 mapNum, s8 warpId)
{
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, -1, -1);
+ SetWarpDestination(mapGroup, mapNum, warpId, -1, -1);
}
-void saved_warp2_set(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId)
+void SetDynamicWarp(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId)
{
- SetWarpData(&gSaveBlock1Ptr->warp2, mapGroup, mapNum, warpId, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y);
+ SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y);
}
-void saved_warp2_set_2(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+void SetDynamicWarpWithCoords(s32 unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
{
- SetWarpData(&gSaveBlock1Ptr->warp2, mapGroup, mapNum, warpId, x, y);
+ SetWarpData(&gSaveBlock1Ptr->dynamicWarp, mapGroup, mapNum, warpId, x, y);
}
-void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused)
+void SetWarpDestinationToDynamicWarp(u8 unusedWarpId)
{
- sWarpDestination = gSaveBlock1Ptr->warp2;
+ sWarpDestination = gSaveBlock1Ptr->dynamicWarp;
}
-void sub_8084CCC(u8 a1)
+void SetWarpDestinationToHealLocation(u8 healLocationId)
{
- const struct HealLocation *warp = GetHealLocation(a1);
-
+ const struct HealLocation *warp = GetHealLocation(healLocationId);
if (warp)
- Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y);
+ SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y);
}
-void Overworld_SetWarpDestToLastHealLoc(void)
+void SetWarpDestinationToLastHealLocation(void)
{
sWarpDestination = gSaveBlock1Ptr->lastHealLocation;
}
-void Overworld_SetHealLocationWarp(u8 healLocationId)
+void SetLastHealLocationWarp(u8 healLocationId)
{
const struct HealLocation *healLocation = GetHealLocation(healLocationId);
-
- if (healLocation != NULL)
+ if (healLocation)
SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y);
}
-void sub_8084D5C(s16 a1, s16 a2)
+void UpdateEscapeWarp(s16 x, s16 y)
{
- u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation();
+ u8 currMapType = GetCurrentMapType();
u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum);
if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE)
- sub_8084DD4(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, a1 - 7, a2 - 6);
+ SetEscapeWarp(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x - 7, y - 6);
}
-void sub_8084DD4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+void SetEscapeWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
{
- SetWarpData(&gSaveBlock1Ptr->warp4, mapGroup, mapNum, warpId, x, y);
+ SetWarpData(&gSaveBlock1Ptr->escapeWarp, mapGroup, mapNum, warpId, x, y);
}
-void sub_8084E14(void)
+void SetWarpDestinationToEscapeWarp(void)
{
- sWarpDestination = gSaveBlock1Ptr->warp4;
+ sWarpDestination = gSaveBlock1Ptr->escapeWarp;
}
void SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
@@ -767,7 +758,7 @@ void SetFixedDiveWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
SetWarpData(&gFixedDiveWarp, mapGroup, mapNum, warpId, x, y);
}
-static void SetFixedDiveWarpAsDestination(void)
+static void SetWarpDestinationToDiveWarp(void)
{
sWarpDestination = gFixedDiveWarp;
}
@@ -777,34 +768,34 @@ void SetFixedHoleWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
SetWarpData(&gFixedHoleWarp, mapGroup, mapNum, warpId, x, y);
}
-void SetFixedHoleWarpAsDestination(s16 x, s16 y)
+void SetWarpDestinationToFixedHoleWarp(s16 x, s16 y)
{
if (IsDummyWarp(&gFixedHoleWarp) == TRUE)
sWarpDestination = gLastUsedWarp;
else
- Overworld_SetWarpDestination(gFixedHoleWarp.mapGroup, gFixedHoleWarp.mapNum, -1, x, y);
+ SetWarpDestination(gFixedHoleWarp.mapGroup, gFixedHoleWarp.mapNum, -1, x, y);
}
-void warp1_set_to_sav1w(void)
+static void SetWarpDestinationToContinueGameWarp(void)
{
- sWarpDestination = gSaveBlock1Ptr->warp1;
+ sWarpDestination = gSaveBlock1Ptr->continueGameWarp;
}
-void sub_8084F2C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
+void SetContinueGameWarp(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y)
{
- SetWarpData(&gSaveBlock1Ptr->warp1, mapGroup, mapNum, warpId, x, y);
+ SetWarpData(&gSaveBlock1Ptr->continueGameWarp, mapGroup, mapNum, warpId, x, y);
}
-void sub_8084F6C(u8 a1)
+void SetContinueGameWarpToHealLocation(u8 healLocationId)
{
- const struct HealLocation *warp = GetHealLocation(a1);
+ const struct HealLocation *warp = GetHealLocation(healLocationId);
if (warp)
- SetWarpData(&gSaveBlock1Ptr->warp1, warp->group, warp->map, -1, warp->x, warp->y);
+ SetWarpData(&gSaveBlock1Ptr->continueGameWarp, warp->group, warp->map, -1, warp->x, warp->y);
}
-void sub_8084FAC(int unused)
+void SetContinueGameWarpToDynamicWarp(int unused)
{
- gSaveBlock1Ptr->warp1 = gSaveBlock1Ptr->warp2;
+ gSaveBlock1Ptr->continueGameWarp = gSaveBlock1Ptr->dynamicWarp;
}
const struct MapConnection *GetMapConnection(u8 dir)
@@ -829,14 +820,14 @@ static bool8 SetDiveWarp(u8 dir, u16 x, u16 y)
if (connection != NULL)
{
- Overworld_SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y);
+ SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y);
}
else
{
mapheader_run_script_with_tag_x6();
if (IsDummyWarp(&gFixedDiveWarp))
return FALSE;
- SetFixedDiveWarpAsDestination();
+ SetWarpDestinationToDiveWarp();
}
return TRUE;
}
@@ -855,7 +846,7 @@ void mliX_load_map(u8 mapGroup, u8 mapNum)
{
s32 paletteIndex;
- Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1);
+ SetWarpDestination(mapGroup, mapNum, -1, -1, -1);
if (gMapHeader.regionMapSectionId != 0x3A)
sub_8085810();
@@ -873,7 +864,7 @@ void mliX_load_map(u8 mapGroup, u8 mapNum)
SetDefaultFlashLevel();
Overworld_ClearSavedMusic();
mapheader_run_script_with_tag_x3();
- not_trainer_hill_battle_pyramid();
+ InitMap();
copy_map_tileset2_to_vram_2(gMapHeader.mapLayout);
apply_map_tileset2_palette(gMapHeader.mapLayout);
@@ -887,7 +878,7 @@ void mliX_load_map(u8 mapGroup, u8 mapNum)
ResetFieldTasksArgs();
mapheader_run_script_with_tag_x5();
- if (gMapHeader.regionMapSectionId != 0x3A || gMapHeader.regionMapSectionId != sLastMapSectionId)
+ if (gMapHeader.regionMapSectionId != MAPSEC_BATTLE_FRONTIER || gMapHeader.regionMapSectionId != sLastMapSectionId)
ShowMapNamePopup();
}
@@ -928,15 +919,15 @@ static void mli0_load_map(u32 a1)
UpdateLocationHistoryForRoamer();
RoamerMoveToOtherLocationSet();
if (gMapHeader.mapLayoutId == 0x169)
- battle_pyramid_map_load_related(0);
+ InitBattlePyramidMap(0);
else if (InTrainerHill())
- trainer_hill_map_load_related();
+ InitTrainerHillMap();
else
- not_trainer_hill_battle_pyramid();
+ InitMap();
if (a1 != 1 && indoors)
{
- UpdateTVScreensOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height);
+ UpdateTVScreensOnMap(gBackupMapLayout.width, gBackupMapLayout.height);
sub_80E9238(1);
}
}
@@ -966,7 +957,7 @@ void StoreInitialPlayerAvatarState(void)
static struct InitialPlayerAvatarState *GetInitialPlayerAvatarState(void)
{
struct InitialPlayerAvatarState playerStruct;
- u8 mapType = Overworld_GetMapTypeOfSaveblockLocation();
+ u8 mapType = GetCurrentMapType();
u16 metatileBehavior = GetCenterScreenMetatileBehavior();
u8 transitionFlags = GetAdjustedInitialTransitionFlags(&gInitialPlayerAvatarState, metatileBehavior, mapType);
playerStruct.transitionFlags = transitionFlags;
@@ -1053,7 +1044,7 @@ u8 Overworld_GetFlashLevel(void)
return gSaveBlock1Ptr->flashLevel;
}
-void sub_8085524(u16 mapLayoutId)
+void SetCurrentMapLayout(u16 mapLayoutId)
{
gSaveBlock1Ptr->mapLayoutId = mapLayoutId;
gMapHeader.mapLayout = GetMapLayout();
@@ -1162,11 +1153,11 @@ u16 GetCurrLocationDefaultMusic(void)
// Play the desert music only when the sandstorm is active on Route 111.
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE111)
&& gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE111)
- && GetSav1Weather() == 8)
+ && GetSav1Weather() == WEATHER_SANDSTORM)
return MUS_ASHROAD;
music = GetLocationMusic(&gSaveBlock1Ptr->location);
- if (music != 0x7FFF)
+ if (music != MUS_ROUTE_118)
{
return music;
}
@@ -1182,7 +1173,7 @@ u16 GetCurrLocationDefaultMusic(void)
u16 GetWarpDestinationMusic(void)
{
u16 music = GetLocationMusic(&sWarpDestination);
- if (music != 0x7FFF)
+ if (music != MUS_ROUTE_118)
{
return music;
}
@@ -1209,7 +1200,7 @@ void Overworld_PlaySpecialMapMusic(void)
{
if (gSaveBlock1Ptr->savedMusic)
music = gSaveBlock1Ptr->savedMusic;
- else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER)
+ else if (GetCurrentMapType() == MAP_TYPE_UNDERWATER)
music = MUS_DEEPDEEP;
else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
music = MUS_NAMINORI;
@@ -1287,8 +1278,8 @@ void TryFadeOutOldMapMusic(void)
&& gSaveBlock1Ptr->location.mapNum == MAP_NUM(SOOTOPOLIS_CITY)
&& sWarpDestination.mapGroup == MAP_GROUP(SOOTOPOLIS_CITY)
&& sWarpDestination.mapNum == MAP_NUM(SOOTOPOLIS_CITY)
- && sWarpDestination.x == 0x1D
- && sWarpDestination.y == 0x35)
+ && sWarpDestination.x == 29
+ && sWarpDestination.y == 53)
return;
FadeOutMapMusic(GetMapMusicFadeoutSpeed());
}
@@ -1340,7 +1331,7 @@ void UpdateAmbientCry(s16 *state, u16 *delayCounter)
monsCount = CalculatePlayerPartyCount();
for (i = 0; i < monsCount; i++)
{
- if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT3)
+ if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG)
&& GetMonAbility(&gPlayerParty[0]) == ABILITY_SWARM)
{
divBy = 2;
@@ -1390,7 +1381,7 @@ u8 GetMapTypeByWarpData(struct WarpData *warp)
return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum);
}
-u8 Overworld_GetMapTypeOfSaveblockLocation(void)
+u8 GetCurrentMapType(void)
{
return GetMapTypeByWarpData(&gSaveBlock1Ptr->location);
}
@@ -1432,12 +1423,12 @@ bool8 Overworld_MapTypeIsIndoors(u8 mapType)
return FALSE;
}
-u8 sav1_saved_warp2_map_get_name(void)
+u8 GetSavedWarpRegionMapSectionId(void)
{
- return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp2.mapGroup, gSaveBlock1Ptr->warp2.mapNum)->regionMapSectionId;
+ return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->dynamicWarp.mapGroup, gSaveBlock1Ptr->dynamicWarp.mapNum)->regionMapSectionId;
}
-u8 sav1_map_get_name(void)
+u8 GetCurrentRegionMapSectionId(void)
{
return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->regionMapSectionId;
}
@@ -1447,30 +1438,30 @@ u8 GetCurrentMapBattleScene(void)
return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum)->battleType;
}
-static void overworld_bg_setup(void)
+static void InitOverworldBgs(void)
{
- InitBgsFromTemplates(0, gUnknown_08339DAC, ARRAY_COUNT(gUnknown_08339DAC));
- SetBgAttribute(1, BG_CTRL_ATTR_PALETTEMODE, 1);
- SetBgAttribute(2, BG_CTRL_ATTR_PALETTEMODE, 1);
- SetBgAttribute(3, BG_CTRL_ATTR_PALETTEMODE, 1);
- gBGTilemapBuffers2 = AllocZeroed(0x800);
- gBGTilemapBuffers1 = AllocZeroed(0x800);
- gBGTilemapBuffers3 = AllocZeroed(0x800);
+ InitBgsFromTemplates(0, sOverworldBgTemplates, ARRAY_COUNT(sOverworldBgTemplates));
+ SetBgAttribute(1, BG_ATTR_MOSAIC, 1);
+ SetBgAttribute(2, BG_ATTR_MOSAIC, 1);
+ SetBgAttribute(3, BG_ATTR_MOSAIC, 1);
+ gBGTilemapBuffers2 = AllocZeroed(BG_SCREEN_SIZE);
+ gBGTilemapBuffers1 = AllocZeroed(BG_SCREEN_SIZE);
+ gBGTilemapBuffers3 = AllocZeroed(BG_SCREEN_SIZE);
SetBgTilemapBuffer(1, gBGTilemapBuffers2);
SetBgTilemapBuffer(2, gBGTilemapBuffers1);
SetBgTilemapBuffer(3, gBGTilemapBuffers3);
- sub_81971D0();
+ InitStandardTextBoxWindows();
}
-void overworld_free_bg_tilemaps(void)
+void CleanupOverworldWindowsAndTilemaps(void)
{
- sub_81BE72C();
- sub_81971F4();
- if (gBGTilemapBuffers3 != NULL)
+ ClearMirageTowerPulseBlendEffect();
+ FreeAllOverworldWindowBuffers();
+ if (gBGTilemapBuffers3)
FREE_AND_SET_NULL(gBGTilemapBuffers3);
- if (gBGTilemapBuffers1 != NULL)
+ if (gBGTilemapBuffers1)
FREE_AND_SET_NULL(gBGTilemapBuffers1);
- if (gBGTilemapBuffers2 != NULL)
+ if (gBGTilemapBuffers2)
FREE_AND_SET_NULL(gBGTilemapBuffers2);
}
@@ -1764,7 +1755,7 @@ void CB2_ContinueSavedGame(void)
sub_81A3908();
LoadSaveblockMapHeader();
- set_warp2_warp3_to_neg_1();
+ ClearDiveAndHoleWarps();
trainerHillMapId = GetCurrentTrainerHillMapId();
if (gMapHeader.mapLayoutId == 0x169)
sub_81AA2F8();
@@ -1777,20 +1768,20 @@ void CB2_ContinueSavedGame(void)
DoTimeBasedEvents();
sub_8084788();
if (gMapHeader.mapLayoutId == 0x169)
- battle_pyramid_map_load_related(1);
+ InitBattlePyramidMap(1);
else if (trainerHillMapId != 0)
- trainer_hill_map_load_related();
+ InitTrainerHillMap();
else
- sub_8087D74();
+ InitMapFromSavedGame();
PlayTimeCounter_Start();
ScriptContext1_Init();
ScriptContext2_Disable();
sub_8195E10();
- if (GetSecretBase2Field_9() == 1)
+ if (UseContinueGameWarp() == TRUE)
{
- ClearSecretBase2Field_9();
- warp1_set_to_sav1w();
+ ClearContinueGameWarpStatus();
+ SetWarpDestinationToContinueGameWarp();
WarpIntoMap();
sub_80EDB44();
SetMainCallback2(CB2_LoadMap);
@@ -1863,7 +1854,7 @@ static bool32 map_loading_iteration_3(u8 *state)
switch (*state)
{
case 0:
- overworld_bg_setup();
+ InitOverworldBgs();
ScriptContext1_Init();
ScriptContext2_Disable();
sub_80867C8();
@@ -2121,7 +2112,7 @@ static void do_load_map_stuff_loop(u8 *state)
static void sub_80867C8(void)
{
- sub_81BE6AC();
+ ClearMirageTowerPulseBlend();
MoveSaveBlocks_ResetHeap();
}
@@ -2149,8 +2140,8 @@ static void InitOverworldGraphicsRegisters(void)
clear_scheduled_bg_copies_to_vram();
reset_temp_tile_data_buffers();
SetGpuReg(REG_OFFSET_MOSAIC, 0);
- SetGpuReg(REG_OFFSET_WININ, 0x1F1F);
- SetGpuReg(REG_OFFSET_WINOUT, 0x101);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WINOBJ_BG0);
SetGpuReg(REG_OFFSET_WIN0H, 0xFF);
SetGpuReg(REG_OFFSET_WIN0V, 0xFF);
SetGpuReg(REG_OFFSET_WIN1H, 0xFFFF);
@@ -2158,7 +2149,7 @@ static void InitOverworldGraphicsRegisters(void)
SetGpuReg(REG_OFFSET_BLDCNT, gUnknown_82EC7C4[1] | gUnknown_82EC7C4[2] | gUnknown_82EC7C4[3]
| BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(13, 7));
- overworld_bg_setup();
+ InitOverworldBgs();
schedule_bg_copy_tilemap_to_vram(1);
schedule_bg_copy_tilemap_to_vram(2);
schedule_bg_copy_tilemap_to_vram(3);
@@ -2176,7 +2167,7 @@ static void InitOverworldGraphicsRegisters(void)
ShowBg(1);
ShowBg(2);
ShowBg(3);
- sub_8098128();
+ InitFieldMessageBox();
}
static void sub_8086988(u32 a1)
@@ -2199,7 +2190,7 @@ static void sub_8086988(u32 a1)
if (!a1)
SetUpFieldTasks();
mapheader_run_script_with_tag_x5();
- sub_81BE6B8();
+ TryStartMirageTowerPulseBlendEffect();
}
static void sub_80869DC(void)
@@ -2219,7 +2210,7 @@ static void mli4_mapscripts_and_other(void)
gTotalCameraPixelOffsetX = 0;
gTotalCameraPixelOffsetY = 0;
ResetEventObjects();
- sav1_camera_get_focus_coords(&x, &y);
+ GetCameraFocusCoords(&x, &y);
player = GetInitialPlayerAvatarState();
InitPlayerAvatar(x, y, player->direction, gSaveBlock2Ptr->playerGender);
SetPlayerAvatarTransitionFlags(player->transitionFlags);
@@ -2254,7 +2245,7 @@ static void sub_8086AC8(void)
static void sub_8086AE4(void)
{
u16 x, y;
- sav1_camera_get_focus_coords(&x, &y);
+ GetCameraFocusCoords(&x, &y);
sub_8088B3C(x + gUnknown_03005DB4, y);
}
@@ -2263,7 +2254,7 @@ static void sub_8086B14(void)
u16 i;
u16 x, y;
- sav1_camera_get_focus_coords(&x, &y);
+ GetCameraFocusCoords(&x, &y);
x -= gUnknown_03005DB4;
for (i = 0; i < gFieldLinkPlayerCount; i++)
diff --git a/src/palette.c b/src/palette.c
index 1e92f4bba..deb07b066 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -77,7 +77,7 @@ static const u8 sRoundedDownGrayscaleMap[] = {
31, 31
};
-void LoadCompressedPalette(const void *src, u16 offset, u16 size)
+void LoadCompressedPalette(const u32 *src, u16 offset, u16 size)
{
LZDecompressWram(src, gPaletteDecompressionBuffer);
CpuCopy16(gPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size);
diff --git a/src/party_menu.c b/src/party_menu.c
index f9977fb89..00432e6db 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -22,7 +22,8 @@
#include "field_specials.h"
#include "field_weather.h"
#include "fieldmap.h"
-#include "fldeff_softboiled.h"
+#include "fldeff.h"
+#include "fldeff_misc.h"
#include "frontier_util.h"
#include "gpu_regs.h"
#include "graphics.h"
@@ -72,14 +73,16 @@
#include "constants/species.h"
#include "constants/vars.h"
-enum {
+enum
+{
CAN_LEARN_MOVE,
CANNOT_LEARN_MOVE,
ALREADY_KNOWS_MOVE,
CANNOT_LEARN_MOVE_IS_EGG
};
-struct Unk_Rodata1 {
+struct Unk_Rodata1
+{
void (*unk0)(u8, u8, u8, u8, u8, u8);
u8 unk4[24];
u8 unk1C;
@@ -88,7 +91,8 @@ struct Unk_Rodata1 {
u8 unk1F;
};
-struct Struct203CEC4 {
+struct Struct203CEC4
+{
TaskFunc unk0;
MainCallback exitCallback;
u32 unk8_0:1;
@@ -104,9 +108,10 @@ struct Struct203CEC4 {
s16 data[16];
};
-struct Struct203CEDC {
- struct Unk_Rodata1 *unk0;
- u8 *unk4;
+struct Struct203CEDC
+{
+ const struct Unk_Rodata1 *unk0;
+ const u8 *unk4;
u8 windowId;
u8 unk9;
u8 unkA;
@@ -114,351 +119,1421 @@ struct Struct203CEDC {
u8 unkC;
};
-struct Struct8615C08 {
- const u8 *textPtr;
- TaskFunc func;
-};
-
-struct Struct8615D9C {
- bool8 (*fieldMoveFunc)(void);
- u8 msgID;
-};
-
-EWRAM_DATA struct Struct203CEC4 *gUnknown_0203CEC4 = NULL;
+static EWRAM_DATA struct Struct203CEC4 *gUnknown_0203CEC4 = NULL;
EWRAM_DATA struct Struct203CEC8 gUnknown_0203CEC8 = {0};
-EWRAM_DATA struct Struct203CEDC *gUnknown_0203CEDC = NULL;
-EWRAM_DATA u8 *gUnknown_0203CEE0 = NULL;
-EWRAM_DATA u8 *gUnknown_0203CEE4 = NULL;
+static EWRAM_DATA struct Struct203CEDC *gUnknown_0203CEDC = NULL;
+static EWRAM_DATA u8 *gUnknown_0203CEE0 = NULL;
+static EWRAM_DATA u8 *gUnknown_0203CEE4 = NULL;
EWRAM_DATA u8 gUnknown_0203CEE8 = 0;
EWRAM_DATA u8 gUnknown_0203CEE9 = 0;
EWRAM_DATA MainCallback gPostMenuFieldCallback = NULL;
-EWRAM_DATA u16 *gUnknown_0203CEF0 = 0;
-EWRAM_DATA u16 *gUnknown_0203CEF4 = 0;
+static EWRAM_DATA u16 *gUnknown_0203CEF0 = 0;
+static EWRAM_DATA u16 *gUnknown_0203CEF4 = 0;
EWRAM_DATA u8 gSelectedOrderFromParty[4] = {0};
-EWRAM_DATA u16 gUnknown_0203CEFC = 0;
-EWRAM_DATA u16 gUnknown_0203CEFE = 0; // unused
+static EWRAM_DATA u16 gUnknown_0203CEFC = 0;
+static EWRAM_DATA u16 gUnknown_0203CEFE = 0; // unused
EWRAM_DATA u8 gUnknown_0203CF00[3] = {0};
-// BELOW TO BE CONVERTED TO C
-
-extern u32 gUnknown_08615048[]; // tutor compatibility table
-extern struct BgTemplate gUnknown_086156B8[];
-extern struct Unk_Rodata1 gUnknown_086156C4[2];
-// extern struct Unk_Rodata1 gUnknown_086156E4;
-extern u8 gUnknown_08615704[][6][8];
-extern u8 gUnknown_086157C4[];
-extern u8 gUnknown_086157E0[];
-extern const u8 gUnknown_086157FC[][3];
-extern struct WindowTemplate gUnknown_08615810[];
-extern struct WindowTemplate gUnknown_08615850[];
-extern struct WindowTemplate gUnknown_086158D0[];
-extern struct WindowTemplate gUnknown_08615890[];
-extern struct WindowTemplate gUnknown_08615908;
-extern struct WindowTemplate gUnknown_08615910;
-extern struct WindowTemplate gUnknown_08615918;
-extern struct WindowTemplate gUnknown_08615920;
-extern struct WindowTemplate gUnknown_08615928;
-extern struct WindowTemplate gUnknown_08615930;
-extern struct WindowTemplate gUnknown_08615938;
-extern struct WindowTemplate gUnknown_08615940;
-extern struct WindowTemplate gUnknown_08615948;
-extern struct WindowTemplate gUnknown_08615950;
-extern struct WindowTemplate gUnknown_08615958;
-extern struct WindowTemplate gUnknown_08615960;
-extern struct WindowTemplate gUnknown_08615968;
-extern struct WindowTemplate gUnknown_08615970;
-extern u8 gUnknown_08615988[];
-extern u8 gUnknown_086159CE[];
-extern u8 gUnknown_08615A14[];
-extern u8 gUnknown_08615A4A[];
-extern u8 gUnknown_08615A80[];
-extern u8 gUnknown_08615AB6[];
-extern u8 gUnknown_08615AB8[];
-extern u8 gUnknown_08615ABA[];
-extern u8 gUnknown_08615ABD[];
-extern u8 gUnknown_08615AC0[];
-extern u8 gUnknown_08615AC3[];
-extern u8 gUnknown_08615AC5[];
-extern u8 gUnknown_08615AC7[];
-extern u8 gUnknown_08615AC9[];
-extern u8 gUnknown_08615ACB[];
-extern u8 gUnknown_08615ACD[];
-extern u8 gUnknown_08615AD0[];
-extern u8 gUnknown_08615AD3[];
-extern u8 gUnknown_08615AD6[];
-extern u8 gUnknown_08615AD9[];
-extern u8 gUnknown_08615ADC[];
-extern u8 gUnknown_08615ADF[];
-extern u8 gUnknown_08615AE2[];
-extern u8 gUnknown_08615AE5[];
-extern u8 gUnknown_08615AE8[];
-extern u8 gUnknown_08615AEB[];
-extern u8 gUnknown_08615AEE[];
-extern u8 gUnknown_08615AF1[];
-extern const u8 *gUnknown_08615AF4[];
-extern const u8 *gUnknown_08615B60[];
-extern struct Struct8615C08 gUnknown_08615C08[];
-extern u8 *gUnknown_08615D38[];
-extern u8 gUnknown_08615D70[];
-extern const u16 gUnknown_08615D7E[];
-extern const struct Struct8615D9C gUnknown_08615D9C[];
-extern const u8 *gUnknown_08615E0C[];
-extern const struct SpriteSheet gUnknown_08615EB0;
-extern const struct SpritePalette gUnknown_08615EB8;
-extern struct SpriteTemplate gSpriteTemplate_8615EC0;
-extern const struct CompressedSpriteSheet gUnknown_08615EF8;
-extern const struct CompressedSpritePalette gUnknown_08615F00;
-extern struct SpriteTemplate gSpriteTemplate_8615F08;
-extern const struct CompressedSpriteSheet gUnknown_08615F70;
-extern struct SpriteTemplate gSpriteTemplate_8615F78;
-extern const struct CompressedSpriteSheet gUnknown_08615FF8;
-extern const struct CompressedSpritePalette gUnknown_08616000;
-extern struct SpriteTemplate gSpriteTemplate_8616008;
-extern u8 gUnknown_08616020[];
-extern u16 gUnknown_08616040[];
-
-// ABOVE TO BE CONVERTED TO C
-
extern void (*gUnknown_03006328)(u8, TaskFunc);
-void reset_brm(void);
-void PartyMenuInitCallback(void);
-bool8 PartyMenuSetup(void);
-void sub_81B209C(void);
-void PartyMenuExit(void);
-bool8 AllocPartyMenuBg(void);
-bool8 AllocPartyMiscGfx(void);
-void sub_81B239C(u8);
-void PartyMenuInitHelperStructs(u8);
-void LoadHeldItemIcons(void);
-void LoadPartyMenuPokeballGfx(void);
-void LoadPartyMenuAilmentGfx(void);
-bool8 party_menu_add_per_mon_objects(void);
-bool8 RenderPartyMenuBoxes(void);
-void sub_81B0F28(void);
-void sub_81B2428(u8);
-void display_pokemon_menu_message(u32);
-void PartyMenuExitTask(u8);
-void FreePartyPointers(void);
-void PartyPaletteBufferCopy(u8);
-void sub_81B0CEC(u8);
-void UpdateSelectedPartyBox(struct Struct203CEDC *, u8);
-void sub_81B2720(u8);
-void DisplayPartyPokemonSelectForRelearner(u8);
-void DisplayPartyPokemonSelectForContest(u8);
-void DisplayPartyPokemonSelectForBattle(u8);
-void sub_81B0B98(u8);
-void DisplayPartyPokemonSelectHeldItemRelated(u8);
-bool8 sub_81B0BFC(u8);
-void DisplayPartyPokemonData(u8);
-void sub_81B0FCC(u8, u8);
-void DisplayPartyPokemonNickname(struct Pokemon *, struct Struct203CEDC *, u8);
-void DisplayPartyPokemonLevelCheck(struct Pokemon *, struct Struct203CEDC *, u8);
-void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *, struct Struct203CEDC *, u8);
-void DisplayPartyPokemonHPCheck(struct Pokemon *, struct Struct203CEDC *, u8);
-void DisplayPartyPokemonMaxHPCheck(struct Pokemon *, struct Struct203CEDC *, u8);
-void DisplayPartyPokemonHPBarCheck(struct Pokemon *, struct Struct203CEDC *);
-void DisplayPartyPokemonOtherText(u8, struct Struct203CEDC *, u8);
-u8 sub_81B8830(void);
-bool8 GetBattleEntryEligibility(struct Pokemon *);
-bool8 sub_81B218C(u8);
-void DisplayPartyPokemonSelectToTeachMove(u8, u16, u8);
-u8 CanPartyPokemonLearnTMTutor(struct Pokemon *, u16, u8);
-void DisplayPartyPokemonBarDetail(u8, const u8*, u8, u8*);
-void DisplayPartyPokemonLevel(u8, struct Struct203CEDC *);
-void DisplayPartyPokemonGender(u8, u16, u8*, struct Struct203CEDC *);
-void DisplayPartyPokemonHP(u16, struct Struct203CEDC *);
-void DisplayPartyPokemonMaxHP(u16, struct Struct203CEDC *);
-void DisplayPartyPokemonHPBar(u16, u16, struct Struct203CEDC *);
-void party_menu_link_mon_icon_anim(u16, u32, struct Struct203CEDC *, u8, u32);
-void party_menu_link_mon_held_item_object(u16, u16, struct Struct203CEDC *);
-void party_menu_link_mon_pokeball_object(u16, struct Struct203CEDC *);
-void party_menu_link_mon_status_condition_object(u16, u8, struct Struct203CEDC *);
-void party_menu_held_item_object(struct Pokemon *, struct Struct203CEDC *);
-void party_menu_pokeball_object(struct Pokemon *, struct Struct203CEDC *);
-void party_menu_icon_anim(struct Pokemon *, struct Struct203CEDC *, u32);
-void party_menu_status_condition_object(struct Pokemon *, struct Struct203CEDC *);
-u8 sub_81B5F74(u8, u8);
-void sub_81B120C(void);
-u8 sub_81B5F34(u8, u8);
-void AnimateSelectedPartyIcon(u8, u8);
-void sub_81B5F98(u8, u8);
-u8 GetPartyBoxPalBitfield(u8, u8);
-bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8);
-u8 sub_81B8F38(u8);
-void c3_0811FAB4(u8);
-void sub_81B9080(void);
-void sub_81B4F88(void);
-void sub_81B15D0(u8, s8*);
-void sub_81B140C(u8, s8*);
-u16 PartyMenuButtonHandler(s8*);
-s8* sub_81B13EC(void);
-bool8 sub_81B15A4(u8*);
-void sub_81B302C(u8*);
-void sub_81B9140(void);
-void sub_81B6794(u8);
-void sub_81B7E4C(u8);
-void sub_81B8474(u8);
-void sub_81B7FAC(u8);
-void sub_81B3938(u8);
-void sub_81B21AC(u8, u8);
-void sub_81B36FC(u8);
-void sub_81B407C(u8);
-void sub_81B2210(u8);
-bool8 sub_81B1660(u8);
-const u8* sub_81B88BC(void);
-u8 sub_81B1B5C(const u8*, u8);
-void sub_81B16D4(u8);
-void sub_81B334C(void);
-void sub_81B1708(u8);
-bool8 sub_81B1BD4(void);
-void sub_81B1C1C(u8);
-void sub_81B8558(void);
-void UpdateCurrentPartySelection(s8*, s8);
-void SetNewPartySelectTarget1(s8*, s8);
-void SetNewPartySelectTarget2(s8*, s8);
-s8 sub_81B1B00(s8, s8);
-void sub_81B3300(const u8*);
-void sub_81B1B8C(u8);
-void DisplayPartyPokemonHPCheck(struct Pokemon*, struct Struct203CEDC*, u8);
-void DisplayPartyPokemonHPBarCheck(struct Pokemon*, struct Struct203CEDC*);
-bool16 sub_81B2134(struct Pokemon*);
-bool16 sub_81B2164(struct Pokemon*);
-void sub_81B2248(u8);
-void sub_81B227C(u8);
-bool8 sub_81B2370(u16, u8);
-u16 sub_81B2360(u8);
-bool8 sub_81B314C(void);
-void sub_81B3414(struct Pokemon*, u8);
-u8 sub_81B8A2C(struct Pokemon*);
-u8 sub_81B856C(s8);
-void sub_81B469C(u8);
-void sub_81B3730(u8);
-void sub_81B3828(void);
-void pokemon_change_order(void);
-void sub_81B3894(void);
-void sub_81B3CC0(u8);
-void sub_81B3D48(u8);
-void swap_pokemon_and_oams(void);
-void sub_81B3E60(u8);
-void sub_81B41C4(void);
-void c2_8123744(void);
-void sub_81B452C(void);
-void sub_81B4350(u8);
-void sub_81B42D0(u8);
-void sub_81B43A8(u8);
-void sub_81B43DC(u8);
-void sub_81B44FC(u8);
-void sub_81B4578(void);
-void sub_81B4624(u8);
-void sub_81B5C94(struct Pokemon*, struct Struct203CEDC*);
-void sub_81B48A8(u8);
-void sub_81B48DC(u8);
-void sub_81B4988(u8);
-void sub_81B4A98(void);
-void sub_81B4AE0(void);
-void sub_81B4B6C(u8);
-void sub_81B4BA0(u8);
-void sub_81B4C60(u8);
-void sub_81B4C94(u8);
-bool8 sub_81B8A7C(void);
-void sub_81B53FC(u8);
-void sub_81B5430(u8);
-void task_brm_cancel_1_on_keypad_a_or_b(u8);
-void sub_81B5674(u8);
-void sub_81B57DC(void);
-void sub_81B5864(void);
-void sub_81B56A4(u8);
-void sub_81B56D8(u8);
-void task_launch_hm_phase_2(u8);
-u16 brm_get_selected_species(void);
-void sub_81B5B38(u8, struct Pokemon*);
-void UpdatePartyMonIconFrame(struct Sprite*);
-void UpdatePartyMonIconFrameAndBounce(struct Sprite*);
-void sub_81B5CB0(u16, struct Struct203CEDC*);
-void sub_81B5DF0(u8, u8);
-void sub_81B5E74(struct Sprite*);
-void party_menu_get_status_condition_and_update_object(struct Pokemon*, struct Struct203CEDC*);
-void party_menu_update_status_condition_object(u8, struct Struct203CEDC*);
-u8 sub_81B8984(void);
-void sub_81B6280(u8);
-void c2_815ABFC(void);
-u8 GetItemEffectType(u16);
-void sub_81B672C(u8);
-u16 sub_81B691C(struct Pokemon*, u8);
-void option_menu_get_string(u8, u8*);
-void sub_81B6BB4(u8);
-void ether_effect_related_2(u8);
-void ether_effect_related(u8);
-void sub_81B6EB4(u8);
-void sub_81B6FF4(u8);
-void sub_81B6F60(u8);
-void sub_81B6F98(u8);
-void sub_81B77AC(u8);
-void sub_81B7028(u8);
-void sub_81B7088(u8);
-void sub_81B7230(u8);
-void sub_81B70B8(void);
-void sub_81B70F0(void);
-void sub_81B711C(u8);
-void sub_81B7154(u8);
-void sub_81B71D4(u8);
-void sub_81B7294(u8);
-void sub_81B72C8(u8);
-void sub_81B73E4(u8);
-void sub_81B79A0(struct Pokemon*, s16*);
-void sub_81B754C(u8, struct Pokemon*);
-void sub_81B75D4(u8);
-void sub_81B767C(u8);
-void sub_81B7634(u8);
-void sub_81B76C8(u8);
-void sub_81B7704(u8);
-void sub_81B7810(u8);
-void sub_81B787C(u8);
-void sub_81B7910(u8, u16);
-void sub_81B7A28(u8);
-void task_sacred_ash_party_loop(u8);
-void sub_81B7C10(u8);
-void sub_81B8044(u8);
-void sub_81B83B8(u8);
-void sub_81B82A0(u8);
-void sub_81B83F0(u16);
-void sub_81B814C(void);
-void sub_81B8088(u8);
-void sub_81B8104(u8);
-void sub_81B81A8(void);
-bool8 sub_81B841C(u16);
-void sub_81B8230(u8);
-void sub_81B82D4(u8);
-void sub_81B879C(u8);
-void sub_81B8558(void);
-bool8 GetBattleEntryEligibility(struct Pokemon*);
-bool8 sub_81B8770(u8);
-u8 sub_81B8888(void);
-u8 sub_81B885C(void);
-void sub_81B87E8(u8);
-u8 pokemon_order_func(u8);
-void sub_81B8FB0(u8, u8);
-void sub_81B8C88(u8*, bool8);
-void sub_81B8D88(u8*, u8, u8);
-void sub_81B917C(u8);
-void sub_81B91B4(u8);
-void sub_81B9294(u8);
-void sub_81B9240(u8);
-void sub_81B9390(void);
-void task_hm_without_phase_2(u8);
-void sub_81B9424(u8);
-void sub_81B9470(void);
-void sub_81B94D0(u8);
-void sub_81B953C(u8);
-void sub_81B9588(void);
-void sub_81B9640(u8);
-void sub_81B97DC(struct Pokemon*, u8, u8);
-
-void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 e, TaskFunc task, MainCallback callback)
+static void reset_brm(void);
+static void PartyMenuInitCallback(void);
+static bool8 PartyMenuSetup(void);
+static void sub_81B209C(void);
+static void PartyMenuExit(void);
+static bool8 AllocPartyMenuBg(void);
+static bool8 AllocPartyMiscGfx(void);
+static void sub_81B239C(u8);
+static void PartyMenuInitHelperStructs(u8);
+static void LoadPartyMenuPokeballGfx(void);
+static void LoadPartyMenuAilmentGfx(void);
+static bool8 party_menu_add_per_mon_objects(void);
+static bool8 RenderPartyMenuBoxes(void);
+static void sub_81B0F28(void);
+static void sub_81B2428(u8);
+static void PartyMenuExitTask(u8);
+static void FreePartyPointers(void);
+static void PartyPaletteBufferCopy(u8);
+static void sub_81B0CEC(u8);
+static void UpdateSelectedPartyBox(struct Struct203CEDC *, u8);
+static void sub_81B2720(u8);
+static void DisplayPartyPokemonSelectForRelearner(u8);
+static void DisplayPartyPokemonSelectForContest(u8);
+static void DisplayPartyPokemonSelectForBattle(u8);
+static void sub_81B0B98(u8);
+static void DisplayPartyPokemonSelectHeldItemRelated(u8);
+static bool8 sub_81B0BFC(u8);
+static void DisplayPartyPokemonData(u8);
+static void DisplayPartyPokemonNickname(struct Pokemon *, struct Struct203CEDC *, u8);
+static void DisplayPartyPokemonLevelCheck(struct Pokemon *, struct Struct203CEDC *, u8);
+static void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *, struct Struct203CEDC *, u8);
+static void DisplayPartyPokemonHPCheck(struct Pokemon *, struct Struct203CEDC *, u8);
+static void DisplayPartyPokemonMaxHPCheck(struct Pokemon *, struct Struct203CEDC *, u8);
+static void DisplayPartyPokemonHPBarCheck(struct Pokemon *, struct Struct203CEDC *);
+static void DisplayPartyPokemonOtherText(u8, struct Struct203CEDC *, u8);
+static u8 sub_81B8830(void);
+static bool8 GetBattleEntryEligibility(struct Pokemon *);
+static bool8 sub_81B218C(u8);
+static void DisplayPartyPokemonSelectToTeachMove(u8, u16, u8);
+static u8 CanMonLearnTMTutor(struct Pokemon *, u16, u8);
+static void DisplayPartyPokemonBarDetail(u8, const u8*, u8, const u8*);
+static void DisplayPartyPokemonLevel(u8, struct Struct203CEDC *);
+static void DisplayPartyPokemonGender(u8, u16, u8*, struct Struct203CEDC *);
+static void DisplayPartyPokemonHP(u16, struct Struct203CEDC *);
+static void DisplayPartyPokemonMaxHP(u16, struct Struct203CEDC *);
+static void DisplayPartyPokemonHPBar(u16, u16, struct Struct203CEDC *);
+static void party_menu_link_mon_icon_anim(u16, u32, struct Struct203CEDC *, u8, u32);
+static void party_menu_link_mon_held_item_object(u16, u16, struct Struct203CEDC *);
+static void party_menu_link_mon_pokeball_object(u16, struct Struct203CEDC *);
+static void party_menu_link_mon_status_condition_object(u16, u8, struct Struct203CEDC *);
+static void party_menu_held_item_object(struct Pokemon *, struct Struct203CEDC *);
+static void party_menu_pokeball_object(struct Pokemon *, struct Struct203CEDC *);
+static void party_menu_icon_anim(struct Pokemon *, struct Struct203CEDC *, u32);
+static void party_menu_status_condition_object(struct Pokemon *, struct Struct203CEDC *);
+static u8 sub_81B5F74(u8, u8);
+static void sub_81B120C(void);
+static u8 sub_81B5F34(u8, u8);
+static void AnimateSelectedPartyIcon(u8, u8);
+static void sub_81B5F98(u8, u8);
+static u8 GetPartyBoxPalBitfield(u8, u8);
+static bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8);
+static u8 sub_81B8F38(u8);
+static void c3_0811FAB4(u8);
+static void sub_81B9080(void);
+static void sub_81B4F88(void);
+static void sub_81B15D0(u8, s8*);
+static void sub_81B140C(u8, s8*);
+static u16 PartyMenuButtonHandler(s8*);
+static s8* sub_81B13EC(void);
+static bool8 sub_81B15A4(u8*);
+static void sub_81B302C(u8*);
+static void sub_81B9140(void);
+static void sub_81B6794(u8);
+static void sub_81B7E4C(u8);
+static void sub_81B8474(u8);
+static void sub_81B7FAC(u8);
+static void sub_81B3938(u8);
+static void sub_81B21AC(u8, u8);
+static void sub_81B36FC(u8);
+static void sub_81B407C(u8);
+static void sub_81B2210(u8);
+static bool8 sub_81B1660(u8);
+static const u8* sub_81B88BC(void);
+static void sub_81B16D4(u8);
+static void sub_81B334C(void);
+static void sub_81B1708(u8);
+static void sub_81B1C1C(u8);
+static void UpdateCurrentPartySelection(s8*, s8);
+static void SetNewPartySelectTarget1(s8*, s8);
+static void SetNewPartySelectTarget2(s8*, s8);
+static s8 sub_81B1B00(s8, s8);
+static void sub_81B3300(const u8*);
+static void sub_81B1B8C(u8);
+static void DisplayPartyPokemonHPCheck(struct Pokemon*, struct Struct203CEDC*, u8);
+static void DisplayPartyPokemonHPBarCheck(struct Pokemon*, struct Struct203CEDC*);
+static bool16 sub_81B2134(struct Pokemon*);
+static bool16 sub_81B2164(struct Pokemon*);
+static void sub_81B2248(u8);
+static void sub_81B227C(u8);
+static bool8 CanLearnTutorMove(u16, u8);
+static u16 GetTutorMove(u8);
+static bool8 sub_81B314C(void);
+static void sub_81B3414(struct Pokemon*, u8);
+static u8 sub_81B8A2C(struct Pokemon*);
+static u8 sub_81B856C(s8);
+static void sub_81B469C(u8);
+static void HandleMenuInput(u8);
+static void sub_81B3828(void);
+static void pokemon_change_order(void);
+static void sub_81B3894(void);
+static void sub_81B3CC0(u8);
+static void sub_81B3D48(u8);
+static void swap_pokemon_and_oams(void);
+static void sub_81B3E60(u8);
+static void sub_81B41C4(void);
+static void c2_8123744(void);
+static void sub_81B452C(void);
+static void sub_81B4350(u8);
+static void sub_81B42D0(u8);
+static void sub_81B43A8(u8);
+static void sub_81B43DC(u8);
+static void sub_81B44FC(u8);
+static void sub_81B4578(void);
+static void sub_81B4624(u8);
+static void sub_81B5C94(struct Pokemon*, struct Struct203CEDC*);
+static void sub_81B48A8(u8);
+static void sub_81B48DC(u8);
+static void sub_81B4988(u8);
+static void sub_81B4A98(void);
+static void sub_81B4AE0(void);
+static void sub_81B4B6C(u8);
+static void sub_81B4BA0(u8);
+static void sub_81B4C60(u8);
+static void sub_81B4C94(u8);
+static bool8 sub_81B8A7C(void);
+static void sub_81B53FC(u8);
+static void sub_81B5430(u8);
+static void task_brm_cancel_1_on_keypad_a_or_b(u8);
+static void sub_81B5674(u8);
+static void sub_81B57DC(void);
+static void sub_81B5864(void);
+static void sub_81B56A4(u8);
+static void sub_81B56D8(u8);
+static void task_launch_hm_phase_2(u8);
+static u16 brm_get_selected_species(void);
+static void sub_81B5B38(u8, struct Pokemon*);
+static void UpdatePartyMonIconFrame(struct Sprite*);
+static void UpdatePartyMonIconFrameAndBounce(struct Sprite*);
+static void sub_81B5CB0(u16, struct Struct203CEDC*);
+static void sub_81B5DF0(u8, u8);
+static void sub_81B5E74(struct Sprite*);
+static void party_menu_get_status_condition_and_update_object(struct Pokemon*, struct Struct203CEDC*);
+static void party_menu_update_status_condition_object(u8, struct Struct203CEDC*);
+static u8 sub_81B8984(void);
+static void sub_81B6280(u8);
+static void c2_815ABFC(void);
+static void sub_81B672C(u8);
+static u16 sub_81B691C(struct Pokemon*, u8);
+static void option_menu_get_string(u8, u8*);
+static void sub_81B6BB4(u8);
+static void ether_effect_related_2(u8);
+static void ether_effect_related(u8);
+static void sub_81B6EB4(u8);
+static void sub_81B6FF4(u8);
+static void sub_81B6F60(u8);
+static void sub_81B6F98(u8);
+static void sub_81B77AC(u8);
+static void sub_81B7028(u8);
+static void sub_81B7088(u8);
+static void sub_81B7230(u8);
+static void sub_81B70B8(void);
+static void sub_81B70F0(void);
+static void sub_81B711C(u8);
+static void sub_81B7154(u8);
+static void sub_81B71D4(u8);
+static void sub_81B7294(u8);
+static void sub_81B72C8(u8);
+static void sub_81B73E4(u8);
+static void sub_81B79A0(struct Pokemon*, s16*);
+static void sub_81B754C(u8, struct Pokemon*);
+static void sub_81B75D4(u8);
+static void sub_81B767C(u8);
+static void sub_81B7634(u8);
+static void sub_81B76C8(u8);
+static void sub_81B7704(u8);
+static void sub_81B7810(u8);
+static void sub_81B787C(u8);
+static void sub_81B7910(u8, u16);
+static void sub_81B7A28(u8);
+static void task_sacred_ash_party_loop(u8);
+static void sub_81B7C10(u8);
+static void sub_81B8044(u8);
+static void sub_81B83B8(u8);
+static void sub_81B82A0(u8);
+static void sub_81B83F0(u16);
+static void sub_81B814C(void);
+static void sub_81B8088(u8);
+static void sub_81B8104(u8);
+static void sub_81B81A8(void);
+static bool8 sub_81B841C(u16);
+static void sub_81B8230(u8);
+static void sub_81B82D4(u8);
+static void sub_81B879C(u8);
+static bool8 GetBattleEntryEligibility(struct Pokemon*);
+static bool8 sub_81B8770(u8);
+static u8 sub_81B8888(void);
+static u8 sub_81B885C(void);
+static void sub_81B87E8(u8);
+static void sub_81B8C88(u8*, bool8);
+static void sub_81B8D88(u8*, u8, u8);
+static void sub_81B917C(u8);
+static void sub_81B91B4(u8);
+static void sub_81B9294(u8);
+static void sub_81B9240(u8);
+static void sub_81B9390(void);
+static void task_hm_without_phase_2(u8);
+static void sub_81B9424(u8);
+static void sub_81B9470(void);
+static void sub_81B94D0(u8);
+static void sub_81B953C(u8);
+static void sub_81B9588(void);
+static void sub_81B9640(u8);
+static void sub_81B97DC(struct Pokemon*, u8, u8);
+static void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f);
+static void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f);
+static void CursorCb_Summary(u8 taskId);
+static void CursorCb_Switch(u8 taskId);
+static void CursorCb_Cancel1(u8 taskId);
+static void CursorCb_Item(u8 taskId);
+static void CursorCb_Give(u8 taskId);
+static void CursorCb_TakeItem(u8 taskId);
+static void CursorCb_Mail(u8 taskId);
+static void CursorCb_Read(u8 taskId);
+static void CursorCb_TakeMail(u8 taskId);
+static void CursorCb_Cancel2(u8 taskId);
+static void CursorCb_SendMon(u8 taskId);
+static void CursorCb_Enter(u8 taskId);
+static void CursorCb_NoEntry(u8 taskId);
+static void CursorCb_Store(u8 taskId);
+static void CursorCb_Register(u8 taskId);
+static void CursorCb_Trade1(u8 taskId);
+static void CursorCb_Trade2(u8 taskId);
+static void CursorCb_Toss(u8 taskId);
+static void CursorCb_FieldMove(u8 taskId);
+static bool8 SetUpFieldMove_Surf(void);
+static bool8 SetUpFieldMove_Fly(void);
+static bool8 SetUpFieldMove_Waterfall(void);
+static bool8 SetUpFieldMove_Dive(void);
+
+// static const data
+#include "data/pokemon/tutor_learnsets.h"
+
+static const struct BgTemplate gUnknown_086156B8[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 28,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+};
+
+static const struct Unk_Rodata1 gUnknown_086156C4[] =
+{
+ {BlitBitmapToPartyWindow_Default1, {0x18, 0xB, 0x28, 0xD, 0x20, 0x14, 0x20, 8, 0x40, 0x14, 8, 8, 0x26, 0x25, 0x18, 8, 0x35, 0x25, 0x18, 8, 0x18, 0x23, 0x30, 3}, 0xC, 0x22, 0x40, 0x10},
+ {BlitBitmapToPartyWindow_Default2, {0x16, 3, 0x28, 0xD, 0x1E, 0xC, 0x20, 8, 0x3E, 0xC, 8, 8, 0x66, 0xC, 0x18, 8, 0x75, 0xC, 0x18, 8, 0x58, 0xA, 0x30, 3}, 0x4D, 4, 0x40, 0x10},
+};
+
+static const u8 gUnknown_08615704[][6][8] =
+{
+ {
+ {16, 40, 20, 50, 50, 52, 16, 34},
+ {104, 18, 108, 28, 136, 27, 102, 25},
+ {104, 42, 108, 52, 136, 51, 102, 49},
+ {104, 66, 108, 76, 136, 75, 102, 73},
+ {104, 90, 108, 100, 136, 99, 102, 97},
+ {104, 114, 108, 124, 136, 123, 102, 121},
+ },
+ {
+ {16, 24, 20, 34, 50, 36, 16, 18},
+ {16, 80, 20, 90, 50, 92, 16, 74},
+ {104, 18, 108, 28, 136, 27, 102, 25},
+ {104, 50, 108, 60, 136, 59, 102, 57},
+ {104, 82, 108, 92, 136, 91, 102, 89},
+ {104, 114, 108, 124, 136, 123, 102, 121},
+ },
+ {
+ {16, 24, 20, 34, 50, 36, 16, 18},
+ {16, 80, 20, 90, 50, 92, 16, 74},
+ {104, 26, 106, 36, 136, 35, 102, 33},
+ {104, 50, 106, 60, 136, 59, 102, 57},
+ {104, 82, 106, 92, 136, 91, 102, 89},
+ {104, 106, 106, 116, 136, 115, 102, 113},
+ },
+ {
+ {16, 32, 20, 42, 50, 44, 16, 26},
+ {104, 34, 106, 44, 136, 43, 102, 41},
+ {104, 58, 106, 68, 136, 67, 102, 65},
+ {16, 104, 20, 114, 50, 116, 16, 98},
+ {104, 106, 106, 116, 136, 115, 102, 113},
+ {104, 130, 106, 140, 136, 139, 102, 137},
+ },
+};
+
+static const u32 gUnknown_086157C4[] = INCBIN_U32("graphics/interface/unknown_6157C4.bin");
+static const u32 gUnknown_086157E0[] = INCBIN_U32("graphics/interface/unknown_6157E0.bin");
+
+static const u8 gUnknown_086157FC[][3] =
+{
+ {0, 3, 2},
+ {0, 1, 6},
+ {0, 11, 12},
+ {1, 2, 3},
+ {1, 8, 9},
+ {0, 1, 2},
+};
+
+static const struct WindowTemplate gUnknown_08615810[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 3,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 1,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 4,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 4,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xDF,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 7,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0x115,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 10,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x14B,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 13,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x181,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_08615850[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 8,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 4,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 1,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xEF,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 5,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0x125,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 9,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x15B,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 13,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x191,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_08615890[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 8,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 4,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 2,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xEF,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 5,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0x125,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 9,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x15B,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 12,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x191,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 28,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_086158D0[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 2,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0x63,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 3,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 5,
+ .baseBlock = 0xA9,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 12,
+ .tilemapTop = 6,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 6,
+ .baseBlock = 0xDF,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 11,
+ .width = 10,
+ .height = 7,
+ .paletteNum = 4,
+ .baseBlock = 0x115,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 12,
+ .tilemapTop = 12,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 7,
+ .baseBlock = 0x16B,
+ },
+ {
+ .bg = 2,
+ .tilemapLeft = 12,
+ .tilemapTop = 15,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 8,
+ .baseBlock = 0x1A1,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct WindowTemplate gUnknown_08615908 =
+{
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 17,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 3,
+ .baseBlock = 0x1C7,
+};
+
+static const struct WindowTemplate gUnknown_08615910 =
+{
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 18,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 3,
+ .baseBlock = 0x1C7,
+};
+
+static const struct WindowTemplate gUnknown_08615918 =
+{
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 16,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 3,
+ .baseBlock = 0x1D3,
+};
+
+static const struct WindowTemplate gUnknown_08615920 =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 21,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x24F,
+};
+
+static const struct WindowTemplate gUnknown_08615928 =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 16,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x279,
+};
+
+static const struct WindowTemplate gUnknown_08615930 =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 20,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x299,
+};
+
+static const struct WindowTemplate gUnknown_08615938 =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 18,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x299,
+};
+
+static const struct WindowTemplate gUnknown_08615940 =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 17,
+ .width = 16,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x299,
+};
+
+static const struct WindowTemplate gUnknown_08615948 =
+{
+ .bg = 2,
+ .tilemapLeft = 1,
+ .tilemapTop = 15,
+ .width = 20,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x299,
+};
+
+static const struct WindowTemplate gUnknown_08615950 =
+{
+ .bg = 2,
+ .tilemapLeft = 23,
+ .tilemapTop = 13,
+ .width = 6,
+ .height = 6,
+ .paletteNum = 14,
+ .baseBlock = 0x39D,
+};
+
+static const struct WindowTemplate gUnknown_08615958 =
+{
+ .bg = 2,
+ .tilemapLeft = 21,
+ .tilemapTop = 13,
+ .width = 8,
+ .height = 6,
+ .paletteNum = 14,
+ .baseBlock = 0x39D,
+};
+
+static const struct WindowTemplate gUnknown_08615960 =
+{
+ .bg = 2,
+ .tilemapLeft = 19,
+ .tilemapTop = 11,
+ .width = 10,
+ .height = 8,
+ .paletteNum = 14,
+ .baseBlock = 0x2E9,
+};
+
+static const struct WindowTemplate gUnknown_08615968 =
+{
+ .bg = 2,
+ .tilemapLeft = 21,
+ .tilemapTop = 9,
+ .width = 5,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x2E9,
+};
+
+static const struct WindowTemplate gUnknown_08615970 =
+{
+ .bg = 2,
+ .tilemapLeft = 19,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 11,
+ .paletteNum = 14,
+ .baseBlock = 0x2E9,
+};
+
+// Unused.
+static const struct WindowTemplate gUnknown_08615978 =
+{
+ .bg = 2,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 27,
+ .height = 4,
+ .paletteNum = 14,
+ .baseBlock = 0x1DF,
+};
+
+// Unused.
+static const struct WindowTemplate gUnknown_08615980 =
+{
+ .bg = 2,
+ .tilemapLeft = 0,
+ .tilemapTop = 13,
+ .width = 18,
+ .height = 3,
+ .paletteNum = 12,
+ .baseBlock = 0x39D,
+};
+
+static const u8 gUnknown_08615988[] = {24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 40, 59, 60, 58, 58, 58, 58, 58, 58, 61, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 46, 47, 47, 47, 47, 47, 47, 47, 47, 48};
+static const u8 gUnknown_086159CE[] = {24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 40, 41, 41, 41, 41, 41, 41, 41, 41, 42, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 46, 47, 47, 47, 47, 47, 47, 47, 47, 48};
+static const u8 gUnknown_08615A14[] = {43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 49, 33, 33, 33, 33, 33, 33, 33, 33, 52, 53, 51, 51, 51, 51, 51, 51, 54, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57};
+static const u8 gUnknown_08615A4A[] = {43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 49, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 50, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57};
+static const u8 gUnknown_08615A80[] = {21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39};
+static const u8 gUnknown_08615AB6[] = {11, 12};
+static const u8 gUnknown_08615AB8[] = {9, 10};
+static const u8 gUnknown_08615ABA[] = {4, 5, 6};
+static const u8 gUnknown_08615ABD[] = {1, 7, 8};
+static const u8 gUnknown_08615AC0[] = {1, 11, 12};
+static const u8 gUnknown_08615AC3[] = {59, 60};
+static const u8 gUnknown_08615AC5[] = {75, 76};
+static const u8 gUnknown_08615AC7[] = {57, 58};
+static const u8 gUnknown_08615AC9[] = {73, 74};
+static const u8 gUnknown_08615ACB[] = {89, 90};
+static const u8 gUnknown_08615ACD[] = {52, 53, 54};
+static const u8 gUnknown_08615AD0[] = {68, 69, 70};
+static const u8 gUnknown_08615AD3[] = {84, 85, 86};
+static const u8 gUnknown_08615AD6[] = {116, 117, 118};
+static const u8 gUnknown_08615AD9[] = {132, 133, 134};
+static const u8 gUnknown_08615ADC[] = {148, 149, 150};
+static const u8 gUnknown_08615ADF[] = {100, 101, 102};
+static const u8 gUnknown_08615AE2[] = {49, 55, 56};
+static const u8 gUnknown_08615AE5[] = {65, 71, 72};
+static const u8 gUnknown_08615AE8[] = {81, 87, 88};
+static const u8 gUnknown_08615AEB[] = {97, 103, 104};
+static const u8 gUnknown_08615AEE[] = {161, 167, 168};
+static const u8 gUnknown_08615AF1[] = {17, 27, 28};
+
+static const u8 *const gUnknown_08615AF4[] =
+{
+ gUnknown_085E9E43,
+ gUnknown_085EA010,
+ gUnknown_085EA02A,
+ gUnknown_085E9E55,
+ gUnknown_085E9E64,
+ gUnknown_085E9E79,
+ gUnknown_085E9E8F,
+ gUnknown_085E9EBC,
+ gUnknown_085E9ED4,
+ gUnknown_085E9EE9,
+ gUnknown_085E9FDB,
+ gUnknown_085EA046,
+ gUnknown_085EA05B,
+ gUnknown_085E9F01,
+ gUnknown_085E9F58,
+ gUnknown_085E9F6F,
+ gUnknown_085E9F81,
+ gUnknown_085E9F90,
+ gUnknown_085E9FA7,
+ gUnknown_085E9FC2,
+ gText_EmptyString2,
+ gUnknown_085E9EA6,
+ gUnknown_085E9F16,
+ gUnknown_085E9F2A,
+ gUnknown_085E9F42,
+ gUnknown_085E9FF9,
+ gUnknown_085EA073,
+};
+
+static const u8 *const gUnknown_08615B60[] =
+{
+ gUnknown_085EA091,
+ gUnknown_085EA099,
+ gUnknown_085EA09E,
+ gUnknown_085EA0A4,
+ gUnknown_085EA0AB,
+ gUnknown_085EA0E7,
+ gUnknown_085EA0B1,
+ gUnknown_085EA0B6,
+ gUnknown_085EA0BF,
+ gUnknown_085EA0C5,
+ gUnknown_085EA0CF,
+ gUnknown_085EA0D7,
+ gUnknown_085EA0DC,
+};
+
+// Unknown unused data. Feel free to remove.
+static const u16 gUnknown_08615B94[] =
+{
+ 0x0108, 0x0151, 0x0160, 0x015b, 0x002e, 0x005c, 0x0102, 0x0153, 0x014b, 0x00ed, 0x00f1, 0x010d, 0x003a, 0x003b, 0x003f, 0x0071,
+ 0x00b6, 0x00f0, 0x00ca, 0x00db, 0x00da, 0x004c, 0x00e7, 0x0055, 0x0057, 0x0059, 0x00d8, 0x005b, 0x005e, 0x00f7, 0x0118, 0x0068,
+ 0x0073, 0x015f, 0x0035, 0x00bc, 0x00c9, 0x007e, 0x013d, 0x014c, 0x0103, 0x0107, 0x0122, 0x009c, 0x00d5, 0x00a8, 0x00d3, 0x011d,
+ 0x0121, 0x013b, 0x000f, 0x0013, 0x0039, 0x0046, 0x0094, 0x00f9, 0x007f, 0x0123,
+};
+
+enum
+{
+ MENU_SUMMARY,
+ MENU_SWITCH,
+ MENU_CANCEL1,
+ MENU_ITEM,
+ MENU_GIVE,
+ MENU_TAKE_ITEM,
+ MENU_MAIL,
+ MENU_TAKE_MAIL,
+ MENU_READ,
+ MENU_CANCEL2,
+ MENU_SHIFT,
+ MENU_SEND_OUT,
+ MENU_ENTER,
+ MENU_NO_ENTRY,
+ MENU_STORE,
+ MENU_REGISTER,
+ MENU_TRADE1,
+ MENU_TRADE2,
+ MENU_TOSS,
+ MENU_FIELD_MOVES,
+};
+
+enum
+{
+ FIELD_MOVE_CUT,
+ FIELD_MOVE_FLASH,
+ FIELD_MOVE_ROCK_SMASH,
+ FIELD_MOVE_STRENGTH,
+ FIELD_MOVE_SURF,
+ FIELD_MOVE_FLY,
+ FIELD_MOVE_DIVE,
+ FIELD_MOVE_WATERFALL,
+ FIELD_MOVE_TELEPORT,
+ FIELD_MOVE_DIG,
+ FIELD_MOVE_SECRET_POWER,
+ FIELD_MOVE_MILK_DRINK,
+ FIELD_MOVE_SOFT_BOILED,
+ FIELD_MOVE_SWEET_SCENT,
+};
+
+// What a weird choice of table termination;
+#define FIELD_MOVE_TERMINATOR MOVE_SWORDS_DANCE
+
+struct
+{
+ const u8 *text;
+ TaskFunc func;
+} static const sCursorOptions[] =
+{
+ [MENU_SUMMARY] = {gText_Summary5, CursorCb_Summary},
+ [MENU_SWITCH] = {gText_Switch2, CursorCb_Switch},
+ [MENU_CANCEL1] = {gText_Cancel2, CursorCb_Cancel1},
+ [MENU_ITEM] = {gText_Item, CursorCb_Item},
+ [MENU_GIVE] = {gMenuText_Give, CursorCb_Give},
+ [MENU_TAKE_ITEM] = {gText_Take, CursorCb_TakeItem},
+ [MENU_MAIL] = {gText_Mail, CursorCb_Mail},
+ [MENU_TAKE_MAIL] = {gText_Take2, CursorCb_TakeMail},
+ [MENU_READ] = {gText_Read2, CursorCb_Read},
+ [MENU_CANCEL2] = {gText_Cancel2, CursorCb_Cancel2},
+ [MENU_SHIFT] = {gText_Shift, CursorCb_SendMon},
+ [MENU_SEND_OUT] = {gText_SendOut, CursorCb_SendMon},
+ [MENU_ENTER] = {gText_Enter, CursorCb_Enter},
+ [MENU_NO_ENTRY] = {gText_NoEntry, CursorCb_NoEntry},
+ [MENU_STORE] = {gText_Store, CursorCb_Store},
+ [MENU_REGISTER] = {gText_Register, CursorCb_Register},
+ [MENU_TRADE1] = {gText_Trade4, CursorCb_Trade1},
+ [MENU_TRADE2] = {gText_Trade4, CursorCb_Trade2},
+ [MENU_TOSS] = {gMenuText_Toss, CursorCb_Toss},
+ [MENU_FIELD_MOVES + FIELD_MOVE_CUT] = {gMoveNames[MOVE_CUT], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_FLASH] = {gMoveNames[MOVE_FLASH], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_ROCK_SMASH] = {gMoveNames[MOVE_ROCK_SMASH], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_STRENGTH] = {gMoveNames[MOVE_STRENGTH], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_SURF] = {gMoveNames[MOVE_SURF], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_FLY] = {gMoveNames[MOVE_FLY], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_DIVE] = {gMoveNames[MOVE_DIVE], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_WATERFALL] = {gMoveNames[MOVE_WATERFALL], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_TELEPORT] = {gMoveNames[MOVE_TELEPORT], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_DIG] = {gMoveNames[MOVE_DIG], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_SECRET_POWER] = {gMoveNames[MOVE_SECRET_POWER], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_MILK_DRINK] = {gMoveNames[MOVE_MILK_DRINK], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_SOFT_BOILED] = {gMoveNames[MOVE_SOFT_BOILED], CursorCb_FieldMove},
+ [MENU_FIELD_MOVES + FIELD_MOVE_SWEET_SCENT] = {gMoveNames[MOVE_SWEET_SCENT], CursorCb_FieldMove},
+};
+
+static const u8 gUnknown_08615D10[] = {0, 1, 2};
+static const u8 gUnknown_08615D13[] = {10, 0, 2};
+static const u8 gUnknown_08615D16[] = {11, 0, 2};
+static const u8 gUnknown_08615D19[] = {0, 2};
+static const u8 gUnknown_08615D1B[] = {12, 0, 2};
+static const u8 gUnknown_08615D1E[] = {13, 0, 2};
+static const u8 gUnknown_08615D21[] = {14, 0, 2};
+static const u8 gUnknown_08615D24[] = {4, 5, 9};
+static const u8 gUnknown_08615D27[] = {8, 7, 9};
+static const u8 gUnknown_08615D2A[] = {15, 0, 2};
+static const u8 gUnknown_08615D2D[] = {16, 0, 2};
+static const u8 gUnknown_08615D30[] = {17, 0, 2};
+static const u8 gUnknown_08615D33[] = {5, 18, 2};
+
+static const u8 *const gUnknown_08615D38[] =
+{
+ NULL,
+ gUnknown_08615D10,
+ gUnknown_08615D13,
+ gUnknown_08615D16,
+ gUnknown_08615D1B,
+ gUnknown_08615D1E,
+ gUnknown_08615D21,
+ gUnknown_08615D19,
+ gUnknown_08615D24,
+ gUnknown_08615D27,
+ gUnknown_08615D2A,
+ gUnknown_08615D2D,
+ gUnknown_08615D30,
+ gUnknown_08615D33,
+};
+
+static const u8 gUnknown_08615D70[] = {0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
+
+static const u16 sFieldMoves[] =
+{
+ MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH, MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL, MOVE_TELEPORT,
+ MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK, MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, FIELD_MOVE_TERMINATOR
+};
+
+struct
+{
+ bool8 (*fieldMoveFunc)(void);
+ u8 msgId;
+} static const sFieldMoveCursorCallbacks[] =
+{
+ [FIELD_MOVE_CUT] = {SetUpFieldMove_Cut, 0x07},
+ [FIELD_MOVE_FLASH] = {SetUpFieldMove_Flash, 0x0d},
+ [FIELD_MOVE_ROCK_SMASH] = {SetUpFieldMove_RockSmash, 0x0d},
+ [FIELD_MOVE_STRENGTH] = {SetUpFieldMove_Strength, 0x0d},
+ [FIELD_MOVE_SURF] = {SetUpFieldMove_Surf, 0x08},
+ [FIELD_MOVE_FLY] = {SetUpFieldMove_Fly, 0x0d},
+ [FIELD_MOVE_DIVE] = {SetUpFieldMove_Dive, 0x0d},
+ [FIELD_MOVE_WATERFALL] = {SetUpFieldMove_Waterfall, 0x0d},
+ [FIELD_MOVE_TELEPORT] = {SetUpFieldMove_Teleport, 0x0d},
+ [FIELD_MOVE_DIG] = {SetUpFieldMove_Dig, 0x0d},
+ [FIELD_MOVE_SECRET_POWER] = {SetUpFieldMove_SecretPower, 0x0d},
+ [FIELD_MOVE_MILK_DRINK] = {SetUpFieldMove_SoftBoiled, 0x10},
+ [FIELD_MOVE_SOFT_BOILED] = {SetUpFieldMove_SoftBoiled, 0x10},
+ [FIELD_MOVE_SWEET_SCENT] = {SetUpFieldMove_SweetScent, 0x0d},
+};
+
+static const u8 *const gUnknown_08615E0C[] =
+{
+ gText_NotPkmnOtherTrainerWants,
+ gText_ThatIsntAnEgg,
+ gText_PkmnCantBeTradedNow,
+ gText_PkmnCantBeTradedNow,
+ gText_OtherTrainersPkmnCantBeTraded,
+ gText_EggCantBeTradedNow,
+ gText_OtherTrainerCantAcceptPkmn,
+ gText_CantTradeWithTrainer,
+ gText_CantTradeWithTrainer,
+};
+
+static const u32 gUnknown_08615E30[] = INCBIN_U32("graphics/interface/hold_icons.4bpp");
+static const u16 gUnknown_08615E70[] = INCBIN_U16("graphics/interface/hold_icons.gbapal");
+
+static const struct OamData gOamData_83765EC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_83765F4[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83765FC[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8376604[] =
+{
+ gSpriteAnim_83765F4,
+ gSpriteAnim_83765FC,
+};
+
+static const struct SpriteSheet gUnknown_08615EB0 =
+{
+ gUnknown_08615E30, sizeof(gUnknown_08615E30), 0xd750
+};
+
+static const struct SpritePalette gUnknown_08615EB8 =
+{
+ gUnknown_08615E70, 0xd750
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8615EC0 =
+{
+ 0xd750,
+ 0xd750,
+ &gOamData_83765EC,
+ gSpriteAnimTable_8376604,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+static const struct OamData sOamData_8615ED8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_8615EE0[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615EE8[] =
+{
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8615EF0[] =
+{
+ sSpriteAnim_8615EE0,
+ sSpriteAnim_8615EE8
+};
+
+static const struct CompressedSpriteSheet gUnknown_08615EF8 =
+{
+ gPartyMenuPokeball_Gfx, 0x400, 0x04b0
+};
+
+static const struct CompressedSpritePalette gUnknown_08615F00 =
+{
+ gPartyMenuPokeball_Pal, 0x04b0
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8615F08 =
+{
+ .tileTag = 0x04b0,
+ .paletteTag = 0x04b0,
+ .oam = &sOamData_8615ED8,
+ .anims = sSpriteAnimTable_8615EF0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_8615F20 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_8615F28[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615F30[] =
+{
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615F38[] =
+{
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615F40[] =
+{
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615F48[] =
+{
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615F50[] =
+{
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8615F58[] =
+{
+ sSpriteAnim_8615F28,
+ sSpriteAnim_8615F30,
+ sSpriteAnim_8615F38,
+ sSpriteAnim_8615F40,
+ sSpriteAnim_8615F48,
+ sSpriteAnim_8615F50
+};
+
+static const struct CompressedSpriteSheet gUnknown_08615F70 =
+{
+ gPartyMenuPokeballSmall_Gfx, 0x0300, 0x04b1
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8615F78 =
+{
+ .tileTag = 1201,
+ .paletteTag = 1200,
+ .oam = &sOamData_8615F20,
+ .anims = sSpriteAnimTable_8615F58,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_8615F90 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_8615F98[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615FA0[] =
+{
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615FA8[] =
+{
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615FB0[] =
+{
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615FB8[] =
+{
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615FC0[] =
+{
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615FC8[] =
+{
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8615FD0[] =
+{
+ ANIMCMD_FRAME(28, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_8615FD8[] =
+{
+ sSpriteAnim_8615F98,
+ sSpriteAnim_8615FA0,
+ sSpriteAnim_8615FA8,
+ sSpriteAnim_8615FB0,
+ sSpriteAnim_8615FB8,
+ sSpriteAnim_8615FC0,
+ sSpriteAnim_8615FC8,
+ sSpriteAnim_8615FD0
+};
+
+static const struct CompressedSpriteSheet gUnknown_08615FF8 =
+{
+ gStatusGfx_Icons, 0x400, 1202
+};
+
+static const struct CompressedSpritePalette gUnknown_08616000 =
+{
+ gStatusPal_Icons, 1202
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8616008 =
+{
+ .tileTag = 1202,
+ .paletteTag = 1202,
+ .oam = &sOamData_8615F90,
+ .anims = sSpriteAnimTable_8615FD8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const u8 gUnknown_08616020[] = {0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00};
+
+// Unused table of pointers to strings of statistics.
+static const u8 *const gUnknown_08616028[] =
+{
+ gText_HP4,
+ gText_Attack3,
+ gText_Defense3,
+ gText_SpAtk4,
+ gText_SpDef4,
+ gText_Speed2
+};
+
+static const u16 gTMHMMoves[] =
+{
+ MOVE_FOCUS_PUNCH,
+ MOVE_DRAGON_CLAW,
+ MOVE_WATER_PULSE,
+ MOVE_CALM_MIND,
+ MOVE_ROAR,
+ MOVE_TOXIC,
+ MOVE_HAIL,
+ MOVE_BULK_UP,
+ MOVE_BULLET_SEED,
+ MOVE_HIDDEN_POWER,
+ MOVE_SUNNY_DAY,
+ MOVE_TAUNT,
+ MOVE_ICE_BEAM,
+ MOVE_BLIZZARD,
+ MOVE_HYPER_BEAM,
+ MOVE_LIGHT_SCREEN,
+ MOVE_PROTECT,
+ MOVE_RAIN_DANCE,
+ MOVE_GIGA_DRAIN,
+ MOVE_SAFEGUARD,
+ MOVE_FRUSTRATION,
+ MOVE_SOLAR_BEAM,
+ MOVE_IRON_TAIL,
+ MOVE_THUNDERBOLT,
+ MOVE_THUNDER,
+ MOVE_EARTHQUAKE,
+ MOVE_RETURN,
+ MOVE_DIG,
+ MOVE_PSYCHIC,
+ MOVE_SHADOW_BALL,
+ MOVE_BRICK_BREAK,
+ MOVE_DOUBLE_TEAM,
+ MOVE_REFLECT,
+ MOVE_SHOCK_WAVE,
+ MOVE_FLAMETHROWER,
+ MOVE_SLUDGE_BOMB,
+ MOVE_SANDSTORM,
+ MOVE_FIRE_BLAST,
+ MOVE_ROCK_TOMB,
+ MOVE_AERIAL_ACE,
+ MOVE_TORMENT,
+ MOVE_FACADE,
+ MOVE_SECRET_POWER,
+ MOVE_REST,
+ MOVE_ATTRACT,
+ MOVE_THIEF,
+ MOVE_STEEL_WING,
+ MOVE_SKILL_SWAP,
+ MOVE_SNATCH,
+ MOVE_OVERHEAT,
+ MOVE_CUT,
+ MOVE_FLY,
+ MOVE_SURF,
+ MOVE_STRENGTH,
+ MOVE_FLASH,
+ MOVE_ROCK_SMASH,
+ MOVE_WATERFALL,
+ MOVE_DIVE,
+};
+
+// code
+static void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 e, TaskFunc task, MainCallback callback)
{
u16 i;
-
+
reset_brm();
gUnknown_0203CEC4 = Alloc(sizeof(struct Struct203CEC4));
if (gUnknown_0203CEC4 == NULL)
@@ -476,32 +1551,32 @@ void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 e, TaskFunc task, MainCallback cal
gUnknown_0203CEC4->unk8_1 = 0;
gUnknown_0203CEC4->unk8_2 = 0xFF;
gUnknown_0203CEC4->unk9_0 = 0xFF;
-
+
if (a == 4)
gUnknown_0203CEC4->unk8_0 = TRUE;
else
gUnknown_0203CEC4->unk8_0 = FALSE;
-
+
if (b != 0xFF)
gUnknown_0203CEC8.mode = b;
-
+
for (i = 0; i <= 15; i++)
gUnknown_0203CEC4->data[i] = 0;
for (i = 0; i < 3; i++)
gUnknown_0203CEC4->unkC[i] |= 0xFF;
-
+
if (d == 0)
gUnknown_0203CEC8.unk9 = 0;
else if (gUnknown_0203CEC8.unk9 > 5 || GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES) == SPECIES_NONE)
gUnknown_0203CEC8.unk9 = 0; // wut why is this else if?
-
+
gTextFlags.autoScroll = 0;
CalculatePlayerPartyCount();
SetMainCallback2(PartyMenuInitCallback);
}
}
-void PartyMenuCallback(void)
+static void PartyMenuCallback(void)
{
RunTasks();
AnimateSprites();
@@ -510,14 +1585,14 @@ void PartyMenuCallback(void)
UpdatePaletteFade();
}
-void PartyMenuVBlankCallback(void)
+static void PartyMenuVBlankCallback(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-void PartyMenuInitCallback(void)
+static void PartyMenuInitCallback(void)
{
while (TRUE)
{
@@ -526,131 +1601,131 @@ void PartyMenuInitCallback(void)
}
}
-bool8 PartyMenuSetup(void)
+static bool8 PartyMenuSetup(void)
{
switch (gMain.state)
{
- case 0:
- SetVBlankHBlankCallbacksToNull();
- ResetVramOamAndBgCntRegs();
- clear_scheduled_bg_copies_to_vram();
- gMain.state++;
- break;
- case 1:
- ScanlineEffect_Stop();
- gMain.state++;
- break;
- case 2:
- ResetPaletteFade();
- gPaletteFade.bufferTransferDisabled = TRUE;
- gMain.state++;
- break;
- case 3:
- ResetSpriteData();
- gMain.state++;
- break;
- case 4:
- FreeAllSpritePalettes();
- gMain.state++;
- break;
- case 5:
- if (!sub_81221AC())
- ResetTasks();
- gMain.state++;
- break;
- case 6:
- sub_81B209C();
- gMain.state++;
- break;
- case 7:
- if (!AllocPartyMenuBg())
- {
- PartyMenuExit();
- return TRUE;
- }
- else
- {
- gUnknown_0203CEC4->data[0] = 0;
- gMain.state++;
- }
- break;
- case 8:
- if (AllocPartyMiscGfx())
- gMain.state++;
- break;
- case 9:
- sub_81B239C(gUnknown_0203CEC8.mode);
- gMain.state++;
- break;
- case 10:
- PartyMenuInitHelperStructs(gUnknown_0203CEC8.mode);
+ case 0:
+ SetVBlankHBlankCallbacksToNull();
+ ResetVramOamAndBgCntRegs();
+ clear_scheduled_bg_copies_to_vram();
+ gMain.state++;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ gMain.state++;
+ break;
+ case 3:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 4:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 5:
+ if (!sub_81221AC())
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 6:
+ sub_81B209C();
+ gMain.state++;
+ break;
+ case 7:
+ if (!AllocPartyMenuBg())
+ {
+ PartyMenuExit();
+ return TRUE;
+ }
+ else
+ {
gUnknown_0203CEC4->data[0] = 0;
gMain.state++;
- break;
- case 11:
- LoadHeldItemIcons();
- gMain.state++;
- break;
- case 12:
- LoadPartyMenuPokeballGfx();
- gMain.state++;
- break;
- case 13:
- LoadPartyMenuAilmentGfx();
- gMain.state++;
- break;
- case 14:
- LoadMonIconPalettes();
- gMain.state++;
- break;
- case 15:
- if (party_menu_add_per_mon_objects())
- {
- gUnknown_0203CEC4->data[0] = 0;
- gMain.state++;
- }
- break;
- case 16:
- if (RenderPartyMenuBoxes())
- {
- gUnknown_0203CEC4->data[0] = 0;
- gMain.state++;
- }
- break;
- case 17:
- sub_81B0F28();
- gMain.state++;
- break;
- case 18:
- sub_81B2428(gUnknown_0203CEC4->unk8_0);
- gMain.state++;
- break;
- case 19:
- gMain.state++;
- break;
- case 20:
- CreateTask(gUnknown_0203CEC4->unk0, 0);
- display_pokemon_menu_message(gUnknown_0203CEC4->unkA_0);
+ }
+ break;
+ case 8:
+ if (AllocPartyMiscGfx())
gMain.state++;
- break;
- case 21:
- BlendPalettes(0xFFFFFFFF, 16, 0);
- gPaletteFade.bufferTransferDisabled = FALSE;
+ break;
+ case 9:
+ sub_81B239C(gUnknown_0203CEC8.mode);
+ gMain.state++;
+ break;
+ case 10:
+ PartyMenuInitHelperStructs(gUnknown_0203CEC8.mode);
+ gUnknown_0203CEC4->data[0] = 0;
+ gMain.state++;
+ break;
+ case 11:
+ LoadHeldItemIcons();
+ gMain.state++;
+ break;
+ case 12:
+ LoadPartyMenuPokeballGfx();
+ gMain.state++;
+ break;
+ case 13:
+ LoadPartyMenuAilmentGfx();
+ gMain.state++;
+ break;
+ case 14:
+ LoadMonIconPalettes();
+ gMain.state++;
+ break;
+ case 15:
+ if (party_menu_add_per_mon_objects())
+ {
+ gUnknown_0203CEC4->data[0] = 0;
gMain.state++;
- break;
- case 22:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ }
+ break;
+ case 16:
+ if (RenderPartyMenuBoxes())
+ {
+ gUnknown_0203CEC4->data[0] = 0;
gMain.state++;
- break;
- default:
- SetVBlankCallback(PartyMenuVBlankCallback);
- SetMainCallback2(PartyMenuCallback);
- return TRUE;
+ }
+ break;
+ case 17:
+ sub_81B0F28();
+ gMain.state++;
+ break;
+ case 18:
+ sub_81B2428(gUnknown_0203CEC4->unk8_0);
+ gMain.state++;
+ break;
+ case 19:
+ gMain.state++;
+ break;
+ case 20:
+ CreateTask(gUnknown_0203CEC4->unk0, 0);
+ display_pokemon_menu_message(gUnknown_0203CEC4->unkA_0);
+ gMain.state++;
+ break;
+ case 21:
+ BlendPalettes(0xFFFFFFFF, 16, 0);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ gMain.state++;
+ break;
+ case 22:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gMain.state++;
+ break;
+ default:
+ SetVBlankCallback(PartyMenuVBlankCallback);
+ SetMainCallback2(PartyMenuCallback);
+ return TRUE;
}
return FALSE;
}
-void PartyMenuExit(void)
+static void PartyMenuExit(void)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
CreateTask(PartyMenuExitTask, 0);
@@ -658,7 +1733,7 @@ void PartyMenuExit(void)
SetMainCallback2(PartyMenuCallback);
}
-void PartyMenuExitTask(u8 taskId)
+static void PartyMenuExitTask(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -668,7 +1743,7 @@ void PartyMenuExitTask(u8 taskId)
}
}
-void reset_brm(void)
+static void reset_brm(void)
{
gUnknown_0203CEC4 = NULL;
gUnknown_0203CEE4 = NULL;
@@ -676,14 +1751,15 @@ void reset_brm(void)
gUnknown_0203CEE0 = NULL;
}
-bool8 AllocPartyMenuBg(void)
+static bool8 AllocPartyMenuBg(void)
{
gUnknown_0203CEE4 = Alloc(0x800);
if (gUnknown_0203CEE4 == NULL)
return FALSE;
+
memset(gUnknown_0203CEE4, 0, 0x800);
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_086156B8, 3);
+ InitBgsFromTemplates(0, gUnknown_086156B8, ARRAY_COUNT(gUnknown_086156B8));
SetBgTilemapBuffer(1, gUnknown_0203CEE4);
ResetAllBgsCoordinates();
schedule_bg_copy_tilemap_to_vram(1);
@@ -695,63 +1771,63 @@ bool8 AllocPartyMenuBg(void)
return TRUE;
}
-bool8 AllocPartyMiscGfx(void)
+static bool8 AllocPartyMiscGfx(void)
{
int sizeout;
-
+
switch (gUnknown_0203CEC4->data[0])
{
- case 0:
- gUnknown_0203CEE0 = malloc_and_decompress(gPartyMenuMisc_Gfx, &sizeout);
- LoadBgTiles(1, gUnknown_0203CEE0, sizeout, 0);
- gUnknown_0203CEC4->data[0]++;
- break;
- case 1:
- if (!IsDma3ManagerBusyWithBgCopy())
- {
- LZDecompressWram(gPartyMenuMisc_Tilemap, gUnknown_0203CEE4);
- gUnknown_0203CEC4->data[0]++;
- }
- break;
- case 2:
- LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160);
- CpuCopy16(gPlttBufferUnfaded, gUnknown_0203CEC4->palBuffer, 0x160);
- gUnknown_0203CEC4->data[0]++;
- break;
- case 3:
- PartyPaletteBufferCopy(4);
- gUnknown_0203CEC4->data[0]++;
- break;
- case 4:
- PartyPaletteBufferCopy(5);
- gUnknown_0203CEC4->data[0]++;
- break;
- case 5:
- PartyPaletteBufferCopy(6);
- gUnknown_0203CEC4->data[0]++;
- break;
- case 6:
- PartyPaletteBufferCopy(7);
- gUnknown_0203CEC4->data[0]++;
- break;
- case 7:
- PartyPaletteBufferCopy(8);
+ case 0:
+ gUnknown_0203CEE0 = malloc_and_decompress(gPartyMenuMisc_Gfx, &sizeout);
+ LoadBgTiles(1, gUnknown_0203CEE0, sizeout, 0);
+ gUnknown_0203CEC4->data[0]++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ LZDecompressWram(gPartyMenuMisc_Tilemap, gUnknown_0203CEE4);
gUnknown_0203CEC4->data[0]++;
- break;
- default:
- return TRUE;
+ }
+ break;
+ case 2:
+ LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160);
+ CpuCopy16(gPlttBufferUnfaded, gUnknown_0203CEC4->palBuffer, 0x160);
+ gUnknown_0203CEC4->data[0]++;
+ break;
+ case 3:
+ PartyPaletteBufferCopy(4);
+ gUnknown_0203CEC4->data[0]++;
+ break;
+ case 4:
+ PartyPaletteBufferCopy(5);
+ gUnknown_0203CEC4->data[0]++;
+ break;
+ case 5:
+ PartyPaletteBufferCopy(6);
+ gUnknown_0203CEC4->data[0]++;
+ break;
+ case 6:
+ PartyPaletteBufferCopy(7);
+ gUnknown_0203CEC4->data[0]++;
+ break;
+ case 7:
+ PartyPaletteBufferCopy(8);
+ gUnknown_0203CEC4->data[0]++;
+ break;
+ default:
+ return TRUE;
}
return FALSE;
}
-void PartyPaletteBufferCopy(u8 offset)
+static void PartyPaletteBufferCopy(u8 offset)
{
offset *= 16;
CpuCopy16(&gPlttBufferUnfaded[0x30], &gPlttBufferUnfaded[offset], 32);
CpuCopy16(&gPlttBufferUnfaded[0x30], &gPlttBufferFaded[offset], 32);
}
-void FreePartyPointers(void)
+static void FreePartyPointers(void)
{
if (gUnknown_0203CEC4)
Free(gUnknown_0203CEC4);
@@ -764,12 +1840,12 @@ void FreePartyPointers(void)
FreeAllWindowBuffers();
}
-void PartyMenuInitHelperStructs(u8 a)
+static void PartyMenuInitHelperStructs(u8 a)
{
u8 i;
-
+
gUnknown_0203CEDC = Alloc(sizeof(struct Struct203CEDC[PARTY_SIZE]));
-
+
for (i = 0; i < PARTY_SIZE; i++)
{
gUnknown_0203CEDC[i].unk0 = &gUnknown_086156C4[1];
@@ -787,7 +1863,7 @@ void PartyMenuInitHelperStructs(u8 a)
gUnknown_0203CEDC[1].unk0 = &gUnknown_086156C4[0];
}
-void RenderPartyMenuBox(u8 slot)
+static void RenderPartyMenuBox(u8 slot)
{
if (gUnknown_0203CEC8.unk8_0 == 5 && slot > 2)
{
@@ -822,7 +1898,7 @@ void RenderPartyMenuBox(u8 slot)
DisplayPartyPokemonSelectHeldItemRelated(slot);
else if (!sub_81B0BFC(slot))
DisplayPartyPokemonData(slot);
-
+
if (gUnknown_0203CEC8.unk8_0 == 5)
sub_81B0FCC(slot, 0);
else if (gUnknown_0203CEC8.unk9 == slot)
@@ -835,7 +1911,7 @@ void RenderPartyMenuBox(u8 slot)
}
}
-void DisplayPartyPokemonData(u8 slot)
+static void DisplayPartyPokemonData(u8 slot)
{
if (GetMonData(&gPlayerParty[slot], MON_DATA_IS_EGG))
{
@@ -854,10 +1930,10 @@ void DisplayPartyPokemonData(u8 slot)
}
}
-void DisplayPartyPokemonSelectData(u8 slot, u8 stringID)
+static void DisplayPartyPokemonSelectData(u8 slot, u8 stringID)
{
struct Pokemon *mon = &gPlayerParty[slot];
-
+
gUnknown_0203CEDC[slot].unk0->unk0(gUnknown_0203CEDC[slot].windowId, 0, 0, 0, 0, 1);
DisplayPartyPokemonNickname(mon, &gUnknown_0203CEDC[slot], 0);
if (!GetMonData(mon, MON_DATA_IS_EGG))
@@ -868,12 +1944,12 @@ void DisplayPartyPokemonSelectData(u8 slot, u8 stringID)
DisplayPartyPokemonOtherText(stringID, &gUnknown_0203CEDC[slot], 0);
}
-void DisplayPartyPokemonSelectForBattle(u8 slot)
+static void DisplayPartyPokemonSelectForBattle(u8 slot)
{
u8 i;
struct Pokemon *mon = &gPlayerParty[slot];
u8 *ptr = gSelectedOrderFromParty;
-
+
if (!GetBattleEntryEligibility(mon))
{
DisplayPartyPokemonSelectData(slot, 7);
@@ -893,23 +1969,23 @@ void DisplayPartyPokemonSelectForBattle(u8 slot)
}
}
-void DisplayPartyPokemonSelectForContest(u8 slot)
+static void DisplayPartyPokemonSelectForContest(u8 slot)
{
switch (sub_80DAE0C(&gPlayerParty[slot]))
{
- case 0:
- case 3:
- case 4:
- DisplayPartyPokemonSelectData(slot, 7);
- break;
- case 1:
- case 2:
- DisplayPartyPokemonSelectData(slot, 6);
- break;
+ case 0:
+ case 3:
+ case 4:
+ DisplayPartyPokemonSelectData(slot, 7);
+ break;
+ case 1:
+ case 2:
+ DisplayPartyPokemonSelectData(slot, 6);
+ break;
}
}
-void DisplayPartyPokemonSelectForRelearner(u8 slot)
+static void DisplayPartyPokemonSelectForRelearner(u8 slot)
{
if (GetNumberOfRelearnableMoves(&gPlayerParty[slot]) == 0)
DisplayPartyPokemonSelectData(slot, 9);
@@ -917,7 +1993,7 @@ void DisplayPartyPokemonSelectForRelearner(u8 slot)
DisplayPartyPokemonSelectData(slot, 8);
}
-void sub_81B0B98(u8 slot)
+static void sub_81B0B98(u8 slot)
{
if (sub_81B218C(slot) == TRUE)
DisplayPartyPokemonSelectData(slot, 6);
@@ -925,7 +2001,7 @@ void sub_81B0B98(u8 slot)
DisplayPartyPokemonSelectData(slot, 7);
}
-void DisplayPartyPokemonSelectHeldItemRelated(u8 slot)
+static void DisplayPartyPokemonSelectHeldItemRelated(u8 slot)
{
if (GetMonData(&gPlayerParty[slot], MON_DATA_HELD_ITEM))
DisplayPartyPokemonSelectData(slot, 11);
@@ -933,11 +2009,11 @@ void DisplayPartyPokemonSelectHeldItemRelated(u8 slot)
DisplayPartyPokemonSelectData(slot, 12);
}
-bool8 sub_81B0BFC(u8 slot)
+static bool8 sub_81B0BFC(u8 slot)
{
struct Pokemon *currentPokemon = &gPlayerParty[slot];
u16 item = gSpecialVar_ItemId;
-
+
if (gUnknown_0203CEC8.unkB == 12)
{
gSpecialVar_Result = FALSE;
@@ -947,46 +2023,46 @@ bool8 sub_81B0BFC(u8 slot)
{
if (gUnknown_0203CEC8.unkB != 3)
return FALSE;
-
+
switch (CheckIfItemIsTMHMOrEvolutionStone(item))
{
- default:
+ default:
+ return FALSE;
+ case 1:
+ DisplayPartyPokemonSelectToTeachMove(slot, item, 0);
+ break;
+ case 2:
+ if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, 3, item) != SPECIES_NONE)
return FALSE;
- case 1:
- DisplayPartyPokemonSelectToTeachMove(slot, item, 0);
- break;
- case 2:
- if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, 3, item) != SPECIES_NONE)
- return FALSE;
- DisplayPartyPokemonSelectData(slot, 0);
- break;
+ DisplayPartyPokemonSelectData(slot, 0);
+ break;
}
}
return TRUE;
}
-void DisplayPartyPokemonSelectToTeachMove(u8 slot, u16 item, u8 tutor)
+static void DisplayPartyPokemonSelectToTeachMove(u8 slot, u16 item, u8 tutor)
{
- switch (CanPartyPokemonLearnTMTutor(&gPlayerParty[slot], item, tutor))
+ switch (CanMonLearnTMTutor(&gPlayerParty[slot], item, tutor))
{
- case CANNOT_LEARN_MOVE:
- case CANNOT_LEARN_MOVE_IS_EGG:
- DisplayPartyPokemonSelectData(slot, 9);
- break;
- case ALREADY_KNOWS_MOVE:
- DisplayPartyPokemonSelectData(slot, 10);
- break;
- default:
- DisplayPartyPokemonSelectData(slot, 8);
- break;
+ case CANNOT_LEARN_MOVE:
+ case CANNOT_LEARN_MOVE_IS_EGG:
+ DisplayPartyPokemonSelectData(slot, 9);
+ break;
+ case ALREADY_KNOWS_MOVE:
+ DisplayPartyPokemonSelectData(slot, 10);
+ break;
+ default:
+ DisplayPartyPokemonSelectData(slot, 8);
+ break;
}
}
-void sub_81B0CEC(u8 slot)
+static void sub_81B0CEC(u8 slot)
{
struct Struct203CEDC *structPtr = &gUnknown_0203CEDC[slot];
u8 actualSlot = slot - 3;
-
+
if (gUnknown_02022FF8[actualSlot].species == SPECIES_NONE)
{
sub_81B2720(structPtr->windowId);
@@ -1006,7 +2082,7 @@ void sub_81B0CEC(u8 slot)
}
}
-bool8 RenderPartyMenuBoxes(void)
+static bool8 RenderPartyMenuBoxes(void)
{
RenderPartyMenuBox(gUnknown_0203CEC4->data[0]);
if (++gUnknown_0203CEC4->data[0] == 6)
@@ -1014,20 +2090,20 @@ bool8 RenderPartyMenuBoxes(void)
return FALSE;
}
-u8* GetPartyMiscGraphicsTile(u16 tileId)
+static u8* GetPartyMiscGraphicsTile(u16 tileId)
{
return &gUnknown_0203CEE0[tileId << 5];
}
-void party_menu_add_per_mon_objects_internal(u8 slot)
+static void party_menu_add_per_mon_objects_internal(u8 slot)
{
u8 actualSlot;
-
+
if (gUnknown_0203CEC8.unk8_0 == 5 && slot > 2)
{
u8 status;
actualSlot = slot - 3;
-
+
if (gUnknown_02022FF8[actualSlot].species != SPECIES_NONE)
{
party_menu_link_mon_icon_anim(gUnknown_02022FF8[actualSlot].species, gUnknown_02022FF8[actualSlot].personality, &gUnknown_0203CEDC[slot], 0, 0);
@@ -1049,7 +2125,7 @@ void party_menu_add_per_mon_objects_internal(u8 slot)
}
}
-bool8 party_menu_add_per_mon_objects(void)
+static bool8 party_menu_add_per_mon_objects(void)
{
party_menu_add_per_mon_objects_internal(gUnknown_0203CEC4->data[0]);
if (++gUnknown_0203CEC4->data[0] == 6)
@@ -1057,7 +2133,7 @@ bool8 party_menu_add_per_mon_objects(void)
return FALSE;
}
-void sub_81B0F28(void)
+static void sub_81B0F28(void)
{
if (gUnknown_0203CEC8.unk8_0 == 5)
{
@@ -1082,48 +2158,48 @@ void sub_81B0F28(void)
void sub_81B0FCC(u8 slot, u8 b)
{
u8 spriteId;
-
+
switch (slot)
{
- default:
- if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE)
- {
- UpdateSelectedPartyBox(&gUnknown_0203CEDC[slot], GetPartyBoxPalBitfield(slot, b));
- AnimateSelectedPartyIcon(gUnknown_0203CEDC[slot].unk9, b);
- sub_81B5F98(gUnknown_0203CEDC[slot].unkB, b);
- }
- return;
- case 6:
+ default:
+ if (GetMonData(&gPlayerParty[slot], MON_DATA_SPECIES) != SPECIES_NONE)
+ {
+ UpdateSelectedPartyBox(&gUnknown_0203CEDC[slot], GetPartyBoxPalBitfield(slot, b));
+ AnimateSelectedPartyIcon(gUnknown_0203CEDC[slot].unk9, b);
+ sub_81B5F98(gUnknown_0203CEDC[slot].unkB, b);
+ }
+ return;
+ case 6:
+ if (b == 0)
+ sub_8199C30(1, 23, 16, 7, 2, 1);
+ else
+ sub_8199C30(1, 23, 16, 7, 2, 2);
+ spriteId = gUnknown_0203CEC4->unk8_2;
+ break;
+ case 7:
+ if (!gUnknown_0203CEC4->unk8_0)
+ {
if (b == 0)
- sub_8199C30(1, 23, 16, 7, 2, 1);
+ sub_8199C30(1, 23, 17, 7, 2, 1);
else
- sub_8199C30(1, 23, 16, 7, 2, 2);
- spriteId = gUnknown_0203CEC4->unk8_2;
- break;
- case 7:
- if (!gUnknown_0203CEC4->unk8_0)
- {
- if (b == 0)
- sub_8199C30(1, 23, 17, 7, 2, 1);
- else
- sub_8199C30(1, 23, 17, 7, 2, 2);
- }
- else if (b == 0)
- {
- sub_8199C30(1, 23, 18, 7, 2, 1);
- }
- else
- {
- sub_8199C30(1, 23, 18, 7, 2, 2);
- }
- spriteId = gUnknown_0203CEC4->unk9_0;
- break;
+ sub_8199C30(1, 23, 17, 7, 2, 2);
+ }
+ else if (b == 0)
+ {
+ sub_8199C30(1, 23, 18, 7, 2, 1);
+ }
+ else
+ {
+ sub_8199C30(1, 23, 18, 7, 2, 2);
+ }
+ spriteId = gUnknown_0203CEC4->unk9_0;
+ break;
}
sub_81B5F98(spriteId, b);
schedule_bg_copy_tilemap_to_vram(1);
}
-u8 GetPartyBoxPalBitfield(u8 slot, u8 b)
+static u8 GetPartyBoxPalBitfield(u8 slot, u8 b)
{
u8 returnVar = 0;
if (b == 1)
@@ -1141,22 +2217,22 @@ u8 GetPartyBoxPalBitfield(u8 slot, u8 b)
}
if (gUnknown_0203CEC8.unkB == 10 && slot == gUnknown_0203CEC8.unk9 )
returnVar |= 32;
-
+
return returnVar;
}
-bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8 slot)
+static bool8 PartyBoxPal_ParnterOrDisqualifiedInArena(u8 slot)
{
if (gUnknown_0203CEC8.mode == 2 && (slot == 1 || slot == 4 || slot == 5))
return TRUE;
-
+
if (slot < 3 && (gBattleTypeFlags & BATTLE_TYPE_ARENA) && gMain.inBattle && (gBattleStruct->arenaLostPlayerMons >> sub_81B8F38(slot) & 1))
return TRUE;
-
+
return FALSE;
}
-void sub_81B120C(void)
+static void sub_81B120C(void)
{
CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_086157C4, 23, 16, 7, 2, 17);
CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_086157E0, 23, 18, 7, 2, 17);
@@ -1165,40 +2241,41 @@ void sub_81B120C(void)
bool8 IsMultiBattle(void)
{
- if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI)) == (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI) && gMain.inBattle)
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattleTypeFlags & BATTLE_TYPE_TRAINER && gMain.inBattle)
return TRUE;
- return FALSE;
+ else
+ return FALSE;
}
-void sub_81B1288(struct Pokemon *partySlot, struct Pokemon *pokemon)
+static void sub_81B1288(struct Pokemon *partySlot, struct Pokemon *pokemon)
{
struct Pokemon *temp = Alloc(sizeof(struct Pokemon));
-
+
*temp = *partySlot;
*partySlot = *pokemon;
*pokemon = *temp;
-
+
Free(temp);
}
-void sub_81B12C0(u8 taskId)
+static void sub_81B12C0(u8 taskId)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
gTasks[taskId].func = c3_0811FAB4;
}
-void c3_0811FAB4(u8 taskId)
+static void c3_0811FAB4(u8 taskId)
{
if (!gPaletteFade.active)
{
if (gUnknown_0203CEC8.unk8_0 == 1)
sub_81B9080();
-
+
if (gUnknown_0203CEC4->exitCallback != NULL)
SetMainCallback2(gUnknown_0203CEC4->exitCallback);
else
SetMainCallback2(gUnknown_0203CEC8.exitCallback);
-
+
ResetSpriteData();
FreePartyPointers();
DestroyTask(taskId);
@@ -1220,33 +2297,34 @@ void sub_81B1370(u8 taskId)
if (!gPaletteFade.active && sub_81221EC() != TRUE)
{
s8 *ptr = sub_81B13EC();
-
+
switch (PartyMenuButtonHandler(ptr))
{
- case 1:
- sub_81B140C(taskId, ptr);
- break;
- case 2:
- sub_81B15D0(taskId, ptr);
- break;
- case 8:
- if (gUnknown_0203CEC4->unk8_0)
- {
- PlaySE(SE_SELECT);
- sub_81B4F88();
- }
+ case 1:
+ sub_81B140C(taskId, ptr);
+ break;
+ case 2:
+ sub_81B15D0(taskId, ptr);
+ break;
+ case 8:
+ if (gUnknown_0203CEC4->unk8_0)
+ {
+ PlaySE(SE_SELECT);
+ sub_81B4F88();
+ }
+ break;
}
}
}
-s8* sub_81B13EC(void)
+static s8* sub_81B13EC(void)
{
if (gUnknown_0203CEC8.unkB == 8 || gUnknown_0203CEC8.unkB == 10)
return &gUnknown_0203CEC8.unkA;
return &gUnknown_0203CEC8.unk9;
}
-void sub_81B140C(u8 taskId, s8 *ptr)
+static void sub_81B140C(u8 taskId, s8 *ptr)
{
if (*ptr == 6)
{
@@ -1256,73 +2334,73 @@ void sub_81B140C(u8 taskId, s8 *ptr)
{
switch (gUnknown_0203CEC8.unkB - 3)
{
- case 7:
- if (sub_81B15A4((u8*)ptr))
- {
- sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
- sub_81615A8(taskId);
- }
- break;
- case 0:
- if (sub_81B15A4((u8*)ptr))
- {
- if (gUnknown_0203CEC8.unk8_0 == 1)
- gUnknown_0203CEC4->exitCallback = sub_81B9140;
-
- sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
- gUnknown_03006328(taskId, sub_81B6794);
- }
- break;
- case 9:
- if (sub_81B15A4((u8*)ptr))
- {
- PlaySE(SE_SELECT);
- sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
- sub_81B7E4C(taskId);
- }
- break;
- case 4:
- if (sub_81B15A4((u8*)ptr))
- {
- PlaySE(SE_SELECT);
- sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
- sub_81B8474(taskId);
- }
- break;
- case 2:
- case 3:
- if (sub_81B15A4((u8*)ptr))
- {
- PlaySE(SE_SELECT);
- sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
- sub_81B7FAC(taskId);
- }
- break;
- case 5:
+ case 7:
+ if (sub_81B15A4((u8*)ptr))
+ {
+ sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
+ sub_81615A8(taskId);
+ }
+ break;
+ case 0:
+ if (sub_81B15A4((u8*)ptr))
+ {
+ if (gUnknown_0203CEC8.unk8_0 == 1)
+ gUnknown_0203CEC4->exitCallback = sub_81B9140;
+
+ sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
+ gUnknown_03006328(taskId, sub_81B6794);
+ }
+ break;
+ case 9:
+ if (sub_81B15A4((u8*)ptr))
+ {
PlaySE(SE_SELECT);
- sub_81B3938(taskId);
- break;
- case 8:
+ sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
+ sub_81B7E4C(taskId);
+ }
+ break;
+ case 4:
+ if (sub_81B15A4((u8*)ptr))
+ {
PlaySE(SE_SELECT);
- sub_81B12C0(taskId);
- break;
- case 10:
- if (sub_81B15A4((u8*)ptr))
- {
- sub_81B21AC(taskId, (u8)*ptr);
- }
- break;
- default:
- case 1:
- case 6:
+ sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
+ sub_81B8474(taskId);
+ }
+ break;
+ case 2:
+ case 3:
+ if (sub_81B15A4((u8*)ptr))
+ {
PlaySE(SE_SELECT);
- sub_81B36FC(taskId);
- break;
+ sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
+ sub_81B7FAC(taskId);
+ }
+ break;
+ case 5:
+ PlaySE(SE_SELECT);
+ sub_81B3938(taskId);
+ break;
+ case 8:
+ PlaySE(SE_SELECT);
+ sub_81B12C0(taskId);
+ break;
+ case 10:
+ if (sub_81B15A4((u8*)ptr))
+ {
+ sub_81B21AC(taskId, (u8)*ptr);
+ }
+ break;
+ default:
+ case 1:
+ case 6:
+ PlaySE(SE_SELECT);
+ sub_81B36FC(taskId);
+ break;
}
}
}
-bool8 sub_81B15A4(u8 *slotPtr)
+static bool8 sub_81B15A4(u8 *slotPtr)
{
if (GetMonData(&gPlayerParty[*slotPtr], MON_DATA_IS_EGG) == TRUE)
{
@@ -1332,48 +2410,48 @@ bool8 sub_81B15A4(u8 *slotPtr)
return TRUE;
}
-void sub_81B15D0(u8 taskId, s8 *ptr)
+static void sub_81B15D0(u8 taskId, s8 *ptr)
{
switch (gUnknown_0203CEC8.unkB)
{
- case 1:
- PlaySE(SE_HAZURE);
- break;
- case 8:
- case 10:
- PlaySE(SE_SELECT);
- sub_81B407C(taskId);
- break;
- case 13:
- PlaySE(SE_SELECT);
- sub_81B2210(taskId);
- break;
- default:
- PlaySE(SE_SELECT);
- if (sub_81B1660(taskId) != TRUE)
- {
- if (!sub_81221AC())
- gSpecialVar_0x8004 = 7;
- gUnknown_0203CEE8 = 0;
- *ptr = 7;
- sub_81B12C0(taskId);
- }
- break;
+ case 1:
+ PlaySE(SE_HAZURE);
+ break;
+ case 8:
+ case 10:
+ PlaySE(SE_SELECT);
+ sub_81B407C(taskId);
+ break;
+ case 13:
+ PlaySE(SE_SELECT);
+ sub_81B2210(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ if (sub_81B1660(taskId) != TRUE)
+ {
+ if (!sub_81221AC())
+ gSpecialVar_0x8004 = 7;
+ gUnknown_0203CEE8 = 0;
+ *ptr = 7;
+ sub_81B12C0(taskId);
+ }
+ break;
}
-}
+}
-bool8 sub_81B1660(u8 taskId)
+static bool8 sub_81B1660(u8 taskId)
{
const u8* stringPtr = NULL;
-
+
if (gUnknown_0203CEC8.unk8_0 == 2)
stringPtr = gText_CancelParticipation;
else if (gUnknown_0203CEC8.unk8_0 == 4)
stringPtr = sub_81B88BC();
-
+
if (stringPtr == NULL)
return FALSE;
-
+
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
StringExpandPlaceholders(gStringVar4, stringPtr);
sub_81B1B5C(gStringVar4, 1);
@@ -1381,7 +2459,7 @@ bool8 sub_81B1660(u8 taskId)
return TRUE;
}
-void sub_81B16D4(u8 taskId)
+static void sub_81B16D4(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -1390,82 +2468,83 @@ void sub_81B16D4(u8 taskId)
}
}
-void sub_81B1708(u8 taskId)
+static void sub_81B1708(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- gUnknown_0203CEE8 = 0;
- gUnknown_0203CEC8.unk9 = 7;
- sub_81B8558();
- sub_81B12C0(taskId);
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- sub_81B1C1C(taskId);
- break;
+ case 0:
+ gUnknown_0203CEE8 = 0;
+ gUnknown_0203CEC8.unk9 = 7;
+ sub_81B8558();
+ sub_81B12C0(taskId);
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ sub_81B1C1C(taskId);
+ break;
}
}
-u16 PartyMenuButtonHandler(s8 *ptr)
+static u16 PartyMenuButtonHandler(s8 *ptr)
{
s8 movementDir;
-
+
switch (gMain.newAndRepeatedKeys)
{
- case DPAD_UP:
+ case DPAD_UP:
+ movementDir = -1;
+ break;
+ case DPAD_DOWN:
+ movementDir = 1;
+ break;
+ case DPAD_LEFT:
+ movementDir = -2;
+ break;
+ case DPAD_RIGHT:
+ movementDir = 2;
+ break;
+ default:
+ switch (sub_812210C())
+ {
+ case 1:
movementDir = -1;
break;
- case DPAD_DOWN:
+ case 2:
movementDir = 1;
break;
- case DPAD_LEFT:
- movementDir = -2;
- break;
- case DPAD_RIGHT:
- movementDir = 2;
- break;
default:
- switch (sub_812210C())
- {
- case 1:
- movementDir = -1;
- break;
- case 2:
- movementDir = 1;
- break;
- default:
- movementDir = 0;
- break;
- }
+ movementDir = 0;
+ break;
+ }
+ break;
}
-
+
if (gMain.newKeys & START_BUTTON)
return 8;
-
+
if (movementDir)
{
UpdateCurrentPartySelection(ptr, movementDir);
return 0;
}
-
+
if ((gMain.newKeys & A_BUTTON) && *ptr == 7)
return 2;
-
+
return gMain.newKeys & (A_BUTTON | B_BUTTON);
}
-#ifdef NONMATCHING
-void UpdateCurrentPartySelection(s8 *ptr, s8 movementDir)
+static void UpdateCurrentPartySelection(s8 *ptr, s8 movementDir)
{
s8 slot = *ptr;
-
- if (gUnknown_0203CEC8.mode == 0)
+ u8 mode = gUnknown_0203CEC8.mode;
+
+ if (mode == 0)
SetNewPartySelectTarget1(ptr, movementDir);
else
SetNewPartySelectTarget2(ptr, movementDir);
-
+
if (*ptr != slot)
{
PlaySE(SE_SELECT);
@@ -1473,590 +2552,168 @@ void UpdateCurrentPartySelection(s8 *ptr, s8 movementDir)
sub_81B0FCC(*ptr, 1);
}
}
-#else
-NAKED
-void UpdateCurrentPartySelection(s8 *ptr, s8 b)
-{
- asm_unified("push {r4,r5,lr}\n\
- adds r5, r0, 0\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- ldrb r4, [r5]\n\
- ldr r0, =gUnknown_0203CEC8\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 26\n\
- lsrs r0, 30\n\
- cmp r0, 0\n\
- bne _081B1820\n\
- lsls r1, 24\n\
- asrs r1, 24\n\
- adds r0, r5, 0\n\
- bl SetNewPartySelectTarget1\n\
- b _081B182A\n\
- .pool\n\
-_081B1820:\n\
- lsls r1, 24\n\
- asrs r1, 24\n\
- adds r0, r5, 0\n\
- bl SetNewPartySelectTarget2\n\
-_081B182A:\n\
- movs r1, 0\n\
- ldrsb r1, [r5, r1]\n\
- lsls r4, 24\n\
- asrs r0, r4, 24\n\
- cmp r1, r0\n\
- beq _081B184C\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- lsrs r0, r4, 24\n\
- movs r1, 0\n\
- bl sub_81B0FCC\n\
- ldrb r0, [r5]\n\
- movs r1, 0x1\n\
- bl sub_81B0FCC\n\
-_081B184C:\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n");
-}
-#endif
-#ifdef NONMATCHING
-void SetNewPartySelectTarget1(s8 *ptr, s8 b)
+static void SetNewPartySelectTarget1(s8 *ptr, s8 b)
{
- u8 r0r2;
-
switch (b)
{
- case -1:
- r0r2 = *ptr;
- if (*ptr == 0)
- {
- *ptr = 7;
- }
- else if (*ptr == 6)
- {
+ case -1:
+ if (*ptr == 0)
+ {
+ *ptr = 7;
+ }
+ else if (*ptr == 6)
+ {
+ *ptr = gPlayerPartyCount - 1;
+ }
+ else if (*ptr == 7)
+ {
+ if (gUnknown_0203CEC4->unk8_0)
+ *ptr = 6;
+ else
*ptr = gPlayerPartyCount - 1;
- }
- else if (*ptr == 7)
+ }
+ else
+ {
+ (*ptr)--;
+ }
+ break;
+ case 1:
+ if (*ptr == 7)
+ {
+ *ptr = 0;
+ }
+ else
+ {
+ if (*ptr == gPlayerPartyCount - 1)
{
if (gUnknown_0203CEC4->unk8_0)
*ptr = 6;
else
- *ptr = gPlayerPartyCount - 1;
+ *ptr = 7;
}
else
{
- *ptr = r0r2 - 1;
- }
- break;
- case 1:
- r0r2 = *ptr;
- if (*ptr != 7)
- {
- if ((u32)*ptr == gPlayerPartyCount - 1)
- {
- if (gUnknown_0203CEC4->unk8_0)
- *ptr = 6;
- else
- *ptr = 7;
- }
- else
- {
- *ptr = r0r2 + 1;
- }
+ (*ptr)++;
}
+ }
+ break;
+ case 2:
+ if (gPlayerPartyCount != 1 && *ptr == 0)
+ {
+ if (gUnknown_0203CEC4->unk8_1 == 0)
+ *ptr = 1;
else
- {
- *ptr = 0;
- }
- break;
- case 2:
- if (gPlayerPartyCount != 1 && *ptr == 0)
- {
- if (gUnknown_0203CEC4->unk8_1 == 0)
- *ptr = 1;
- else
- *ptr = gUnknown_0203CEC4->unk8_1;
- }
- break;
- case -2:
- if (*ptr != 0 && *ptr != 6 && *ptr != 7)
- {
- gUnknown_0203CEC4->unk8_1 = *ptr;
- *ptr = 0;
- }
- break;
+ *ptr = gUnknown_0203CEC4->unk8_1;
+ }
+ break;
+ case -2:
+ if (*ptr != 0 && *ptr != 6 && *ptr != 7)
+ {
+ gUnknown_0203CEC4->unk8_1 = *ptr;
+ *ptr = 0;
+ }
+ break;
}
}
-#else
-NAKED
-void SetNewPartySelectTarget1(s8 *ptr, s8 b)
-{
- asm_unified("push {r4,lr}\n\
- adds r4, r0, 0\n\
- lsls r1, 24\n\
- asrs r1, 24\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- cmp r1, r0\n\
- beq _081B187A\n\
- cmp r1, r0\n\
- bgt _081B1870\n\
- subs r0, 0x1\n\
- cmp r1, r0\n\
- beq _081B1924\n\
- b _081B1952\n\
-_081B1870:\n\
- cmp r1, 0x1\n\
- beq _081B18C0\n\
- cmp r1, 0x2\n\
- beq _081B18F8\n\
- b _081B1952\n\
-_081B187A:\n\
- ldrb r0, [r4]\n\
- movs r1, 0\n\
- ldrsb r1, [r4, r1]\n\
- cmp r1, 0\n\
- bne _081B1888\n\
- movs r0, 0x7\n\
- b _081B1950\n\
-_081B1888:\n\
- cmp r1, 0x6\n\
- bne _081B1898\n\
- ldr r0, =gPlayerPartyCount\n\
- ldrb r0, [r0]\n\
- subs r0, 0x1\n\
- b _081B1950\n\
- .pool\n\
-_081B1898:\n\
- cmp r1, 0x7\n\
- bne _081B18BC\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r0, [r0]\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _081B18B0\n\
- movs r0, 0x6\n\
- b _081B1950\n\
- .pool\n\
-_081B18B0:\n\
- ldr r0, =gPlayerPartyCount\n\
- ldrb r0, [r0]\n\
- subs r0, 0x1\n\
- b _081B1950\n\
- .pool\n\
-_081B18BC:\n\
- subs r0, 0x1\n\
- b _081B1950\n\
-_081B18C0:\n\
- ldrb r2, [r4]\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- cmp r0, 0x7\n\
- beq _081B194E\n\
- movs r1, 0\n\
- ldrsb r1, [r4, r1]\n\
- ldr r0, =gPlayerPartyCount\n\
- ldrb r0, [r0]\n\
- subs r0, 0x1\n\
- cmp r1, r0\n\
- bne _081B18F4\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r0, [r0]\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _081B18F0\n\
- movs r0, 0x6\n\
- b _081B1950\n\
- .pool\n\
-_081B18F0:\n\
- movs r0, 0x7\n\
- b _081B1950\n\
-_081B18F4:\n\
- adds r0, r2, 0x1\n\
- b _081B1950\n\
-_081B18F8:\n\
- ldr r0, =gPlayerPartyCount\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x1\n\
- beq _081B1952\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- cmp r0, 0\n\
- bne _081B1952\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r0, [r0]\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 28\n\
- lsrs r0, 29\n\
- cmp r0, 0\n\
- bne _081B1950\n\
- movs r0, 0x1\n\
- b _081B1950\n\
- .pool\n\
-_081B1924:\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- cmp r0, 0\n\
- beq _081B1952\n\
- cmp r0, 0x6\n\
- beq _081B1952\n\
- cmp r0, 0x7\n\
- beq _081B1952\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r3, [r0]\n\
- movs r1, 0\n\
- ldrsb r1, [r4, r1]\n\
- movs r0, 0x7\n\
- ands r1, r0\n\
- lsls r1, 1\n\
- ldrb r2, [r3, 0x8]\n\
- movs r0, 0xF\n\
- negs r0, r0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r3, 0x8]\n\
-_081B194E:\n\
- movs r0, 0\n\
-_081B1950:\n\
- strb r0, [r4]\n\
-_081B1952:\n\
- pop {r4}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n");
-}
-#endif
-#ifdef NONMATCHING
-void SetNewPartySelectTarget2(s8 *ptr, s8 b)
+static void SetNewPartySelectTarget2(s8 *ptr, s8 b)
{
- u8 unk;
s8 unk2 = b;
- u8 unk3;
-
+
switch (b)
{
- case -1:
- unk = *ptr;
- if (*ptr == 0)
- {
- *ptr = 7;
- }
- else if (*ptr == 6)
+ case -1:
+ if (*ptr == 0)
+ {
+ *ptr = 7;
+ break;
+ }
+ else if (*ptr == 6)
+ {
+ *ptr = gPlayerPartyCount - 1;
+ break;
+ }
+ else if (*ptr == 7)
+ {
+ if (gUnknown_0203CEC4->unk8_0)
{
- *ptr = gPlayerPartyCount - 1;
+ *ptr = 6;
+ break;
}
- else if (*ptr == 7)
+ (*ptr)--;
+ }
+ unk2 = sub_81B1B00(*ptr, unk2);
+ if (unk2 != -1)
+ *ptr = unk2;
+ break;
+ case 1:
+ if (*ptr == 6)
+ {
+ *ptr = 7;
+ }
+ else if (*ptr == 7)
+ {
+ *ptr = 0;
+ }
+ else
+ {
+ unk2 = sub_81B1B00(*ptr, 1);
+ if (unk2 == -1)
{
if (gUnknown_0203CEC4->unk8_0)
- {
*ptr = 6;
- }
else
- {
- *ptr = unk - 1;
- unk2 = sub_81B1B00(*ptr, unk2);
- if (unk2 != -1)
- *ptr = unk2;
- }
- }
- else
- {
- unk2 = sub_81B1B00(*ptr, unk2);
- if (unk2 != -1)
- *ptr = unk2;
- }
- break;
- case 1:
- if (*ptr == 6)
- {
- *ptr = 7;
- }
- else if (*ptr == 7)
- {
- *ptr = 0;
+ *ptr = 7;
}
else
{
- unk2 = sub_81B1B00(*ptr, 1);
- if (unk2 == -1)
- {
- if (gUnknown_0203CEC4->unk8_0)
- *ptr = 6;
- else
- *ptr = 7;
- }
- else
- {
- *ptr = unk2;
- }
+ *ptr = unk2;
}
- break;
- case 2:
- if (*ptr == 0)
+ }
+ break;
+ case 2:
+ if (*ptr == 0)
+ {
+ if (gUnknown_0203CEC4->unk8_1 == 3)
{
- if (gUnknown_0203CEC4->unk8_1 == 3)
- {
- if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES) != SPECIES_NONE)
- *ptr = 3;
- }
- else if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES) != SPECIES_NONE)
- {
- *ptr = 2;
- }
+ if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES) != SPECIES_NONE)
+ *ptr = 3;
}
- else if (*ptr == 1)
+ else if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES) != SPECIES_NONE)
{
- if (gUnknown_0203CEC4->unk8_1 == 5)
- {
- if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES) != SPECIES_NONE)
- *ptr = 5;
- }
- else if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES) != SPECIES_NONE)
- {
- *ptr = 4;
- }
+ *ptr = 2;
}
- break;
- case -2:
- unk3 = *ptr - 2;
- if (unk3 <= 1)
+ }
+ else if (*ptr == 1)
+ {
+ if (gUnknown_0203CEC4->unk8_1 == 5)
{
- gUnknown_0203CEC4->unk8_1 = *ptr;
- *ptr = 0;
+ if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES) != SPECIES_NONE)
+ *ptr = 5;
}
- else
+ else if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES) != SPECIES_NONE)
{
- unk3 = *ptr - 4;
- if (unk3 <= 1)
- {
- gUnknown_0203CEC4->unk8_1 = *ptr;
- *ptr = 1;
- }
+ *ptr = 4;
}
- break;
+ }
+ break;
+ case -2:
+ if (*ptr == 2 || *ptr == 3)
+ {
+ gUnknown_0203CEC4->unk8_1 = *ptr;
+ *ptr = 0;
+ }
+ else if (*ptr == 4 || *ptr == 5)
+ {
+ gUnknown_0203CEC4->unk8_1 = *ptr;
+ *ptr = 1;
+ }
+ break;
}
}
-#else
-NAKED
-void SetNewPartySelectTarget2(s8 *ptr, s8 b)
-{
- asm_unified("push {r4-r6,lr}\n\
- adds r4, r0, 0\n\
- lsls r1, 24\n\
- lsrs r2, r1, 24\n\
- asrs r5, r1, 24\n\
- movs r6, 0x1\n\
- negs r6, r6\n\
- cmp r5, r6\n\
- beq _081B1988\n\
- cmp r5, r6\n\
- bgt _081B197E\n\
- movs r0, 0x2\n\
- negs r0, r0\n\
- cmp r5, r0\n\
- bne _081B197C\n\
- b _081B1A9C\n\
-_081B197C:\n\
- b _081B1AF4\n\
-_081B197E:\n\
- cmp r5, 0x1\n\
- beq _081B19E4\n\
- cmp r5, 0x2\n\
- beq _081B1A24\n\
- b _081B1AF4\n\
-_081B1988:\n\
- ldrb r1, [r4]\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- cmp r0, 0\n\
- bne _081B1996\n\
- movs r0, 0x7\n\
- b _081B1AF2\n\
-_081B1996:\n\
- cmp r0, 0x6\n\
- bne _081B19A8\n\
- ldr r0, =gPlayerPartyCount\n\
- ldrb r0, [r0]\n\
- subs r0, 0x1\n\
- b _081B1AF2\n\
- .pool\n\
-_081B19A8:\n\
- cmp r0, 0x7\n\
- bne _081B19C4\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r0, [r0]\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _081B19C0\n\
- movs r0, 0x6\n\
- b _081B1AF2\n\
- .pool\n\
-_081B19C0:\n\
- subs r0, r1, 0x1\n\
- strb r0, [r4]\n\
-_081B19C4:\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- lsls r1, r2, 24\n\
- asrs r1, 24\n\
- bl sub_81B1B00\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- asrs r0, 24\n\
- movs r1, 0x1\n\
- negs r1, r1\n\
- cmp r0, r1\n\
- bne _081B19E0\n\
- b _081B1AF4\n\
-_081B19E0:\n\
- strb r2, [r4]\n\
- b _081B1AF4\n\
-_081B19E4:\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- cmp r0, 0x6\n\
- bne _081B19F0\n\
- movs r0, 0x7\n\
- b _081B1AF2\n\
-_081B19F0:\n\
- cmp r0, 0x7\n\
- bne _081B19F8\n\
- movs r0, 0\n\
- b _081B1AF2\n\
-_081B19F8:\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- movs r1, 0x1\n\
- bl sub_81B1B00\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- asrs r0, 24\n\
- cmp r0, r6\n\
- bne _081B19E0\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r0, [r0]\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 31\n\
- cmp r0, 0\n\
- beq _081B1A20\n\
- movs r0, 0x6\n\
- b _081B1AF2\n\
- .pool\n\
-_081B1A20:\n\
- movs r0, 0x7\n\
- b _081B1AF2\n\
-_081B1A24:\n\
- movs r0, 0\n\
- ldrsb r0, [r4, r0]\n\
- cmp r0, 0\n\
- bne _081B1A5C\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r0, [r0]\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 28\n\
- lsrs r6, r0, 29\n\
- cmp r6, 0x3\n\
- bne _081B1A54\n\
- ldr r0, =gPlayerParty + 300\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- cmp r0, 0\n\
- beq _081B1AF4\n\
- strb r6, [r4]\n\
- b _081B1AF4\n\
- .pool\n\
-_081B1A54:\n\
- ldr r0, =gPlayerParty + 200\n\
- b _081B1A70\n\
- .pool\n\
-_081B1A5C:\n\
- cmp r0, 0x1\n\
- bne _081B1AF4\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r0, [r0]\n\
- ldrb r0, [r0, 0x8]\n\
- lsls r0, 28\n\
- lsrs r5, r0, 29\n\
- cmp r5, 0x5\n\
- bne _081B1A88\n\
- ldr r0, =gPlayerParty + 500\n\
-_081B1A70:\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- cmp r0, 0\n\
- beq _081B1AF4\n\
- strb r5, [r4]\n\
- b _081B1AF4\n\
- .pool\n\
-_081B1A88:\n\
- ldr r0, =gPlayerParty + 400\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- cmp r0, 0\n\
- beq _081B1AF4\n\
- movs r0, 0x4\n\
- b _081B1AF2\n\
- .pool\n\
-_081B1A9C:\n\
- ldrb r1, [r4]\n\
- subs r0, r1, 0x2\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x1\n\
- bhi _081B1ACC\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r3, [r0]\n\
- movs r1, 0\n\
- ldrsb r1, [r4, r1]\n\
- movs r0, 0x7\n\
- ands r1, r0\n\
- lsls r1, 1\n\
- ldrb r2, [r3, 0x8]\n\
- movs r0, 0xF\n\
- negs r0, r0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r3, 0x8]\n\
- movs r0, 0\n\
- b _081B1AF2\n\
- .pool\n\
-_081B1ACC:\n\
- subs r0, r1, 0x4\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x1\n\
- bhi _081B1AF4\n\
- ldr r0, =gUnknown_0203CEC4\n\
- ldr r3, [r0]\n\
- movs r1, 0\n\
- ldrsb r1, [r4, r1]\n\
- movs r0, 0x7\n\
- ands r1, r0\n\
- lsls r1, 1\n\
- ldrb r2, [r3, 0x8]\n\
- movs r0, 0xF\n\
- negs r0, r0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r3, 0x8]\n\
- movs r0, 0x1\n\
-_081B1AF2:\n\
- strb r0, [r4]\n\
-_081B1AF4:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n");
-}
-#endif
-s8 sub_81B1B00(s8 a, s8 b)
+static s8 sub_81B1B00(s8 a, s8 b)
{
while (TRUE)
{
@@ -2077,14 +2734,14 @@ u8* GetMonNickname(struct Pokemon *mon, u8 *dest)
u8 sub_81B1B5C(const u8* str, u8 b)
{
u8 taskId;
-
+
sub_81B3300(str);
taskId = CreateTask(sub_81B1B8C, 1);
gTasks[taskId].data[0] = b;
return taskId;
}
-void sub_81B1B8C(u8 taskId)
+static void sub_81B1B8C(u8 taskId)
{
if (RunTextPrintersRetIsActive(6) != TRUE)
{
@@ -2102,7 +2759,7 @@ bool8 sub_81B1BD4(void)
return FuncIsActiveTask(sub_81B1B8C);
}
-void sub_81B1BE8(u8 taskId)
+static void sub_81B1BE8(u8 taskId)
{
if (sub_81221EC() != TRUE)
{
@@ -2111,7 +2768,7 @@ void sub_81B1BE8(u8 taskId)
}
}
-void sub_81B1C1C(u8 taskId)
+static void sub_81B1C1C(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -2129,7 +2786,7 @@ void sub_81B1C1C(u8 taskId)
}
}
-void sub_81B1C84(struct Pokemon *mon, u16 item, u8 c, u8 unused)
+static void sub_81B1C84(struct Pokemon *mon, u16 item, u8 c, u8 unused)
{
GetMonNickname(mon, gStringVar1);
CopyItemName(item, gStringVar2);
@@ -2138,7 +2795,7 @@ void sub_81B1C84(struct Pokemon *mon, u16 item, u8 c, u8 unused)
schedule_bg_copy_tilemap_to_vram(2);
}
-void sub_81B1CD0(struct Pokemon *mon, u16 item, u8 c)
+static void sub_81B1CD0(struct Pokemon *mon, u16 item, u8 c)
{
GetMonNickname(mon, gStringVar1);
CopyItemName(item, gStringVar2);
@@ -2147,7 +2804,7 @@ void sub_81B1CD0(struct Pokemon *mon, u16 item, u8 c)
schedule_bg_copy_tilemap_to_vram(2);
}
-void sub_81B1D1C(struct Pokemon *mon, u16 item, u8 c)
+static void sub_81B1D1C(struct Pokemon *mon, u16 item, u8 c)
{
GetMonNickname(mon, gStringVar1);
CopyItemName(item, gStringVar2);
@@ -2156,7 +2813,7 @@ void sub_81B1D1C(struct Pokemon *mon, u16 item, u8 c)
schedule_bg_copy_tilemap_to_vram(2);
}
-void sub_81B1D68(u16 item, u16 item2, u8 c)
+static void sub_81B1D68(u16 item, u16 item2, u8 c)
{
CopyItemName(item, gStringVar1);
CopyItemName(item2, gStringVar2);
@@ -2165,10 +2822,10 @@ void sub_81B1D68(u16 item, u16 item2, u8 c)
schedule_bg_copy_tilemap_to_vram(2);
}
-void sub_81B1DB8(struct Pokemon *mon, u16 item)
+static void sub_81B1DB8(struct Pokemon *mon, u16 item)
{
u8 itemBytes[2];
-
+
if (ItemIsMail(item) == TRUE)
{
if (GiveMailToMon(mon, item) == 0xFF)
@@ -2179,29 +2836,29 @@ void sub_81B1DB8(struct Pokemon *mon, u16 item)
SetMonData(mon, MON_DATA_HELD_ITEM, itemBytes);
}
-u8 sub_81B1E00(struct Pokemon* mon)
+static u8 sub_81B1E00(struct Pokemon* mon)
{
u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);
-
+
if (item == ITEM_NONE)
return 0;
if (AddBagItem(item, 1) == FALSE)
return 1;
-
+
item = ITEM_NONE;
SetMonData(mon, MON_DATA_HELD_ITEM, &item);
return 2;
}
-void pokemon_item_not_removed(u16 itemUnused)
+static void pokemon_item_not_removed(u16 itemUnused)
{
StringExpandPlaceholders(gStringVar4, gText_BagFullCouldNotRemoveItem);
}
-void sub_81B1E60(u8 taskId)
+static void sub_81B1E60(u8 taskId)
{
s16 *data = gTasks[taskId].data;
-
+
data[0] += data[2];
data[3]--;
SetMonData(&gPlayerParty[data[4]], MON_DATA_HP, &data[0]);
@@ -2219,7 +2876,7 @@ void sub_81B1F18(u8 taskId, u8 slot, s8 c, s16 HPDifference, TaskFunc func)
{
struct Pokemon *mon = &gPlayerParty[slot];
s16 *data = gTasks[taskId].data;
-
+
data[0] = GetMonData(mon, MON_DATA_HP);
data[1] = GetMonData(mon, MON_DATA_MAX_HP);
data[2] = c;
@@ -2229,10 +2886,10 @@ void sub_81B1F18(u8 taskId, u8 slot, s8 c, s16 HPDifference, TaskFunc func)
SetTaskFuncWithFollowupFunc(taskId, sub_81B1E60, func);
}
-void sub_81B1FA8(u8 taskId, u8 b, u32 hp)
+static void sub_81B1FA8(u8 taskId, u8 b, u32 hp)
{
s16 *data = gTasks[taskId].data;
-
+
switch (b) // only case 0 is used
{
case 0:
@@ -2275,7 +2932,7 @@ u8 pokemon_ailments_get_primary(u32 status)
u8 sub_81B205C(struct Pokemon *mon)
{
u8 ailment;
-
+
if (GetMonData(mon, MON_DATA_HP) == 0)
return AILMENT_FNT;
ailment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS));
@@ -2286,14 +2943,14 @@ u8 sub_81B205C(struct Pokemon *mon)
return AILMENT_NONE;
}
-void sub_81B209C(void)
+static void sub_81B209C(void)
{
u16 *ptr;
-
+
if (gUnknown_0203CEC8.unk8_0 == 11)
{
u8 i;
-
+
ptr = &gUnknown_0203CEC8.unkE;
gUnknown_0203CEC8.unkE = 0;
if (gSpecialVar_0x8005 == 0)
@@ -2309,7 +2966,7 @@ void sub_81B209C(void)
}
}
-bool16 sub_81B2134(struct Pokemon *mon)
+static bool16 sub_81B2134(struct Pokemon *mon)
{
if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && sub_802C908(GetMonData(mon, MON_DATA_SPECIES)))
return TRUE;
@@ -2318,21 +2975,21 @@ bool16 sub_81B2134(struct Pokemon *mon)
// Dodrio Berry Picking select?
-bool16 sub_81B2164(struct Pokemon *mon)
+static bool16 sub_81B2164(struct Pokemon *mon)
{
if (GetMonData(mon, MON_DATA_IS_EGG) != TRUE && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_DODRIO)
return TRUE;
return FALSE;
}
-bool8 sub_81B218C(u8 slot)
+static bool8 sub_81B218C(u8 slot)
{
if (!((gUnknown_0203CEC8.unkE >> slot) & 1))
return FALSE;
return TRUE;
}
-void sub_81B21AC(u8 taskId, u8 slot)
+static void sub_81B21AC(u8 taskId, u8 slot)
{
if (sub_81B218C(slot) == TRUE)
{
@@ -2349,14 +3006,14 @@ void sub_81B21AC(u8 taskId, u8 slot)
}
}
-void sub_81B2210(u8 taskId)
+static void sub_81B2210(u8 taskId)
{
sub_81B1B5C(gText_CancelParticipation, 1);
schedule_bg_copy_tilemap_to_vram(2);
gTasks[taskId].func = sub_81B2248;
}
-void sub_81B2248(u8 taskId)
+static void sub_81B2248(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -2365,28 +3022,29 @@ void sub_81B2248(u8 taskId)
}
}
-void sub_81B227C(u8 taskId)
+static void sub_81B227C(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- gSpecialVar_0x8004 = 7;
- sub_81B12C0(taskId);
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- gTasks[taskId].func = sub_81B1C1C;
- break;
+ case 0:
+ gSpecialVar_0x8004 = 7;
+ sub_81B12C0(taskId);
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ gTasks[taskId].func = sub_81B1C1C;
+ break;
}
}
-u8 CanPartyPokemonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor)
+static u8 CanMonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor)
{
u16 move;
-
+
if (GetMonData(mon, MON_DATA_IS_EGG))
return CANNOT_LEARN_MOVE_IS_EGG;
+
if (item >= ITEM_TM01_FOCUS_PUNCH)
{
if (CanMonLearnTMHM(mon, item - ITEM_TM01_FOCUS_PUNCH))
@@ -2395,50 +3053,52 @@ u8 CanPartyPokemonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor)
return CANNOT_LEARN_MOVE;
do {} while (0); // :morphon:
}
- else if (sub_81B2370(GetMonData(mon, MON_DATA_SPECIES), tutor) == FALSE)
+ else if (CanLearnTutorMove(GetMonData(mon, MON_DATA_SPECIES), tutor) == FALSE)
{
return CANNOT_LEARN_MOVE;
}
else
{
- move = sub_81B2360(tutor);
+ move = GetTutorMove(tutor);
}
-
- if (pokemon_has_move(mon, move) == TRUE)
+
+ if (MonKnowsMove(mon, move) == TRUE)
return ALREADY_KNOWS_MOVE;
- return CAN_LEARN_MOVE;
+ else
+ return CAN_LEARN_MOVE;
}
-u16 sub_81B2360(u8 tutor)
+static u16 GetTutorMove(u8 tutor)
{
- return gUnknown_0861500C[tutor];
+ return gTutorMoves[tutor];
}
-bool8 sub_81B2370(u16 species, u8 tutor)
+static bool8 CanLearnTutorMove(u16 species, u8 tutor)
{
- if (gUnknown_08615048[species] & (1 << tutor))
+ if (sTutorLearnsets[species] & (1 << tutor))
return TRUE;
- return FALSE;
+ else
+ return FALSE;
}
-void sub_81B239C(u8 a)
+static void sub_81B239C(u8 a)
{
u8 i;
-
+
switch (a)
{
- case 0:
- InitWindows(gUnknown_08615810);
- break;
- case 1:
- InitWindows(gUnknown_08615850);
- break;
- case 2:
- InitWindows(gUnknown_08615890);
- break;
- default:
- InitWindows(gUnknown_086158D0);
- break;
+ case 0:
+ InitWindows(gUnknown_08615810);
+ break;
+ case 1:
+ InitWindows(gUnknown_08615850);
+ break;
+ case 2:
+ InitWindows(gUnknown_08615890);
+ break;
+ default:
+ InitWindows(gUnknown_086158D0);
+ break;
}
DeactivateAllTextPrinters();
for (i = 0; i < PARTY_SIZE; i++)
@@ -2448,13 +3108,13 @@ void sub_81B239C(u8 a)
LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
}
-void sub_81B2428(bool8 a)
+static void sub_81B2428(bool8 a)
{
u8 firstWindowId;
u8 windowId;
u8 offset;
u8 mainOffset;
-
+
if (gUnknown_0203CEC8.unk8_0 != 5)
{
if (a == TRUE)
@@ -2490,16 +3150,16 @@ void sub_81B2428(bool8 a)
}
}
-u16* GetPartyMenuPaletteFromBuffer(u8 paletteId)
+static u16* GetPartyMenuPaletteFromBuffer(u8 paletteId)
{
return &gUnknown_0203CEC4->palBuffer[paletteId];
}
-void BlitBitmapToPartyWindow(u8 windowId, u8 *b, u8 c, u8 x, u8 y, u8 width, u8 height)
+static void BlitBitmapToPartyWindow(u8 windowId, const u8 *b, u8 c, u8 x, u8 y, u8 width, u8 height)
{
u8 *pixels = AllocZeroed(height * width * 32);
u8 i, j;
-
+
if (pixels != NULL)
{
for (i = 0; i < height; i++)
@@ -2512,7 +3172,7 @@ void BlitBitmapToPartyWindow(u8 windowId, u8 *b, u8 c, u8 x, u8 y, u8 width, u8
}
}
-void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f)
+static void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f)
{
if (width == 0 && height == 0)
{
@@ -2525,7 +3185,7 @@ void BlitBitmapToPartyWindow_Default1(u8 windowId, u8 x, u8 y, u8 width, u8 heig
BlitBitmapToPartyWindow(windowId, gUnknown_086159CE, 10, x, y, width, height);
}
-void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f)
+static void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 f)
{
if (width == 0 && height == 0)
{
@@ -2538,15 +3198,15 @@ void BlitBitmapToPartyWindow_Default2(u8 windowId, u8 x, u8 y, u8 width, u8 heig
BlitBitmapToPartyWindow(windowId, gUnknown_08615A4A, 18, x, y, width, height);
}
-void sub_81B2720(u8 windowId)
+static void sub_81B2720(u8 windowId)
{
BlitBitmapToPartyWindow(windowId, gUnknown_08615A80, 18, 0, 0, 18, 3);
}
-void UpdateSelectedPartyBox(struct Struct203CEDC *ptr, u8 bitfield)
+static void UpdateSelectedPartyBox(struct Struct203CEDC *ptr, u8 bitfield)
{
u8 palNum = GetWindowAttribute(ptr->windowId, WINDOW_PALETTE_NUM) * 16;
-
+
if (bitfield & 0x40)
{
LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AF1[0]), gUnknown_08615AC0[0] + palNum, 2);
@@ -2666,15 +3326,15 @@ void UpdateSelectedPartyBox(struct Struct203CEDC *ptr, u8 bitfield)
}
}
-void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, u8 *align)
+static void DisplayPartyPokemonBarDetail(u8 windowId, const u8 *str, u8 color, const u8 *align)
{
AddTextPrinterParameterized3(windowId, 0, align[0], align[1], gUnknown_086157FC[color], 0, str);
}
-void DisplayPartyPokemonNickname(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
+static void DisplayPartyPokemonNickname(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
{
u8 nickname[POKEMON_NAME_LENGTH + 1];
-
+
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
if (c == 1)
@@ -2684,7 +3344,7 @@ void DisplayPartyPokemonNickname(struct Pokemon *mon, struct Struct203CEDC *ptr,
}
}
-void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
+static void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
{
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
@@ -2699,7 +3359,7 @@ void DisplayPartyPokemonLevelCheck(struct Pokemon *mon, struct Struct203CEDC *pt
}
}
-void DisplayPartyPokemonLevel(u8 level, struct Struct203CEDC *ptr)
+static void DisplayPartyPokemonLevel(u8 level, struct Struct203CEDC *ptr)
{
ConvertIntToDecimalStringN(gStringVar2, level, 0, 3);
StringCopy(gStringVar1, gText_LevelSymbol);
@@ -2707,40 +3367,40 @@ void DisplayPartyPokemonLevel(u8 level, struct Struct203CEDC *ptr)
DisplayPartyPokemonBarDetail(ptr->windowId, gStringVar1, 0, &ptr->unk0->unk4[4]);
}
-void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
+static void DisplayPartyPokemonGenderNidoranCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
{
u8 nickname[POKEMON_NAME_LENGTH + 1];
-
+
if (c == 1)
ptr->unk0->unk0(ptr->windowId, ptr->unk0->unk4[8] >> 3, (ptr->unk0->unk4[9] >> 3) + 1, ptr->unk0->unk4[10] >> 3, ptr->unk0->unk4[11] >> 3, 0);
GetMonNickname(mon, nickname);
DisplayPartyPokemonGender(GetMonGender(mon), GetMonData(mon, MON_DATA_SPECIES), nickname, ptr);
}
-void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct Struct203CEDC *ptr)
+static void DisplayPartyPokemonGender(u8 gender, u16 species, u8 *nickname, struct Struct203CEDC *ptr)
{
u8 palNum = GetWindowAttribute(ptr->windowId, WINDOW_PALETTE_NUM) * 16;
-
+
if (species == SPECIES_NONE)
return;
if ((species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) && StringCompare(nickname, gSpeciesNames[species]) == 0)
return;
switch (gender)
{
- case MON_MALE:
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[0]), gUnknown_08615AB6[0] + palNum, 2);
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[1]), gUnknown_08615AB6[1] + palNum, 2);
- DisplayPartyPokemonBarDetail(ptr->windowId, gText_MaleSymbol, 2, &ptr->unk0->unk4[8]);
- break;
- case MON_FEMALE:
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[0]), gUnknown_08615AB6[0] + palNum, 2);
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[1]), gUnknown_08615AB6[1] + palNum, 2);
- DisplayPartyPokemonBarDetail(ptr->windowId, gText_FemaleSymbol, 2, &ptr->unk0->unk4[8]);
- break;
+ case MON_MALE:
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[0]), gUnknown_08615AB6[0] + palNum, 2);
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC3[1]), gUnknown_08615AB6[1] + palNum, 2);
+ DisplayPartyPokemonBarDetail(ptr->windowId, gText_MaleSymbol, 2, &ptr->unk0->unk4[8]);
+ break;
+ case MON_FEMALE:
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[0]), gUnknown_08615AB6[0] + palNum, 2);
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC5[1]), gUnknown_08615AB6[1] + palNum, 2);
+ DisplayPartyPokemonBarDetail(ptr->windowId, gText_FemaleSymbol, 2, &ptr->unk0->unk4[8]);
+ break;
}
}
-void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
+static void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
{
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
@@ -2751,17 +3411,17 @@ void DisplayPartyPokemonHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr,
}
}
-void DisplayPartyPokemonHP(u16 hp, struct Struct203CEDC *ptr)
+static void DisplayPartyPokemonHP(u16 hp, struct Struct203CEDC *ptr)
{
u8 *strOut = ConvertIntToDecimalStringN(gStringVar1, hp, 1, 3);
-
+
strOut[0] = CHAR_SLASH;
strOut[1] = EOS;
-
+
DisplayPartyPokemonBarDetail(ptr->windowId, gStringVar1, 0, &ptr->unk0->unk4[12]);
}
-void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
+static void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct Struct203CEDC *ptr, u8 c)
{
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
@@ -2772,7 +3432,7 @@ void DisplayPartyPokemonMaxHPCheck(struct Pokemon *mon, struct Struct203CEDC *pt
}
}
-void DisplayPartyPokemonMaxHP(u16 maxhp, struct Struct203CEDC *ptr)
+static void DisplayPartyPokemonMaxHP(u16 maxhp, struct Struct203CEDC *ptr)
{
ConvertIntToDecimalStringN(gStringVar2, maxhp, 1, 3);
StringCopy(gStringVar1, gText_Slash);
@@ -2780,34 +3440,34 @@ void DisplayPartyPokemonMaxHP(u16 maxhp, struct Struct203CEDC *ptr)
DisplayPartyPokemonBarDetail(ptr->windowId, gStringVar1, 0, &ptr->unk0->unk4[16]);
}
-void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct Struct203CEDC *ptr)
+static void DisplayPartyPokemonHPBarCheck(struct Pokemon *mon, struct Struct203CEDC *ptr)
{
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
DisplayPartyPokemonHPBar(GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP), ptr);
}
-void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct Struct203CEDC *ptr)
+static void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct Struct203CEDC *ptr)
{
u8 palNum = GetWindowAttribute(ptr->windowId, WINDOW_PALETTE_NUM) * 16;
u8 hpFraction;
-
+
switch (GetHPBarLevel(hp, maxhp))
{
- case HP_BAR_GREEN:
- case HP_BAR_FULL:
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[0]), gUnknown_08615AB8[0] + palNum, 2);
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[1]), gUnknown_08615AB8[1] + palNum, 2);
- break;
- case HP_BAR_YELLOW:
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[0]), gUnknown_08615AB8[0] + palNum, 2);
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[1]), gUnknown_08615AB8[1] + palNum, 2);
- break;
- default:
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[0]), gUnknown_08615AB8[0] + palNum, 2);
- LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[1]), gUnknown_08615AB8[1] + palNum, 2);
- break;
+ case HP_BAR_GREEN:
+ case HP_BAR_FULL:
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[0]), gUnknown_08615AB8[0] + palNum, 2);
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC7[1]), gUnknown_08615AB8[1] + palNum, 2);
+ break;
+ case HP_BAR_YELLOW:
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[0]), gUnknown_08615AB8[0] + palNum, 2);
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615AC9[1]), gUnknown_08615AB8[1] + palNum, 2);
+ break;
+ default:
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[0]), gUnknown_08615AB8[0] + palNum, 2);
+ LoadPalette(GetPartyMenuPaletteFromBuffer(gUnknown_08615ACB[1]), gUnknown_08615AB8[1] + palNum, 2);
+ break;
}
-
+
hpFraction = GetScaledHPFraction(hp, maxhp, ptr->unk0->unk4[22]);
FillWindowPixelRect(ptr->windowId, gUnknown_08615AB8[1], ptr->unk0->unk4[20], ptr->unk0->unk4[21], hpFraction, 1);
FillWindowPixelRect(ptr->windowId, gUnknown_08615AB8[0], ptr->unk0->unk4[20], ptr->unk0->unk4[21] + 1, hpFraction, 2);
@@ -2819,89 +3479,19 @@ void DisplayPartyPokemonHPBar(u16 hp, u16 maxhp, struct Struct203CEDC *ptr)
CopyWindowToVram(ptr->windowId, 2);
}
-#ifdef NONMATCHING
-void DisplayPartyPokemonOtherText(u8 stringID, struct Struct203CEDC *ptr, u8 c)
+static void DisplayPartyPokemonOtherText(u8 stringID, struct Struct203CEDC *ptr, u8 c)
{
if (c != 0)
{
- int unk = ((ptr->unk0->unk1C & 7) + ptr->unk0->unk1E + 7) / 8;
- int unk2 = ((ptr->unk0->unk1D & 7) + ptr->unk0->unk1F + 7) / 8;
+ int unk = ((ptr->unk0->unk1C % 8) + ptr->unk0->unk1E + 7) / 8;
+ int unk2 = ((ptr->unk0->unk1D % 8) + ptr->unk0->unk1F + 7) / 8;
ptr->unk0->unk0(ptr->windowId, ptr->unk0->unk1C >> 3, ptr->unk0->unk1D >> 3, unk, unk2, 1);
}
if (c != 2)
AddTextPrinterParameterized3(ptr->windowId, 1, ptr->unk0->unk1C, ptr->unk0->unk1D, gUnknown_086157FC[0], 0, gUnknown_08615B60[stringID]);
}
-#else
-NAKED
-void DisplayPartyPokemonOtherText(u8 stringID, struct Struct203CEDC *ptr, u8 c)
-{
- asm_unified("push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- sub sp, 0xC\n\
- adds r6, r1, 0\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r8, r0\n\
- lsls r2, 24\n\
- lsrs r7, r2, 24\n\
- cmp r7, 0\n\
- beq _081B2FF2\n\
- ldr r5, [r6]\n\
- ldrb r1, [r5, 0x1C]\n\
- movs r4, 0x7\n\
- adds r0, r1, 0\n\
- ands r0, r4\n\
- ldrb r2, [r5, 0x1E]\n\
- adds r0, r2\n\
- adds r3, r0, 0x7\n\
- asrs r3, 3\n\
- ldrb r2, [r5, 0x1D]\n\
- adds r0, r2, 0\n\
- ands r0, r4\n\
- ldrb r4, [r5, 0x1F]\n\
- adds r0, r4\n\
- adds r4, r0, 0x7\n\
- ldrb r0, [r6, 0x8]\n\
- lsrs r1, 3\n\
- lsrs r2, 3\n\
- lsrs r4, 3\n\
- str r4, [sp]\n\
- movs r4, 0x1\n\
- str r4, [sp, 0x4]\n\
- ldr r4, [r5]\n\
- bl _call_via_r4\n\
-_081B2FF2:\n\
- cmp r7, 0x2\n\
- beq _081B3018\n\
- ldrb r0, [r6, 0x8]\n\
- ldr r1, [r6]\n\
- ldrb r2, [r1, 0x1C]\n\
- ldrb r3, [r1, 0x1D]\n\
- ldr r1, =gUnknown_086157FC\n\
- str r1, [sp]\n\
- movs r1, 0\n\
- str r1, [sp, 0x4]\n\
- ldr r4, =gUnknown_08615B60\n\
- mov r5, r8\n\
- lsls r1, r5, 2\n\
- adds r1, r4\n\
- ldr r1, [r1]\n\
- str r1, [sp, 0x8]\n\
- movs r1, 0x1\n\
- bl AddTextPrinterParameterized3\n\
-_081B3018:\n\
- add sp, 0xC\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n");
-}
-#endif
-void sub_81B302C(u8 *ptr)
+static void sub_81B302C(u8 *ptr)
{
if (*ptr != 0xFF)
{
@@ -2915,33 +3505,33 @@ void sub_81B302C(u8 *ptr)
void display_pokemon_menu_message(u32 stringID)
{
u8 *windowPtr = &gUnknown_0203CEC4->unkC[1];
-
+
if (*windowPtr != 0xFF)
sub_81B302C(windowPtr);
-
+
if (stringID != 0x7F)
{
switch (stringID)
{
- case 21:
- *windowPtr = AddWindow(&gUnknown_08615928);
- break;
- case 24:
- *windowPtr = AddWindow(&gUnknown_08615930);
- break;
- case 25:
- *windowPtr = AddWindow(&gUnknown_08615938);
- break;
- case 22:
- case 23:
- *windowPtr = AddWindow(&gUnknown_08615940);
- break;
- case 26:
- *windowPtr = AddWindow(&gUnknown_08615948);
- break;
- default:
- *windowPtr = AddWindow(&gUnknown_08615920);
- break;
+ case 21:
+ *windowPtr = AddWindow(&gUnknown_08615928);
+ break;
+ case 24:
+ *windowPtr = AddWindow(&gUnknown_08615930);
+ break;
+ case 25:
+ *windowPtr = AddWindow(&gUnknown_08615938);
+ break;
+ case 22:
+ case 23:
+ *windowPtr = AddWindow(&gUnknown_08615940);
+ break;
+ case 26:
+ *windowPtr = AddWindow(&gUnknown_08615948);
+ break;
+ default:
+ *windowPtr = AddWindow(&gUnknown_08615920);
+ break;
}
if (stringID == 0)
{
@@ -2957,15 +3547,15 @@ void display_pokemon_menu_message(u32 stringID)
}
}
-bool8 sub_81B314C(void)
+static bool8 sub_81B314C(void)
{
struct Pokemon *party = gPlayerParty;
u8 i;
u8 j = 0;
-
+
if (gUnknown_0203CEC8.unkB == 1)
return TRUE;
-
+
for (i = 0; i < 6; i++)
{
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE && (GetMonData(&party[i], MON_DATA_HP) != 0 || GetMonData(&party[i], MON_DATA_IS_EGG)))
@@ -2976,77 +3566,77 @@ bool8 sub_81B314C(void)
return FALSE;
}
-u8 sub_81B31B0(u8 a)
+static u8 sub_81B31B0(u8 a)
{
struct WindowTemplate window;
u8 cursorDimension;
u8 fontAttribute;
u8 i;
-
+
switch (a)
{
- case 0:
- SetWindowTemplateFields(&window, 2, 19, 19 - (gUnknown_0203CEC4->unk17 * 2), 10, gUnknown_0203CEC4->unk17 * 2, 14, 0x2E9);
- break;
- case 1:
- window = gUnknown_08615950;
- break;
- case 2:
- window = gUnknown_08615958;
- break;
- default:
- window = gUnknown_08615960;
- break;
+ case 0:
+ SetWindowTemplateFields(&window, 2, 19, 19 - (gUnknown_0203CEC4->unk17 * 2), 10, gUnknown_0203CEC4->unk17 * 2, 14, 0x2E9);
+ break;
+ case 1:
+ window = gUnknown_08615950;
+ break;
+ case 2:
+ window = gUnknown_08615958;
+ break;
+ default:
+ window = gUnknown_08615960;
+ break;
}
-
+
gUnknown_0203CEC4->unkC[0] = AddWindow(&window);
SetWindowBorderStyle(gUnknown_0203CEC4->unkC[0], FALSE, 0x4F, 13);
if (a == 3)
return gUnknown_0203CEC4->unkC[0];
cursorDimension = GetMenuCursorDimensionByFont(1, 0);
fontAttribute = GetFontAttribute(1, 2);
-
+
for (i = 0; i < gUnknown_0203CEC4->unk17; i++)
{
u8 unk = (gUnknown_0203CEC4->unkF[i] > 18) ? 4 : 3;
- AddTextPrinterParameterized4(gUnknown_0203CEC4->unkC[0], 1, cursorDimension, (i * 16) + 1, fontAttribute, 0, gUnknown_086157FC[unk], 0, gUnknown_08615C08[gUnknown_0203CEC4->unkF[i]].textPtr);
+ AddTextPrinterParameterized4(gUnknown_0203CEC4->unkC[0], 1, cursorDimension, (i * 16) + 1, fontAttribute, 0, gUnknown_086157FC[unk], 0, sCursorOptions[gUnknown_0203CEC4->unkF[i]].text);
}
-
+
InitMenuInUpperLeftCorner(gUnknown_0203CEC4->unkC[0], gUnknown_0203CEC4->unk17, 0, 1);
schedule_bg_copy_tilemap_to_vram(2);
-
+
return gUnknown_0203CEC4->unkC[0];
}
-void sub_81B3300(const u8 *text)
+static void sub_81B3300(const u8 *text)
{
SetWindowBorderStyle(6, FALSE, 0x4F, 13);
gTextFlags.canABSpeedUpPrint = TRUE;
AddTextPrinterParameterized2(6, 1, text, GetPlayerTextSpeedDelay(), 0, 2, 1, 3);
}
-void sub_81B334C(void)
+static void sub_81B334C(void)
{
CreateYesNoMenu(&gUnknown_08615968, 0x4F, 13, 0);
}
-u8 sub_81B3364(void)
+static u8 sub_81B3364(void)
{
gUnknown_0203CEC4->unkC[0] = AddWindow(&gUnknown_08615970);
SetWindowBorderStyle(gUnknown_0203CEC4->unkC[0], FALSE, 0x4F, 13);
return gUnknown_0203CEC4->unkC[0];
}
-void sub_81B3394(void)
+static void sub_81B3394(void)
{
ClearWindowTilemap(gUnknown_0203CEC4->unkC[0]);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
}
-void sub_81B33B4(struct Pokemon *mons, u8 a, u8 b)
+static void sub_81B33B4(struct Pokemon *mons, u8 a, u8 b)
{
u8 i;
-
+
if (b == 0)
{
sub_81B3414(mons, a);
@@ -3059,23 +3649,24 @@ void sub_81B33B4(struct Pokemon *mons, u8 a, u8 b)
}
}
-void sub_81B3414(struct Pokemon *mons, u8 a)
+static void sub_81B3414(struct Pokemon *mons, u8 a)
{
u8 i, j;
-
+
gUnknown_0203CEC4->unk17 = 0;
AppendToList(gUnknown_0203CEC4->unkF, &gUnknown_0203CEC4->unk17, 0);
for (i = 0; i < MAX_MON_MOVES; i++)
{
- for (j = 0; gUnknown_08615D7E[j] != MOVE_SWORDS_DANCE; j++)
+ for (j = 0; sFieldMoves[j] != FIELD_MOVE_TERMINATOR; j++)
{
- if (GetMonData(&mons[a], i + MON_DATA_MOVE1) == gUnknown_08615D7E[j])
+ if (GetMonData(&mons[a], i + MON_DATA_MOVE1) == sFieldMoves[j])
{
AppendToList(gUnknown_0203CEC4->unkF, &gUnknown_0203CEC4->unk17, j + 19);
break;
}
}
}
+
if (!InBattlePike())
{
if (GetMonData(&mons[1], MON_DATA_SPECIES) != SPECIES_NONE)
@@ -3088,62 +3679,62 @@ void sub_81B3414(struct Pokemon *mons, u8 a)
AppendToList(gUnknown_0203CEC4->unkF, &gUnknown_0203CEC4->unk17, 2);
}
-u8 sub_81B353C(struct Pokemon *mon)
+static u8 sub_81B353C(struct Pokemon *mon)
{
u32 returnVar;
-
+
switch (gUnknown_0203CEC8.unk8_0)
{
+ case 0:
+ if (InMultiBattleRoom() == TRUE || GetMonData(mon, MON_DATA_IS_EGG))
+ returnVar = 1;
+ else
+ returnVar = 0;
+ break;
+ case 1:
+ returnVar = sub_81B8A2C(mon);
+ break;
+ case 4:
+ switch (sub_81B856C(gUnknown_0203CEC8.unk9))
+ {
+ default:
+ returnVar = 7;
+ break;
case 0:
- if (InMultiBattleRoom() == TRUE || GetMonData(mon, MON_DATA_IS_EGG))
- returnVar = 1;
- else
- returnVar = 0;
+ returnVar = 4;
break;
case 1:
- returnVar = sub_81B8A2C(mon);
- break;
- case 4:
- switch (sub_81B856C(gUnknown_0203CEC8.unk9))
- {
- default:
- returnVar = 7;
- break;
- case 0:
- returnVar = 4;
- break;
- case 1:
- returnVar = 5;
- break;
- }
- break;
- case 6:
- returnVar = (GetMonData(mon, MON_DATA_IS_EGG)) ? 7 : 6;
- break;
- case 8:
- returnVar = 10;
- break;
- case 9:
- returnVar = 11;
- break;
- case 10:
- returnVar = 12;
- break;
- case 12:
- returnVar = 13;
- break;
- default:
- returnVar = 0;
+ returnVar = 5;
break;
+ }
+ break;
+ case 6:
+ returnVar = (GetMonData(mon, MON_DATA_IS_EGG)) ? 7 : 6;
+ break;
+ case 8:
+ returnVar = 10;
+ break;
+ case 9:
+ returnVar = 11;
+ break;
+ case 10:
+ returnVar = 12;
+ break;
+ case 12:
+ returnVar = 13;
+ break;
+ default:
+ returnVar = 0;
+ break;
}
return returnVar;
}
-bool8 sub_81B3608(u8 taskId)
+static bool8 sub_81B3608(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 item;
-
+
GetMonNickname(mon, gStringVar1);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
if (gUnknown_0203CEC8.unk8_0 != 12)
@@ -3174,53 +3765,53 @@ bool8 sub_81B3608(u8 taskId)
return TRUE;
}
-void sub_81B36FC(u8 taskId)
+static void sub_81B36FC(u8 taskId)
{
if (sub_81B3608(taskId))
{
gTasks[taskId].data[0] = 0xFF;
- gTasks[taskId].func = sub_81B3730;
+ gTasks[taskId].func = HandleMenuInput;
}
}
-void sub_81B3730(u8 taskId)
+static void HandleMenuInput(u8 taskId)
{
- s16 *data;
- s8 input;
-
- if (gPaletteFade.active == FALSE && sub_81221EC() != TRUE)
+ if (!gPaletteFade.active && sub_81221EC() != TRUE)
{
- data = gTasks[taskId].data;
+ s8 input;
+ s16 *data = gTasks[taskId].data;
+
if (gUnknown_0203CEC4->unk17 <= 3)
input = Menu_ProcessInputNoWrapAround_other();
else
input = ProcessMenuInput_other();
- data[0] = GetMenuCursorPos();
- if (input != MENU_NOTHING_CHOSEN)
+
+ data[0] = Menu_GetCursorPos();
+ switch (input)
{
- if (input == MENU_B_PRESSED)
- {
- PlaySE(SE_SELECT);
- sub_81B302C(&gUnknown_0203CEC4->unkC[2]);
- gUnknown_08615C08[gUnknown_0203CEC4->unkF[gUnknown_0203CEC4->unk17 - 1]].func(taskId);
- }
- else
- {
- sub_81B302C(&gUnknown_0203CEC4->unkC[2]);
- gUnknown_08615C08[gUnknown_0203CEC4->unkF[input]].func(taskId);
- }
+ case MENU_NOTHING_CHOSEN:
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ sub_81B302C(&gUnknown_0203CEC4->unkC[2]);
+ sCursorOptions[gUnknown_0203CEC4->unkF[gUnknown_0203CEC4->unk17 - 1]].func(taskId);
+ break;
+ default:
+ sub_81B302C(&gUnknown_0203CEC4->unkC[2]);
+ sCursorOptions[gUnknown_0203CEC4->unkF[input]].func(taskId);
+ break;
}
}
}
-void sub_81B37FC(u8 taskId)
+static void CursorCb_Summary(u8 taskId)
{
PlaySE(SE_SELECT);
gUnknown_0203CEC4->exitCallback = sub_81B3828;
sub_81B12C0(taskId);
}
-void sub_81B3828(void)
+static void sub_81B3828(void)
{
if (gUnknown_0203CEC8.unk8_0 == 1)
{
@@ -3233,14 +3824,14 @@ void sub_81B3828(void)
}
}
-void sub_81B3894(void)
+static void sub_81B3894(void)
{
gPaletteFade.bufferTransferDisabled = TRUE;
gUnknown_0203CEC8.unk9 = gUnknown_0203CF20;
InitPartyMenu(gUnknown_0203CEC8.unk8_0, 0xFF, gUnknown_0203CEC8.unkB, 1, 21, sub_81B36FC, gUnknown_0203CEC8.exitCallback);
}
-void brm_switch(u8 taskId)
+static void CursorCb_Switch(u8 taskId)
{
PlaySE(SE_SELECT);
gUnknown_0203CEC8.unkB = 8;
@@ -3252,11 +3843,11 @@ void brm_switch(u8 taskId)
gTasks[taskId].func = sub_81B1370;
}
-void sub_81B3938(u8 taskId)
+static void sub_81B3938(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u8 windowIds[2];
-
+
if (gUnknown_0203CEC8.unkA == gUnknown_0203CEC8.unk9)
{
sub_81B407C(taskId);
@@ -3297,20 +3888,18 @@ void sub_81B3938(u8 taskId)
}
}
-#ifdef NONMATCHING
-bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e)
+static bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e)
{
-
- if ((a + b) < 0 || a > 31)
- {
+ if ((a + b) < 0)
return FALSE;
- }
+ if (a > 31)
+ return FALSE;
+
if (a < 0)
{
- *c = -a;
+ *c = a * -1;
*d = 0;
- *e = a + b;
- return TRUE;
+ *e = b + a;
}
else
{
@@ -3320,78 +3909,15 @@ bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e)
*e = 32 - a;
else
*e = b;
- return TRUE;
- }
+ }
+ return TRUE;
}
-#else
-NAKED
-bool8 sub_81B3AD8(s16 a, s16 b, u8 *c, u8 *d, u8 *e)
-{
- asm_unified("push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- adds r6, r2, 0\n\
- mov r12, r3\n\
- ldr r7, [sp, 0x18]\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- adds r5, r3, 0\n\
- lsls r1, 16\n\
- lsrs r2, r1, 16\n\
- mov r8, r2\n\
- lsls r0, r3, 16\n\
- asrs r1, r0, 16\n\
- lsls r0, r2, 16\n\
- asrs r0, 16\n\
- adds r4, r1, r0\n\
- cmp r4, 0\n\
- blt _081B3B02\n\
- cmp r1, 0x1F\n\
- ble _081B3B06\n\
-_081B3B02:\n\
- movs r0, 0\n\
- b _081B3B34\n\
-_081B3B06:\n\
- cmp r1, 0\n\
- bge _081B3B1A\n\
- negs r0, r1\n\
- strb r0, [r6]\n\
- movs r0, 0\n\
- mov r1, r12\n\
- strb r0, [r1]\n\
- adds r0, r2, r3\n\
- strb r0, [r7]\n\
- b _081B3B32\n\
-_081B3B1A:\n\
- movs r0, 0\n\
- strb r0, [r6]\n\
- mov r0, r12\n\
- strb r5, [r0]\n\
- cmp r4, 0x1F\n\
- ble _081B3B2E\n\
- movs r0, 0x20\n\
- subs r0, r5\n\
- strb r0, [r7]\n\
- b _081B3B32\n\
-_081B3B2E:\n\
- mov r1, r8\n\
- strb r1, [r7]\n\
-_081B3B32:\n\
- movs r0, 0x1\n\
-_081B3B34:\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n");
-}
-#endif
-void sub_81B3B40(const void *rectSrc, s16 a, s16 b, s16 c, s16 d, s16 e)
+static void sub_81B3B40(const void *rectSrc, s16 a, s16 b, s16 c, s16 d, s16 e)
{
u8 f, g, h;
-
+
if (sub_81B3AD8(a, c, &f, &g, &h))
{
FillBgTilemapBufferRect_Palette0(0, 0, g, b, h, d);
@@ -3400,7 +3926,7 @@ void sub_81B3B40(const void *rectSrc, s16 a, s16 b, s16 c, s16 d, s16 e)
}
}
-void sub_81B3C0C(struct Struct203CEDC *ptr, s16 a)
+static void sub_81B3C0C(struct Struct203CEDC *ptr, s16 a)
{
gSprites[ptr->unkB].pos2.x += a * 8;
gSprites[ptr->unkA].pos2.x += a * 8;
@@ -3408,20 +3934,20 @@ void sub_81B3C0C(struct Struct203CEDC *ptr, s16 a)
gSprites[ptr->unkC].pos2.x += a * 8;
}
-void sub_81B3C60(u8 taskId)
+static void sub_81B3C60(u8 taskId)
{
s16 *data = gTasks[taskId].data;
-
+
if (data[10] != 0)
sub_81B3C0C(&gUnknown_0203CEDC[gUnknown_0203CEC8.unk9], data[10]);
if (data[11] != 0)
sub_81B3C0C(&gUnknown_0203CEDC[gUnknown_0203CEC8.unkA], data[11]);
}
-void sub_81B3CC0(u8 taskId)
+static void sub_81B3CC0(u8 taskId)
{
s16 *data = gTasks[taskId].data;
-
+
if (data[10] != 0)
sub_81B3B40(gUnknown_0203CEF0, data[0] + data[8], data[1], data[2], data[3], data[10]);
if (data[11] != 0)
@@ -3429,11 +3955,11 @@ void sub_81B3CC0(u8 taskId)
schedule_bg_copy_tilemap_to_vram(0);
}
-void sub_81B3D48(u8 taskId)
+static void sub_81B3D48(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u16 tilemapRelatedMaybe[2];
-
+
sub_81B3CC0(taskId);
sub_81B3C60(taskId);
data[8] += data[10];
@@ -3457,10 +3983,10 @@ void sub_81B3D48(u8 taskId)
}
}
-void sub_81B3E60(u8 taskId)
+static void sub_81B3E60(u8 taskId)
{
s16 *data = gTasks[taskId].data;
-
+
sub_81B3CC0(taskId);
sub_81B3C60(taskId);
if (data[10] == 0 && data[11] == 0)
@@ -3483,11 +4009,11 @@ void sub_81B3E60(u8 taskId)
}
}
-void oamt_swap_pos(u8 *spriteIdPtr1, u8 *spriteIdPtr2)
+static void oamt_swap_pos(u8 *spriteIdPtr1, u8 *spriteIdPtr2)
{
u8 spriteIdBuffer = *spriteIdPtr1;
u16 xBuffer1, yBuffer1, xBuffer2, yBuffer2;
-
+
*spriteIdPtr1 = *spriteIdPtr2;
*spriteIdPtr2 = spriteIdBuffer;
xBuffer1 = gSprites[*spriteIdPtr1].pos1.x;
@@ -3501,15 +4027,15 @@ void oamt_swap_pos(u8 *spriteIdPtr1, u8 *spriteIdPtr2)
gSprites[*spriteIdPtr2].pos1.x = xBuffer1;
gSprites[*spriteIdPtr2].pos1.y = yBuffer1;
gSprites[*spriteIdPtr2].pos2.x = xBuffer2;
- gSprites[*spriteIdPtr2].pos2.y = yBuffer2;
+ gSprites[*spriteIdPtr2].pos2.y = yBuffer2;
}
-void swap_pokemon_and_oams(void)
+static void swap_pokemon_and_oams(void)
{
struct Struct203CEDC *structPtrs[2];
struct Pokemon *mon1, *mon2;
struct Pokemon *monBuffer;
-
+
structPtrs[0] = &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9];
structPtrs[1] = &gUnknown_0203CEDC[gUnknown_0203CEC8.unkA];
mon1 = &gPlayerParty[gUnknown_0203CEC8.unk9];
@@ -3525,7 +4051,7 @@ void swap_pokemon_and_oams(void)
oamt_swap_pos(&structPtrs[0]->unkC, &structPtrs[1]->unkC);
}
-void sub_81B407C(u8 taskId)
+static void sub_81B407C(u8 taskId)
{
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
gUnknown_0203CEC8.unkB = 0;
@@ -3536,7 +4062,7 @@ void sub_81B407C(u8 taskId)
gTasks[taskId].func = sub_81B1370;
}
-void brm_cancel_1(u8 taskId)
+static void CursorCb_Cancel1(u8 taskId)
{
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
@@ -3548,7 +4074,7 @@ void brm_cancel_1(u8 taskId)
gTasks[taskId].func = sub_81B1370;
}
-void sub_81B4134(u8 taskId)
+static void CursorCb_Item(u8 taskId)
{
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
@@ -3557,17 +4083,17 @@ void sub_81B4134(u8 taskId)
sub_81B31B0(1);
display_pokemon_menu_message(24);
gTasks[taskId].data[0] = 0xFF;
- gTasks[taskId].func = sub_81B3730;
+ gTasks[taskId].func = HandleMenuInput;
}
-void sub_81B4198(u8 taskId)
+static void CursorCb_Give(u8 taskId)
{
PlaySE(SE_SELECT);
gUnknown_0203CEC4->exitCallback = sub_81B41C4;
sub_81B12C0(taskId);
}
-void sub_81B41C4(void)
+static void sub_81B41C4(void)
{
if (InBattlePyramid() == FALSE)
GoToBagMenu(RETURN_LOCATION_POKEMON_LIST, POCKETS_COUNT, c2_8123744);
@@ -3575,7 +4101,7 @@ void sub_81B41C4(void)
sub_81C4F98(2, c2_8123744);
}
-void c2_8123744(void)
+static void c2_8123744(void)
{
if (gSpecialVar_ItemId == ITEM_NONE)
{
@@ -3601,10 +4127,10 @@ void c2_8123744(void)
}
}
-void sub_81B42D0(u8 taskId)
+static void sub_81B42D0(u8 taskId)
{
u16 item;
-
+
if (!gPaletteFade.active)
{
item = gSpecialVar_ItemId;
@@ -3615,7 +4141,7 @@ void sub_81B42D0(u8 taskId)
}
}
-void sub_81B4350(u8 taskId)
+static void sub_81B4350(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -3624,7 +4150,7 @@ void sub_81B4350(u8 taskId)
}
}
-void sub_81B43A8(u8 taskId)
+static void sub_81B43A8(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -3633,40 +4159,40 @@ void sub_81B43A8(u8 taskId)
}
}
-void sub_81B43DC(u8 taskId)
+static void sub_81B43DC(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- RemoveBagItem(gSpecialVar_ItemId, 1);
- if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE)
- {
- AddBagItem(gSpecialVar_ItemId, 1);
- pokemon_item_not_removed(gUnknown_0203CEFC);
- sub_81B1B5C(gStringVar4, 0);
- gTasks[taskId].func = sub_81B1C1C;
- }
- else if (ItemIsMail(gSpecialVar_ItemId))
- {
- sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId);
- gTasks[taskId].func = sub_81B44FC;
- }
- else
- {
- sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId);
- sub_81B1D68(gSpecialVar_ItemId, gUnknown_0203CEFC, 1);
- gTasks[taskId].func = sub_81B469C;
- }
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
+ case 0:
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE)
+ {
+ AddBagItem(gSpecialVar_ItemId, 1);
+ pokemon_item_not_removed(gUnknown_0203CEFC);
+ sub_81B1B5C(gStringVar4, 0);
gTasks[taskId].func = sub_81B1C1C;
- break;
+ }
+ else if (ItemIsMail(gSpecialVar_ItemId))
+ {
+ sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId);
+ gTasks[taskId].func = sub_81B44FC;
+ }
+ else
+ {
+ sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gSpecialVar_ItemId);
+ sub_81B1D68(gSpecialVar_ItemId, gUnknown_0203CEFC, 1);
+ gTasks[taskId].func = sub_81B469C;
+ }
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ gTasks[taskId].func = sub_81B1C1C;
+ break;
}
}
-void sub_81B44FC(u8 taskId)
+static void sub_81B44FC(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -3675,18 +4201,18 @@ void sub_81B44FC(u8 taskId)
}
}
-void sub_81B452C(void)
+static void sub_81B452C(void)
{
u8 mail = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAIL);
-
+
sub_811A20C(4, gSaveBlock1Ptr->mail[mail].words, sub_81B4578, 3);
}
-void sub_81B4578(void)
+static void sub_81B4578(void)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);
-
+
if (gSpecialVar_Result == FALSE)
{
TakeMailFromMon(mon);
@@ -3701,7 +4227,7 @@ void sub_81B4578(void)
}
}
-void sub_81B4624(u8 taskId)
+static void sub_81B4624(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -3713,10 +4239,10 @@ void sub_81B4624(u8 taskId)
}
}
-void sub_81B469C(u8 taskId)
+static void sub_81B469C(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
-
+
if (sub_81B1BD4() != TRUE)
{
sub_81B5C94(mon, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9]);
@@ -3731,38 +4257,38 @@ void sub_81B469C(u8 taskId)
}
}
-void sub_81B4724(u8 taskId)
+static void CursorCb_TakeItem(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);
-
+
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
switch (sub_81B1E00(mon))
{
- case 0:
- GetMonNickname(mon, gStringVar1);
- StringExpandPlaceholders(gStringVar4, gText_PkmnNotHolding);
- sub_81B1B5C(gStringVar4, 1);
- break;
- case 1:
- pokemon_item_not_removed(item);
- sub_81B1B5C(gStringVar4, 1);
- break;
- default:
- sub_81B1CD0(mon, item, 1);
- break;
+ case 0:
+ GetMonNickname(mon, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnNotHolding);
+ sub_81B1B5C(gStringVar4, 1);
+ break;
+ case 1:
+ pokemon_item_not_removed(item);
+ sub_81B1B5C(gStringVar4, 1);
+ break;
+ default:
+ sub_81B1CD0(mon, item, 1);
+ break;
}
schedule_bg_copy_tilemap_to_vram(2);
gTasks[taskId].func = sub_81B469C;
}
-void sub_81B47E0(u8 taskId)
+static void CursorCb_Toss(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);
-
+
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
@@ -3782,7 +4308,7 @@ void sub_81B47E0(u8 taskId)
}
}
-void sub_81B48A8(u8 taskId)
+static void sub_81B48A8(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -3791,42 +4317,42 @@ void sub_81B48A8(u8 taskId)
}
}
-void sub_81B48DC(u8 taskId)
+static void sub_81B48DC(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
-
+
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- CopyItemName(GetMonData(mon, MON_DATA_HELD_ITEM), gStringVar1);
- StringExpandPlaceholders(gStringVar4, gText_ItemThrownAway);
- sub_81B1B5C(gStringVar4, 0);
- gTasks[taskId].func = sub_81B4988;
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- gTasks[taskId].func = sub_81B1C1C;
- break;
+ case 0:
+ CopyItemName(GetMonData(mon, MON_DATA_HELD_ITEM), gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gText_ItemThrownAway);
+ sub_81B1B5C(gStringVar4, 0);
+ gTasks[taskId].func = sub_81B4988;
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ gTasks[taskId].func = sub_81B1C1C;
+ break;
}
}
-void sub_81B4988(u8 taskId)
+static void sub_81B4988(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
- u16 itemClear;
-
+
if (sub_81B1BD4() != TRUE)
{
- itemClear = ITEM_NONE;
- SetMonData(mon, MON_DATA_HELD_ITEM, &itemClear);
+ u16 item = ITEM_NONE;
+
+ SetMonData(mon, MON_DATA_HELD_ITEM, &item);
sub_81B5C94(mon, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9]);
DisplayPartyPokemonOtherText(12, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9], 1);
gTasks[taskId].func = sub_81B1C1C;
}
}
-void sub_81B4A08(u8 taskId)
+static void CursorCb_Mail(u8 taskId)
{
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
@@ -3835,28 +4361,28 @@ void sub_81B4A08(u8 taskId)
sub_81B31B0(2);
display_pokemon_menu_message(25);
gTasks[taskId].data[0] = 0xFF;
- gTasks[taskId].func = sub_81B3730;
+ gTasks[taskId].func = HandleMenuInput;
}
-void sub_81B4A6C(u8 taskId)
+static void CursorCb_Read(u8 taskId)
{
PlaySE(SE_SELECT);
gUnknown_0203CEC4->exitCallback = sub_81B4A98;
sub_81B12C0(taskId);
}
-void sub_81B4A98(void)
+static void sub_81B4A98(void)
{
ReadMail(&gSaveBlock1Ptr->mail[GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAIL)], sub_81B4AE0, 1);
}
-void sub_81B4AE0(void)
+static void sub_81B4AE0(void)
{
gPaletteFade.bufferTransferDisabled = TRUE;
InitPartyMenu(gUnknown_0203CEC8.unk8_0, 0xFF, gUnknown_0203CEC8.unkB, 1, 21, sub_81B36FC, gUnknown_0203CEC8.exitCallback);
}
-void brm_take_2(u8 taskId)
+static void CursorCb_TakeMail(u8 taskId)
{
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
@@ -3865,7 +4391,7 @@ void brm_take_2(u8 taskId)
gTasks[taskId].func = sub_81B4B6C;
}
-void sub_81B4B6C(u8 taskId)
+static void sub_81B4B6C(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -3874,32 +4400,32 @@ void sub_81B4B6C(u8 taskId)
}
}
-void sub_81B4BA0(u8 taskId)
+static void sub_81B4BA0(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- if (TakeMailFromMon2(&gPlayerParty[gUnknown_0203CEC8.unk9]) != 0xFF)
- {
- sub_81B1B5C(gText_MailSentToPC, 0);
- gTasks[taskId].func = sub_81B469C;
- }
- else
- {
- sub_81B1B5C(gText_PCMailboxFull, 0);
- gTasks[taskId].func = sub_81B1C1C;
- }
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- sub_81B1B5C(gText_MailMessageWillBeLost, 1);
- gTasks[taskId].func = sub_81B4C60;
- break;
+ case 0:
+ if (TakeMailFromMon2(&gPlayerParty[gUnknown_0203CEC8.unk9]) != 0xFF)
+ {
+ sub_81B1B5C(gText_MailSentToPC, 0);
+ gTasks[taskId].func = sub_81B469C;
+ }
+ else
+ {
+ sub_81B1B5C(gText_PCMailboxFull, 0);
+ gTasks[taskId].func = sub_81B1C1C;
+ }
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ sub_81B1B5C(gText_MailMessageWillBeLost, 1);
+ gTasks[taskId].func = sub_81B4C60;
+ break;
}
}
-void sub_81B4C60(u8 taskId)
+static void sub_81B4C60(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -3908,39 +4434,39 @@ void sub_81B4C60(u8 taskId)
}
}
-void sub_81B4C94(u8 taskId)
+static void sub_81B4C94(u8 taskId)
{
u16 item;
-
+
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- item = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_HELD_ITEM);
- if (AddBagItem(item, 1) == TRUE)
- {
- TakeMailFromMon(&gPlayerParty[gUnknown_0203CEC8.unk9]);
- sub_81B1B5C(gText_MailTakenFromPkmn, 0);
- gTasks[taskId].func = sub_81B469C;
- }
- else
- {
- pokemon_item_not_removed(item);
- sub_81B1B5C(gStringVar4, 0);
- gTasks[taskId].func = sub_81B1C1C;
- }
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
+ case 0:
+ item = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_HELD_ITEM);
+ if (AddBagItem(item, 1) == TRUE)
+ {
+ TakeMailFromMon(&gPlayerParty[gUnknown_0203CEC8.unk9]);
+ sub_81B1B5C(gText_MailTakenFromPkmn, 0);
+ gTasks[taskId].func = sub_81B469C;
+ }
+ else
+ {
+ pokemon_item_not_removed(item);
+ sub_81B1B5C(gStringVar4, 0);
gTasks[taskId].func = sub_81B1C1C;
- break;
+ }
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ gTasks[taskId].func = sub_81B1C1C;
+ break;
}
}
-void sub_81B4D78(u8 taskId)
+static void CursorCb_Cancel2(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
-
+
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
@@ -3957,10 +4483,10 @@ void sub_81B4D78(u8 taskId)
display_pokemon_menu_message(26);
}
gTasks[taskId].data[0] = 0xFF;
- gTasks[taskId].func = sub_81B3730;
+ gTasks[taskId].func = HandleMenuInput;
}
-void brm_shift_sendout(u8 taskId)
+static void CursorCb_SendMon(u8 taskId)
{
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
@@ -3976,11 +4502,11 @@ void brm_shift_sendout(u8 taskId)
}
}
-void sub_81B4E8C(u8 taskId)
+static void CursorCb_Enter(u8 taskId)
{
u8 unk;
u8 i;
-
+
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
unk = sub_81B8830();
@@ -4005,18 +4531,18 @@ void sub_81B4E8C(u8 taskId)
gTasks[taskId].func = sub_81B1C1C;
}
-void sub_81B4F88(void)
+static void sub_81B4F88(void)
{
sub_81B0FCC(gUnknown_0203CEC8.unk9, 0);
gUnknown_0203CEC8.unk9 = 6;
sub_81B0FCC(gUnknown_0203CEC8.unk9, 1);
}
-void sub_81B4FA8(u8 taskId)
+static void CursorCb_NoEntry(u8 taskId)
{
u8 unk;
u8 i, j;
-
+
PlaySE(SE_SELECT);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
@@ -4041,30 +4567,30 @@ void sub_81B4FA8(u8 taskId)
gTasks[taskId].func = sub_81B1370;
}
-void sub_81B50AC(u8 taskId)
+static void CursorCb_Store(u8 taskId)
{
PlaySE(SE_SELECT);
sub_81B12C0(taskId);
}
-void sub_81B50C8(u8 taskId)
+static void CursorCb_Register(u8 taskId)
{
u16 species2 = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES2);
u16 species = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_OBEDIENCE);
-
- switch (sub_807A8D0(*(u32 *)sub_800F7DC() /* dirty cast, probably needs to be changed */, species2, species, obedience))
+
+ switch (sub_807A8D0(*(struct UnkLinkRfuStruct_02022B14Substruct *)sub_800F7DC(), species2, species, obedience))
{
- case 1:
- StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
- break;
- case 2:
- StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow);
- break;
- default:
- PlaySE(SE_SELECT);
- sub_81B12C0(taskId);
- return;
+ case 1:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
+ break;
+ case 2:
+ StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sub_81B12C0(taskId);
+ return;
}
PlaySE(SE_HAZURE);
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
@@ -4074,13 +4600,13 @@ void sub_81B50C8(u8 taskId)
gTasks[taskId].func = sub_81B1C1C;
}
-void brm_trade_1(u8 taskId)
+static void CursorCb_Trade1(u8 taskId)
{
u16 species2 = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES2);
u16 species = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES);
u8 obedience = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_OBEDIENCE);
- u32 stringId = sub_807A7E0(*(u32 *)sub_800F7DC() /* dirty cast, probably needs to be changed */, *(u32 *)&gUnknown_02022C38 /* dirty cast, probably needs to be changed */, species2, gUnknown_02022C3C, gUnknown_02022C3E, species, obedience);
-
+ u32 stringId = sub_807A7E0(*(struct UnkLinkRfuStruct_02022B14Substruct *)sub_800F7DC(), gUnknown_02022C38, species2, gUnknown_02022C3C, gUnknown_02022C3E, species, obedience);
+
if (stringId != 0)
{
StringExpandPlaceholders(gStringVar4, gUnknown_08615E0C[stringId - 1]);
@@ -4098,28 +4624,28 @@ void brm_trade_1(u8 taskId)
}
}
-void sub_81B52E4(u8 taskId)
+static void CursorCb_Trade2(u8 taskId)
{
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
switch (sub_807A918(gPlayerParty, gUnknown_0203CEC8.unk9))
{
- case 1:
- StringExpandPlaceholders(gStringVar4, gText_OnlyPkmnForBattle);
- break;
- case 2:
- StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
- break;
- case 3:
- StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow);
- break;
- default:
- PlaySE(SE_SELECT);
- GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1);
- StringExpandPlaceholders(gStringVar4, gJPText_PutVar1IntoSpinner);
- sub_81B1B5C(gStringVar4, 1);
- gTasks[taskId].func = sub_81B53FC;
- return;
+ case 1:
+ StringExpandPlaceholders(gStringVar4, gText_OnlyPkmnForBattle);
+ break;
+ case 2:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow);
+ break;
+ case 3:
+ StringExpandPlaceholders(gStringVar4, gText_EggCantBeTradedNow);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gJPText_PutVar1IntoSpinner);
+ sub_81B1B5C(gStringVar4, 1);
+ gTasks[taskId].func = sub_81B53FC;
+ return;
}
PlaySE(SE_HAZURE);
StringAppend(gStringVar4, gText_PauseUntilPress);
@@ -4127,7 +4653,7 @@ void sub_81B52E4(u8 taskId)
gTasks[taskId].func = sub_81B1C1C;
}
-void sub_81B53FC(u8 taskId)
+static void sub_81B53FC(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -4136,107 +4662,107 @@ void sub_81B53FC(u8 taskId)
}
}
-void sub_81B5430(u8 taskId)
+static void sub_81B5430(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- sub_81B12C0(taskId);
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- sub_81B1C1C(taskId);
- break;
+ case 0:
+ sub_81B12C0(taskId);
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ sub_81B1C1C(taskId);
+ break;
}
}
-void sub_81B5470(u8 taskId)
+static void CursorCb_FieldMove(u8 taskId)
{
- u8 fieldMove = gUnknown_0203CEC4->unkF[GetMenuCursorPos()] - 19;
- struct MapHeader const *mapHeader;
- u8 fieldMove2;
-
+ u8 fieldMove = gUnknown_0203CEC4->unkF[Menu_GetCursorPos()] - MENU_FIELD_MOVES;
+ const struct MapHeader *mapHeader;
+
PlaySE(SE_SELECT);
- if (gUnknown_08615D9C[fieldMove].fieldMoveFunc != NULL)
+ if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc == NULL)
+ return;
+
+ sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
+ sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
+ if (sub_81221AC() == TRUE || InUnionRoom() == TRUE)
{
- sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
- sub_81B302C(&gUnknown_0203CEC4->unkC[1]);
- if (sub_81221AC() == TRUE || InUnionRoom() == TRUE)
+ if (fieldMove == FIELD_MOVE_MILK_DRINK || fieldMove == FIELD_MOVE_SOFT_BOILED)
+ display_pokemon_menu_message(13);
+ else
+ display_pokemon_menu_message(sFieldMoveCursorCallbacks[fieldMove].msgId);
+
+ gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b;
+ }
+ else
+ {
+ // All field moves before WATERFALL are HMs.
+ if (fieldMove <= FIELD_MOVE_WATERFALL && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE)
{
- fieldMove2 = fieldMove - 11;
- if (fieldMove2 <= 1)
- display_pokemon_menu_message(13);
- else
- display_pokemon_menu_message(gUnknown_08615D9C[fieldMove].msgID);
- gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b;
+ sub_81B1B5C(gText_CantUseUntilNewBadge, 1);
+ gTasks[taskId].func = sub_81B1C1C;
}
- else
+ else if (sFieldMoveCursorCallbacks[fieldMove].fieldMoveFunc() == TRUE)
{
- if (fieldMove <= 7 && FlagGet(FLAG_BADGE01_GET + fieldMove) != TRUE)
- {
- sub_81B1B5C(gText_CantUseUntilNewBadge, 1);
- gTasks[taskId].func = sub_81B1C1C;
- }
- else if (gUnknown_08615D9C[fieldMove].fieldMoveFunc() == TRUE)
+ switch (fieldMove)
{
- switch (fieldMove - 5)
- {
- case 6:
- case 7:
- sub_8161560(taskId);
- break;
- case 3:
- mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum);
- sub_81245DC(gStringVar1, mapHeader->regionMapSectionId);
- StringExpandPlaceholders(gStringVar4, gText_ReturnToHealingSpot);
- sub_81B5674(taskId);
- gUnknown_0203CEC4->data[0] = fieldMove;
- break;
- case 4:
- mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp4.mapGroup, gSaveBlock1Ptr->warp4.mapNum);
- sub_81245DC(gStringVar1, mapHeader->regionMapSectionId);
- StringExpandPlaceholders(gStringVar4, gText_EscapeFromHere);
- sub_81B5674(taskId);
- gUnknown_0203CEC4->data[0] = fieldMove;
- break;
- case 0:
- gUnknown_0203CEC8.exitCallback = MCB2_FlyMap;
- sub_81B12C0(taskId);
- break;
- default:
- gUnknown_0203CEC8.exitCallback = CB2_ReturnToField;
- sub_81B12C0(taskId);
- break;
- }
+ case FIELD_MOVE_MILK_DRINK:
+ case FIELD_MOVE_SOFT_BOILED:
+ sub_8161560(taskId);
+ break;
+ case FIELD_MOVE_TELEPORT:
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->lastHealLocation.mapGroup, gSaveBlock1Ptr->lastHealLocation.mapNum);
+ sub_81245DC(gStringVar1, mapHeader->regionMapSectionId);
+ StringExpandPlaceholders(gStringVar4, gText_ReturnToHealingSpot);
+ sub_81B5674(taskId);
+ gUnknown_0203CEC4->data[0] = fieldMove;
+ break;
+ case FIELD_MOVE_DIG:
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum);
+ sub_81245DC(gStringVar1, mapHeader->regionMapSectionId);
+ StringExpandPlaceholders(gStringVar4, gText_EscapeFromHere);
+ sub_81B5674(taskId);
+ gUnknown_0203CEC4->data[0] = fieldMove;
+ break;
+ case FIELD_MOVE_FLY:
+ gUnknown_0203CEC8.exitCallback = MCB2_FlyMap;
+ sub_81B12C0(taskId);
+ break;
+ default:
+ gUnknown_0203CEC8.exitCallback = CB2_ReturnToField;
+ sub_81B12C0(taskId);
+ break;
}
- else
+ }
+ else
+ {
+ switch (fieldMove)
{
- switch (fieldMove)
- {
- case 4:
- sub_81B5864();
- break;
- case 1:
- sub_81B57DC();
- break;
- default:
- display_pokemon_menu_message(gUnknown_08615D9C[fieldMove].msgID);
- break;
- }
- gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b;
+ case FIELD_MOVE_SURF:
+ sub_81B5864();
+ break;
+ case FIELD_MOVE_FLASH:
+ sub_81B57DC();
+ break;
+ default:
+ display_pokemon_menu_message(sFieldMoveCursorCallbacks[fieldMove].msgId);
+ break;
}
+ gTasks[taskId].func = task_brm_cancel_1_on_keypad_a_or_b;
}
}
}
-void sub_81B5674(u8 taskId)
+static void sub_81B5674(u8 taskId)
{
sub_81B1B5C(gStringVar4, 1);
gTasks[taskId].func = sub_81B56A4;
}
-void sub_81B56A4(u8 taskId)
+static void sub_81B56A4(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -4245,21 +4771,21 @@ void sub_81B56A4(u8 taskId)
}
}
-void sub_81B56D8(u8 taskId)
+static void sub_81B56D8(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- gUnknown_0203CEC8.exitCallback = CB2_ReturnToField;
- sub_81B12C0(taskId);
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- gFieldCallback2 = NULL;
- gPostMenuFieldCallback = NULL;
- sub_81B1C1C(taskId);
- break;
+ case 0:
+ gUnknown_0203CEC8.exitCallback = CB2_ReturnToField;
+ sub_81B12C0(taskId);
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ gFieldCallback2 = NULL;
+ gPostMenuFieldCallback = NULL;
+ sub_81B1C1C(taskId);
+ break;
}
}
@@ -4270,7 +4796,7 @@ bool8 FieldCallback_PrepareFadeInFromMenu(void)
return TRUE;
}
-void task_launch_hm_phase_2(u8 taskId)
+static void task_launch_hm_phase_2(u8 taskId)
{
if (IsWeatherNotFadingIn() == TRUE)
{
@@ -4280,18 +4806,18 @@ void task_launch_hm_phase_2(u8 taskId)
}
}
-u16 brm_get_selected_species(void)
+static u16 brm_get_selected_species(void)
{
return GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_SPECIES);
}
-void task_brm_cancel_1_on_keypad_a_or_b(u8 taskId)
+static void task_brm_cancel_1_on_keypad_a_or_b(u8 taskId)
{
if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
- brm_cancel_1(taskId);
+ CursorCb_Cancel1(taskId);
}
-void sub_81B57DC(void)
+static void sub_81B57DC(void)
{
if (FlagGet(FLAG_SYS_USE_FLASH) == TRUE)
display_pokemon_menu_message(12);
@@ -4299,13 +4825,13 @@ void sub_81B57DC(void)
display_pokemon_menu_message(13);
}
-void hm_surf_run_dp02scr(void)
+static void hm_surf_run_dp02scr(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
FieldEffectStart(FLDEFF_USE_SURF);
}
-bool8 sub_81B5820(void)
+static bool8 SetUpFieldMove_Surf(void)
{
if (PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE)
{
@@ -4316,19 +4842,20 @@ bool8 sub_81B5820(void)
return FALSE;
}
-void sub_81B5864(void)
+static void sub_81B5864(void)
{
- if (TestPlayerAvatarFlags(8))
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
display_pokemon_menu_message(9);
else
display_pokemon_menu_message(8);
}
-bool8 sub_81B5884(void)
+static bool8 SetUpFieldMove_Fly(void)
{
if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
return TRUE;
- return FALSE;
+ else
+ return FALSE;
}
void sub_81B58A8(void)
@@ -4336,16 +4863,16 @@ void sub_81B58A8(void)
InitPartyMenu(0, 0, 0, 1, 0, sub_81B1370, CB2_ReturnToFieldWithOpenMenu);
}
-void hm2_waterfall(void)
+static void hm2_waterfall(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
FieldEffectStart(FLDEFF_USE_WATERFALL);
}
-bool8 hm_prepare_waterfall(void)
+static bool8 SetUpFieldMove_Waterfall(void)
{
s16 x, y;
-
+
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE && IsPlayerSurfingNorth() == TRUE)
{
@@ -4356,13 +4883,13 @@ bool8 hm_prepare_waterfall(void)
return FALSE;
}
-void sub_81B5958(void)
+static void sub_81B5958(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
FieldEffectStart(FLDEFF_USE_DIVE);
}
-bool8 sub_81B5974(void)
+static bool8 SetUpFieldMove_Dive(void)
{
gFieldEffectArguments[1] = TrySetDiveWarp();
if (gFieldEffectArguments[1] != 0)
@@ -4374,11 +4901,11 @@ bool8 sub_81B5974(void)
return FALSE;
}
-void party_menu_icon_anim(struct Pokemon *mon, struct Struct203CEDC *ptr, u32 a)
+static void party_menu_icon_anim(struct Pokemon *mon, struct Struct203CEDC *ptr, u32 a)
{
u32 bit = 1;
u16 species2;
-
+
if (IsMultiBattle() == TRUE && gMain.inBattle)
bit = (gUnknown_08616020[a] ^ bit) ? 1 : 0;
species2 = GetMonData(mon, MON_DATA_SPECIES2);
@@ -4386,7 +4913,7 @@ void party_menu_icon_anim(struct Pokemon *mon, struct Struct203CEDC *ptr, u32 a)
sub_81B5B38(ptr->unk9, mon);
}
-void party_menu_link_mon_icon_anim(u16 species, u32 pid, struct Struct203CEDC *ptr, u8 priority, u32 bit)
+static void party_menu_link_mon_icon_anim(u16 species, u32 pid, struct Struct203CEDC *ptr, u8 priority, u32 bit)
{
if (species != SPECIES_NONE)
{
@@ -4395,35 +4922,35 @@ void party_menu_link_mon_icon_anim(u16 species, u32 pid, struct Struct203CEDC *p
}
}
-void sub_81B5A8C(u8 spriteId, u16 hp, u16 maxhp)
+static void sub_81B5A8C(u8 spriteId, u16 hp, u16 maxhp)
{
switch (GetHPBarLevel(hp, maxhp))
{
- case HP_BAR_FULL:
- sub_80D32C8(&gSprites[spriteId], 0);
- break;
- case HP_BAR_GREEN:
- sub_80D32C8(&gSprites[spriteId], 1);
- break;
- case HP_BAR_YELLOW:
- sub_80D32C8(&gSprites[spriteId], 2);
- break;
- case HP_BAR_RED:
- sub_80D32C8(&gSprites[spriteId], 3);
- break;
- default:
- sub_80D32C8(&gSprites[spriteId], 4);
- break;
+ case HP_BAR_FULL:
+ sub_80D32C8(&gSprites[spriteId], 0);
+ break;
+ case HP_BAR_GREEN:
+ sub_80D32C8(&gSprites[spriteId], 1);
+ break;
+ case HP_BAR_YELLOW:
+ sub_80D32C8(&gSprites[spriteId], 2);
+ break;
+ case HP_BAR_RED:
+ sub_80D32C8(&gSprites[spriteId], 3);
+ break;
+ default:
+ sub_80D32C8(&gSprites[spriteId], 4);
+ break;
}
}
-void sub_81B5B38(u8 spriteId, struct Pokemon *mon)
+static void sub_81B5B38(u8 spriteId, struct Pokemon *mon)
{
sub_81B5A8C(spriteId, GetMonData(mon, MON_DATA_HP), GetMonData(mon, MON_DATA_MAX_HP));
}
-void AnimateSelectedPartyIcon(u8 spriteId, u8 a)
-{
+static void AnimateSelectedPartyIcon(u8 spriteId, u8 a)
+{
gSprites[spriteId].data[0] = 0;
if (a == 0)
{
@@ -4447,10 +4974,10 @@ void AnimateSelectedPartyIcon(u8 spriteId, u8 a)
}
}
-void UpdatePartyMonIconFrameAndBounce(struct Sprite *sprite)
+static void UpdatePartyMonIconFrameAndBounce(struct Sprite *sprite)
{
u8 unk = UpdateMonIconFrame(sprite);
-
+
if (unk != 0)
{
if (unk & 1)
@@ -4460,12 +4987,12 @@ void UpdatePartyMonIconFrameAndBounce(struct Sprite *sprite)
}
}
-void UpdatePartyMonIconFrame(struct Sprite *sprite)
+static void UpdatePartyMonIconFrame(struct Sprite *sprite)
{
UpdateMonIconFrame(sprite);
}
-void party_menu_held_item_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
+static void party_menu_held_item_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
{
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
@@ -4474,7 +5001,7 @@ void party_menu_held_item_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
}
}
-void party_menu_link_mon_held_item_object(u16 species, u16 item, struct Struct203CEDC *ptr)
+static void party_menu_link_mon_held_item_object(u16 species, u16 item, struct Struct203CEDC *ptr)
{
if (species != SPECIES_NONE)
{
@@ -4484,12 +5011,12 @@ void party_menu_link_mon_held_item_object(u16 species, u16 item, struct Struct20
}
}
-void sub_81B5C94(struct Pokemon *mon, struct Struct203CEDC *ptr)
+static void sub_81B5C94(struct Pokemon *mon, struct Struct203CEDC *ptr)
{
sub_81B5CB0(GetMonData(mon, MON_DATA_HELD_ITEM), ptr);
}
-void sub_81B5CB0(u16 item, struct Struct203CEDC *ptr)
+static void sub_81B5CB0(u16 item, struct Struct203CEDC *ptr)
{
if (item == ITEM_NONE)
{
@@ -4515,33 +5042,33 @@ void sub_81B5D4C(u8 *a, u8 *b, u8 c)
{
u16 i;
u16 item;
-
+
switch (c)
{
- case 0:
- for (i = 0; i < a[0]; i++)
- {
- item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
- if (item != ITEM_NONE)
- sub_81B5DF0(b[i], ItemIsMail(item));
- }
- break;
- case 1:
- for (i = 0; i < a[1]; i++)
- {
- item = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM);
- if (item != ITEM_NONE)
- sub_81B5DF0(b[i + 6], ItemIsMail(item));
- }
- break;
+ case 0:
+ for (i = 0; i < a[0]; i++)
+ {
+ item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
+ if (item != ITEM_NONE)
+ sub_81B5DF0(b[i], ItemIsMail(item));
+ }
+ break;
+ case 1:
+ for (i = 0; i < a[1]; i++)
+ {
+ item = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM);
+ if (item != ITEM_NONE)
+ sub_81B5DF0(b[i + 6], ItemIsMail(item));
+ }
+ break;
}
}
-void sub_81B5DF0(u8 spriteId, u8 isMail)
+static void sub_81B5DF0(u8 spriteId, u8 isMail)
{
u8 subpriority = gSprites[spriteId].subpriority;
u8 newSpriteId = CreateSprite(&gSpriteTemplate_8615EC0, 250, 170, subpriority - 1);
-
+
gSprites[newSpriteId].pos2.x = 4;
gSprites[newSpriteId].pos2.y = 10;
gSprites[newSpriteId].callback = sub_81B5E74;
@@ -4550,10 +5077,10 @@ void sub_81B5DF0(u8 spriteId, u8 isMail)
gSprites[newSpriteId].callback(&gSprites[newSpriteId]);
}
-void sub_81B5E74(struct Sprite *sprite)
+static void sub_81B5E74(struct Sprite *sprite)
{
u8 otherSpriteId = sprite->data[7];
-
+
if (gSprites[otherSpriteId].invisible)
{
sprite->invisible = TRUE;
@@ -4566,13 +5093,13 @@ void sub_81B5E74(struct Sprite *sprite)
}
}
-void party_menu_pokeball_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
+static void party_menu_pokeball_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
{
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
ptr->unkB = CreateSprite(&gSpriteTemplate_8615F08, ptr->unk4[6], ptr->unk4[7], 8);
}
-void party_menu_link_mon_pokeball_object(u16 species, struct Struct203CEDC *ptr)
+static void party_menu_link_mon_pokeball_object(u16 species, struct Struct203CEDC *ptr)
{
if (species != SPECIES_NONE)
{
@@ -4581,25 +5108,25 @@ void party_menu_link_mon_pokeball_object(u16 species, struct Struct203CEDC *ptr)
}
}
-u8 sub_81B5F34(u8 x, u8 y)
+static u8 sub_81B5F34(u8 x, u8 y)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_8615F08, x, y, 8);
-
+
gSprites[spriteId].oam.priority = 2;
return spriteId;
}
-u8 sub_81B5F74(u8 x, u8 y)
+static u8 sub_81B5F74(u8 x, u8 y)
{
return CreateSprite(&gSpriteTemplate_8615F78, x, y, 8);
}
-void sub_81B5F98(u8 spriteId, u8 a)
+static void sub_81B5F98(u8 spriteId, u8 a)
{
StartSpriteAnim(&gSprites[spriteId], a);
}
-void sub_81B5FBC(u8 spriteId, u8 spriteId2, u8 a)
+static void sub_81B5FBC(u8 spriteId, u8 spriteId2, u8 a)
{
if (a == 0)
{
@@ -4617,14 +5144,14 @@ void sub_81B5FBC(u8 spriteId, u8 spriteId2, u8 a)
}
}
-void LoadPartyMenuPokeballGfx(void)
+static void LoadPartyMenuPokeballGfx(void)
{
- LoadCompressedObjectPic(&gUnknown_08615EF8);
- LoadCompressedObjectPic(&gUnknown_08615F70);
- LoadCompressedObjectPalette(&gUnknown_08615F00);
+ LoadCompressedSpriteSheet(&gUnknown_08615EF8);
+ LoadCompressedSpriteSheet(&gUnknown_08615F70);
+ LoadCompressedSpritePalette(&gUnknown_08615F00);
}
-void party_menu_status_condition_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
+static void party_menu_status_condition_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
{
if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
{
@@ -4633,7 +5160,7 @@ void party_menu_status_condition_object(struct Pokemon *mon, struct Struct203CED
}
}
-void party_menu_link_mon_status_condition_object(u16 species, u8 status, struct Struct203CEDC *ptr)
+static void party_menu_link_mon_status_condition_object(u16 species, u8 status, struct Struct203CEDC *ptr)
{
if (species != SPECIES_NONE)
{
@@ -4643,30 +5170,30 @@ void party_menu_link_mon_status_condition_object(u16 species, u8 status, struct
}
}
-void party_menu_get_status_condition_and_update_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
+static void party_menu_get_status_condition_and_update_object(struct Pokemon *mon, struct Struct203CEDC *ptr)
{
party_menu_update_status_condition_object(sub_81B205C(mon), ptr);
}
-void party_menu_update_status_condition_object(u8 status, struct Struct203CEDC *ptr)
+static void party_menu_update_status_condition_object(u8 status, struct Struct203CEDC *ptr)
{
switch (status)
{
- case AILMENT_NONE:
- case AILMENT_PKRS:
- gSprites[ptr->unkC].invisible = TRUE;
- break;
- default:
- StartSpriteAnim(&gSprites[ptr->unkC], status - 1);
- gSprites[ptr->unkC].invisible = FALSE;
- break;
+ case AILMENT_NONE:
+ case AILMENT_PKRS:
+ gSprites[ptr->unkC].invisible = TRUE;
+ break;
+ default:
+ StartSpriteAnim(&gSprites[ptr->unkC], status - 1);
+ gSprites[ptr->unkC].invisible = FALSE;
+ break;
}
}
-void LoadPartyMenuAilmentGfx(void)
+static void LoadPartyMenuAilmentGfx(void)
{
- LoadCompressedObjectPic(&gUnknown_08615FF8);
- LoadCompressedObjectPalette(&gUnknown_08616000);
+ LoadCompressedSpriteSheet(&gUnknown_08615FF8);
+ LoadCompressedSpritePalette(&gUnknown_08616000);
}
void sub_81B617C(void)
@@ -4675,9 +5202,9 @@ void sub_81B617C(void)
u8 doubleBattleStatus;
bool8 inBattle;
u8 i;
- u8 msgIDMaybe;
+ u8 msgIdMaybe;
register TaskFunc task asm("r0");
-
+
if (gMain.inBattle)
{
inBattle = TRUE;
@@ -4700,17 +5227,17 @@ void sub_81B617C(void)
}
}
task = sub_81B6280;
- msgIDMaybe = 0x7F;
+ msgIdMaybe = 0x7F;
}
else
{
- msgIDMaybe = (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) ? 4 : 5;
+ msgIdMaybe = (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_TM_HM) ? 4 : 5;
task = sub_81B1370;
}
- InitPartyMenu(inBattle, doubleBattleStatus, 3, 1, msgIDMaybe, task, callback);
+ InitPartyMenu(inBattle, doubleBattleStatus, 3, 1, msgIdMaybe, task, callback);
}
-void c2_815ABFC(void)
+static void c2_815ABFC(void)
{
if (InBattlePyramid() == FALSE)
GoToBagMenu(RETURN_LOCATION_UNCHANGED, POCKETS_COUNT, NULL);
@@ -4718,7 +5245,7 @@ void c2_815ABFC(void)
sub_81C4F98(4, gPyramidBagCursorData.callback);
}
-void sub_81B6280(u8 taskId)
+static void sub_81B6280(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -4728,10 +5255,10 @@ void sub_81B6280(u8 taskId)
}
}
-bool8 IsHPRecoveryItem(u16 item)
+static bool8 IsHPRecoveryItem(u16 item)
{
const u8 *effect;
-
+
if (item == ITEM_ENIGMA_BERRY)
effect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
else
@@ -4741,87 +5268,87 @@ bool8 IsHPRecoveryItem(u16 item)
return FALSE;
}
-void GetMedicineItemEffectMessage(u16 item)
-{
- switch (GetItemEffectType(item) - 3)
- {
- case 0:
- StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfPoison);
- break;
- case 1:
- StringExpandPlaceholders(gStringVar4, gText_PkmnWokeUp2);
- break;
- case 2:
- StringExpandPlaceholders(gStringVar4, gText_PkmnBurnHealed);
- break;
- case 3:
- StringExpandPlaceholders(gStringVar4, gText_PkmnThawedOut);
- break;
- case 4:
- StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfParalysis);
- break;
- case 5:
- StringExpandPlaceholders(gStringVar4, gText_PkmnSnappedOutOfConfusion);
- break;
- case 6:
- StringExpandPlaceholders(gStringVar4, gText_PkmnGotOverInfatuation);
- break;
- case 8:
- StringExpandPlaceholders(gStringVar4, gText_PkmnBecameHealthy);
- break;
- case 10:
- StringCopy(gStringVar2, gText_HP3);
- StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
- break;
- case 9:
- StringCopy(gStringVar2, gText_Attack3);
- StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
- break;
- case 14:
- StringCopy(gStringVar2, gText_Defense3);
- StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
- break;
- case 13:
- StringCopy(gStringVar2, gText_Speed2);
- StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
- break;
- case 11:
- StringCopy(gStringVar2, gText_SpAtk3);
- StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
- break;
- case 12:
- StringCopy(gStringVar2, gText_SpDef3);
- StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
- break;
- case 16:
- case 17:
- StringExpandPlaceholders(gStringVar4, gText_MovesPPIncreased);
- break;
- case 18:
- StringExpandPlaceholders(gStringVar4, gText_PPWasRestored);
- break;
- default:
- StringExpandPlaceholders(gStringVar4, gText_WontHaveEffect);
- break;
- }
-}
-
-bool8 UsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item)
+static void GetMedicineItemEffectMessage(u16 item)
+{
+ switch (GetItemEffectType(item))
+ {
+ case 3:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfPoison);
+ break;
+ case 4:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnWokeUp2);
+ break;
+ case 5:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBurnHealed);
+ break;
+ case 6:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnThawedOut);
+ break;
+ case 7:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnCuredOfParalysis);
+ break;
+ case 8:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnSnappedOutOfConfusion);
+ break;
+ case 9:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnGotOverInfatuation);
+ break;
+ case 11:
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBecameHealthy);
+ break;
+ case 13:
+ StringCopy(gStringVar2, gText_HP3);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
+ break;
+ case 12:
+ StringCopy(gStringVar2, gText_Attack3);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
+ break;
+ case 17:
+ StringCopy(gStringVar2, gText_Defense3);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
+ break;
+ case 16:
+ StringCopy(gStringVar2, gText_Speed2);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
+ break;
+ case 14:
+ StringCopy(gStringVar2, gText_SpAtk3);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
+ break;
+ case 15:
+ StringCopy(gStringVar2, gText_SpDef3);
+ StringExpandPlaceholders(gStringVar4, gText_PkmnBaseVar2StatIncreased);
+ break;
+ case 19:
+ case 20:
+ StringExpandPlaceholders(gStringVar4, gText_MovesPPIncreased);
+ break;
+ case 21:
+ StringExpandPlaceholders(gStringVar4, gText_PPWasRestored);
+ break;
+ default:
+ StringExpandPlaceholders(gStringVar4, gText_WontHaveEffect);
+ break;
+ }
+}
+
+static bool8 UsingHPEVItemOnShedinja(struct Pokemon *mon, u16 item)
{
if (GetItemEffectType(item) == 13 && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_SHEDINJA)
return FALSE;
return TRUE;
}
-bool8 IsBlueYellowRedFlute(u16 item)
+static bool8 IsBlueYellowRedFlute(u16 item)
{
if (item == ITEM_BLUE_FLUTE || item == ITEM_RED_FLUTE || item == ITEM_YELLOW_FLUTE)
return TRUE;
return FALSE;
}
-bool8 ExecuteTableBasedItemEffect__(u8 partyMonIndex, u16 item, u8 monMoveIndex)
-{
+static bool8 ExecuteTableBasedItemEffect__(u8 partyMonIndex, u16 item, u8 monMoveIndex)
+{
if (gMain.inBattle)
return ExecuteTableBasedItemEffect(&gPlayerParty[partyMonIndex], item, sub_81B8F38(partyMonIndex), monMoveIndex);
else
@@ -4834,7 +5361,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task)
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 item = gSpecialVar_ItemId;
bool8 canHeal;
-
+
if (UsingHPEVItemOnShedinja(mon, item))
{
canHeal = IsHPRecoveryItem(item);
@@ -4891,7 +5418,7 @@ void ItemUseCB_Medicine(u8 taskId, TaskFunc task)
}
}
-void sub_81B672C(u8 taskId)
+static void sub_81B672C(u8 taskId)
{
GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);
@@ -4901,7 +5428,7 @@ void sub_81B672C(u8 taskId)
gTasks[taskId].func = sub_81B6794;
}
-void sub_81B6794(u8 taskId)
+static void sub_81B6794(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -4921,7 +5448,7 @@ void sub_81B67C8(u8 taskId, TaskFunc task)
bool8 cannotUseEffect = ExecuteTableBasedItemEffect__(gUnknown_0203CEC8.unk9, item, 0);
u16 newFriendship = GetMonData(mon, MON_DATA_FRIENDSHIP);
u16 newRelevantEV = sub_81B691C(mon, effectType);
-
+
if (cannotUseEffect || (friendship == newFriendship && relevantEV == newRelevantEV))
{
gUnknown_0203CEE8 = 0;
@@ -4954,61 +5481,61 @@ void sub_81B67C8(u8 taskId, TaskFunc task)
}
}
-u16 sub_81B691C(struct Pokemon *mon, u8 effectType)
+static u16 sub_81B691C(struct Pokemon *mon, u8 effectType)
{
switch (effectType)
{
- case 13:
- if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_SHEDINJA)
- return GetMonData(mon, MON_DATA_HP_EV);
- break;
- case 12:
- return GetMonData(mon, MON_DATA_ATK_EV);
- case 17:
- return GetMonData(mon, MON_DATA_DEF_EV);
- case 16:
- return GetMonData(mon, MON_DATA_SPEED_EV);
- case 14:
- return GetMonData(mon, MON_DATA_SPATK_EV);
- case 15:
- return GetMonData(mon, MON_DATA_SPDEF_EV);
+ case 13:
+ if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_SHEDINJA)
+ return GetMonData(mon, MON_DATA_HP_EV);
+ break;
+ case 12:
+ return GetMonData(mon, MON_DATA_ATK_EV);
+ case 17:
+ return GetMonData(mon, MON_DATA_DEF_EV);
+ case 16:
+ return GetMonData(mon, MON_DATA_SPEED_EV);
+ case 14:
+ return GetMonData(mon, MON_DATA_SPATK_EV);
+ case 15:
+ return GetMonData(mon, MON_DATA_SPDEF_EV);
}
return 0;
}
-void option_menu_get_string(u8 effectType, u8 *dest)
+static void option_menu_get_string(u8 effectType, u8 *dest)
{
switch (effectType)
{
- case 13:
- StringCopy(dest, gText_HP3);
- break;
- case 12:
- StringCopy(dest, gText_Attack3);
- break;
- case 17:
- StringCopy(dest, gText_Defense3);
- break;
- case 16:
- StringCopy(dest, gText_Speed2);
- break;
- case 14:
- StringCopy(dest, gText_SpAtk3);
- break;
- case 15:
- StringCopy(dest, gText_SpDef3);
- break;
- }
-}
-
-void sub_81B6A10(u8 slot)
+ case 13:
+ StringCopy(dest, gText_HP3);
+ break;
+ case 12:
+ StringCopy(dest, gText_Attack3);
+ break;
+ case 17:
+ StringCopy(dest, gText_Defense3);
+ break;
+ case 16:
+ StringCopy(dest, gText_Speed2);
+ break;
+ case 14:
+ StringCopy(dest, gText_SpAtk3);
+ break;
+ case 15:
+ StringCopy(dest, gText_SpDef3);
+ break;
+ }
+}
+
+static void sub_81B6A10(u8 slot)
{
u8 i;
u8 moveCount = 0;
u8 fontId = 1;
u8 windowId = sub_81B31B0(3);
u16 move;
-
+
for (i = 0; i < MAX_MON_MOVES; i++)
{
move = GetMonData(&gPlayerParty[slot], MON_DATA_MOVE1 + i);
@@ -5020,10 +5547,10 @@ void sub_81B6A10(u8 slot)
schedule_bg_copy_tilemap_to_vram(2);
}
-void ether_effect_related_3(u8 taskId)
+static void ether_effect_related_3(u8 taskId)
{
s8 input = Menu_ProcessInput();
-
+
if (input != MENU_NOTHING_CHOSEN)
{
if (input == MENU_B_PRESSED)
@@ -5039,11 +5566,11 @@ void ether_effect_related_3(u8 taskId)
}
}
-void dp05_ether(u8 taskId, TaskFunc unused)
+void dp05_ether(u8 taskId, TaskFunc task)
{
const u8 *effect;
u16 item = gSpecialVar_ItemId;
-
+
if (item == ITEM_ENIGMA_BERRY)
effect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
else
@@ -5062,14 +5589,14 @@ void dp05_ether(u8 taskId, TaskFunc unused)
}
}
-void ether_effect_related_2(u8 taskId)
+static void ether_effect_related_2(u8 taskId)
{
sub_81B302C(&gUnknown_0203CEC4->unkC[0]);
- gUnknown_0203CEC8.unkE = GetMenuCursorPos();
+ gUnknown_0203CEC8.unkE = Menu_GetCursorPos();
ether_effect_related(taskId);
}
-void sub_81B6BB4(u8 taskId)
+static void sub_81B6BB4(u8 taskId)
{
gTasks[taskId].func = sub_81B1370;
gUnknown_0203CEC4->exitCallback = NULL;
@@ -5077,14 +5604,14 @@ void sub_81B6BB4(u8 taskId)
display_pokemon_menu_message(5);
}
-void ether_effect_related(u8 taskId)
+static void ether_effect_related(u8 taskId)
{
u16 move = MOVE_NONE;
s16 *moveslot = &gUnknown_0203CEC8.unkE;
u16 item = gSpecialVar_ItemId;
struct Struct203CEC8 *ptr = &gUnknown_0203CEC8;
struct Pokemon *mon;
-
+
if (ExecuteTableBasedItemEffect__(ptr->unk9, item, *moveslot))
{
gUnknown_0203CEE8 = 0;
@@ -5108,7 +5635,7 @@ void ether_effect_related(u8 taskId)
}
}
-void dp05_pp_up(u8 taskId, TaskFunc unused)
+void dp05_pp_up(u8 taskId, TaskFunc task)
{
PlaySE(SE_SELECT);
display_pokemon_menu_message(23);
@@ -5119,25 +5646,25 @@ void dp05_pp_up(u8 taskId, TaskFunc unused)
u16 ItemIdToBattleMoveId(u16 item)
{
u16 tmNumber = item - ITEM_TM01_FOCUS_PUNCH;
- return gUnknown_08616040[tmNumber];
+ return gTMHMMoves[tmNumber];
}
-bool8 sub_81B6D14(u16 move)
+bool8 IsMoveHm(u16 move)
{
u8 i;
-
+
for (i = 0; i < NUM_HIDDEN_MACHINES; i++)
{
- if (gUnknown_08616040[i + NUM_TECHNICAL_MACHINES] == move)
+ if (gTMHMMoves[i + NUM_TECHNICAL_MACHINES] == move)
return TRUE;
}
return FALSE;
}
-bool8 pokemon_has_move(struct Pokemon *mon, u16 move)
+bool8 MonKnowsMove(struct Pokemon *mon, u16 move)
{
u8 i;
-
+
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (GetMonData(mon, MON_DATA_MOVE1 + i) == move)
@@ -5146,14 +5673,14 @@ bool8 pokemon_has_move(struct Pokemon *mon, u16 move)
return FALSE;
}
-void sub_81B6D74(const u8 *str)
+static void sub_81B6D74(const u8 *str)
{
StringExpandPlaceholders(gStringVar4, str);
sub_81B1B5C(gStringVar4, 1);
schedule_bg_copy_tilemap_to_vram(2);
}
-void sub_81B6D98(u8 taskId, const u8 *str)
+static void sub_81B6D98(u8 taskId, const u8 *str)
{
sub_81B6D74(str);
gTasks[taskId].func = sub_81B6794;
@@ -5161,12 +5688,12 @@ void sub_81B6D98(u8 taskId, const u8 *str)
// move[1] doesn't use constants cause I don't know if it's actually a move ID storage
-void sub_81B6DC4(u8 taskId, TaskFunc unused)
+void sub_81B6DC4(u8 taskId, TaskFunc task)
{
struct Pokemon *mon;
s16 *move;
u16 item;
-
+
PlaySE(SE_SELECT);
mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
move = &gUnknown_0203CEC8.unkE;
@@ -5175,15 +5702,17 @@ void sub_81B6DC4(u8 taskId, TaskFunc unused)
move[0] = ItemIdToBattleMoveId(item);
StringCopy(gStringVar2, gMoveNames[move[0]]);
move[1] = 0;
- switch (CanPartyPokemonLearnTMTutor(mon, item, 0))
+
+ switch (CanMonLearnTMTutor(mon, item, 0))
{
- case CANNOT_LEARN_MOVE:
- sub_81B6D98(taskId, gText_PkmnCantLearnMove);
- return;
- case ALREADY_KNOWS_MOVE:
- sub_81B6D98(taskId, gText_PkmnAlreadyKnows);
- return;
+ case CANNOT_LEARN_MOVE:
+ sub_81B6D98(taskId, gText_PkmnCantLearnMove);
+ return;
+ case ALREADY_KNOWS_MOVE:
+ sub_81B6D98(taskId, gText_PkmnAlreadyKnows);
+ return;
}
+
if (GiveMoveToMon(mon, move[0]) != 0xFFFF)
{
gTasks[taskId].func = sub_81B6EB4;
@@ -5195,12 +5724,12 @@ void sub_81B6DC4(u8 taskId, TaskFunc unused)
}
}
-void sub_81B6EB4(u8 taskId)
+static void sub_81B6EB4(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
s16 *move = &gUnknown_0203CEC8.unkE;
u16 item = gSpecialVar_ItemId;
-
+
if (move[1] == 0)
{
AdjustFriendship(mon, 4);
@@ -5215,7 +5744,7 @@ void sub_81B6EB4(u8 taskId)
gTasks[taskId].func = sub_81B6F60;
}
-void sub_81B6F60(u8 taskId)
+static void sub_81B6F60(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -5224,14 +5753,14 @@ void sub_81B6F60(u8 taskId)
}
}
-void sub_81B6F98(u8 taskId)
+static void sub_81B6F98(u8 taskId)
{
if (IsFanfareTaskInactive() && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)))
{
if (gUnknown_0203CEC8.unk10 == 1)
sub_81B77AC(taskId);
else
- {
+ {
if (gUnknown_0203CEC8.unk10 == 2)
gSpecialVar_Result = TRUE;
sub_81B12C0(taskId);
@@ -5239,7 +5768,7 @@ void sub_81B6F98(u8 taskId)
}
}
-void sub_81B6FF4(u8 taskId)
+static void sub_81B6FF4(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -5248,23 +5777,23 @@ void sub_81B6FF4(u8 taskId)
}
}
-void sub_81B7028(u8 taskId)
+static void sub_81B7028(u8 taskId)
{
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- sub_81B1B5C(gText_WhichMoveToForget, 1);
- gTasks[taskId].func = sub_81B7088;
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- sub_81B7230(taskId);
- break;
+ case 0:
+ sub_81B1B5C(gText_WhichMoveToForget, 1);
+ gTasks[taskId].func = sub_81B7088;
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ sub_81B7230(taskId);
+ break;
}
}
-void sub_81B7088(u8 taskId)
+static void sub_81B7088(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -5273,17 +5802,17 @@ void sub_81B7088(u8 taskId)
}
}
-void sub_81B70B8(void)
+static void sub_81B70B8(void)
{
ShowSelectMovePokemonSummaryScreen(gPlayerParty, gUnknown_0203CEC8.unk9, gPlayerPartyCount - 1, sub_81B70F0, gUnknown_0203CEC8.unkE);
}
-void sub_81B70F0(void)
+static void sub_81B70F0(void)
{
InitPartyMenu(0, 0, 0, 1, 0x7F, sub_81B711C, gUnknown_0203CEC8.exitCallback);
}
-void sub_81B711C(u8 taskId)
+static void sub_81B711C(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -5294,22 +5823,22 @@ void sub_81B711C(u8 taskId)
}
}
-void sub_81B7154(u8 taskId)
+static void sub_81B7154(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 move = GetMonData(mon, MON_DATA_MOVE1 + sub_81C1B94());
-
+
GetMonNickname(mon, gStringVar1);
StringCopy(gStringVar2, gMoveNames[move]);
sub_81B6D74(gText_12PoofForgotMove);
gTasks[taskId].func = sub_81B71D4;
}
-void sub_81B71D4(u8 taskId)
+static void sub_81B71D4(u8 taskId)
{
struct Pokemon *mon;
u16 move;
-
+
if (sub_81B1BD4() != TRUE)
{
mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
@@ -5320,7 +5849,7 @@ void sub_81B71D4(u8 taskId)
}
}
-void sub_81B7230(u8 taskId)
+static void sub_81B7230(u8 taskId)
{
StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]);
StringExpandPlaceholders(gStringVar4, gText_StopLearningMove2);
@@ -5329,7 +5858,7 @@ void sub_81B7230(u8 taskId)
gTasks[taskId].func = sub_81B7294;
}
-void sub_81B7294(u8 taskId)
+static void sub_81B7294(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -5338,40 +5867,40 @@ void sub_81B7294(u8 taskId)
}
}
-void sub_81B72C8(u8 taskId)
+static void sub_81B72C8(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
-
+
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- GetMonNickname(mon, gStringVar1);
- StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]);
- StringExpandPlaceholders(gStringVar4, gText_MoveNotLearned);
- sub_81B1B5C(gStringVar4, 1);
- if (gUnknown_0203CEC8.unk10 == 1)
- {
- gTasks[taskId].func = sub_81B73E4;
- }
- else
- {
- if (gUnknown_0203CEC8.unk10 == 2)
- gSpecialVar_Result = FALSE;
- gTasks[taskId].func = sub_81B6794;
- }
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
- GetMonNickname(mon, gStringVar1);
- StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]);
- sub_81B6D74(gText_PkmnNeedsToReplaceMove);
- gTasks[taskId].func = sub_81B6FF4;
- break;
+ case 0:
+ GetMonNickname(mon, gStringVar1);
+ StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]);
+ StringExpandPlaceholders(gStringVar4, gText_MoveNotLearned);
+ sub_81B1B5C(gStringVar4, 1);
+ if (gUnknown_0203CEC8.unk10 == 1)
+ {
+ gTasks[taskId].func = sub_81B73E4;
+ }
+ else
+ {
+ if (gUnknown_0203CEC8.unk10 == 2)
+ gSpecialVar_Result = FALSE;
+ gTasks[taskId].func = sub_81B6794;
+ }
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ GetMonNickname(mon, gStringVar1);
+ StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]);
+ sub_81B6D74(gText_PkmnNeedsToReplaceMove);
+ gTasks[taskId].func = sub_81B6FF4;
+ break;
}
}
-void sub_81B73E4(u8 taskId)
+static void sub_81B73E4(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
sub_81B77AC(taskId);
@@ -5384,7 +5913,7 @@ void dp05_rare_candy(u8 taskId, TaskFunc task)
s16 *arrayPtr = ptr->data;
u16 *itemPtr = &gSpecialVar_ItemId;
bool8 cannotUseEffect;
-
+
if (GetMonData(mon, MON_DATA_LEVEL) != MAX_LEVEL)
{
sub_81B79A0(mon, arrayPtr);
@@ -5418,7 +5947,7 @@ void dp05_rare_candy(u8 taskId, TaskFunc task)
}
}
-void sub_81B754C(u8 slot, struct Pokemon *mon)
+static void sub_81B754C(u8 slot, struct Pokemon *mon)
{
party_menu_get_status_condition_and_update_object(mon, &gUnknown_0203CEDC[slot]);
if (gSprites[gUnknown_0203CEDC[slot].unkC].invisible)
@@ -5431,7 +5960,7 @@ void sub_81B754C(u8 slot, struct Pokemon *mon)
schedule_bg_copy_tilemap_to_vram(0);
}
-void sub_81B75D4(u8 taskId)
+static void sub_81B75D4(u8 taskId)
{
if (WaitFanfare(FALSE) && sub_81B1BD4() != TRUE && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)))
{
@@ -5441,7 +5970,7 @@ void sub_81B75D4(u8 taskId)
}
}
-void sub_81B7634(u8 taskId)
+static void sub_81B7634(u8 taskId)
{
if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
{
@@ -5451,29 +5980,29 @@ void sub_81B7634(u8 taskId)
}
}
-void sub_81B767C(u8 taskId)
+static void sub_81B767C(u8 taskId)
{
s16 *arrayPtr = gUnknown_0203CEC4->data;
-
+
arrayPtr[12] = sub_81B3364();
sub_81D3640(arrayPtr[12], arrayPtr, &arrayPtr[6], 1, 2, 3);
CopyWindowToVram(arrayPtr[12], 2);
schedule_bg_copy_tilemap_to_vram(2);
}
-void sub_81B76C8(u8 taskIdUnused)
+static void sub_81B76C8(u8 taskId)
{
s16 *arrayPtr = gUnknown_0203CEC4->data;
-
+
sub_81D3784(arrayPtr[12], &arrayPtr[6], 1, 2, 3);
CopyWindowToVram(arrayPtr[12], 2);
schedule_bg_copy_tilemap_to_vram(2);
}
-void sub_81B7704(u8 taskId)
+static void sub_81B7704(u8 taskId)
{
u16 result;
-
+
if (WaitFanfare(0) && ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)))
{
sub_81B3394();
@@ -5481,28 +6010,6 @@ void sub_81B7704(u8 taskId)
gUnknown_0203CEC8.unk10 = 1;
switch (result)
{
- case 0:
- sub_81B7810(taskId);
- break;
- case 0xFFFF:
- sub_81B787C(taskId);
- break;
- case 0xFFFE:
- gTasks[taskId].func = sub_81B77AC;
- break;
- default:
- sub_81B7910(taskId, result);
- break;
- }
- }
-}
-
-void sub_81B77AC(u8 taskId)
-{
- u16 result = MonTryLearningNewMove(&gPlayerParty[gUnknown_0203CEC8.unk9], 0);
-
- switch (result)
- {
case 0:
sub_81B7810(taskId);
break;
@@ -5510,18 +6017,40 @@ void sub_81B77AC(u8 taskId)
sub_81B787C(taskId);
break;
case 0xFFFE:
- return;
+ gTasks[taskId].func = sub_81B77AC;
+ break;
default:
sub_81B7910(taskId, result);
break;
+ }
}
}
-void sub_81B7810(u8 taskId)
+static void sub_81B77AC(u8 taskId)
+{
+ u16 result = MonTryLearningNewMove(&gPlayerParty[gUnknown_0203CEC8.unk9], 0);
+
+ switch (result)
+ {
+ case 0:
+ sub_81B7810(taskId);
+ break;
+ case 0xFFFF:
+ sub_81B787C(taskId);
+ break;
+ case 0xFFFE:
+ return;
+ default:
+ sub_81B7910(taskId, result);
+ break;
+ }
+}
+
+static void sub_81B7810(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 targetSpecies = GetEvolutionTargetSpecies(mon, 0, 0);
-
+
if (targetSpecies != SPECIES_NONE)
{
FreePartyPointers();
@@ -5535,7 +6064,7 @@ void sub_81B7810(u8 taskId)
}
}
-void sub_81B787C(u8 taskId)
+static void sub_81B787C(u8 taskId)
{
GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1);
StringCopy(gStringVar2, gMoveNames[gMoveToLearn]);
@@ -5546,7 +6075,7 @@ void sub_81B787C(u8 taskId)
gTasks[taskId].func = sub_81B6FF4;
}
-void sub_81B7910(u8 taskId, u16 move)
+static void sub_81B7910(u8 taskId, u16 move)
{
GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1);
StringCopy(gStringVar2, gMoveNames[move]);
@@ -5557,7 +6086,7 @@ void sub_81B7910(u8 taskId, u16 move)
gTasks[taskId].func = sub_81B6F60;
}
-void sub_81B79A0(struct Pokemon *mon, s16 *data)
+static void sub_81B79A0(struct Pokemon *mon, s16 *data)
{
data[0] = GetMonData(mon, MON_DATA_MAX_HP);
data[1] = GetMonData(mon, MON_DATA_ATK);
@@ -5567,7 +6096,7 @@ void sub_81B79A0(struct Pokemon *mon, s16 *data)
data[3] = GetMonData(mon, MON_DATA_SPEED);
}
-void sub_81B79E8(u8 taskId, TaskFunc unused)
+void sub_81B79E8(u8 taskId, TaskFunc task)
{
gUnknown_0203CEC4->data[0] = 0;
gUnknown_0203CEC4->data[1] = 0;
@@ -5575,26 +6104,24 @@ void sub_81B79E8(u8 taskId, TaskFunc unused)
sub_81B7A28(taskId);
}
-#ifdef NONMATCHING
-void sub_81B7A28(u8 taskId)
+static void sub_81B7A28(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 hp;
-
- if (GetMonData(mon, MON_DATA_SPECIES) != SPECIES_NONE)
+
+ if (GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NONE)
{
- hp = GetMonData(mon, MON_DATA_HP);
- if (ExecuteTableBasedItemEffect__(gUnknown_0203CEC8.unk9, gSpecialVar_ItemId, 0))
- {
- gTasks[taskId].func = task_sacred_ash_party_loop;
- return;
- }
+ gTasks[taskId].func = task_sacred_ash_party_loop;
+ return;
}
- else
+
+ hp = GetMonData(mon, MON_DATA_HP);
+ if (ExecuteTableBasedItemEffect__(gUnknown_0203CEC8.unk9, gSpecialVar_ItemId, 0))
{
gTasks[taskId].func = task_sacred_ash_party_loop;
return;
}
+
PlaySE(SE_KAIFUKU);
party_menu_get_status_condition_and_update_object(mon, &gUnknown_0203CEDC[gUnknown_0203CEC8.unk9]);
if (gSprites[gUnknown_0203CEDC[gUnknown_0203CEC8.unk9].unkC].invisible)
@@ -5606,133 +6133,8 @@ void sub_81B7A28(u8 taskId)
gUnknown_0203CEC4->data[0] = 1;
gUnknown_0203CEC4->data[1] = 1;
}
-#else
-NAKED
-void sub_81B7A28(u8 taskId)
-{
- asm_unified("push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- sub sp, 0x4\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- mov r8, r4\n\
- ldr r6, =gUnknown_0203CEC8\n\
- movs r1, 0x9\n\
- ldrsb r1, [r6, r1]\n\
- movs r0, 0x64\n\
- muls r1, r0\n\
- ldr r0, =gPlayerParty\n\
- adds r5, r1, r0\n\
- adds r0, r5, 0\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- cmp r0, 0\n\
- beq _081B7A6E\n\
- adds r0, r5, 0\n\
- movs r1, 0x39\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r7, r0, 16\n\
- ldrb r0, [r6, 0x9]\n\
- ldr r1, =gSpecialVar_ItemId\n\
- ldrh r1, [r1]\n\
- movs r2, 0\n\
- bl ExecuteTableBasedItemEffect__\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _081B7A94\n\
-_081B7A6E:\n\
- ldr r0, =gTasks\n\
- lsls r1, r4, 2\n\
- adds r1, r4\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- ldr r0, =task_sacred_ash_party_loop\n\
- str r0, [r1]\n\
- b _081B7B2A\n\
- .pool\n\
-_081B7A94:\n\
- movs r0, 0x1\n\
- bl PlaySE\n\
- ldr r4, =gUnknown_0203CEDC\n\
- movs r0, 0x9\n\
- ldrsb r0, [r6, r0]\n\
- lsls r0, 4\n\
- ldr r1, [r4]\n\
- adds r1, r0\n\
- adds r0, r5, 0\n\
- bl party_menu_get_status_condition_and_update_object\n\
- ldr r2, =gSprites\n\
- movs r0, 0x9\n\
- ldrsb r0, [r6, r0]\n\
- ldr r1, [r4]\n\
- lsls r0, 4\n\
- adds r3, r0, r1\n\
- ldrb r1, [r3, 0xC]\n\
- lsls r0, r1, 4\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r2\n\
- adds r0, 0x3E\n\
- ldrb r0, [r0]\n\
- lsls r0, 29\n\
- cmp r0, 0\n\
- bge _081B7AD6\n\
- adds r0, r5, 0\n\
- adds r1, r3, 0\n\
- movs r2, 0x1\n\
- bl DisplayPartyPokemonLevelCheck\n\
-_081B7AD6:\n\
- ldr r4, =gUnknown_0203CEC4\n\
- ldr r0, [r4]\n\
- movs r1, 0x87\n\
- lsls r1, 2\n\
- adds r0, r1\n\
- ldrb r0, [r0]\n\
- movs r1, 0\n\
- bl sub_81B0FCC\n\
- ldrb r0, [r6, 0x9]\n\
- movs r1, 0x1\n\
- bl sub_81B0FCC\n\
- adds r0, r5, 0\n\
- movs r1, 0x39\n\
- bl GetMonData\n\
- adds r3, r0, 0\n\
- subs r3, r7\n\
- lsls r3, 16\n\
- asrs r3, 16\n\
- ldrb r1, [r6, 0x9]\n\
- ldr r0, =sub_81B7C10\n\
- str r0, [sp]\n\
- mov r0, r8\n\
- movs r2, 0x1\n\
- bl sub_81B1F18\n\
- mov r0, r8\n\
- movs r1, 0\n\
- adds r2, r7, 0\n\
- bl sub_81B1FA8\n\
- ldr r0, [r4]\n\
- movs r2, 0x86\n\
- lsls r2, 2\n\
- adds r1, r0, r2\n\
- movs r2, 0x1\n\
- strh r2, [r1]\n\
- ldr r1, =0x0000021a\n\
- adds r0, r1\n\
- strh r2, [r0]\n\
-_081B7B2A:\n\
- add sp, 0x4\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n");
-}
-#endif
-void task_sacred_ash_party_loop(u8 taskId)
+static void task_sacred_ash_party_loop(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -5764,7 +6166,7 @@ void task_sacred_ash_party_loop(u8 taskId)
}
}
-void sub_81B7C10(u8 taskId)
+static void sub_81B7C10(u8 taskId)
{
GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unk9], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);
@@ -5941,34 +6343,34 @@ u8 GetItemEffectType(u16 item)
#endif
}
-void sub_81B7E4C(u8 taskId)
+static void sub_81B7E4C(u8 taskId)
{
struct Pokemon *mon;
s16 *move;
-
+
if (!gPaletteFade.active)
{
mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
move = &gUnknown_0203CEC8.unkE;
GetMonNickname(mon, gStringVar1);
- gUnknown_0203CEC8.unkE = sub_81B2360(gSpecialVar_0x8005);
+ gUnknown_0203CEC8.unkE = GetTutorMove(gSpecialVar_0x8005);
StringCopy(gStringVar2, gMoveNames[gUnknown_0203CEC8.unkE]);
move[1] = 2;
- switch (CanPartyPokemonLearnTMTutor(mon, 0, gSpecialVar_0x8005))
+ switch (CanMonLearnTMTutor(mon, 0, gSpecialVar_0x8005))
{
- case CANNOT_LEARN_MOVE:
- sub_81B6D98(taskId, gText_PkmnCantLearnMove);
- return;
- case ALREADY_KNOWS_MOVE:
- sub_81B6D98(taskId, gText_PkmnAlreadyKnows);
+ case CANNOT_LEARN_MOVE:
+ sub_81B6D98(taskId, gText_PkmnCantLearnMove);
+ return;
+ case ALREADY_KNOWS_MOVE:
+ sub_81B6D98(taskId, gText_PkmnAlreadyKnows);
+ return;
+ default:
+ if (GiveMoveToMon(mon, gUnknown_0203CEC8.unkE) != 0xFFFF)
+ {
+ sub_81B6EB4(taskId);
return;
- default:
- if (GiveMoveToMon(mon, gUnknown_0203CEC8.unkE) != 0xFFFF)
- {
- sub_81B6EB4(taskId);
- return;
- }
- break;
+ }
+ break;
}
sub_81B6D74(gText_PkmnNeedsToReplaceMove);
gTasks[taskId].func = sub_81B6FF4;
@@ -5987,7 +6389,7 @@ void sub_81B7F60(void)
gUnknown_0203CEC8.unkC = gSpecialVar_ItemId;
}
-void sub_81B7FAC(u8 taskId)
+static void sub_81B7FAC(u8 taskId)
{
gUnknown_0203CEFC = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_HELD_ITEM);
if (gUnknown_0203CEFC == ITEM_NONE)
@@ -6005,7 +6407,7 @@ void sub_81B7FAC(u8 taskId)
}
}
-void sub_81B8044(u8 taskId)
+static void sub_81B8044(u8 taskId)
{
if (ItemIsMail(gUnknown_0203CEC8.unkC))
{
@@ -6019,10 +6421,10 @@ void sub_81B8044(u8 taskId)
}
}
-void sub_81B8088(u8 taskId)
+static void sub_81B8088(u8 taskId)
{
u16 item;
-
+
if (!gPaletteFade.active)
{
item = gUnknown_0203CEC8.unkC;
@@ -6033,10 +6435,10 @@ void sub_81B8088(u8 taskId)
}
}
-void sub_81B8104(u8 taskId)
+static void sub_81B8104(u8 taskId)
{
s8 slot = gUnknown_0203CEC8.unk9;
-
+
if (sub_81B1BD4() != TRUE)
{
sub_81B5C94(&gPlayerParty[slot], &gUnknown_0203CEDC[slot]);
@@ -6044,20 +6446,20 @@ void sub_81B8104(u8 taskId)
}
}
-void sub_81B814C(void)
+static void sub_81B814C(void)
{
u8 mail;
-
+
sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], gUnknown_0203CEC8.unkC);
mail = GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAIL);
sub_811A20C(4, gSaveBlock1Ptr->mail[mail].words, sub_81B81A8, 3);
}
-void sub_81B81A8(void)
+static void sub_81B81A8(void)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
u16 item = GetMonData(mon, MON_DATA_HELD_ITEM);
-
+
if (gSpecialVar_Result == FALSE)
{
TakeMailFromMon(mon);
@@ -6072,7 +6474,7 @@ void sub_81B81A8(void)
}
}
-void sub_81B8230(u8 taskId)
+static void sub_81B8230(u8 taskId)
{
if (!gPaletteFade.active)
{
@@ -6084,7 +6486,7 @@ void sub_81B8230(u8 taskId)
}
}
-void sub_81B82A0(u8 taskId)
+static void sub_81B82A0(u8 taskId)
{
if (sub_81B1BD4() != TRUE)
{
@@ -6093,50 +6495,50 @@ void sub_81B82A0(u8 taskId)
}
}
-void sub_81B82D4(u8 taskId)
+static void sub_81B82D4(u8 taskId)
{
u16 item;
-
+
switch (Menu_ProcessInputNoWrapClearOnChoose())
{
- case 0:
- item = gUnknown_0203CEC8.unkC;
- sub_81B83F0(item);
- if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE)
- {
- sub_81B841C(item);
- pokemon_item_not_removed(gUnknown_0203CEFC);
- sub_81B1B5C(gStringVar4, 0);
- gTasks[taskId].func = sub_81B8104;
- }
- else if (ItemIsMail(item))
- {
- gUnknown_0203CEC4->exitCallback = sub_81B814C;
- sub_81B12C0(taskId);
- }
- else
- {
- sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], item);
- sub_81B1D68(item, gUnknown_0203CEFC, 1);
- gTasks[taskId].func = sub_81B8104;
- }
- break;
- case MENU_B_PRESSED:
- PlaySE(SE_SELECT);
- case 1:
+ case 0:
+ item = gUnknown_0203CEC8.unkC;
+ sub_81B83F0(item);
+ if (AddBagItem(gUnknown_0203CEFC, 1) == FALSE)
+ {
+ sub_81B841C(item);
+ pokemon_item_not_removed(gUnknown_0203CEFC);
+ sub_81B1B5C(gStringVar4, 0);
gTasks[taskId].func = sub_81B8104;
- break;
+ }
+ else if (ItemIsMail(item))
+ {
+ gUnknown_0203CEC4->exitCallback = sub_81B814C;
+ sub_81B12C0(taskId);
+ }
+ else
+ {
+ sub_81B1DB8(&gPlayerParty[gUnknown_0203CEC8.unk9], item);
+ sub_81B1D68(item, gUnknown_0203CEFC, 1);
+ gTasks[taskId].func = sub_81B8104;
+ }
+ break;
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ case 1:
+ gTasks[taskId].func = sub_81B8104;
+ break;
}
}
-void sub_81B83B8(u8 taskId)
+static void sub_81B83B8(u8 taskId)
{
sub_81B1B5C(gText_RemoveMailBeforeItem, 1);
schedule_bg_copy_tilemap_to_vram(2);
gTasks[taskId].func = sub_81B8104;
}
-void sub_81B83F0(u16 item)
+static void sub_81B83F0(u16 item)
{
if (gUnknown_0203CEC8.unkB == 6)
RemovePCItem(item, 1);
@@ -6144,7 +6546,7 @@ void sub_81B83F0(u16 item)
RemoveBagItem(item, 1);
}
-bool8 sub_81B841C(u16 item)
+static bool8 sub_81B841C(u16 item)
{
if (gUnknown_0203CEC8.unkB == 5)
return AddBagItem(item, 1);
@@ -6157,11 +6559,11 @@ void sub_81B8448(void)
InitPartyMenu(0, 0, 7, 0, 6, sub_81B1370, Mailbox_ReturnToMailListAfterDeposit);
}
-void sub_81B8474(u8 taskId)
+static void sub_81B8474(u8 taskId)
{
struct Pokemon *mon = &gPlayerParty[gUnknown_0203CEC8.unk9];
struct MailStruct *mail;
-
+
gUnknown_0203CEE8 = 0;
mail = &gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos];
if (GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE)
@@ -6187,10 +6589,10 @@ void sub_81B8518(u8 unused)
void sub_81B8558(void)
{
- memset(gSelectedOrderFromParty, 0, ARRAY_COUNT(gSelectedOrderFromParty));
+ memset(gSelectedOrderFromParty, 0, sizeof(gSelectedOrderFromParty));
}
-u8 sub_81B856C(s8 slot)
+static u8 sub_81B856C(s8 slot)
{
if (GetBattleEntryEligibility(&gPlayerParty[slot]) == FALSE)
return 2;
@@ -6199,215 +6601,81 @@ u8 sub_81B856C(s8 slot)
return 0;
}
-bool8 GetBattleEntryEligibility(struct Pokemon *mon)
+static bool8 GetBattleEntryEligibility(struct Pokemon *mon)
{
u16 i = 0;
u16 species;
-
- if (GetMonData(mon, MON_DATA_IS_EGG) || GetMonData(mon, MON_DATA_LEVEL) > sub_81B8888() ||
- (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) &&
- gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) &&
- GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE))
+
+ if (GetMonData(mon, MON_DATA_IS_EGG)
+ || GetMonData(mon, MON_DATA_LEVEL) > sub_81B8888()
+ || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY)
+ && GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE))
+ {
return FALSE;
+ }
+
switch (VarGet(VAR_FRONTIER_FACILITY)) // oddly the specific cases are beyond 6, turns out case 9 is apparently related to link battles
{
- case 9:
- if (GetMonData(mon, MON_DATA_HP) != 0)
- return TRUE;
- return FALSE;
- case 8:
- return TRUE;
- default:
- species = GetMonData(mon, MON_DATA_SPECIES);
- for (; gFrontierBannedSpecies[i] != 0xFFFF; i++)
- {
- if (gFrontierBannedSpecies[i] == species)
- return FALSE;
- }
+ case 9:
+ if (GetMonData(mon, MON_DATA_HP) != 0)
return TRUE;
+ return FALSE;
+ case 8:
+ return TRUE;
+ default:
+ species = GetMonData(mon, MON_DATA_SPECIES);
+ for (; gFrontierBannedSpecies[i] != 0xFFFF; i++)
+ {
+ if (gFrontierBannedSpecies[i] == species)
+ return FALSE;
+ }
+ return TRUE;
}
}
-#ifdef NONMATCHING
-u8 sub_81B865C(void)
+static u8 sub_81B865C(void)
{
- u8 unk = sub_81B885C();
u8 unk2;
u8 i, j;
- u16 species;
- u16 item;
- u8 facilityNum;
-
- if (gSelectedOrderFromParty[unk - 1] == 0)
+ u8 facility;
+ struct Pokemon *party = gPlayerParty;
+ u8 unk = sub_81B885C();
+ u8 *order = gSelectedOrderFromParty;
+
+ if (order[unk - 1] == 0)
{
if (unk == 1)
return 14;
ConvertIntToDecimalStringN(gStringVar1, unk, 0, 1);
return 17;
}
- facilityNum = VarGet(VAR_FRONTIER_FACILITY);
- if (facilityNum != 8 && facilityNum != 9)
+
+ facility = VarGet(VAR_FRONTIER_FACILITY);
+ if (facility == 8 || facility == 9)
+ return 0xFF;
+
+ unk2 = sub_81B8830();
+ for (i = 0; i < unk2 - 1; i++)
{
- unk2 = sub_81B8830();
- for (i = 0; i < (unk2 - 1); i++)
+ u16 species = GetMonData(&party[order[i] - 1], MON_DATA_SPECIES);
+ u16 item = GetMonData(&party[order[i] - 1], MON_DATA_HELD_ITEM);
+ for (j = i + 1; j < unk2; j++)
{
- species = GetMonData(&gPlayerParty[gSelectedOrderFromParty[i - 1]], MON_DATA_SPECIES);
- item = GetMonData(&gPlayerParty[gSelectedOrderFromParty[i - 1]], MON_DATA_HELD_ITEM);
- for (j = i + 1; j < unk2; j++)
- {
- if (species == GetMonData(&gPlayerParty[gSelectedOrderFromParty[j - 1]], MON_DATA_SPECIES))
- return 18;
- if (item != ITEM_NONE && item == GetMonData(&gPlayerParty[gSelectedOrderFromParty[j - 1]], MON_DATA_HELD_ITEM))
- return 19;
- }
+ if (species == GetMonData(&party[order[j] - 1], MON_DATA_SPECIES))
+ return 18;
+ if (item != ITEM_NONE && item == GetMonData(&party[order[j] - 1], MON_DATA_HELD_ITEM))
+ return 19;
}
}
+
return 0xFF;
}
-#else
-NAKED
-u8 sub_81B865C(void)
-{
- asm_unified("push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- bl sub_81B885C\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- adds r1, r2, 0\n\
- ldr r3, =gSelectedOrderFromParty\n\
- adds r0, r2, r3\n\
- subs r0, 0x1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- bne _081B869C\n\
- cmp r2, 0x1\n\
- bne _081B8688\n\
- movs r0, 0xE\n\
- b _081B8758\n\
- .pool\n\
-_081B8688:\n\
- ldr r0, =gStringVar1\n\
- movs r2, 0\n\
- movs r3, 0x1\n\
- bl ConvertIntToDecimalStringN\n\
- movs r0, 0x11\n\
- b _081B8758\n\
- .pool\n\
-_081B869C:\n\
- ldr r0, =0x000040cf\n\
- bl VarGet\n\
- lsls r0, 24\n\
- movs r1, 0xF8\n\
- lsls r1, 24\n\
- adds r0, r1\n\
- lsrs r0, 24\n\
- cmp r0, 0x1\n\
- bhi _081B86C0\n\
- b _081B8756\n\
- .pool\n\
-_081B86B8:\n\
- movs r0, 0x12\n\
- b _081B8758\n\
-_081B86BC:\n\
- movs r0, 0x13\n\
- b _081B8758\n\
-_081B86C0:\n\
- bl sub_81B8830\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r8, r0\n\
- movs r5, 0\n\
- b _081B8750\n\
-_081B86CE:\n\
- ldr r3, =gSelectedOrderFromParty\n\
- adds r4, r3, r5\n\
- ldrb r0, [r4]\n\
- movs r1, 0x64\n\
- muls r0, r1\n\
- subs r0, 0x64\n\
- ldr r3, =gPlayerParty\n\
- adds r0, r3, r0\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r10, r0\n\
- ldrb r0, [r4]\n\
- movs r1, 0x64\n\
- muls r0, r1\n\
- subs r0, 0x64\n\
- ldr r3, =gPlayerParty\n\
- adds r0, r3, r0\n\
- movs r1, 0xC\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- adds r1, r5, 0x1\n\
- lsls r0, r1, 24\n\
- lsrs r4, r0, 24\n\
- mov r9, r1\n\
- cmp r4, r8\n\
- bcs _081B8748\n\
- movs r7, 0x64\n\
-_081B870E:\n\
- ldr r0, =gSelectedOrderFromParty\n\
- adds r5, r0, r4\n\
- ldrb r0, [r5]\n\
- muls r0, r7\n\
- subs r0, 0x64\n\
- ldr r1, =gPlayerParty\n\
- adds r0, r1, r0\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- cmp r10, r0\n\
- beq _081B86B8\n\
- cmp r6, 0\n\
- beq _081B873E\n\
- ldrb r0, [r5]\n\
- muls r0, r7\n\
- subs r0, 0x64\n\
- ldr r3, =gPlayerParty\n\
- adds r0, r3, r0\n\
- movs r1, 0xC\n\
- bl GetMonData\n\
- cmp r6, r0\n\
- beq _081B86BC\n\
-_081B873E:\n\
- adds r0, r4, 0x1\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- cmp r4, r8\n\
- bcc _081B870E\n\
-_081B8748:\n\
- mov r1, r9\n\
- lsls r0, r1, 24\n\
- lsrs r5, r0, 24\n\
- mov r0, r8\n\
-_081B8750:\n\
- subs r0, 0x1\n\
- cmp r5, r0\n\
- blt _081B86CE\n\
-_081B8756:\n\
- movs r0, 0xFF\n\
-_081B8758:\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .pool\n");
-}
-#endif
-bool8 sub_81B8770(u8 slot)
+static bool8 sub_81B8770(u8 slot)
{
u8 i;
-
+
for (i = 0; i < 4; i++)
{
if (gSelectedOrderFromParty[i] == slot)
@@ -6416,14 +6684,14 @@ bool8 sub_81B8770(u8 slot)
return FALSE;
}
-void sub_81B879C(u8 taskId)
+static void sub_81B879C(u8 taskId)
{
- u8 msgID = sub_81B865C();
-
- if (msgID != 0xFF)
+ u8 msgId = sub_81B865C();
+
+ if (msgId != 0xFF)
{
PlaySE(SE_HAZURE);
- display_pokemon_menu_message(msgID);
+ display_pokemon_menu_message(msgId);
gTasks[taskId].func = sub_81B87E8;
}
else
@@ -6433,7 +6701,7 @@ void sub_81B879C(u8 taskId)
}
}
-void sub_81B87E8(u8 taskId)
+static void sub_81B87E8(u8 taskId)
{
if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
{
@@ -6443,56 +6711,57 @@ void sub_81B87E8(u8 taskId)
}
}
-u8 sub_81B8830(void)
+static u8 sub_81B8830(void)
{
switch (VarGet(VAR_FRONTIER_FACILITY))
{
- case 9:
- return 3;
- case 8:
- return 2;
- default:
- return gSpecialVar_0x8005;
+ case 9:
+ return 3;
+ case 8:
+ return 2;
+ default:
+ return gSpecialVar_0x8005;
}
}
-u8 sub_81B885C(void)
+static u8 sub_81B885C(void)
{
switch (VarGet(VAR_FRONTIER_FACILITY))
{
- case 9:
- return 1;
- case 8:
- return 2;
- default:
- return gSpecialVar_0x8005;
+ case 9:
+ return 1;
+ case 8:
+ return 2;
+ default:
+ return gSpecialVar_0x8005;
}
}
-u8 sub_81B8888(void)
+static u8 sub_81B8888(void)
{
switch (VarGet(VAR_FRONTIER_FACILITY))
{
- case 9:
- return 100;
- case 8:
- return 30;
- default:
- if (gSpecialVar_0x8004 == 0)
- return 50;
- return 100;
+ case 9:
+ return 100;
+ case 8:
+ return 30;
+ default:
+ if (gSpecialVar_0x8004 == 0)
+ return 50;
+ return 100;
}
}
-const u8* sub_81B88BC(void)
+static const u8* sub_81B88BC(void)
{
u8 facilityNum = VarGet(VAR_FRONTIER_FACILITY);
-
+
if (!(facilityNum != 8 && facilityNum != 9))
return gText_CancelBattle;
- if (facilityNum == FRONTIER_FACILITY_DOME && gSpecialVar_0x8005 == 2)
+ else if (facilityNum == FRONTIER_FACILITY_DOME && gSpecialVar_0x8005 == 2)
return gText_ReturnToWaitingRoom;
- return gText_CancelChallenge;
+ else
+ return gText_CancelChallenge;
}
void sub_81B8904(u8 initArg, MainCallback callback)
@@ -6510,7 +6779,7 @@ void sub_81B8958(void)
InitPartyMenu(11, 0, 13, 0, 1, sub_81B1370, CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-u8 sub_81B8984(void)
+static u8 sub_81B8984(void)
{
if (IsDoubleBattle() == FALSE)
return 0;
@@ -6533,7 +6802,7 @@ void sub_81B89F0(void)
pokemon_change_order();
}
-u8 sub_81B8A2C(struct Pokemon *mon)
+static u8 sub_81B8A2C(struct Pokemon *mon)
{
if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(mon, MON_DATA_IS_EGG) == FALSE)
{
@@ -6545,13 +6814,12 @@ u8 sub_81B8A2C(struct Pokemon *mon)
return 7;
}
-bool8 sub_81B8A7C(void)
+static bool8 sub_81B8A7C(void)
{
u8 slot = GetCursorSelectionMonId();
u8 newSlot;
u8 i;
- u8 neededToMatch;
-
+
if (IsMultiBattle() == TRUE && (slot == 1 || slot == 4 || slot == 5))
{
StringCopy(gStringVar1, GetTrainerPartnerName());
@@ -6591,8 +6859,8 @@ bool8 sub_81B8A7C(void)
}
if (gUnknown_0203CEC8.unkB == 2)
{
- neededToMatch = gBattlerInMenuId;
- GetMonNickname(&gPlayerParty[pokemon_order_func(gBattlerPartyIndexes[neededToMatch])], gStringVar1);
+ u8 currBattler = gBattlerInMenuId;
+ GetMonNickname(&gPlayerParty[pokemon_order_func(gBattlerPartyIndexes[currBattler])], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_PkmnCantSwitchOut);
return FALSE;
}
@@ -6609,11 +6877,11 @@ void sub_81B8C68(void)
sub_81B8C88(gUnknown_0203CF00, sub_806D7EC());
}
-void sub_81B8C88(u8 *ptr, bool8 multiplayerFlag)
+static void sub_81B8C88(u8 *ptr, bool8 multiplayerFlag)
{
u8 partyIndexes[6];
int i, j;
-
+
if (IsMultiBattle() == TRUE)
{
if (multiplayerFlag)
@@ -6661,19 +6929,19 @@ void sub_81B8C88(u8 *ptr, bool8 multiplayerFlag)
ptr[i] = (partyIndexes[0 + (i * 2)] << 4) | partyIndexes[1 + (i * 2)];
}
-void sub_81B8D64(u8 battlerPosition, u8 multiplayerFlag)
+void sub_81B8D64(u8 battlerId, u8 multiplayerFlag)
{
- sub_81B8D88(gBattleStruct->field_60[battlerPosition], multiplayerFlag, battlerPosition);
+ sub_81B8D88(gBattleStruct->field_60[battlerId], multiplayerFlag, battlerId);
}
-void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerPosition)
+static void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerId)
{
u8 partyIndexes[6];
int i, j;
u8 leftBattler;
u8 rightBattler;
-
- if (GetBattlerSide(battlerPosition) == B_SIDE_PLAYER)
+
+ if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
{
leftBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
rightBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
@@ -6683,6 +6951,7 @@ void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerPosition)
leftBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
rightBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
}
+
if (IsMultiBattle() == TRUE)
{
if (multiplayerFlag)
@@ -6726,21 +6995,22 @@ void sub_81B8D88(u8 *ptr, bool8 multiplayerFlag, u8 battlerPosition)
}
}
}
+
for (i = 0; i < 3; i++)
ptr[i] = (partyIndexes[0 + (i * 2)] << 4) | partyIndexes[1 + (i * 2)];
}
-void sub_81B8E80(u8 battlerPosition, u8 unk, u8 arrayIndex)
+void sub_81B8E80(u8 battlerId, u8 unk, u8 arrayIndex)
{
u8 possiblePartyIndexes[6];
u8 unk2 = 0;
int i, j;
u8 *battleStructRelated;
u8 possiblePartyIndexBuffer;
-
+
if (IsMultiBattle())
{
- battleStructRelated = gBattleStruct->field_60[battlerPosition];
+ battleStructRelated = gBattleStruct->field_60[battlerId];
for (i = j = 0; i < 3; j++, i++)
{
possiblePartyIndexes[j] = battleStructRelated[i] >> 4;
@@ -6767,11 +7037,11 @@ void sub_81B8E80(u8 battlerPosition, u8 unk, u8 arrayIndex)
}
}
-u8 sub_81B8F38(u8 slot)
+static u8 sub_81B8F38(u8 slot)
{
u8 modResult = slot & 1;
u8 retVal;
-
+
slot /= 2;
if (modResult != 0)
retVal = gUnknown_0203CF00[slot] & 0xF;
@@ -6780,10 +7050,10 @@ u8 sub_81B8F38(u8 slot)
return retVal;
}
-void sub_81B8F6C(u8 slot, u8 setVal)
+static void sub_81B8F6C(u8 slot, u8 setVal)
{
bool32 modResult = slot & 1;
-
+
slot /= 2;
if (modResult != 0)
gUnknown_0203CF00[slot] = (gUnknown_0203CF00[slot] & 0xF0) | setVal;
@@ -6801,7 +7071,7 @@ void sub_81B8FB0(u8 slot, u8 slot2)
u8 pokemon_order_func(u8 slot)
{
u8 i, j;
-
+
for (j = i = 0; i < 3; j++, i++)
{
if ((gUnknown_0203CF00[i] >> 4) != slot)
@@ -6818,34 +7088,34 @@ u8 pokemon_order_func(u8 slot)
return 0;
}
-void pokemon_change_order(void)
+static void pokemon_change_order(void)
{
struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty));
u8 i;
-
+
memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty));
for (i = 0; i < PARTY_SIZE; i++)
memcpy(&gPlayerParty[pokemon_order_func(i)], &partyBuffer[i], sizeof(struct Pokemon));
Free(partyBuffer);
}
-void sub_81B9080(void)
+static void sub_81B9080(void)
{
struct Pokemon *partyBuffer = Alloc(sizeof(gPlayerParty));
u8 i;
-
+
memcpy(partyBuffer, gPlayerParty, sizeof(gPlayerParty));
for (i = 0; i < PARTY_SIZE; i++)
memcpy(&gPlayerParty[sub_81B8F38(i)], &partyBuffer[i], sizeof(struct Pokemon));
Free(partyBuffer);
}
-void sub_81B90D0(void)
+static void sub_81B90D0(void)
{
u8 i;
struct Pokemon *mon;
u8 leadVal;
-
+
for (i = 1; i < PARTY_SIZE; i++)
{
mon = &gPlayerParty[sub_81B8F38(i)];
@@ -6859,7 +7129,7 @@ void sub_81B90D0(void)
}
}
-void sub_81B9140(void)
+static void sub_81B9140(void)
{
SetMainCallback2(SetCB2ToReshowScreenAfterMenu);
}
@@ -6869,7 +7139,7 @@ void sub_81B9150(void)
InitPartyMenu(5, 3, 0, 0, 0x7F, sub_81B917C, gMain.savedCallback);
}
-void sub_81B917C(u8 taskId)
+static void sub_81B917C(u8 taskId)
{
gTasks[taskId].data[0] = 256;
sub_81B9294(taskId);
@@ -6877,11 +7147,11 @@ void sub_81B917C(u8 taskId)
gTasks[taskId].func = sub_81B91B4;
}
-void sub_81B91B4(u8 taskId)
+static void sub_81B91B4(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u8 i;
-
+
if (!gPaletteFade.active)
{
data[0] -= 8;
@@ -6899,25 +7169,25 @@ void sub_81B91B4(u8 taskId)
}
}
-void sub_81B9240(u8 taskId)
+static void sub_81B9240(u8 taskId)
{
s16 *data = gTasks[taskId].data;
-
+
if (++data[0] == 0x100)
sub_81B12C0(taskId);
}
-void sub_81B9270(u8 spriteId, s16 x)
+static void sub_81B9270(u8 spriteId, s16 x)
{
if (x >= 0)
gSprites[spriteId].pos2.x = x;
}
-void sub_81B9294(u8 taskId)
+static void sub_81B9294(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u8 i;
-
+
for (i = 3; i < PARTY_SIZE; i++)
{
if (gUnknown_02022FF8[i - 3].species != SPECIES_NONE)
@@ -6936,13 +7206,13 @@ void sub_81B9328(void)
InitPartyMenu(6, 0, 0, 0, 15, sub_81B1370, sub_81B9390);
}
-void sub_81B9354(u8 arg1)
+static void sub_81B9354(u8 arg1)
{
gFieldCallback2 = hm_add_c3_without_phase_2;
InitPartyMenu(arg1, 0, 11, 0, 0, sub_81B1370, CB2_ReturnToField);
}
-void sub_81B9390(void)
+static void sub_81B9390(void)
{
gSpecialVar_0x8004 = GetCursorSelectionMonId();
if (gSpecialVar_0x8004 >= PARTY_SIZE)
@@ -6958,7 +7228,7 @@ bool8 hm_add_c3_without_phase_2(void) // might not be bool
return TRUE;
}
-void task_hm_without_phase_2(u8 taskId)
+static void task_hm_without_phase_2(u8 taskId)
{
if (IsWeatherNotFadingIn())
{
@@ -6975,17 +7245,17 @@ void sub_81B9404(void)
CreateTask(sub_81B9424, 10);
}
-void sub_81B9424(u8 taskId)
+static void sub_81B9424(u8 taskId)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
InitPartyMenu(2, 0, 11, 0, 0, sub_81B1370, sub_81B9470);
DestroyTask(taskId);
}
}
-void sub_81B9470(void)
+static void sub_81B9470(void)
{
gUnknown_02039F24 = GetCursorSelectionMonId();
if (gUnknown_02039F24 >= PARTY_SIZE)
@@ -7002,11 +7272,11 @@ void sub_81B94B0(void)
CreateTask(sub_81B94D0, 10);
}
-void sub_81B94D0(u8 taskId)
+static void sub_81B94D0(u8 taskId)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
InitPartyMenu(3, 0, 11, 0, 0, sub_81B1370, sub_81B9390);
DestroyTask(taskId);
}
@@ -7019,17 +7289,17 @@ void sub_81B951C(void)
CreateTask(sub_81B953C, 10);
}
-void sub_81B953C(u8 taskId)
+static void sub_81B953C(u8 taskId)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
InitPartyMenu(7, 0, 11, 0, 0, sub_81B1370, sub_81B9588);
DestroyTask(taskId);
}
}
-void sub_81B9588(void)
+static void sub_81B9588(void)
{
gSpecialVar_0x8004 = GetCursorSelectionMonId();
if (gSpecialVar_0x8004 >= PARTY_SIZE)
@@ -7043,7 +7313,7 @@ void sub_81B9588(void)
void sub_81B95E0(void)
{
u8 i;
-
+
gSpecialVar_Result = FALSE;
for (i = 0; i < 3; i++)
{
@@ -7062,11 +7332,11 @@ void sub_81B9620(void)
CreateTask(sub_81B9640, 10);
}
-void sub_81B9640(u8 taskId)
+static void sub_81B9640(u8 taskId)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
InitPartyMenu(12, 0, 0, 0, 0, sub_81B1370, sub_81B9390);
DestroyTask(taskId);
}
@@ -7081,7 +7351,7 @@ void sub_81B968C(void)
void sub_81B96D0(void)
{
u8 i;
-
+
gSpecialVar_Result = 0;
for (i = 0; i < MAX_MON_MOVES; i++)
{
@@ -7094,7 +7364,7 @@ void sub_81B9718(void)
{
struct Pokemon *mon = &gPlayerParty[gSpecialVar_0x8004];
u16 move = GetMonData(mon, MON_DATA_MOVE1 + gSpecialVar_0x8005);
-
+
GetMonNickname(mon, gStringVar1);
StringCopy(gStringVar2, gMoveNames[move]);
}
@@ -7102,14 +7372,14 @@ void sub_81B9718(void)
void sub_81B9770(void)
{
u16 i;
-
+
SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], MOVE_NONE, gSpecialVar_0x8005);
RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005);
for (i = gSpecialVar_0x8005; i < MAX_MON_MOVES - 1; i++)
sub_81B97DC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1);
}
-void sub_81B97DC(struct Pokemon *mon, u8 slotTo, u8 slotFrom)
+static void sub_81B97DC(struct Pokemon *mon, u8 slotTo, u8 slotFrom)
{
u16 move1 = GetMonData(mon, MON_DATA_MOVE1 + slotTo);
u16 move0 = GetMonData(mon, MON_DATA_MOVE1 + slotFrom);
@@ -7142,7 +7412,7 @@ void sub_81B9918(void)
{
u16 move;
u32 i, j;
-
+
gSpecialVar_Result = FALSE;
move = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + gSpecialVar_0x8005);
if (move == MOVE_SURF)
@@ -7158,7 +7428,7 @@ void sub_81B9918(void)
}
}
}
- if (sub_80D23A8(move) != TRUE)
+ if (AnyStorageMonWithMove(move) != TRUE)
gSpecialVar_Result = TRUE;
}
}
diff --git a/src/player_pc.c b/src/player_pc.c
index c41dfa380..474cecaf5 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -461,9 +461,9 @@ static void ItemStorageMenuProcessInput(u8 taskId)
s8 r2;
s8 inputOptionId;
- r5 = GetMenuCursorPos();
+ r5 = Menu_GetCursorPos();
inputOptionId = Menu_ProcessInput();
- r2 = GetMenuCursorPos();
+ r2 = Menu_GetCursorPos();
switch(inputOptionId)
{
case -2:
@@ -491,7 +491,7 @@ static void Task_ItemStorage_Deposit(u8 taskId)
{
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
sub_81AAC14();
DestroyTask(taskId);
}
@@ -723,7 +723,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId)
if (!gPaletteFade.active)
{
sub_81D1EC0();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
ReadMail(&(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]), Mailbox_ReturnToFieldFromReadMail, TRUE);
DestroyTask(taskId);
}
@@ -823,7 +823,7 @@ static void Mailbox_DoGiveMailPokeMenu(u8 taskId)
if (!gPaletteFade.active)
{
sub_81D1EC0();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
sub_81B8448();
DestroyTask(taskId);
}
diff --git a/src/pokeball.c b/src/pokeball.c
index aa29b020f..1938d888d 100644
--- a/src/pokeball.c
+++ b/src/pokeball.c
@@ -999,8 +999,8 @@ void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 battlerId, u8 x, u8 y,
{
u8 spriteId;
- LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]);
- LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]);
+ LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]);
+ LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subpriortiy);
gSprites[spriteId].data[0] = monSpriteId;
@@ -1101,8 +1101,8 @@ u8 sub_807671C(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 g, u32
{
u8 spriteId;
- LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[0]);
- LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[0]);
+ LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]);
+ LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subPriority);
gSprites[spriteId].data[0] = a;
gSprites[spriteId].data[1] = g;
@@ -1170,7 +1170,7 @@ static void sub_80768F0(struct Sprite *sprite)
sprite->callback = SpriteCallbackDummy;
}
-static void DestroySpriteAndFreeResources_(struct Sprite *sprite)
+static void Unref_DestroySpriteAndFreeResources(struct Sprite *sprite)
{
DestroySpriteAndFreeResources(sprite);
}
@@ -1245,8 +1245,8 @@ void LoadBallGfx(u8 ballId)
if (GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag) == 0xFFFF)
{
- LoadCompressedObjectPicUsingHeap(&gBallSpriteSheets[ballId]);
- LoadCompressedObjectPaletteUsingHeap(&gBallSpritePalettes[ballId]);
+ LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[ballId]);
+ LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[ballId]);
}
switch (ballId)
{
diff --git a/src/pokeblock.c b/src/pokeblock.c
index 1418588b8..7c07f9655 100644
--- a/src/pokeblock.c
+++ b/src/pokeblock.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "alloc.h"
#include "battle.h"
#include "battle_controllers.h"
#include "battle_message.h"
@@ -6,14 +7,15 @@
#include "bg.h"
#include "decompress.h"
#include "event_data.h"
+#include "field_screen_effect.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "international_string_util.h"
#include "item.h"
+#include "item_menu.h"
#include "lilycove_lady.h"
#include "list_menu.h"
#include "main.h"
-#include "alloc.h"
#include "menu.h"
#include "menu_helpers.h"
#include "overworld.h"
@@ -70,14 +72,9 @@ enum
PKBL_GIVE_TO_LADY
};
-extern u16 gSpecialVar_ItemId;
extern const u16 gUnknown_0860F074[];
-extern void CB2_ReturnToField(void);
-extern bool8 sub_81221EC(void);
-extern void sub_80AF168(void);
-
// this file's functions
static void CB2_InitPokeblockMenu(void);
static bool8 InitPokeblockMenu(void);
@@ -640,11 +637,11 @@ static bool8 LoadPokeblockMenuGfx(void)
sPokeblockMenu->gfxState++;
break;
case 3:
- LoadCompressedObjectPic(&gPokeblockCase_SpriteSheet);
+ LoadCompressedSpriteSheet(&gPokeblockCase_SpriteSheet);
sPokeblockMenu->gfxState++;
break;
case 4:
- LoadCompressedObjectPalette(&gPokeblockCase_SpritePal);
+ LoadCompressedSpritePalette(&gPokeblockCase_SpritePal);
sPokeblockMenu->gfxState++;
break;
case 5:
diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c
index 2271d7adf..b1f182b66 100644
--- a/src/pokeblock_feed.c
+++ b/src/pokeblock_feed.c
@@ -656,25 +656,25 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon)
trainerId = GetMonData(mon, MON_DATA_OT_ID);
palette = GetMonSpritePalStructFromOtIdPersonality(species, trainerId, personality);
- LoadCompressedObjectPalette(palette);
+ LoadCompressedSpritePalette(palette);
SetMultiuseSpriteTemplateToPokemon(palette->tag, 1);
sPokeblockFeed->loadGfxState++;
break;
case 2:
- LoadCompressedObjectPic(&gPokeblockCase_SpriteSheet);
+ LoadCompressedSpriteSheet(&gPokeblockCase_SpriteSheet);
sPokeblockFeed->loadGfxState++;
break;
case 3:
- LoadCompressedObjectPalette(&gPokeblockCase_SpritePal);
+ LoadCompressedSpritePalette(&gPokeblockCase_SpritePal);
sPokeblockFeed->loadGfxState++;
break;
case 4:
- LoadCompressedObjectPic(&sPokeblock_SpriteSheet);
+ LoadCompressedSpriteSheet(&sPokeblock_SpriteSheet);
sPokeblockFeed->loadGfxState++;
break;
case 5:
SetPokeblockSpritePal(gSpecialVar_ItemId);
- LoadCompressedObjectPalette(&sPokeblockSpritePal);
+ LoadCompressedSpritePalette(&sPokeblockSpritePal);
sPokeblockFeed->loadGfxState++;
break;
case 6:
diff --git a/src/pokedex.c b/src/pokedex.c
index ef8905bb6..755a46821 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -1803,7 +1803,7 @@ bool8 sub_80BC514(u8 a)
ResetSpriteData();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 8;
- LoadCompressedObjectPic(&sInterfaceSpriteSheet[0]);
+ LoadCompressedSpriteSheet(&sInterfaceSpriteSheet[0]);
LoadSpritePalettes(sInterfaceSpritePalette);
CreateInterfaceSprites(a);
gMain.state++;
@@ -4815,7 +4815,7 @@ void sub_80C12E0(u8 taskId)
}
break;
case 1:
- LoadCompressedObjectPic(sInterfaceSpriteSheet);
+ LoadCompressedSpriteSheet(sInterfaceSpriteSheet);
LoadSpritePalettes(sInterfaceSpritePalette);
sub_80C2594(taskId);
for (i = 0; i < 16; i++)
diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c
index 30a127c71..a268b5382 100755
--- a/src/pokedex_area_screen.c
+++ b/src/pokedex_area_screen.c
@@ -533,7 +533,7 @@ static void Task_PokedexAreaScreen_0(u8 taskId)
HideBg(0);
break;
case 1:
- SetBgAttribute(3, BG_CTRL_ATTR_VISIBLE, 3);
+ SetBgAttribute(3, BG_ATTR_CHARBASEINDEX, 3);
sub_81C4D70(&sUnknown_085B4018);
StringFill(sPokedexAreaScreen->charBuffer, CHAR_SPACE, 16);
break;
@@ -628,8 +628,8 @@ static void Task_PokedexAreaScreen_1(u8 taskId)
static void sub_813D6B4(void)
{
- SetBgAttribute(3, BG_CTRL_ATTR_VISIBLE, 0);
- SetBgAttribute(3, BG_CTRL_ATTR_SCREENSIZE, 0);
+ SetBgAttribute(3, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(3, BG_ATTR_PALETTEMODE, 0);
}
static void CreateAreaMarkerSprites(void)
diff --git a/src/pokemon.c b/src/pokemon.c
index 640d70776..580216b2c 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "alloc.h"
#include "apprentice.h"
#include "battle.h"
#include "battle_controllers.h"
@@ -12,12 +13,14 @@
#include "item.h"
#include "link.h"
#include "main.h"
-#include "alloc.h"
+#include "overworld.h"
#include "m4a.h"
+#include "party_menu.h"
#include "pokedex.h"
#include "pokeblock.h"
#include "pokemon.h"
#include "pokemon_animation.h"
+#include "pokemon_summary_screen.h"
#include "pokemon_storage_system.h"
#include "pokenav.h"
#include "random.h"
@@ -45,8 +48,6 @@ struct SpeciesItem
u16 item;
};
-extern const struct OamData gUnknown_0831ACB0;
-extern const struct OamData gUnknown_0831ACA8;
extern const struct SpriteFrameImage gUnknown_082FF3A8[];
extern const struct SpriteFrameImage gUnknown_082FF3C8[];
extern const struct SpriteFrameImage gUnknown_082FF3E8[];
@@ -70,15 +71,10 @@ extern const struct CompressedSpritePalette gMonPaletteTable[];
extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
extern const u8 gTrainerClassNames[][13];
-extern u8 pokemon_order_func(u8);
extern u16 get_unknown_box_id(void);
-extern u8 StorageGetCurrentBox(void);
extern void set_unknown_box_id(u8);
-extern void sub_803FA70(u8 battlerId);
-extern u8 sav1_map_get_name(void);
extern bool8 sub_806F104(void);
extern u8 sub_81D63C8(u16 trainerOpponentId);
-extern void SummaryScreen_SetUnknownTaskId(u8);
// this file's functions
static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon);
@@ -935,7 +931,7 @@ const u16 gSpeciesToNationalPokedexNum[] = // Assigns all species to the Nationa
SPECIES_TO_NATIONAL(CHIMECHO),
};
-const u16 gHoennToNationalOrder[] = // Assigns Hoenn Dex Pokmon (Using National Dex Index)
+const u16 gHoennToNationalOrder[] = // Assigns Hoenn Dex Pokémon (Using National Dex Index)
{
HOENN_TO_NATIONAL(TREECKO),
HOENN_TO_NATIONAL(GROVYLE),
@@ -1139,7 +1135,7 @@ const u16 gHoennToNationalOrder[] = // Assigns Hoenn Dex Pokmon (Using National
HOENN_TO_NATIONAL(RAYQUAZA),
HOENN_TO_NATIONAL(JIRACHI),
HOENN_TO_NATIONAL(DEOXYS),
- HOENN_TO_NATIONAL(BULBASAUR), // Pokmon from here onwards are UNSEEN in the HoennDex.
+ HOENN_TO_NATIONAL(BULBASAUR), // Pokémon from here onwards are UNSEEN in the HoennDex.
HOENN_TO_NATIONAL(IVYSAUR),
HOENN_TO_NATIONAL(VENUSAUR),
HOENN_TO_NATIONAL(CHARMANDER),
@@ -2298,7 +2294,7 @@ const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] =
{ // B_POSITION_PLAYER_LEFT
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF3A8,
.affineAnims = gUnknown_082FF618,
@@ -2307,16 +2303,16 @@ const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] =
{ // B_POSITION_OPPONENT_LEFT
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACA8,
+ .oam = &gOamData_831ACA8,
.anims = NULL,
.images = gUnknown_082FF3C8,
.affineAnims = gUnknown_082FF694,
- .callback = oac_poke_opponent,
+ .callback = SpriteCb_WildMon,
},
{ // B_POSITION_PLAYER_RIGHT
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF3E8,
.affineAnims = gUnknown_082FF618,
@@ -2325,11 +2321,11 @@ const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] =
{ // B_POSITION_OPPONENT_RIGHT
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACA8,
+ .oam = &gOamData_831ACA8,
.anims = NULL,
.images = gUnknown_082FF408,
.affineAnims = gUnknown_082FF694,
- .callback = oac_poke_opponent
+ .callback = SpriteCb_WildMon
},
};
@@ -2338,7 +2334,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF428,
.affineAnims = gUnknown_082FF618,
@@ -2347,7 +2343,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF448,
.affineAnims = gUnknown_082FF618,
@@ -2356,7 +2352,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF468,
.affineAnims = gUnknown_082FF618,
@@ -2365,7 +2361,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF490,
.affineAnims = gUnknown_082FF618,
@@ -2374,7 +2370,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF4B8,
.affineAnims = gUnknown_082FF618,
@@ -2383,7 +2379,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF4D8,
.affineAnims = gUnknown_082FF618,
@@ -2392,7 +2388,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF4F8,
.affineAnims = gUnknown_082FF618,
@@ -2401,7 +2397,7 @@ static const struct SpriteTemplate gUnknown_08329DF8[] =
{
.tileTag = 0xFFFF,
.paletteTag = 0,
- .oam = &gUnknown_0831ACB0,
+ .oam = &gOamData_831ACB0,
.anims = NULL,
.images = gUnknown_082FF518,
.affineAnims = gUnknown_082FF618,
@@ -2592,7 +2588,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
SetBoxMonData(boxMon, MON_DATA_SPECIES, &species);
SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gBaseStats[species].growthRate][level]);
SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship);
- value = sav1_map_get_name();
+ value = GetCurrentRegionMapSectionId();
SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value);
SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level);
SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion);
@@ -2758,7 +2754,7 @@ void sub_806819C(struct Pokemon *mon, struct BattleTowerPokemon *src)
CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(mon, src->moves[i], i);
SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses);
@@ -2820,7 +2816,7 @@ void sub_8068338(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl5
CreateMon(mon, src->species, level, 0, 1, src->personality, 1, src->otId);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(mon, src->moves[i], i);
SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses);
@@ -2884,7 +2880,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m
otId);
SetMonData(mon, MON_DATA_HELD_ITEM, &src->party[monId].item);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(mon, src->party[monId].moves[i], i);
evAmount = MAX_TOTAL_EVS / NUM_STATS;
@@ -2944,7 +2940,7 @@ void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *dest)
dest->heldItem = heldItem;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL);
dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL);
@@ -3270,7 +3266,7 @@ u16 GiveMoveToMon(struct Pokemon *mon, u16 move)
u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL);
if (!existingMove)
@@ -3289,7 +3285,7 @@ u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (!mon->moves[i])
{
@@ -3392,7 +3388,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move)
moves[3] = move;
pp[3] = gBattleMoves[move].pp;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]);
SetMonData(mon, MON_DATA_PP1 + i, &pp[i]);
@@ -3419,7 +3415,7 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
moves[3] = move;
pp[3] = gBattleMoves[move].pp;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]);
SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]);
@@ -4091,13 +4087,13 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
case MON_DATA_LANGUAGE:
retVal = boxMon->language;
break;
- case MON_DATA_SANITY_BIT1:
+ case MON_DATA_SANITY_IS_BAD_EGG:
retVal = boxMon->isBadEgg;
break;
- case MON_DATA_SANITY_BIT2:
+ case MON_DATA_SANITY_HAS_SPECIES:
retVal = boxMon->hasSpecies;
break;
- case MON_DATA_SANITY_BIT3:
+ case MON_DATA_SANITY_IS_EGG:
retVal = boxMon->isEgg;
break;
case MON_DATA_OT_NAME:
@@ -4298,7 +4294,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
u16 *moves = (u16 *)data;
s32 i = 0;
- while (moves[i] != 355)
+ while (moves[i] != MOVES_COUNT)
{
u16 move = moves[i];
if (substruct1->moves[0] == move
@@ -4460,13 +4456,13 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg)
case MON_DATA_LANGUAGE:
SET8(boxMon->language);
break;
- case MON_DATA_SANITY_BIT1:
+ case MON_DATA_SANITY_IS_BAD_EGG:
SET8(boxMon->isBadEgg);
break;
- case MON_DATA_SANITY_BIT2:
+ case MON_DATA_SANITY_HAS_SPECIES:
SET8(boxMon->hasSpecies);
break;
- case MON_DATA_SANITY_BIT3:
+ case MON_DATA_SANITY_IS_EGG:
SET8(boxMon->isEgg);
break;
case MON_DATA_OT_NAME:
@@ -4722,7 +4718,7 @@ u8 SendMonToPC(struct Pokemon* mon)
do
{
- for (boxPos = 0; boxPos < 30; boxPos++)
+ for (boxPos = 0; boxPos < IN_BOX_COUNT; boxPos++)
{
struct BoxPokemon* checkingMon = GetBoxedMonPtr(boxNo, boxPos);
if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE)
@@ -4739,7 +4735,7 @@ u8 SendMonToPC(struct Pokemon* mon)
}
boxNo++;
- if (boxNo == 14)
+ if (boxNo == TOTAL_BOXES_COUNT)
boxNo = 0;
} while (boxNo != StorageGetCurrentBox());
@@ -4853,7 +4849,7 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
for (j = 0; j < 6; j++)
SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * 4 + j]);
SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * 4 + j]].pp);
@@ -4889,9 +4885,9 @@ bool8 IsPokemonStorageFull(void)
{
s32 i, j;
- for (i = 0; i < 14; i++)
- for (j = 0; j < 30; j++)
- if (GetBoxMonDataFromAnyBox(i, j, MON_DATA_SPECIES) == SPECIES_NONE)
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ if (GetBoxMonDataAt(i, j, MON_DATA_SPECIES) == SPECIES_NONE)
return FALSE;
return TRUE;
@@ -4942,7 +4938,7 @@ void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex)
gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);
gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
gBattleMons[battlerId].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL);
gBattleMons[battlerId].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL);
@@ -5461,7 +5457,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
{
if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11)
friendship++;
- if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId())
friendship++;
}
if (friendship < 0)
@@ -5487,7 +5483,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
{
if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11)
friendship++;
- if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId())
friendship++;
}
if (friendship < 0)
@@ -5512,7 +5508,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov
{
if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == 11)
friendship++;
- if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == sav1_map_get_name())
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId())
friendship++;
}
if (friendship < 0)
@@ -6160,7 +6156,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event)
{
if (GetMonData(mon, MON_DATA_POKEBALL, 0) == ITEM_LUXURY_BALL)
friendship++;
- if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == sav1_map_get_name())
+ if (GetMonData(mon, MON_DATA_MET_LOCATION, 0) == GetCurrentRegionMapSectionId())
friendship++;
}
if (friendship < 0)
@@ -6484,7 +6480,7 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves)
u8 level = GetMonData(mon, MON_DATA_LEVEL, 0);
int i, j, k;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0);
for (i = 0; i < 20; i++)
@@ -6498,10 +6494,10 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves)
if (moveLevel <= (level << 9))
{
- for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
+ for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
;
- if (j == 4)
+ if (j == MAX_MON_MOVES)
{
for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++)
;
@@ -6538,7 +6534,7 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon)
if (species == SPECIES_EGG)
return 0;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0);
for (i = 0; i < 20; i++)
@@ -6552,10 +6548,10 @@ u8 GetNumberOfRelearnableMoves(struct Pokemon *mon)
if (moveLevel <= (level << 9))
{
- for (j = 0; j < 4 && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
+ for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != (gLevelUpLearnsets[species][i] & 0x1FF); j++)
;
- if (j == 4)
+ if (j == MAX_MON_MOVES)
{
for (k = 0; k < numMoves && moves[k] != (gLevelUpLearnsets[species][i] & 0x1FF); k++)
;
@@ -6705,7 +6701,7 @@ const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32
{
u32 shinyValue;
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
return gMonPaletteTable[0].data;
shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
@@ -6799,7 +6795,7 @@ void BoxMonRestorePP(struct BoxPokemon *boxMon)
{
int i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0))
{
@@ -6847,7 +6843,7 @@ void SetWildMonHeldItem(void)
u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);
u16 var1 = 45;
u16 var2 = 95;
- if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3, 0)
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG, 0)
&& GetMonAbility(&gPlayerParty[0]) == ABILITY_COMPOUND_EYES)
{
var1 = 20;
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
index 8c468d9f4..52fa6db51 100644
--- a/src/pokemon_animation.c
+++ b/src/pokemon_animation.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "pokemon.h"
#include "pokemon_animation.h"
#include "sprite.h"
@@ -18,8 +19,6 @@ struct UnkAnimStruct
s16 field_8;
};
-extern u16 gBattlerPartyIndexes[];
-
// this file's functions
static void pokemonanimfunc_00(struct Sprite *sprite);
static void pokemonanimfunc_01(struct Sprite *sprite);
diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c
index c24c8a898..bcbb60e21 100644
--- a/src/pokemon_icon.c
+++ b/src/pokemon_icon.c
@@ -1045,7 +1045,7 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u
.paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species],
};
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG;
spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority);
@@ -1076,7 +1076,7 @@ u8 sub_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8
return spriteId;
}
-u16 mon_icon_convert_unown_species_id(u16 species, u32 personality)
+u16 GetIconSpecies(u16 species, u32 personality)
{
u16 result;
@@ -1091,7 +1091,7 @@ u16 mon_icon_convert_unown_species_id(u16 species, u32 personality)
}
else
{
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
result = 260;
else
result = species;
@@ -1104,7 +1104,8 @@ u16 GetUnownLetterByPersonality(u32 personality)
{
if (!personality)
return 0;
- return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;
+ else
+ return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;
}
u16 sub_80D2E84(u16 species)
@@ -1121,19 +1122,17 @@ u16 sub_80D2E84(u16 species)
}
else
{
- if(species > (SPECIES_UNOWN_B - 1))
- species = 260;
- return mon_icon_convert_unown_species_id(species, 0);
+ if (species > (SPECIES_UNOWN_B - 1))
+ species = SPECIES_OLD_UNOWN_J; // That's an oddly specific species.
+ return GetIconSpecies(species, 0);
}
}
const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra)
{
- return GetMonIconTiles(mon_icon_convert_unown_species_id(species, personality), extra);
+ return GetMonIconTiles(GetIconSpecies(species, personality), extra);
}
-
-
void sub_80D2EF8(struct Sprite *sprite)
{
sub_80D328C(sprite);
@@ -1150,7 +1149,7 @@ void LoadMonIconPalettes(void)
void SafeLoadMonIconPalette(u16 species)
{
u8 palIndex;
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
species = 260;
palIndex = gMonIconPaletteIndices[species];
if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF)
@@ -1175,7 +1174,7 @@ void FreeMonIconPalettes(void)
void SafeFreeMonIconPalette(u16 species)
{
u8 palIndex;
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
species = 260;
palIndex = gMonIconPaletteIndices[species];
FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag);
@@ -1208,7 +1207,7 @@ void sub_80D304C(u16 offset)
s32 i;
const struct SpritePalette* monIconPalettePtr;
- if(offset <= 0xA0)
+ if (offset <= 0xA0)
{
monIconPalettePtr = gMonIconPaletteTable;
for(i = 5; i >= 0; i--)
@@ -1220,9 +1219,9 @@ void sub_80D304C(u16 offset)
}
}
-u8 sub_80D3080(u16 species)
+u8 GetValidMonIconPalIndex(u16 species)
{
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
species = 260;
return gMonIconPaletteIndices[species];
}
@@ -1234,7 +1233,7 @@ u8 sub_80D30A0(u16 species)
const u16* GetValidMonIconPalettePtr(u16 species)
{
- if (species > SPECIES_EGG)
+ if (species > NUM_SPECIES)
species = 260;
return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data;
}
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index 2d9a2f08f..b0e14d2b1 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -210,7 +210,7 @@ void GiveGiftRibbonToParty(u8 index, u8 ribbonId)
{
struct Pokemon *mon = &gPlayerParty[i];
- if (GetMonData(mon, MON_DATA_SPECIES) != 0 && GetMonData(mon, MON_DATA_SANITY_BIT3) == 0)
+ if (GetMonData(mon, MON_DATA_SPECIES) != 0 && GetMonData(mon, MON_DATA_SANITY_IS_EGG) == 0)
{
SetMonData(mon, array[index], &data);
gotRibbon = TRUE;
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index ad56b1678..36ed78a54 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -1,55 +1,725 @@
#include "global.h"
+#include "alloc.h"
#include "bg.h"
+#include "data2.h"
+#include "decompress.h"
+#include "dma3.h"
+#include "dynamic_placeholder_text_util.h"
#include "event_data.h"
#include "field_screen_effect.h"
#include "field_weather.h"
+#include "fldeff_misc.h"
#include "gpu_regs.h"
+#include "graphics.h"
#include "international_string_util.h"
+#include "item.h"
+#include "item_icon.h"
+#include "item_menu.h"
+#include "mail.h"
#include "main.h"
#include "menu.h"
+#include "mon_markings.h"
+#include "naming_screen.h"
#include "overworld.h"
#include "palette.h"
+#include "pc_screen_effect.h"
#include "pokemon.h"
+#include "pokemon_icon.h"
+#include "pokemon_summary_screen.h"
#include "pokemon_storage_system.h"
#include "script.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
+#include "text_window.h"
+#include "trig.h"
#include "walda_phrase.h"
#include "window.h"
+#include "constants/maps.h"
+#include "constants/moves.h"
+#include "constants/rgb.h"
#include "constants/songs.h"
#include "constants/species.h"
-IWRAM_DATA u8 gUnknown_03000F78[0x188];
+struct WallpaperTable
+{
+ const u32 *tiles;
+ const u32 *tileMap;
+ const u16 *palettes;
+};
+
+struct PokemonStorageSystemFunc
+{
+ u8 (*func)(void);
+ s8 unk4;
+};
+
+struct StorageAction
+{
+ const u8 *text;
+ u8 format;
+};
+
+struct StorageMenu
+{
+ const u8 *text;
+ int textId;
+};
+
+struct PSS_MenuStringPtrs
+{
+ const u8 *text;
+ const u8 *desc;
+};
+
+struct UnkStruct_2000028
+{
+ const u8 *unk_00;
+ u8 *unk_04;
+ u16 unk_08;
+ u16 unk_0a;
+ u16 newField;
+ void (*unk_0c)(struct UnkStruct_2000028 *data);
+};
+
+struct UnkStruct_2000020
+{
+ struct UnkStruct_2000028 *unk_00;
+ u8 unk_04;
+ u8 unk_05;
+};
+
+struct UnkPSSStruct_2002370
+{
+ struct Sprite *unk_0000;
+ struct Sprite *unk_0004[4];
+ u32 unk_0014[3];
+ struct Sprite *unk_0020[2];
+ u8 filler_0028[0x214];
+ u32 unk_023c;
+ u16 unk_0240;
+ u16 unk_0242;
+ u8 curBox;
+ u8 unk_0245;
+ u8 unk_0246;
+};
-extern const u8 gText_PartyFull[];
-extern const u8 gText_Box[];
-extern const u8 gText_JustOnePkmn[];
+struct UnkStorageStruct
+{
+ struct Sprite *sprite;
+ u8 *tiles;
+ u16 palIndex;
+ u8 unk8;
+ u8 unk9;
+ u8 unk10;
+};
+
+struct PokemonStorageSystemData
+{
+ u8 state;
+ u8 boxOption;
+ u8 screenChangeType;
+ bool8 isReshowingPSS;
+ u8 taskId;
+ struct UnkStruct_2000020 unk_0020;
+ struct UnkStruct_2000028 unk_0028[8];
+ u16 field_B0[528 / 2];
+ u16 field_2C0;
+ u16 field_2C2;
+ u8 field_2C4;
+ u8 field_2C5;
+ u8 showPartyMenuState;
+ u8 unk_02C7;
+ u8 unk_02C8;
+ bool8 unk_02C9;
+ s16 newCurrBoxId;
+ u16 bg2_X;
+ s16 field_2CE;
+ u16 field_2D0;
+ u8 field_2D2;
+ u8 field_2D3;
+ u8 field_2D4;
+ u16 field_2D6;
+ s16 field_2D8;
+ u16 field_2DA;
+ u16 field_2DC;
+ u16 field_2DE;
+ u16 field_2E0;
+ u8 filler[22];
+ u8 field_2F8[1024];
+ u8 field_6F8;
+ u8 field_6F9;
+ u8 field_6FA;
+ s8 field_6FB;
+ u16 field_6FC[16];
+ u16 field_71C;
+ u16 field_71E;
+ struct Sprite *field_720[2];
+ struct Sprite *field_728[2];
+ struct Sprite *field_730[2];
+ u32 field_738;
+ u8 field_73C[80];
+ u16 field_78C;
+ s16 wallpaperSetId;
+ s16 wallpaperId;
+ u16 field_792[360];
+ u8 wallpaperChangeState;
+ u8 field_A63;
+ u8 field_A64;
+ s8 field_A65;
+ u8 *wallpaperTiles;
+ struct Sprite *movingMonSprite;
+ struct Sprite *partySprites[PARTY_SIZE];
+ struct Sprite *boxMonsSprites[IN_BOX_COUNT];
+ struct Sprite **field_B00;
+ struct Sprite **field_B04;
+ u16 field_B08[40];
+ u16 field_B58[40];
+ u16 boxSpecies[IN_BOX_COUNT];
+ u32 boxPersonalities[IN_BOX_COUNT];
+ u8 field_C5C;
+ u8 field_C5D;
+ u8 field_C5E;
+ u16 field_C60;
+ s16 field_C62;
+ s16 field_C64;
+ u16 field_C66;
+ u8 field_C68;
+ s8 field_C69;
+ u8 field_C6A;
+ u8 field_C6B;
+ struct WindowTemplate menuWindow;
+ struct StorageMenu menuItems[7];
+ u8 menuItemsCount;
+ u8 menuWidth;
+ u8 field_CAE;
+ u16 field_CB0;
+ struct Sprite *field_CB4;
+ struct Sprite *field_CB8;
+ s32 field_CBC;
+ s32 field_CC0;
+ u32 field_CC4;
+ u32 field_CC8;
+ s16 field_CCC;
+ s16 field_CCE;
+ u16 field_CD0;
+ s8 field_CD2;
+ s8 field_CD3;
+ u8 field_CD4;
+ u8 field_CD5;
+ u8 field_CD6;
+ u8 field_CD7;
+ u8 field_CD8[2];
+ const u32 *cursorMonPalette;
+ u32 cursorMonPersonality;
+ u16 cursorMonSpecies;
+ u16 cursorMonItem;
+ u16 field_CE8;
+ bool8 setMosaic;
+ u8 cursorMonMarkings;
+ u8 cursorMonLevel;
+ bool8 cursorMonIsEgg;
+ u8 cursorMonNick[POKEMON_NAME_LENGTH + 1];
+ u8 cursorMonNickText[36];
+ u8 cursorMonSpeciesName[36];
+ u8 cursorMonGenderLvlText[36];
+ u8 cursorMonItemName[36];
+ bool8 (*monPlaceChangeFunc)(void);
+ u8 monPlaceChangeState;
+ u8 field_D91;
+ struct Sprite *field_D94;
+ struct Sprite *field_D98[2];
+ u16 *field_DA0;
+ struct PokemonMarkMenu field_DA4;
+ struct UnkPSSStruct_2002370 field_1E5C;
+ struct Pokemon movingMon;
+ struct Pokemon field_2108;
+ s8 field_216C;
+ u8 field_216D;
+ s8 field_216E;
+ s8 field_216F;
+ s8 field_2170;
+ s8 field_2171;
+ u16 field_2172;
+ u16 field_2174;
+ u16 field_2176[8];
+ u8 field_2186;
+ u8 field_2187;
+ u8 field_2188;
+ union
+ {
+ struct Pokemon *mon;
+ struct BoxPokemon *box;
+ } field_218C;
+ u8 field_2190[40];
+ u8 field_21B8[40];
+ u8 field_21E0[POKEMON_NAME_LENGTH + 1];
+ u8 itemName[20];
+ u8 inBoxMovingMode;
+ u16 field_2200;
+ struct UnkStorageStruct field_2204[3];
+ u16 movingItem;
+ u16 field_2236;
+ u8 field_2238;
+ u16 field_223A;
+ u16 *field_223C;
+ struct Sprite *cursorMonSprite;
+ u16 field_2244[0x40];
+ u8 field_22C4[0x800];
+ u8 field_2AC4[0x1800];
+ u8 field_42C4[0x800];
+ u8 field_4AC4[0x1000];
+ u8 field_5AC4[0x800];
+};
-extern u8 gUnknown_02039D00;
+struct UnkSubStruct_2039D84
+{
+ s16 field_0;
+ s16 field_2;
+ u16 field_4;
+ u16 field_6;
+ s16 field_8;
+ s16 field_A;
+};
+
+struct UnkStruct_2039D84
+{
+ struct UnkSubStruct_2039D84 field_0[2];
+ const void *field_18;
+ const void *field_1C;
+ u16 field_20;
+ u16 field_22;
+ u16 field_24;
+ u16 field_26;
+ u16 field_28;
+ u8 field_2A;
+ u8 field_2B;
+ u8 field_2C;
+ u8 field_2D;
+};
+
+enum
+{
+ BOX_OPTION_WITHDRAW,
+ BOX_OPTION_DEPOSIT,
+ BOX_OPTION_MOVE_MONS,
+ BOX_OPTION_MOVE_ITEMS,
+ BOX_OPTION_EXIT,
+};
+
+enum
+{
+ PC_TEXT_EXIT_BOX,
+ PC_TEXT_WHAT_YOU_DO,
+ PC_TEXT_PICK_A_THEME,
+ PC_TEXT_PICK_A_WALLPAPER,
+ PC_TEXT_IS_SELECTED,
+ PC_TEXT_JUMP_TO_WHICH_BOX,
+ PC_TEXT_DEPOSIT_IN_WHICH_BOX,
+ PC_TEXT_WAS_DEPOSITED,
+ PC_TEXT_BOX_IS_FULL,
+ PC_TEXT_RELEASE_POKE,
+ PC_TEXT_WAS_RELEASED,
+ PC_TEXT_BYE_BYE,
+ PC_TEXT_MARK_POKE,
+ PC_TEXT_LAST_POKE,
+ PC_TEXT_PARTY_FULL,
+ PC_TEXT_HOLDING_POKE,
+ PC_TEXT_WHICH_ONE_WILL_TAKE,
+ PC_TEXT_CANT_RELEASE_EGG,
+ PC_TEXT_CONTINUE_BOX,
+ PC_TEXT_CAME_BACK,
+ PC_TEXT_WORRIED,
+ PC_TEXT_SURPRISE,
+ PC_TEXT_PLEASE_REMOVE_MAIL,
+ PC_TEXT_IS_SELECTED2,
+ PC_TEXT_GIVE_TO_MON,
+ PC_TEXT_PLACED_IN_BAG,
+ PC_TEXT_BAG_FULL,
+ PC_TEXT_PUT_IN_BAG,
+ PC_TEXT_ITEM_IS_HELD,
+ PC_TEXT_CHANGED_TO_ITEM,
+ PC_TEXT_CANT_STORE_MAIL,
+};
+
+enum
+{
+ PC_TEXT_FMT_NORMAL,
+ PC_TEXT_FMT_MON_NAME_1,
+ PC_TEXT_FMT_MON_NAME_2,
+ PC_TEXT_FMT_MON_NAME_3,
+ PC_TEXT_FMT_MON_NAME_4,
+ PC_TEXT_FMT_MON_NAME_5,
+ PC_TEXT_FMT_MON_NAME_6,
+ PC_TEXT_FMT_ITEM_NAME,
+};
+
+enum
+{
+ SCREEN_CHANGE_EXIT_BOX,
+ SCREEN_CHANGE_SUMMARY_SCREEN,
+ SCREEN_CHANGE_NAME_BOX,
+ SCREEN_CHANGE_ITEM_FROM_BAG,
+};
+
+enum
+{
+ MODE_PARTY,
+ MODE_BOX,
+ MODE_2,
+};
+
+enum
+{
+ WALLPAPER_FOREST,
+ WALLPAPER_CITY,
+ WALLPAPER_DESERT,
+ WALLPAPER_SAVANNA,
+ WALLPAPER_CRAG,
+ WALLPAPER_VOLCANO,
+ WALLPAPER_SNOW,
+ WALLPAPER_CAVE,
+ WALLPAPER_BEACH,
+ WALLPAPER_SEAFLOOR,
+ WALLPAPER_RIVER,
+ WALLPAPER_SKY,
+ WALLPAPER_POLKADOT,
+ WALLPAPER_POKECENTER,
+ WALLPAPER_MACHINE,
+ WALLPAPER_PLAIN,
+ WALLPAPER_FRIENDS, // The one received as a gift from Walda's parents.
+ WALLPAPER_COUNT
+};
+
+enum
+{
+ FRIENDS_ZIGZAGOON,
+ FRIENDS_SCREEN,
+ FRIENDS_HORIZONTAL,
+ FRIENDS_DIAGONAL,
+ FRIENDS_BLOCK,
+ FRIENDS_RIBBON,
+ FRIENDS_POKECENTER2,
+ FRIENDS_FRAME,
+ FRIENDS_BLANK,
+ FRIENDS_CIRCLES,
+ FRIENDS_AZUMARILL,
+ FRIENDS_PIKACHU,
+ FRIENDS_LEGENDARY,
+ FRIENDS_DUSCLOPS,
+ FRIENDS_LUDICOLO,
+ FRIENDS_WHISCASH,
+ FRIENDS_WALLPAPERS_COUNT
+};
+
+enum
+{
+ CURSOR_AREA_IN_BOX,
+ CURSOR_AREA_IN_PARTY,
+ CURSOR_AREA_BOX,
+ CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box
+};
+
+#define TAG_PAL_WAVEFORM 0xDACA
+#define TAG_PAL_DAC8 0xDAC8
+#define TAG_PAL_DAC6 0xDAC6
+#define TAG_PAL_DACE 0xDACE
+#define TAG_PAL_DAC7 0xDAC7
+#define TAG_PAL_DAC9 0xDAC9
+#define TAG_PAL_DAC0 0xDAC0
+#define TAG_PAL_DACB 0xDACB
+
+#define TAG_TILE_WAVEFORM 0x5
+#define TAG_TILE_10 0x10
+#define TAG_TILE_2 0x2
+#define TAG_TILE_D 0xD
+#define TAG_TILE_A 0xA
+#define TAG_TILE_3 0x3
+#define TAG_TILE_4 0x4
+#define TAG_TILE_12 0x12
+#define TAG_TILE_7 0x7
+#define TAG_TILE_0 0x0
+#define TAG_TILE_1 0x1
+
+// IWRAM bss
+IWRAM_DATA static u32 gUnknown_03000F78[98];
+
+// EWRAM DATA
+EWRAM_DATA static u8 sPreviousBoxOption = 0;
+EWRAM_DATA static struct UnkPSSStruct_2002370 *gUnknown_02039D04 = NULL;
+EWRAM_DATA static struct PokemonStorageSystemData *sPSSData = NULL;
+EWRAM_DATA static bool8 sInPartyMenu = 0;
+EWRAM_DATA static u8 sCurrentBoxOption = 0;
+EWRAM_DATA static u8 gUnknown_02039D0E = 0;
+EWRAM_DATA static u8 sWhichToReshow = 0;
+EWRAM_DATA static u8 gUnknown_02039D10 = 0;
+EWRAM_DATA static u16 gUnknown_02039D12 = 0;
+EWRAM_DATA static struct Pokemon gUnknown_02039D14 = {0};
+EWRAM_DATA static s8 sBoxCursorArea = 0;
+EWRAM_DATA static s8 sBoxCursorPosition = 0;
+EWRAM_DATA static bool8 sIsMonBeingMoved = 0;
+EWRAM_DATA static u8 sMovingMonOrigBoxId = 0;
+EWRAM_DATA static u8 sMovingMonOrigBoxPos = 0;
+EWRAM_DATA static bool8 sCanOnlyMove = 0;
+
+extern void sub_80C6D80(u8 *arg0, void *arg1, u8 arg2, u8 arg3, s32 arg4);
+
+extern const struct CompressedSpriteSheet gMonFrontPicTable[];
// This file's functions.
-void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr);
-void sub_80C7D74(u8);
-u8 sub_80CAEA0(void);
-void SetBoxWallpaper(u8 boxId, u8 wallpaperId);
-void SetCurrentBox(u8 boxId);
-void ClearMonInBox(u8 boxId, u8 boxPos);
-void ResetWaldaWallpaper(void);
-void sub_80C7958(u8 curBox);
-void sub_80C7B14(void);
-void sub_80C7BB4(void);
-void sub_80CA028(void);
-void sub_80C7B80(void);
-void sub_80D2AA4(void);
-void sub_80C7BE4(void);
-void sub_80CAA14(void);
-void sub_80C7CF4(struct Sprite *sprite);
-struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority);
-
-// const rom data
-const struct PSS_MenuStringPtrs gUnknown_085716C0[] =
+static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr);
+static void Cb2_EnterPSS(u8 boxOption);
+static u8 GetCurrentBoxOption(void);
+static u8 HandleInput(void);
+static u8 sub_80CDC2C(void);
+static u8 sub_80CB9BC(void);
+static void LoadWallpaperGfx(u8 boxId, s8 direction);
+static void sub_80CCCFC(u8 boxId, s8 direction);
+static void sub_80CD0B8(s8 direction);
+static void SetCurrentBox(u8 boxId);
+static void sub_80CC32C(u8 boxId);
+static void sub_80C7958(u8 curBox);
+static void sub_80CCAE0(void *arg0);
+static void sub_80C7B14(void);
+static void sub_80C7BB4(void);
+static void ScrollBackground(void);
+static void sub_80C7B80(void);
+static void sub_80C7BE4(void);
+static void sub_80CAA14(void);
+static void sub_80CFDC4(void);
+static void sub_80CE790(void);
+static void sub_80CE8E4(void);
+static void GiveChosenBagItem(void);
+static void SetUpHidePartyMenu(void);
+static void DestroyAllPartyMonIcons(void);
+static void sub_80D11CC(void);
+static void LoadPSSMenuGfx(void);
+static void LoadWaveformSpritePalette(void);
+static void sub_80CDC18(void);
+static void sub_80CD36C(void);
+static void sub_80CD3EC(void);
+static void sub_80CAC1C(void);
+static void sub_80CEBDC(void);
+static void SetScrollingBackground(void);
+static void sub_80CABE0(void);
+static void sub_80CAEAC(void);
+static void sub_80D0C60(void);
+static void sub_80CFEA8(void);
+static void sub_80CDC0C(void);
+static void sub_80CAF04(void);
+static void sub_80CA0D8(void);
+static void AddMenu(void);
+static void sub_80CE250(void);
+static void InitCanRelaseMonVars(void);
+static void sub_80D01B8(void);
+static void ReleaseMon(void);
+static void RefreshCursorMonData(void);
+static void LoadCursorMonSprite(void);
+static void sub_80CA154(void);
+static void sub_80CA1C4(void);
+static void sub_80CC064(void);
+static void sub_80CE324(void);
+static void ClearBottomWindow(void);
+static void sub_80CA704(void);
+static void sub_80D013C(void);
+static void sub_80CE00C(void);
+static void sub_80D1194(void);
+static void PrintCursorMonInfo(void);
+static void sub_80CA65C(void);
+static void AddWallpaperSetsMenu(void);
+static void sub_80CD02C(void);
+static void InitMenu(void);
+static void sub_80CD158(void);
+static void sub_80CFC14(void);
+static void sub_80CEB40(void);
+static void sub_80CCEE0(void);
+static void sub_80D1818(void);
+static void sub_80D19B4(u32 arg0);
+static void sub_80CAA74(void);
+static void PrintItemDescription(void);
+static void sub_80CE760(void);
+static void sub_80CDBA0(void);
+static void sub_80CE7E8(void);
+static void sub_80CFECC(void);
+static void sub_80CA9EC(void);
+static void FreePSSData(void);
+static void AddBoxMenu(void);
+static void sub_80CCF9C(void);
+static void MoveMon(void);
+static void PlaceMon(void);
+static void sub_80CAB20(void);
+static void sub_80CE22C(void);
+static void sub_80CDA68(void);
+static void sub_80CB950(void);
+static void sub_80CA9C0(void);
+static void SetUpDoShowPartyMenu(void);
+static void BoxSetMosaic(void);
+static void sub_80C7CF4(struct Sprite *sprite);
+static void sub_80CC100(struct Sprite *sprite);
+static void sub_80CB278(struct Sprite *sprite);
+static void sub_80CD210(struct Sprite *sprite);
+static bool32 WaitForWallpaperGfxLoad(void);
+static bool8 InitPSSWindows(void);
+static bool8 sub_80CC0A0(void);
+static bool8 sub_80CE2A8(void);
+static bool8 sub_80D0164(void);
+static bool8 sub_80CC35C(void);
+static bool8 sub_80D01E4(void);
+static bool8 sub_80CDED4(void);
+static bool8 sub_80CDF08(void);
+static bool8 sub_80D184C(void);
+static bool8 sub_80D18E4(void);
+static bool8 DoShowPartyMenu(void);
+static bool8 sub_80D1218(void);
+static bool8 ScrollToBox(void);
+static bool8 sub_80CD554(void);
+static bool8 HidePartyMenu(void);
+static bool8 IsActiveItemMoving(void);
+static bool8 sub_80D0580(u8 arg0);
+static bool8 sub_80D0BC0(void);
+static bool8 sub_80CA2B8(void);
+static bool8 DoWallpaperGfxChange(void);
+static bool8 DoMonPlaceChange(void);
+static bool8 sub_80D00A8(void);
+static bool8 CanMovePartyMon(void);
+static bool8 CanShiftMon(void);
+static bool8 IsCursorOnCloseBox(void);
+static bool8 IsCursorOnBox(void);
+static bool8 IsCursorInBox(void);
+static bool8 IsMonBeingMoved(void);
+static bool8 TryStorePartyMonInBox(u8 boxId);
+static void Cb_InitPSS(u8 taskId);
+static void Cb_PlaceMon(u8 taskId);
+static void Cb_ChangeScreen(u8 taskId);
+static void Cb_ShowPSS(u8 taskId);
+static void Cb_OnBPressed(u8 taskId);
+static void Cb_HandleBoxOptions(u8 taskId);
+static void Cb_OnSelectedMon(u8 taskId);
+static void Cb_OnCloseBoxPressed(u8 taskId);
+static void Cb_HidePartyPokemon(u8 taskId);
+static void Cb_DepositMenu(u8 taskId);
+static void Cb_MoveMon(u8 taskId);
+static void Cb_GiveMovingItemToMon(u8 taskId);
+static void Cb_SwitchSelectedItem(u8 taskId);
+static void Cb_TakeItemForMoving(u8 taskId);
+static void Cb_WithdrawMon(u8 taskId);
+static void Cb_ShiftMon(u8 taskId);
+static void Cb_ShowPartyPokemon(u8 taskId);
+static void Cb_ShowItemInfo(u8 taskId);
+static void Cb_GiveItemFromBag(u8 taskId);
+static void Cb_ItemToBag(u8 taskId);
+static void Cb_TakeItemForMoving(u8 taskId);
+static void Cb_ShowMarkMenu(u8 taskId);
+static void Cb_ShowMonSummary(u8 taskId);
+static void Cb_ReleaseMon(u8 taskId);
+static void Cb_ReshowPSS(u8 taskId);
+static void Cb_MainPSS(u8 taskId);
+static void Cb_JumpBox(u8 taskId);
+static void Cb_HandleWallpapers(u8 taskId);
+static void Cb_NameBox(u8 taskId);
+static void Cb_PrintCantStoreMail(u8 taskId);
+static void Cb_HandleMovingMonFromParty(u8 taskId);
+static void SetUpScrollToBox(u8 boxId);
+static void sub_80CFE54(u8 animNum);
+static void SetMovingMonPriority(u8 priority);
+static void InitMonPlaceChange(u8 arg0);
+static void SetMonMarkings(u8 markings);
+static void ShowYesNoWindow(s8 cursorPos);
+static void sub_80CDBF8(u8 cursorBoxPosition);
+static void sub_80D01D0(u8 arg0);
+static void sub_80CD1A8(bool8 arg0);
+static void sub_80CA984(bool8 arg0);
+static void CreatePartyMonsSprites(bool8 arg0);
+static void PrintStorageActionText(u8 id);
+static s16 sub_80D00AC(void);
+static s8 RunCanReleaseMon(void);
+static u8 GetBoxCursorPosition(void);
+static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos);
+static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos);
+static void Item_TakeMons(u8 cursorArea, u8 cursorPos);
+static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos);
+static struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority);
+static void SetWallpaperForCurrentBox(u8 wallpaperId);
+static void AddWallpapersMenu(u8 wallpaperSet);
+static u16 GetMovingItem(void);
+static void LoadCursorMonGfx(u16 species, u32 pid);
+static void sub_80CA2D0(struct Sprite *sprite);
+static void sub_80CCF64(struct Sprite *sprite);
+static void sub_80CBA3C(struct Sprite *sprite);
+static void sub_80CCF30(struct Sprite *sprite);
+static void sub_80CBAF0(s16 yDelta);
+static void sub_80CAAA8(u8 arg0, bool8 isPartyMon);
+static const u8 *GetMovingItemName(void);
+static void SetMenuText(u8 textId);
+static void sub_80D0D8C(u8 cursorArea, u8 cursorPos);
+static void sub_80D0E50(u8 cursorArea, u8 cursorPos);
+static void sub_80D0F38(u16 item);
+static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority);
+static void DestroyBoxMonIcon(struct Sprite *sprite);
+static void SetBoxSpeciesAndPersonalities(u8 boxId);
+static void sub_80CB9D0(struct Sprite *sprite, u16 partyId);
+static void sub_80CC370(u8 taskId);
+static void sub_80CCB50(u8 boxId);
+static s8 sub_80CC644(u8 boxId);
+static void sub_80CCA3C(const void *tilemap, s8 direction, u8 arg2);
+static s16 sub_80CD00C(const u8 *string);
+static bool8 MonPlaceChange_Shift(void);
+static bool8 MonPlaceChange_Move(void);
+static bool8 MonPlaceChange_Place(void);
+static bool8 sub_80CDEC4(void);
+static bool8 sub_80CDEB4(void);
+static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y);
+static void SetShiftedMonData(u8 boxId, u8 position);
+static void SetMovedMonData(u8 boxId, u8 position);
+static void SetPlacedMonData(u8 boxId, u8 position);
+static void PurgeMonOrBoxMon(u8 boxId, u8 position);
+static void SetCursorMonData(void *pokemon, u8 mode);
+static bool32 AtLeastThreeUsableMons(void);
+static u8 InBoxInput_Normal(void);
+static u8 InBoxInput_MovingMultiple(void);
+static u8 InBoxInput_GrabbingMultiple(void);
+static s8 sub_80CFF98(u8 arg0);
+static u8 sub_80CFA5C(void);
+static u8 sub_80D0BA4(void);
+static bool8 sub_80CFA84(void);
+static bool8 sub_80CFB44(void);
+static bool8 sub_80D024C(void);
+static bool8 sub_80D0344(void);
+static bool8 sub_80D03B0(void);
+static bool8 sub_80D0420(void);
+static bool8 sub_80D04A0(void);
+static bool8 sub_80D04C8(void);
+static void sub_80D07B0(u8 arg0, u8 arg1);
+static void sub_80D0834(u8 arg0, u8 arg1);
+static void sub_80D0B5C(void);
+static void sub_80D062C(void);
+static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2);
+static void sub_80D08CC(void);
+static void sub_80D09A4(void);
+static void sub_80D0A1C(void);
+static void sub_80D0AAC(void);
+static u8 sub_80D0894(void);
+static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2);
+static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2);
+static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2);
+static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2);
+static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4);
+static void sub_80D27F4(u8 id, u8 arg1, s8 arg2);
+static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4);
+static void sub_80D2770(u8 id, u16 arg1, u16 arg2);
+static void sub_80D259C(u8 count);
+static void sub_80D25F0(void);
+static void sub_80D2918(u8 id);
+static void sub_80D2960(u8 id);
+static void sub_80D29F8(u8 id);
+static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2);
+static void sub_80D2AA4(void);
+static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct);
+static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct);
+
+// static const rom data
+static const struct PSS_MenuStringPtrs gUnknown_085716C0[] =
{
{gText_WithdrawPokemon, gText_WithdrawMonDescription},
{gText_DepositPokemon, gText_DepositMonDescription},
@@ -58,7 +728,16 @@ const struct PSS_MenuStringPtrs gUnknown_085716C0[] =
{gText_SeeYa, gText_SeeYaDescription}
};
-const struct WindowTemplate gUnknown_085716E8 = {0, 1, 1, 0x11, 0xA, 0xF, 1};
+static const struct WindowTemplate gUnknown_085716E8 =
+{
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 17,
+ .height = 10,
+ .paletteNum = 15,
+ .baseBlock = 0x1,
+};
static const union AnimCmd sSpriteAnim_85716F0[] =
{
@@ -84,7 +763,7 @@ static const union AnimCmd sSpriteAnim_8571708[] =
ANIMCMD_END
};
-const union AnimCmd *const sSpriteAnimTable_8571710[] =
+static const union AnimCmd *const sSpriteAnimTable_8571710[] =
{
sSpriteAnim_85716F0,
sSpriteAnim_85716F8,
@@ -103,12 +782,765 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] =
sSpriteAffineAnim_8571720
};
-const u8 gUnknown_08571734[] = {4, 0xF, 0xE};
-const u8 gUnknown_08571737[] = _("/30");
+static const u8 gUnknown_08571734[] = {4, 0xF, 0xE};
+static const u8 gUnknown_08571737[] = _("/30");
+
+static const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/unknown/unknown_57173C.gbapal");
+static const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp");
+static const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp");
+static const u32 gPokemonStorageScrollingBGTileset[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz");
+static const u32 gPokemonStorageScrollingBGTilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz");
+static const u32 gUnknown_08572280[] = INCBIN_U32("graphics/unknown/unknown_572280.gbapal");
+static const u32 gUnknown_085722A0[] = INCBIN_U32("graphics/unknown/unknown_5722A0.bin.lz");
+
+static const u16 gUnknown_0857239C[] =
+{
+ 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118,
+ 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118,
+};
+
+static const u16 gUnknown_085723DC[] = INCBIN_U16("graphics/unknown/unknown_5723DC.gbapal"); // Left-most part and Close Box.
+static const u16 gUnknown_085723FC[] = INCBIN_U16("graphics/unknown/unknown_5723FC.gbapal");
+static const u16 gUnknown_0857241C[] = INCBIN_U16("graphics/unknown/unknown_57241C.gbapal");
+static const u16 gUnknown_0857243C[] = INCBIN_U16("graphics/unknown/unknown_57243C.gbapal");
+
+static const u16 gUnknown_0857245C[] =
+{
+ 0x014c, 0x014d, 0x014e, 0x014f, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x015c, 0x015d, 0x015e, 0x015f, 0x0180, 0x0181, 0x0182,
+ 0x0183, 0x0184, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189,
+ 0x018a, 0x018b, 0x018c, 0x018d
+};
+static const u16 gUnknown_085724A4[] =
+{
+ 0x1140, 0x1141, 0x1141, 0x1142, 0x1150, 0x1151, 0x1151, 0x1152, 0x1160, 0x1161, 0x1161, 0x1162,
+};
+static const u16 gUnknown_085724BC[] =
+{
+ 0x1143, 0x1144, 0x1144, 0x1145, 0x1153, 0x1154, 0x1154, 0x1155, 0x1163, 0x1164, 0x1164, 0x1165,
+};
+
+static const u16 gWaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal");
+static const u32 gWaveformTiles[] = INCBIN_U32("graphics/pokemon_storage/waveform.4bpp");
+static const u32 gUnknown_085726B4[] = INCBIN_U32("graphics/unused/unknown_5726B4.gbapal");
+static const u32 gUnknown_085726F4[] = INCBIN_U32("graphics/unknown/unknown_5726F4.gbapal");
+
+static const struct WindowTemplate gUnknown_08572714[] =
+{
+ { // 0
+ .bg = 1,
+ .tilemapLeft = 0,
+ .tilemapTop = 11,
+ .width = 9,
+ .height = 7,
+ .paletteNum = 3,
+ .baseBlock = 0xC0,
+ },
+ { // 1
+ .bg = 0,
+ .tilemapLeft = 11,
+ .tilemapTop = 17,
+ .width = 18,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x14,
+ },
+ { // 2
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 13,
+ .width = 21,
+ .height = 7,
+ .paletteNum = 15,
+ .baseBlock = 0x14,
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const struct BgTemplate gUnknown_08572734[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x100
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 27,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+};
+
+static const struct SpritePalette gWaveformSpritePalette =
+{
+ gWaveformPalette, TAG_PAL_WAVEFORM
+};
+
+static const struct SpriteSheet gWaveformSpriteSheet =
+{
+ gWaveformTiles, sizeof(gWaveformTiles), TAG_TILE_WAVEFORM
+};
+
+static const struct OamData sOamData_857286C;
+static const struct SpriteTemplate sSpriteTemplate_CursorMon =
+{
+ .tileTag = TAG_TILE_2,
+ .paletteTag = TAG_PAL_DAC6,
+ .oam = &sOamData_857286C,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct StorageAction gPCStorageActionTexts[] =
+{
+ [PC_TEXT_EXIT_BOX] = {gText_ExitFromBox, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_WHAT_YOU_DO] = {gText_WhatDoYouWantToDo, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_PICK_A_THEME] = {gText_PleasePickATheme, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_PICK_A_WALLPAPER] = {gText_PickTheWallpaper, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_IS_SELECTED] = {gText_PkmnIsSelected, PC_TEXT_FMT_MON_NAME_1},
+ [PC_TEXT_JUMP_TO_WHICH_BOX] = {gText_JumpToWhichBox, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_WAS_DEPOSITED] = {gText_PkmnWasDeposited, PC_TEXT_FMT_MON_NAME_1},
+ [PC_TEXT_BOX_IS_FULL] = {gText_BoxIsFull2, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_RELEASE_POKE] = {gText_ReleaseThisPokemon, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_WAS_RELEASED] = {gText_PkmnWasReleased, PC_TEXT_FMT_MON_NAME_4},
+ [PC_TEXT_BYE_BYE] = {gText_ByeByePkmn, PC_TEXT_FMT_MON_NAME_6},
+ [PC_TEXT_MARK_POKE] = {gText_MarkYourPkmn, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_LAST_POKE] = {gText_ThatsYourLastPkmn, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_PARTY_FULL] = {gText_YourPartysFull, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_HOLDING_POKE] = {gText_YoureHoldingAPkmn, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_WHICH_ONE_WILL_TAKE] = {gText_WhichOneWillYouTake, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_CANT_RELEASE_EGG] = {gText_YouCantReleaseAnEgg, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_CONTINUE_BOX] = {gText_ContinueBoxOperations, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_CAME_BACK] = {gText_PkmnCameBack, PC_TEXT_FMT_MON_NAME_1},
+ [PC_TEXT_WORRIED] = {gText_WasItWorriedAboutYou, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_SURPRISE] = {gText_FourEllipsesExclamation, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_PLEASE_REMOVE_MAIL] = {gText_PleaseRemoveTheMail, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_IS_SELECTED2] = {gText_PkmnIsSelected, PC_TEXT_FMT_ITEM_NAME},
+ [PC_TEXT_GIVE_TO_MON] = {gText_GiveToAPkmn, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_PLACED_IN_BAG] = {gText_PlacedItemInBag, PC_TEXT_FMT_ITEM_NAME},
+ [PC_TEXT_BAG_FULL] = {gText_BagIsFull2, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_PUT_IN_BAG] = {gText_PutItemInBag, PC_TEXT_FMT_NORMAL},
+ [PC_TEXT_ITEM_IS_HELD] = {gText_ItemIsNowHeld, PC_TEXT_FMT_ITEM_NAME},
+ [PC_TEXT_CHANGED_TO_ITEM] = {gText_ChangedToNewItem, PC_TEXT_FMT_ITEM_NAME},
+ [PC_TEXT_CANT_STORE_MAIL] = {gText_MailCantBeStored, PC_TEXT_FMT_NORMAL},
+};
+
+static const struct WindowTemplate sYesNoWindowTemplate =
+{
+ .bg = 0,
+ .tilemapLeft = 24,
+ .tilemapTop = 11,
+ .width = 5,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 0x5C,
+};
+
+static const struct OamData sOamData_857286C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_8572874 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_857287C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_8572884[] =
+{
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(6, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_8572894[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_857289C[] =
+{
+ ANIMCMD_FRAME(10, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(12, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_85728AC[] =
+{
+ sSpriteAnim_857287C,
+ sSpriteAnim_8572884,
+ sSpriteAnim_8572894,
+ sSpriteAnim_857289C
+};
+
+static const struct SpriteTemplate sSpriteTemplate_Waveform =
+{
+ .tileTag = TAG_TILE_WAVEFORM,
+ .paletteTag = TAG_PAL_WAVEFORM,
+ .oam = &sOamData_8572874,
+ .anims = sSpriteAnimTable_85728AC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_85728EC;
+static const struct SpriteTemplate gUnknown_085728D4 =
+{
+ .tileTag = TAG_TILE_12,
+ .paletteTag = TAG_PAL_DAC0,
+ .oam = &sOamData_85728EC,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_85728EC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_85728F4[] =
+{
+ AFFINEANIMCMD_FRAME(-2, -2, 0, 120),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_8572904[] =
+{
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(16, 16, 0, 15),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_857291C[] =
+{
+ gSpriteAffineAnim_85728F4,
+ gSpriteAffineAnim_8572904
+};
+
+static const u16 gWallpaperPalettes_Forest[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/forest.4bpp.lz");
+static const u32 gWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/forest.bin.lz");
+
+static const u16 gWallpaperPalettes_City[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/city.4bpp.lz");
+static const u32 gWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/city.bin.lz");
+
+static const u16 gWallpaperPalettes_Desert[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/desert.4bpp.lz");
+static const u32 gWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/desert.bin.lz");
+
+static const u16 gWallpaperPalettes_Savanna[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/savanna.4bpp.lz");
+static const u32 gWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/savanna.bin.lz");
+
+static const u16 gWallpaperPalettes_Crag[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/crag.4bpp.lz");
+static const u32 gWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/crag.bin.lz");
+
+static const u16 gWallpaperPalettes_Volcano[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/volcano.4bpp.lz");
+static const u32 gWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/volcano.bin.lz");
+
+static const u16 gWallpaperPalettes_Snow[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/snow.4bpp.lz");
+static const u32 gWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/snow.bin.lz");
+
+static const u16 gWallpaperPalettes_Cave[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/cave.4bpp.lz");
+static const u32 gWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/cave.bin.lz");
+
+static const u16 gWallpaperPalettes_Beach[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/beach.4bpp.lz");
+static const u32 gWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/beach.bin.lz");
+
+static const u16 gWallpaperPalettes_Seafloor[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/seafloor.4bpp.lz");
+static const u32 gWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/seafloor.bin.lz");
+
+static const u16 gWallpaperPalettes_River[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/river.4bpp.lz");
+static const u32 gWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/river.bin.lz");
+static const u16 gWallpaperPalettes_Sky[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/sky.4bpp.lz");
+static const u32 gWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/sky.bin.lz");
+
+static const u16 gWallpaperPalettes_PolkaDot[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/polkadot.4bpp.lz");
+static const u32 gWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/polkadot.bin.lz");
+
+static const u16 gWallpaperPalettes_Pokecenter[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/pokecenter.4bpp.lz");
+static const u32 gWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/pokecenter.bin.lz");
+
+static const u16 gWallpaperPalettes_Machine[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/machine.4bpp.lz");
+static const u32 gWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/machine.bin.lz");
+
+static const u16 gWallpaperPalettes_Plain[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/plain.4bpp.lz");
+static const u32 gWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/plain.bin.lz");
+
+// 1218 tilemap
+static const u32 gUnknown_085773C4[] = INCBIN_U32("graphics/unused/tilemap_5773C4.bin");
+
+static const u16 gUnknown_08577574[][2] =
+{
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF}
+};
+
+#define WALLPAPER_ENTRY(name) {gWallpaperTiles_##name, gWallpaperTilemap_##name, gWallpaperPalettes_##name[0]}
+
+static const struct WallpaperTable gWallpaperTable[] =
+{
+ [WALLPAPER_FOREST] = WALLPAPER_ENTRY(Forest),
+ [WALLPAPER_CITY] = WALLPAPER_ENTRY(City),
+ [WALLPAPER_DESERT] = WALLPAPER_ENTRY(Desert),
+ [WALLPAPER_SAVANNA] = WALLPAPER_ENTRY(Savanna),
+ [WALLPAPER_CRAG] = WALLPAPER_ENTRY(Crag),
+ [WALLPAPER_VOLCANO] = WALLPAPER_ENTRY(Volcano),
+ [WALLPAPER_SNOW] = WALLPAPER_ENTRY(Snow),
+ [WALLPAPER_CAVE] = WALLPAPER_ENTRY(Cave),
+ [WALLPAPER_BEACH] = WALLPAPER_ENTRY(Beach),
+ [WALLPAPER_SEAFLOOR] = WALLPAPER_ENTRY(Seafloor),
+ [WALLPAPER_RIVER] = WALLPAPER_ENTRY(River),
+ [WALLPAPER_SKY] = WALLPAPER_ENTRY(Sky),
+ [WALLPAPER_POLKADOT] = WALLPAPER_ENTRY(PolkaDot),
+ [WALLPAPER_POKECENTER] = WALLPAPER_ENTRY(Pokecenter),
+ [WALLPAPER_MACHINE] = WALLPAPER_ENTRY(Machine),
+ [WALLPAPER_PLAIN] = WALLPAPER_ENTRY(Plain),
+};
+
+static const u8 gPCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp");
+
+static const u16 gWallpaperPalettes_Zigzagoon[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/zigzagoon_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/zigzagoon.4bpp.lz");
+static const u32 gWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/zigzagoon.bin.lz");
+
+static const u16 gWallpaperPalettes_Screen[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/screen_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/screen.4bpp.lz");
+static const u32 gWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/screen.bin.lz");
+
+static const u16 gWallpaperPalettes_Diagonal[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/diagonal_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/diagonal.4bpp.lz");
+static const u32 gWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/diagonal.bin.lz");
+
+static const u16 gWallpaperPalettes_Block[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/block_bg.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/block_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/block.4bpp.lz");
+static const u32 gWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/block.bin.lz");
+
+static const u16 gWallpaperPalettes_Pokecenter2[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/pokecenter2_bg.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/pokecenter2_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/pokecenter2.4bpp.lz");
+static const u32 gWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/pokecenter2.bin.lz");
+
+static const u16 gWallpaperPalettes_Frame[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/frame_bg.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/frame_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/frame.4bpp.lz");
+static const u32 gWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/frame.bin.lz");
+
+static const u16 gWallpaperPalettes_Blank[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/zigzagoon_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/blank.4bpp.lz");
+static const u32 gWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/blank.bin.lz");
+
+static const u16 gWallpaperPalettes_Circles[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/circles_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/circles.4bpp.lz");
+static const u32 gWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/circles.bin.lz");
+
+static const u16 gWallpaperPalettes_Azumarill[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/azumarill_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/azumarill.4bpp.lz");
+static const u32 gWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/azumarill.bin.lz");
+
+static const u16 gWallpaperPalettes_Pikachu[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/pikachu_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/pikachu.4bpp.lz");
+static const u32 gWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/pikachu.bin.lz");
+
+static const u16 gWallpaperPalettes_Legendary[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/legendary_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/legendary.4bpp.lz");
+static const u32 gWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/legendary.bin.lz");
+
+static const u16 gWallpaperPalettes_Dusclops[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/dusclops_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/dusclops.4bpp.lz");
+static const u32 gWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/dusclops.bin.lz");
+
+static const u16 gWallpaperPalettes_Ludicolo[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/ludicolo_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/ludicolo.4bpp.lz");
+static const u32 gWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/ludicolo.bin.lz");
+
+static const u16 gWallpaperPalettes_Whiscash[][16] =
+{
+ INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"),
+ INCBIN_U16("graphics/pokemon_storage/whiscash_bg.gbapal"),
+};
+static const u32 gWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/whiscash.4bpp.lz");
+static const u32 gWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/whiscash.bin.lz");
+
+static const u32 gWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/aqua_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/heart_icon.4bpp.lz");
+static const u32 gWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/five_star_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/brick_icon.4bpp.lz");
+static const u32 gWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/four_star_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/asterisk_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/dot_icon.4bpp.lz");
+static const u32 gWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/line_circle_icon.4bpp.lz");
+static const u32 gWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/pokeball_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/maze_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/footprint_icon.4bpp.lz");
+static const u32 gWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/big_asterisk_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/circle_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/koffing_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/ribbon_icon.4bpp.lz");
+static const u32 gWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/four_circles_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/lotad_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/crystal_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/pichu_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/diglett_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/luvdisc_icon.4bpp.lz");
+static const u32 gWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/star_in_circle_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/spinda_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/latis_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/minun_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/togepi_icon.4bpp.lz");
+static const u32 gWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/magma_icon.4bpp.lz");
+
+static const struct WallpaperTable gFriendsWallpaperTable[] =
+{
+ WALLPAPER_ENTRY(Zigzagoon),
+ WALLPAPER_ENTRY(Screen),
+ WALLPAPER_ENTRY(Horizontal),
+ WALLPAPER_ENTRY(Diagonal),
+ WALLPAPER_ENTRY(Block),
+ WALLPAPER_ENTRY(Ribbon),
+ WALLPAPER_ENTRY(Pokecenter2),
+ WALLPAPER_ENTRY(Frame),
+ WALLPAPER_ENTRY(Blank),
+ WALLPAPER_ENTRY(Circles),
+ WALLPAPER_ENTRY(Azumarill),
+ WALLPAPER_ENTRY(Pikachu),
+ WALLPAPER_ENTRY(Legendary),
+ WALLPAPER_ENTRY(Dusclops),
+ WALLPAPER_ENTRY(Ludicolo),
+ WALLPAPER_ENTRY(Whiscash),
+};
+
+static const u32 *const gFriendsIcons[] =
+{
+ gWallpaperIcon_Aqua,
+ gWallpaperIcon_Heart,
+ gWallpaperIcon_FiveStar,
+ gWallpaperIcon_Brick,
+ gWallpaperIcon_FourStar,
+ gWallpaperIcon_Asterisk,
+ gWallpaperIcon_Dot,
+ gWallpaperIcon_Cross,
+ gWallpaperIcon_LineCircle,
+ gWallpaperIcon_PokeBall,
+ gWallpaperIcon_Maze,
+ gWallpaperIcon_Footprint,
+ gWallpaperIcon_BigAsterisk,
+ gWallpaperIcon_Circle,
+ gWallpaperIcon_Koffing,
+ gWallpaperIcon_Ribbon,
+ gWallpaperIcon_Bolt,
+ gWallpaperIcon_FourCircles,
+ gWallpaperIcon_Lotad,
+ gWallpaperIcon_Crystal,
+ gWallpaperIcon_Pichu,
+ gWallpaperIcon_Diglett,
+ gWallpaperIcon_Luvdisc,
+ gWallpaperIcon_StarInCircle,
+ gWallpaperIcon_Spinda,
+ gWallpaperIcon_Latis,
+ gWallpaperIcon_Plusle,
+ gWallpaperIcon_Minun,
+ gWallpaperIcon_Togepi,
+ gWallpaperIcon_Magma,
+};
+
+// Unknown Unused data.
+static const u16 gUnknown_0857B07C = 0x23BA;
-const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/unknown/unknown_57173C.gbapal");
-const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp");
-const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp");
+static const struct SpriteSheet gUnknown_0857B080 = {gPCGfx_Arrow, 0x80, 6};
+
+static const struct OamData gOamData_83BB298 =
+{
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 2,
+ .priority = 2
+};
+
+static const union AnimCmd gSpriteAnim_83BB2A0[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83BB2A8[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83BB2B0[] =
+{
+ gSpriteAnim_83BB2A0,
+ gSpriteAnim_83BB2A8
+};
+
+static const struct SpriteTemplate gSpriteTemplate_857B0A8 =
+{
+ TAG_TILE_3,
+ TAG_PAL_DAC9,
+ &gOamData_83BB298,
+ gSpriteAnimTable_83BB2B0,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+static const struct OamData gOamData_83BB2D0 =
+{
+ .shape = ST_OAM_V_RECTANGLE,
+ .priority = 2
+};
+
+static const union AnimCmd gSpriteAnim_83BB2D8[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83BB2E0[] =
+{
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83BB2E8[] =
+{
+ gSpriteAnim_83BB2D8,
+ gSpriteAnim_83BB2E0
+};
+
+static const struct SpriteTemplate gUnknown_0857B0E0 =
+{
+ 6,
+ TAG_PAL_WAVEFORM,
+ &gOamData_83BB2D0,
+ gSpriteAnimTable_83BB2E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80CD210
+};
+
+static const u16 gHandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor.gbapal");
+static const u8 gHandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp");
+static const u8 gHandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp");
// code
u8 CountMonsInBox(u8 boxId)
@@ -117,7 +1549,7 @@ u8 CountMonsInBox(u8 boxId)
for (i = 0, count = 0; i < IN_BOX_COUNT; i++)
{
- if (GetBoxMonDataFromAnyBox(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE)
+ if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE)
count++;
}
@@ -130,7 +1562,7 @@ s16 GetFirstFreeBoxSpot(u8 boxId)
for (i = 0; i < IN_BOX_COUNT; i++)
{
- if (GetBoxMonDataFromAnyBox(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE)
+ if (GetBoxMonDataAt(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE)
return i;
}
@@ -191,7 +1623,7 @@ u8 CountPartyMons(void)
return count;
}
-static u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n)
+u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n)
{
u8 *str;
@@ -217,28 +1649,7 @@ static void sub_80C7128(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src,
}
}
-#define MAX_DMA_BLOCK_SIZE 0x1000
-#define Dma3FillLarge_(value, dest, size, bit) \
-{ \
- void *_dest = dest; \
- u32 _size = size; \
- while (1) \
- { \
- if (_size <= MAX_DMA_BLOCK_SIZE) \
- { \
- DmaFill##bit(3, value, _dest, _size); \
- break; \
- } \
- DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
- _dest += MAX_DMA_BLOCK_SIZE; \
- _size -= MAX_DMA_BLOCK_SIZE; \
- } \
-}
-
-#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
-#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
-
-void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height)
+static void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height)
{
u16 i;
@@ -248,13 +1659,14 @@ void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height)
Dma3FillLarge16_(0, dest, width);
}
-void Task_PokemonStorageSystem(u8 taskId)
+static void Task_PokemonStorageSystemPC(u8 taskId)
{
- struct Task *task = gTasks + taskId;
+ struct Task *task = &gTasks[taskId];
+
switch (task->data[0])
{
case 0:
- StorageSystemCreatePrimaryMenu(task->data[1], &task->data[15]);
+ CreatePCMenu(task->data[1], &task->data[15]);
sub_81973A4();
NewMenuHelpers_DrawDialogueFrame(0, 0);
FillWindowPixelBuffer(0, 0x11);
@@ -327,8 +1739,8 @@ void Task_PokemonStorageSystem(u8 taskId)
{
if (--task->data[1] < 0)
task->data[1] = 4;
- MoveMenuCursor(-1);
- task->data[1] = GetMenuCursorPos();
+ Menu_MoveCursor(-1);
+ task->data[1] = Menu_GetCursorPos();
FillWindowPixelBuffer(0, 0x11);
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
task->data[0] = 2;
@@ -337,8 +1749,8 @@ void Task_PokemonStorageSystem(u8 taskId)
{
if (++task->data[1] > 3)
task->data[1] = 0;
- MoveMenuCursor(1);
- task->data[1] = GetMenuCursorPos();
+ Menu_MoveCursor(1);
+ task->data[1] = Menu_GetCursorPos();
FillWindowPixelBuffer(0, 0x11);
AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3);
task->data[0] = 2;
@@ -347,8 +1759,8 @@ void Task_PokemonStorageSystem(u8 taskId)
case 4:
if (!gPaletteFade.active)
{
- overworld_free_bg_tilemaps();
- sub_80C7D74(task->data[2]);
+ CleanupOverworldWindowsAndTilemaps();
+ Cb2_EnterPSS(task->data[2]);
RemoveWindow(task->data[15]);
DestroyTask(taskId);
}
@@ -356,29 +1768,29 @@ void Task_PokemonStorageSystem(u8 taskId)
}
}
-void ShowPokemonStorageSystem(void)
+void ShowPokemonStorageSystemPC(void)
{
- u8 taskId = CreateTask(Task_PokemonStorageSystem, 80);
+ u8 taskId = CreateTask(Task_PokemonStorageSystemPC, 80);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
ScriptContext2_Enable();
}
-void mapldr_0808C6D8(void)
+static void FieldCb_ReturnToPcMenu(void)
{
u8 taskId;
MainCallback vblankCb = gMain.vblankCallback;
SetVBlankCallback(NULL);
- taskId = CreateTask(Task_PokemonStorageSystem, 80);
+ taskId = CreateTask(Task_PokemonStorageSystemPC, 80);
gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = gUnknown_02039D00;
- Task_PokemonStorageSystem(taskId);
+ gTasks[taskId].data[1] = sPreviousBoxOption;
+ Task_PokemonStorageSystemPC(taskId);
SetVBlankCallback(vblankCb);
pal_fill_black();
}
-void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr)
+static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr)
{
s16 windowId;
struct WindowTemplate winTemplate = gUnknown_085716E8;
@@ -391,14 +1803,14 @@ void StorageSystemCreatePrimaryMenu(u8 whichMenu, s16 *windowIdPtr)
*windowIdPtr = windowId;
}
-void sub_80C7678(void)
+static void Cb2_ExitPSS(void)
{
- gUnknown_02039D00 = sub_80CAEA0();
- gFieldCallback = mapldr_0808C6D8;
+ sPreviousBoxOption = GetCurrentBoxOption();
+ gFieldCallback = FieldCb_ReturnToPcMenu;
SetMainCallback2(CB2_ReturnToField);
}
-s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode)
+static s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode)
{
s16 i;
s16 direction;
@@ -431,14 +1843,13 @@ s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx
void ResetPokemonStorageSystem(void)
{
- u16 boxId;
- u16 boxMon;
+ u16 boxId, boxPosition;
SetCurrentBox(0);
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
{
- for (boxMon = 0; boxMon < IN_BOX_COUNT; boxMon++)
- ClearMonInBox(boxId, boxMon);
+ for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++)
+ ZeroBoxMonAt(boxId, boxPosition);
}
for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++)
{
@@ -452,7 +1863,7 @@ void ResetPokemonStorageSystem(void)
ResetWaldaWallpaper();
}
-void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3, bool32 loadPal)
+static void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3, bool32 loadPal)
{
struct SpritePalette palette =
{
@@ -476,7 +1887,7 @@ void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3
a0->unk_023c = loadPal;
}
-void sub_80C7890(void)
+static void sub_80C7890(void)
{
if (gUnknown_02039D04->unk_023c)
FreeSpritePaletteByTag(gUnknown_02039D04->unk_0242);
@@ -484,17 +1895,17 @@ void sub_80C7890(void)
FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240 + 1);
}
-void sub_80C78D4(u8 curBox)
+static void sub_80C78D4(u8 curBox)
{
sub_80C7958(curBox);
}
-void sub_80C78E4(void)
+static void sub_80C78E4(void)
{
sub_80C7B14();
}
-u8 sub_80C78F0(void)
+static u8 HandleBoxChooseSelectionInput(void)
{
if (gMain.newKeys & B_BUTTON)
{
@@ -519,7 +1930,7 @@ u8 sub_80C78F0(void)
return 200;
}
-void sub_80C7958(u8 curBox)
+static void sub_80C7958(u8 curBox)
{
u16 i;
u8 spriteId;
@@ -535,7 +1946,7 @@ void sub_80C7958(u8 curBox)
template.tileTag = gUnknown_02039D04->unk_0240;
template.paletteTag = gUnknown_02039D04->unk_0242;
- spriteId = CreateSprite(&template, 0xA0, 0x60, 0);
+ spriteId = CreateSprite(&template, 160, 96, 0);
gUnknown_02039D04->unk_0000 = gSprites + spriteId;
oamData.shape = ST_OAM_V_RECTANGLE;
@@ -545,17 +1956,17 @@ void sub_80C7958(u8 curBox)
for (i = 0; i < 4; i++)
{
u16 r5;
- spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02039D04->unk_0246);
+ spriteId = CreateSprite(&template, 124, 80, gUnknown_02039D04->unk_0246);
gUnknown_02039D04->unk_0004[i] = gSprites + spriteId;
r5 = 0;
if (i & 2)
{
- gUnknown_02039D04->unk_0004[i]->pos1.x = 0xc4;
+ gUnknown_02039D04->unk_0004[i]->pos1.x = 196;
r5 = 2;
}
if (i & 1)
{
- gUnknown_02039D04->unk_0004[i]->pos1.y = 0x70;
+ gUnknown_02039D04->unk_0004[i]->pos1.y = 112;
gUnknown_02039D04->unk_0004[i]->oam.size = 0;
r5++;
}
@@ -573,7 +1984,7 @@ void sub_80C7958(u8 curBox)
sub_80C7BE4();
}
-void sub_80C7B14(void)
+static void sub_80C7B14(void)
{
u16 i;
if (gUnknown_02039D04->unk_0000)
@@ -596,20 +2007,20 @@ void sub_80C7B14(void)
}
}
-void sub_80C7B80(void)
+static void sub_80C7B80(void)
{
if (++gUnknown_02039D04->curBox >= TOTAL_BOXES_COUNT)
gUnknown_02039D04->curBox = 0;
sub_80C7BE4();
}
-void sub_80C7BB4(void)
+static void sub_80C7BB4(void)
{
gUnknown_02039D04->curBox = (gUnknown_02039D04->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : gUnknown_02039D04->curBox - 1);
sub_80C7BE4();
}
-void sub_80C7BE4(void)
+static void sub_80C7BE4(void)
{
u8 text[16];
struct WindowTemplate winTemplate;
@@ -626,13 +2037,13 @@ void sub_80C7BE4(void)
windowId = AddWindow(&winTemplate);
FillWindowPixelBuffer(windowId, 0x44);
- center = GetStringCenterAlignXOffset(1, boxName, 0x40);
+ center = GetStringCenterAlignXOffset(1, boxName, 64);
AddTextPrinterParameterized3(windowId, 1, center, 1, gUnknown_08571734, TEXT_SPEED_FF, boxName);
ConvertIntToDecimalStringN(text, nPokemonInBox, 1, 2);
StringAppend(text, gUnknown_08571737);
- center = GetStringCenterAlignXOffset(1, text, 0x40);
- AddTextPrinterParameterized3(windowId, 1, center, 0x11, gUnknown_08571734, TEXT_SPEED_FF, text);
+ center = GetStringCenterAlignXOffset(1, text, 64);
+ AddTextPrinterParameterized3(windowId, 1, center, 17, gUnknown_08571734, TEXT_SPEED_FF, text);
winTileData = GetWindowAttribute(windowId, WINDOW_TILE_DATA);
CpuCopy32((void *)winTileData, (void *)OBJ_VRAM0 + 0x100 + (GetSpriteTileStartByTag(gUnknown_02039D04->unk_0240) * 32), 0x400);
@@ -640,7 +2051,7 @@ void sub_80C7BE4(void)
RemoveWindow(windowId);
}
-void sub_80C7CF4(struct Sprite *sprite)
+static void sub_80C7CF4(struct Sprite *sprite)
{
if (++sprite->data[1] > 3)
{
@@ -654,21 +2065,8587 @@ void sub_80C7CF4(struct Sprite *sprite)
}
}
-void sub_80C7D28(void)
+static void VblankCb_PSS(void)
{
LoadOam();
ProcessSpriteCopyRequests();
sub_80D2AA4();
TransferPlttBuffer();
- SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_02039D08->bg2_X);
+ SetGpuReg(REG_OFFSET_BG2HOFS, sPSSData->bg2_X);
}
-void c2_Box(void)
+static void Cb2_PSS(void)
{
RunTasks();
do_scheduled_bg_tilemap_copies_to_vram();
- sub_80CA028();
+ ScrollBackground();
sub_80CAA14();
AnimateSprites();
BuildOamBuffer();
}
+
+static void Cb2_EnterPSS(u8 boxOption)
+{
+ ResetTasks();
+ sCurrentBoxOption = boxOption;
+ sPSSData = Alloc(sizeof(*sPSSData));
+ if (sPSSData == NULL)
+ {
+ SetMainCallback2(Cb2_ExitPSS);
+ }
+ else
+ {
+ sPSSData->boxOption = boxOption;
+ sPSSData->isReshowingPSS = FALSE;
+ gUnknown_02039D12 = 0;
+ sPSSData->state = 0;
+ sPSSData->taskId = CreateTask(Cb_InitPSS, 3);
+ gUnknown_02039D10 = StorageGetCurrentBox();
+ SetMainCallback2(Cb2_PSS);
+ }
+}
+
+static void Cb2_ReturnToPSS(void)
+{
+ ResetTasks();
+ sPSSData = Alloc(sizeof(*sPSSData));
+ if (sPSSData == NULL)
+ {
+ SetMainCallback2(Cb2_ExitPSS);
+ }
+ else
+ {
+ sPSSData->boxOption = sCurrentBoxOption;
+ sPSSData->isReshowingPSS = TRUE;
+ sPSSData->state = 0;
+ sPSSData->taskId = CreateTask(Cb_InitPSS, 3);
+ SetMainCallback2(Cb2_PSS);
+ }
+}
+
+static void ResetAllBgCoords(void)
+{
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG3VOFS, 0);
+}
+
+static void sub_80C7E98(void)
+{
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeSpriteTileRanges();
+ FreeAllSpritePalettes();
+ ClearDma3Requests();
+ gReservedSpriteTileCount = 0x280;
+ sub_80D2A90(&sPSSData->unk_0020, sPSSData->unk_0028, 8);
+ gKeyRepeatStartDelay = 20;
+ clear_scheduled_bg_copies_to_vram();
+ sub_80D259C(3);
+ sub_80D2644(0, 1, gUnknown_0857239C, 8, 4);
+ sub_80D2770(0, 1, 0);
+ sPSSData->unk_02C7 = 0;
+}
+
+static void sub_80C7F1C(void)
+{
+ sub_80CDC0C();
+ sInPartyMenu = (sPSSData->boxOption == BOX_OPTION_DEPOSIT);
+ gUnknown_02039D0E = 0;
+}
+
+static void sub_80C7F4C(void)
+{
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(7, 11));
+ }
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP);
+}
+
+static void SetPSSCallback(TaskFunc newFunc)
+{
+ gTasks[sPSSData->taskId].func = newFunc;
+ sPSSData->state = 0;
+}
+
+static void Cb_InitPSS(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ sub_80C7E98();
+ if (sPSSData->isReshowingPSS)
+ {
+ switch (sWhichToReshow)
+ {
+ case 1:
+ sub_80CE790();
+ break;
+ case 0:
+ sub_80CE8E4();
+ break;
+ case 2:
+ GiveChosenBagItem();
+ break;
+ }
+ }
+ LoadPSSMenuGfx();
+ LoadWaveformSpritePalette();
+ break;
+ case 1:
+ if (!InitPSSWindows())
+ {
+ SetPSSCallback(Cb_ChangeScreen);
+ return;
+ }
+ break;
+ case 2:
+ PutWindowTilemap(0);
+ ClearWindowTilemap(1);
+ CpuFill32(0, (void *)VRAM, 0x200);
+ LoadUserWindowBorderGfx(1, 0xB, 0xE0);
+ break;
+ case 3:
+ ResetAllBgCoords();
+ if (!sPSSData->isReshowingPSS)
+ sub_80C7F1C();
+ break;
+ case 4:
+ sub_80CAF04();
+ if (!sPSSData->isReshowingPSS)
+ sub_80CD36C();
+ else
+ sub_80CD3EC();
+ break;
+ case 5:
+ if (!sub_80D0164())
+ {
+ SetPSSCallback(Cb_ChangeScreen);
+ return;
+ }
+ else
+ {
+ SetScrollingBackground();
+ sub_80CAC1C();
+ }
+ break;
+ case 6:
+ sub_80CA0D8();
+ break;
+ case 7:
+ sub_80CA704();
+ break;
+ case 8:
+ sub_80CC32C(StorageGetCurrentBox());
+ break;
+ case 9:
+ if (sub_80CC35C())
+ return;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ sPSSData->field_DA4.baseTileTag = TAG_TILE_D;
+ sPSSData->field_DA4.basePaletteTag = TAG_PAL_DACE;
+ sub_811F90C(&sPSSData->field_DA4);
+ sub_811FA90();
+ }
+ else
+ {
+ sub_80D0C60();
+ sub_80CAEAC();
+ }
+ break;
+ case 10:
+ sub_80C7F4C();
+ if (!sPSSData->isReshowingPSS)
+ {
+ BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK);
+ SetPSSCallback(Cb_ShowPSS);
+ }
+ else
+ {
+ BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK);
+ SetPSSCallback(Cb_ReshowPSS);
+ }
+ SetVBlankCallback(VblankCb_PSS);
+ return;
+ default:
+ return;
+ }
+
+ sPSSData->state++;
+}
+
+static void Cb_ShowPSS(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PlaySE(SE_PC_LOGIN);
+ sub_80F9BCC(0x14, 0, 1);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!sub_80F9C1C())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_ReshowPSS(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, RGB_BLACK);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ if (sWhichToReshow == 2 && gSpecialVar_ItemId != 0)
+ {
+ PrintStorageActionText(PC_TEXT_ITEM_IS_HELD);
+ sPSSData->state++;
+ }
+ else
+ {
+ SetPSSCallback(Cb_MainPSS);
+ }
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy() && gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ ClearBottomWindow();
+ sPSSData->state++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_MainPSS(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ switch (HandleInput())
+ {
+ case 1:
+ PlaySE(SE_SELECT);
+ sPSSData->state = 1;
+ break;
+ case 5:
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_MONS && sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE);
+ sPSSData->state = 3;
+ }
+ else
+ {
+ sub_80CDC0C();
+ SetPSSCallback(Cb_ShowPartyPokemon);
+ }
+ break;
+ case 6:
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS)
+ {
+ if (IsMonBeingMoved() && ItemIsMail(sPSSData->cursorMonItem))
+ sPSSData->state = 5;
+ else
+ SetPSSCallback(Cb_HidePartyPokemon);
+ }
+ else if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ SetPSSCallback(Cb_HidePartyPokemon);
+ }
+ break;
+ case 4:
+ SetPSSCallback(Cb_OnCloseBoxPressed);
+ break;
+ case 19:
+ SetPSSCallback(Cb_OnBPressed);
+ break;
+ case 7:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_HandleBoxOptions);
+ break;
+ case 8:
+ SetPSSCallback(Cb_OnSelectedMon);
+ break;
+ case 9:
+ PlaySE(SE_SELECT);
+ sPSSData->newCurrBoxId = StorageGetCurrentBox() + 1;
+ if (sPSSData->newCurrBoxId >= TOTAL_BOXES_COUNT)
+ sPSSData->newCurrBoxId = 0;
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ SetUpScrollToBox(sPSSData->newCurrBoxId);
+ sPSSData->state = 2;
+ }
+ else
+ {
+ sub_80CFEA8();
+ sPSSData->state = 10;
+ }
+ break;
+ case 10:
+ PlaySE(SE_SELECT);
+ sPSSData->newCurrBoxId = StorageGetCurrentBox() - 1;
+ if (sPSSData->newCurrBoxId < 0)
+ sPSSData->newCurrBoxId = TOTAL_BOXES_COUNT - 1;
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ SetUpScrollToBox(sPSSData->newCurrBoxId);
+ sPSSData->state = 2;
+ }
+ else
+ {
+ sub_80CFEA8();
+ sPSSData->state = 10;
+ }
+ break;
+ case 11:
+ if (!CanMovePartyMon())
+ {
+ if (ItemIsMail(sPSSData->cursorMonItem))
+ {
+ sPSSData->state = 5;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_DepositMenu);
+ }
+ }
+ else
+ {
+ sPSSData->state = 4;
+ }
+ break;
+ case 13:
+ if (CanMovePartyMon())
+ {
+ sPSSData->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_MoveMon);
+ }
+ break;
+ case 14:
+ if (!CanShiftMon())
+ {
+ sPSSData->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_ShiftMon);
+ }
+ break;
+ case 12:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_WithdrawMon);
+ break;
+ case 15:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_PlaceMon);
+ break;
+ case 16:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_TakeItemForMoving);
+ break;
+ case 17:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_GiveMovingItemToMon);
+ break;
+ case 18:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_SwitchSelectedItem);
+ break;
+ case 20:
+ PlaySE(SE_SELECT);
+ sub_80D01D0(0);
+ sPSSData->state = 7;
+ break;
+ case 22:
+ sub_80D01D0(1);
+ sPSSData->state = 8;
+ break;
+ case 21:
+ PlaySE(SE_SELECT);
+ sub_80D01D0(2);
+ sPSSData->state = 9;
+ break;
+ case 23:
+ sub_80D01D0(3);
+ sPSSData->state = 7;
+ break;
+ case 25:
+ PlaySE(SE_SELECT);
+ sub_80D01D0(4);
+ sPSSData->state = 9;
+ break;
+ case 26:
+ PlaySE(SE_SELECT);
+ sub_80D01D0(5);
+ sPSSData->state = 7;
+ break;
+ case 24:
+ PlaySE(SE_HAZURE);
+ break;
+ }
+ break;
+ case 1:
+ if (!sub_80CD554())
+ {
+ if (IsCursorOnCloseBox())
+ sub_80CA9C0();
+ else
+ sub_80CA9EC();
+
+ if (sPSSData->setMosaic)
+ BoxSetMosaic();
+ sPSSData->state = 0;
+ }
+ break;
+ case 2:
+ if (!ScrollToBox())
+ {
+ SetCurrentBox(sPSSData->newCurrBoxId);
+ if (!sInPartyMenu && !IsMonBeingMoved())
+ {
+ sub_80CE00C();
+ BoxSetMosaic();
+ }
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ sub_80CFECC();
+ sPSSData->state = 11;
+ }
+ else
+ {
+ sPSSData->state = 0;
+ }
+ }
+ break;
+ case 3:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ sPSSData->state = 0;
+ }
+ break;
+ case 4:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_LAST_POKE);
+ sPSSData->state = 6;
+ break;
+ case 5:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL);
+ sPSSData->state = 6;
+ break;
+ case 6:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ case 7:
+ if (!sub_80D01E4())
+ sPSSData->state = 0;
+ break;
+ case 8:
+ if (!sub_80D01E4())
+ SetPSSCallback(Cb_MoveMon);
+ break;
+ case 9:
+ if (!sub_80D01E4())
+ {
+ if (sPSSData->setMosaic)
+ BoxSetMosaic();
+ sPSSData->state = 0;
+ }
+ break;
+ case 10:
+ if (!sub_80D1218())
+ {
+ SetUpScrollToBox(sPSSData->newCurrBoxId);
+ sPSSData->state = 2;
+ }
+ break;
+ case 11:
+ if (!sub_80D1218())
+ sPSSData->state = 0;
+ break;
+ }
+}
+
+static void Cb_ShowPartyPokemon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ SetUpDoShowPartyMenu();
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!DoShowPartyMenu())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_HidePartyPokemon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ SetUpHidePartyMenu();
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!HidePartyMenu())
+ {
+ sub_80CDBF8(sub_80CDC2C());
+ sPSSData->state++;
+ }
+ break;
+ case 2:
+ if (!sub_80CD554())
+ {
+ if (sPSSData->setMosaic)
+ BoxSetMosaic();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_OnSelectedMon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ if (!sub_80CA2B8())
+ {
+ PlaySE(SE_SELECT);
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ PrintStorageActionText(PC_TEXT_IS_SELECTED);
+ else if (IsActiveItemMoving() || sPSSData->cursorMonItem != 0)
+ PrintStorageActionText(PC_TEXT_IS_SELECTED2);
+ else
+ PrintStorageActionText(PC_TEXT_GIVE_TO_MON);
+
+ AddMenu();
+ sPSSData->state = 1;
+ }
+ break;
+ case 1: // debug?
+ if (!sub_80D00A8())
+ sPSSData->state = 2;
+ break;
+ case 2:
+ switch (sub_80D00AC())
+ {
+ case -1:
+ case 0:
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 3:
+ if (CanMovePartyMon())
+ {
+ sPSSData->state = 3;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MoveMon);
+ }
+ break;
+ case 5:
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_PlaceMon);
+ break;
+ case 4:
+ if (!CanShiftMon())
+ {
+ sPSSData->state = 3;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_ShiftMon);
+ }
+ break;
+ case 2:
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_WithdrawMon);
+ break;
+ case 1:
+ if (CanMovePartyMon())
+ {
+ sPSSData->state = 3;
+ }
+ else if (ItemIsMail(sPSSData->cursorMonItem))
+ {
+ sPSSData->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_DepositMenu);
+ }
+ break;
+ case 7:
+ if (CanMovePartyMon())
+ {
+ sPSSData->state = 3;
+ }
+ else if (sPSSData->cursorMonIsEgg)
+ {
+ sPSSData->state = 5; // Cannot release an Egg.
+ }
+ else if (ItemIsMail(sPSSData->cursorMonItem))
+ {
+ sPSSData->state = 4;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_ReleaseMon);
+ }
+ break;
+ case 6:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_ShowMonSummary);
+ break;
+ case 8:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_ShowMarkMenu);
+ break;
+ case 12:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_TakeItemForMoving);
+ break;
+ case 13:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_GiveMovingItemToMon);
+ break;
+ case 16:
+ SetPSSCallback(Cb_ItemToBag);
+ break;
+ case 15:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_SwitchSelectedItem);
+ break;
+ case 14:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_GiveItemFromBag);
+ break;
+ case 17:
+ SetPSSCallback(Cb_ShowItemInfo);
+ break;
+ }
+ break;
+ case 3:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_LAST_POKE);
+ sPSSData->state = 6;
+ break;
+ case 5:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG);
+ sPSSData->state = 6;
+ break;
+ case 4:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL);
+ sPSSData->state = 6;
+ break;
+ case 6:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_MoveMon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ InitMonPlaceChange(0);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!DoMonPlaceChange())
+ {
+ if (sInPartyMenu)
+ SetPSSCallback(Cb_HandleMovingMonFromParty);
+ else
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_PlaceMon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ InitMonPlaceChange(1);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!DoMonPlaceChange())
+ {
+ if (sInPartyMenu)
+ SetPSSCallback(Cb_HandleMovingMonFromParty);
+ else
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_ShiftMon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ InitMonPlaceChange(2);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!DoMonPlaceChange())
+ {
+ BoxSetMosaic();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_WithdrawMon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ if (CalculatePlayerPartyCount() == PARTY_SIZE)
+ {
+ PrintStorageActionText(PC_TEXT_PARTY_FULL);
+ sPSSData->state = 1;
+ }
+ else
+ {
+ sub_80CDC18();
+ InitMonPlaceChange(0);
+ sPSSData->state = 2;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ case 2:
+ if (!DoMonPlaceChange())
+ {
+ SetMovingMonPriority(1);
+ SetUpDoShowPartyMenu();
+ sPSSData->state++;
+ }
+ break;
+ case 3:
+ if (!DoShowPartyMenu())
+ {
+ InitMonPlaceChange(1);
+ sPSSData->state++;
+ }
+ break;
+ case 4:
+ if (!DoMonPlaceChange())
+ {
+ sub_80CAB20();
+ sPSSData->state++;
+ }
+ break;
+ case 5:
+ SetPSSCallback(Cb_HidePartyPokemon);
+ break;
+ }
+}
+
+static void Cb_DepositMenu(u8 taskId)
+{
+ u8 boxId;
+
+ switch (sPSSData->state)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX);
+ sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE);
+ sub_80C78D4(gUnknown_02039D0E);
+ sPSSData->state++;
+ break;
+ case 1:
+ boxId = HandleBoxChooseSelectionInput();
+ if (boxId == 200)
+ {
+ // no box chosen yet
+ }
+ else if (boxId == 201)
+ {
+ ClearBottomWindow();
+ sub_80C78E4();
+ sub_80C7890();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ else
+ {
+ if (TryStorePartyMonInBox(boxId))
+ {
+ gUnknown_02039D0E = boxId;
+ ClearBottomWindow();
+ sub_80C78E4();
+ sub_80C7890();
+ sPSSData->state = 2;
+ }
+ else
+ {
+ PrintStorageActionText(PC_TEXT_BOX_IS_FULL);
+ sPSSData->state = 4;
+ }
+ }
+ break;
+ case 2:
+ CompactPartySlots();
+ sub_80CB950();
+ sPSSData->state++;
+ break;
+ case 3:
+ if (!sub_80CB9BC())
+ {
+ sub_80CE22C();
+ BoxSetMosaic();
+ sub_80CAB20();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ case 4:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX);
+ sPSSData->state = 1;
+ }
+ break;
+ }
+}
+
+static void Cb_ReleaseMon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_RELEASE_POKE);
+ ShowYesNoWindow(1);
+ sPSSData->state++;
+ // fallthrough
+ case 1:
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case MENU_B_PRESSED:
+ case 1:
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 0:
+ ClearBottomWindow();
+ InitCanRelaseMonVars();
+ sub_80CE250();
+ sPSSData->state++;
+ break;
+ }
+ break;
+ case 2:
+ RunCanReleaseMon();
+ if (!sub_80CE2A8())
+ {
+ while (1)
+ {
+ s8 r0 = RunCanReleaseMon();
+ if (r0 == 1)
+ {
+ sPSSData->state++;
+ break;
+ }
+ else if (r0 == 0)
+ {
+ sPSSData->state = 8; // Can't release the mon.
+ break;
+ }
+ }
+ }
+ break;
+ case 3:
+ ReleaseMon();
+ RefreshCursorMonData();
+ PrintStorageActionText(PC_TEXT_WAS_RELEASED);
+ sPSSData->state++;
+ break;
+ case 4:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ PrintStorageActionText(PC_TEXT_BYE_BYE);
+ sPSSData->state++;
+ }
+ break;
+ case 5:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ if (sInPartyMenu)
+ {
+ CompactPartySlots();
+ sub_80CB950();
+ sPSSData->state++;
+ }
+ else
+ {
+ sPSSData->state = 7;
+ }
+ }
+ break;
+ case 6:
+ if (!sub_80CB9BC())
+ {
+ sub_80CE00C();
+ BoxSetMosaic();
+ sub_80CAB20();
+ sPSSData->state++;
+ }
+ break;
+ case 7:
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 8:
+ PrintStorageActionText(PC_TEXT_WAS_RELEASED);
+ sPSSData->state++;
+ break;
+ case 9:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ PrintStorageActionText(PC_TEXT_SURPRISE);
+ sPSSData->state++;
+ }
+ break;
+ case 10:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ sub_80CC064();
+ sPSSData->state++;
+ }
+ break;
+ case 11:
+ if (!sub_80CC0A0())
+ {
+ sub_80CE324();
+ PrintStorageActionText(PC_TEXT_CAME_BACK);
+ sPSSData->state++;
+ }
+ break;
+ case 12:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ PrintStorageActionText(PC_TEXT_WORRIED);
+ sPSSData->state++;
+ }
+ break;
+ case 13:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_ShowMarkMenu(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_MARK_POKE);
+ sPSSData->field_DA4.markings = sPSSData->cursorMonMarkings;
+ sub_811FAA4(sPSSData->cursorMonMarkings, 0xb0, 0x10);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!sub_811FBA4())
+ {
+ sub_811FAF8();
+ ClearBottomWindow();
+ SetMonMarkings(sPSSData->field_DA4.markings);
+ RefreshCursorMonData();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_TakeItemForMoving(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ if (!ItemIsMail(sPSSData->cursorMonItem))
+ {
+ ClearBottomWindow();
+ sPSSData->state++;
+ }
+ else
+ {
+ SetPSSCallback(Cb_PrintCantStoreMail);
+ }
+ break;
+ case 1:
+ sub_80CFE54(2);
+ Item_FromMonToMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
+ sPSSData->state++;
+ break;
+ case 2:
+ if (!sub_80D1218())
+ {
+ sub_80CFE54(3);
+ ClearBottomWindow();
+ sub_80CE00C();
+ PrintCursorMonInfo();
+ sPSSData->state++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_GiveMovingItemToMon(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ ClearBottomWindow();
+ sPSSData->state++;
+ break;
+ case 1:
+ sub_80CFE54(2);
+ Item_GiveMovingToMon((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
+ sPSSData->state++;
+ break;
+ case 2:
+ if (!sub_80D1218())
+ {
+ sub_80CFE54(0);
+ sub_80CE00C();
+ PrintCursorMonInfo();
+ PrintStorageActionText(PC_TEXT_ITEM_IS_HELD);
+ sPSSData->state++;
+ }
+ break;
+ case 3:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ sPSSData->state++;
+ }
+ break;
+ case 4:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_ItemToBag(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ if (!AddBagItem(sPSSData->cursorMonItem, 1))
+ {
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_BAG_FULL);
+ sPSSData->state = 3;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ Item_TakeMons((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
+ sPSSData->state = 1;
+ }
+ break;
+ case 1:
+ if (!sub_80D1218())
+ {
+ PrintStorageActionText(PC_TEXT_PLACED_IN_BAG);
+ sPSSData->state = 2;
+ }
+ break;
+ case 2:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ sub_80CE00C();
+ PrintCursorMonInfo();
+ sPSSData->state = 4;
+ }
+ break;
+ case 4:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 3:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_SwitchSelectedItem(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ if (!ItemIsMail(sPSSData->cursorMonItem))
+ {
+ ClearBottomWindow();
+ sPSSData->state++;
+ }
+ else
+ {
+ SetPSSCallback(Cb_PrintCantStoreMail);
+ }
+ break;
+ case 1:
+ sub_80CFE54(2);
+ Item_SwitchMonsWithMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
+ sPSSData->state++;
+ break;
+ case 2:
+ if (!sub_80D1218())
+ {
+ sub_80CFE54(3);
+ sub_80CE00C();
+ PrintCursorMonInfo();
+ PrintStorageActionText(PC_TEXT_CHANGED_TO_ITEM);
+ sPSSData->state++;
+ }
+ break;
+ case 3:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ sPSSData->state++;
+ }
+ break;
+ case 4:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_ShowItemInfo(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ ClearBottomWindow();
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PlaySE(SE_WIN_OPEN);
+ PrintItemDescription();
+ sub_80D1818();
+ sPSSData->state++;
+ }
+ break;
+ case 2:
+ if (!sub_80D184C())
+ sPSSData->state++;
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ sPSSData->state++;
+ break;
+ case 4:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ PlaySE(SE_WIN_OPEN);
+ sPSSData->state++;
+ }
+ break;
+ case 5:
+ if (!sub_80D18E4())
+ sPSSData->state++;
+ break;
+ case 6:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_CloseBoxWhileHoldingItem(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ PrintStorageActionText(PC_TEXT_PUT_IN_BAG);
+ ShowYesNoWindow(0);
+ sPSSData->state = 1;
+ break;
+ case 1:
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case MENU_B_PRESSED:
+ case 1:
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 0:
+ if (AddBagItem(sPSSData->movingItem, 1) == TRUE)
+ {
+ ClearBottomWindow();
+ sPSSData->state = 3;
+ }
+ else
+ {
+ PrintStorageActionText(PC_TEXT_BAG_FULL);
+ sPSSData->state = 2;
+ }
+ break;
+ }
+ break;
+ case 2:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ sPSSData->state = 5;
+ }
+ break;
+ case 3:
+ sub_80D1194();
+ sPSSData->state = 4;
+ break;
+ case 4:
+ if (!sub_80D1218())
+ {
+ sub_80CFE54(0);
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ case 5:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_HandleMovingMonFromParty(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ CompactPartySlots();
+ sub_80CB950();
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!sub_80CB9BC())
+ {
+ sub_80CAB20();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_PrintCantStoreMail(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_CANT_STORE_MAIL);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ sPSSData->state++;
+ break;
+ case 2:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ sPSSData->state++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ }
+}
+
+static void Cb_HandleBoxOptions(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_WHAT_YOU_DO);
+ AddMenu();
+ sPSSData->state++;
+ break;
+ case 1:
+ if (sub_80D00A8())
+ return;
+ sPSSData->state++;
+ case 2:
+ switch (sub_80D00AC())
+ {
+ case -1:
+ case 0:
+ sub_80CD1A8(TRUE);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 11:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(Cb_NameBox);
+ break;
+ case 10:
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_HandleWallpapers);
+ break;
+ case 9:
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_JumpBox);
+ break;
+ }
+ break;
+ }
+}
+
+static void Cb_HandleWallpapers(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ AddWallpaperSetsMenu();
+ PrintStorageActionText(PC_TEXT_PICK_A_THEME);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!sub_80D00A8())
+ sPSSData->state++;
+ break;
+ case 2:
+ sPSSData->wallpaperSetId = sub_80D00AC();
+ switch (sPSSData->wallpaperSetId)
+ {
+ case -1:
+ sub_80CD1A8(TRUE);
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 18 ... 21:
+ PlaySE(SE_SELECT);
+ sub_80D013C();
+ sPSSData->wallpaperSetId -= 18;
+ sPSSData->state++;
+ break;
+ // New wallpaper from Walda.
+ case 22:
+ PlaySE(SE_SELECT);
+ sPSSData->wallpaperId = 16;
+ sub_80D013C();
+ ClearBottomWindow();
+ sPSSData->state = 6;
+ break;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ AddWallpapersMenu(sPSSData->wallpaperSetId);
+ PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER);
+ sPSSData->state++;
+ }
+ break;
+ case 4:
+ sPSSData->wallpaperId = sub_80D00AC();
+ switch (sPSSData->wallpaperId)
+ {
+ case -2:
+ break;
+ case -1:
+ ClearBottomWindow();
+ sPSSData->state = 0;
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ ClearBottomWindow();
+ sPSSData->wallpaperId -= 23;
+ SetWallpaperForCurrentBox(sPSSData->wallpaperId);
+ sPSSData->state++;
+ break;
+ }
+ break;
+ case 5:
+ if (!DoWallpaperGfxChange())
+ {
+ sub_80CD1A8(TRUE);
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ case 6:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ SetWallpaperForCurrentBox(sPSSData->wallpaperId);
+ sPSSData->state = 5;
+ }
+ break;
+ }
+}
+
+static void Cb_JumpBox(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX);
+ sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE);
+ sub_80C78D4(StorageGetCurrentBox());
+ sPSSData->state++;
+ break;
+ case 1:
+ sPSSData->newCurrBoxId = HandleBoxChooseSelectionInput();
+ switch (sPSSData->newCurrBoxId)
+ {
+ case 200:
+ break;
+ default:
+ ClearBottomWindow();
+ sub_80C78E4();
+ sub_80C7890();
+ if (sPSSData->newCurrBoxId == 201 || sPSSData->newCurrBoxId == StorageGetCurrentBox())
+ {
+ sub_80CD1A8(TRUE);
+ SetPSSCallback(Cb_MainPSS);
+ }
+ else
+ {
+ sPSSData->state++;
+ }
+ break;
+ }
+ break;
+ case 2:
+ SetUpScrollToBox(sPSSData->newCurrBoxId);
+ sPSSData->state++;
+ break;
+ case 3:
+ if (!ScrollToBox())
+ {
+ SetCurrentBox(sPSSData->newCurrBoxId);
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ }
+}
+
+static void Cb_NameBox(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ sub_80CE760();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ sWhichToReshow = 1;
+ sPSSData->screenChangeType = SCREEN_CHANGE_NAME_BOX;
+ SetPSSCallback(Cb_ChangeScreen);
+ }
+ break;
+ }
+}
+
+static void Cb_ShowMonSummary(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ sub_80CE7E8();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ sWhichToReshow = 0;
+ sPSSData->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN;
+ SetPSSCallback(Cb_ChangeScreen);
+ }
+ break;
+ }
+}
+
+static void Cb_GiveItemFromBag(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ sPSSData->state++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ sWhichToReshow = 2;
+ sPSSData->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG;
+ SetPSSCallback(Cb_ChangeScreen);
+ }
+ break;
+ }
+}
+
+static void Cb_OnCloseBoxPressed(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ if (IsMonBeingMoved())
+ {
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_HOLDING_POKE);
+ sPSSData->state = 1;
+ }
+ else if (IsActiveItemMoving())
+ {
+ SetPSSCallback(Cb_CloseBoxWhileHoldingItem);
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ PrintStorageActionText(PC_TEXT_EXIT_BOX);
+ ShowYesNoWindow(0);
+ sPSSData->state = 2;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ case 2:
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case MENU_B_PRESSED:
+ case 1:
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 0:
+ PlaySE(SE_PC_OFF);
+ ClearBottomWindow();
+ sPSSData->state++;
+ break;
+ }
+ break;
+ case 3:
+ sub_80F9BF4(0x14, 0, 1);
+ sPSSData->state++;
+ break;
+ case 4:
+ if (!sub_80F9C30())
+ {
+ sub_80CABE0();
+ gPlayerPartyCount = CalculatePlayerPartyCount();
+ sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX;
+ SetPSSCallback(Cb_ChangeScreen);
+ }
+ break;
+ }
+}
+
+static void Cb_OnBPressed(u8 taskId)
+{
+ switch (sPSSData->state)
+ {
+ case 0:
+ if (IsMonBeingMoved())
+ {
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_HOLDING_POKE);
+ sPSSData->state = 1;
+ }
+ else if (IsActiveItemMoving())
+ {
+ SetPSSCallback(Cb_CloseBoxWhileHoldingItem);
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ PrintStorageActionText(PC_TEXT_CONTINUE_BOX);
+ ShowYesNoWindow(0);
+ sPSSData->state = 2;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ }
+ break;
+ case 2:
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case 0:
+ ClearBottomWindow();
+ SetPSSCallback(Cb_MainPSS);
+ break;
+ case 1:
+ case MENU_B_PRESSED:
+ PlaySE(SE_PC_OFF);
+ ClearBottomWindow();
+ sPSSData->state++;
+ break;
+ }
+ break;
+ case 3:
+ sub_80F9BF4(0x14, 0, 0);
+ sPSSData->state++;
+ break;
+ case 4:
+ if (!sub_80F9C30())
+ {
+ sub_80CABE0();
+ gPlayerPartyCount = CalculatePlayerPartyCount();
+ sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX;
+ SetPSSCallback(Cb_ChangeScreen);
+ }
+ break;
+ }
+}
+
+static void Cb_ChangeScreen(u8 taskId)
+{
+ struct BoxPokemon *boxMons;
+ u8 mode, monIndex, maxMonIndex;
+ u8 screenChangeType = sPSSData->screenChangeType;
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS && IsActiveItemMoving() == TRUE)
+ gUnknown_02039D12 = GetMovingItem();
+ else
+ gUnknown_02039D12 = 0;
+
+ switch (screenChangeType)
+ {
+ case SCREEN_CHANGE_EXIT_BOX:
+ default:
+ FreePSSData();
+ SetMainCallback2(Cb2_ExitPSS);
+ break;
+ case SCREEN_CHANGE_SUMMARY_SCREEN:
+ boxMons = sPSSData->field_218C.box;
+ monIndex = sPSSData->field_2187;
+ maxMonIndex = sPSSData->field_2186;
+ mode = sPSSData->field_2188;
+ FreePSSData();
+ if (mode == PSS_MODE_NORMAL && boxMons == &gUnknown_02039D14.box)
+ ShowPokemonSummaryScreenSet40EF(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS);
+ else
+ ShowPokemonSummaryScreen(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS);
+ break;
+ case SCREEN_CHANGE_NAME_BOX:
+ FreePSSData();
+ DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, Cb2_ReturnToPSS);
+ break;
+ case SCREEN_CHANGE_ITEM_FROM_BAG:
+ FreePSSData();
+ GoToBagMenu(11, 0, Cb2_ReturnToPSS);
+ break;
+ }
+
+ DestroyTask(taskId);
+}
+
+static void GiveChosenBagItem(void)
+{
+ u16 item = gSpecialVar_ItemId;
+
+ if (item != 0)
+ {
+ u8 id = GetBoxCursorPosition();
+
+ if (sInPartyMenu)
+ SetMonData(&gPlayerParty[id], MON_DATA_HELD_ITEM, &item);
+ else
+ SetCurrentBoxMonData(id, MON_DATA_HELD_ITEM, &item);
+
+ RemoveBagItem(item, 1);
+ }
+}
+
+static void FreePSSData(void)
+{
+ sub_80D25F0();
+ sub_80D01B8();
+ FREE_AND_SET_NULL(sPSSData);
+ FreeAllWindowBuffers();
+}
+
+static void SetScrollingBackground(void)
+{
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31));
+ DecompressAndLoadBgGfxUsingHeap(3, gPokemonStorageScrollingBGTileset, 0, 0, 0);
+ LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, (void *)VRAM + 0xF800);
+}
+
+static void ScrollBackground(void)
+{
+ ChangeBgX(3, 128, 1);
+ ChangeBgY(3, 128, 2);
+}
+
+static void LoadPSSMenuGfx(void)
+{
+ InitBgsFromTemplates(0, gUnknown_08572734, ARRAY_COUNT(gUnknown_08572734));
+ DecompressAndLoadBgGfxUsingHeap(1, gPSSMenu_Gfx, 0, 0, 0);
+ LZ77UnCompWram(gUnknown_085722A0, sPSSData->field_5AC4);
+ SetBgTilemapBuffer(1, sPSSData->field_5AC4);
+ ShowBg(1);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+static bool8 InitPSSWindows(void)
+{
+ if (!InitWindows(gUnknown_08572714))
+ {
+ return FALSE;
+ }
+ else
+ {
+ DeactivateAllTextPrinters();
+ return TRUE;
+ }
+}
+
+static void LoadWaveformSpritePalette(void)
+{
+ LoadSpritePalette(&gWaveformSpritePalette);
+}
+
+static void sub_80CA0D8(void)
+{
+ LoadPalette(gUnknown_085723DC, 0, 0x20);
+ LoadPalette(gUnknown_085723FC, 0x20, 0x20);
+ LoadPalette(gUnknown_085726F4, 0xF0, 0x20);
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ LoadPalette(gUnknown_0857241C, 0x30, 0x20);
+ else
+ LoadPalette(gUnknown_0857243C, 0x30, 0x20);
+
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(30));
+ LoadCursorMonSprite();
+ sub_80CA154();
+ sub_80CA1C4();
+ RefreshCursorMonData();
+}
+
+static void sub_80CA154(void)
+{
+ sPSSData->field_D94 = sub_811FFB4(TAG_TILE_10, TAG_PAL_DAC8, NULL);
+ sPSSData->field_D94->oam.priority = 1;
+ sPSSData->field_D94->subpriority = 1;
+ sPSSData->field_D94->pos1.x = 40;
+ sPSSData->field_D94->pos1.y = 150;
+ sPSSData->field_DA0 = (void*) OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(TAG_TILE_10);
+}
+
+static void sub_80CA1C4(void)
+{
+ u16 i;
+ struct SpriteSheet sheet = gWaveformSpriteSheet;
+
+ LoadSpriteSheet(&sheet);
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&sSpriteTemplate_Waveform, i * 63 + 8, 9, 2);
+ sPSSData->field_D98[i] = &gSprites[spriteId];
+ }
+}
+
+static void RefreshCursorMonData(void)
+{
+ LoadCursorMonGfx(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality);
+ PrintCursorMonInfo();
+ sub_80CA65C();
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void BoxSetMosaic(void)
+{
+ RefreshCursorMonData();
+ if (sPSSData->cursorMonSprite)
+ {
+ sPSSData->cursorMonSprite->oam.mosaic = TRUE;
+ sPSSData->cursorMonSprite->data[0] = 10;
+ sPSSData->cursorMonSprite->data[1] = 1;
+ sPSSData->cursorMonSprite->callback = sub_80CA2D0;
+ SetGpuReg(REG_OFFSET_MOSAIC, (sPSSData->cursorMonSprite->data[0] << 12) | (sPSSData->cursorMonSprite->data[0] << 8));
+ }
+}
+
+static u8 sub_80CA2B8(void)
+{
+ return sPSSData->cursorMonSprite->oam.mosaic;
+}
+
+static void sub_80CA2D0(struct Sprite *sprite)
+{
+ sprite->data[0] -= sprite->data[1];
+ if (sprite->data[0] < 0)
+ sprite->data[0] = 0;
+ SetGpuReg(REG_OFFSET_MOSAIC, (sprite->data[0] << 12) | (sprite->data[0] << 8));
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.mosaic = FALSE;
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void LoadCursorMonSprite(void)
+{
+ u16 i;
+ u16 tileStart;
+ u8 palSlot;
+ u8 spriteId;
+ struct SpriteSheet sheet = {sPSSData->field_22C4, 0x800, TAG_TILE_2};
+ struct SpritePalette palette = {sPSSData->field_2244, TAG_PAL_DAC6};
+ struct SpriteTemplate template = sSpriteTemplate_CursorMon;
+
+ for (i = 0; i < 0x800; i++)
+ sPSSData->field_22C4[i] = 0;
+ for (i = 0; i < 0x10; i++)
+ sPSSData->field_2244[i] = 0;
+
+ sPSSData->cursorMonSprite = NULL;
+
+ do
+ {
+ tileStart = LoadSpriteSheet(&sheet);
+ if (tileStart == 0)
+ break;
+
+ palSlot = LoadSpritePalette(&palette);
+ if (palSlot == 0xFF)
+ break;
+
+ spriteId = CreateSprite(&template, 40, 48, 0);
+ if (spriteId == MAX_SPRITES)
+ break;
+
+ sPSSData->cursorMonSprite = &gSprites[spriteId];
+ sPSSData->field_223A = palSlot * 16 + 0x100;
+ sPSSData->field_223C = (void*) OBJ_VRAM0 + tileStart * 32;
+ } while (0);
+
+ if (sPSSData->cursorMonSprite == NULL)
+ {
+ FreeSpriteTilesByTag(TAG_TILE_2);
+ FreeSpritePaletteByTag(TAG_PAL_DAC6);
+ }
+}
+
+static void LoadCursorMonGfx(u16 species, u32 pid)
+{
+ if (sPSSData->cursorMonSprite == NULL)
+ return;
+
+ if (species != SPECIES_NONE)
+ {
+ LoadSpecialPokePic(&gMonFrontPicTable[species], sPSSData->field_22C4, species, pid, TRUE);
+ LZ77UnCompWram(sPSSData->cursorMonPalette, sPSSData->field_2244);
+ CpuCopy32(sPSSData->field_22C4, sPSSData->field_223C, 0x800);
+ LoadPalette(sPSSData->field_2244, sPSSData->field_223A, 0x20);
+ sPSSData->cursorMonSprite->invisible = FALSE;
+ }
+ else
+ {
+ sPSSData->cursorMonSprite->invisible = TRUE;
+ }
+}
+
+static void PrintCursorMonInfo(void)
+{
+ FillWindowPixelBuffer(0, 0x11);
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 0, TEXT_SPEED_FF, NULL);
+ AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 15, TEXT_SPEED_FF, NULL);
+ AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 29, TEXT_SPEED_FF, NULL);
+ AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 43, TEXT_SPEED_FF, NULL);
+ }
+ else
+ {
+ AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 0, TEXT_SPEED_FF, NULL);
+ AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 13, TEXT_SPEED_FF, NULL);
+ AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 28, TEXT_SPEED_FF, NULL);
+ AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 42, TEXT_SPEED_FF, NULL);
+ }
+
+ CopyWindowToVram(0, 2);
+ if (sPSSData->cursorMonSpecies != SPECIES_NONE)
+ {
+ sub_8120084(sPSSData->cursorMonMarkings, sPSSData->field_DA0);
+ sPSSData->field_D94->invisible = FALSE;
+ }
+ else
+ {
+ sPSSData->field_D94->invisible = TRUE;
+ }
+}
+
+static void sub_80CA65C(void)
+{
+ u16 i;
+
+ if (sPSSData->cursorMonSpecies != SPECIES_NONE)
+ {
+ sub_80D27AC(0, 0, 0, 8, 2);
+ for (i = 0; i < 2; i++)
+ StartSpriteAnimIfDifferent(sPSSData->field_D98[i], i * 2 + 1);
+ }
+ else
+ {
+ sub_80D27AC(0, 0, 2, 8, 2);
+ for (i = 0; i < 2; i++)
+ StartSpriteAnim(sPSSData->field_D98[i], i * 2);
+ }
+
+ sub_80D2918(0);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+static void sub_80CA704(void)
+{
+ LZ77UnCompWram(gUnknown_08DD36C8, sPSSData->field_B0);
+ LoadPalette(gPSSMenu_Pal, 0x10, 0x20);
+ sub_80D2644(1, 1, sPSSData->field_B0, 12, 22);
+ sub_80D2644(2, 1, gUnknown_0857245C, 9, 4);
+ sub_80D2770(1, 10, 0);
+ sub_80D2770(2, 21, 0);
+ sub_80CAA74();
+ if (sInPartyMenu)
+ {
+ sub_80CA984(TRUE);
+ CreatePartyMonsSprites(TRUE);
+ sub_80D2918(2);
+ sub_80D2918(1);
+ }
+ else
+ {
+ sub_80D27AC(1, 0, 20, 12, 2);
+ sub_80CA984(TRUE);
+ sub_80D2918(1);
+ sub_80D2918(2);
+ }
+
+ schedule_bg_copy_tilemap_to_vram(1);
+ sPSSData->unk_02C7 = 0;
+}
+
+static void SetUpShowPartyMenu(void)
+{
+ sPSSData->field_2C0 = 20;
+ sPSSData->field_2C2 = 2;
+ sPSSData->field_2C5 = 0;
+ CreatePartyMonsSprites(FALSE);
+}
+
+static bool8 ShowPartyMenu(void)
+{
+ if (sPSSData->field_2C5 == 20)
+ return FALSE;
+
+ sPSSData->field_2C0--;
+ sPSSData->field_2C2++;
+ sub_80D27F4(1, 3, 1);
+ sub_80D2918(1);
+ schedule_bg_copy_tilemap_to_vram(1);
+ sub_80CBAF0(8);
+ if (++sPSSData->field_2C5 == 20)
+ {
+ sInPartyMenu = TRUE;
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+static void SetUpHidePartyMenu(void)
+{
+ sPSSData->field_2C0 = 0;
+ sPSSData->field_2C2 = 22;
+ sPSSData->field_2C5 = 0;
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ sub_80D11CC();
+}
+
+static bool8 HidePartyMenu(void)
+{
+ if (sPSSData->field_2C5 != 20)
+ {
+ sPSSData->field_2C0++;
+ sPSSData->field_2C2--;
+ sub_80D27F4(1, 3, -1);
+ sub_80D2918(1);
+ FillBgTilemapBufferRect_Palette0(1, 0x100, 10, sPSSData->field_2C2, 12, 1);
+ sub_80CBAF0(-8);
+ if (++sPSSData->field_2C5 != 20)
+ {
+ schedule_bg_copy_tilemap_to_vram(1);
+ return TRUE;
+ }
+ else
+ {
+ sInPartyMenu = FALSE;
+ DestroyAllPartyMonIcons();
+ CompactPartySlots();
+ sub_80D27AC(2, 0, 0, 9, 2);
+ sub_80D2918(2);
+ schedule_bg_copy_tilemap_to_vram(1);
+ return FALSE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_80CA984(bool8 arg0)
+{
+ if (arg0)
+ sub_80D27AC(2, 0, 0, 9, 2);
+ else
+ sub_80D27AC(2, 0, 2, 9, 2);
+
+ sub_80D2918(2);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+static void sub_80CA9C0(void)
+{
+ sPSSData->unk_02C7 = 1;
+ sPSSData->unk_02C8 = 30;
+ sPSSData->unk_02C9 = TRUE;
+}
+
+static void sub_80CA9EC(void)
+{
+ if (sPSSData->unk_02C7)
+ {
+ sPSSData->unk_02C7 = 0;
+ sub_80CA984(TRUE);
+ }
+}
+
+static void sub_80CAA14(void)
+{
+ if (sPSSData->unk_02C7 && ++sPSSData->unk_02C8 > 30)
+ {
+ sPSSData->unk_02C8 = 0;
+ sPSSData->unk_02C9 = (sPSSData->unk_02C9 == FALSE);
+ sub_80CA984(sPSSData->unk_02C9);
+ }
+}
+
+static void sub_80CAA74(void)
+{
+ u8 i;
+
+ for (i = 1; i < PARTY_SIZE; i++)
+ {
+ s32 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);
+ sub_80CAAA8(i, (species != SPECIES_NONE));
+ }
+}
+
+static void sub_80CAAA8(u8 arg0, bool8 isPartyMon)
+{
+ u16 i, j, index;
+ const u16 *data;
+
+ if (isPartyMon)
+ data = gUnknown_085724A4;
+ else
+ data = gUnknown_085724BC;
+
+ index = 3 * (3 * (arg0 - 1) + 1);
+ index *= 4;
+ index += 7;
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ sPSSData->field_B0[index + j] = data[j];
+ }
+ data += 4;
+ index += 12;
+ }
+}
+
+static void sub_80CAB20(void)
+{
+ sub_80CAA74();
+ sub_80D27AC(1, 0, 0, 12, 22);
+ sub_80D2918(1);
+ schedule_bg_copy_tilemap_to_vram(1);
+}
+
+static void SetUpDoShowPartyMenu(void)
+{
+ sPSSData->showPartyMenuState = 0;
+ PlaySE(SE_WIN_OPEN);
+ SetUpShowPartyMenu();
+}
+
+static bool8 DoShowPartyMenu(void)
+{
+ switch (sPSSData->showPartyMenuState)
+ {
+ case 0:
+ if (!ShowPartyMenu())
+ {
+ sub_80CDBA0();
+ sPSSData->showPartyMenuState++;
+ }
+ break;
+ case 1:
+ if (!sub_80CD554())
+ {
+ if (sPSSData->setMosaic)
+ BoxSetMosaic();
+ sPSSData->showPartyMenuState++;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void sub_80CABE0(void)
+{
+ if (gUnknown_02039D10 != StorageGetCurrentBox())
+ {
+ FlagClear(FLAG_SYS_STORAGE_UNKNOWN_FLAG);
+ VarSet(VAR_STORAGE_UNKNOWN, StorageGetCurrentBox());
+ }
+}
+
+static void sub_80CAC1C(void)
+{
+ SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29));
+ LoadUserWindowBorderGfx(1, 2, 208);
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void PrintStorageActionText(u8 id)
+{
+ u8 *txtPtr;
+
+ DynamicPlaceholderTextUtil_Reset();
+ switch (gPCStorageActionTexts[id].format)
+ {
+ case PC_TEXT_FMT_NORMAL:
+ break;
+ case PC_TEXT_FMT_MON_NAME_1:
+ case PC_TEXT_FMT_MON_NAME_2:
+ case PC_TEXT_FMT_MON_NAME_3:
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->cursorMonNick);
+ break;
+ case PC_TEXT_FMT_MON_NAME_4:
+ case PC_TEXT_FMT_MON_NAME_5:
+ case PC_TEXT_FMT_MON_NAME_6:
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->field_21E0);
+ break;
+ case PC_TEXT_FMT_ITEM_NAME:
+ if (IsActiveItemMoving())
+ txtPtr = StringCopy(sPSSData->itemName, GetMovingItemName());
+ else
+ txtPtr = StringCopy(sPSSData->itemName, sPSSData->cursorMonItemName);
+
+ while (*(txtPtr - 1) == CHAR_SPACE)
+ txtPtr--;
+
+ *txtPtr = EOS;
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->itemName);
+ break;
+ }
+
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(sPSSData->field_2190, gPCStorageActionTexts[id].text);
+ FillWindowPixelBuffer(1, 0x11);
+ AddTextPrinterParameterized(1, 1, sPSSData->field_2190, 0, 1, TEXT_SPEED_FF, NULL);
+ sub_8098858(1, 2, 14);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 2);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void ShowYesNoWindow(s8 cursorPos)
+{
+ CreateYesNoMenu(&sYesNoWindowTemplate, 11, 14, 0);
+ Menu_MoveCursorNoWrapAround(cursorPos);
+}
+
+static void ClearBottomWindow(void)
+{
+ sub_8198070(1, FALSE);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void AddWallpaperSetsMenu(void)
+{
+ InitMenu();
+ SetMenuText(18);
+ SetMenuText(19);
+ SetMenuText(20);
+ SetMenuText(21);
+ if (IsWaldaWallpaperUnlocked())
+ SetMenuText(22);
+ AddMenu();
+}
+
+static void AddWallpapersMenu(u8 wallpaperSet)
+{
+ InitMenu();
+ switch (wallpaperSet)
+ {
+ case 0:
+ SetMenuText(23);
+ SetMenuText(24);
+ SetMenuText(25);
+ SetMenuText(26);
+ break;
+ case 1:
+ SetMenuText(27);
+ SetMenuText(28);
+ SetMenuText(29);
+ SetMenuText(30);
+ break;
+ case 2:
+ SetMenuText(31);
+ SetMenuText(32);
+ SetMenuText(33);
+ SetMenuText(34);
+ break;
+ case 3:
+ SetMenuText(35);
+ SetMenuText(36);
+ SetMenuText(37);
+ SetMenuText(38);
+ break;
+ }
+ AddMenu();
+}
+
+static u8 GetCurrentBoxOption(void)
+{
+ return sCurrentBoxOption;
+}
+
+static void sub_80CAEAC(void)
+{
+ if (!IsCursorOnBox())
+ {
+ if (sInPartyMenu)
+ sub_80D0D8C(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition());
+ else
+ sub_80D0D8C(CURSOR_AREA_IN_BOX, GetBoxCursorPosition());
+ }
+
+ if (gUnknown_02039D12 != 0)
+ {
+ sub_80D0F38(gUnknown_02039D12);
+ sub_80CFE54(3);
+ }
+}
+
+static void sub_80CAF04(void)
+{
+ u16 i;
+
+ LoadMonIconPalettes();
+ for (i = 0; i < 40; i++)
+ sPSSData->field_B08[i] = 0;
+ for (i = 0; i < 40; i++)
+ sPSSData->field_B58[i] = 0;
+ for (i = 0; i < PARTY_SIZE; i++)
+ sPSSData->partySprites[i] = NULL;
+ for (i = 0; i < IN_BOX_COUNT; i++)
+ sPSSData->boxMonsSprites[i] = NULL;
+
+ sPSSData->movingMonSprite = NULL;
+ sPSSData->field_78C = 0;
+}
+
+static u8 sub_80CAFAC(void)
+{
+ return (IsCursorInBox() ? 2 : 1);
+}
+
+static void CreateMovingMonIcon(void)
+{
+ u32 personality = GetMonData(&sPSSData->movingMon, MON_DATA_PERSONALITY);
+ u16 species = GetMonData(&sPSSData->movingMon, MON_DATA_SPECIES2);
+ u8 priority = sub_80CAFAC();
+
+ sPSSData->movingMonSprite = CreateMonIconSprite(species, personality, 0, 0, priority, 7);
+ sPSSData->movingMonSprite->callback = sub_80CC100;
+}
+
+static void sub_80CB028(u8 boxId)
+{
+ u8 boxPosition;
+ u16 i, j, count;
+ u16 species;
+ u32 personality;
+
+ count = 0;
+ boxPosition = 0;
+ for (i = 0; i < IN_BOX_COLUMNS; i++)
+ {
+ for (j = 0; j < IN_BOX_ROWS; j++)
+ {
+ species = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2);
+ if (species != SPECIES_NONE)
+ {
+ personality = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY);
+ sPSSData->boxMonsSprites[count] = CreateMonIconSprite(species, personality, 8 * (3 * j) + 100, 8 * (3 * i) + 44, 2, 19 - j);
+ }
+ else
+ {
+ sPSSData->boxMonsSprites[count] = NULL;
+ }
+ boxPosition++;
+ count++;
+ }
+ }
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++)
+ {
+ if (GetBoxMonDataAt(boxId, boxPosition, MON_DATA_HELD_ITEM) == 0)
+ sPSSData->boxMonsSprites[boxPosition]->oam.objMode = 1;
+ }
+ }
+}
+
+static void sub_80CB140(u8 boxPosition)
+{
+ u16 species = GetCurrentBoxMonData(boxPosition, MON_DATA_SPECIES2);
+
+ if (species != SPECIES_NONE)
+ {
+ s16 x = 8 * (3 * (boxPosition % IN_BOX_ROWS)) + 100;
+ s16 y = 8 * (3 * (boxPosition / IN_BOX_ROWS)) + 44;
+ u32 personality = GetCurrentBoxMonData(boxPosition, MON_DATA_PERSONALITY);
+
+ sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, personality, x, y, 2, 19 - (boxPosition % IN_BOX_ROWS));
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ sPSSData->boxMonsSprites[boxPosition]->oam.objMode = 1;
+ }
+}
+
+static void sub_80CB1F0(s16 arg0)
+{
+ u16 i;
+
+ for (i = 0; i < IN_BOX_COUNT; i++)
+ {
+ if (sPSSData->boxMonsSprites[i] != NULL)
+ {
+ sPSSData->boxMonsSprites[i]->data[2] = arg0;
+ sPSSData->boxMonsSprites[i]->data[4] = 1;
+ sPSSData->boxMonsSprites[i]->callback = sub_80CB278;
+ }
+ }
+}
+
+static void sub_80CB234(struct Sprite *sprite)
+{
+ if (sprite->data[1] != 0)
+ {
+ sprite->data[1]--;
+ sprite->pos1.x += sprite->data[2];
+ }
+ else
+ {
+ sPSSData->field_C66--;
+ sprite->pos1.x = sprite->data[3];
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_80CB278(struct Sprite *sprite)
+{
+ if (sprite->data[4] != 0)
+ {
+ sprite->data[4]--;
+ }
+ else
+ {
+ sprite->pos1.x += sprite->data[2];
+ sprite->data[5] = sprite->pos1.x + sprite->pos2.x;
+ if (sprite->data[5] <= 68 || sprite->data[5] >= 252)
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void DestroyAllIconsInRow(u8 row)
+{
+ u16 column;
+ u8 boxPosition = row;
+
+ for (column = 0; column < IN_BOX_COLUMNS; column++)
+ {
+ if (sPSSData->boxMonsSprites[boxPosition] != NULL)
+ {
+ DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]);
+ sPSSData->boxMonsSprites[boxPosition] = NULL;
+ }
+ boxPosition += IN_BOX_ROWS;
+ }
+}
+
+static u8 sub_80CB2F8(u8 row, u16 times, s16 xDelta)
+{
+ s32 i;
+ u16 y = 44;
+ s16 xDest = 8 * (3 * row) + 100;
+ u16 x = xDest - ((times + 1) * xDelta);
+ u8 subpriority = 19 - row;
+ u8 count = 0;
+ u8 boxPosition = row;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ for (i = 0; i < IN_BOX_COLUMNS; i++)
+ {
+ if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE)
+ {
+ sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition],
+ sPSSData->boxPersonalities[boxPosition],
+ x, y, 2, subpriority);
+ if (sPSSData->boxMonsSprites[boxPosition] != NULL)
+ {
+ sPSSData->boxMonsSprites[boxPosition]->data[1] = times;
+ sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta;
+ sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest;
+ sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234;
+ count++;
+ }
+ }
+ boxPosition += IN_BOX_ROWS;
+ y += 24;
+ }
+ }
+ else
+ {
+ for (i = 0; i < IN_BOX_COLUMNS; i++)
+ {
+ if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE)
+ {
+ sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition],
+ sPSSData->boxPersonalities[boxPosition],
+ x, y, 2, subpriority);
+ if (sPSSData->boxMonsSprites[boxPosition] != NULL)
+ {
+ sPSSData->boxMonsSprites[boxPosition]->data[1] = times;
+ sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta;
+ sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest;
+ sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234;
+ if (GetBoxMonDataAt(sPSSData->field_C5C, boxPosition, MON_DATA_HELD_ITEM) == 0)
+ sPSSData->boxMonsSprites[boxPosition]->oam.objMode = 1;
+ count++;
+ }
+ }
+ boxPosition += IN_BOX_ROWS;
+ y += 24;
+ }
+ }
+
+ return count;
+}
+
+static void sub_80CB4CC(u8 boxId, s8 direction)
+{
+ sPSSData->field_C6A = 0;
+ sPSSData->field_C6B = boxId;
+ sPSSData->field_C69 = direction;
+ sPSSData->field_C60 = 32;
+ sPSSData->field_C64 = -(6 * direction);
+ sPSSData->field_C66 = 0;
+ SetBoxSpeciesAndPersonalities(boxId);
+ if (direction > 0)
+ sPSSData->field_C68 = 0;
+ else
+ sPSSData->field_C68 = IN_BOX_ROWS - 1;
+
+ sPSSData->field_C62 = (24 * sPSSData->field_C68) + 100;
+ sub_80CB1F0(sPSSData->field_C64);
+}
+
+static bool8 sub_80CB584(void)
+{
+ if (sPSSData->field_C60 != 0)
+ sPSSData->field_C60--;
+
+ switch (sPSSData->field_C6A)
+ {
+ case 0:
+ sPSSData->field_C62 += sPSSData->field_C64;
+ if (sPSSData->field_C62 <= 64 || sPSSData->field_C62 >= 252)
+ {
+ DestroyAllIconsInRow(sPSSData->field_C68);
+ sPSSData->field_C62 += sPSSData->field_C69 * 24;
+ sPSSData->field_C6A++;
+ }
+ break;
+ case 1:
+ sPSSData->field_C62 += sPSSData->field_C64;
+ sPSSData->field_C66 += sub_80CB2F8(sPSSData->field_C68, sPSSData->field_C60, sPSSData->field_C64);
+ if ((sPSSData->field_C69 > 0 && sPSSData->field_C68 == IN_BOX_ROWS - 1)
+ || (sPSSData->field_C69 < 0 && sPSSData->field_C68 == 0))
+ {
+ sPSSData->field_C6A++;
+ }
+ else
+ {
+ sPSSData->field_C68 += sPSSData->field_C69;
+ sPSSData->field_C6A = 0;
+ }
+ break;
+ case 2:
+ if (sPSSData->field_C66 == 0)
+ {
+ sPSSData->field_C60++;
+ return FALSE;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void SetBoxSpeciesAndPersonalities(u8 boxId)
+{
+ s32 i, j, boxPosition;
+
+ boxPosition = 0;
+ for (i = 0; i < IN_BOX_COLUMNS; i++)
+ {
+ for (j = 0; j < IN_BOX_ROWS; j++)
+ {
+ sPSSData->boxSpecies[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2);
+ if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE)
+ sPSSData->boxPersonalities[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY);
+ boxPosition++;
+ }
+ }
+
+ sPSSData->field_C5C = boxId;
+}
+
+static void DestroyBoxMonIconAtPosition(u8 boxPosition)
+{
+ if (sPSSData->boxMonsSprites[boxPosition] != NULL)
+ {
+ DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]);
+ sPSSData->boxMonsSprites[boxPosition] = NULL;
+ }
+}
+
+static void SetBoxMonIconObjMode(u8 boxPosition, u8 objMode)
+{
+ if (sPSSData->boxMonsSprites[boxPosition] != NULL)
+ {
+ sPSSData->boxMonsSprites[boxPosition]->oam.objMode = objMode;
+ }
+}
+
+static void CreatePartyMonsSprites(bool8 arg0)
+{
+ u16 i, count;
+ u16 species = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES2);
+ u32 personality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY);
+
+ sPSSData->partySprites[0] = CreateMonIconSprite(species, personality, 104, 64, 1, 12);
+ count = 1;
+ for (i = 1; i < PARTY_SIZE; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if (species != SPECIES_NONE)
+ {
+ personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
+ sPSSData->partySprites[i] = CreateMonIconSprite(species, personality, 152, 8 * (3 * (i - 1)) + 16, 1, 12);
+ count++;
+ }
+ else
+ {
+ sPSSData->partySprites[i] = NULL;
+ }
+ }
+
+ if (!arg0)
+ {
+ for (i = 0; i < count; i++)
+ {
+ sPSSData->partySprites[i]->pos1.y -= 160;
+ sPSSData->partySprites[i]->invisible = TRUE;
+ }
+ }
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (sPSSData->partySprites[i] != NULL && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == 0)
+ sPSSData->partySprites[i]->oam.objMode = 1;
+ }
+ }
+}
+
+static void sub_80CB950(void)
+{
+ u16 i, count;
+
+ sPSSData->field_C5E = 0;
+ for (i = 0, count = 0; i < PARTY_SIZE; i++)
+ {
+ if (sPSSData->partySprites[i] != NULL)
+ {
+ if (i != count)
+ {
+ sub_80CB9D0(sPSSData->partySprites[i], count);
+ sPSSData->partySprites[i] = NULL;
+ sPSSData->field_C5E++;
+ }
+ count++;
+ }
+ }
+}
+
+static u8 sub_80CB9BC(void)
+{
+ return sPSSData->field_C5E;
+}
+
+static void sub_80CB9D0(struct Sprite *sprite, u16 partyId)
+{
+ s16 x, y;
+
+ sprite->data[1] = partyId;
+ if (partyId == 0)
+ x = 104, y = 64;
+ else
+ x = 152, y = 8 * (3 * (partyId - 1)) + 16;
+
+ sprite->data[2] = (u16)(sprite->pos1.x) * 8;
+ sprite->data[3] = (u16)(sprite->pos1.y) * 8;
+ sprite->data[4] = ((x * 8) - sprite->data[2]) / 8;
+ sprite->data[5] = ((y * 8) - sprite->data[3]) / 8;
+ sprite->data[6] = 8;
+ sprite->callback = sub_80CBA3C;
+}
+
+static void sub_80CBA3C(struct Sprite *sprite)
+{
+ if (sprite->data[6] != 0)
+ {
+ s16 x = sprite->data[2] += sprite->data[4];
+ s16 y = sprite->data[3] += sprite->data[5];
+ sprite->pos1.x = x / 8u;
+ sprite->pos1.y = y / 8u;
+ sprite->data[6]--;
+ }
+ else
+ {
+ if (sprite->data[1] == 0)
+ {
+ sprite->pos1.x = 104;
+ sprite->pos1.y = 64;
+ }
+ else
+ {
+ sprite->pos1.x = 152;
+ sprite->pos1.y = 8 * (3 * (sprite->data[1] - 1)) + 16;
+ }
+ sprite->callback = SpriteCallbackDummy;
+ sPSSData->partySprites[sprite->data[1]] = sprite;
+ sPSSData->field_C5E--;
+ }
+}
+
+static void DestroyMovingMonIcon(void)
+{
+ if (sPSSData->movingMonSprite != NULL)
+ {
+ DestroyBoxMonIcon(sPSSData->movingMonSprite);
+ sPSSData->movingMonSprite = NULL;
+ }
+}
+
+static void sub_80CBAF0(s16 yDelta)
+{
+ u16 i, posY;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (sPSSData->partySprites[i] != NULL)
+ {
+ sPSSData->partySprites[i]->pos1.y += yDelta;
+ posY = sPSSData->partySprites[i]->pos1.y + sPSSData->partySprites[i]->pos2.y + sPSSData->partySprites[i]->centerToCornerVecY;
+ posY += 16;
+ if (posY > 192)
+ sPSSData->partySprites[i]->invisible = TRUE;
+ else
+ sPSSData->partySprites[i]->invisible = FALSE;
+ }
+ }
+}
+
+static void DestroyPartyMonIcon(u8 partyId)
+{
+ if (sPSSData->partySprites[partyId] != NULL)
+ {
+ DestroyBoxMonIcon(sPSSData->partySprites[partyId]);
+ sPSSData->partySprites[partyId] = NULL;
+ }
+}
+
+static void DestroyAllPartyMonIcons(void)
+{
+ u16 i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (sPSSData->partySprites[i] != NULL)
+ {
+ DestroyBoxMonIcon(sPSSData->partySprites[i]);
+ sPSSData->partySprites[i] = NULL;
+ }
+ }
+}
+
+static void SetPartyMonIconObjMode(u8 partyId, u8 objMode)
+{
+ if (sPSSData->partySprites[partyId] != NULL)
+ {
+ sPSSData->partySprites[partyId]->oam.objMode = objMode;
+ }
+}
+
+static void sub_80CBC14(u8 mode, u8 id)
+{
+ if (mode == MODE_PARTY)
+ {
+ sPSSData->movingMonSprite = sPSSData->partySprites[id];
+ sPSSData->partySprites[id] = NULL;
+ }
+ else if (mode == MODE_BOX)
+ {
+ sPSSData->movingMonSprite = sPSSData->boxMonsSprites[id];
+ sPSSData->boxMonsSprites[id] = NULL;
+ }
+ else
+ {
+ return;
+ }
+
+ sPSSData->movingMonSprite->callback = sub_80CC100;
+ sPSSData->movingMonSprite->oam.priority = sub_80CAFAC();
+ sPSSData->movingMonSprite->subpriority = 7;
+}
+
+static void sub_80CBCAC(u8 boxId, u8 position)
+{
+ if (boxId == TOTAL_BOXES_COUNT) // party mon
+ {
+ sPSSData->partySprites[position] = sPSSData->movingMonSprite;
+ sPSSData->partySprites[position]->oam.priority = 1;
+ sPSSData->partySprites[position]->subpriority = 12;
+ }
+ else
+ {
+ sPSSData->boxMonsSprites[position] = sPSSData->movingMonSprite;
+ sPSSData->boxMonsSprites[position]->oam.priority = 2;
+ sPSSData->boxMonsSprites[position]->subpriority = 19 - (position % IN_BOX_ROWS);
+ }
+ sPSSData->movingMonSprite->callback = SpriteCallbackDummy;
+ sPSSData->movingMonSprite = NULL;
+}
+
+static void sub_80CBD5C(u8 boxId, u8 position)
+{
+ if (boxId == TOTAL_BOXES_COUNT) // party mon
+ sPSSData->field_B00 = &sPSSData->partySprites[position];
+ else
+ sPSSData->field_B00 = &sPSSData->boxMonsSprites[position];
+
+ sPSSData->movingMonSprite->callback = SpriteCallbackDummy;
+ sPSSData->field_C5D = 0;
+}
+
+static bool8 sub_80CBDC4(void)
+{
+ if (sPSSData->field_C5D == 16)
+ return FALSE;
+
+ sPSSData->field_C5D++;
+ if (sPSSData->field_C5D & 1)
+ {
+ (*sPSSData->field_B00)->pos1.y--;
+ sPSSData->movingMonSprite->pos1.y++;
+ }
+
+ (*sPSSData->field_B00)->pos2.x = gSineTable[sPSSData->field_C5D * 8] / 16;
+ sPSSData->movingMonSprite->pos2.x = -(gSineTable[sPSSData->field_C5D * 8] / 16);
+ if (sPSSData->field_C5D == 8)
+ {
+ sPSSData->movingMonSprite->oam.priority = (*sPSSData->field_B00)->oam.priority;
+ sPSSData->movingMonSprite->subpriority = (*sPSSData->field_B00)->subpriority;
+ (*sPSSData->field_B00)->oam.priority = sub_80CAFAC();
+ (*sPSSData->field_B00)->subpriority = 7;
+ }
+
+ if (sPSSData->field_C5D == 16)
+ {
+ struct Sprite *sprite = sPSSData->movingMonSprite;
+ sPSSData->movingMonSprite = (*sPSSData->field_B00);
+ *sPSSData->field_B00 = sprite;
+
+ sPSSData->movingMonSprite->callback = sub_80CC100;
+ (*sPSSData->field_B00)->callback = SpriteCallbackDummy;
+ }
+
+ return TRUE;
+}
+
+static void sub_80CBF14(u8 mode, u8 position)
+{
+ switch (mode)
+ {
+ case MODE_PARTY:
+ sPSSData->field_B04 = &sPSSData->partySprites[position];
+ break;
+ case MODE_BOX:
+ sPSSData->field_B04 = &sPSSData->boxMonsSprites[position];
+ break;
+ case MODE_2:
+ sPSSData->field_B04 = &sPSSData->movingMonSprite;
+ break;
+ default:
+ return;
+ }
+
+ if (*sPSSData->field_B04 != NULL)
+ {
+ InitSpriteAffineAnim(*sPSSData->field_B04);
+ (*sPSSData->field_B04)->oam.affineMode = 1;
+ (*sPSSData->field_B04)->affineAnims = gSpriteAffineAnimTable_857291C;
+ StartSpriteAffineAnim(*sPSSData->field_B04, 0);
+ }
+}
+
+static bool8 sub_80CBFD8(void)
+{
+ if (*sPSSData->field_B04 == NULL || (*sPSSData->field_B04)->invisible)
+ return FALSE;
+
+ if ((*sPSSData->field_B04)->affineAnimEnded)
+ (*sPSSData->field_B04)->invisible = TRUE;
+
+ return TRUE;
+}
+
+static void sub_80CC020(void)
+{
+ if (*sPSSData->field_B04 != NULL)
+ {
+ FreeOamMatrix((*sPSSData->field_B04)->oam.matrixNum);
+ DestroyBoxMonIcon(*sPSSData->field_B04);
+ *sPSSData->field_B04 = NULL;
+ }
+}
+
+static void sub_80CC064(void)
+{
+ if (*sPSSData->field_B04 != NULL)
+ {
+ (*sPSSData->field_B04)->invisible = FALSE;
+ StartSpriteAffineAnim(*sPSSData->field_B04, 1);
+ }
+}
+
+static bool8 sub_80CC0A0(void)
+{
+ if (sPSSData->field_B04 == NULL)
+ return FALSE;
+
+ if ((*sPSSData->field_B04)->affineAnimEnded)
+ sPSSData->field_B04 = NULL;
+
+ return TRUE;
+}
+
+static void SetMovingMonPriority(u8 priority)
+{
+ sPSSData->movingMonSprite->oam.priority = priority;
+}
+
+static void sub_80CC100(struct Sprite *sprite)
+{
+ sprite->pos1.x = sPSSData->field_CB4->pos1.x;
+ sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 4;
+}
+
+static u16 sub_80CC124(u16 species)
+{
+ u16 i, var;
+
+ for (i = 0; i < 40; i++)
+ {
+ if (sPSSData->field_B58[i] == species)
+ break;
+ }
+
+ if (i == 40)
+ {
+ for (i = 0; i < 40; i++)
+ {
+ if (sPSSData->field_B58[i] == 0)
+ break;
+ }
+ if (i == 40)
+ return 0xFFFF;
+ }
+
+ sPSSData->field_B58[i] = species;
+ sPSSData->field_B08[i]++;
+ var = 16 * i;
+ CpuCopy32(GetMonIconTiles(species, TRUE), (void*)(OBJ_VRAM0) + var * 32, 0x200);
+
+ return var;
+}
+
+static void sub_80CC1E0(u16 species)
+{
+ u16 i;
+
+ for (i = 0; i < 40; i++)
+ {
+ if (sPSSData->field_B58[i] == species)
+ {
+ if (--sPSSData->field_B08[i] == 0)
+ sPSSData->field_B58[i] = 0;
+ break;
+ }
+ }
+}
+
+static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority)
+{
+ u16 tileNum;
+ u8 spriteId;
+ struct SpriteTemplate tempalte = gUnknown_085728D4;
+
+ species = GetIconSpecies(species, personality);
+ tempalte.paletteTag = 0xDAC0 + gMonIconPaletteIndices[species];
+ tileNum = sub_80CC124(species);
+ if (tileNum == 0xFFFF)
+ return NULL;
+
+ spriteId = CreateSprite(&tempalte, x, y, subpriority);
+ if (spriteId == MAX_SPRITES)
+ {
+ sub_80CC1E0(species);
+ return NULL;
+ }
+
+ gSprites[spriteId].oam.tileNum = tileNum;
+ gSprites[spriteId].oam.priority = oamPriority;
+ gSprites[spriteId].data[0] = species;
+ return &gSprites[spriteId];
+}
+
+static void DestroyBoxMonIcon(struct Sprite *sprite)
+{
+ sub_80CC1E0(sprite->data[0]);
+ DestroySprite(sprite);
+}
+
+static void sub_80CC32C(u8 boxId)
+{
+ u8 taskId = CreateTask(sub_80CC370, 2);
+
+ gTasks[taskId].data[2] = boxId;
+}
+
+static bool8 sub_80CC35C(void)
+{
+ return FuncIsActiveTask(sub_80CC370);
+}
+
+static void sub_80CC370(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sPSSData->field_2D2 = 0;
+ sPSSData->bg2_X = 0;
+ task->data[1] = RequestDma3Fill(0, sPSSData->field_4AC4, 0x1000, 1);
+ break;
+ case 1:
+ if (CheckForSpaceForDma3Request(task->data[1]) == -1)
+ return;
+
+ SetBgTilemapBuffer(2, sPSSData->field_4AC4);
+ ShowBg(2);
+ break;
+ case 2:
+ LoadWallpaperGfx(task->data[2], 0);
+ break;
+ case 3:
+ if (!WaitForWallpaperGfxLoad())
+ return;
+
+ sub_80CCB50(task->data[2]);
+ sub_80CD02C();
+ sub_80CB028(task->data[2]);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(27) | BGCNT_TXT512x256);
+ break;
+ case 4:
+ DestroyTask(taskId);
+ break;
+ default:
+ task->data[0] = 0;
+ return;
+ }
+
+ task->data[0]++;
+}
+
+static void SetUpScrollToBox(u8 boxId)
+{
+ s8 direction = sub_80CC644(boxId);
+
+ sPSSData->field_2CE = (direction > 0) ? 6 : -6;
+ sPSSData->field_2D3 = (direction > 0) ? 1 : 2;
+ sPSSData->field_2D0 = 32;
+ sPSSData->field_2D4 = boxId;
+ sPSSData->field_2D6 = (direction <= 0) ? 5 : 0;
+ sPSSData->field_2D8 = direction;
+ sPSSData->field_2DA = (direction > 0) ? 264 : 56;
+ sPSSData->field_2DC = (direction <= 0) ? 5 : 0;
+ sPSSData->field_2DE = 0;
+ sPSSData->field_2E0 = 2;
+ sPSSData->field_A64 = boxId;
+ sPSSData->field_A65 = direction;
+ sPSSData->field_A63 = 0;
+}
+
+static bool8 ScrollToBox(void)
+{
+ bool8 var;
+
+ switch (sPSSData->field_A63)
+ {
+ case 0:
+ LoadWallpaperGfx(sPSSData->field_A64, sPSSData->field_A65);
+ sPSSData->field_A63++;
+ case 1:
+ if (!WaitForWallpaperGfxLoad())
+ return TRUE;
+
+ sub_80CB4CC(sPSSData->field_A64, sPSSData->field_A65);
+ sub_80CCCFC(sPSSData->field_A64, sPSSData->field_A65);
+ sub_80CD0B8(sPSSData->field_A65);
+ break;
+ case 2:
+ var = sub_80CB584();
+ if (sPSSData->field_2D0 != 0)
+ {
+ sPSSData->bg2_X += sPSSData->field_2CE;
+ if (--sPSSData->field_2D0 != 0)
+ return TRUE;
+ sub_80CCEE0();
+ sub_80CD158();
+ }
+ return var;
+ }
+
+ sPSSData->field_A63++;
+ return TRUE;
+}
+
+static s8 sub_80CC644(u8 boxId)
+{
+ u8 i;
+ u8 currentBox = StorageGetCurrentBox();
+
+ for (i = 0; currentBox != boxId; i++)
+ {
+ currentBox++;
+ if (currentBox >= TOTAL_BOXES_COUNT)
+ currentBox = 0;
+ }
+
+ return (i < TOTAL_BOXES_COUNT / 2) ? 1 : -1;
+}
+
+static void SetWallpaperForCurrentBox(u8 wallpaperId)
+{
+ u8 boxId = StorageGetCurrentBox();
+ SetBoxWallpaper(boxId, wallpaperId);
+ sPSSData->wallpaperChangeState = 0;
+}
+
+static bool8 DoWallpaperGfxChange(void)
+{
+ switch (sPSSData->wallpaperChangeState)
+ {
+ case 0:
+ BeginNormalPaletteFade(sPSSData->field_738, 1, 0, 16, RGB_WHITEALPHA);
+ sPSSData->wallpaperChangeState++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ u8 curBox = StorageGetCurrentBox();
+ LoadWallpaperGfx(curBox, 0);
+ sPSSData->wallpaperChangeState++;
+ }
+ break;
+ case 2:
+ if (WaitForWallpaperGfxLoad() == TRUE)
+ {
+ sub_80CCF9C();
+ BeginNormalPaletteFade(sPSSData->field_738, 1, 16, 0, RGB_WHITEALPHA);
+ sPSSData->wallpaperChangeState++;
+ }
+ break;
+ case 3:
+ if (!UpdatePaletteFade())
+ sPSSData->wallpaperChangeState++;
+ break;
+ case 4:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void LoadWallpaperGfx(u8 boxId, s8 direction)
+{
+ u8 wallpaperId;
+ const struct WallpaperTable *wallpaperGfx;
+ void *iconGfx;
+ u32 size1, size2;
+
+ sPSSData->field_6F9 = 0;
+ sPSSData->field_6FA = boxId;
+ sPSSData->field_6FB = direction;
+ if (sPSSData->field_6FB != 0)
+ {
+ sPSSData->field_2D2 = (sPSSData->field_2D2 == 0);
+ sub_80CCAE0(sPSSData->field_4AC4);
+ }
+
+ wallpaperId = GetBoxWallpaper(sPSSData->field_6FA);
+ if (wallpaperId != WALLPAPER_FRIENDS)
+ {
+ wallpaperGfx = &gWallpaperTable[wallpaperId];
+ LZ77UnCompWram(wallpaperGfx->tileMap, sPSSData->field_792);
+ sub_80CCA3C(sPSSData->field_792, sPSSData->field_6FB, sPSSData->field_2D2);
+
+ if (sPSSData->field_6FB != 0)
+ LoadPalette(wallpaperGfx->palettes, (sPSSData->field_2D2 * 32) + 0x40, 0x40);
+ else
+ CpuCopy16(wallpaperGfx->palettes, &gPlttBufferUnfaded[(sPSSData->field_2D2 * 32) + 0x40], 0x40);
+
+ sPSSData->wallpaperTiles = malloc_and_decompress(wallpaperGfx->tiles, &size1);
+ LoadBgTiles(2, sPSSData->wallpaperTiles, size1, sPSSData->field_2D2 << 8);
+ }
+ else
+ {
+ wallpaperGfx = &gFriendsWallpaperTable[GetWaldaWallpaperPatternId()];
+ LZ77UnCompWram(wallpaperGfx->tileMap, sPSSData->field_792);
+ sub_80CCA3C(sPSSData->field_792, sPSSData->field_6FB, sPSSData->field_2D2);
+
+ CpuCopy16(wallpaperGfx->palettes, sPSSData->field_792, 0x40);
+ CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->field_792[1], 4);
+ CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->field_792[17], 4);
+
+ if (sPSSData->field_6FB != 0)
+ LoadPalette(sPSSData->field_792, (sPSSData->field_2D2 * 32) + 0x40, 0x40);
+ else
+ CpuCopy16(sPSSData->field_792, &gPlttBufferUnfaded[(sPSSData->field_2D2 * 32) + 0x40], 0x40);
+
+ sPSSData->wallpaperTiles = malloc_and_decompress(wallpaperGfx->tiles, &size1);
+ iconGfx = malloc_and_decompress(gFriendsIcons[GetWaldaWallpaperIconId()], &size2);
+ CpuCopy32(iconGfx, sPSSData->wallpaperTiles + 0x800, size2);
+ Free(iconGfx);
+ LoadBgTiles(2, sPSSData->wallpaperTiles, size1, sPSSData->field_2D2 << 8);
+ }
+
+ CopyBgTilemapBufferToVram(2);
+}
+
+static bool32 WaitForWallpaperGfxLoad(void)
+{
+ if (IsDma3ManagerBusyWithBgCopy())
+ return FALSE;
+
+ if (sPSSData->wallpaperTiles != NULL)
+ {
+ Free(sPSSData->wallpaperTiles);
+ sPSSData->wallpaperTiles = NULL;
+ }
+ return TRUE;
+}
+
+static void sub_80CCA3C(const void *tilemap, s8 direction, u8 arg2)
+{
+ s16 var = (arg2 * 2) + 3;
+ s16 x = ((sPSSData->bg2_X / 8 + 10) + (direction * 24)) & 0x3F;
+
+ CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, arg2 << 8, var);
+
+ if (direction == 0)
+ return;
+ else if (direction > 0)
+ x *= 1, x += 0x14; // x * 1 is needed to match, but can be safely removed as it makes no functional difference
+ else
+ x -= 4;
+
+ FillBgTilemapBufferRect(2, 0, x, 2, 4, 0x12, 0x11);
+}
+
+static void sub_80CCAE0(void *arg0)
+{
+ u16 i;
+ u16 *dest = arg0;
+ s16 r3 = ((sPSSData->bg2_X / 8) + 30) & 0x3F;
+
+ if (r3 <= 31)
+ dest += r3 + 0x260;
+ else
+ dest += r3 + 0x640;
+
+ for (i = 0; i < 0x2C; i++)
+ {
+ *dest++ = 0;
+ r3 = (r3 + 1) & 0x3F;
+ if (r3 == 0)
+ dest -= 0x420;
+ if (r3 == 0x20)
+ dest += 0x3e0;
+ }
+}
+
+static void sub_80CCB50(u8 boxId)
+{
+ u8 tagIndex;
+ s16 r6;
+ u16 i;
+
+ struct SpriteSheet spriteSheet = {sPSSData->field_2F8, 0x200, TAG_TILE_3};
+ struct SpritePalette palettes[] = {
+ {sPSSData->field_6FC, TAG_PAL_DAC9},
+ {}
+ };
+
+ u16 wallpaperId = GetBoxWallpaper(boxId);
+
+ sPSSData->field_6FC[14] = gUnknown_08577574[wallpaperId][0];
+ sPSSData->field_6FC[15] = gUnknown_08577574[wallpaperId][1];
+ LoadSpritePalettes(palettes);
+ sPSSData->field_738 = 0x3f0;
+
+ tagIndex = IndexOfSpritePaletteTag(TAG_PAL_DAC9);
+ sPSSData->field_71C = 0x10e + 16 * tagIndex;
+ sPSSData->field_738 |= 0x10000 << tagIndex;
+
+ tagIndex = IndexOfSpritePaletteTag(TAG_PAL_DAC9);
+ sPSSData->field_71E = 0x10e + 16 * tagIndex;
+ sPSSData->field_738 |= 0x10000 << tagIndex;
+
+ StringCopyPadded(sPSSData->field_21B8, GetBoxNamePtr(boxId), 0, 8);
+ sub_80C6D80(sPSSData->field_21B8, sPSSData->field_2F8, 0, 0, 2);
+ LoadSpriteSheet(&spriteSheet);
+ r6 = sub_80CD00C(GetBoxNamePtr(boxId));
+
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_857B0A8, r6 + i * 32, 28, 24);
+ sPSSData->field_720[i] = &gSprites[spriteId];
+ StartSpriteAnim(sPSSData->field_720[i], i);
+ }
+ sPSSData->field_6F8 = 0;
+}
+
+static void sub_80CCCFC(u8 boxId, s8 direction)
+{
+ u16 r8;
+ s16 x, x2;
+ u16 i;
+ struct SpriteSheet spriteSheet = {sPSSData->field_2F8, 0x200, TAG_TILE_3};
+ struct SpriteTemplate template = gSpriteTemplate_857B0A8;
+
+ sPSSData->field_6F8 = (sPSSData->field_6F8 == 0);
+ if (sPSSData->field_6F8 == 0)
+ {
+ spriteSheet.tag = TAG_TILE_3;
+ r8 = sPSSData->field_71C;
+ }
+ else
+ {
+ spriteSheet.tag = TAG_TILE_4;
+ r8 = sPSSData->field_71C;
+ template.tileTag = TAG_TILE_4;
+ template.paletteTag = TAG_PAL_DAC9;
+ }
+
+ StringCopyPadded(sPSSData->field_21B8, GetBoxNamePtr(boxId), 0, 8);
+ sub_80C6D80(sPSSData->field_21B8, sPSSData->field_2F8, 0, 0, 2);
+ LoadSpriteSheet(&spriteSheet);
+ LoadPalette(gUnknown_08577574[GetBoxWallpaper(boxId)], r8, 4);
+ x = sub_80CD00C(GetBoxNamePtr(boxId));
+ x2 = x;
+ x2 += direction * 192;
+
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&template, i * 32 + x2, 28, 24);
+
+ sPSSData->field_728[i] = &gSprites[spriteId];
+ sPSSData->field_728[i]->data[0] = (-direction) * 6;
+ sPSSData->field_728[i]->data[1] = i * 32 + x;
+ sPSSData->field_728[i]->data[2] = 0;
+ sPSSData->field_728[i]->callback = sub_80CCF30;
+ StartSpriteAnim(sPSSData->field_728[i], i);
+
+ sPSSData->field_720[i]->data[0] = (-direction) * 6;
+ sPSSData->field_720[i]->data[1] = 1;
+ sPSSData->field_720[i]->callback = sub_80CCF64;
+ }
+}
+
+static void sub_80CCEE0(void)
+{
+ if (sPSSData->field_6F8 == 0)
+ FreeSpriteTilesByTag(TAG_TILE_4);
+ else
+ FreeSpriteTilesByTag(TAG_TILE_3);
+
+ sPSSData->field_720[0] = sPSSData->field_728[0];
+ sPSSData->field_720[1] = sPSSData->field_728[1];
+}
+
+static void sub_80CCF30(struct Sprite *sprite)
+{
+ if (sprite->data[2] != 0)
+ sprite->data[2]--;
+ else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1])
+ sprite->callback = SpriteCallbackDummy;
+}
+
+static void sub_80CCF64(struct Sprite *sprite)
+{
+ if (sprite->data[1] != 0)
+ {
+ sprite->data[1]--;
+ }
+ else
+ {
+ sprite->pos1.x += sprite->data[0];
+ sprite->data[2] = sprite->pos1.x + sprite->pos2.x;
+ if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100)
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_80CCF9C(void)
+{
+ u8 boxId = StorageGetCurrentBox();
+ u8 wallpaperId = GetBoxWallpaper(boxId);
+ if (sPSSData->field_6F8 == 0)
+ CpuCopy16(gUnknown_08577574[wallpaperId], gPlttBufferUnfaded + sPSSData->field_71C, 4);
+ else
+ CpuCopy16(gUnknown_08577574[wallpaperId], gPlttBufferUnfaded + sPSSData->field_71E, 4);
+}
+
+static s16 sub_80CD00C(const u8 *string)
+{
+ return 0xB0 - GetStringWidth(1, string, 0) / 2;
+}
+
+static void sub_80CD02C(void)
+{
+ u16 i;
+
+ LoadSpriteSheet(&gUnknown_0857B080);
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&gUnknown_0857B0E0, 0x5c + i * 0x88, 28, 22);
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ StartSpriteAnim(sprite, i);
+ sprite->data[3] = (i == 0) ? -1 : 1;
+ sPSSData->field_730[i] = sprite;
+ }
+ }
+ if (IsCursorOnBox())
+ sub_80CD1A8(TRUE);
+}
+
+static void sub_80CD0B8(s8 direction)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ sPSSData->field_730[i]->pos2.x = 0;
+ sPSSData->field_730[i]->data[0] = 2;
+ }
+ if (direction < 0)
+ {
+ sPSSData->field_730[0]->data[1] = 29;
+ sPSSData->field_730[1]->data[1] = 5;
+ sPSSData->field_730[0]->data[2] = 0x48;
+ sPSSData->field_730[1]->data[2] = 0x48;
+ }
+ else
+ {
+ sPSSData->field_730[0]->data[1] = 5;
+ sPSSData->field_730[1]->data[1] = 29;
+ sPSSData->field_730[0]->data[2] = 0xF8;
+ sPSSData->field_730[1]->data[2] = 0xF8;
+ }
+ sPSSData->field_730[0]->data[7] = 0;
+ sPSSData->field_730[1]->data[7] = 1;
+}
+
+static void sub_80CD158(void)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ sPSSData->field_730[i]->pos1.x = 0x88 * i + 0x5c;
+ sPSSData->field_730[i]->pos2.x = 0;
+ sPSSData->field_730[i]->invisible = FALSE;
+ }
+ sub_80CD1A8(TRUE);
+}
+
+static void sub_80CD1A8(bool8 a0)
+{
+ u16 i;
+
+ if (a0)
+ {
+ for (i = 0; i < 2; i++)
+ {
+ sPSSData->field_730[i]->data[0] = 1;
+ sPSSData->field_730[i]->data[1] = 0;
+ sPSSData->field_730[i]->data[2] = 0;
+ sPSSData->field_730[i]->data[4] = 0;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 2; i++)
+ {
+ sPSSData->field_730[i]->data[0] = 0;
+ }
+ }
+}
+
+static void sub_80CD210(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos2.x = 0;
+ break;
+ case 1:
+ if (++sprite->data[1] > 3)
+ {
+ sprite->data[1] = 0;
+ sprite->pos2.x += sprite->data[3];
+ if (++sprite->data[2] > 5)
+ {
+ sprite->data[2] = 0;
+ sprite->pos2.x = 0;
+ }
+ }
+ break;
+ case 2:
+ sprite->data[0] = 3;
+ break;
+ case 3:
+ sprite->pos1.x -= sPSSData->field_2CE;
+ if (sprite->pos1.x < 73 || sprite->pos1.x > 247)
+ sprite->invisible = TRUE;
+ if (--sprite->data[1] == 0)
+ {
+ sprite->pos1.x = sprite->data[2];
+ sprite->invisible = FALSE;
+ sprite->data[0] = 4;
+ }
+ break;
+ case 4:
+ sprite->pos1.x -= sPSSData->field_2CE;
+ break;
+ }
+}
+
+static struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority)
+{
+ u8 spriteId = CreateSprite(&gUnknown_0857B0E0, x, y, subpriority);
+ if (spriteId == MAX_SPRITES)
+ return NULL;
+
+ animId %= 2;
+ StartSpriteAnim(&gSprites[spriteId], animId);
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ return &gSprites[spriteId];
+}
+
+static void sub_80CD36C(void)
+{
+ if (sPSSData->boxOption != BOX_OPTION_DEPOSIT)
+ sBoxCursorArea = CURSOR_AREA_IN_BOX;
+ else
+ sBoxCursorArea = CURSOR_AREA_IN_PARTY;
+
+ sBoxCursorPosition = 0;
+ sIsMonBeingMoved = FALSE;
+ sMovingMonOrigBoxId = 0;
+ sMovingMonOrigBoxPos = 0;
+ sCanOnlyMove = FALSE;
+ sub_80CDC0C();
+ sub_80CFC14();
+ sPSSData->field_CD6 = 1;
+ sPSSData->inBoxMovingMode = 0;
+ sub_80CEB40();
+}
+
+static void sub_80CD3EC(void)
+{
+ sub_80CFC14();
+ sub_80CEBDC();
+ sPSSData->field_CD6 = 1;
+ sPSSData->inBoxMovingMode = 0;
+ if (sIsMonBeingMoved)
+ {
+ sPSSData->movingMon = gUnknown_02039D14;
+ CreateMovingMonIcon();
+ }
+}
+
+static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y)
+{
+ switch (cursorArea)
+ {
+ case CURSOR_AREA_IN_BOX:
+ *x = (cursorPosition % IN_BOX_ROWS) * 24 + 100;
+ *y = (cursorPosition / IN_BOX_ROWS) * 24 + 32;
+ break;
+ case CURSOR_AREA_IN_PARTY:
+ if (cursorPosition == 0)
+ {
+ *x = 0x68;
+ *y = 0x34;
+ }
+ else if (cursorPosition == PARTY_SIZE)
+ {
+ *x = 0x98;
+ *y = 0x84;
+ }
+ else
+ {
+ *x = 0x98;
+ *y = (cursorPosition - 1) * 24 + 4;
+ }
+ break;
+ case CURSOR_AREA_BOX:
+ *x = 0xa2;
+ *y = 0x0c;
+ break;
+ case CURSOR_AREA_BUTTONS:
+ *y = sIsMonBeingMoved ? 8 : 14;
+ *x = cursorPosition * 0x58 + 0x78;
+ break;
+ case 4:
+ *x = 0xa0;
+ *y = 0x60;
+ break;
+ }
+}
+
+static u16 sub_80CD504(void)
+{
+ switch (sBoxCursorArea)
+ {
+ case CURSOR_AREA_IN_PARTY:
+ return GetMonData(&gPlayerParty[sBoxCursorPosition], MON_DATA_SPECIES);
+ case CURSOR_AREA_IN_BOX:
+ return GetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_SPECIES);
+ default:
+ return SPECIES_NONE;
+ }
+}
+
+static bool8 sub_80CD554(void)
+{
+ s16 tmp;
+
+ if (sPSSData->field_CD0 == 0)
+ {
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return FALSE;
+ else
+ return sub_80D1218();
+ }
+ else if (--sPSSData->field_CD0 != 0)
+ {
+ sPSSData->field_CBC += sPSSData->field_CC4;
+ sPSSData->field_CC0 += sPSSData->field_CC8;
+ sPSSData->field_CB4->pos1.x = sPSSData->field_CBC >> 8;
+ sPSSData->field_CB4->pos1.y = sPSSData->field_CC0 >> 8;
+ if (sPSSData->field_CB4->pos1.x > 0x100)
+ {
+ tmp = sPSSData->field_CB4->pos1.x - 0x100;
+ sPSSData->field_CB4->pos1.x = tmp + 0x40;
+ }
+ if (sPSSData->field_CB4->pos1.x < 0x40)
+ {
+ tmp = 0x40 - sPSSData->field_CB4->pos1.x;
+ sPSSData->field_CB4->pos1.x = 0x100 - tmp;
+ }
+ if (sPSSData->field_CB4->pos1.y > 0xb0)
+ {
+ tmp = sPSSData->field_CB4->pos1.y - 0xb0;
+ sPSSData->field_CB4->pos1.y = tmp - 0x10;
+ }
+ if (sPSSData->field_CB4->pos1.y < -0x10)
+ {
+ tmp = -0x10 - sPSSData->field_CB4->pos1.y;
+ sPSSData->field_CB4->pos1.y = 0xb0 - tmp;
+ }
+ if (sPSSData->field_CD7 && --sPSSData->field_CD7 == 0)
+ sPSSData->field_CB4->vFlip = (sPSSData->field_CB4->vFlip == FALSE);
+ }
+ else
+ {
+ sPSSData->field_CB4->pos1.x = sPSSData->field_CCC;
+ sPSSData->field_CB4->pos1.y = sPSSData->field_CCE;
+ sub_80CDA68();
+ }
+
+ return TRUE;
+}
+
+static void sub_80CD6AC(u8 newCurosrArea, u8 newCursorPosition)
+{
+ u16 x, y;
+
+ sub_80CD444(newCurosrArea, newCursorPosition, &x, &y);
+ sPSSData->field_CD4 = newCurosrArea;
+ sPSSData->field_CD5 = newCursorPosition;
+ sPSSData->field_CCC = x;
+ sPSSData->field_CCE = y;
+}
+
+static void sub_80CD70C(void)
+{
+ int r7, r0;
+
+ if (sPSSData->field_CD2 != 0 || sPSSData->field_CD3 != 0)
+ sPSSData->field_CD0 = 12;
+ else
+ sPSSData->field_CD0 = 6;
+
+ if (sPSSData->field_CD7)
+ sPSSData->field_CD7 = sPSSData->field_CD0 >> 1;
+
+ switch (sPSSData->field_CD2)
+ {
+ default:
+ r7 = sPSSData->field_CCE - sPSSData->field_CB4->pos1.y;
+ break;
+ case -1:
+ r7 = sPSSData->field_CCE - 0xc0 - sPSSData->field_CB4->pos1.y;
+ break;
+ case 1:
+ r7 = sPSSData->field_CCE + 0xc0 - sPSSData->field_CB4->pos1.y;
+ break;
+ }
+
+ switch (sPSSData->field_CD3)
+ {
+ default:
+ r0 = sPSSData->field_CCC - sPSSData->field_CB4->pos1.x;
+ break;
+ case -1:
+ r0 = sPSSData->field_CCC - 0xc0 - sPSSData->field_CB4->pos1.x;
+ break;
+ case 1:
+ r0 = sPSSData->field_CCC + 0xc0 - sPSSData->field_CB4->pos1.x;
+ break;
+ }
+
+ r7 <<= 8;
+ r0 <<= 8;
+ sPSSData->field_CC4 = r0 / sPSSData->field_CD0;
+ sPSSData->field_CC8 = r7 / sPSSData->field_CD0;
+ sPSSData->field_CBC = sPSSData->field_CB4->pos1.x << 8;
+ sPSSData->field_CC0 = sPSSData->field_CB4->pos1.y << 8;
+}
+
+static void sub_80CD894(u8 newCurosrArea, u8 newCursorPosition)
+{
+ sub_80CD6AC(newCurosrArea, newCursorPosition);
+ sub_80CD70C();
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved)
+ StartSpriteAnim(sPSSData->field_CB4, 1);
+ }
+ else
+ {
+ if (!IsActiveItemMoving())
+ StartSpriteAnim(sPSSData->field_CB4, 1);
+ }
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
+ sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
+ else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
+ sub_80D0E50(CURSOR_AREA_IN_PARTY, sBoxCursorPosition);
+
+ if (newCurosrArea == CURSOR_AREA_IN_BOX)
+ sub_80D0D8C(newCurosrArea, newCursorPosition);
+ else if (newCurosrArea == CURSOR_AREA_IN_PARTY)
+ sub_80D0D8C(newCurosrArea, newCursorPosition);
+ }
+
+ if (newCurosrArea == CURSOR_AREA_IN_PARTY && sBoxCursorArea != CURSOR_AREA_IN_PARTY)
+ {
+ sPSSData->field_CD6 = newCurosrArea;
+ sPSSData->field_CB8->invisible = TRUE;
+ }
+
+ switch (newCurosrArea)
+ {
+ case CURSOR_AREA_IN_PARTY:
+ case CURSOR_AREA_BOX:
+ case CURSOR_AREA_BUTTONS:
+ sPSSData->field_CB4->oam.priority = 1;
+ sPSSData->field_CB8->invisible = TRUE;
+ sPSSData->field_CB8->oam.priority = 1;
+ break;
+ case CURSOR_AREA_IN_BOX:
+ if (sPSSData->inBoxMovingMode != 0)
+ {
+ sPSSData->field_CB4->oam.priority = 0;
+ sPSSData->field_CB8->invisible = TRUE;
+ }
+ else
+ {
+ sPSSData->field_CB4->oam.priority = 2;
+ if (sBoxCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved)
+ SetMovingMonPriority(2);
+ }
+ break;
+ }
+}
+
+static void sub_80CDA68(void)
+{
+ sBoxCursorArea = sPSSData->field_CD4;
+ sBoxCursorPosition = sPSSData->field_CD5;
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ {
+ if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved)
+ StartSpriteAnim(sPSSData->field_CB4, 0);
+ }
+ else
+ {
+ if (!IsActiveItemMoving())
+ StartSpriteAnim(sPSSData->field_CB4, 0);
+ }
+
+ sub_80CEB40();
+ switch (sBoxCursorArea)
+ {
+ case CURSOR_AREA_BUTTONS:
+ SetMovingMonPriority(1);
+ break;
+ case CURSOR_AREA_BOX:
+ sub_80CD1A8(TRUE);
+ break;
+ case CURSOR_AREA_IN_PARTY:
+ sPSSData->field_CB8->subpriority = 13;
+ SetMovingMonPriority(1);
+ break;
+ case CURSOR_AREA_IN_BOX:
+ if (sPSSData->inBoxMovingMode == 0)
+ {
+ sPSSData->field_CB4->oam.priority = 1;
+ sPSSData->field_CB8->oam.priority = 2;
+ sPSSData->field_CB8->subpriority = 21;
+ sPSSData->field_CB8->invisible = FALSE;
+ SetMovingMonPriority(2);
+ }
+ break;
+ }
+}
+
+static void sub_80CDBA0(void)
+{
+ u8 partyCount;
+
+ if (!sIsMonBeingMoved)
+ {
+ partyCount = 0;
+ }
+ else
+ {
+ partyCount = CalculatePlayerPartyCount();
+ if (partyCount >= PARTY_SIZE)
+ partyCount = PARTY_SIZE - 1;
+ }
+ if (sPSSData->field_CB4->vFlip)
+ sPSSData->field_CD7 = 1;
+ sub_80CD894(CURSOR_AREA_IN_PARTY, partyCount);
+}
+
+static void sub_80CDBF8(u8 cursorBoxPosition)
+{
+ sub_80CD894(CURSOR_AREA_IN_BOX, cursorBoxPosition);
+}
+
+EWRAM_DATA static u8 gUnknown_02039D7E = 0;
+
+static void sub_80CDC0C(void)
+{
+ gUnknown_02039D7E = 0;
+}
+
+static void sub_80CDC18(void)
+{
+ gUnknown_02039D7E = sBoxCursorPosition;
+}
+
+static u8 sub_80CDC2C(void)
+{
+ return gUnknown_02039D7E;
+}
+
+static void InitMonPlaceChange(u8 a0)
+{
+ static bool8 (*const placeChangeFuncs[])(void) =
+ {
+ MonPlaceChange_Move,
+ MonPlaceChange_Place,
+ MonPlaceChange_Shift,
+ };
+
+ sPSSData->monPlaceChangeFunc = placeChangeFuncs[a0];
+ sPSSData->monPlaceChangeState = 0;
+}
+
+static void sub_80CDC64(bool8 arg0)
+{
+ if (!arg0)
+ sPSSData->monPlaceChangeFunc = sub_80CDEB4;
+ else
+ sPSSData->monPlaceChangeFunc = sub_80CDEC4;
+
+ sPSSData->monPlaceChangeState = 0;
+}
+
+static bool8 DoMonPlaceChange(void)
+{
+ return sPSSData->monPlaceChangeFunc();
+}
+
+static bool8 MonPlaceChange_Move(void)
+{
+ switch (sPSSData->monPlaceChangeState)
+ {
+ case 0:
+ if (sIsMonBeingMoved)
+ return FALSE;
+ StartSpriteAnim(sPSSData->field_CB4, 2);
+ sPSSData->monPlaceChangeState++;
+ break;
+ case 1:
+ if (!sub_80CDED4())
+ {
+ StartSpriteAnim(sPSSData->field_CB4, 3);
+ MoveMon();
+ sPSSData->monPlaceChangeState++;
+ }
+ break;
+ case 2:
+ if (!sub_80CDF08())
+ sPSSData->monPlaceChangeState++;
+ break;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 MonPlaceChange_Place(void)
+{
+ switch (sPSSData->monPlaceChangeState)
+ {
+ case 0:
+ if (!sub_80CDED4())
+ {
+ StartSpriteAnim(sPSSData->field_CB4, 2);
+ PlaceMon();
+ sPSSData->monPlaceChangeState++;
+ }
+ break;
+ case 1:
+ if (!sub_80CDF08())
+ {
+ StartSpriteAnim(sPSSData->field_CB4, 0);
+ sPSSData->monPlaceChangeState++;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 MonPlaceChange_Shift(void)
+{
+ switch (sPSSData->monPlaceChangeState)
+ {
+ case 0:
+ switch (sBoxCursorArea)
+ {
+ case CURSOR_AREA_IN_PARTY:
+ sPSSData->field_D91 = TOTAL_BOXES_COUNT;
+ break;
+ case CURSOR_AREA_IN_BOX:
+ sPSSData->field_D91 = StorageGetCurrentBox();
+ break;
+ default:
+ return FALSE;
+ }
+ StartSpriteAnim(sPSSData->field_CB4, 2);
+ sub_80CBD5C(sPSSData->field_D91, sBoxCursorPosition);
+ sPSSData->monPlaceChangeState++;
+ break;
+ case 1:
+ if (!sub_80CBDC4())
+ {
+ StartSpriteAnim(sPSSData->field_CB4, 3);
+ SetShiftedMonData(sPSSData->field_D91, sBoxCursorPosition);
+ sPSSData->monPlaceChangeState++;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_80CDEB4(void)
+{
+ return sub_80CDED4();
+}
+
+static bool8 sub_80CDEC4(void)
+{
+ return sub_80CDF08();
+}
+
+static bool8 sub_80CDED4(void)
+{
+ switch (sPSSData->field_CB4->pos2.y)
+ {
+ default:
+ sPSSData->field_CB4->pos2.y++;
+ break;
+ case 0:
+ sPSSData->field_CB4->pos2.y++;
+ break;
+ case 8:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_80CDF08(void)
+{
+ switch (sPSSData->field_CB4->pos2.y)
+ {
+ case 0:
+ return FALSE;
+ default:
+ sPSSData->field_CB4->pos2.y--;
+ break;
+ }
+
+ return TRUE;
+}
+
+static void MoveMon(void)
+{
+ switch (sBoxCursorArea)
+ {
+ case CURSOR_AREA_IN_PARTY:
+ SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition);
+ sub_80CBC14(MODE_PARTY, sBoxCursorPosition);
+ break;
+ case CURSOR_AREA_IN_BOX:
+ if (sPSSData->inBoxMovingMode == 0)
+ {
+ SetMovedMonData(StorageGetCurrentBox(), sBoxCursorPosition);
+ sub_80CBC14(MODE_BOX, sBoxCursorPosition);
+ }
+ break;
+ default:
+ return;
+ }
+
+ sIsMonBeingMoved = TRUE;
+}
+
+static void PlaceMon(void)
+{
+ u8 boxId;
+
+ switch (sBoxCursorArea)
+ {
+ case CURSOR_AREA_IN_PARTY:
+ SetPlacedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition);
+ sub_80CBCAC(TOTAL_BOXES_COUNT, sBoxCursorPosition);
+ break;
+ case CURSOR_AREA_IN_BOX:
+ boxId = StorageGetCurrentBox();
+ SetPlacedMonData(boxId, sBoxCursorPosition);
+ sub_80CBCAC(boxId, sBoxCursorPosition);
+ break;
+ default:
+ return;
+ }
+
+ sIsMonBeingMoved = FALSE;
+}
+
+static void sub_80CE00C(void)
+{
+ sub_80CEB40();
+}
+
+static void SetMovedMonData(u8 boxId, u8 position)
+{
+ if (boxId == TOTAL_BOXES_COUNT)
+ sPSSData->movingMon = gPlayerParty[sBoxCursorPosition];
+ else
+ BoxMonAtToMon(boxId, position, &sPSSData->movingMon);
+
+ PurgeMonOrBoxMon(boxId, position);
+ sMovingMonOrigBoxId = boxId;
+ sMovingMonOrigBoxPos = position;
+}
+
+static void SetPlacedMonData(u8 boxId, u8 position)
+{
+ if (boxId == TOTAL_BOXES_COUNT)
+ {
+ gPlayerParty[position] = sPSSData->movingMon;
+ }
+ else
+ {
+ BoxMonRestorePP(&sPSSData->movingMon.box);
+ SetBoxMonAt(boxId, position, &sPSSData->movingMon.box);
+ }
+}
+
+static void PurgeMonOrBoxMon(u8 boxId, u8 position)
+{
+ if (boxId == TOTAL_BOXES_COUNT)
+ ZeroMonData(&gPlayerParty[position]);
+ else
+ ZeroBoxMonAt(boxId, position);
+}
+
+static void SetShiftedMonData(u8 boxId, u8 position)
+{
+ if (boxId == TOTAL_BOXES_COUNT)
+ sPSSData->field_2108 = gPlayerParty[position];
+ else
+ BoxMonAtToMon(boxId, position, &sPSSData->field_2108);
+
+ SetPlacedMonData(boxId, position);
+ sPSSData->movingMon = sPSSData->field_2108;
+ SetCursorMonData(&sPSSData->movingMon, MODE_PARTY);
+ sMovingMonOrigBoxId = boxId;
+ sMovingMonOrigBoxPos = position;
+}
+
+static bool8 TryStorePartyMonInBox(u8 boxId)
+{
+ s16 boxPosition = GetFirstFreeBoxSpot(boxId);
+ if (boxPosition == -1)
+ return FALSE;
+
+ if (sIsMonBeingMoved)
+ {
+ SetPlacedMonData(boxId, boxPosition);
+ DestroyMovingMonIcon();
+ sIsMonBeingMoved = FALSE;
+ }
+ else
+ {
+ SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition);
+ SetPlacedMonData(boxId, boxPosition);
+ DestroyPartyMonIcon(sBoxCursorPosition);
+ }
+
+ if (boxId == StorageGetCurrentBox())
+ sub_80CB140(boxPosition);
+
+ StartSpriteAnim(sPSSData->field_CB4, 1);
+ return TRUE;
+}
+
+static void sub_80CE22C(void)
+{
+ StartSpriteAnim(sPSSData->field_CB4, 0);
+ sub_80CEB40();
+}
+
+static void sub_80CE250(void)
+{
+ u8 mode;
+
+ if (sIsMonBeingMoved)
+ mode = MODE_2;
+ else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
+ mode = MODE_PARTY;
+ else
+ mode = MODE_BOX;
+
+ sub_80CBF14(mode, sBoxCursorPosition);
+ StringCopy(sPSSData->field_21E0, sPSSData->cursorMonNick);
+}
+
+static bool8 sub_80CE2A8(void)
+{
+ if (!sub_80CBFD8())
+ {
+ StartSpriteAnim(sPSSData->field_CB4, 0);
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+static void ReleaseMon(void)
+{
+ u8 boxId;
+
+ sub_80CC020();
+ if (sIsMonBeingMoved)
+ {
+ sIsMonBeingMoved = FALSE;
+ }
+ else
+ {
+ if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
+ boxId = TOTAL_BOXES_COUNT;
+ else
+ boxId = StorageGetCurrentBox();
+
+ PurgeMonOrBoxMon(boxId, sBoxCursorPosition);
+ }
+ sub_80CEB40();
+}
+
+static void sub_80CE324(void)
+{
+ if (sIsMonBeingMoved)
+ StartSpriteAnim(sPSSData->field_CB4, 3);
+}
+
+struct
+{
+ s8 mapGroup;
+ s8 mapNum;
+ u16 move;
+} static const gUnknown_0857B9A4[] =
+{
+ {MAP_GROUPS_COUNT, 0, MOVE_SURF},
+ {MAP_GROUPS_COUNT, 0, MOVE_DIVE},
+ {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_STRENGTH},
+ {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_ROCK_SMASH},
+ {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_STRENGTH},
+ {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_ROCK_SMASH},
+};
+
+static void sub_80CE350(u16 *moves)
+{
+ s32 i;
+
+ for (i = 0; i < ARRAY_COUNT(gUnknown_0857B9A4); i++)
+ {
+ if (gUnknown_0857B9A4[i].mapGroup == MAP_GROUPS_COUNT
+ || (gUnknown_0857B9A4[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gUnknown_0857B9A4[i].mapNum == gSaveBlock1Ptr->location.mapNum))
+ {
+ *moves = gUnknown_0857B9A4[i].move;
+ moves++;
+ }
+ }
+
+ *moves = MOVES_COUNT;
+}
+
+static void InitCanRelaseMonVars(void)
+{
+ if (!AtLeastThreeUsableMons())
+ {
+ sPSSData->field_216D = 1;
+ sPSSData->field_216C = 0;
+ return;
+ }
+
+ if (sIsMonBeingMoved)
+ {
+ sPSSData->field_2108 = sPSSData->movingMon;
+ sPSSData->field_2170 = -1;
+ sPSSData->field_2171 = -1;
+ }
+ else
+ {
+ if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
+ {
+ sPSSData->field_2108 = gPlayerParty[sBoxCursorPosition];
+ sPSSData->field_2170 = TOTAL_BOXES_COUNT;
+ }
+ else
+ {
+ BoxMonAtToMon(StorageGetCurrentBox(), sBoxCursorPosition, &sPSSData->field_2108);
+ sPSSData->field_2170 = StorageGetCurrentBox();
+ }
+ sPSSData->field_2171 = sBoxCursorPosition;
+ }
+
+ sub_80CE350(sPSSData->field_2176);
+ sPSSData->field_2174 = GetMonData(&sPSSData->field_2108, MON_DATA_KNOWN_MOVES, sPSSData->field_2176);
+ if (sPSSData->field_2174 != 0)
+ {
+ sPSSData->field_216D = 0;
+ }
+ else
+ {
+ sPSSData->field_216D = 1;
+ sPSSData->field_216C = 1;
+ }
+
+ sPSSData->field_2172 = 0;
+}
+
+static bool32 AtLeastThreeUsableMons(void)
+{
+ s32 i, j, count;
+
+ count = (sIsMonBeingMoved != FALSE);
+ for (j = 0; j < PARTY_SIZE; j++)
+ {
+ if (GetMonData(&gPlayerParty[j], MON_DATA_SANITY_HAS_SPECIES))
+ count++;
+ }
+
+ if (count >= 3)
+ return TRUE;
+
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (CheckBoxMonSanityAt(i, j))
+ {
+ if (++count >= 3)
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+static s8 RunCanReleaseMon(void)
+{
+ u16 i;
+ u16 knownMoves;
+
+ if (sPSSData->field_216D)
+ return sPSSData->field_216C;
+
+ switch (sPSSData->field_2172)
+ {
+ case 0:
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (sPSSData->field_2170 != TOTAL_BOXES_COUNT || sPSSData->field_2171 != i)
+ {
+ knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, sPSSData->field_2176);
+ sPSSData->field_2174 &= ~(knownMoves);
+ }
+ }
+ if (sPSSData->field_2174 == 0)
+ {
+ sPSSData->field_216D = 1;
+ sPSSData->field_216C = 1;
+ }
+ else
+ {
+ sPSSData->field_216E = 0;
+ sPSSData->field_216F = 0;
+ sPSSData->field_2172++;
+ }
+ break;
+ case 1:
+ for (i = 0; i < IN_BOX_COUNT; i++)
+ {
+ knownMoves = GetAndCopyBoxMonDataAt(sPSSData->field_216E, sPSSData->field_216F, MON_DATA_KNOWN_MOVES, sPSSData->field_2176);
+ if (knownMoves != 0
+ && !(sPSSData->field_2170 == sPSSData->field_216E && sPSSData->field_2171 == sPSSData->field_216F))
+ {
+ sPSSData->field_2174 &= ~(knownMoves);
+ if (sPSSData->field_2174 == 0)
+ {
+ sPSSData->field_216D = 1;
+ sPSSData->field_216C = 1;
+ break;
+ }
+ }
+ if (++sPSSData->field_216F >= IN_BOX_COUNT)
+ {
+ sPSSData->field_216F = 0;
+ if (++sPSSData->field_216E >= TOTAL_BOXES_COUNT)
+ {
+ sPSSData->field_216D = 1;
+ sPSSData->field_216C = 0;
+ }
+ }
+ }
+ break;
+ }
+
+ return -1;
+}
+
+static void sub_80CE760(void)
+{
+ if (sIsMonBeingMoved)
+ gUnknown_02039D14 = sPSSData->movingMon;
+}
+
+static void sub_80CE790(void)
+{
+ if (sIsMonBeingMoved)
+ {
+ if (sMovingMonOrigBoxId == TOTAL_BOXES_COUNT)
+ sPSSData->movingMon = gUnknown_02039D14;
+ else
+ sPSSData->movingMon.box = gUnknown_02039D14.box;
+ }
+}
+
+static void sub_80CE7E8(void)
+{
+ if (sIsMonBeingMoved)
+ {
+ sub_80CE760();
+ sPSSData->field_218C.mon = &gUnknown_02039D14;
+ sPSSData->field_2187 = 0;
+ sPSSData->field_2186 = 0;
+ sPSSData->field_2188 = 0;
+ }
+ else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
+ {
+ sPSSData->field_218C.mon = gPlayerParty;
+ sPSSData->field_2187 = sBoxCursorPosition;
+ sPSSData->field_2186 = CountPartyMons() - 1;
+ sPSSData->field_2188 = 0;
+ }
+ else
+ {
+ sPSSData->field_218C.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0);
+ sPSSData->field_2187 = sBoxCursorPosition;
+ sPSSData->field_2186 = IN_BOX_COUNT - 1;
+ sPSSData->field_2188 = 2;
+ }
+}
+
+static void sub_80CE8E4(void)
+{
+ if (sIsMonBeingMoved)
+ sub_80CE790();
+ else
+ sBoxCursorPosition = gUnknown_0203CF20;
+}
+
+s16 CompactPartySlots(void)
+{
+ s16 retVal = -1;
+ u16 i, last;
+
+ for (i = 0, last = 0; i < PARTY_SIZE; i++)
+ {
+ u16 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);
+ if (species != SPECIES_NONE)
+ {
+ if (i != last)
+ gPlayerParty[last] = gPlayerParty[i];
+ last++;
+ }
+ else if (retVal == -1)
+ {
+ retVal = i;
+ }
+ }
+ for (; last < PARTY_SIZE; last++)
+ ZeroMonData(gPlayerParty + last);
+
+ return retVal;
+}
+
+static void SetMonMarkings(u8 markings)
+{
+ sPSSData->cursorMonMarkings = markings;
+ if (sIsMonBeingMoved)
+ {
+ SetMonData(&sPSSData->movingMon, MON_DATA_MARKINGS, &markings);
+ }
+ else
+ {
+ if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
+ SetMonData(gPlayerParty + sBoxCursorPosition, MON_DATA_MARKINGS, &markings);
+ if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
+ SetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_MARKINGS, &markings);
+ }
+}
+
+static bool8 CanMovePartyMon(void)
+{
+ if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 CanShiftMon(void)
+{
+ if (sIsMonBeingMoved)
+ {
+ if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0)
+ {
+ if (sPSSData->cursorMonIsEgg || GetMonData(&sPSSData->movingMon, MON_DATA_HP) == 0)
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 IsMonBeingMoved(void)
+{
+ return sIsMonBeingMoved;
+}
+
+static bool8 IsCursorOnBox(void)
+{
+ return (sBoxCursorArea == CURSOR_AREA_BOX);
+}
+
+static bool8 IsCursorOnCloseBox(void)
+{
+ return (sBoxCursorArea == CURSOR_AREA_BUTTONS && sBoxCursorPosition == 1);
+}
+
+static bool8 IsCursorInBox(void)
+{
+ return (sBoxCursorArea == CURSOR_AREA_IN_BOX);
+}
+
+static void sub_80CEB40(void)
+{
+ sPSSData->setMosaic = (sIsMonBeingMoved == FALSE);
+ if (!sIsMonBeingMoved)
+ {
+ switch (sBoxCursorArea)
+ {
+ case CURSOR_AREA_IN_PARTY:
+ if (sBoxCursorPosition < PARTY_SIZE)
+ {
+ SetCursorMonData(&gPlayerParty[sBoxCursorPosition], MODE_PARTY);
+ break;
+ }
+ // fallthrough
+ case CURSOR_AREA_BUTTONS:
+ case CURSOR_AREA_BOX:
+ SetCursorMonData(NULL, MODE_2);
+ break;
+ case CURSOR_AREA_IN_BOX:
+ SetCursorMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sBoxCursorPosition), MODE_BOX);
+ break;
+ }
+ }
+}
+
+static void sub_80CEBDC(void)
+{
+ if (sIsMonBeingMoved)
+ SetCursorMonData(&gUnknown_02039D14, MODE_PARTY);
+ else
+ sub_80CEB40();
+}
+
+static void SetCursorMonData(void *pokemon, u8 mode)
+{
+ u8 *txtPtr;
+ u16 gender;
+ bool8 sanityIsBagEgg;
+
+ sPSSData->cursorMonItem = 0;
+ gender = MON_MALE;
+ sanityIsBagEgg = FALSE;
+ if (mode == MODE_PARTY)
+ {
+ struct Pokemon *mon = (struct Pokemon *)pokemon;
+
+ sPSSData->cursorMonSpecies = GetMonData(mon, MON_DATA_SPECIES2);
+ if (sPSSData->cursorMonSpecies != SPECIES_NONE)
+ {
+ sanityIsBagEgg = GetMonData(mon, MON_DATA_SANITY_IS_BAD_EGG);
+ if (sanityIsBagEgg)
+ sPSSData->cursorMonIsEgg = TRUE;
+ else
+ sPSSData->cursorMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG);
+
+ GetMonData(mon, MON_DATA_NICKNAME, sPSSData->cursorMonNick);
+ StringGetEnd10(sPSSData->cursorMonNick);
+ sPSSData->cursorMonLevel = GetMonData(mon, MON_DATA_LEVEL);
+ sPSSData->cursorMonMarkings = GetMonData(mon, MON_DATA_MARKINGS);
+ sPSSData->cursorMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY);
+ sPSSData->cursorMonPalette = GetMonFrontSpritePal(mon);
+ gender = GetMonGender(mon);
+ sPSSData->cursorMonItem = GetMonData(mon, MON_DATA_HELD_ITEM);
+ }
+ }
+ else if (mode == MODE_BOX)
+ {
+ struct BoxPokemon *boxMon = (struct BoxPokemon *)pokemon;
+
+ sPSSData->cursorMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES2);
+ if (sPSSData->cursorMonSpecies != SPECIES_NONE)
+ {
+ u32 otId = GetBoxMonData(boxMon, MON_DATA_OT_ID);
+ sanityIsBagEgg = GetBoxMonData(boxMon, MON_DATA_SANITY_IS_BAD_EGG);
+ if (sanityIsBagEgg)
+ sPSSData->cursorMonIsEgg = TRUE;
+ else
+ sPSSData->cursorMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG);
+
+
+ GetBoxMonData(boxMon, MON_DATA_NICKNAME, sPSSData->cursorMonNick);
+ StringGetEnd10(sPSSData->cursorMonNick);
+ sPSSData->cursorMonLevel = GetLevelFromBoxMonExp(boxMon);
+ sPSSData->cursorMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS);
+ sPSSData->cursorMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY);
+ sPSSData->cursorMonPalette = GetFrontSpritePalFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, otId, sPSSData->cursorMonPersonality);
+ gender = GetGenderFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality);
+ sPSSData->cursorMonItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM);
+ }
+ }
+ else
+ {
+ sPSSData->cursorMonSpecies = SPECIES_NONE;
+ sPSSData->cursorMonItem = 0;
+ }
+
+ if (sPSSData->cursorMonSpecies == SPECIES_NONE)
+ {
+ StringFill(sPSSData->cursorMonNick, CHAR_SPACE, 5);
+ StringFill(sPSSData->cursorMonNickText, CHAR_SPACE, 8);
+ StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8);
+ StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8);
+ StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8);
+ }
+ else if (sPSSData->cursorMonIsEgg)
+ {
+ if (sanityIsBagEgg)
+ StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5);
+ else
+ StringCopyPadded(sPSSData->cursorMonNickText, gText_EggNickname, CHAR_SPACE, 8);
+
+ StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8);
+ StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8);
+ StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8);
+ }
+ else
+ {
+ if (sPSSData->cursorMonSpecies == SPECIES_NIDORAN_F || sPSSData->cursorMonSpecies == SPECIES_NIDORAN_M)
+ gender = MON_GENDERLESS;
+
+ StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5);
+
+ txtPtr = sPSSData->cursorMonSpeciesName;
+ *(txtPtr)++ = CHAR_SLASH;
+ StringCopyPadded(txtPtr, gSpeciesNames[sPSSData->cursorMonSpecies], CHAR_SPACE, 5);
+
+ txtPtr = sPSSData->cursorMonGenderLvlText;
+ *(txtPtr)++ = EXT_CTRL_CODE_BEGIN;
+ *(txtPtr)++ = 4;
+ switch (gender)
+ {
+ case MON_MALE:
+ *(txtPtr)++ = 4;
+ *(txtPtr)++ = 1;
+ *(txtPtr)++ = 5;
+ *(txtPtr)++ = CHAR_MALE;
+ break;
+ case MON_FEMALE:
+ *(txtPtr)++ = 6;
+ *(txtPtr)++ = 1;
+ *(txtPtr)++ = 7;
+ *(txtPtr)++ = CHAR_FEMALE;
+ break;
+ default:
+ *(txtPtr)++ = 2;
+ *(txtPtr)++ = 1;
+ *(txtPtr)++ = 3;
+ *(txtPtr)++ = 0x77;
+ break;
+ }
+
+ *(txtPtr++) = EXT_CTRL_CODE_BEGIN;
+ *(txtPtr++) = 4;
+ *(txtPtr++) = 2;
+ *(txtPtr++) = 1;
+ *(txtPtr++) = 3;
+ *(txtPtr++) = 0;
+ *(txtPtr++) = CHAR_SPECIAL_F9;
+ *(txtPtr++) = 5;
+
+ txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3);
+ txtPtr[0] = CHAR_SPACE;
+ txtPtr[1] = EOS;
+
+ if (sPSSData->cursorMonItem != 0)
+ StringCopyPadded(sPSSData->cursorMonItemName, ItemId_GetName(sPSSData->cursorMonItem), CHAR_SPACE, 8);
+ else
+ StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8);
+ }
+}
+
+static u8 HandleInput_InBox(void)
+{
+ switch (sPSSData->inBoxMovingMode)
+ {
+ case 0:
+ default:
+ return InBoxInput_Normal();
+ case 1:
+ return InBoxInput_GrabbingMultiple();
+ case 2:
+ return InBoxInput_MovingMultiple();
+ }
+}
+
+// This group of four functions handling input simply CANNOT be matched.
+// GF must have written them in a really weird way, a way not a sane person could dream to reproduce.
+#ifdef NONMATCHING
+static u8 InBoxInput_Normal(void)
+{
+ u8 retVal;
+ s8 cursorArea = sBoxCursorArea;
+ s8 cursorPosition = sBoxCursorPosition;
+
+ sPSSData->field_CD2 = 0;
+ sPSSData->field_CD3 = 0;
+ sPSSData->field_CD7 = 0;
+ retVal = 0;
+ if (!(gMain.newAndRepeatedKeys & DPAD_UP))
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ retVal = TRUE;
+ cursorPosition += IN_BOX_ROWS;
+ if (cursorPosition >= IN_BOX_COUNT)
+ {
+ cursorArea = CURSOR_AREA_BUTTONS;
+ cursorPosition -= IN_BOX_COUNT;
+ cursorPosition /= 3;
+ sPSSData->field_CD2 = 1;
+ sPSSData->field_CD7 = 1;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ retVal = TRUE;
+ if (sBoxCursorPosition % IN_BOX_ROWS != 0)
+ {
+ cursorPosition--;
+ }
+ else
+ {
+ sPSSData->field_CD3 = -1;
+ cursorPosition += (IN_BOX_ROWS - 1);
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ retVal = TRUE;
+ if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0)
+ {
+ cursorPosition++;
+ }
+ else
+ {
+ sPSSData->field_CD3 = 1;
+ cursorPosition -= (IN_BOX_ROWS - 1);
+ }
+ }
+ else if (gMain.newKeys & START_BUTTON)
+ {
+ retVal = TRUE;
+ cursorArea = CURSOR_AREA_BOX;
+ cursorPosition = 0;
+ }
+ else
+ {
+ if ((gMain.newKeys & A_BUTTON) && sub_80CFA5C())
+ {
+ if (!sCanOnlyMove)
+ return 8;
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE)
+ {
+ switch (sub_80CFF98(0))
+ {
+ case 1:
+ return 11;
+ case 2:
+ return 12;
+ case 3:
+ return 13;
+ case 4:
+ return 14;
+ case 5:
+ return 15;
+ case 12:
+ return 16;
+ case 13:
+ return 17;
+ case 15:
+ return 18;
+ }
+ }
+ else
+ {
+ sPSSData->inBoxMovingMode = 1;
+ return 20;
+ }
+ }
+
+ if (gMain.newKeys & B_BUTTON)
+ return 19;
+
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.heldKeys & L_BUTTON)
+ return 10;
+ if (gMain.heldKeys & R_BUTTON)
+ return 9;
+ }
+
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_80CFDC4();
+ return 0;
+ }
+ retVal = FALSE;
+ }
+ }
+ else
+ {
+ retVal = TRUE;
+ if (sBoxCursorPosition >= IN_BOX_ROWS)
+ {
+ cursorPosition -= IN_BOX_ROWS;
+ }
+ else
+ {
+ cursorArea = CURSOR_AREA_BOX;
+ cursorPosition = 0;
+ }
+ }
+
+ if (retVal)
+ sub_80CD894(cursorArea, cursorPosition);
+
+ return retVal;
+}
+#else
+NAKED
+static u8 InBoxInput_Normal(void)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ ldr r0, =sBoxCursorArea\n\
+ ldrb r0, [r0]\n\
+ mov r8, r0\n\
+ ldr r2, =sBoxCursorPosition\n\
+ ldrb r4, [r2]\n\
+ ldr r5, =sPSSData\n\
+ ldr r0, [r5]\n\
+ ldr r1, =0x00000cd2\n\
+ mov r10, r1\n\
+ add r0, r10\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ ldr r0, [r5]\n\
+ ldr r7, =0x00000cd3\n\
+ adds r0, r7\n\
+ strb r1, [r0]\n\
+ ldr r0, [r5]\n\
+ ldr r3, =0x00000cd7\n\
+ mov r9, r3\n\
+ add r0, r9\n\
+ strb r1, [r0]\n\
+ ldr r6, =gMain\n\
+ ldrh r1, [r6, 0x30]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ adds r3, r2, 0\n\
+ cmp r0, 0\n\
+ beq _080CF14C\n\
+ b _080CF33C\n\
+_080CF14C:\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF1A8\n\
+ movs r6, 0x1\n\
+ lsls r0, r4, 24\n\
+ movs r1, 0xC0\n\
+ lsls r1, 19\n\
+ adds r0, r1\n\
+ lsrs r4, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x1D\n\
+ bgt _080CF168\n\
+ b _080CF358\n\
+_080CF168:\n\
+ movs r2, 0x3\n\
+ mov r8, r2\n\
+ subs r0, 0x1E\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x3\n\
+ bl __divsi3\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldr r0, [r5]\n\
+ add r0, r10\n\
+ strb r6, [r0]\n\
+ ldr r0, [r5]\n\
+ add r0, r9\n\
+ strb r6, [r0]\n\
+ b _080CF358\n\
+ .pool\n\
+_080CF1A8:\n\
+ movs r0, 0x20\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF1DE\n\
+ movs r6, 0x1\n\
+ movs r0, 0\n\
+ ldrsb r0, [r3, r0]\n\
+ movs r1, 0x6\n\
+ bl __modsi3\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080CF1CA\n\
+ lsls r0, r4, 24\n\
+ movs r3, 0xFF\n\
+ lsls r3, 24\n\
+ b _080CF34C\n\
+_080CF1CA:\n\
+ ldr r0, [r5]\n\
+ adds r0, r7\n\
+ movs r1, 0xFF\n\
+ strb r1, [r0]\n\
+ lsls r0, r4, 24\n\
+ movs r1, 0xA0\n\
+ lsls r1, 19\n\
+ adds r0, r1\n\
+ lsrs r4, r0, 24\n\
+ b _080CF358\n\
+_080CF1DE:\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF212\n\
+ movs r6, 0x1\n\
+ movs r0, 0\n\
+ ldrsb r0, [r3, r0]\n\
+ adds r0, 0x1\n\
+ movs r1, 0x6\n\
+ bl __modsi3\n\
+ cmp r0, 0\n\
+ beq _080CF204\n\
+ lsls r0, r4, 24\n\
+ movs r2, 0x80\n\
+ lsls r2, 17\n\
+ adds r0, r2\n\
+ lsrs r4, r0, 24\n\
+ b _080CF358\n\
+_080CF204:\n\
+ ldr r0, [r5]\n\
+ adds r0, r7\n\
+ strb r6, [r0]\n\
+ lsls r0, r4, 24\n\
+ movs r3, 0xFB\n\
+ lsls r3, 24\n\
+ b _080CF34C\n\
+_080CF212:\n\
+ ldrh r1, [r6, 0x2E]\n\
+ movs r0, 0x8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF220\n\
+ movs r6, 0x1\n\
+ b _080CF352\n\
+_080CF220:\n\
+ movs r4, 0x1\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF2E4\n\
+ bl sub_80CFA5C\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080CF2E4\n\
+ ldr r0, =sCanOnlyMove\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080CF244\n\
+ movs r0, 0x8\n\
+ b _080CF366\n\
+ .pool\n\
+_080CF244:\n\
+ ldr r1, [r5]\n\
+ ldrb r0, [r1, 0x1]\n\
+ cmp r0, 0x2\n\
+ bne _080CF254\n\
+ ldr r0, =sIsMonBeingMoved\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _080CF2D4\n\
+_080CF254:\n\
+ movs r0, 0\n\
+ bl sub_80CFF98\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0xE\n\
+ bhi _080CF2E4\n\
+ lsls r0, 2\n\
+ ldr r1, =_080CF278\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
+_080CF278:\n\
+ .4byte _080CF2B4\n\
+ .4byte _080CF2B8\n\
+ .4byte _080CF2BC\n\
+ .4byte _080CF2C0\n\
+ .4byte _080CF2C4\n\
+ .4byte _080CF2E4\n\
+ .4byte _080CF2E4\n\
+ .4byte _080CF2E4\n\
+ .4byte _080CF2E4\n\
+ .4byte _080CF2E4\n\
+ .4byte _080CF2E4\n\
+ .4byte _080CF2C8\n\
+ .4byte _080CF2CC\n\
+ .4byte _080CF2E4\n\
+ .4byte _080CF2D0\n\
+_080CF2B4:\n\
+ movs r0, 0xB\n\
+ b _080CF366\n\
+_080CF2B8:\n\
+ movs r0, 0xC\n\
+ b _080CF366\n\
+_080CF2BC:\n\
+ movs r0, 0xD\n\
+ b _080CF366\n\
+_080CF2C0:\n\
+ movs r0, 0xE\n\
+ b _080CF366\n\
+_080CF2C4:\n\
+ movs r0, 0xF\n\
+ b _080CF366\n\
+_080CF2C8:\n\
+ movs r0, 0x10\n\
+ b _080CF366\n\
+_080CF2CC:\n\
+ movs r0, 0x11\n\
+ b _080CF366\n\
+_080CF2D0:\n\
+ movs r0, 0x12\n\
+ b _080CF366\n\
+_080CF2D4:\n\
+ ldr r2, =0x000021ff\n\
+ adds r0, r1, r2\n\
+ strb r4, [r0]\n\
+ movs r0, 0x14\n\
+ b _080CF366\n\
+ .pool\n\
+_080CF2E4:\n\
+ ldr r2, =gMain\n\
+ ldrh r1, [r2, 0x2E]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF2F8\n\
+ movs r0, 0x13\n\
+ b _080CF366\n\
+ .pool\n\
+_080CF2F8:\n\
+ ldr r0, =gSaveBlock2Ptr\n\
+ ldr r0, [r0]\n\
+ ldrb r0, [r0, 0x13]\n\
+ cmp r0, 0x1\n\
+ bne _080CF326\n\
+ ldrh r1, [r2, 0x2C]\n\
+ movs r0, 0x80\n\
+ lsls r0, 2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF318\n\
+ movs r0, 0xA\n\
+ b _080CF366\n\
+ .pool\n\
+_080CF318:\n\
+ movs r0, 0x80\n\
+ lsls r0, 1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF326\n\
+ movs r0, 0x9\n\
+ b _080CF366\n\
+_080CF326:\n\
+ ldrh r1, [r2, 0x2E]\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF338\n\
+ bl sub_80CFDC4\n\
+ movs r0, 0\n\
+ b _080CF366\n\
+_080CF338:\n\
+ movs r6, 0\n\
+ b _080CF364\n\
+_080CF33C:\n\
+ movs r6, 0x1\n\
+ movs r0, 0\n\
+ ldrsb r0, [r2, r0]\n\
+ cmp r0, 0x5\n\
+ ble _080CF352\n\
+ lsls r0, r4, 24\n\
+ movs r3, 0xFA\n\
+ lsls r3, 24\n\
+_080CF34C:\n\
+ adds r0, r3\n\
+ lsrs r4, r0, 24\n\
+ b _080CF358\n\
+_080CF352:\n\
+ movs r0, 0x2\n\
+ mov r8, r0\n\
+ movs r4, 0\n\
+_080CF358:\n\
+ cmp r6, 0\n\
+ beq _080CF364\n\
+ mov r0, r8\n\
+ adds r1, r4, 0\n\
+ bl sub_80CD894\n\
+_080CF364:\n\
+ adds r0, r6, 0\n\
+_080CF366:\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ ");
+}
+#endif
+
+static u8 InBoxInput_GrabbingMultiple(void)
+{
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (sBoxCursorPosition / IN_BOX_ROWS != 0)
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS);
+ return 21;
+ }
+ else
+ {
+ return 24;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (sBoxCursorPosition + IN_BOX_ROWS < IN_BOX_COUNT)
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS);
+ return 21;
+ }
+ else
+ {
+ return 24;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (sBoxCursorPosition % IN_BOX_ROWS != 0)
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1);
+ return 21;
+ }
+ else
+ {
+ return 24;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0)
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1);
+ return 21;
+ }
+ else
+ {
+ return 24;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ if (sub_80D0BA4() == sBoxCursorPosition)
+ {
+ sPSSData->inBoxMovingMode = 0;
+ sPSSData->field_CB8->invisible = FALSE;
+ return 22;
+ }
+ else
+ {
+ sIsMonBeingMoved = (sPSSData->cursorMonSpecies != SPECIES_NONE);
+ sPSSData->inBoxMovingMode = 2;
+ sMovingMonOrigBoxId = StorageGetCurrentBox();
+ return 23;
+ }
+ }
+}
+
+static u8 InBoxInput_MovingMultiple(void)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (sub_80D0580(0))
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS);
+ return 25;
+ }
+ else
+ {
+ return 24;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (sub_80D0580(1))
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS);
+ return 25;
+ }
+ else
+ {
+ return 24;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (sub_80D0580(2))
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1);
+ return 25;
+ }
+ else
+ {
+ return 10;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (sub_80D0580(3))
+ {
+ sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1);
+ return 25;
+ }
+ else
+ {
+ return 9;
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (sub_80D0BC0())
+ {
+ sIsMonBeingMoved = FALSE;
+ sPSSData->inBoxMovingMode = 0;
+ return 26;
+ }
+ else
+ {
+ return 24;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return 24;
+ }
+ else
+ {
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.heldKeys & L_BUTTON)
+ return 10;
+ if (gMain.heldKeys & R_BUTTON)
+ return 9;
+ }
+
+ return 0;
+ }
+}
+
+#ifdef NONMATCHING
+static u8 HandleInput_InParty(void)
+{
+ u8 retVal;
+ bool8 gotoBox;
+ s8 cursorArea = sBoxCursorArea;
+ s8 cursorPosition = sBoxCursorPosition;
+
+ sPSSData->field_CD3 = 0;
+ sPSSData->field_CD2 = 0;
+ sPSSData->field_CD7 = 0;
+ gotoBox = FALSE;
+ retVal = 0;
+
+ if (!(gMain.newAndRepeatedKeys & DPAD_UP))
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (++cursorPosition > PARTY_SIZE)
+ cursorPosition = 0;
+ if (cursorPosition != sBoxCursorPosition)
+ retVal = 1;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_LEFT) && sBoxCursorPosition != 0)
+ {
+ retVal = 1;
+ sPSSData->field_CD6 = sBoxCursorPosition;
+ cursorPosition = 0;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (sBoxCursorPosition == 0)
+ {
+ retVal = 1;
+ cursorPosition = sPSSData->field_CD6;
+ }
+ else
+ {
+ retVal = 6;
+ cursorArea = CURSOR_AREA_IN_BOX;
+ cursorPosition = 0;
+ }
+ }
+ else
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (sBoxCursorPosition == PARTY_SIZE)
+ {
+ if (sPSSData->boxOption == BOX_OPTION_DEPOSIT)
+ return 4;
+
+ gotoBox = TRUE;
+ }
+ else if (sub_80CFA5C())
+ {
+ if (!sCanOnlyMove)
+ return 8;
+
+ switch (sub_80CFF98(0))
+ {
+ case 1:
+ return 11;
+ case 2:
+ return 12;
+ case 3:
+ return 13;
+ case 4:
+ return 14;
+ case 5:
+ return 15;
+ case 12:
+ return 16;
+ case 13:
+ return 17;
+ case 15:
+ return 18;
+ }
+ }
+ }
+
+ if (gMain.newKeys & B_BUTTON)
+ {
+ if (sPSSData->boxOption == BOX_OPTION_DEPOSIT)
+ return 19;
+
+ gotoBox = TRUE;
+ }
+
+ if (gotoBox)
+ {
+ retVal = 6;
+ cursorArea = CURSOR_AREA_IN_BOX;
+ cursorPosition = 0;
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_80CFDC4();
+ return 0;
+ }
+ }
+ }
+ else
+ {
+ if (--cursorPosition < 0)
+ cursorPosition = PARTY_SIZE;
+ if (cursorPosition != sBoxCursorPosition)
+ retVal = 1;
+ }
+ if (retVal != 0)
+ {
+ if (retVal != 6)
+ sub_80CD894(cursorArea, cursorPosition);
+ }
+
+ return retVal;
+}
+#else
+NAKED
+static u8 HandleInput_InParty(void)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ ldr r0, =sBoxCursorArea\n\
+ ldrb r0, [r0]\n\
+ mov r9, r0\n\
+ ldr r6, =sBoxCursorPosition\n\
+ ldrb r4, [r6]\n\
+ ldr r2, =sPSSData\n\
+ ldr r0, [r2]\n\
+ ldr r1, =0x00000cd3\n\
+ adds r0, r1\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ ldr r0, [r2]\n\
+ ldr r3, =0x00000cd2\n\
+ adds r0, r3\n\
+ strb r1, [r0]\n\
+ ldr r0, [r2]\n\
+ adds r3, 0x5\n\
+ adds r0, r3\n\
+ strb r1, [r0]\n\
+ mov r8, r1\n\
+ movs r7, 0\n\
+ ldr r1, =gMain\n\
+ ldrh r3, [r1, 0x30]\n\
+ movs r0, 0x40\n\
+ ands r0, r3\n\
+ adds r5, r6, 0\n\
+ mov r12, r1\n\
+ cmp r0, 0\n\
+ beq _080CF608\n\
+ b _080CF7A8\n\
+_080CF608:\n\
+ movs r0, 0x80\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _080CF64C\n\
+ lsls r0, r4, 24\n\
+ movs r1, 0x80\n\
+ lsls r1, 17\n\
+ adds r0, r1\n\
+ lsrs r4, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x6\n\
+ ble _080CF622\n\
+ movs r4, 0\n\
+_080CF622:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0\n\
+ ldrsb r1, [r5, r1]\n\
+ cmp r0, r1\n\
+ bne _080CF630\n\
+ b _080CF7C6\n\
+_080CF630:\n\
+ movs r7, 0x1\n\
+ b _080CF7CA\n\
+ .pool\n\
+_080CF64C:\n\
+ movs r0, 0x20\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _080CF670\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0\n\
+ ldrsb r0, [r5, r0]\n\
+ cmp r0, 0\n\
+ beq _080CF670\n\
+ movs r7, 0x1\n\
+ ldr r0, [r2]\n\
+ ldr r2, =0x00000cd6\n\
+ adds r0, r2\n\
+ strb r1, [r0]\n\
+ movs r4, 0\n\
+ b _080CF7C6\n\
+ .pool\n\
+_080CF670:\n\
+ mov r3, r12\n\
+ ldrh r1, [r3, 0x30]\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF69E\n\
+ movs r0, 0\n\
+ ldrsb r0, [r5, r0]\n\
+ cmp r0, 0\n\
+ bne _080CF694\n\
+ movs r7, 0x1\n\
+ ldr r0, [r2]\n\
+ ldr r1, =0x00000cd6\n\
+ adds r0, r1\n\
+ ldrb r4, [r0]\n\
+ b _080CF7C6\n\
+ .pool\n\
+_080CF694:\n\
+ movs r7, 0x6\n\
+ movs r2, 0\n\
+ mov r9, r2\n\
+ movs r4, 0\n\
+ b _080CF7C6\n\
+_080CF69E:\n\
+ mov r3, r12\n\
+ ldrh r1, [r3, 0x2E]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF75C\n\
+ movs r0, 0\n\
+ ldrsb r0, [r5, r0]\n\
+ cmp r0, 0x6\n\
+ bne _080CF6C4\n\
+ ldr r0, [r2]\n\
+ ldrb r0, [r0, 0x1]\n\
+ cmp r0, 0x1\n\
+ bne _080CF6BE\n\
+ movs r0, 0x4\n\
+ b _080CF7D8\n\
+_080CF6BE:\n\
+ movs r0, 0x1\n\
+ mov r8, r0\n\
+ b _080CF75C\n\
+_080CF6C4:\n\
+ bl sub_80CFA5C\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080CF75C\n\
+ ldr r0, =sCanOnlyMove\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080CF6E0\n\
+ movs r0, 0x8\n\
+ b _080CF7D8\n\
+ .pool\n\
+_080CF6E0:\n\
+ movs r0, 0\n\
+ bl sub_80CFF98\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0xE\n\
+ bhi _080CF75C\n\
+ lsls r0, 2\n\
+ ldr r1, =_080CF700\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
+_080CF700:\n\
+ .4byte _080CF73C\n\
+ .4byte _080CF740\n\
+ .4byte _080CF744\n\
+ .4byte _080CF748\n\
+ .4byte _080CF74C\n\
+ .4byte _080CF75C\n\
+ .4byte _080CF75C\n\
+ .4byte _080CF75C\n\
+ .4byte _080CF75C\n\
+ .4byte _080CF75C\n\
+ .4byte _080CF75C\n\
+ .4byte _080CF750\n\
+ .4byte _080CF754\n\
+ .4byte _080CF75C\n\
+ .4byte _080CF758\n\
+_080CF73C:\n\
+ movs r0, 0xB\n\
+ b _080CF7D8\n\
+_080CF740:\n\
+ movs r0, 0xC\n\
+ b _080CF7D8\n\
+_080CF744:\n\
+ movs r0, 0xD\n\
+ b _080CF7D8\n\
+_080CF748:\n\
+ movs r0, 0xE\n\
+ b _080CF7D8\n\
+_080CF74C:\n\
+ movs r0, 0xF\n\
+ b _080CF7D8\n\
+_080CF750:\n\
+ movs r0, 0x10\n\
+ b _080CF7D8\n\
+_080CF754:\n\
+ movs r0, 0x11\n\
+ b _080CF7D8\n\
+_080CF758:\n\
+ movs r0, 0x12\n\
+ b _080CF7D8\n\
+_080CF75C:\n\
+ ldr r2, =gMain\n\
+ ldrh r1, [r2, 0x2E]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ mov r12, r2\n\
+ cmp r0, 0\n\
+ beq _080CF784\n\
+ ldr r0, =sPSSData\n\
+ ldr r0, [r0]\n\
+ ldrb r0, [r0, 0x1]\n\
+ cmp r0, 0x1\n\
+ bne _080CF780\n\
+ movs r0, 0x13\n\
+ b _080CF7D8\n\
+ .pool\n\
+_080CF780:\n\
+ movs r1, 0x1\n\
+ mov r8, r1\n\
+_080CF784:\n\
+ mov r2, r8\n\
+ cmp r2, 0\n\
+ beq _080CF794\n\
+ movs r7, 0x6\n\
+ movs r3, 0\n\
+ mov r9, r3\n\
+ movs r4, 0\n\
+ b _080CF7C6\n\
+_080CF794:\n\
+ mov r0, r12\n\
+ ldrh r1, [r0, 0x2E]\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF7C6\n\
+ bl sub_80CFDC4\n\
+ movs r0, 0\n\
+ b _080CF7D8\n\
+_080CF7A8:\n\
+ lsls r0, r4, 24\n\
+ movs r1, 0xFF\n\
+ lsls r1, 24\n\
+ adds r0, r1\n\
+ lsrs r4, r0, 24\n\
+ cmp r0, 0\n\
+ bge _080CF7B8\n\
+ movs r4, 0x6\n\
+_080CF7B8:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0\n\
+ ldrsb r1, [r6, r1]\n\
+ cmp r0, r1\n\
+ beq _080CF7C6\n\
+ movs r7, 0x1\n\
+_080CF7C6:\n\
+ cmp r7, 0\n\
+ beq _080CF7D6\n\
+_080CF7CA:\n\
+ cmp r7, 0x6\n\
+ beq _080CF7D6\n\
+ mov r0, r9\n\
+ adds r1, r4, 0\n\
+ bl sub_80CD894\n\
+_080CF7D6:\n\
+ adds r0, r7, 0\n\
+_080CF7D8:\n\
+ pop {r3,r4}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#endif
+
+#ifdef NONMATCHING
+static u8 HandleInput_OnBox(void)
+{
+ u8 retVal;
+ s8 cursorArea = sBoxCursorArea;
+ s8 cursorPosition = sBoxCursorPosition;
+
+ sPSSData->field_CD3 = 0;
+ sPSSData->field_CD2 = 0;
+ sPSSData->field_CD7 = 0;
+ retVal = 0;
+
+ if (!(gMain.newAndRepeatedKeys & DPAD_UP))
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ retVal = 1;
+ cursorArea = CURSOR_AREA_IN_BOX;
+ cursorPosition = 2;
+ }
+ else
+ {
+ if (gMain.heldKeys & DPAD_LEFT)
+ return 10;
+ if (gMain.heldKeys & DPAD_RIGHT)
+ return 9;
+
+ if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.heldKeys & L_BUTTON)
+ return 10;
+ if (gMain.heldKeys & R_BUTTON)
+ return 9;
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_80CD1A8(FALSE);
+ AddBoxMenu();
+ return 7;
+ }
+
+ if (gMain.newKeys & B_BUTTON)
+ return 19;
+
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_80CFDC4();
+ return 0;
+ }
+
+ retVal = 0;
+ }
+ }
+ else
+ {
+ retVal = 1;
+ cursorArea = CURSOR_AREA_BUTTONS;
+ cursorPosition = 0;
+ sPSSData->field_CD7 = 1;
+ }
+
+ if (retVal)
+ {
+ if (cursorArea != CURSOR_AREA_BOX)
+ sub_80CD1A8(FALSE);
+ sub_80CD894(cursorArea, cursorPosition);
+ }
+
+ return retVal;
+}
+#else
+NAKED
+static u8 HandleInput_OnBox(void)
+{
+ asm_unified("\n\
+ push {r4-r6,lr}\n\
+ ldr r3, =sPSSData\n\
+ ldr r0, [r3]\n\
+ ldr r1, =0x00000cd3\n\
+ adds r0, r1\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ ldr r0, [r3]\n\
+ ldr r2, =0x00000cd2\n\
+ adds r0, r2\n\
+ strb r1, [r0]\n\
+ ldr r0, [r3]\n\
+ ldr r5, =0x00000cd7\n\
+ adds r0, r5\n\
+ strb r1, [r0]\n\
+ ldr r1, =gMain\n\
+ ldrh r2, [r1, 0x30]\n\
+ movs r0, 0x40\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _080CF8AA\n\
+ movs r0, 0x80\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _080CF834\n\
+ movs r4, 0x1\n\
+ movs r1, 0\n\
+ movs r6, 0x2\n\
+ b _080CF8B6\n\
+ .pool\n\
+_080CF834:\n\
+ ldrh r2, [r1, 0x2C]\n\
+ movs r0, 0x20\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _080CF85A\n\
+ movs r0, 0x10\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _080CF86E\n\
+ ldr r0, =gSaveBlock2Ptr\n\
+ ldr r0, [r0]\n\
+ ldrb r0, [r0, 0x13]\n\
+ cmp r0, 0x1\n\
+ bne _080CF872\n\
+ movs r0, 0x80\n\
+ lsls r0, 2\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _080CF864\n\
+_080CF85A:\n\
+ movs r0, 0xA\n\
+ b _080CF8D2\n\
+ .pool\n\
+_080CF864:\n\
+ movs r0, 0x80\n\
+ lsls r0, 1\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _080CF872\n\
+_080CF86E:\n\
+ movs r0, 0x9\n\
+ b _080CF8D2\n\
+_080CF872:\n\
+ ldrh r1, [r1, 0x2E]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF88A\n\
+ movs r0, 0\n\
+ bl sub_80CD1A8\n\
+ bl AddBoxMenu\n\
+ movs r0, 0x7\n\
+ b _080CF8D2\n\
+_080CF88A:\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF896\n\
+ movs r0, 0x13\n\
+ b _080CF8D2\n\
+_080CF896:\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF8A6\n\
+ bl sub_80CFDC4\n\
+ movs r0, 0\n\
+ b _080CF8D2\n\
+_080CF8A6:\n\
+ movs r4, 0\n\
+ b _080CF8D0\n\
+_080CF8AA:\n\
+ movs r4, 0x1\n\
+ movs r1, 0x3\n\
+ movs r6, 0\n\
+ ldr r0, [r3]\n\
+ adds r0, r5\n\
+ strb r4, [r0]\n\
+_080CF8B6:\n\
+ cmp r4, 0\n\
+ beq _080CF8D0\n\
+ lsls r5, r1, 24\n\
+ cmp r1, 0x2\n\
+ beq _080CF8C6\n\
+ movs r0, 0\n\
+ bl sub_80CD1A8\n\
+_080CF8C6:\n\
+ lsrs r0, r5, 24\n\
+ lsls r1, r6, 24\n\
+ lsrs r1, 24\n\
+ bl sub_80CD894\n\
+_080CF8D0:\n\
+ adds r0, r4, 0\n\
+_080CF8D2:\n\
+ pop {r4-r6}\n\
+ pop {r1}\n\
+ bx r1\n\
+ ");
+}
+#endif
+
+#ifdef NONMATCHING
+static u8 HandleInput_OnButtons(void)
+{
+ u8 retVal;
+ s8 cursorArea = sBoxCursorArea;
+ s8 cursorPosition = sBoxCursorPosition;
+
+ sPSSData->field_CD3 = 0;
+ sPSSData->field_CD2 = 0;
+ sPSSData->field_CD7 = 0;
+
+ if (!(gMain.newAndRepeatedKeys & DPAD_UP))
+ {
+ if (gMain.newAndRepeatedKeys & (DPAD_DOWN | START_BUTTON))
+ {
+ retVal = 1;
+ cursorArea = CURSOR_AREA_BOX;
+ cursorPosition = 0;
+ sPSSData->field_CD7 = 1;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ retVal = 1;
+ if (--cursorPosition < 0)
+ {
+ cursorPosition = 1;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ retVal = 1;
+ if (++cursorPosition > 1)
+ {
+ cursorPosition = 0;
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ return (cursorPosition == 0) ? 5 : 4;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return 19;
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_80CFDC4();
+ return 0;
+ }
+ else
+ {
+ retVal = 0;
+ }
+ }
+ else
+ {
+ retVal = 1;
+ cursorArea = CURSOR_AREA_IN_BOX;
+ sPSSData->field_CD2 = -1;
+ cursorPosition = (sBoxCursorPosition == 0) ? IN_BOX_COUNT - 1 - 5 : IN_BOX_COUNT - 1;
+ sPSSData->field_CD7 = 1;
+ }
+
+ if (retVal != 0)
+ {
+ sub_80CD894(cursorArea, cursorPosition);
+ }
+
+ return retVal;
+}
+#else
+NAKED
+static u8 HandleInput_OnButtons(void)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ ldr r0, =sBoxCursorArea\n\
+ ldrb r0, [r0]\n\
+ mov r8, r0\n\
+ ldr r0, =sBoxCursorPosition\n\
+ mov r12, r0\n\
+ ldrb r2, [r0]\n\
+ ldr r3, =sPSSData\n\
+ ldr r0, [r3]\n\
+ ldr r1, =0x00000cd3\n\
+ adds r0, r1\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ ldr r0, [r3]\n\
+ ldr r6, =0x00000cd2\n\
+ adds r0, r6\n\
+ strb r1, [r0]\n\
+ ldr r0, [r3]\n\
+ ldr r5, =0x00000cd7\n\
+ adds r0, r5\n\
+ strb r1, [r0]\n\
+ ldr r7, =gMain\n\
+ ldrh r1, [r7, 0x30]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ adds r4, r3, 0\n\
+ cmp r0, 0\n\
+ bne _080CF9B2\n\
+ movs r0, 0x88\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF944\n\
+ movs r7, 0x1\n\
+ movs r0, 0x2\n\
+ mov r8, r0\n\
+ movs r2, 0\n\
+ ldr r0, [r4]\n\
+ b _080CF9D0\n\
+ .pool\n\
+_080CF944:\n\
+ movs r0, 0x20\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF960\n\
+ movs r7, 0x1\n\
+ lsls r0, r2, 24\n\
+ movs r1, 0xFF\n\
+ lsls r1, 24\n\
+ adds r0, r1\n\
+ lsrs r2, r0, 24\n\
+ cmp r0, 0\n\
+ bge _080CF9D4\n\
+ movs r2, 0x1\n\
+ b _080CF9D4\n\
+_080CF960:\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF97E\n\
+ movs r7, 0x1\n\
+ lsls r0, r2, 24\n\
+ movs r1, 0x80\n\
+ lsls r1, 17\n\
+ adds r0, r1\n\
+ lsrs r2, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x1\n\
+ ble _080CF9D4\n\
+ movs r2, 0\n\
+ b _080CF9D4\n\
+_080CF97E:\n\
+ ldrh r1, [r7, 0x2E]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF992\n\
+ movs r0, 0x4\n\
+ cmp r2, 0\n\
+ bne _080CF9E2\n\
+ movs r0, 0x5\n\
+ b _080CF9E2\n\
+_080CF992:\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF99E\n\
+ movs r0, 0x13\n\
+ b _080CF9E2\n\
+_080CF99E:\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080CF9AE\n\
+ bl sub_80CFDC4\n\
+ movs r0, 0\n\
+ b _080CF9E2\n\
+_080CF9AE:\n\
+ movs r7, 0\n\
+ b _080CF9E0\n\
+_080CF9B2:\n\
+ movs r7, 0x1\n\
+ movs r0, 0\n\
+ mov r8, r0\n\
+ ldr r0, [r3]\n\
+ adds r0, r6\n\
+ movs r1, 0xFF\n\
+ strb r1, [r0]\n\
+ mov r1, r12\n\
+ movs r0, 0\n\
+ ldrsb r0, [r1, r0]\n\
+ movs r2, 0x1D\n\
+ cmp r0, 0\n\
+ bne _080CF9CE\n\
+ movs r2, 0x18\n\
+_080CF9CE:\n\
+ ldr r0, [r3]\n\
+_080CF9D0:\n\
+ adds r0, r5\n\
+ strb r7, [r0]\n\
+_080CF9D4:\n\
+ cmp r7, 0\n\
+ beq _080CF9E0\n\
+ mov r0, r8\n\
+ adds r1, r2, 0\n\
+ bl sub_80CD894\n\
+_080CF9E0:\n\
+ adds r0, r7, 0\n\
+_080CF9E2:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#endif
+
+static u8 HandleInput(void)
+{
+ struct
+ {
+ u8 (*func)(void);
+ s8 area;
+ }
+ static const inputFuncs[] =
+ {
+ {HandleInput_InBox, CURSOR_AREA_IN_BOX},
+ {HandleInput_InParty, CURSOR_AREA_IN_PARTY},
+ {HandleInput_OnBox, CURSOR_AREA_BOX},
+ {HandleInput_OnButtons, CURSOR_AREA_BUTTONS},
+ {NULL, 0},
+ };
+
+ u16 i = 0;
+ while (inputFuncs[i].func != NULL)
+ {
+ if (inputFuncs[i].area == sBoxCursorArea)
+ return inputFuncs[i].func();
+ i++;
+ }
+
+ return 0;
+}
+
+static void AddBoxMenu(void)
+{
+ InitMenu();
+ SetMenuText(9);
+ SetMenuText(10);
+ SetMenuText(11);
+ SetMenuText(0);
+}
+
+static u8 sub_80CFA5C(void)
+{
+ InitMenu();
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return sub_80CFA84();
+ else
+ return sub_80CFB44();
+}
+
+static bool8 sub_80CFA84(void)
+{
+ u16 var0 = sub_80CD504();
+
+ switch (sPSSData->boxOption)
+ {
+ case BOX_OPTION_DEPOSIT:
+ if (var0)
+ SetMenuText(1);
+ else
+ return FALSE;
+ break;
+ case BOX_OPTION_WITHDRAW:
+ if (var0)
+ SetMenuText(2);
+ else
+ return FALSE;
+ break;
+ case BOX_OPTION_MOVE_MONS:
+ if (sIsMonBeingMoved)
+ {
+ if (var0)
+ SetMenuText(4);
+ else
+ SetMenuText(5);
+ }
+ else
+ {
+ if (var0)
+ SetMenuText(3);
+ else
+ return FALSE;
+ }
+ break;
+ case BOX_OPTION_MOVE_ITEMS:
+ default:
+ return FALSE;
+ }
+
+ SetMenuText(6);
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS)
+ {
+ if (!sBoxCursorArea)
+ SetMenuText(2);
+ else
+ SetMenuText(1);
+ }
+
+ SetMenuText(8);
+ SetMenuText(7);
+ SetMenuText(0);
+ return TRUE;
+}
+
+static bool8 sub_80CFB44(void)
+{
+ if (sPSSData->cursorMonSpecies == SPECIES_EGG)
+ return FALSE;
+
+ if (!IsActiveItemMoving())
+ {
+ if (sPSSData->cursorMonItem == 0)
+ {
+ if (sPSSData->cursorMonSpecies == SPECIES_NONE)
+ return FALSE;
+
+ SetMenuText(14);
+ }
+ else
+ {
+ if (!ItemIsMail(sPSSData->cursorMonItem))
+ {
+ SetMenuText(12);
+ SetMenuText(16);
+ }
+ SetMenuText(17);
+ }
+ }
+ else
+ {
+ if (sPSSData->cursorMonItem == 0)
+ {
+ if (sPSSData->cursorMonSpecies == SPECIES_NONE)
+ return FALSE;
+
+ SetMenuText(13);
+ }
+ else
+ {
+ if (ItemIsMail(sPSSData->cursorMonItem) == TRUE)
+ return FALSE;
+
+ SetMenuText(15);
+ }
+ }
+
+ SetMenuText(0);
+ return TRUE;
+}
+
+static void sub_80CFBF4(struct Sprite *sprite)
+{
+ sprite->pos1.x = sPSSData->field_CB4->pos1.x;
+ sprite->pos1.y = sPSSData->field_CB4->pos1.y + 20;
+}
+
+static void sub_80CFC14(void)
+{
+ u16 x, y;
+ u8 spriteId;
+ u8 priority, subpriority;
+ struct SpriteSheet spriteSheets[] =
+ {
+ {gHandCursorTiles, 0x800, 0},
+ {gHandCursorShadowTiles, 0x80, 1},
+ {}
+ };
+
+ struct SpritePalette spritePalettes[] =
+ {
+ {gHandCursorPalette, TAG_PAL_DAC7},
+ {}
+ };
+
+ static const struct OamData sOamData_857BA0C =
+ {
+ .size = 2,
+ .priority = 1,
+ };
+ static const struct OamData sOamData_857BA14 =
+ {
+ .size = 1,
+ .priority = 1,
+ };
+
+ static const union AnimCmd sSpriteAnim_857BA1C[] =
+ {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(16, 30),
+ ANIMCMD_JUMP(0)
+ };
+ static const union AnimCmd sSpriteAnim_857BA28[] =
+ {
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+ };
+ static const union AnimCmd sSpriteAnim_857BA30[] =
+ {
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END
+ };
+ static const union AnimCmd sSpriteAnim_857BA38[] =
+ {
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END
+ };
+
+ static const union AnimCmd *const sSpriteAnimTable_857BA40[] =
+ {
+ sSpriteAnim_857BA1C,
+ sSpriteAnim_857BA28,
+ sSpriteAnim_857BA30,
+ sSpriteAnim_857BA38
+ };
+
+ static const struct SpriteTemplate gSpriteTemplate_857BA50 =
+ {
+ .tileTag = TAG_TILE_0,
+ .paletteTag = TAG_PAL_WAVEFORM,
+ .oam = &sOamData_857BA0C,
+ .anims = sSpriteAnimTable_857BA40,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ };
+
+ static const struct SpriteTemplate gSpriteTemplate_857BA68 =
+ {
+ .tileTag = TAG_TILE_1,
+ .paletteTag = TAG_PAL_WAVEFORM,
+ .oam = &sOamData_857BA14,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80CFBF4,
+ };
+
+ LoadSpriteSheets(spriteSheets);
+ LoadSpritePalettes(spritePalettes);
+ sPSSData->field_CD8[0] = IndexOfSpritePaletteTag(TAG_PAL_WAVEFORM);
+ sPSSData->field_CD8[1] = IndexOfSpritePaletteTag(TAG_PAL_DAC7);
+
+ sub_80CD444(sBoxCursorArea, sBoxCursorPosition, &x, &y);
+ spriteId = CreateSprite(&gSpriteTemplate_857BA50, x, y, 6);
+ if (spriteId != MAX_SPRITES)
+ {
+ sPSSData->field_CB4 = &gSprites[spriteId];
+ sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove];
+ sPSSData->field_CB4->oam.priority = 1;
+ if (sIsMonBeingMoved)
+ StartSpriteAnim(sPSSData->field_CB4, 3);
+ }
+ else
+ {
+ sPSSData->field_CB4 = NULL;
+ }
+
+ if (sBoxCursorArea == CURSOR_AREA_IN_PARTY)
+ {
+ subpriority = 13;
+ priority = 1;
+ }
+ else
+ {
+ subpriority = 21;
+ priority = 2;
+ }
+
+ spriteId = CreateSprite(&gSpriteTemplate_857BA68, 0, 0, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sPSSData->field_CB8 = &gSprites[spriteId];
+ sPSSData->field_CB8->oam.priority = priority;
+ if (sBoxCursorArea)
+ sPSSData->field_CB8->invisible = 1;
+ }
+ else
+ {
+ sPSSData->field_CB8 = NULL;
+ }
+}
+
+static void sub_80CFDC4(void)
+{
+ sCanOnlyMove = !sCanOnlyMove;
+ sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove];
+}
+
+static u8 GetBoxCursorPosition(void)
+{
+ return sBoxCursorPosition;
+}
+
+static void sub_80CFE14(u8 *arg0, u8 *arg1)
+{
+ if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
+ {
+ *arg0 = sBoxCursorPosition % IN_BOX_ROWS;
+ *arg1 = sBoxCursorPosition / IN_BOX_ROWS;
+ }
+ else
+ {
+ *arg0 = 0;
+ *arg1 = 0;
+ }
+}
+
+static void sub_80CFE54(u8 animNum)
+{
+ StartSpriteAnim(sPSSData->field_CB4, animNum);
+}
+
+static u8 sub_80CFE78(void)
+{
+ return sMovingMonOrigBoxId;
+}
+
+static void sub_80CFE84(void)
+{
+ sPSSData->field_CB4->oam.priority = 1;
+}
+
+static void sub_80CFEA8(void)
+{
+ if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
+ sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
+}
+
+static void sub_80CFECC(void)
+{
+ if (sBoxCursorArea == CURSOR_AREA_IN_BOX)
+ sub_80D0D8C(CURSOR_AREA_IN_BOX, sBoxCursorPosition);
+}
+
+static void InitMenu(void)
+{
+ sPSSData->menuItemsCount = 0;
+ sPSSData->menuWidth = 0;
+ sPSSData->menuWindow.bg = 0;
+ sPSSData->menuWindow.paletteNum = 15;
+ sPSSData->menuWindow.baseBlock = 92;
+}
+
+static const u8 *const gUnknown_0857BA80[] =
+{
+ gPCText_Cancel,
+ gPCText_Store,
+ gPCText_Withdraw,
+ gPCText_Move,
+ gPCText_Shift,
+ gPCText_Place,
+ gPCText_Summary,
+ gPCText_Release,
+ gPCText_Mark,
+ gPCText_Jump,
+ gPCText_Wallpaper,
+ gPCText_Name,
+ gPCText_Take,
+ gPCText_Give,
+ gPCText_Give,
+ gPCText_Switch,
+ gPCText_Bag,
+ gPCText_Info,
+ gPCText_Scenery1,
+ gPCText_Scenery2,
+ gPCText_Scenery3,
+ gPCText_Etcetera,
+ gPCText_Friends,
+ gPCText_Forest,
+ gPCText_City,
+ gPCText_Desert,
+ gPCText_Savanna,
+ gPCText_Crag,
+ gPCText_Volcano,
+ gPCText_Snow,
+ gPCText_Cave,
+ gPCText_Beach,
+ gPCText_Seafloor,
+ gPCText_River,
+ gPCText_Sky,
+ gPCText_PolkaDot,
+ gPCText_Pokecenter,
+ gPCText_Machine,
+ gPCText_Simple,
+};
+
+static void SetMenuText(u8 textId)
+{
+ if (sPSSData->menuItemsCount < 7)
+ {
+ u8 len;
+ struct StorageMenu *menu = &sPSSData->menuItems[sPSSData->menuItemsCount];
+
+ menu->text = gUnknown_0857BA80[textId];
+ menu->textId = textId;
+ len = StringLength(menu->text);
+ if (len > sPSSData->menuWidth)
+ sPSSData->menuWidth = len;
+
+ sPSSData->menuItemsCount++;
+ }
+}
+
+static s8 sub_80CFF98(u8 arg0)
+{
+ if (arg0 >= sPSSData->menuItemsCount)
+ return -1;
+ else
+ return sPSSData->menuItems[arg0].textId;
+}
+
+static void AddMenu(void)
+{
+ sPSSData->menuWindow.width = sPSSData->menuWidth + 2;
+ sPSSData->menuWindow.height = 2 * sPSSData->menuItemsCount;
+ sPSSData->menuWindow.tilemapLeft = 29 - sPSSData->menuWindow.width;
+ sPSSData->menuWindow.tilemapTop = 15 - sPSSData->menuWindow.height;
+ sPSSData->field_CB0 = AddWindow(&sPSSData->menuWindow);
+ ClearWindowTilemap(sPSSData->field_CB0);
+ SetWindowBorderStyle(sPSSData->field_CB0, FALSE, 11, 14);
+ PrintMenuTable(sPSSData->field_CB0, sPSSData->menuItemsCount, (void*)sPSSData->menuItems);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sPSSData->field_CB0, sPSSData->menuItemsCount, 0);
+ schedule_bg_copy_tilemap_to_vram(0);
+ sPSSData->field_CAE = 0;
+}
+
+static bool8 sub_80D00A8(void)
+{
+ return FALSE;
+}
+
+static s16 sub_80D00AC(void)
+{
+ s32 textId = -2;
+
+ if (!(gMain.newKeys & A_BUTTON))
+ {
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ textId = -1;
+ }
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(-1);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(1);
+ }
+ }
+ else
+ {
+ textId = Menu_GetCursorPos();
+ }
+
+ if (textId != -2)
+ sub_80D013C();
+
+ if (textId >= 0)
+ textId = sPSSData->menuItems[textId].textId;
+
+ #ifndef NONMATCHING
+ asm("":::"r4");
+ #endif // NONMATCHING
+ return textId;
+}
+
+static void sub_80D013C(void)
+{
+ sub_8198070(sPSSData->field_CB0, TRUE);
+ RemoveWindow(sPSSData->field_CB0);
+}
+
+// The functions below handle moving and grabbing multiple mons at once.
+// The icons are converted to background 0 which coordinates are changed while moving mons.
+// There is also a bit of math involved in determining how many column/rows of mons to grab/move.
+
+static const struct WindowTemplate gUnknown_0857BB1C =
+{
+ .bg = 0,
+ .tilemapLeft = 10,
+ .tilemapTop = 3,
+ .width = 20,
+ .height = 18,
+ .paletteNum = 9,
+ .baseBlock = 0xA,
+};
+
+EWRAM_DATA static struct
+{
+ u8 field_0;
+ u8 state;
+ u8 fromRow;
+ u8 fromColumn;
+ u8 toRow;
+ u8 toColumn;
+ u8 field_6;
+ u8 field_7;
+ u8 minRow;
+ u8 minColumn;
+ u8 rowsTotal;
+ u8 columsTotal;
+ u16 bgX;
+ u16 bgY;
+ u16 field_10;
+ struct BoxPokemon boxMons[IN_BOX_COUNT];
+}
+*sMoveMonsPtr = NULL;
+
+static bool8 sub_80D0164(void)
+{
+ sMoveMonsPtr = Alloc(sizeof(*sMoveMonsPtr));
+ if (sMoveMonsPtr != NULL)
+ {
+ sPSSData->field_2200 = AddWindow8Bit(&gUnknown_0857BB1C);
+ if (sPSSData->field_2200 != 0xFF)
+ {
+ FillWindowPixelBuffer(sPSSData->field_2200, 0);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_80D01B8(void)
+{
+ if (sMoveMonsPtr != NULL)
+ Free(sMoveMonsPtr);
+}
+
+static void sub_80D01D0(u8 arg0)
+{
+ sMoveMonsPtr->field_0 = arg0;
+ sMoveMonsPtr->state = 0;
+}
+
+static bool8 sub_80D01E4(void)
+{
+ switch (sMoveMonsPtr->field_0)
+ {
+ case 0:
+ return sub_80D024C();
+ case 1:
+ return sub_80D0344();
+ case 2:
+ return sub_80D03B0();
+ case 3:
+ return sub_80D0420();
+ case 4:
+ return sub_80D04A0();
+ case 5:
+ return sub_80D04C8();
+ }
+
+ return FALSE;
+}
+
+static bool8 sub_80D024C(void)
+{
+ switch (sMoveMonsPtr->state)
+ {
+ case 0:
+ HideBg(0);
+ sub_80D304C(0x80);
+ sMoveMonsPtr->state++;
+ break;
+ case 1:
+ sub_80CFE14(&sMoveMonsPtr->fromRow, &sMoveMonsPtr->fromColumn);
+ sMoveMonsPtr->toRow = sMoveMonsPtr->fromRow;
+ sMoveMonsPtr->toColumn = sMoveMonsPtr->fromColumn;
+ ChangeBgX(0, -1024, 0);
+ ChangeBgY(0, -1024, 0);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ FillWindowPixelBuffer8Bit(sPSSData->field_2200, 0);
+ sub_80D07B0(sMoveMonsPtr->fromRow, sMoveMonsPtr->fromColumn);
+ SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1);
+ PutWindowTilemap(sPSSData->field_2200);
+ CopyWindowToVram8Bit(sPSSData->field_2200, 3);
+ BlendPalettes(0x3F00, 8, RGB_WHITE);
+ sub_80CFE54(2);
+ SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);
+ sMoveMonsPtr->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ ShowBg(0);
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_80D0344(void)
+{
+ switch (sMoveMonsPtr->state)
+ {
+ case 0:
+ HideBg(0);
+ sMoveMonsPtr->state++;
+ break;
+ case 1:
+ sub_80D0B5C();
+ sub_80CFE54(0);
+ sMoveMonsPtr->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_80CFE84();
+ LoadPalette(stdpal_get(3), 0xD0, 0x20);
+ ShowBg(0);
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_80D03B0(void)
+{
+ switch (sMoveMonsPtr->state)
+ {
+ case 0:
+ if (!sub_80CD554())
+ {
+ sub_80CFE14(&sMoveMonsPtr->field_6, &sMoveMonsPtr->field_7);
+ sub_80D062C();
+ sMoveMonsPtr->toRow = sMoveMonsPtr->field_6;
+ sMoveMonsPtr->toColumn = sMoveMonsPtr->field_7;
+ CopyWindowToVram8Bit(sPSSData->field_2200, 2);
+ sMoveMonsPtr->state++;
+ }
+ break;
+ case 1:
+ return IsDma3ManagerBusyWithBgCopy();
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_80D0420(void)
+{
+ u8 var1, var2;
+
+ switch (sMoveMonsPtr->state)
+ {
+ case 0:
+ sub_80D08CC();
+ sub_80D09A4();
+ sub_80CDC64(FALSE);
+ sMoveMonsPtr->state++;
+ break;
+ case 1:
+ if (!DoMonPlaceChange())
+ {
+ sub_80CFE54(3);
+ sub_80D0884(0, 256, 8);
+ sub_80CDC64(TRUE);
+ sMoveMonsPtr->state++;
+ }
+ break;
+ case 2:
+ var1 = sub_80D0894();
+ var2 = DoMonPlaceChange();
+ if (!var1 && !var2)
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_80D04A0(void)
+{
+ u8 var1 = sub_80CD554();
+ u8 var2 = sub_80D0894();
+
+ if (!var1 && !var2)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static bool8 sub_80D04C8(void)
+{
+ switch (sMoveMonsPtr->state)
+ {
+ case 0:
+ sub_80D0AAC();
+ sub_80D0884(0, -256, 8);
+ sub_80CDC64(FALSE);
+ sMoveMonsPtr->state++;
+ break;
+ case 1:
+ if (!DoMonPlaceChange() && !sub_80D0894())
+ {
+ sub_80D0A1C();
+ sub_80CFE54(2);
+ sub_80CDC64(TRUE);
+ HideBg(0);
+ sMoveMonsPtr->state++;
+ }
+ break;
+ case 2:
+ if (!DoMonPlaceChange())
+ {
+ sub_80CFE54(0);
+ sub_80D0B5C();
+ sMoveMonsPtr->state++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ LoadPalette(stdpal_get(3), 0xD0, 0x20);
+ sub_80CFE84();
+ ShowBg(0);
+ return FALSE;
+ }
+ break;
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_80D0580(u8 arg0)
+{
+ switch (arg0)
+ {
+ case 0:
+ if (sMoveMonsPtr->minColumn == 0)
+ return FALSE;
+ sMoveMonsPtr->minColumn--;
+ sub_80D0884(0, 1024, 6);
+ break;
+ case 1:
+ if (sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal >= 5)
+ return FALSE;
+ sMoveMonsPtr->minColumn++;
+ sub_80D0884(0, -1024, 6);
+ break;
+ case 2:
+ if (sMoveMonsPtr->minRow == 0)
+ return FALSE;
+ sMoveMonsPtr->minRow--;
+ sub_80D0884(1024, 0, 6);
+ break;
+ case 3:
+ if (sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal > 5)
+ return FALSE;
+ sMoveMonsPtr->minRow++;
+ sub_80D0884(-1024, 0, 6);
+ break;
+ }
+
+ return TRUE;
+}
+
+static void sub_80D062C(void)
+{
+ s16 var = (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->field_6)) - (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow));
+ s16 var2 = (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->field_7)) - (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn));
+
+ if (var > 0)
+ sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
+
+ if (var < 0)
+ {
+ sub_80D0740(sMoveMonsPtr->toRow, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
+ sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
+ }
+
+ if (var2 > 0)
+ sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
+
+ if (var2 < 0)
+ {
+ sub_80D0778(sMoveMonsPtr->toColumn, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
+ sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
+ }
+}
+
+static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D07B0(arg0, arg1++);
+}
+
+static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D07B0(arg1++, arg0);
+}
+
+static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D0834(arg0, arg1++);
+}
+
+static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var1 = arg1;
+
+ if (arg1 > arg2)
+ {
+ arg1 = arg2;
+ arg2 = var1;
+ }
+
+ while (arg1 <= arg2)
+ sub_80D0834(arg1++, arg0);
+}
+
+static void sub_80D07B0(u8 arg0, u8 arg1)
+{
+ u8 position = arg0 + (6 * arg1);
+ u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2);
+ u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY);
+
+ if (species != SPECIES_NONE)
+ {
+ const u8 *iconGfx = GetMonIconPtr(species, personality, 1);
+ u8 index = GetValidMonIconPalIndex(species) + 8;
+
+ BlitBitmapRectToWindow4BitTo8Bit(sPSSData->field_2200,
+ iconGfx,
+ 0,
+ 0,
+ 32,
+ 32,
+ 24 * arg0,
+ 24 * arg1,
+ 32,
+ 32,
+ index);
+ }
+}
+
+static void sub_80D0834(u8 arg0, u8 arg1)
+{
+ u8 position = arg0 + (6 * arg1);
+ u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2);
+
+ if (species != SPECIES_NONE)
+ {
+ FillWindowPixelRect8Bit(sPSSData->field_2200,
+ 0,
+ 24 * arg0,
+ 24 * arg1,
+ 32,
+ 32);
+ }
+}
+
+static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2)
+{
+ sMoveMonsPtr->bgX = arg0;
+ sMoveMonsPtr->bgY = arg1;
+ sMoveMonsPtr->field_10 = arg2;
+}
+
+static u8 sub_80D0894(void)
+{
+ if (sMoveMonsPtr->field_10 != 0)
+ {
+ ChangeBgX(0, sMoveMonsPtr->bgX, 1);
+ ChangeBgY(0, sMoveMonsPtr->bgY, 1);
+ sMoveMonsPtr->field_10--;
+ }
+
+ return sMoveMonsPtr->field_10;
+}
+
+static void sub_80D08CC(void)
+{
+ s32 i, j, r8, r9;
+ s32 rowCount, columnCount;
+ u8 boxId;
+ u8 monArrayId;
+
+ sMoveMonsPtr->minRow = min(sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow);
+ sMoveMonsPtr->minColumn = min(sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn);
+ sMoveMonsPtr->rowsTotal = abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow) + 1;
+ sMoveMonsPtr->columsTotal = abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn) + 1;
+ boxId = StorageGetCurrentBox();
+ monArrayId = 0;
+ rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
+ columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
+ for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
+ for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
+ {
+ struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition);
+
+ sMoveMonsPtr->boxMons[monArrayId] = *boxMon;
+ monArrayId++;
+ boxPosition++;
+ }
+ }
+}
+
+static void sub_80D09A4(void)
+{
+ s32 i, j;
+ s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
+ s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
+ u8 boxId = StorageGetCurrentBox();
+
+ for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
+ for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
+ {
+ DestroyBoxMonIconAtPosition(boxPosition);
+ ZeroBoxMonAt(boxId, boxPosition);
+ boxPosition++;
+ }
+ }
+}
+
+static void sub_80D0A1C(void)
+{
+ s32 i, j;
+ s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
+ s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
+ u8 monArrayId = 0;
+
+ for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
+ for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
+ {
+ if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))
+ sub_80CB140(boxPosition);
+ monArrayId++;
+ boxPosition++;
+ }
+ }
+}
+
+static void sub_80D0AAC(void)
+{
+ s32 i, j;
+ s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
+ s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
+ u8 boxId = StorageGetCurrentBox();
+ u8 monArrayId = 0;
+
+ for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
+ for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
+ {
+ if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES))
+ SetBoxMonAt(boxId, boxPosition, &sMoveMonsPtr->boxMons[monArrayId]);
+ boxPosition++;
+ monArrayId++;
+ }
+ }
+}
+
+static void sub_80D0B5C(void)
+{
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ SetBgAttribute(0, BG_ATTR_PALETTEMODE, 0);
+ ClearGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static u8 sub_80D0BA4(void)
+{
+ return (IN_BOX_ROWS * sMoveMonsPtr->fromColumn) + sMoveMonsPtr->fromRow;
+}
+
+static bool8 sub_80D0BC0(void)
+{
+ s32 i, j;
+ s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal;
+ s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal;
+ u8 monArrayId = 0;
+
+ for (i = sMoveMonsPtr->minColumn; i < columnCount; i++)
+ {
+ u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow;
+ for (j = sMoveMonsPtr->minRow; j < rowCount; j++)
+ {
+ if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)
+ && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES))
+ return FALSE;
+
+ monArrayId++;
+ boxPosition++;
+ }
+ }
+
+ return TRUE;
+}
+
+static const u32 gUnknown_0857BB24[] = INCBIN_U32("graphics/pokemon_storage/unknown_frame.4bpp");
+
+static const struct OamData sOamData_857BBA4 =
+{
+ .y = 0,
+ .affineMode = 1,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857BBAC[] =
+{
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857BBBC[] =
+{
+ AFFINEANIMCMD_FRAME(88, 88, 0, 0),
+ AFFINEANIMCMD_FRAME(5, 5, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857BBD4[] =
+{
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_FRAME(-5, -5, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857BBEC[] =
+{
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_FRAME(10, 10, 0, 12),
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857BC0C[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 12),
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857BC2C[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(-5, -5, 0, 16),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_857BC44[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_857BC44[] =
+{
+ sSpriteAffineAnim_857BBAC,
+ sSpriteAffineAnim_857BBBC,
+ sSpriteAffineAnim_857BBD4,
+ sSpriteAffineAnim_857BBEC,
+ sSpriteAffineAnim_857BC0C,
+ sSpriteAffineAnim_857BC2C,
+ sSpriteAffineAnim_857BC44
+};
+
+static const struct SpriteTemplate gSpriteTemplate_857BC70 =
+{
+ .tileTag = TAG_TILE_7,
+ .paletteTag = TAG_PAL_DACB,
+ .oam = &sOamData_857BBA4,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_857BC44,
+ .callback = SpriteCallbackDummy,
+};
+
+static void sub_80D0C60(void)
+{
+ s32 i;
+ u8 spriteId;
+ struct CompressedSpriteSheet spriteSheet;
+ struct SpriteTemplate spriteTemplate;
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ spriteSheet.data = gUnknown_03000F78;
+ spriteSheet.size = 0x200;
+ spriteTemplate = gSpriteTemplate_857BC70;
+
+ for (i = 0; i < 3; i++)
+ {
+ spriteSheet.tag = TAG_TILE_7 + i;
+ LoadCompressedSpriteSheet(&spriteSheet);
+ sPSSData->field_2204[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * 32 + (void*)(OBJ_VRAM0);
+ sPSSData->field_2204[i].palIndex = AllocSpritePalette(TAG_PAL_DACB + i);
+ sPSSData->field_2204[i].palIndex *= 16;
+ sPSSData->field_2204[i].palIndex += 0x100;
+ spriteTemplate.tileTag = TAG_TILE_7 + i;
+ spriteTemplate.paletteTag = TAG_PAL_DACB + i;
+ spriteId = CreateSprite(&spriteTemplate, 0, 0, 11);
+ sPSSData->field_2204[i].sprite = &gSprites[spriteId];
+ sPSSData->field_2204[i].sprite->invisible = TRUE;
+ sPSSData->field_2204[i].unk10 = 0;
+ }
+ }
+ sPSSData->movingItem = 0;
+}
+
+// The functions below handle new features of MOVE_ITEMS box option.
+static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos);
+static const u32 *GetItemIconPic(u16 itemId);
+static const u32 *GetItemIconPalette(u16 itemId);
+static u8 sub_80D12E8(void);
+static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos);
+static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal);
+static void sub_80D15D4(u8 id, u8 animNum);
+static void sub_80D1740(u8 id, bool8 arg1);
+static u8 sub_80D1370(u8 cursorArea, u8 cursorPos);
+static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3);
+static void sub_80D1AD8(struct Sprite *sprite);
+static void sub_80D1A48(struct Sprite *sprite);
+static void sub_80D1A74(struct Sprite *sprite);
+static void sub_80D1B14(struct Sprite *sprite);
+static void sub_80D1B94(struct Sprite *sprite);
+static void sub_80D1CCC(struct Sprite *sprite);
+static void sub_80D1C30(struct Sprite *sprite);
+
+static void sub_80D0D8C(u8 cursorArea, u8 cursorPos)
+{
+ u16 heldItem;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+ if (sub_80D1324(cursorArea, cursorPos))
+ return;
+
+ switch (cursorArea)
+ {
+ case CURSOR_AREA_IN_BOX:
+ if (!GetCurrentBoxMonData(cursorPos, MON_DATA_SANITY_HAS_SPECIES))
+ return;
+ heldItem = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM);
+ break;
+ case CURSOR_AREA_IN_PARTY:
+ if (cursorPos >= PARTY_SIZE || !GetMonData(&gPlayerParty[cursorPos], MON_DATA_SANITY_HAS_SPECIES))
+ return;
+ heldItem = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM);
+ break;
+ default:
+ return;
+ }
+
+ if (heldItem != 0)
+ {
+ const u32 *tiles = GetItemIconPic(heldItem);
+ const u32 *pal = GetItemIconPalette(heldItem);
+ u8 id = sub_80D12E8();
+
+ sub_80D140C(id, cursorArea, cursorPos);
+ sub_80D1524(id, tiles, pal);
+ sub_80D15D4(id, 1);
+ sub_80D1740(id, TRUE);
+ }
+}
+
+static void sub_80D0E50(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ id = sub_80D1370(cursorArea, cursorPos);
+ sub_80D15D4(id, 2);
+ sub_80D1604(id, 0, cursorArea, cursorPos);
+}
+
+static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+ u16 item;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ id = sub_80D1370(cursorArea, cursorPos);
+ item = 0;
+ sub_80D15D4(id, 3);
+ sub_80D1604(id, 1, cursorArea, cursorPos);
+ sub_80D140C(id, 2, 0);
+ if (cursorArea == CURSOR_AREA_IN_BOX)
+ {
+ SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item);
+ SetBoxMonIconObjMode(cursorPos, 1);
+ }
+ else
+ {
+ SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item);
+ SetPartyMonIconObjMode(cursorPos, 1);
+ }
+
+ sPSSData->movingItem = sPSSData->cursorMonItem;
+}
+
+static void sub_80D0F38(u16 item)
+{
+ const u32 *tiles = GetItemIconPic(item);
+ const u32 *pal = GetItemIconPalette(item);
+ u8 id = sub_80D12E8();
+
+ sub_80D1524(id, tiles, pal);
+ sub_80D15D4(id, 6);
+ sub_80D1604(id, 1, 0, 0);
+ sub_80D140C(id, 2, 0);
+ sub_80D1740(id, TRUE);
+ sPSSData->movingItem = item;
+}
+
+static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+ u16 item;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ id = sub_80D1370(cursorArea, cursorPos);
+ sub_80D15D4(id, 3);
+ sub_80D1604(id, 3, 2, 0);
+ if (cursorArea == CURSOR_AREA_IN_BOX)
+ {
+ item = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM);
+ SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem);
+ sPSSData->movingItem = item;
+ }
+ else
+ {
+ item = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM);
+ SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem);
+ sPSSData->movingItem = item;
+ }
+
+ id = sub_80D1370(2, 0);
+ sub_80D15D4(id, 4);
+ sub_80D1604(id, 4, cursorArea, cursorPos);
+}
+
+static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ id = sub_80D1370(2, 0);
+ sub_80D15D4(id, 4);
+ sub_80D1604(id, 2, cursorArea, cursorPos);
+ if (cursorArea == CURSOR_AREA_IN_BOX)
+ {
+ SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem);
+ SetBoxMonIconObjMode(cursorPos, 0);
+ }
+ else
+ {
+ SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem);
+ SetPartyMonIconObjMode(cursorPos, 0);
+ }
+}
+
+static void Item_TakeMons(u8 cursorArea, u8 cursorPos)
+{
+ u8 id;
+ u16 item;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ item = 0;
+ id = sub_80D1370(cursorArea, cursorPos);
+ sub_80D15D4(id, 2);
+ sub_80D1604(id, 0, cursorArea, cursorPos);
+ if (cursorArea == CURSOR_AREA_IN_BOX)
+ {
+ SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item);
+ SetBoxMonIconObjMode(cursorPos, 1);
+ }
+ else
+ {
+ SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item);
+ SetPartyMonIconObjMode(cursorPos, 1);
+ }
+}
+
+static void sub_80D1194(void)
+{
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ u8 id = sub_80D1370(2, 0);
+ sub_80D15D4(id, 5);
+ sub_80D1604(id, 0, 2, 0);
+ }
+}
+
+static void sub_80D11CC(void)
+{
+ s32 i;
+
+ if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS)
+ return;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 1)
+ sub_80D1604(i, 7, 2, 0);
+ }
+}
+
+static bool8 sub_80D1218(void)
+{
+ s32 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (sPSSData->field_2204[i].unk10)
+ {
+ if (!sPSSData->field_2204[i].sprite->affineAnimEnded && sPSSData->field_2204[i].sprite->affineAnimBeginning)
+ return TRUE;
+ if (sPSSData->field_2204[i].sprite->callback != SpriteCallbackDummy && sPSSData->field_2204[i].sprite->callback != sub_80D1AD8)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static bool8 IsActiveItemMoving(void)
+{
+ s32 i;
+
+ if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 2)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static const u8 *GetMovingItemName(void)
+{
+ return ItemId_GetName(sPSSData->movingItem);
+}
+
+static u16 GetMovingItem(void)
+{
+ return sPSSData->movingItem;
+}
+
+static u8 sub_80D12E8(void)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (sPSSData->field_2204[i].unk10 == 0)
+ {
+ sPSSData->field_2204[i].unk10 = 1;
+ return i;
+ }
+ }
+
+ return 3;
+}
+
+static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos)
+{
+ s32 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (sPSSData->field_2204[i].unk10
+ && sPSSData->field_2204[i].unk8 == cursorArea
+ && sPSSData->field_2204[i].unk9 == cursorPos)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static u8 sub_80D1370(u8 cursorArea, u8 cursorPos)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (sPSSData->field_2204[i].unk10
+ && sPSSData->field_2204[i].unk8 == cursorArea
+ && sPSSData->field_2204[i].unk9 == cursorPos)
+ return i;
+ }
+
+ return 3;
+}
+
+static u8 sub_80D13C4(struct Sprite *sprite)
+{
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (sPSSData->field_2204[i].unk10
+ && sPSSData->field_2204[i].sprite == sprite)
+ return i;
+ }
+
+ return 3;
+}
+
+static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos)
+{
+ u8 row, column;
+
+ if (id >= 3)
+ return;
+
+ switch (cursorArea)
+ {
+ case CURSOR_AREA_IN_BOX:
+ row = cursorPos % IN_BOX_ROWS;
+ column = cursorPos / IN_BOX_ROWS;
+ sPSSData->field_2204[id].sprite->pos1.x = (24 * row) + 112;
+ sPSSData->field_2204[id].sprite->pos1.y = (24 * column) + 56;
+ sPSSData->field_2204[id].sprite->oam.priority = 2;
+ break;
+ case CURSOR_AREA_IN_PARTY:
+ if (cursorPos == 0)
+ {
+ sPSSData->field_2204[id].sprite->pos1.x = 116;
+ sPSSData->field_2204[id].sprite->pos1.y = 76;
+ }
+ else
+ {
+ sPSSData->field_2204[id].sprite->pos1.x = 164;
+ sPSSData->field_2204[id].sprite->pos1.y = 24 * (cursorPos - 1) + 28;
+ }
+ sPSSData->field_2204[id].sprite->oam.priority = 1;
+ break;
+ }
+
+ sPSSData->field_2204[id].unk8 = cursorArea;
+ sPSSData->field_2204[id].unk9 = cursorPos;
+}
+
+static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal)
+{
+ s32 i;
+
+ if (id >= 3)
+ return;
+
+ CpuFastFill(0, sPSSData->field_42C4, 0x200);
+ LZ77UnCompWram(itemTiles, sPSSData->field_22C4);
+ for (i = 0; i < 3; i++)
+ CpuFastCopy(sPSSData->field_22C4 + (i * 0x60), sPSSData->field_42C4 + (i * 0x80), 0x60);
+
+ CpuFastCopy(sPSSData->field_42C4, sPSSData->field_2204[id].tiles, 0x200);
+ LZ77UnCompWram(itemPal, sPSSData->field_42C4);
+ LoadPalette(sPSSData->field_42C4, sPSSData->field_2204[id].palIndex, 0x20);
+}
+
+static void sub_80D15D4(u8 id, u8 animNum)
+{
+ if (id >= 3)
+ return;
+
+ StartSpriteAffineAnim(sPSSData->field_2204[id].sprite, animNum);
+}
+
+static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3)
+{
+ if (id >= 3)
+ return;
+
+ switch (arg1)
+ {
+ case 0:
+ sPSSData->field_2204[id].sprite->data[0] = id;
+ sPSSData->field_2204[id].sprite->callback = sub_80D1A48;
+ break;
+ case 1:
+ sPSSData->field_2204[id].sprite->data[0] = 0;
+ sPSSData->field_2204[id].sprite->callback = sub_80D1A74;
+ break;
+ case 2:
+ sPSSData->field_2204[id].sprite->data[0] = 0;
+ sPSSData->field_2204[id].sprite->data[6] = arg2;
+ sPSSData->field_2204[id].sprite->data[7] = arg3;
+ sPSSData->field_2204[id].sprite->callback = sub_80D1B14;
+ break;
+ case 3:
+ sPSSData->field_2204[id].sprite->data[0] = 0;
+ sPSSData->field_2204[id].sprite->callback = sub_80D1B94;
+ sPSSData->field_2204[id].sprite->data[6] = arg2;
+ sPSSData->field_2204[id].sprite->data[7] = arg3;
+ break;
+ case 4:
+ sPSSData->field_2204[id].sprite->data[0] = 0;
+ sPSSData->field_2204[id].sprite->data[6] = arg2;
+ sPSSData->field_2204[id].sprite->data[7] = arg3;
+ sPSSData->field_2204[id].sprite->callback = sub_80D1C30;
+ break;
+ case 7:
+ sPSSData->field_2204[id].sprite->callback = sub_80D1CCC;
+ break;
+ }
+}
+
+static void sub_80D1740(u8 id, bool8 arg1)
+{
+ if (id >= 3)
+ return;
+
+ sPSSData->field_2204[id].unk10 = arg1;
+ sPSSData->field_2204[id].sprite->invisible = (arg1 == FALSE);
+}
+
+static const u32 *GetItemIconPic(u16 itemId)
+{
+ return GetItemIconPicOrPalette(itemId, 0);
+}
+
+static const u32 *GetItemIconPalette(u16 itemId)
+{
+ return GetItemIconPicOrPalette(itemId, 1);
+}
+
+static void PrintItemDescription(void)
+{
+ const u8 *description;
+
+ if (IsActiveItemMoving())
+ description = ItemId_GetDescription(sPSSData->movingItem);
+ else
+ description = ItemId_GetDescription(sPSSData->cursorMonItem);
+
+ FillWindowPixelBuffer(2, 0x11);
+ AddTextPrinterParameterized5(2, 1, description, 4, 0, 0, NULL, 0, 1);
+}
+
+static void sub_80D1818(void)
+{
+ sPSSData->field_2236 = 0x15;
+ LoadBgTiles(0, gUnknown_0857BB24, 0x80, 0x13A);
+ sub_80D19B4(0);
+}
+
+static bool8 sub_80D184C(void)
+{
+ s32 i, var;
+
+ if (sPSSData->field_2236 == 0)
+ return FALSE;
+
+ sPSSData->field_2236--;
+ var = 0x15 - sPSSData->field_2236;
+ for (i = 0; i < var; i++)
+ {
+ WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21);
+ }
+
+ sub_80D19B4(var);
+ return (sPSSData->field_2236 != 0);
+}
+
+static bool8 sub_80D18E4(void)
+{
+ s32 i, var;
+
+ if (sPSSData->field_2236 == 0x16)
+ return FALSE;
+
+ if (sPSSData->field_2236 == 0)
+ FillBgTilemapBufferRect(0, 0, 21, 12, 1, 9, 17);
+
+ sPSSData->field_2236++;
+ var = 0x15 - sPSSData->field_2236;
+ for (i = 0; i < var; i++)
+ {
+ WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21);
+ }
+
+ if (var >= 0)
+ sub_80D19B4(var);
+
+ FillBgTilemapBufferRect(0, 0, var + 1, 12, 1, 9, 0x11);
+ schedule_bg_copy_tilemap_to_vram(0);
+ return TRUE;
+}
+
+static void sub_80D19B4(u32 arg0)
+{
+ if (arg0 != 0)
+ {
+ FillBgTilemapBufferRect(0, 0x13A, 0, 0xC, arg0, 1, 0xFu);
+ FillBgTilemapBufferRect(0, 0x93A, 0, 0x14, arg0, 1, 0xFu);
+ }
+ FillBgTilemapBufferRect(0, 0x13B, arg0, 0xD, 1, 7, 0xFu);
+ FillBgTilemapBufferRect(0, 0x13C, arg0, 0xC, 1, 1, 0xFu);
+ FillBgTilemapBufferRect(0, 0x13D, arg0, 0x14, 1, 1, 0xFu);
+ schedule_bg_copy_tilemap_to_vram(0);
+}
+
+static void sub_80D1A48(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ sub_80D1740(sprite->data[0], FALSE);
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_80D1A74(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = sprite->pos1.x << 4;
+ sprite->data[2] = sprite->pos1.y << 4;
+ sprite->data[3] = 10;
+ sprite->data[4] = 21;
+ sprite->data[5] = 0;
+ sprite->data[0]++;
+ case 1:
+ sprite->data[1] -= sprite->data[3];
+ sprite->data[2] -= sprite->data[4];
+ sprite->pos1.x = sprite->data[1] >> 4;
+ sprite->pos1.y = sprite->data[2] >> 4;
+ if (++sprite->data[5] > 11)
+ sprite->callback = sub_80D1AD8;
+ break;
+ }
+}
+
+static void sub_80D1AD8(struct Sprite *sprite)
+{
+ sprite->pos1.x = sPSSData->field_CB4->pos1.x + 4;
+ sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 8;
+ sprite->oam.priority = sPSSData->field_CB4->oam.priority;
+}
+
+static void sub_80D1B14(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = sprite->pos1.x << 4;
+ sprite->data[2] = sprite->pos1.y << 4;
+ sprite->data[3] = 10;
+ sprite->data[4] = 21;
+ sprite->data[5] = 0;
+ sprite->data[0]++;
+ case 1:
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+ sprite->pos1.x = sprite->data[1] >> 4;
+ sprite->pos1.y = sprite->data[2] >> 4;
+ if (++sprite->data[5] > 11)
+ {
+ sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]);
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+static void sub_80D1B94(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = sprite->pos1.x << 4;
+ sprite->data[2] = sprite->pos1.y << 4;
+ sprite->data[3] = 10;
+ sprite->data[4] = 21;
+ sprite->data[5] = 0;
+ sprite->data[0]++;
+ case 1:
+ sprite->data[1] -= sprite->data[3];
+ sprite->data[2] -= sprite->data[4];
+ sprite->pos1.x = sprite->data[1] >> 4;
+ sprite->pos1.y = sprite->data[2] >> 4;
+ sprite->pos2.x = gSineTable[sprite->data[5] * 8] >> 4;
+ if (++sprite->data[5] > 11)
+ {
+ sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]);
+ sprite->pos2.x = 0;
+ sprite->callback = sub_80D1AD8;
+ }
+ break;
+ }
+}
+
+static void sub_80D1C30(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = sprite->pos1.x << 4;
+ sprite->data[2] = sprite->pos1.y << 4;
+ sprite->data[3] = 10;
+ sprite->data[4] = 21;
+ sprite->data[5] = 0;
+ sprite->data[0]++;
+ case 1:
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+ sprite->pos1.x = sprite->data[1] >> 4;
+ sprite->pos1.y = sprite->data[2] >> 4;
+ sprite->pos2.x = -(gSineTable[sprite->data[5] * 8] >> 4);
+ if (++sprite->data[5] > 11)
+ {
+ sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]);
+ sprite->callback = SpriteCallbackDummy;
+ sprite->pos2.x = 0;
+ }
+ break;
+ }
+}
+
+static void sub_80D1CCC(struct Sprite *sprite)
+{
+ sprite->pos1.y -= 8;
+ if (sprite->pos1.y + sprite->pos2.y < -16)
+ {
+ sprite->callback = SpriteCallbackDummy;
+ sub_80D1740(sub_80D13C4(sprite), FALSE);
+ }
+}
+
+void nullsub_pss(void)
+{
+
+}
+
+void nullsub_98(void)
+{
+
+}
+
+// Functions here are general utility functions.
+u8 StorageGetCurrentBox(void)
+{
+ return gPokemonStoragePtr->currentBox;
+}
+
+static void SetCurrentBox(u8 boxId)
+{
+ if (boxId < TOTAL_BOXES_COUNT)
+ gPokemonStoragePtr->currentBox = boxId;
+}
+
+u32 GetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request);
+ else
+ return 0;
+}
+
+void SetBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, const void *value)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, value);
+}
+
+u32 GetCurrentBoxMonData(u8 boxPosition, s32 request)
+{
+ return GetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request);
+}
+
+void SetCurrentBoxMonData(u8 boxPosition, s32 request, const void *value)
+{
+ SetBoxMonDataAt(gPokemonStoragePtr->currentBox, boxPosition, request, value);
+}
+
+void GetBoxMonNickAt(u8 boxId, u8 boxPosition, u8 *dst)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, dst);
+ else
+ *dst = EOS;
+}
+
+u32 GetBoxMonLevelAt(u8 boxId, u8 boxPosition)
+{
+ u32 lvl;
+
+ // BUG: Missed 'else' statement.
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT && GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES))
+ lvl = GetLevelFromBoxMonExp(&gPokemonStoragePtr->boxes[boxId][boxPosition]);
+ // else
+ lvl = 0;
+
+ return lvl;
+}
+
+void SetBoxMonNickAt(u8 boxId, u8 boxPosition, const u8 *nick)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ SetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_NICKNAME, nick);
+}
+
+u32 GetAndCopyBoxMonDataAt(u8 boxId, u8 boxPosition, s32 request, void *dst)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ return GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], request, dst);
+ else
+ return 0;
+}
+
+void SetBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon *src)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ gPokemonStoragePtr->boxes[boxId][boxPosition] = *src;
+}
+
+void CopyBoxMonAt(u8 boxId, u8 boxPosition, struct BoxPokemon *dst)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ *dst = gPokemonStoragePtr->boxes[boxId][boxPosition];
+}
+
+void CreateBoxMonAt(u8 boxId, u8 boxPosition, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 personality, u8 otIDType, u32 otID)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ {
+ CreateBoxMon(&gPokemonStoragePtr->boxes[boxId][boxPosition],
+ species,
+ level,
+ fixedIV,
+ hasFixedPersonality, personality,
+ otIDType, otID);
+ }
+}
+
+void ZeroBoxMonAt(u8 boxId, u8 boxPosition)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ ZeroBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition]);
+}
+
+void BoxMonAtToMon(u8 boxId, u8 boxPosition, struct Pokemon *dst)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ BoxMonToMon(&gPokemonStoragePtr->boxes[boxId][boxPosition], dst);
+}
+
+struct BoxPokemon *GetBoxedMonPtr(u8 boxId, u8 boxPosition)
+{
+ if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT)
+ return &gPokemonStoragePtr->boxes[boxId][boxPosition];
+ else
+ return NULL;
+}
+
+u8 *GetBoxNamePtr(u8 boxId)
+{
+ if (boxId < TOTAL_BOXES_COUNT)
+ return gPokemonStoragePtr->boxNames[boxId];
+ else
+ return NULL;
+}
+
+u8 GetBoxWallpaper(u8 boxId)
+{
+ if (boxId < TOTAL_BOXES_COUNT)
+ return gPokemonStoragePtr->boxWallpapers[boxId];
+ else
+ return 0;
+}
+
+void SetBoxWallpaper(u8 boxId, u8 wallpaperId)
+{
+ if (boxId < TOTAL_BOXES_COUNT && wallpaperId < WALLPAPER_COUNT)
+ gPokemonStoragePtr->boxWallpapers[boxId] = wallpaperId;
+}
+
+s16 sub_80D214C(struct BoxPokemon *boxMons, u8 currIndex, u8 maxIndex, u8 arg3)
+{
+ s16 i;
+ s16 adder = -1;
+
+ if (arg3 < 2)
+ adder = 1;
+
+ if (arg3 == 1 || arg3 == 3)
+ {
+ for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder)
+ {
+ if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE)
+ return i;
+ }
+ }
+ else
+ {
+ for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder)
+ {
+ if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE
+ && !GetBoxMonData(&boxMons[i], MON_DATA_IS_EGG))
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+bool8 CheckFreePokemonStorageSpace(void)
+{
+ s32 i, j;
+
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (!GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool32 CheckBoxMonSanityAt(u32 boxId, u32 boxPosition)
+{
+ if (boxId < TOTAL_BOXES_COUNT
+ && boxPosition < IN_BOX_COUNT
+ && GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)
+ && !GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_IS_EGG)
+ && !GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_IS_BAD_EGG))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u32 CountStorageNonEggMons(void)
+{
+ s32 i, j;
+ u32 count = 0;
+
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES)
+ && !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG))
+ count++;
+ }
+ }
+
+ return count;
+}
+
+u32 CountAllStorageMons(void)
+{
+ s32 i, j;
+ u32 count = 0;
+
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES)
+ || GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG))
+ count++;
+ }
+ }
+
+ return count;
+}
+
+bool32 AnyStorageMonWithMove(u16 moveId)
+{
+ u16 moves[] = {moveId, MOVES_COUNT};
+ s32 i, j;
+
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_HAS_SPECIES)
+ && !GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_SANITY_IS_EGG)
+ && GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_KNOWN_MOVES, moves))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void ResetWaldaWallpaper(void)
+{
+ gSaveBlock1Ptr->waldaPhrase.iconId = 0;
+ gSaveBlock1Ptr->waldaPhrase.patternId = 0;
+ gSaveBlock1Ptr->waldaPhrase.patternUnlocked = FALSE;
+ gSaveBlock1Ptr->waldaPhrase.colors[0] = RGB(21, 25, 30);
+ gSaveBlock1Ptr->waldaPhrase.colors[1] = RGB(6, 12, 24);
+ gSaveBlock1Ptr->waldaPhrase.text[0] = EOS;
+}
+
+void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked)
+{
+ gSaveBlock1Ptr->waldaPhrase.patternUnlocked = unlocked;
+}
+
+bool32 IsWaldaWallpaperUnlocked(void)
+{
+ return gSaveBlock1Ptr->waldaPhrase.patternUnlocked;
+}
+
+u32 GetWaldaWallpaperPatternId(void)
+{
+ return gSaveBlock1Ptr->waldaPhrase.patternId;
+}
+
+void SetWaldaWallpaperPatternId(u8 id)
+{
+ if (id < FRIENDS_WALLPAPERS_COUNT)
+ gSaveBlock1Ptr->waldaPhrase.patternId = id;
+}
+
+u32 GetWaldaWallpaperIconId(void)
+{
+ return gSaveBlock1Ptr->waldaPhrase.iconId;
+}
+
+void SetWaldaWallpaperIconId(u8 id)
+{
+ if (id < 30)
+ gSaveBlock1Ptr->waldaPhrase.iconId = id;
+}
+
+u16 *GetWaldaWallpaperColorsPtr(void)
+{
+ return gSaveBlock1Ptr->waldaPhrase.colors;
+}
+
+void SetWaldaWallpaperColors(u16 color1, u16 color2)
+{
+ gSaveBlock1Ptr->waldaPhrase.colors[0] = color1;
+ gSaveBlock1Ptr->waldaPhrase.colors[1] = color2;
+}
+
+u8 *GetWaldaPhrasePtr(void)
+{
+ return gSaveBlock1Ptr->waldaPhrase.text;
+}
+
+void SetWaldaPhrase(const u8 *src)
+{
+ StringCopy(gSaveBlock1Ptr->waldaPhrase.text, src);
+}
+
+bool32 IsWaldaPhraseEmpty(void)
+{
+ return (gSaveBlock1Ptr->waldaPhrase.text[0] == EOS);
+}
+
+// Not sure what the purpose of these functions is.
+// They seem to only be called while PSS is initialized.
+
+EWRAM_DATA static struct UnkStruct_2039D84 *gUnknown_02039D84 = NULL;
+EWRAM_DATA static u16 gUnknown_02039D88 = 0;
+
+static void sub_80D259C(u8 count)
+{
+ u16 i;
+
+ gUnknown_02039D84 = Alloc(sizeof(*gUnknown_02039D84) * count);
+ gUnknown_02039D88 = (gUnknown_02039D84 == NULL) ? 0 : count;
+ for (i = 0; i < gUnknown_02039D88; i++)
+ {
+ gUnknown_02039D84[i].field_18 = NULL;
+ gUnknown_02039D84[i].field_2C = 0;
+ }
+}
+
+static void sub_80D25F0(void)
+{
+ Free(gUnknown_02039D84);
+}
+
+static void sub_80D2604(void)
+{
+ s32 i;
+
+ for (i = 0; i < gUnknown_02039D88; i++)
+ {
+ if (gUnknown_02039D84[i].field_2C == 1)
+ sub_80D2918(i);
+ }
+}
+
+struct
+{
+ u16 a;
+ u16 b;
+}
+static const sUnkVars[][4] =
+{
+ {
+ {0x0100, 0x0100},
+ {0x0200, 0x0100},
+ {0x0100, 0x0200},
+ {0x0200, 0x0200},
+ },
+ {
+ {0x0080, 0x0080},
+ {0x0100, 0x0100},
+ {0x0200, 0x0200},
+ {0x0400, 0x0400},
+ },
+};
+
+static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4)
+{
+ u16 bgScreenSize, bgType;
+
+ if (id >= gUnknown_02039D88)
+ return;
+
+ gUnknown_02039D84[id].field_18 = NULL;
+ gUnknown_02039D84[id].field_1C = arg2;
+ gUnknown_02039D84[id].field_2B = bg;
+ gUnknown_02039D84[id].field_24 = arg3;
+ gUnknown_02039D84[id].field_26 = arg4;
+
+ bgScreenSize = GetBgAttribute(bg, BG_ATTR_SCREENSIZE);
+ bgType = GetBgAttribute(bg, BG_ATTR_TYPE);
+ gUnknown_02039D84[id].field_20 = sUnkVars[bgType][bgScreenSize].a;
+ gUnknown_02039D84[id].field_22 = sUnkVars[bgType][bgScreenSize].b;
+ if (bgType != 0)
+ gUnknown_02039D84[id].field_2A = 1;
+ else
+ gUnknown_02039D84[id].field_2A = 2;
+
+ gUnknown_02039D84[id].field_28 = gUnknown_02039D84[id].field_2A * arg3;
+ gUnknown_02039D84[id].field_0[1].field_4 = arg3;
+ gUnknown_02039D84[id].field_0[1].field_6 = arg4;
+ gUnknown_02039D84[id].field_0[1].field_0 = 0;
+ gUnknown_02039D84[id].field_0[1].field_2 = 0;
+ gUnknown_02039D84[id].field_0[1].field_8 = 0;
+ gUnknown_02039D84[id].field_0[1].field_A = 0;
+ gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1];
+ gUnknown_02039D84[id].field_2C = 1;
+}
+
+static void sub_80D2740(u8 id, const void *arg1)
+{
+ if (id >= gUnknown_02039D88)
+ return;
+
+ gUnknown_02039D84[id].field_18 = arg1;
+ gUnknown_02039D84[id].field_2C = 1;
+}
+
+static void sub_80D2770(u8 id, u16 arg1, u16 arg2)
+{
+ if (id >= gUnknown_02039D88)
+ return;
+
+ gUnknown_02039D84[id].field_0[1].field_8 = arg1;
+ gUnknown_02039D84[id].field_0[1].field_A = arg2;
+ gUnknown_02039D84[id].field_2C = 1;
+}
+
+static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4)
+{
+ if (id >= gUnknown_02039D88)
+ return;
+
+ gUnknown_02039D84[id].field_0[1].field_0 = arg1;
+ gUnknown_02039D84[id].field_0[1].field_2 = arg2;
+ gUnknown_02039D84[id].field_0[1].field_4 = arg3;
+ gUnknown_02039D84[id].field_0[1].field_6 = arg4;
+ gUnknown_02039D84[id].field_2C = 1;
+}
+
+static void sub_80D27F4(u8 id, u8 arg1, s8 arg2)
+{
+ if (id >= gUnknown_02039D88)
+ return;
+
+ switch (arg1)
+ {
+ case 0:
+ gUnknown_02039D84[id].field_0[1].field_8 += arg2;
+ gUnknown_02039D84[id].field_0[1].field_4 -= arg2;
+ break;
+ case 1:
+ gUnknown_02039D84[id].field_0[1].field_0 += arg2;
+ gUnknown_02039D84[id].field_0[1].field_4 += arg2;
+ break;
+ case 2:
+ gUnknown_02039D84[id].field_0[1].field_A += arg2;
+ gUnknown_02039D84[id].field_0[1].field_6 -= arg2;
+ break;
+ case 3:
+ gUnknown_02039D84[id].field_0[1].field_2 -= arg2;
+ gUnknown_02039D84[id].field_0[1].field_6 += arg2;
+ break;
+ case 4:
+ gUnknown_02039D84[id].field_0[1].field_8 += arg2;
+ break;
+ case 5:
+ gUnknown_02039D84[id].field_0[1].field_A += arg2;
+ break;
+ }
+
+ gUnknown_02039D84[id].field_2C = 1;
+}
+
+static void sub_80D2918(u8 id)
+{
+ if (id >= gUnknown_02039D88)
+ return;
+
+ if (gUnknown_02039D84[id].field_18 != NULL)
+ sub_80D2960(id);
+
+ sub_80D29F8(id);
+ gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1];
+}
+
+static void sub_80D2960(u8 id)
+{
+ s32 i;
+ u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_20;
+ const void *tiles = (gUnknown_02039D84[id].field_18 + (adder * gUnknown_02039D84[id].field_0[0].field_A))
+ + (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[0].field_8);
+
+ for (i = 0; i < gUnknown_02039D84[id].field_0[0].field_6; i++)
+ {
+ CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B,
+ tiles,
+ gUnknown_02039D84[id].field_0[0].field_8,
+ gUnknown_02039D84[id].field_0[0].field_A + i,
+ gUnknown_02039D84[id].field_0[0].field_4,
+ 1);
+ tiles += adder;
+ }
+}
+
+static void sub_80D29F8(u8 id)
+{
+ s32 i;
+ u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_24;
+ const void *tiles = (gUnknown_02039D84[id].field_1C + (adder * gUnknown_02039D84[id].field_0[1].field_2))
+ + (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[1].field_0);
+
+ for (i = 0; i < gUnknown_02039D84[id].field_0[1].field_6; i++)
+ {
+ CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B,
+ tiles,
+ gUnknown_02039D84[id].field_0[1].field_8,
+ gUnknown_02039D84[id].field_0[1].field_A + i,
+ gUnknown_02039D84[id].field_0[1].field_4,
+ 1);
+ tiles += adder;
+ }
+}
+
+EWRAM_DATA static struct UnkStruct_2000020 *gUnknown_02039D8C = NULL;
+
+static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2)
+{
+ gUnknown_02039D8C = arg0;
+ arg0->unk_00 = arg1;
+ arg0->unk_05 = arg2;
+ arg0->unk_04 = 0;
+}
+
+static void sub_80D2AA4(void)
+{
+ u16 i;
+
+ if (gUnknown_02039D8C->unk_04)
+ {
+ for (i = 0; i < gUnknown_02039D8C->unk_04; i++)
+ {
+ struct UnkStruct_2000028 *unkStruct = &gUnknown_02039D8C->unk_00[i];
+ unkStruct->unk_0c(unkStruct);
+ }
+
+ gUnknown_02039D8C->unk_04 = 0;
+ }
+}
+
+static bool8 sub_80D2AEC(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg)
+{
+ struct UnkStruct_2000028 *unkStruct;
+
+ if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05)
+ return FALSE;
+
+ unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++];
+ unkStruct->unk_08 = width * 2;
+ unkStruct->unk_04 = dest + 2 * (dTop * 32 + dLeft);
+ unkStruct->unk_00 = src + 2 * (sTop * unkArg + sLeft);
+ unkStruct->newField = height;
+ unkStruct->unk_0a = unkArg;
+ unkStruct->unk_0c = sub_80D2B88;
+ return TRUE;
+}
+
+static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct)
+{
+ u16 i;
+
+ for (i = 0; i < unkStruct->newField; i++)
+ {
+ CpuSet(unkStruct->unk_00, unkStruct->unk_04, (unkStruct->unk_08 / 2));
+ unkStruct->unk_04 += 64;
+ unkStruct->unk_00 += (unkStruct->unk_0a * 2);
+ }
+}
+
+static bool8 sub_80D2BC0(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height)
+{
+ struct UnkStruct_2000028 *unkStruct;
+
+ if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05)
+ return FALSE;
+
+ unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++];
+ unkStruct->unk_08 = width * 2;
+ unkStruct->unk_04 = dest + ((dTop * 32) + dLeft) * 2;
+ unkStruct->newField = height;
+ unkStruct->unk_0c = sub_80D2C1C;
+ return TRUE;
+}
+
+static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct)
+{
+ u16 i;
+
+ for (i = 0; i < unkStruct->newField; i++)
+ {
+ Dma3FillLarge_(0, unkStruct->unk_04, unkStruct->unk_08, 16);
+ unkStruct->unk_04 += 64;
+ }
+}
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index fb2a43786..14d5aa9dc 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -5,6 +5,7 @@
#include "frontier_util.h"
#include "battle_message.h"
#include "battle_tent.h"
+#include "battle_factory.h"
#include "bg.h"
#include "contest.h"
#include "contest_effect.h"
@@ -45,8 +46,6 @@
#include "constants/songs.h"
#include "constants/species.h"
-extern bool8 sub_81A6BF4(void);
-
static EWRAM_DATA struct UnkSummaryStruct
{
/*0x00*/ union {
@@ -129,7 +128,6 @@ struct UnkStruct_61CC04
};
// forward declarations
-bool8 IsMultiBattle(void);
static bool8 SummaryScreen_LoadGraphics(void);
static void SummaryScreen_LoadingCB2(void);
static void InitBGs(void);
@@ -238,8 +236,6 @@ static void sub_81C4568(u8 a, u8 b);
static u8 sub_81C45F4(struct Pokemon *a, s16 *b);
static u8 sub_81C47B4(struct Pokemon *unused);
static void sub_81C4844(struct Sprite *);
-void SummaryScreen_SetUnknownTaskId(u8 a);
-void SummaryScreen_DestroyUnknownTask(void);
static void sub_81C48F0(void);
static void CreateMonMarkingsSprite(struct Pokemon *mon);
static void RemoveAndCreateMonMarkingsSprite(struct Pokemon *mon);
@@ -315,7 +311,7 @@ static const struct UnkStruct_61CC04 gUnknown_0861CC10 =
static const s8 gUnknown_0861CC1C[] = {0, 2, 3, 1, 4, 5};
static const struct WindowTemplate gUnknown_0861CC24[] =
{
- {
+ {//Text for Pokemon Info
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
@@ -324,7 +320,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 1,
},
- {
+ {//Text for Pokemon Skills
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
@@ -333,7 +329,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 23,
},
- {
+ {//Text for Battle Moves
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
@@ -342,7 +338,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 45,
},
- {
+ {//Text for Contest Moves
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 0,
@@ -351,7 +347,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 67,
},
- {
+ { //Text on Pokemon Info: Button prompt: Cancel
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 0,
@@ -360,7 +356,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 7,
.baseBlock = 89,
},
- {
+ {//Info button found under moves
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 0,
@@ -369,7 +365,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 7,
.baseBlock = 105,
},
- {
+ {//Switch button under moves when viewing moves
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 0,
@@ -378,7 +374,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 7,
.baseBlock = 121,
},
- {
+ {//Unknown
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 4,
@@ -387,7 +383,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 137,
},
- {
+ {//Unknown
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 4,
@@ -396,7 +392,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 137,
},
- {
+ {//Type on pokemon info page
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 6,
@@ -405,7 +401,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 173,
},
- {
+ {//HP, Attack and Defense text
.bg = 0,
.tilemapLeft = 10,
.tilemapTop = 7,
@@ -414,7 +410,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 209,
},
- {
+ {//Sp. atk, Sp. Def and Speed texxt
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 7,
@@ -423,7 +419,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 245,
},
- {
+ {//EXP and next lvl.
.bg = 0,
.tilemapLeft = 10,
.tilemapTop = 14,
@@ -432,7 +428,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 275,
},
- {
+ {//Unknown
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 18,
@@ -441,7 +437,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 319,
},
- {
+ {//move text: Power, Accuracy and their numeric values.
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 15,
@@ -450,7 +446,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 331,
},
- {
+ {//contest text: appeal and jam
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 15,
@@ -459,7 +455,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 367,
},
- {
+ {//Unknown
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 4,
@@ -468,7 +464,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 387,
},
- {
+ {//No.
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 2,
@@ -477,7 +473,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 7,
.baseBlock = 387,
},
- {
+ {//Upper name
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 12,
@@ -486,7 +482,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
.paletteNum = 6,
.baseBlock = 395,
},
- {
+ {//Lower name
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 14,
@@ -499,7 +495,7 @@ static const struct WindowTemplate gUnknown_0861CC24[] =
};
static const struct WindowTemplate gUnknown_0861CCCC[] =
{
- {
+ {//Original Trainer
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 4,
@@ -508,7 +504,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] =
.paletteNum = 6,
.baseBlock = 449,
},
- {
+ {//ID numbers
.bg = 0,
.tilemapLeft = 22,
.tilemapTop = 4,
@@ -517,7 +513,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] =
.paletteNum = 6,
.baseBlock = 471,
},
- {
+ {//Ability
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 9,
@@ -526,7 +522,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] =
.paletteNum = 6,
.baseBlock = 485,
},
- {
+ {//Trainer Memo
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 14,
@@ -538,7 +534,7 @@ static const struct WindowTemplate gUnknown_0861CCCC[] =
};
static const struct WindowTemplate gUnknown_0861CCEC[] =
{
- {
+ {//Held Item string
.bg = 0,
.tilemapLeft = 10,
.tilemapTop = 4,
@@ -547,7 +543,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] =
.paletteNum = 6,
.baseBlock = 449,
},
- {
+ {//Ribbon string
.bg = 0,
.tilemapLeft = 20,
.tilemapTop = 4,
@@ -556,7 +552,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] =
.paletteNum = 6,
.baseBlock = 469,
},
- {
+ {//Stat numbers left (HP, ATK & DEF)
.bg = 0,
.tilemapLeft = 16,
.tilemapTop = 7,
@@ -565,7 +561,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] =
.paletteNum = 6,
.baseBlock = 489,
},
- {
+ {//Stat numbers right (SP.ATK, SP.DEF & SPEED)
.bg = 0,
.tilemapLeft = 27,
.tilemapTop = 7,
@@ -574,7 +570,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] =
.paletteNum = 6,
.baseBlock = 525,
},
- {
+ {//Exp numbers
.bg = 0,
.tilemapLeft = 24,
.tilemapTop = 14,
@@ -586,7 +582,7 @@ static const struct WindowTemplate gUnknown_0861CCEC[] =
};
static const struct WindowTemplate gUnknown_0861CD14[] =
{
- {
+ {//Move names?
.bg = 0,
.tilemapLeft = 15,
.tilemapTop = 4,
@@ -595,7 +591,7 @@ static const struct WindowTemplate gUnknown_0861CD14[] =
.paletteNum = 6,
.baseBlock = 449,
},
- {
+ {//PP Numbers
.bg = 0,
.tilemapLeft = 24,
.tilemapTop = 4,
@@ -604,7 +600,7 @@ static const struct WindowTemplate gUnknown_0861CD14[] =
.paletteNum = 8,
.baseBlock = 539,
},
- {
+ {//Move description text
.bg = 0,
.tilemapLeft = 10,
.tilemapTop = 15,
@@ -1005,7 +1001,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex,
pssData->maxMonIndex = maxMonIndex;
pssData->callback = callback;
- if (mode == PSS_MODE_UNK2)
+ if (mode == PSS_MODE_BOX)
pssData->isBoxMon = TRUE;
else
pssData->isBoxMon = FALSE;
@@ -1013,7 +1009,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex,
switch (mode)
{
case PSS_MODE_NORMAL:
- case PSS_MODE_UNK2:
+ case PSS_MODE_BOX:
pssData->minPageIndex = 0;
pssData->maxPageIndex = 3;
break;
@@ -1255,27 +1251,27 @@ static bool8 SummaryScreen_DecompressGraphics(void)
pssData->unk40F0++;
break;
case 7:
- LoadCompressedObjectPic(&sSpriteSheet_MoveTypes);
+ LoadCompressedSpriteSheet(&sSpriteSheet_MoveTypes);
pssData->unk40F0++;
break;
case 8:
- LoadCompressedObjectPic(&gUnknown_0861D074);
+ LoadCompressedSpriteSheet(&gUnknown_0861D074);
pssData->unk40F0++;
break;
case 9:
- LoadCompressedObjectPic(&gUnknown_0861D0F8);
+ LoadCompressedSpriteSheet(&gUnknown_0861D0F8);
pssData->unk40F0++;
break;
case 10:
- LoadCompressedObjectPalette(&gUnknown_0861D100);
+ LoadCompressedSpritePalette(&gUnknown_0861D100);
pssData->unk40F0++;
break;
case 11:
- LoadCompressedObjectPalette(&gUnknown_0861D07C);
+ LoadCompressedSpritePalette(&gUnknown_0861D07C);
pssData->unk40F0++;
break;
case 12:
- LoadCompressedPalette(&gMoveTypes_Pal, 0x1D0, 0x60);
+ LoadCompressedPalette(gMoveTypes_Pal, 0x1D0, 0x60);
pssData->unk40F0 = 0;
return TRUE;
}
@@ -1310,7 +1306,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *a)
sum->altAbility = GetMonData(a, MON_DATA_ALT_ABILITY);
sum->item = GetMonData(a, MON_DATA_HELD_ITEM);
sum->pid = GetMonData(a, MON_DATA_PERSONALITY);
- sum->sanity = GetMonData(a, MON_DATA_SANITY_BIT1);
+ sum->sanity = GetMonData(a, MON_DATA_SANITY_IS_BAD_EGG);
if (sum->sanity)
sum->isEgg = TRUE;
@@ -1319,7 +1315,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *a)
break;
case 1:
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
sum->moves[i] = GetMonData(a, MON_DATA_MOVE1+i);
sum->pp[i] = GetMonData(a, MON_DATA_PP1+i);
@@ -1327,7 +1323,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *a)
sum->ppBonuses = GetMonData(a, MON_DATA_PP_BONUSES);
break;
case 2:
- if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_UNK2 || pssData->unk40EF == TRUE)
+ if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_BOX || pssData->unk40EF == TRUE)
{
sum->nature = GetNature(a);
sum->currentHP = GetMonData(a, MON_DATA_HP);
@@ -1692,15 +1688,15 @@ static void sub_81C0B8C(u8 taskId)
if (pssData->unk40C9 == 0)
{
data[1] = 1;
- SetBgAttribute(1, 7, 1);
- SetBgAttribute(2, 7, 2);
+ SetBgAttribute(1, BG_ATTR_PRIORITY, 1);
+ SetBgAttribute(2, BG_ATTR_PRIORITY, 2);
schedule_bg_copy_tilemap_to_vram(1);
}
else
{
data[1] = 2;
- SetBgAttribute(2, 7, 1);
- SetBgAttribute(1, 7, 2);
+ SetBgAttribute(2, BG_ATTR_PRIORITY, 1);
+ SetBgAttribute(1, BG_ATTR_PRIORITY, 2);
schedule_bg_copy_tilemap_to_vram(2);
}
ChangeBgX(data[1], 0, 0);
@@ -1749,14 +1745,14 @@ static void sub_81C0D44(u8 taskId)
s16 *data = gTasks[taskId].data;
if (pssData->unk40C9 == 0)
{
- SetBgAttribute(1, 7, 1);
- SetBgAttribute(2, 7, 2);
+ SetBgAttribute(1, BG_ATTR_PRIORITY, 1);
+ SetBgAttribute(2, BG_ATTR_PRIORITY, 2);
schedule_bg_copy_tilemap_to_vram(2);
}
else
{
- SetBgAttribute(2, 7, 1);
- SetBgAttribute(1, 7, 2);
+ SetBgAttribute(2, BG_ATTR_PRIORITY, 1);
+ SetBgAttribute(1, BG_ATTR_PRIORITY, 2);
schedule_bg_copy_tilemap_to_vram(1);
}
if (pssData->currPageIndex > 1)
@@ -1855,7 +1851,7 @@ static void sub_81C0F44(u8 taskId)
static bool8 sub_81C1040(void)
{
u8 i;
- for (i = 1; i < 4; i++)
+ for (i = 1; i < MAX_MON_MOVES; i++)
{
if (pssData->summary.moves[i] != 0)
return TRUE;
@@ -1871,14 +1867,14 @@ static void sub_81C1070(s16 *a, s8 b, u8 *c)
PlaySE(SE_SELECT);
moveIndex = *c;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
moveIndex += b;
if (moveIndex > a[0])
moveIndex = 0;
else if (moveIndex < 0)
moveIndex = a[0];
- if (moveIndex == 4)
+ if (moveIndex == MAX_MON_MOVES)
{
move = pssData->newMove;
break;
@@ -2147,7 +2143,7 @@ static void sub_81C174C(u8 taskId)
static bool8 sub_81C18A8(void)
{
- if (pssData->firstMoveIndex == MAX_MON_MOVES || pssData->newMove == MOVE_NONE || sub_81B6D14(pssData->summary.moves[pssData->firstMoveIndex]) != 1)
+ if (pssData->firstMoveIndex == MAX_MON_MOVES || pssData->newMove == MOVE_NONE || IsMoveHm(pssData->summary.moves[pssData->firstMoveIndex]) != 1)
return TRUE;
else
return FALSE;
@@ -3552,7 +3548,7 @@ static void PrintContestMoveDescription(u8 moveSlot)
{
u16 move;
- if (moveSlot == 4)
+ if (moveSlot == MAX_MON_MOVES)
move = pssData->newMove;
else
move = pssData->summary.moves[moveSlot];
@@ -3748,7 +3744,7 @@ static void sub_81C4420(void)
{
u8 i;
struct PokeSummary *summary = &pssData->summary;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (summary->moves[i] != MOVE_NONE)
SetMoveTypeSpritePosAndType(gBattleMoves[summary->moves[i]].type, 0x55, 0x20 + (i * 0x10), i + 3);
@@ -3761,7 +3757,7 @@ static void sub_81C4484(void)
{
u8 i;
struct PokeSummary *summary = &pssData->summary;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
if (summary->moves[i] != MOVE_NONE)
SetMoveTypeSpritePosAndType(NUMBER_OF_MON_TYPES + gContestMoves[summary->moves[i]].contestCategory, 0x55, 0x20 + (i * 0x10), i + 3);
@@ -3829,7 +3825,7 @@ static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1)
{
if (gMonSpritesGfxPtr != NULL)
{
- if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_UNK2 || pssData->unk40EF == TRUE)
+ if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_BOX || pssData->unk40EF == TRUE)
{
HandleLoadSpecialPokePic_2(&gMonFrontPicTable[summary->species2], gMonSpritesGfxPtr->sprites[1], summary->species2, summary->pid);
}
@@ -3840,7 +3836,7 @@ static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1)
}
else
{
- if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_UNK2 || pssData->unk40EF == TRUE)
+ if (pssData->monList.mons == gPlayerParty || pssData->mode == PSS_MODE_BOX || pssData->unk40EF == TRUE)
{
HandleLoadSpecialPokePic_2(&gMonFrontPicTable[summary->species2], sub_806F4F8(0, 1), summary->species2, summary->pid);
}
@@ -3854,7 +3850,7 @@ static u8 sub_81C45F4(struct Pokemon *mon, s16 *a1)
return -1;
case 1:
pal = GetMonSpritePalStructFromOtIdPersonality(summary->species2, summary->OTID, summary->pid);
- LoadCompressedObjectPalette(pal);
+ LoadCompressedSpritePalette(pal);
SetMultiuseSpriteTemplateToPokemon(pal->tag, 1);
(*a1)++;
return -1;
diff --git a/src/post_battle_event_funcs.c b/src/post_battle_event_funcs.c
index 934972b7c..3cbf6ecd2 100644
--- a/src/post_battle_event_funcs.c
+++ b/src/post_battle_event_funcs.c
@@ -34,12 +34,12 @@ int GameClear(void)
if (GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME) == 0)
SetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME, (gSaveBlock2Ptr->playTimeHours << 16) | (gSaveBlock2Ptr->playTimeMinutes << 8) | gSaveBlock2Ptr->playTimeSeconds);
- SetSecretBase2Field_9();
+ SetContinueGameWarpStatus();
if (gSaveBlock2Ptr->playerGender == MALE)
- sub_8084F6C(HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F);
+ SetContinueGameWarpToHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F);
else
- sub_8084F6C(HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F);
+ SetContinueGameWarpToHealLocation(HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F);
ribbonGet = FALSE;
@@ -50,8 +50,8 @@ int GameClear(void)
ribbonCounts[i].partyIndex = i;
ribbonCounts[i].count = 0;
- if (GetMonData(mon, MON_DATA_SANITY_BIT2)
- && !GetMonData(mon, MON_DATA_SANITY_BIT3)
+ if (GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES)
+ && !GetMonData(mon, MON_DATA_SANITY_IS_EGG)
&& !GetMonData(mon, MON_DATA_CHAMPION_RIBBON))
{
u8 val[1] = {TRUE};
diff --git a/src/psychic.c b/src/psychic.c
index efd15f746..5756fe97f 100644
--- a/src/psychic.c
+++ b/src/psychic.c
@@ -1,18 +1,33 @@
#include "global.h"
#include "battle_anim.h"
+#include "gpu_regs.h"
+#include "palette.h"
+#include "sound.h"
+#include "scanline_effect.h"
+#include "trig.h"
#include "constants/rgb.h"
+#include "constants/songs.h"
-extern void sub_80A77C8(struct Sprite *);
-extern void sub_810F1EC(struct Sprite *);
-extern void sub_810F1EC(struct Sprite *);
-extern void sub_810F58C(struct Sprite *);
-extern void TranslateAnimSpriteToTargetMonLocation(struct Sprite *);
-extern void sub_810F634(struct Sprite *);
-extern void sub_810F6B0(struct Sprite *);
-extern void sub_810FBA8(struct Sprite *);
-extern void sub_810FDF0(struct Sprite *);
-extern void sub_80A77C8(struct Sprite *);
-extern void sub_8110240(struct Sprite *);
+void sub_810F1EC(struct Sprite *);
+void sub_810F58C(struct Sprite *);
+void sub_810F634(struct Sprite *);
+void sub_810F6B0(struct Sprite *);
+void sub_810FBA8(struct Sprite *);
+void sub_810FDF0(struct Sprite *);
+void sub_8110240(struct Sprite *);
+static void sub_810F340(struct Sprite *);
+static void sub_810F3C8(struct Sprite *);
+static void sub_810F400(struct Sprite *);
+static void sub_810F46C(struct Sprite *);
+static void sub_810F524(struct Sprite *);
+static void sub_810F740(struct Sprite *);
+static void sub_810F774(struct Sprite *);
+static void sub_810F810(u8);
+static void sub_810F898(u8);
+static void sub_810F9D4(u8);
+static void sub_810FD3C(u8);
+static void sub_810FF34(u8);
+static void sub_8110134(u8);
const union AffineAnimCmd gUnknown_0859652C[] =
{
@@ -403,3 +418,744 @@ const struct SpriteTemplate gUnknown_08596920 =
.affineAnims = gUnknown_08596918,
.callback = sub_8110240,
};
+
+void sub_810F1EC(struct Sprite *sprite)
+{
+ u8 isContest = IsContest();
+
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || isContest)
+ {
+ sprite->oam.priority = 2;
+ sprite->subpriority = 200;
+ }
+
+ if (!isContest)
+ {
+ u8 battlerCopy;
+ u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ u8 rank = GetBattlerSpriteBGPriorityRank(battler);
+ int var0 = 1;
+ u8 toBG_2 = (rank ^ var0) != 0;
+
+ if (IsBattlerSpriteVisible(battler))
+ MoveBattlerSpriteToBG(battler, toBG_2, FALSE);
+
+ battler = BATTLE_PARTNER(battlerCopy);
+ if (IsBattlerSpriteVisible(battler))
+ MoveBattlerSpriteToBG(battler, toBG_2 ^ var0, FALSE);
+ }
+
+ if (!isContest && IsDoubleBattle())
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x = 72;
+ sprite->pos1.y = 80;
+ }
+ else
+ {
+ sprite->pos1.x = 176;
+ sprite->pos1.y = 40;
+ }
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];
+ }
+
+ sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16;
+
+ if (isContest)
+ {
+ sprite->pos1.y += 9;
+ sprite->callback = sub_810F3C8;
+ sprite->callback(sprite);
+ }
+ else
+ {
+ sprite->callback = sub_810F340;
+ }
+}
+
+static void sub_810F340(struct Sprite *sprite)
+{
+ u8 battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ if (!sprite->data[7])
+ {
+ sprite->data[7] = 1;
+ return;
+ }
+
+ if (IsBattlerSpriteVisible(battler))
+ gSprites[gBattlerSpriteIds[battler]].invisible = 1;
+
+ battler = BATTLE_PARTNER(battler);
+ if (IsBattlerSpriteVisible(battler))
+ gSprites[gBattlerSpriteIds[battler]].invisible = 1;
+
+ sprite->callback = sub_810F3C8;
+ sprite->callback(sprite);
+}
+
+static void sub_810F3C8(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));
+ if (sprite->data[3] == 13)
+ sprite->callback = sub_810F400;
+ else
+ sprite->data[3]++;
+}
+
+static void sub_810F400(struct Sprite *sprite)
+{
+ u16 color;
+ u16 startOffset;
+ int i;
+
+ if (++sprite->data[1] == 2)
+ {
+ sprite->data[1] = 0;
+ startOffset = sprite->data[0];
+ color = gPlttBufferFaded[startOffset + 8];
+
+ for (i = 8; i > 0; i--)
+ gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1];
+
+ gPlttBufferFaded[startOffset + 1] = color;
+
+ if (++sprite->data[2] == 16)
+ sprite->callback = sub_810F46C;
+ }
+}
+
+static void sub_810F46C(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));
+
+ if (--sprite->data[3] == -1)
+ {
+ if (!IsContest())
+ {
+ u8 battlerCopy;
+ u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+
+ if (IsBattlerSpriteVisible(battler))
+ gSprites[gBattlerSpriteIds[battler]].invisible = 0;
+
+ battler = BATTLE_PARTNER(battlerCopy);
+ if (IsBattlerSpriteVisible(battler))
+ gSprites[gBattlerSpriteIds[battler]].invisible = 0;
+ }
+
+ sprite->invisible = 1;
+ sprite->callback = sub_810F524;
+ }
+}
+
+static void sub_810F524(struct Sprite *sprite)
+{
+ if (!IsContest())
+ {
+ u8 battlerCopy;
+ u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ u8 rank = GetBattlerSpriteBGPriorityRank(battler);
+ int var0 = 1;
+ u8 toBG_2 = (rank ^ var0) != 0;
+
+ if (IsBattlerSpriteVisible(battler))
+ sub_80A477C(toBG_2);
+
+ battler = battlerCopy ^ 2;
+ if (IsBattlerSpriteVisible(battler))
+ sub_80A477C(toBG_2 ^ var0);
+ }
+
+ sprite->callback = DestroyAnimSprite;
+}
+
+void sub_810F58C(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ int arg3 = gBattleAnimArgs[3];
+ bool8 respectMonPicOffsets = FALSE;
+ if (arg3 == 0)
+ respectMonPicOffsets = TRUE;
+
+ if (!IsContest() && IsDoubleBattle())
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x = 72 - gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1] + 80;
+ }
+ else
+ {
+ sprite->pos1.x = gBattleAnimArgs[0] + 176;
+ sprite->pos1.y = gBattleAnimArgs[1] + 40;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[2] == 0)
+ InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets);
+ else
+ InitSpritePosToAnimTarget(sprite, respectMonPicOffsets);
+ }
+
+ sprite->data[0]++;
+ }
+ else
+ {
+ if (sprite->animEnded || sprite->affineAnimEnded)
+ DestroySpriteAndMatrix(sprite);
+ }
+}
+
+void sub_810F634(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->pos1.x -= 40;
+ sprite->pos1.y += 10;
+ sprite->data[1] = -1;
+ }
+ else
+ {
+ sprite->pos1.x += 40;
+ sprite->pos1.y -= 10;
+ sprite->data[1] = 1;
+ }
+
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+}
+
+void sub_810F6B0(struct Sprite *sprite)
+{
+ s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2;
+ s16 y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / -2;
+
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ x = -x;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + x;
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + y;
+
+ if (sprite->pos1.y < 16)
+ sprite->pos1.y = 16;
+
+ StoreSpriteCallbackInData6(sprite, sub_810F740);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+}
+
+static void sub_810F740(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 1;
+ sprite->affineAnims = gUnknown_08596740;
+ sprite->data[0] = 0;
+ InitSpriteAffineAnim(sprite);
+ sprite->callback = sub_810F774;
+}
+
+static void sub_810F774(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (sprite->affineAnimEnded)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.affineMode = 0;
+ sprite->data[1] = 18;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (--sprite->data[1] == -1)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+void sub_810F7D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ task->data[0] = spriteId;
+ PrepareAffineAnimInTaskData(task, spriteId, gUnknown_0859675C);
+ task->func = sub_810F810;
+}
+
+static void sub_810F810(u8 taskId)
+{
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_810F83C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8;
+
+ PrepareAffineAnimInTaskData(task, task->data[0], gUnknown_0859677C);
+ task->func = sub_810F898;
+}
+
+static void sub_810F898(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[1])
+ {
+ case 0:
+ RunAffineAnimFromTaskData(task);
+ if (++task->data[2] > 19)
+ task->data[1]++;
+ break;
+ case 1:
+ if (task->data[3] != 0)
+ {
+ gSprites[task->data[0]].pos2.y -= 8;
+ task->data[3]--;
+ }
+ else
+ {
+ gSprites[task->data[0]].invisible = 1;
+ gSprites[task->data[0]].pos1.x = 272;
+ ResetSpriteRotScale(task->data[0]);
+ DestroyAnimVisualTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_810F940(u8 taskId)
+{
+ u16 var0, var1;
+
+ struct Task *task = &gTasks[taskId];
+
+ task->data[3] = 16;
+ task->data[4] = 0;
+ task->data[13] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+
+ var0 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 3;
+ var1 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 3;
+ task->data[12] = var0 > var1 ? var0 : var1;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
+
+ task->func = sub_810F9D4;
+}
+
+static void sub_810F9D4(u8 taskId)
+{
+ u16 i;
+ u8 spriteId;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 8)
+ {
+ task->data[1] = 0;
+ spriteId = CreateSprite(&gUnknown_08596794, task->data[13], task->data[14], 0);
+ task->data[task->data[2] + 8] = spriteId;
+ if (spriteId != MAX_SPRITES)
+ {
+ switch (task->data[2])
+ {
+ case 0:
+ gSprites[spriteId].pos2.x = task->data[12];
+ gSprites[spriteId].pos2.y = -task->data[12];
+ break;
+ case 1:
+ gSprites[spriteId].pos2.x = -task->data[12];
+ gSprites[spriteId].pos2.y = task->data[12];
+ break;
+ case 2:
+ gSprites[spriteId].pos2.x = task->data[12];
+ gSprites[spriteId].pos2.y = task->data[12];
+ break;
+ case 3:
+ gSprites[spriteId].pos2.x = -task->data[12];
+ gSprites[spriteId].pos2.y = -task->data[12];
+ break;
+ }
+ }
+
+ if (++task->data[2] == 5)
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (task->data[1] & 1)
+ task->data[3]--;
+ else
+ task->data[4]++;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));
+ if (++task->data[1] == 32)
+ {
+ for (i = 8; i < 13; i++)
+ {
+ if (task->data[i] != 64)
+ DestroySprite(&gSprites[task->data[i]]);
+ }
+
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ task->data[0]++;
+ break;
+ case 3:
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void sub_810FB60(struct Sprite *sprite)
+{
+ if (sprite->data[1] > sprite->data[0] - 10)
+ sprite->invisible = sprite->data[1] & 1;
+
+ if (sprite->data[1] == sprite->data[0])
+ DestroyAnimSprite(sprite);
+
+ sprite->data[1]++;
+}
+
+void sub_810FBA8(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ }
+
+ sprite->data[0] = gBattleAnimArgs[1];
+ sprite->callback = sub_810FB60;
+}
+
+void sub_810FBF0(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (IsContest())
+ {
+ if (gBattleAnimArgs[0] == 1)
+ {
+ task->data[10] = -10;
+ task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8;
+ task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8;
+ task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8;
+ task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8;
+ }
+ else
+ {
+ task->data[10] = 10;
+ task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8;
+ task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8;
+ task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8;
+ task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[0] == 1)
+ {
+ task->data[10] = -10;
+ task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8;
+ task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) + 8;
+ task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_LEFT) + 8;
+ task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) + 8;
+ }
+ else
+ {
+ task->data[10] = 10;
+ task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_RIGHT) - 8;
+ task->data[12] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_BOTTOM) - 8;
+ task->data[13] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8;
+ task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8;
+ }
+ }
+
+ task->data[1] = 6;
+ task->func = sub_810FD3C;
+}
+
+static void sub_810FD3C(u8 taskId)
+{
+ u8 spriteId;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 6)
+ {
+ task->data[1] = 0;
+ spriteId = CreateSprite(&gUnknown_08596864, task->data[11], task->data[12], 0);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].data[0] = 16;
+ gSprites[spriteId].data[2] = task->data[13];
+ gSprites[spriteId].data[4] = task->data[14];
+ gSprites[spriteId].data[5] = task->data[10];
+
+ InitAnimArcTranslation(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3);
+ }
+
+ if (++task->data[2] == 12)
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (++task->data[1] > 17)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_810FDF0(struct Sprite *sprite)
+{
+ if (TranslateAnimArc(sprite))
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+ }
+}
+
+void sub_810FE14(u8 taskId)
+{
+ s16 i;
+ u8 yOffset;
+ struct ScanlineEffectParams scanlineParams;
+ struct Task *task = &gTasks[taskId];
+
+ yOffset = GetBattlerYCoordWithElevation(gBattleAnimTarget);
+ task->data[14] = yOffset - 32;
+
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ task->data[11] = 2;
+ task->data[12] = 5;
+ task->data[13] = 64;
+ task->data[15] = yOffset + 32;
+ break;
+ case 1:
+ task->data[11] = 2;
+ task->data[12] = 5;
+ task->data[13] = 192;
+ task->data[15] = yOffset + 32;
+ break;
+ case 2:
+ task->data[11] = 4;
+ task->data[12] = 4;
+ task->data[13] = 0;
+ task->data[15] = yOffset + 32;
+ break;
+ }
+
+ if (task->data[14] < 0)
+ task->data[14] = 0;
+
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)
+ {
+ task->data[10] = gBattle_BG1_X;
+ scanlineParams.dmaDest = &REG_BG1HOFS;
+ }
+ else
+ {
+ task->data[10] = gBattle_BG2_X;
+ scanlineParams.dmaDest = &REG_BG2HOFS;
+ }
+
+ i = task->data[14];
+ while (i <= task->data[14] + 64)
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[10];
+ gScanlineEffectRegBuffers[1][i] = task->data[10];
+ i++;
+ }
+
+ scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ ScanlineEffect_SetParams(scanlineParams);
+ task->func = sub_810FF34;
+}
+
+static void sub_810FF34(u8 taskId)
+{
+ s16 sineIndex, i;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sineIndex = task->data[13];
+ i = task->data[14];
+ while (i <= task->data[15])
+ {
+ s16 var2 = (gSineTable[sineIndex] >> task->data[12]);
+ if (var2 > 0)
+ var2 += (task->data[1] & 3);
+ else if (var2 < 0)
+ var2 -= (task->data[1] & 3);
+
+ gScanlineEffectRegBuffers[0][i] = task->data[10] + var2;
+ gScanlineEffectRegBuffers[1][i] = task->data[10] + var2;
+ sineIndex += task->data[11];
+ i++;
+ }
+
+ if (++task->data[1] > 23)
+ task->data[0]++;
+ break;
+ case 1:
+ gScanlineEffect.state = 3;
+ task->data[0]++;
+ break;
+ case 2:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_8110034(u8 taskId)
+{
+ s16 spriteId;
+ s16 matrixNum;
+ struct Task *task = &gTasks[taskId];
+
+ matrixNum = AllocOamMatrix();
+ if (matrixNum == 0xFF)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ spriteId = CloneBattlerSpriteWithBlend(gBattleAnimArgs[0]);
+ if (spriteId < 0)
+ {
+ FreeOamMatrix(matrixNum);
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ gSprites[spriteId].oam.matrixNum = matrixNum;
+ gSprites[spriteId].affineAnimPaused = 1;
+ gSprites[spriteId].subpriority++;
+ SetSpriteRotScale(spriteId, 256, 256, 0);
+ CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);
+ task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ task->data[14] = matrixNum;
+ task->data[15] = spriteId;
+ task->func = sub_8110134;
+}
+
+static void sub_8110134(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[1] += 4;
+ task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);
+ SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0);
+ SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]);
+ if (task->data[1] == 48)
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[1] -= 4;
+ task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);;
+ SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0);
+ SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]);
+ if (task->data[1] == 0)
+ task->data[0]++;
+ break;
+ case 2:
+ obj_delete_but_dont_free_vram(&gSprites[task->data[15]]);
+ task->data[0]++;
+ break;
+ case 3:
+ FreeOamMatrix(task->data[14]);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_8110240(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+
+ if (IsContest())
+ sprite->pos1.y += 12;
+
+ sprite->data[1] = 8;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));
+ sprite->data[0]++;
+ break;
+ case 1:
+ if (sprite->affineAnimEnded)
+ {
+ PlaySE12WithPanning(SE_W100, BattleAnimAdjustPanning(-64));
+ ChangeSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->data[2]++ > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->data[1]--;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));
+ if (sprite->data[1] == 0)
+ {
+ sprite->data[0]++;
+ sprite->invisible = 1;
+ }
+ }
+
+ sprite->data[3] += 0x380;
+ sprite->pos2.y -= sprite->data[3] >> 8;
+ sprite->data[3] &= 0xFF;
+ break;
+ case 3:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c
index b22e1db32..00a73a0a2 100644
--- a/src/rayquaza_scene.c
+++ b/src/rayquaza_scene.c
@@ -1528,14 +1528,14 @@ static void sub_81D706C(void)
LZDecompressWram(gRaySceneClouds1_Tilemap, sRayScene->tilemapBuffers[1]);
LZDecompressWram(gRaySceneClouds3_Tilemap, sRayScene->tilemapBuffers[2]);
LoadCompressedPalette(gRaySceneClouds_Pal, 0, 0x40);
- LoadCompressedObjectPic(&sUnknown_0862A8C4);
- LoadCompressedObjectPic(&sUnknown_0862A8F8);
- LoadCompressedObjectPic(&sUnknown_0862A924);
- LoadCompressedObjectPic(&sUnknown_0862A9D4);
- LoadCompressedObjectPic(&sUnknown_0862AA14);
- LoadCompressedObjectPic(&sUnknown_0862AA34);
- LoadCompressedObjectPalette(&sUnknown_0862A8CC);
- LoadCompressedObjectPalette(&sUnknown_0862A9DC);
+ LoadCompressedSpriteSheet(&sUnknown_0862A8C4);
+ LoadCompressedSpriteSheet(&sUnknown_0862A8F8);
+ LoadCompressedSpriteSheet(&sUnknown_0862A924);
+ LoadCompressedSpriteSheet(&sUnknown_0862A9D4);
+ LoadCompressedSpriteSheet(&sUnknown_0862AA14);
+ LoadCompressedSpriteSheet(&sUnknown_0862AA34);
+ LoadCompressedSpritePalette(&sUnknown_0862A8CC);
+ LoadCompressedSpritePalette(&sUnknown_0862A9DC);
}
static void Task_DuoFightAnim(u8 taskId)
@@ -1708,7 +1708,7 @@ static void sub_81D752C(u8 taskId)
if (data[0] != 16)
{
data[0]++;
- SetGpuReg(REG_OFFSET_BLDALPHA, (data[0] << 8) | (16 - data[0]));
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - data[0], data[0]));
}
}
@@ -1943,8 +1943,8 @@ static void sub_81D7E9C(void)
LZDecompressWram(gRaySceneOvercast_Tilemap, sRayScene->tilemapBuffers[1]);
LZDecompressWram(gRaySceneRayquaza_Tilemap, sRayScene->tilemapBuffers[2]);
LoadCompressedPalette(gRaySceneRayquaza_Pal, 0, 0x40);
- LoadCompressedObjectPic(&sUnknown_0862AA90);
- LoadCompressedObjectPalette(&sUnknown_0862AA98);
+ LoadCompressedSpriteSheet(&sUnknown_0862AA90);
+ LoadCompressedSpritePalette(&sUnknown_0862AA98);
}
static void Task_RayTakesFlightAnim(u8 taskId)
@@ -1954,7 +1954,7 @@ static void Task_RayTakesFlightAnim(u8 taskId)
sub_81D7E10();
sub_81D7E9C();
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x808);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
BlendPalettes(-1, 0x10, 0);
SetVBlankCallback(VBlankCB_RayquazaScene);
CreateTask(sub_81D81A4, 0);
@@ -2118,9 +2118,9 @@ static void sub_81D8358(void)
LoadCompressedPalette(gRaySceneOvercast2_Pal, 0, 0x40);
gPlttBufferUnfaded[0] = RGB_WHITE;
gPlttBufferFaded[0] = RGB_WHITE;
- LoadCompressedObjectPic(&sUnknown_0862AAFC);
- LoadCompressedObjectPic(&sUnknown_0862AB04);
- LoadCompressedObjectPalette(&sUnknown_0862AB0C);
+ LoadCompressedSpriteSheet(&sUnknown_0862AAFC);
+ LoadCompressedSpriteSheet(&sUnknown_0862AB04);
+ LoadCompressedSpritePalette(&sUnknown_0862AB0C);
}
static void sub_81D844C(void)
@@ -2153,7 +2153,7 @@ static void Task_RayDescendsAnim(u8 taskId)
sub_81D82B0();
sub_81D8358();
SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
BlendPalettes(-1, 0x10, 0);
SetVBlankCallback(VBlankCB_RayquazaScene);
sRayScene->field_2008 = 0;
@@ -2489,16 +2489,16 @@ static void sub_81D8CC4(void)
LZDecompressWram(gRaySceneHushBg_Tilemap, sRayScene->tilemapBuffers[0]);
LZDecompressWram(gRaySceneHushRing_Map, sRayScene->tilemapBuffers[2]);
LoadCompressedPalette(gRaySceneHushBg_Pal, 0, 0x60);
- LoadCompressedObjectPic(&sUnknown_0862AC28);
- LoadCompressedObjectPic(&sUnknown_0862AC30);
- LoadCompressedObjectPic(&sUnknown_0862AC38);
- LoadCompressedObjectPic(&sUnknown_0862AC40);
- LoadCompressedObjectPic(&sUnknown_0862AC48);
- LoadCompressedObjectPic(&sUnknown_0862AC50);
- LoadCompressedObjectPalette(&sUnknown_0862AC58);
- LoadCompressedObjectPalette(&sUnknown_0862AC60);
- LoadCompressedObjectPalette(&sUnknown_0862AC68);
- LoadCompressedObjectPalette(&sUnknown_0862AC70);
+ LoadCompressedSpriteSheet(&sUnknown_0862AC28);
+ LoadCompressedSpriteSheet(&sUnknown_0862AC30);
+ LoadCompressedSpriteSheet(&sUnknown_0862AC38);
+ LoadCompressedSpriteSheet(&sUnknown_0862AC40);
+ LoadCompressedSpriteSheet(&sUnknown_0862AC48);
+ LoadCompressedSpriteSheet(&sUnknown_0862AC50);
+ LoadCompressedSpritePalette(&sUnknown_0862AC58);
+ LoadCompressedSpritePalette(&sUnknown_0862AC60);
+ LoadCompressedSpritePalette(&sUnknown_0862AC68);
+ LoadCompressedSpritePalette(&sUnknown_0862AC70);
}
static void Task_RayChasesAwayAnim(u8 taskId)
@@ -2509,7 +2509,7 @@ static void Task_RayChasesAwayAnim(u8 taskId)
sub_81D68C8();
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0xE09);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 14));
BlendPalettes(-1, 0x10, 0);
SetVBlankCallback(VBlankCB_RayquazaScene);
data[0] = 0;
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 2b497c82b..189033685 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -741,711 +741,184 @@ static u8 sub_80E7B54(void)
return gUnknown_03001160;
}
-#ifdef NONMATCHING
static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows)
{
- // r9 = which
- u16 i;
- u16 j;
+ u16 i, j;
u8 linkPlayerCount;
- u16 language;
- u16 otNameLanguage;
- u16 nicknameLanguage;
- u32 version;
- u8 dcMail1;
- u8 dcMail2;
- u8 r1_80e7b54;
- struct DayCareMail *recordMixingMail;
+ u8 tableId;
struct RecordMixingDayCareMail *_src;
+ u8 which0, which1;
+ void *ptr;
u8 sp04[4];
u8 sp08[4];
- struct RecordMixingDayCareMail *sp0c[4]; // -> sp+48
- u8 sp1c[4][2]; // [][0] -> sp+4c, [][1] -> sp+50
+ struct RecordMixingDayCareMail *sp0c[4];
+ u8 sp1c[4][2];
u8 sp24[4][2];
- // sp+2c = src
- // sp+30 = recordSize
u8 sp34;
u16 oldSeed;
- bool32 anyRS; // sp+3c
+ bool32 anyRS;
oldSeed = Random2();
SeedRng2(gLinkPlayers[0].trainerId);
linkPlayerCount = GetLinkPlayerCount();
- for (i = 0; i < 4; i ++)
+ for (i = 0; i < 4; i++)
{
sp04[i] = 0xFF;
sp08[i] = 0;
sp1c[i][0] = 0;
sp1c[i][1] = 0;
}
+
anyRS = Link_AnyPartnersPlayingRubyOrSapphire();
- for (i = 0; i < GetLinkPlayerCount(); i ++) // r8 = i
+ for (i = 0; i < GetLinkPlayerCount(); i++)
{
- // sp+54 = linkPlayerCount << 16
- // sp+44 = which * recordSize
- _src = (void *)src + i * recordSize; // r7
- language = gLinkPlayers[i].language; // r9
- version = (u8)gLinkPlayers[i].version; // sp+40
- for (j = 0; j < _src->unk_70; j ++)
+ u32 language, version;
+
+ _src = (void *)src + i * recordSize;
+ language = gLinkPlayers[i].language;
+ version = gLinkPlayers[i].version & 0xFF;
+ for (j = 0; j < _src->numDaycareMons; j ++)
{
- // r10 = ~0x10
- recordMixingMail = &_src->unk_00[j];
- if (recordMixingMail->mail.itemId != ITEM_NONE)
+ u16 otNameLanguage, nicknameLanguage;
+ struct DayCareMail *recordMixingMail = &_src->mail[j];
+
+ if (!recordMixingMail->message.itemId)
+ continue;
+
+ if (anyRS)
{
- if (anyRS)
+ if (StringLength(recordMixingMail->OT_name) <= 5)
{
- if (StringLength(recordMixingMail->OT_name) <= 5)
- {
- otNameLanguage = LANGUAGE_JAPANESE;
- }
- else
- {
- StripExtCtrlCodes(recordMixingMail->OT_name);
- otNameLanguage = language;
- }
- if (recordMixingMail->monName[0] == EXT_CTRL_CODE_BEGIN && recordMixingMail->monName[1] == EXT_CTRL_CODE_JPN)
- {
- StripExtCtrlCodes(recordMixingMail->monName);
- nicknameLanguage = LANGUAGE_JAPANESE;
- }
- else
- {
- nicknameLanguage = language;
- }
- if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
- {
- recordMixingMail->language_maybe = otNameLanguage;
- recordMixingMail->unknown = nicknameLanguage;
- }
+ otNameLanguage = LANGUAGE_JAPANESE;
}
- else if (language == LANGUAGE_JAPANESE)
+ else
{
- if (IsStringJapanese(recordMixingMail->OT_name))
- {
- recordMixingMail->language_maybe = LANGUAGE_JAPANESE;
- }
- else
- {
- recordMixingMail->language_maybe = GAME_LANGUAGE;
- }
- if (IsStringJapanese(recordMixingMail->monName))
- {
- recordMixingMail->unknown = LANGUAGE_JAPANESE;
- }
- else
- {
- recordMixingMail->unknown = GAME_LANGUAGE;
- }
+ StripExtCtrlCodes(recordMixingMail->OT_name);
+ otNameLanguage = language;
+ }
+
+ if (recordMixingMail->monName[0] == EXT_CTRL_CODE_BEGIN && recordMixingMail->monName[1] == EXT_CTRL_CODE_JPN)
+ {
+ StripExtCtrlCodes(recordMixingMail->monName);
+ nicknameLanguage = LANGUAGE_JAPANESE;
+ }
+ else
+ {
+ nicknameLanguage = language;
+ }
+
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ {
+ recordMixingMail->gameLanguage = otNameLanguage;
+ recordMixingMail->monLanguage = nicknameLanguage;
}
}
+ else if (language == LANGUAGE_JAPANESE)
+ {
+ if (IsStringJapanese(recordMixingMail->OT_name))
+ recordMixingMail->gameLanguage = LANGUAGE_JAPANESE;
+ else
+ recordMixingMail->gameLanguage = GAME_LANGUAGE;
+
+ if (IsStringJapanese(recordMixingMail->monName))
+ recordMixingMail->monLanguage = LANGUAGE_JAPANESE;
+ else
+ recordMixingMail->monLanguage = GAME_LANGUAGE;
+ }
}
}
+
sp34 = 0;
- for (i = 0; i < linkPlayerCount; i ++)
+ for (i = 0; i < linkPlayerCount; i++)
{
- _src = (void *)src + i * recordSize; // r7
- if (_src->unk_70 != 0)
+ _src = (void *)src + i * recordSize;
+ if (_src->numDaycareMons == 0)
+ continue;
+
+ for (j = 0; j < _src->numDaycareMons; j ++)
{
- for (j = 0; j < _src->unk_70; j ++)
- {
- if (_src->unk_74[j] == 0)
- {
- sp1c[i][j] = 1;
- }
- }
+ if (!_src->holdsItem[j])
+ sp1c[i][j] = 1;
}
}
- i = 0;
- for (j = 0; j < linkPlayerCount; j ++)
+
+ j = 0;
+ for (i = 0; i < linkPlayerCount; i++)
{
- _src = (void *)src + j * recordSize;
- if (sp1c[j][0] == TRUE || sp1c[j][1] == TRUE)
- {
- sp34 ++;
- }
- if (sp1c[j][0] == TRUE && sp1c[j][1] == FALSE)
+ _src = (void *)src + i * recordSize;
+ if (sp1c[i][0] == TRUE || sp1c[i][1] == TRUE)
+ sp34++;
+
+ if (sp1c[i][0] == TRUE && sp1c[i][1] == FALSE)
{
- sp24[i][0] = j;
- sp24[i][1] = 0;
- i ++;
+ sp24[j][0] = i;
+ sp24[j][1] = 0;
+ j++;
}
- else if (sp1c[j][0] == FALSE && sp1c[j][1] == TRUE)
+ else if (sp1c[i][0] == FALSE && sp1c[i][1] == TRUE)
{
- sp24[i][0] = j;
- sp24[i][1] = 0;
- i ++;
+ sp24[j][0] = i;
+ sp24[j][1] = 1;
+ j++;
}
- else if (sp1c[j][0] == TRUE && sp1c[j][1] == TRUE)
+ else if (sp1c[i][0] == TRUE && sp1c[i][1] == TRUE)
{
- sp24[i][0] = j;
- dcMail1 = sub_80E7A9C(&_src->unk_00[0]);
- dcMail2 = sub_80E7A9C(&_src->unk_00[1]);
- if (!dcMail1 && dcMail2)
+ u32 var1, var2;
+
+ sp24[j][0] = i;
+ var1 = sub_80E7A9C(&_src->mail[0]);
+ var2 = sub_80E7A9C(&_src->mail[1]);
+ if (!var1 && var2)
{
- sp24[i][1] = 1;
+ register u8 one asm("r0") = 1; // boo, a fakematch
+ sp24[j][1] = one;
}
- else if ((dcMail1 && dcMail2) || (!dcMail1 && !dcMail2))
+ else if ((var1 && var2) || (!var1 && !var2))
{
- sp24[i][1] = Random2() % 2;
+ sp24[j][1] = Random2() % 2;
}
- else
+ else if (var1 && !var2)
{
- sp24[i][1] = 0;
+ sp24[j][1] = 0;
}
- i ++;
+ j++;
}
}
- for (i = 0; i < 4; i ++)
+
+ for (i = 0; i < 4; i++)
{
_src = &src[which * recordSize];
sp0c[i] = _src;
}
- r1_80e7b54 = sub_80E7B54() % 3;
+
+ tableId = sub_80E7B54() % 3;
switch (sp34)
{
- case 2:
- sub_80E7AA4(src, recordSize, sp24, 0, 1);
- break;
- case 3:
- sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFB8[r1_80e7b54][0], gUnknown_0858CFB8[r1_80e7b54][1]);
- break;
- case 4:
- sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][0], gUnknown_0858CFBE[r1_80e7b54][1]);
- sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][2], gUnknown_0858CFBE[r1_80e7b54][3]);
- break;
+ case 2:
+ sub_80E7AA4(src, recordSize, sp24, 0, 1);
+ break;
+ case 3:
+ which0 = gUnknown_0858CFB8[tableId][0];
+ which1 = gUnknown_0858CFB8[tableId][1];
+ sub_80E7AA4(src, recordSize, sp24, which0, which1);
+ break;
+ case 4:
+ ptr = sp24;
+ which0 = gUnknown_0858CFBE[tableId][0];
+ which1 = gUnknown_0858CFBE[tableId][1];
+ sub_80E7AA4(src, recordSize, ptr, which0, which1);
+ which0 = gUnknown_0858CFBE[tableId][2];
+ which1 = gUnknown_0858CFBE[tableId][3];
+ sub_80E7AA4(src, recordSize, ptr, which0, which1);
+ break;
}
+
_src = (void *)src + which * recordSize;
- memcpy(&gSaveBlock1Ptr->daycare.mons[0].misc.mail, &_src->unk_00[0], sizeof(struct DayCareMail));
- memcpy(&gSaveBlock1Ptr->daycare.mons[1].misc.mail, &_src->unk_00[1], sizeof(struct DayCareMail));
+ memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &_src->mail[0], sizeof(struct DayCareMail));
+ memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &_src->mail[1], sizeof(struct DayCareMail));
SeedRng(oldSeed);
}
-#else
-NAKED
-static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r10\n"
- "\tmov r6, r9\n"
- "\tmov r5, r8\n"
- "\tpush {r5-r7}\n"
- "\tsub sp, 0x58\n"
- "\tstr r0, [sp, 0x2C]\n"
- "\tstr r1, [sp, 0x30]\n"
- "\tlsls r2, 24\n"
- "\tlsrs r2, 24\n"
- "\tmov r9, r2\n"
- "\tbl Random2\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tstr r0, [sp, 0x38]\n"
- "\tldr r0, =gLinkPlayers\n"
- "\tldrh r0, [r0, 0x4]\n"
- "\tbl SeedRng2\n"
- "\tbl GetLinkPlayerCount\n"
- "\tlsls r0, 24\n"
- "\tlsrs r4, r0, 24\n"
- "\tmovs r0, 0\n"
- "\tmov r8, r0\n"
- "\tmov r1, sp\n"
- "\tadds r1, 0x1C\n"
- "\tstr r1, [sp, 0x4C]\n"
- "\tmov r2, sp\n"
- "\tadds r2, 0x1D\n"
- "\tstr r2, [sp, 0x50]\n"
- "\tmov r3, sp\n"
- "\tadds r3, 0xC\n"
- "\tstr r3, [sp, 0x48]\n"
- "\tmovs r7, 0xFF\n"
- "\tadd r3, sp, 0x8\n"
- "\tmovs r2, 0\n"
- "\tadds r6, r1, 0\n"
- "\tldr r5, [sp, 0x50]\n"
- "_080E7BB0:\n"
- "\tmov r1, sp\n"
- "\tadd r1, r8\n"
- "\tadds r1, 0x4\n"
- "\tldrb r0, [r1]\n"
- "\torrs r0, r7\n"
- "\tstrb r0, [r1]\n"
- "\tmov r1, r8\n"
- "\tadds r0, r3, r1\n"
- "\tstrb r2, [r0]\n"
- "\tlsls r1, 1\n"
- "\tadds r0, r6, r1\n"
- "\tstrb r2, [r0]\n"
- "\tadds r1, r5, r1\n"
- "\tstrb r2, [r1]\n"
- "\tmov r0, r8\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tmov r8, r0\n"
- "\tcmp r0, 0x3\n"
- "\tbls _080E7BB0\n"
- "\tbl Link_AnyPartnersPlayingRubyOrSapphire\n"
- "\tstr r0, [sp, 0x3C]\n"
- "\tmovs r2, 0\n"
- "\tmov r8, r2\n"
- "\tlsls r4, 16\n"
- "\tstr r4, [sp, 0x54]\n"
- "\tldr r0, [sp, 0x30]\n"
- "\tmov r3, r9\n"
- "\tmuls r3, r0\n"
- "\tstr r3, [sp, 0x44]\n"
- "\tb _080E7D04\n"
- "\t.pool\n"
- "_080E7BF8:\n"
- "\tldr r1, [sp, 0x30]\n"
- "\tmov r0, r8\n"
- "\tmuls r0, r1\n"
- "\tldr r2, [sp, 0x2C]\n"
- "\tadds r7, r2, r0\n"
- "\tldr r1, =gLinkPlayers\n"
- "\tmov r3, r8\n"
- "\tlsls r0, r3, 3\n"
- "\tsubs r0, r3\n"
- "\tlsls r0, 2\n"
- "\tadds r0, r1\n"
- "\tldrh r1, [r0, 0x1A]\n"
- "\tmov r9, r1\n"
- "\tldrb r0, [r0]\n"
- "\tstr r0, [sp, 0x40]\n"
- "\tmovs r6, 0\n"
- "\tldr r0, [r7, 0x70]\n"
- "\tcmp r6, r0\n"
- "\tbcs _080E7CFA\n"
- "\tmovs r2, 0x10\n"
- "\tnegs r2, r2\n"
- "\tmov r10, r2\n"
- "_080E7C24:\n"
- "\tlsls r0, r6, 3\n"
- "\tsubs r0, r6\n"
- "\tlsls r0, 3\n"
- "\tadds r5, r7, r0\n"
- "\tldrh r0, [r5, 0x20]\n"
- "\tcmp r0, 0\n"
- "\tbeq _080E7CEE\n"
- "\tldr r3, [sp, 0x3C]\n"
- "\tcmp r3, 0\n"
- "\tbeq _080E7C9A\n"
- "\tadds r4, r5, 0\n"
- "\tadds r4, 0x24\n"
- "\tadds r0, r4, 0\n"
- "\tbl StringLength\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tcmp r0, 0x5\n"
- "\tbhi _080E7C54\n"
- "\tmovs r4, 0x1\n"
- "\tb _080E7C5C\n"
- "\t.pool\n"
- "_080E7C54:\n"
- "\tadds r0, r4, 0\n"
- "\tbl StripExtCtrlCodes\n"
- "\tmov r4, r9\n"
- "_080E7C5C:\n"
- "\tldrh r1, [r5, 0x2C]\n"
- "\tldr r0, =0x000015fc\n"
- "\tcmp r1, r0\n"
- "\tbne _080E7C74\n"
- "\tadds r0, r5, 0\n"
- "\tadds r0, 0x2C\n"
- "\tbl StripExtCtrlCodes\n"
- "\tmovs r1, 0x1\n"
- "\tb _080E7C76\n"
- "\t.pool\n"
- "_080E7C74:\n"
- "\tmov r1, r9\n"
- "_080E7C76:\n"
- "\tldr r0, [sp, 0x40]\n"
- "\tsubs r0, 0x1\n"
- "\tcmp r0, 0x1\n"
- "\tbhi _080E7CEE\n"
- "\tadds r2, r5, 0\n"
- "\tadds r2, 0x37\n"
- "\tmovs r0, 0xF\n"
- "\tands r4, r0\n"
- "\tldrb r0, [r2]\n"
- "\tmov r3, r10\n"
- "\tands r0, r3\n"
- "\torrs r0, r4\n"
- "\tlsls r1, 4\n"
- "\tmovs r3, 0xF\n"
- "\tands r0, r3\n"
- "\torrs r0, r1\n"
- "\tstrb r0, [r2]\n"
- "\tb _080E7CEE\n"
- "_080E7C9A:\n"
- "\tmov r0, r9\n"
- "\tcmp r0, 0x1\n"
- "\tbne _080E7CEE\n"
- "\tadds r0, r5, 0\n"
- "\tadds r0, 0x24\n"
- "\tbl IsStringJapanese\n"
- "\tcmp r0, 0\n"
- "\tbeq _080E7CBA\n"
- "\tadds r0, r5, 0\n"
- "\tadds r0, 0x37\n"
- "\tldrb r1, [r0]\n"
- "\tmov r2, r10\n"
- "\tands r1, r2\n"
- "\tmovs r2, 0x1\n"
- "\tb _080E7CC6\n"
- "_080E7CBA:\n"
- "\tadds r0, r5, 0\n"
- "\tadds r0, 0x37\n"
- "\tldrb r1, [r0]\n"
- "\tmov r3, r10\n"
- "\tands r1, r3\n"
- "\tmovs r2, 0x2\n"
- "_080E7CC6:\n"
- "\torrs r1, r2\n"
- "\tstrb r1, [r0]\n"
- "\tadds r4, r0, 0\n"
- "\tadds r0, r5, 0\n"
- "\tadds r0, 0x2C\n"
- "\tbl IsStringJapanese\n"
- "\tcmp r0, 0\n"
- "\tbeq _080E7CE2\n"
- "\tldrb r0, [r4]\n"
- "\tmovs r1, 0xF\n"
- "\tands r1, r0\n"
- "\tmovs r0, 0x10\n"
- "\tb _080E7CEA\n"
- "_080E7CE2:\n"
- "\tldrb r0, [r4]\n"
- "\tmovs r1, 0xF\n"
- "\tands r1, r0\n"
- "\tmovs r0, 0x20\n"
- "_080E7CEA:\n"
- "\torrs r1, r0\n"
- "\tstrb r1, [r4]\n"
- "_080E7CEE:\n"
- "\tadds r0, r6, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r6, r0, 16\n"
- "\tldr r0, [r7, 0x70]\n"
- "\tcmp r6, r0\n"
- "\tbcc _080E7C24\n"
- "_080E7CFA:\n"
- "\tmov r0, r8\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tmov r8, r0\n"
- "_080E7D04:\n"
- "\tbl GetLinkPlayerCount\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r8, r0\n"
- "\tbcs _080E7D12\n"
- "\tb _080E7BF8\n"
- "_080E7D12:\n"
- "\tmovs r0, 0\n"
- "\tstr r0, [sp, 0x34]\n"
- "\tmov r8, r0\n"
- "\tldr r1, [sp, 0x54]\n"
- "\tlsrs r0, r1, 16\n"
- "\tldr r2, [sp, 0x34]\n"
- "\tcmp r2, r0\n"
- "\tbcs _080E7D70\n"
- "\tadds r5, r0, 0\n"
- "_080E7D24:\n"
- "\tldr r3, [sp, 0x30]\n"
- "\tmov r0, r8\n"
- "\tmuls r0, r3\n"
- "\tldr r1, [sp, 0x2C]\n"
- "\tadds r7, r1, r0\n"
- "\tldr r0, [r7, 0x70]\n"
- "\tcmp r0, 0\n"
- "\tbeq _080E7D62\n"
- "\tmovs r6, 0\n"
- "\tcmp r6, r0\n"
- "\tbcs _080E7D62\n"
- "\tadds r3, r7, 0\n"
- "\tadds r3, 0x74\n"
- "\tldr r2, [sp, 0x4C]\n"
- "\tmov r0, r8\n"
- "\tlsls r1, r0, 1\n"
- "\tmovs r4, 0x1\n"
- "_080E7D46:\n"
- "\tlsls r0, r6, 1\n"
- "\tadds r0, r3, r0\n"
- "\tldrh r0, [r0]\n"
- "\tcmp r0, 0\n"
- "\tbne _080E7D56\n"
- "\tadds r0, r6, r1\n"
- "\tadds r0, r2, r0\n"
- "\tstrb r4, [r0]\n"
- "_080E7D56:\n"
- "\tadds r0, r6, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r6, r0, 16\n"
- "\tldr r0, [r7, 0x70]\n"
- "\tcmp r6, r0\n"
- "\tbcc _080E7D46\n"
- "_080E7D62:\n"
- "\tmov r0, r8\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tmov r8, r0\n"
- "\tcmp r8, r5\n"
- "\tbcc _080E7D24\n"
- "_080E7D70:\n"
- "\tmovs r6, 0\n"
- "\tmov r8, r6\n"
- "\tldr r1, [sp, 0x54]\n"
- "\tcmp r1, 0\n"
- "\tbeq _080E7E64\n"
- "\tadd r2, sp, 0x24\n"
- "\tmov r10, r2\n"
- "\tmovs r3, 0x25\n"
- "\tadd r3, sp\n"
- "\tmov r9, r3\n"
- "_080E7D84:\n"
- "\tldr r1, [sp, 0x30]\n"
- "\tmov r0, r8\n"
- "\tmuls r0, r1\n"
- "\tldr r2, [sp, 0x2C]\n"
- "\tadds r7, r2, r0\n"
- "\tmov r3, r8\n"
- "\tlsls r1, r3, 1\n"
- "\tldr r2, [sp, 0x4C]\n"
- "\tadds r0, r2, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbeq _080E7DA6\n"
- "\tldr r3, [sp, 0x50]\n"
- "\tadds r0, r3, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbne _080E7DB0\n"
- "_080E7DA6:\n"
- "\tldr r0, [sp, 0x34]\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tstr r0, [sp, 0x34]\n"
- "_080E7DB0:\n"
- "\tldr r2, [sp, 0x4C]\n"
- "\tadds r0, r2, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbne _080E7DD4\n"
- "\tldr r3, [sp, 0x50]\n"
- "\tadds r0, r3, r1\n"
- "\tldrb r2, [r0]\n"
- "\tcmp r2, 0\n"
- "\tbne _080E7DD4\n"
- "_080E7DC4:\n"
- "\tlsls r1, r6, 1\n"
- "\tmov r3, r10\n"
- "\tadds r0, r3, r1\n"
- "\tmov r3, r8\n"
- "\tstrb r3, [r0]\n"
- "\tadd r1, r9\n"
- "\tstrb r2, [r1]\n"
- "\tb _080E7E4E\n"
- "_080E7DD4:\n"
- "\tldr r2, [sp, 0x4C]\n"
- "\tadds r0, r2, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0\n"
- "\tbne _080E7DE8\n"
- "\tldr r3, [sp, 0x50]\n"
- "\tadds r0, r3, r1\n"
- "\tldrb r2, [r0]\n"
- "\tcmp r2, 0x1\n"
- "\tbeq _080E7DC4\n"
- "_080E7DE8:\n"
- "\tldr r2, [sp, 0x4C]\n"
- "\tadds r0, r2, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbne _080E7E54\n"
- "\tldr r3, [sp, 0x50]\n"
- "\tadds r0, r3, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbne _080E7E54\n"
- "\tlsls r5, r6, 1\n"
- "\tmov r1, r10\n"
- "\tadds r0, r1, r5\n"
- "\tmov r2, r8\n"
- "\tstrb r2, [r0]\n"
- "\tadds r0, r7, 0\n"
- "\tbl sub_80E7A9C\n"
- "\tadds r4, r0, 0\n"
- "\tlsls r4, 24\n"
- "\tlsrs r4, 24\n"
- "\tadds r0, r7, 0\n"
- "\tadds r0, 0x38\n"
- "\tbl sub_80E7A9C\n"
- "\tlsls r0, 24\n"
- "\tlsrs r1, r0, 24\n"
- "\tcmp r4, 0\n"
- "\tbne _080E7E30\n"
- "\tcmp r1, 0\n"
- "\tbeq _080E7E34\n"
- "\tmov r3, r9\n"
- "\tadds r1, r3, r5\n"
- "\tmovs r0, 0x1\n"
- "\tstrb r0, [r1]\n"
- "\tb _080E7E4E\n"
- "_080E7E30:\n"
- "\tcmp r1, 0\n"
- "\tbeq _080E7E48\n"
- "_080E7E34:\n"
- "\tbl Random2\n"
- "\tmov r1, r9\n"
- "\tadds r2, r1, r5\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tmovs r1, 0x1\n"
- "\tands r0, r1\n"
- "\tstrb r0, [r2]\n"
- "\tb _080E7E4E\n"
- "_080E7E48:\n"
- "\tmov r2, r9\n"
- "\tadds r0, r2, r5\n"
- "\tstrb r1, [r0]\n"
- "_080E7E4E:\n"
- "\tadds r0, r6, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r6, r0, 16\n"
- "_080E7E54:\n"
- "\tmov r0, r8\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r3, r0, 16\n"
- "\tmov r8, r3\n"
- "\tldr r1, [sp, 0x54]\n"
- "\tcmp r0, r1\n"
- "\tbcc _080E7D84\n"
- "_080E7E64:\n"
- "\tmovs r2, 0\n"
- "\tmov r8, r2\n"
- "\tldr r3, [sp, 0x44]\n"
- "\tlsls r0, r3, 4\n"
- "\tsubs r0, r3\n"
- "\tlsls r0, 3\n"
- "\tldr r1, [sp, 0x2C]\n"
- "\tadds r7, r1, r0\n"
- "\tldr r1, [sp, 0x48]\n"
- "_080E7E76:\n"
- "\tmov r2, r8\n"
- "\tlsls r0, r2, 2\n"
- "\tadds r0, r1, r0\n"
- "\tstr r7, [r0]\n"
- "\tmov r0, r8\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 16\n"
- "\tlsrs r0, 16\n"
- "\tmov r8, r0\n"
- "\tcmp r0, 0x3\n"
- "\tbls _080E7E76\n"
- "\tbl sub_80E7B54\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tmovs r1, 0x3\n"
- "\tbl __umodsi3\n"
- "\tlsls r0, 24\n"
- "\tlsrs r1, r0, 24\n"
- "\tldr r3, [sp, 0x34]\n"
- "\tcmp r3, 0x3\n"
- "\tbeq _080E7EC8\n"
- "\tcmp r3, 0x3\n"
- "\tbgt _080E7EAE\n"
- "\tcmp r3, 0x2\n"
- "\tbeq _080E7EB6\n"
- "\tb _080E7F1C\n"
- "_080E7EAE:\n"
- "\tldr r0, [sp, 0x34]\n"
- "\tcmp r0, 0x4\n"
- "\tbeq _080E7EE8\n"
- "\tb _080E7F1C\n"
- "_080E7EB6:\n"
- "\tadd r2, sp, 0x24\n"
- "\tmovs r0, 0x1\n"
- "\tstr r0, [sp]\n"
- "\tldr r0, [sp, 0x2C]\n"
- "\tldr r1, [sp, 0x30]\n"
- "\tmovs r3, 0\n"
- "\tbl sub_80E7AA4\n"
- "\tb _080E7F1C\n"
- "_080E7EC8:\n"
- "\tldr r0, =gUnknown_0858CFB8\n"
- "\tlsls r1, 1\n"
- "\tadds r2, r1, r0\n"
- "\tldrb r3, [r2]\n"
- "\tadds r0, 0x1\n"
- "\tadds r1, r0\n"
- "\tldrb r0, [r1]\n"
- "\tadd r2, sp, 0x24\n"
- "\tstr r0, [sp]\n"
- "\tldr r0, [sp, 0x2C]\n"
- "\tldr r1, [sp, 0x30]\n"
- "\tbl sub_80E7AA4\n"
- "\tb _080E7F1C\n"
- "\t.pool\n"
- "_080E7EE8:\n"
- "\tadd r6, sp, 0x24\n"
- "\tldr r4, =gUnknown_0858CFBE\n"
- "\tlsls r5, r1, 2\n"
- "\tadds r0, r5, r4\n"
- "\tldrb r3, [r0]\n"
- "\tadds r0, r4, 0x1\n"
- "\tadds r0, r5, r0\n"
- "\tldrb r0, [r0]\n"
- "\tstr r0, [sp]\n"
- "\tldr r0, [sp, 0x2C]\n"
- "\tldr r1, [sp, 0x30]\n"
- "\tadds r2, r6, 0\n"
- "\tbl sub_80E7AA4\n"
- "\tadds r0, r4, 0x2\n"
- "\tadds r0, r5, r0\n"
- "\tldrb r3, [r0]\n"
- "\tadds r4, 0x3\n"
- "\tadds r5, r4\n"
- "\tldrb r0, [r5]\n"
- "\tstr r0, [sp]\n"
- "\tldr r0, [sp, 0x2C]\n"
- "\tldr r1, [sp, 0x30]\n"
- "\tadds r2, r6, 0\n"
- "\tbl sub_80E7AA4\n"
- "_080E7F1C:\n"
- "\tldr r1, [sp, 0x2C]\n"
- "\tldr r2, [sp, 0x44]\n"
- "\tadds r7, r1, r2\n"
- "\tldr r4, =gSaveBlock1Ptr\n"
- "\tldr r0, [r4]\n"
- "\tmovs r3, 0xC2\n"
- "\tlsls r3, 6\n"
- "\tadds r0, r3\n"
- "\tadds r1, r7, 0\n"
- "\tmovs r2, 0x38\n"
- "\tbl memcpy\n"
- "\tldr r0, [r4]\n"
- "\tldr r1, =0x0000310c\n"
- "\tadds r0, r1\n"
- "\tadds r1, r7, 0\n"
- "\tadds r1, 0x38\n"
- "\tmovs r2, 0x38\n"
- "\tbl memcpy\n"
- "\tldr r0, [sp, 0x38]\n"
- "\tbl SeedRng\n"
- "\tadd sp, 0x58\n"
- "\tpop {r3-r5}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tmov r10, r5\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.pool");
-}
-#endif // NONMATCHING
+
static void ReceiveGiftItem(u16 *item, u8 which)
{
@@ -1481,14 +954,14 @@ static void sub_80E7FF8(u8 taskId)
task->data[0] = 6;
break;
case 2:
- sub_8076D5C();
+ SetContinueGameWarpStatusToDynamicWarp();
sub_8153430();
task->data[0] ++;
break;
case 3:
if (sub_8153474())
{
- sav2_gender2_inplace_and_xFE();
+ ClearContinueGameWarpStatus2();
task->data[0] = 4;
task->data[1] = 0;
}
@@ -1530,7 +1003,7 @@ static void sub_80E7FF8(u8 taskId)
task->data[0] ++;
break;
case 9:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
DestroyTask(taskId);
break;
}
diff --git a/src/recorded_battle.c b/src/recorded_battle.c
index 81935b7c6..03823dd45 100644
--- a/src/recorded_battle.c
+++ b/src/recorded_battle.c
@@ -718,7 +718,7 @@ void RecordedBattle_CopyBattlerMoves(void)
if (sUnknown_0203C7AC == 2)
return;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
sPlayerMonMoves[gActiveBattler / 2][i] = gBattleMons[gActiveBattler].moves[i];
}
@@ -739,17 +739,17 @@ void sub_818603C(u8 arg0)
{
if (arg0 == 1)
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
if (gBattleMons[battlerId].moves[j] != sPlayerMonMoves[battlerId / 2][j])
break;
}
- if (j != 4) // player's mon's move has been changed
+ if (j != MAX_MON_MOVES) // player's mon's move has been changed
{
RecordedBattle_SetBattlerAction(battlerId, ACTION_MOVE_CHANGE);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
- for (k = 0; k < 4; k++)
+ for (k = 0; k < MAX_MON_MOVES; k++)
{
if (gBattleMons[battlerId].moves[j] == sPlayerMonMoves[battlerId / 2][k])
{
@@ -772,11 +772,11 @@ void sub_818603C(u8 arg0)
u8 var;
RecordedBattle_GetBattlerAction(battlerId);
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
ppBonuses[j] = ((gBattleMons[battlerId].ppBonuses & ((3 << (j << 1)))) >> (j << 1));
}
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
array1[j] = RecordedBattle_GetBattlerAction(battlerId);
movePp.moves[j] = gBattleMons[battlerId].moves[array1[j]];
@@ -784,14 +784,14 @@ void sub_818603C(u8 arg0)
array3[j] = ppBonuses[array1[j]];
array2[j] = (gDisableStructs[battlerId].unk18_b & gBitTable[j]) >> j;
}
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
gBattleMons[battlerId].moves[j] = movePp.moves[j];
gBattleMons[battlerId].pp[j] = movePp.pp[j];
}
gBattleMons[battlerId].ppBonuses = 0;
gDisableStructs[battlerId].unk18_b = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
gBattleMons[battlerId].ppBonuses |= (array3[j]) << (j << 1);
gDisableStructs[battlerId].unk18_b |= (array2[j]) << (j);
@@ -799,23 +799,23 @@ void sub_818603C(u8 arg0)
if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED))
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
ppBonuses[j] = ((GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1));
}
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
movePp.moves[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + array1[j], NULL);
movePp.pp[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + array1[j], NULL);
array3[j] = ppBonuses[array1[j]];
}
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + j, &movePp.moves[j]);
SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + j, &movePp.pp[j]);
}
var = 0;
- for (j = 0; j < 4; j++)
+ for (j = 0; j < MAX_MON_MOVES; j++)
{
var |= (array3[j]) << (j << 1);
}
diff --git a/src/region_map.c b/src/region_map.c
index d7b53d631..ff0c19167 100644
--- a/src/region_map.c
+++ b/src/region_map.c
@@ -11,7 +11,6 @@
#include "overworld.h"
#include "constants/flags.h"
#include "event_data.h"
-#include "rom6.h"
#include "secret_base.h"
#include "string_util.h"
#include "international_string_util.h"
@@ -20,10 +19,13 @@
#include "constants/songs.h"
#include "m4a.h"
#include "field_effect.h"
+#include "field_specials.h"
+#include "fldeff.h"
#include "region_map.h"
#include "constants/region_map_sections.h"
#include "heal_location.h"
#include "constants/heal_locations.h"
+#include "constants/map_types.h"
#define MAP_WIDTH 28
#define MAP_HEIGHT 15
@@ -426,82 +428,82 @@ bool8 sub_8122DB0(void)
{
switch (gRegionMap->initStep)
{
- case 0:
- if (gRegionMap->bgManaged)
- {
- decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_GfxLZ, 0, 0, 0);
- }
- else
- {
- LZ77UnCompVram(sRegionMapBkgnd_GfxLZ, (u16 *)BG_CHAR_ADDR(2));
- }
- break;
- case 1:
- if (gRegionMap->bgManaged)
- {
- if (!free_temp_tile_data_buffers_if_possible())
- {
- decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_TilemapLZ, 0, 0, 1);
- }
- }
- else
- {
- LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28));
- }
- break;
- case 2:
+ case 0:
+ if (gRegionMap->bgManaged)
+ {
+ decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_GfxLZ, 0, 0, 0);
+ }
+ else
+ {
+ LZ77UnCompVram(sRegionMapBkgnd_GfxLZ, (u16 *)BG_CHAR_ADDR(2));
+ }
+ break;
+ case 1:
+ if (gRegionMap->bgManaged)
+ {
if (!free_temp_tile_data_buffers_if_possible())
{
- LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60);
- }
- break;
- case 3:
- LZ77UnCompWram(sRegionMapCursorSmallGfxLZ, gRegionMap->cursorSmallImage);
- break;
- case 4:
- LZ77UnCompWram(sRegionMapCursorLargeGfxLZ, gRegionMap->cursorLargeImage);
- break;
- case 5:
- RegionMap_InitializeStateBasedOnPlayerLocation();
- gRegionMap->playerIconSpritePosX = gRegionMap->cursorPosX;
- gRegionMap->playerIconSpritePosY = gRegionMap->cursorPosY;
- gRegionMap->mapSecId = CorrectSpecialMapSecId_Internal(gRegionMap->mapSecId);
- gRegionMap->iconDrawType = get_flagnr_blue_points(gRegionMap->mapSecId);
- GetMapName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16);
- break;
- case 6:
- if (gRegionMap->zoomed == FALSE)
- {
- CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0);
- }
- else
- {
- gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 0x34;
- gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 0x44;
- gRegionMap->zoomedCursorPosX = gRegionMap->cursorPosX;
- gRegionMap->zoomedCursorPosY = gRegionMap->cursorPosY;
- CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0);
+ decompress_and_copy_tile_data_to_vram(gRegionMap->bgNum, sRegionMapBkgnd_TilemapLZ, 0, 0, 1);
}
- break;
- case 7:
- RegionMap_GetPositionOfCursorWithinMapSection();
- UpdateRegionMapVideoRegs();
- gRegionMap->cursorSprite = NULL;
- gRegionMap->playerIconSprite = NULL;
- gRegionMap->cursorMovementFrameCounter = 0;
- gRegionMap->blinkPlayerIcon = FALSE;
- if (gRegionMap->bgManaged)
- {
- SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_MAPBASEINDEX, 2);
- SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_VISIBLE, gRegionMap->charBaseIdx);
- SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_CHARBASEINDEX, gRegionMap->mapBaseIdx);
- SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_PRIORITY, 1);
- SetBgAttribute(gRegionMap->bgNum, BG_CTRL_ATTR_SCREENSIZE, 1);
- }
- gRegionMap->initStep++;
- return FALSE;
- default:
- return FALSE;
+ }
+ else
+ {
+ LZ77UnCompVram(sRegionMapBkgnd_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28));
+ }
+ break;
+ case 2:
+ if (!free_temp_tile_data_buffers_if_possible())
+ {
+ LoadPalette(sRegionMapBkgnd_Pal, 0x70, 0x60);
+ }
+ break;
+ case 3:
+ LZ77UnCompWram(sRegionMapCursorSmallGfxLZ, gRegionMap->cursorSmallImage);
+ break;
+ case 4:
+ LZ77UnCompWram(sRegionMapCursorLargeGfxLZ, gRegionMap->cursorLargeImage);
+ break;
+ case 5:
+ RegionMap_InitializeStateBasedOnPlayerLocation();
+ gRegionMap->playerIconSpritePosX = gRegionMap->cursorPosX;
+ gRegionMap->playerIconSpritePosY = gRegionMap->cursorPosY;
+ gRegionMap->mapSecId = CorrectSpecialMapSecId_Internal(gRegionMap->mapSecId);
+ gRegionMap->iconDrawType = get_flagnr_blue_points(gRegionMap->mapSecId);
+ GetMapName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16);
+ break;
+ case 6:
+ if (gRegionMap->zoomed == FALSE)
+ {
+ CalcZoomScrollParams(0, 0, 0, 0, 0x100, 0x100, 0);
+ }
+ else
+ {
+ gRegionMap->scrollX = gRegionMap->cursorPosX * 8 - 0x34;
+ gRegionMap->scrollY = gRegionMap->cursorPosY * 8 - 0x44;
+ gRegionMap->zoomedCursorPosX = gRegionMap->cursorPosX;
+ gRegionMap->zoomedCursorPosY = gRegionMap->cursorPosY;
+ CalcZoomScrollParams(gRegionMap->scrollX, gRegionMap->scrollY, 0x38, 0x48, 0x80, 0x80, 0);
+ }
+ break;
+ case 7:
+ RegionMap_GetPositionOfCursorWithinMapSection();
+ UpdateRegionMapVideoRegs();
+ gRegionMap->cursorSprite = NULL;
+ gRegionMap->playerIconSprite = NULL;
+ gRegionMap->cursorMovementFrameCounter = 0;
+ gRegionMap->blinkPlayerIcon = FALSE;
+ if (gRegionMap->bgManaged)
+ {
+ SetBgAttribute(gRegionMap->bgNum, BG_ATTR_SCREENSIZE, 2);
+ SetBgAttribute(gRegionMap->bgNum, BG_ATTR_CHARBASEINDEX, gRegionMap->charBaseIdx);
+ SetBgAttribute(gRegionMap->bgNum, BG_ATTR_MAPBASEINDEX, gRegionMap->mapBaseIdx);
+ SetBgAttribute(gRegionMap->bgNum, BG_ATTR_WRAPAROUND, 1);
+ SetBgAttribute(gRegionMap->bgNum, BG_ATTR_PALETTEMODE, 1);
+ }
+ gRegionMap->initStep++;
+ return FALSE;
+ default:
+ return FALSE;
}
gRegionMap->initStep++;
return TRUE;
@@ -863,7 +865,7 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
u16 y;
u16 dimensionScale;
u16 xOnMap;
- struct WarpData *storedWarp;
+ struct WarpData *warp;
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SS_TIDAL_CORRIDOR)
&& (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR)
@@ -877,11 +879,11 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
switch (GetMapTypeByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum))
{
default:
- case 1:
- case 2:
- case 3:
- case 5:
- case 6:
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ case MAP_TYPE_UNDERWATER:
+ case MAP_TYPE_6:
gRegionMap->mapSecId = gMapHeader.regionMapSectionId;
gRegionMap->playerIsInCave = FALSE;
mapWidth = gMapHeader.mapLayout->width;
@@ -893,17 +895,17 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
gRegionMap->playerIsInCave = TRUE;
}
break;
- case 4:
- case 7:
+ case MAP_TYPE_UNDERGROUND:
+ case MAP_TYPE_7:
if (gMapHeader.flags & 0x02)
{
- mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp4.mapGroup, gSaveBlock1Ptr->warp4.mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
gRegionMap->playerIsInCave = TRUE;
mapWidth = mapHeader->mapLayout->width;
mapHeight = mapHeader->mapLayout->height;
- x = gSaveBlock1Ptr->warp4.x;
- y = gSaveBlock1Ptr->warp4.y;
+ x = gSaveBlock1Ptr->escapeWarp.x;
+ y = gSaveBlock1Ptr->escapeWarp.y;
}
else
{
@@ -915,27 +917,26 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
y = 1;
}
break;
- case 9:
- mapHeader = Overworld_GetMapHeaderByGroupAndId((u16)gSaveBlock1Ptr->warp2.mapGroup, (u16)gSaveBlock1Ptr->warp2.mapNum);
+ case MAP_TYPE_SECRET_BASE:
+ mapHeader = Overworld_GetMapHeaderByGroupAndId((u16)gSaveBlock1Ptr->dynamicWarp.mapGroup, (u16)gSaveBlock1Ptr->dynamicWarp.mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
gRegionMap->playerIsInCave = TRUE;
mapWidth = mapHeader->mapLayout->width;
mapHeight = mapHeader->mapLayout->height;
- x = gSaveBlock1Ptr->warp2.x;
- y = gSaveBlock1Ptr->warp2.y;
+ x = gSaveBlock1Ptr->dynamicWarp.x;
+ y = gSaveBlock1Ptr->dynamicWarp.y;
break;
- case 8:
-
+ case MAP_TYPE_INDOOR:
gRegionMap->mapSecId = gMapHeader.regionMapSectionId;
if (gRegionMap->mapSecId != MAPSEC_DYNAMIC)
{
- storedWarp = &gSaveBlock1Ptr->warp4;
- mapHeader = Overworld_GetMapHeaderByGroupAndId(storedWarp->mapGroup, storedWarp->mapNum);
+ warp = &gSaveBlock1Ptr->escapeWarp;
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum);
}
else
{
- storedWarp = &gSaveBlock1Ptr->warp2;
- mapHeader = Overworld_GetMapHeaderByGroupAndId(storedWarp->mapGroup, storedWarp->mapNum);
+ warp = &gSaveBlock1Ptr->dynamicWarp;
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
}
if (RegionMap_IsPlayerInCave(gRegionMap->mapSecId))
@@ -948,8 +949,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void)
}
mapWidth = mapHeader->mapLayout->width;
mapHeight = mapHeader->mapLayout->height;
- x = storedWarp->x;
- y = storedWarp->y;
+ x = warp->x;
+ y = warp->y;
break;
}
@@ -1901,25 +1902,25 @@ static void sub_8124E0C(void)
switch (sFlyMap->regionMap.mapSecId)
{
case MAPSEC_SOUTHERN_ISLAND:
- sub_8084CCC(HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR);
+ SetWarpDestinationToHealLocation(HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR);
break;
case MAPSEC_BATTLE_FRONTIER:
- sub_8084CCC(HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST);
+ SetWarpDestinationToHealLocation(HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST);
break;
case MAPSEC_LITTLEROOT_TOWN:
- sub_8084CCC(gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_1 : HEAL_LOCATION_LITTLEROOT_TOWN_2);
+ SetWarpDestinationToHealLocation(gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_1 : HEAL_LOCATION_LITTLEROOT_TOWN_2);
break;
case MAPSEC_EVER_GRANDE_CITY:
- sub_8084CCC(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && sFlyMap->regionMap.posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_2 : HEAL_LOCATION_EVER_GRANDE_CITY_1);
+ SetWarpDestinationToHealLocation(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && sFlyMap->regionMap.posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_2 : HEAL_LOCATION_EVER_GRANDE_CITY_1);
break;
default:
if (sMapHealLocations[sFlyMap->regionMap.mapSecId][2] != 0)
{
- sub_8084CCC(sMapHealLocations[sFlyMap->regionMap.mapSecId][2]);
+ SetWarpDestinationToHealLocation(sMapHealLocations[sFlyMap->regionMap.mapSecId][2]);
}
else
{
- warp1_set_2(sMapHealLocations[sFlyMap->regionMap.mapSecId][0], sMapHealLocations[sFlyMap->regionMap.mapSecId][1], -1);
+ SetWarpDestinationToMapWarp(sMapHealLocations[sFlyMap->regionMap.mapSecId][0], sMapHealLocations[sFlyMap->regionMap.mapSecId][1], -1);
}
break;
}
diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c
index 06d2af5b7..1b17c372c 100644
--- a/src/reshow_battle_screen.c
+++ b/src/reshow_battle_screen.c
@@ -50,8 +50,8 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
case 0:
ScanlineEffect_Clear();
BattleInitBgsAndWindows();
- SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
- SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
+ SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
+ SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
ShowBg(0);
ShowBg(1);
ShowBg(2);
diff --git a/src/rock.c b/src/rock.c
index ff3840fb3..ebf477ec1 100644
--- a/src/rock.c
+++ b/src/rock.c
@@ -421,7 +421,7 @@ void AnimTask_LoadSandstormBackground(u8 taskId)
sub_80A6B30(&unknownStruct);
sub_80A6CC0(unknownStruct.bgId, gUnknown_08D8D58C, unknownStruct.tilesOffset);
sub_80A6D60(&unknownStruct, gUnknown_08D8D410, 0);
- LoadCompressedPalette(&gBattleAnimSpritePalette_261, unknownStruct.unk8 * 16, 32);
+ LoadCompressedPalette(gBattleAnimSpritePalette_261, unknownStruct.unk8 * 16, 32);
if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
var0 = 1;
diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c
index deec55c9d..813d143d2 100644
--- a/src/rom_8011DC0.c
+++ b/src/rom_8011DC0.c
@@ -189,7 +189,6 @@ extern u16 gUnknown_02022C3C;
extern u8 gUnknown_02022C20[];
extern u8 gFieldLinkPlayerCount;
extern u8 gUnknown_03005DB4;
-extern u8 gSelectedOrderFromParty[];
extern struct MailStruct gUnknown_020321C0[PARTY_SIZE];
extern u8 gUnknown_02032298[2];
@@ -1316,7 +1315,7 @@ u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id)
if (gUnknown_02022C2C == 4 && structPtr->unk.field_0.unk_00.unk_01_2 != 3)
{
- if (!(gSaveBlock2Ptr->specialSaveWarp & 0x80))
+ if (!(gSaveBlock2Ptr->specialSaveWarpFlags & 0x80))
return 1;
else if (structPtr->unk.field_0.unk_00.unk_00_7)
return 0;
@@ -1634,8 +1633,8 @@ void sub_8014210(u16 battleFlags)
void sub_8014290(u16 arg0, u16 x, u16 y)
{
VarSet(VAR_0x4087, arg0);
- Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
- saved_warp2_set_2(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ SetDynamicWarpWithCoords(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
WarpIntoMap();
}
@@ -1646,7 +1645,7 @@ void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 arg4)
gFieldLinkPlayerCount = GetLinkPlayerCount();
gUnknown_03005DB4 = GetMultiplayerId();
SetCableClubWarp();
- Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y);
+ SetWarpDestination(mapGroup, mapNum, -1, x, y);
WarpIntoMap();
}
@@ -1698,12 +1697,12 @@ void sub_801440C(u8 taskId)
{
case 65:
case 81:
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
gMain.savedCallback = sub_801AC54;
sub_81B8518(3);
break;
case 1:
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
sub_80143E4(gBlockSendBuffer, TRUE);
HealPlayerParty();
SavePlayerParty();
@@ -1712,7 +1711,7 @@ void sub_801440C(u8 taskId)
SetMainCallback2(sub_8014384);
break;
case 2:
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
@@ -1721,7 +1720,7 @@ void sub_801440C(u8 taskId)
SetMainCallback2(sub_8014384);
break;
case 3:
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
HealPlayerParty();
SavePlayerParty();
LoadPlayerBag();
@@ -1731,18 +1730,18 @@ void sub_801440C(u8 taskId)
break;
case 4:
sub_80143E4(gBlockSendBuffer, TRUE);
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
sub_8014304(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, 3);
SetMainCallback2(sub_8014384);
break;
case 15:
sub_80143E4(gBlockSendBuffer, TRUE);
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
sub_8014304(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, 4);
SetMainCallback2(sub_8014384);
break;
case 68:
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
CreateTask(sub_8013F90, 0);
break;
case 5:
@@ -1839,7 +1838,7 @@ void sub_8014790(u8 taskId)
}
break;
case 3:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
DestroyTask(taskId);
sub_80149D8();
@@ -2096,7 +2095,7 @@ void sub_8014A40(u8 taskId)
data->state++;
break;
case 17:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
DestroyTask(taskId);
break;
}
@@ -2265,7 +2264,7 @@ void sub_8014F48(u8 taskId)
sub_800ADF8();
break;
case 12:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
DestroyTask(taskId);
break;
}
@@ -2444,7 +2443,7 @@ void sub_80152F4(u8 taskId)
sub_800ADF8();
break;
case 14:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
DestroyTask(taskId);
break;
}
@@ -2837,7 +2836,7 @@ void sub_80156E0(u8 taskId)
}
break;
case 41:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
if (GetMultiplayerId() == 0)
{
@@ -3034,7 +3033,7 @@ void sub_80156E0(u8 taskId)
data->state = 15;
break;
case 15:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
data->state = 16;
break;
case 16:
diff --git a/src/rom_8034C54.c b/src/rom_8034C54.c
index e175ecc64..cc875bd3f 100644
--- a/src/rom_8034C54.c
+++ b/src/rom_8034C54.c
@@ -3,6 +3,7 @@
#include "alloc.h"
#include "decompress.h"
#include "main.h"
+#include "battle_main.h"
struct UnkStruct2
{
@@ -31,8 +32,6 @@ struct UnkStruct1
struct UnkStruct2 *array;
};
-extern const struct SpriteTemplate gUnknown_0831AC88;
-
// this file's functions
static u8 sub_8035518(u8 arg0);;
static void sub_8034EFC(struct UnkStruct2 *arg0);
@@ -133,7 +132,7 @@ bool32 sub_8034D14(u32 id, s32 arg1, const struct UnkStruct3 *arg2)
compSpriteSheet = *(struct CompressedSpriteSheet*)(arg2->spriteSheet);
compSpriteSheet.size = GetDecompressedDataSize(arg2->spriteSheet->data);
- gUnknown_02022E10->array[id].tileStart = LoadCompressedObjectPic(&compSpriteSheet);
+ gUnknown_02022E10->array[id].tileStart = LoadCompressedSpriteSheet(&compSpriteSheet);
}
if (gUnknown_02022E10->array[id].tileStart == 0xFFFF)
diff --git a/src/roulette_util.c b/src/roulette_util.c
index a197cfa09..c556a4af5 100755
--- a/src/roulette_util.c
+++ b/src/roulette_util.c
@@ -206,463 +206,227 @@ void sub_8151A9C(struct UnkStruct0 *r0, u16 r1)
}
}
-void sub_8151B3C(struct InnerStruct203CF18 *arg0)
+void InitPulseBlend(struct PulseBlend *pulseBlend)
{
u8 i = 0;
- arg0->unk0 = 0;
- memset(&arg0->unk4, 0, sizeof(arg0->unk4));
+ pulseBlend->usedPulseBlendPalettes = 0;
+ memset(&pulseBlend->pulseBlendPalettes, 0, sizeof(pulseBlend->pulseBlendPalettes));
for (; i < 16; i++)
- {
- arg0->unk4[i].unk0 = i;
- }
+ pulseBlend->pulseBlendPalettes[i].paletteSelector = i;
}
-int sub_8151B68(struct InnerStruct203CF18 *arg0, const struct InnerStruct203CF18_3 *arg1)
+int InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct PulseBlendSettings *settings)
{
u8 i = 0;
- struct InnerStruct203CF18_2 *r4 = NULL;
+ struct PulseBlendPalette *pulseBlendPalette = NULL;
- if (!arg0->unk4[0].unk1_7)
+ if (!pulseBlend->pulseBlendPalettes[0].inUse)
{
- r4 = &arg0->unk4[0];
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[0];
}
else
{
while (++i < 16)
{
- if (!arg0->unk4[i].unk1_7)
+ if (!pulseBlend->pulseBlendPalettes[i].inUse)
{
- r4 = &arg0->unk4[i];
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i];
break;
}
}
}
- if (r4 == 0)
+ if (pulseBlendPalette == NULL)
return 0xFF;
- r4->unk1_0 = 0;
- r4->unk1_4 = 0;
- r4->unk1_6 = 1;
- r4->unk1_7 = 1;
- r4->unk2 = 0;
- r4->unk3 = 0;
- memcpy(&r4->unk4, arg1, sizeof(*arg1));
+ pulseBlendPalette->blendCoeff = 0;
+ pulseBlendPalette->fadeDirection = 0;
+ pulseBlendPalette->available = 1;
+ pulseBlendPalette->inUse = 1;
+ pulseBlendPalette->delayCounter = 0;
+ pulseBlendPalette->fadeCycleCounter = 0;
+ memcpy(&pulseBlendPalette->pulseBlendSettings, settings, sizeof(*settings));
return i;
}
-void sub_8151BD4(struct InnerStruct203CF18_2 *arg0)
+static void ClearPulseBlendPalettesSettings(struct PulseBlendPalette *pulseBlendPalette)
{
u16 i;
- if (!arg0->unk1_6 && arg0->unk4.unk7_6)
+ if (!pulseBlendPalette->available && pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)
{
- for (i = arg0->unk4.unk2; i < arg0->unk4.unk2 + arg0->unk4.unk4; i++)
+ for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)
gPlttBufferFaded[i] = gPlttBufferUnfaded[i];
}
- memset(&arg0->unk4, 0, sizeof(arg0->unk4));
- arg0->unk1_0 = 0;
- arg0->unk1_4 = 0;
- arg0->unk1_5 = 0;
- arg0->unk1_6 = 1;
- arg0->unk1_7 = 0;
- arg0->unk3 = 0;
- arg0->unk2 = 0;
+ memset(&pulseBlendPalette->pulseBlendSettings, 0, sizeof(pulseBlendPalette->pulseBlendSettings));
+ pulseBlendPalette->blendCoeff = 0;
+ pulseBlendPalette->fadeDirection = 0;
+ pulseBlendPalette->unk1_5 = 0;
+ pulseBlendPalette->available = 1;
+ pulseBlendPalette->inUse = 0;
+ pulseBlendPalette->fadeCycleCounter = 0;
+ pulseBlendPalette->delayCounter = 0;
}
-void sub_8151C50(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2)
+void UnloadUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)
{
u16 i = 0;
- if (!arg2)
+ if (!multiSelection)
{
- sub_8151BD4(&arg0->unk4[arg1 & 0xF]);
+ ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF]);
}
else
{
for (i = 0; i < 16; i++)
{
- if ((arg1 & 1) && arg0->unk4[i].unk1_7)
- sub_8151BD4(&arg0->unk4[i]);
+ if ((pulseBlendPaletteSelector & 1) && pulseBlend->pulseBlendPalettes[i].inUse)
+ ClearPulseBlendPalettesSettings(&pulseBlend->pulseBlendPalettes[i]);
- arg1 >>= 1;
+ pulseBlendPaletteSelector >>= 1;
}
}
}
-// there seems to be a temp var involved inside the first if block
-void sub_8151CA8(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2)
+void MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)
{
u8 i = 0;
- if (!arg2)
+ if (!multiSelection)
{
- i = arg1 & 0xF;
- arg0->unk4[i].unk1_6 = 0;
- arg0->unk0 |= 1 << i;
+ i = pulseBlendPaletteSelector & 0xF;
+ pulseBlend->pulseBlendPalettes[i].available = 0;
+ pulseBlend->usedPulseBlendPalettes |= 1 << i;
}
else
{
for (i = 0; i < 16; i++)
{
- if (!(arg1 & 1) || !arg0->unk4[i].unk1_7 || !arg0->unk4[i].unk1_6)
+ if (!(pulseBlendPaletteSelector & 1) || !pulseBlend->pulseBlendPalettes[i].inUse || !pulseBlend->pulseBlendPalettes[i].available)
{
- arg1 <<= 1;
+ pulseBlendPaletteSelector <<= 1;
}
else
{
- arg0->unk4[i].unk1_6 = 0;
- arg0->unk0 |= 1 << i;
+ pulseBlend->pulseBlendPalettes[i].available = 0;
+ pulseBlend->usedPulseBlendPalettes |= 1 << i;
}
}
}
}
-void sub_8151D28(struct InnerStruct203CF18 *arg0, u16 arg1, u8 arg2)
+void UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection)
{
u16 i;
- struct InnerStruct203CF18_2 *var0;
+ struct PulseBlendPalette *pulseBlendPalette;
u8 j = 0;
- if (!arg2)
+ if (!multiSelection)
{
- var0 = &arg0->unk4[arg1 & 0xF];
- if (!var0->unk1_6 && var0->unk1_7)
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[pulseBlendPaletteSelector & 0xF];
+ if (!pulseBlendPalette->available && pulseBlendPalette->inUse)
{
- if (var0->unk4.unk7_6)
+ if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)
{
- for (i = var0->unk4.unk2; i < var0->unk4.unk2 + var0->unk4.unk4; i++)
+ for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)
gPlttBufferFaded[i] = gPlttBufferUnfaded[i];
}
- var0->unk1_6 = 1;
- arg0->unk0 &= ~(1 << j);
+ pulseBlendPalette->available = 1;
+ pulseBlend->usedPulseBlendPalettes &= ~(1 << j);
}
}
else
{
for (j = 0; j < 16; j++)
{
- var0 = &arg0->unk4[j];
- if (!(arg1 & 1) || var0->unk1_6 || !var0->unk1_7)
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[j];
+ if (!(pulseBlendPaletteSelector & 1) || pulseBlendPalette->available || !pulseBlendPalette->inUse)
{
- arg1 <<= 1;
+ pulseBlendPaletteSelector <<= 1;
}
else
{
- if (var0->unk4.unk7_6)
+ if (pulseBlendPalette->pulseBlendSettings.restorePaletteOnUnload)
{
- for (i = var0->unk4.unk2; i < var0->unk4.unk2 + var0->unk4.unk4; i++)
+ for (i = pulseBlendPalette->pulseBlendSettings.paletteOffset; i < pulseBlendPalette->pulseBlendSettings.paletteOffset + pulseBlendPalette->pulseBlendSettings.numColors; i++)
gPlttBufferFaded[i] = gPlttBufferUnfaded[i];
}
- var0->unk1_6 = 1;
- arg0->unk0 &= ~(1 << j);
+ pulseBlendPalette->available = 1;
+ pulseBlend->usedPulseBlendPalettes &= ~(1 << j);
}
}
}
}
-#ifdef NONMATCHING
-void sub_8151E50(struct InnerStruct203CF18 *arg0)
+void UpdatePulseBlend(struct PulseBlend *pulseBlend)
{
- struct InnerStruct203CF18_2 *var0;
+ struct PulseBlendPalette *pulseBlendPalette;
u8 i = 0;
- if (arg0->unk0)
+ if (pulseBlend->usedPulseBlendPalettes)
{
for (i = 0; i < 16; i++)
{
- var0 = &arg0->unk4[i];
- if ((!var0->unk1_6 && var0->unk1_7) && (!gPaletteFade.active || !var0->unk4.unk7_7))
+ pulseBlendPalette = &pulseBlend->pulseBlendPalettes[i];
+ if ((!pulseBlendPalette->available && pulseBlendPalette->inUse) && (!gPaletteFade.active || !pulseBlendPalette->pulseBlendSettings.unk7_7))
{
- if (--var0->unk2 == 0xFF)
+ if (--pulseBlendPalette->delayCounter == 0xFF)
{
- var0->unk2 = var0->unk4.unk5;
- BlendPalette(var0->unk4.unk2, var0->unk4.unk4, var0->unk1_0, var0->unk4.unk0);
- switch (var0->unk4.unk7_4)
+ pulseBlendPalette->delayCounter = pulseBlendPalette->pulseBlendSettings.delay;
+ BlendPalette(pulseBlendPalette->pulseBlendSettings.paletteOffset, pulseBlendPalette->pulseBlendSettings.numColors, pulseBlendPalette->blendCoeff, pulseBlendPalette->pulseBlendSettings.blendColor);
+ switch (pulseBlendPalette->pulseBlendSettings.fadeType)
{
- case 0:
- if (var0->unk1_0++ == var0->unk4.unk7_0)
+ case 0: // Fade all the way to the max blend amount, then wrap around
+ // BUG: This comparison will never be true for maxBlendCoeff values that are >= 8. This is because
+ // maxBlendCoeff is a signed 4-bit field, but blendCoeff is an unsigned 4-bit field. This code is never
+ // reached, anyway, so the bug is not observable in vanilla gameplay.
+ if (pulseBlendPalette->blendCoeff++ == pulseBlendPalette->pulseBlendSettings.maxBlendCoeff)
{
- var0->unk3++;
- var0->unk1_0 = 0;
+ pulseBlendPalette->fadeCycleCounter++;
+ pulseBlendPalette->blendCoeff = 0;
}
break;
- case 1:
- if (var0->unk1_4)
+ case 1: // Fade in and out
+ if (pulseBlendPalette->fadeDirection)
{
- if (--var0->unk1_0 == 0)
+ if (--pulseBlendPalette->blendCoeff == 0)
{
- var0->unk3++;
- var0->unk1_4 ^= 1;
+ pulseBlendPalette->fadeCycleCounter++;
+ pulseBlendPalette->fadeDirection ^= 1;
}
}
else
{
- if (var0->unk1_0++ == var0->unk4.unk7_0 - 1)
+ u8 max = (pulseBlendPalette->pulseBlendSettings.maxBlendCoeff - 1) & 0xF;
+ if (pulseBlendPalette->blendCoeff++ == max)
{
- var0->unk3++;
- var0->unk1_4 ^= 1;
+ pulseBlendPalette->fadeCycleCounter++;
+ pulseBlendPalette->fadeDirection ^= 1;
}
}
break;
- case 2:
- if (var0->unk1_4)
- var0->unk1_0 = 0;
+ case 2: // Flip back and forth
+ if (pulseBlendPalette->fadeDirection)
+ pulseBlendPalette->blendCoeff = 0;
else
- var0->unk1_0 = var0->unk4.unk7_0;
+ pulseBlendPalette->blendCoeff = pulseBlendPalette->pulseBlendSettings.maxBlendCoeff & 0xF;
- var0->unk1_4 ^= 1;
- var0->unk3++;
+ pulseBlendPalette->fadeDirection ^= 1;
+ pulseBlendPalette->fadeCycleCounter++;
break;
}
- if (var0->unk4.unk6 != 0xFF && var0->unk3 == 0xFF)
- sub_8151D28(arg0, var0->unk0, 0);
+ if (pulseBlendPalette->pulseBlendSettings.numFadeCycles != 0xFF
+ && pulseBlendPalette->fadeCycleCounter == pulseBlendPalette->pulseBlendSettings.numFadeCycles)
+ UnmarkUsedPulseBlendPalettes(pulseBlend, pulseBlendPalette->paletteSelector, FALSE);
}
}
}
}
}
-#else
-NAKED
-void sub_8151E50(struct InnerStruct203CF18 *arg0)
-{
- asm_unified("\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x4\n\
- str r0, [sp]\n\
- movs r0, 0\n\
- mov r10, r0\n\
- ldr r1, [sp]\n\
- ldrh r0, [r1]\n\
- cmp r0, 0\n\
- bne _08151E6C\n\
- b _08151FF6\n\
-_08151E6C:\n\
- movs r2, 0xF\n\
- mov r9, r2\n\
- movs r3, 0x10\n\
- negs r3, r3\n\
- mov r8, r3\n\
- movs r7, 0x1\n\
-_08151E78:\n\
- mov r5, r10\n\
- lsls r0, r5, 1\n\
- add r0, r10\n\
- lsls r0, 2\n\
- adds r0, 0x4\n\
- ldr r1, [sp]\n\
- adds r4, r1, r0\n\
- ldrb r2, [r4, 0x1]\n\
- movs r3, 0xC0\n\
- ands r3, r2\n\
- cmp r3, 0x80\n\
- beq _08151E92\n\
- b _08151FE6\n\
-_08151E92:\n\
- ldr r0, =gPaletteFade\n\
- ldrb r1, [r0, 0x7]\n\
- adds r0, r3, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08151EA8\n\
- ldrb r0, [r4, 0xB]\n\
- ands r3, r0\n\
- cmp r3, 0\n\
- beq _08151EA8\n\
- b _08151FE6\n\
-_08151EA8:\n\
- ldrb r0, [r4, 0x2]\n\
- subs r0, 0x1\n\
- strb r0, [r4, 0x2]\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0xFF\n\
- beq _08151EB8\n\
- b _08151FE6\n\
-_08151EB8:\n\
- ldrb r0, [r4, 0x9]\n\
- strb r0, [r4, 0x2]\n\
- ldrh r0, [r4, 0x6]\n\
- ldrb r1, [r4, 0x8]\n\
- lsls r2, 28\n\
- lsrs r2, 28\n\
- ldrh r3, [r4, 0x4]\n\
- bl BlendPalette\n\
- ldrb r5, [r4, 0xB]\n\
- lsls r0, r5, 26\n\
- asrs r0, 30\n\
- cmp r0, 0x1\n\
- beq _08151F16\n\
- cmp r0, 0x1\n\
- bgt _08151EE4\n\
- cmp r0, 0\n\
- beq _08151EEA\n\
- b _08151FD0\n\
- .pool\n\
-_08151EE4:\n\
- cmp r0, 0x2\n\
- beq _08151F92\n\
- b _08151FD0\n\
-_08151EEA:\n\
- ldrb r2, [r4, 0x1]\n\
- lsls r1, r2, 28\n\
- lsrs r0, r1, 28\n\
- adds r0, 0x1\n\
- mov r3, r9\n\
- ands r0, r3\n\
- mov r6, r8\n\
- adds r3, r6, 0\n\
- ands r3, r2\n\
- orrs r3, r0\n\
- strb r3, [r4, 0x1]\n\
- lsrs r1, 28\n\
- lsls r0, r5, 28\n\
- asrs r0, 28\n\
- cmp r1, r0\n\
- bne _08151FD0\n\
- ldrb r0, [r4, 0x3]\n\
- adds r0, 0x1\n\
- strb r0, [r4, 0x3]\n\
- ands r3, r6\n\
- strb r3, [r4, 0x1]\n\
- b _08151FD0\n\
-_08151F16:\n\
- ldrb r3, [r4, 0x1]\n\
- movs r0, 0x10\n\
- ands r0, r3\n\
- cmp r0, 0\n\
- beq _08151F54\n\
- lsls r0, r3, 28\n\
- lsrs r0, 28\n\
- subs r0, 0x1\n\
- mov r5, r9\n\
- ands r0, r5\n\
- mov r2, r8\n\
- ands r2, r3\n\
- orrs r2, r0\n\
- strb r2, [r4, 0x1]\n\
- cmp r0, 0\n\
- bne _08151FD0\n\
- ldrb r0, [r4, 0x3]\n\
- adds r0, 0x1\n\
- strb r0, [r4, 0x3]\n\
- lsls r0, r2, 27\n\
- lsrs r0, 31\n\
- eors r0, r7\n\
- ands r0, r7\n\
- lsls r0, 4\n\
- movs r3, 0x11\n\
- negs r3, r3\n\
- adds r1, r3, 0\n\
- ands r2, r1\n\
- orrs r2, r0\n\
- strb r2, [r4, 0x1]\n\
- b _08151FD0\n\
-_08151F54:\n\
- lsls r0, r5, 28\n\
- asrs r0, 28\n\
- subs r0, 0x1\n\
- mov r5, r9\n\
- ands r0, r5\n\
- lsls r2, r3, 28\n\
- lsrs r1, r2, 28\n\
- adds r1, 0x1\n\
- ands r1, r5\n\
- mov r5, r8\n\
- ands r3, r5\n\
- orrs r3, r1\n\
- strb r3, [r4, 0x1]\n\
- lsrs r2, 28\n\
- cmp r2, r0\n\
- bne _08151FD0\n\
- ldrb r0, [r4, 0x3]\n\
- adds r0, 0x1\n\
- strb r0, [r4, 0x3]\n\
- lsls r0, r3, 27\n\
- lsrs r0, 31\n\
- eors r0, r7\n\
- ands r0, r7\n\
- lsls r0, 4\n\
- movs r2, 0x11\n\
- negs r2, r2\n\
- adds r1, r2, 0\n\
- ands r3, r1\n\
- orrs r3, r0\n\
- strb r3, [r4, 0x1]\n\
- b _08151FD0\n\
-_08151F92:\n\
- ldrb r2, [r4, 0x1]\n\
- movs r0, 0x10\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _08151FA2\n\
- mov r0, r8\n\
- ands r0, r2\n\
- b _08151FB0\n\
-_08151FA2:\n\
- lsls r1, r5, 28\n\
- asrs r1, 28\n\
- mov r3, r9\n\
- ands r1, r3\n\
- mov r0, r8\n\
- ands r0, r2\n\
- orrs r0, r1\n\
-_08151FB0:\n\
- strb r0, [r4, 0x1]\n\
- ldrb r2, [r4, 0x1]\n\
- lsls r0, r2, 27\n\
- lsrs r0, 31\n\
- eors r0, r7\n\
- ands r0, r7\n\
- lsls r0, 4\n\
- movs r5, 0x11\n\
- negs r5, r5\n\
- adds r1, r5, 0\n\
- ands r2, r1\n\
- orrs r2, r0\n\
- strb r2, [r4, 0x1]\n\
- ldrb r0, [r4, 0x3]\n\
- adds r0, 0x1\n\
- strb r0, [r4, 0x3]\n\
-_08151FD0:\n\
- ldrb r1, [r4, 0xA]\n\
- cmp r1, 0xFF\n\
- beq _08151FE6\n\
- ldrb r0, [r4, 0x3]\n\
- cmp r0, r1\n\
- bne _08151FE6\n\
- ldrb r1, [r4]\n\
- ldr r0, [sp]\n\
- movs r2, 0\n\
- bl sub_8151D28\n\
-_08151FE6:\n\
- mov r0, r10\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r10, r0\n\
- cmp r0, 0xF\n\
- bhi _08151FF6\n\
- b _08151E78\n\
-_08151FF6:\n\
- add sp, 0x4\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0");
-}
-#endif // NONMATCHING
void sub_8152008(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height)
{
diff --git a/src/save.c b/src/save.c
index 4ae516fc9..cfbe5b848 100644
--- a/src/save.c
+++ b/src/save.c
@@ -5,6 +5,7 @@
#include "decompress.h"
#include "load_save.h"
#include "overworld.h"
+#include "pokemon_storage_system.h"
#include "main.h"
#include "constants/game_stat.h"
@@ -76,7 +77,7 @@ extern void DoSaveFailedScreen(u8); // save_failed_screen
extern bool32 ProgramFlashSectorAndVerify(u8 sector, u8 *data);
extern void save_serialize_map(void);
extern void sub_800ADF8(void);
-extern bool8 sub_800A520(void);
+extern bool8 IsLinkTaskFinished(void);
// iwram common
u16 gLastWrittenSector;
@@ -913,7 +914,7 @@ void sub_8153688(u8 taskId)
taskData[0] = 2;
break;
case 2:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
if (taskData[2] == 0)
save_serialize_map();
@@ -922,7 +923,7 @@ void sub_8153688(u8 taskId)
break;
case 3:
if (taskData[2] == 0)
- sub_8076D5C();
+ SetContinueGameWarpStatusToDynamicWarp();
sub_8153380();
taskData[0] = 4;
break;
@@ -945,12 +946,12 @@ void sub_8153688(u8 taskId)
break;
case 7:
if (taskData[2] == 0)
- sav2_gender2_inplace_and_xFE();
+ ClearContinueGameWarpStatus2();
sub_800ADF8();
taskData[0] = 8;
break;
case 8:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sub_8153408();
taskData[0] = 9;
@@ -961,7 +962,7 @@ void sub_8153688(u8 taskId)
taskData[0] = 10;
break;
case 10:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
taskData[0]++;
break;
case 11:
diff --git a/src/save_location.c b/src/save_location.c
index d49afa736..2443b3161 100644
--- a/src/save_location.c
+++ b/src/save_location.c
@@ -2,11 +2,6 @@
#include "save_location.h"
#include "constants/maps.h"
-// specialSaveWarp flags
-#define POKECENTER_SAVEWARP (1 << 1)
-#define LOBBY_SAVEWARP (1 << 2)
-#define UNK_SPECIAL_SAVE_WARP_FLAG_3 (1 << 3)
-
static bool32 IsCurMapInLocationList(const u16 *list)
{
s32 i;
@@ -94,26 +89,26 @@ static bool32 sub_81AFCEC(void)
static void TrySetPokeCenterWarpStatus(void)
{
if (IsCurMapPokeCenter() == FALSE)
- gSaveBlock2Ptr->specialSaveWarp &= ~(POKECENTER_SAVEWARP);
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP);
else
- gSaveBlock2Ptr->specialSaveWarp |= POKECENTER_SAVEWARP;
+ gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP;
}
static void TrySetReloadWarpStatus(void)
{
if (!IsCurMapReloadLocation())
- gSaveBlock2Ptr->specialSaveWarp &= ~(LOBBY_SAVEWARP);
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP);
else
- gSaveBlock2Ptr->specialSaveWarp |= LOBBY_SAVEWARP;
+ gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP;
}
// this function definitely sets a warp status, but because the list is empty, it's unknown what this does yet.
static void sub_81AFD5C(void)
{
if (!sub_81AFCEC())
- gSaveBlock2Ptr->specialSaveWarp &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3);
+ gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3);
else
- gSaveBlock2Ptr->specialSaveWarp |= UNK_SPECIAL_SAVE_WARP_FLAG_3;
+ gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3;
}
void TrySetMapSaveWarpStatus(void)
@@ -136,5 +131,5 @@ void sub_81AFDA0(void)
void sub_81AFDD0(void)
{
- gSaveBlock2Ptr->specialSaveWarp |= 0x80;
+ gSaveBlock2Ptr->specialSaveWarpFlags |= 0x80;
}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index e699bfeab..837259a7f 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -49,12 +49,12 @@
#include "trainer_see.h"
#include "tv.h"
#include "window.h"
+#include "constants/event_objects.h"
typedef u16 (*SpecialFunc)(void);
typedef void (*NativeFunc)(void);
-extern const u8 *gUnknown_020375C0;
-
+EWRAM_DATA const u8 *gUnknown_020375C0 = NULL;
static EWRAM_DATA u32 gUnknown_020375C4 = 0;
static EWRAM_DATA u16 sPauseCounter = 0;
static EWRAM_DATA u16 sMovingNpcId = 0;
@@ -735,7 +735,7 @@ bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx)
{
u16 value = VarGet(ScriptReadHalfword(ctx));
- sub_8085524(value);
+ SetCurrentMapLayout(value);
return FALSE;
}
@@ -747,8 +747,8 @@ bool8 ScrCmd_warp(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
- sub_80AF734();
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ DoWarp();
ResetInitialPlayerAvatarState();
return TRUE;
}
@@ -761,8 +761,8 @@ bool8 ScrCmd_warpsilent(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
- sp13E_warp_to_last_warp();
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ DoDiveWarp();
ResetInitialPlayerAvatarState();
return TRUE;
}
@@ -775,8 +775,8 @@ bool8 ScrCmd_warpdoor(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
- sub_80AF7D0();
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ DoDoorWarp();
ResetInitialPlayerAvatarState();
return TRUE;
}
@@ -790,10 +790,10 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx)
PlayerGetDestCoords(&x, &y);
if (mapGroup == 0xFF && mapNum == 0xFF)
- SetFixedHoleWarpAsDestination(x - 7, y - 7);
+ SetWarpDestinationToFixedHoleWarp(x - 7, y - 7);
else
- Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7);
- sp13F_fall_to_last_warp();
+ SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7);
+ DoFallWarp();
ResetInitialPlayerAvatarState();
return TRUE;
}
@@ -806,7 +806,7 @@ bool8 ScrCmd_warpteleport(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
sub_80AF848();
ResetInitialPlayerAvatarState();
return TRUE;
@@ -820,7 +820,7 @@ bool8 ScrCmd_warpD7(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
sub_80AF87C();
ResetInitialPlayerAvatarState();
return TRUE;
@@ -834,7 +834,7 @@ bool8 ScrCmd_setwarp(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
return FALSE;
}
@@ -846,7 +846,7 @@ bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- saved_warp2_set_2(0, mapGroup, mapNum, warpId, x, y);
+ SetDynamicWarpWithCoords(0, mapGroup, mapNum, warpId, x, y);
return FALSE;
}
@@ -882,7 +882,7 @@ bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- sub_8084DD4(mapGroup, mapNum, warpId, x, y);
+ SetEscapeWarp(mapGroup, mapNum, warpId, x, y);
return FALSE;
}
@@ -1239,11 +1239,11 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx)
bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
{
- u8 objectId;
+ u8 playerObjectId;
HideFieldMessageBox();
- objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
- EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
+ playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]);
sub_80D338C();
UnfreezeEventObjects();
return FALSE;
@@ -1251,13 +1251,13 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
bool8 ScrCmd_release(struct ScriptContext *ctx)
{
- u8 objectId;
+ u8 playerObjectId;
HideFieldMessageBox();
if (gEventObjects[gSelectedEventObject].active)
EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]);
- objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0);
- EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]);
+ playerObjectId = GetEventObjectIdByLocalIdAndMap(EVENT_OBJ_ID_PLAYER, 0, 0);
+ EventObjectClearHeldMovementIfFinished(&gEventObjects[playerObjectId]);
sub_80D338C();
UnfreezeEventObjects();
return FALSE;
@@ -1485,7 +1485,7 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
StringExpandPlaceholders(gStringVar4, ptr + 6);
- width = GetStringWidth(6, gStringVar4, -1) / 8;
+ width = GetStringWidth(6, gStringVar4, -1) / 8u;
if (width > 0x1C)
width = 0x1C;
@@ -1713,8 +1713,7 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx)
u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL);
if (!species)
break;
- // UB: GetMonData() arguments don't match function definition
- if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE)
+ if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && MonKnowsMove(&gPlayerParty[i], moveId) == TRUE)
{
gSpecialVar_Result = i;
gSpecialVar_0x8004 = species;
@@ -1999,7 +1998,7 @@ bool8 ScrCmd_setrespawn(struct ScriptContext *ctx)
{
u16 healLocationId = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetHealLocationWarp(healLocationId);
+ SetLastHealLocationWarp(healLocationId);
return FALSE;
}
@@ -2236,7 +2235,7 @@ bool8 ScrCmd_warpD1(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
sub_808D074(GetPlayerFacingDirection());
sub_80B0244();
ResetInitialPlayerAvatarState();
@@ -2290,7 +2289,7 @@ bool8 ScrCmd_warpE0(struct ScriptContext *ctx)
u16 x = VarGet(ScriptReadHalfword(ctx));
u16 y = VarGet(ScriptReadHalfword(ctx));
- Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
+ SetWarpDestination(mapGroup, mapNum, warpId, x, y);
sub_80AF79C();
ResetInitialPlayerAvatarState();
return TRUE;
diff --git a/src/script_menu.c b/src/script_menu.c
index 2aa546288..6f16b1a8a 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -1640,27 +1640,27 @@ static void sub_80E2A94(u8 multichoiceId)
{
case 77:
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized2(0, 1, gUnknown_0858BBAC[GetMenuCursorPos()], 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(0, 1, gUnknown_0858BBAC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3);
break;
case 76:
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized2(0, 1, gUnknown_0858BB9C[GetMenuCursorPos()], 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(0, 1, gUnknown_0858BB9C[Menu_GetCursorPos()], 0, NULL, 2, 1, 3);
break;
case 78:
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized2(0, 1, gUnknown_0858BBBC[GetMenuCursorPos()], 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(0, 1, gUnknown_0858BBBC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3);
break;
case 79:
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized2(0, 1, gUnknown_0858BBCC[GetMenuCursorPos()], 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(0, 1, gUnknown_0858BBCC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3);
break;
case 75:
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized2(0, 1, gUnknown_0858BBEC[GetMenuCursorPos()], 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(0, 1, gUnknown_0858BBEC[Menu_GetCursorPos()], 0, NULL, 2, 1, 3);
break;
case 74:
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParameterized2(0, 1, gUnknown_0858BBE0[GetMenuCursorPos()], 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized2(0, 1, gUnknown_0858BBE0[Menu_GetCursorPos()], 0, NULL, 2, 1, 3);
break;
}
}
diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c
index fc5a06024..15e91ac98 100755
--- a/src/script_pokemon_util_80F87D8.c
+++ b/src/script_pokemon_util_80F87D8.c
@@ -36,8 +36,6 @@ extern const u16 gEventObjectPalette33[];
extern const u16 gEventObjectPalette34[];
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
-extern u8 gSelectedOrderFromParty[];
-
static const u8 gUnknown_0858D8EC[] = { 3, 4, 5, 14 };
static void sub_80F8EE8(u8 taskId);
@@ -335,7 +333,7 @@ void ShowContestEntryMonPic(void)
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
- LoadCompressedObjectPalette(palette);
+ LoadCompressedSpritePalette(palette);
SetMultiuseSpriteTemplateToPokemon(species, 1);
gMultiuseSpriteTemplate.paletteTag = palette->tag;
spriteId = CreateSprite(&gMultiuseSpriteTemplate, (left + 1) * 8 + 32, (top * 8) + 40, 0);
@@ -453,7 +451,7 @@ static void sub_80F9088(u8 taskId)
switch (gTasks[taskId].data[0])
{
case 0:
- if (sub_800A520())
+ if (IsLinkTaskFinished())
{
sub_800ADF8();
gTasks[taskId].data[0]++;
@@ -463,7 +461,7 @@ static void sub_80F9088(u8 taskId)
gTasks[taskId].data[0]++;
break;
default:
- if (sub_800A520() == 1)
+ if (IsLinkTaskFinished() == 1)
{
EnableBothScriptContexts();
DestroyTask(taskId);
@@ -530,7 +528,7 @@ void HealPlayerParty(void)
ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES);
// restore PP.
- for(j = 0; j < 4; j++)
+ for(j = 0; j < MAX_MON_MOVES; j++)
{
arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j);
SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg);
diff --git a/src/secret_base.c b/src/secret_base.c
index a32186419..1f3f9b46a 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -16,11 +16,13 @@
#include "overworld.h"
#include "fieldmap.h"
#include "field_camera.h"
+#include "field_specials.h"
#include "field_player_avatar.h"
#include "field_screen_effect.h"
#include "field_weather.h"
#include "event_object_movement.h"
#include "field_effect.h"
+#include "fldeff.h"
#include "fldeff_misc.h"
#include "metatile_behavior.h"
#include "map_name_popup.h"
@@ -32,7 +34,6 @@
#include "event_data.h"
#include "battle.h"
#include "battle_setup.h"
-#include "rom6.h"
#include "decoration.h"
#include "link.h"
#include "tv.h"
@@ -365,7 +366,7 @@ void sub_80E8F9C(void)
s8 idx;
idx = sCurSecretBaseId / 10 * 4;
- warp1_set_2(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]);
+ SetWarpDestinationToMapWarp(MAP_GROUP(SECRET_BASE_RED_CAVE1), gUnknown_0858CFE8[idx], gUnknown_0858CFE8[idx + 1]);
}
void sub_80E8FD0(u8 taskId)
@@ -399,7 +400,7 @@ void sub_80E9068(void)
{
CreateTask(sub_80E8FD0, 0);
FadeScreen(1, 0);
- saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+ SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
bool8 sub_80E909C(void)
@@ -444,7 +445,7 @@ void sub_80E916C(u8 taskId)
if (!gPaletteFade.active)
{
idx = sCurSecretBaseId / 10 * 4;
- Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gUnknown_0858CFE8[idx + 2], gUnknown_0858CFE8[idx + 3]);
+ SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gUnknown_0858CFE8[idx + 2], gUnknown_0858CFE8[idx + 3]);
WarpIntoMap();
gFieldCallback = sub_80E9108;
SetMainCallback2(CB2_LoadMap);
@@ -609,7 +610,7 @@ void sub_80E9608(const struct MapPosition *position, const struct MapEvents *eve
}
}
-void sub_80E9668(const struct MapPosition *position, const struct MapEvents *events)
+void WarpIntoSecretBase(const struct MapPosition *position, const struct MapEvents *events)
{
sub_80E9608(position, events);
sub_80E8B6C();
@@ -642,7 +643,7 @@ void sub_80E96A4(u8 taskId)
}
break;
case 2:
- copy_saved_warp2_bank_and_enter_x_to_warp1(0x7e);
+ SetWarpDestinationToDynamicWarp(0x7e);
WarpIntoMap();
gFieldCallback = mapldr_default;
SetMainCallback2(CB2_LoadMap);
diff --git a/src/smokescreen.c b/src/smokescreen.c
index 9b37cd234..d9780bbb6 100644
--- a/src/smokescreen.c
+++ b/src/smokescreen.c
@@ -14,8 +14,8 @@ u8 sub_807521C(s16 x, s16 y, u8 a3)
if (GetSpriteTileStartByTag(gUnknown_0831C620.tag) == 0xFFFF)
{
- LoadCompressedObjectPicUsingHeap(&gUnknown_0831C620);
- LoadCompressedObjectPaletteUsingHeap(&gUnknown_0831C628);
+ LoadCompressedSpriteSheetUsingHeap(&gUnknown_0831C620);
+ LoadCompressedSpritePaletteUsingHeap(&gUnknown_0831C628);
}
mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8075370);
diff --git a/src/sound.c b/src/sound.c
index ba3f659cc..c63183bdc 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -28,7 +28,6 @@ IWRAM_DATA static u16 sFanfareCounter;
// iwram common
bool8 gDisableMusic;
-extern u32 gBattleTypeFlags;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
@@ -37,8 +36,6 @@ extern struct ToneData gCryTable[];
extern struct ToneData gCryTable2[];
extern const struct Fanfare sFanfares[];
-extern u16 SpeciesToCryId(u16);
-
static void Task_Fanfare(u8 taskId);
static void CreateFanfareTask(void);
static void Task_DuckBGMForPokemonCry(u8 taskId);
diff --git a/src/start_menu.c b/src/start_menu.c
index 0e52f05fb..0f608b1d2 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -574,13 +574,13 @@ static bool8 HandleStartMenuInput(void)
if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
- sStartMenuCursorPos = MoveMenuCursor(-1);
+ sStartMenuCursorPos = Menu_MoveCursor(-1);
}
if (gMain.newKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
- sStartMenuCursorPos = MoveMenuCursor(1);
+ sStartMenuCursorPos = Menu_MoveCursor(1);
}
if (gMain.newKeys & A_BUTTON)
@@ -623,7 +623,7 @@ static bool8 StartMenuPokedexCallback(void)
IncrementGameStat(GAME_STAT_CHECKED_POKEDEX);
PlayRainSoundEffect();
RemoveExtraStartMenuWindows();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_Pokedex);
return TRUE;
@@ -638,7 +638,7 @@ static bool8 StartMenuPokemonCallback(void)
{
PlayRainSoundEffect();
RemoveExtraStartMenuWindows();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_PartyMenuFromStartMenu); // Display party menu
return TRUE;
@@ -653,7 +653,7 @@ static bool8 StartMenuBagCallback(void)
{
PlayRainSoundEffect();
RemoveExtraStartMenuWindows();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_BagMenuFromStartMenu); // Display bag menu
return TRUE;
@@ -668,7 +668,7 @@ static bool8 StartMenuPokeNavCallback(void)
{
PlayRainSoundEffect();
RemoveExtraStartMenuWindows();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_PokeNav); // Display PokeNav
return TRUE;
@@ -683,7 +683,7 @@ static bool8 StartMenuPlayerNameCallback(void)
{
PlayRainSoundEffect();
RemoveExtraStartMenuWindows();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
if (is_c1_link_related_active() || InUnionRoom())
{
@@ -722,7 +722,7 @@ static bool8 StartMenuOptionCallback(void)
{
PlayRainSoundEffect();
RemoveExtraStartMenuWindows();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_InitOptionMenu); // Display option menu
gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu;
@@ -754,7 +754,7 @@ static bool8 StartMenuLinkModePlayerNameCallback(void)
if (!gPaletteFade.active)
{
PlayRainSoundEffect();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
TrainerCard_ShowLinkCard(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu);
return TRUE;
@@ -784,7 +784,7 @@ static bool8 StartMenuBattlePyramidBagCallback(void)
{
PlayRainSoundEffect();
RemoveExtraStartMenuWindows();
- overworld_free_bg_tilemaps();
+ CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_PyramidBagMenuFromStartMenu);
return TRUE;
@@ -1285,14 +1285,14 @@ static void sub_80A0550(u8 taskId)
}
break;
case 1:
- sub_8076D5C();
+ SetContinueGameWarpStatusToDynamicWarp();
sub_8153430();
*step = 2;
break;
case 2:
if (sub_8153474())
{
- sav2_gender2_inplace_and_xFE();
+ ClearContinueGameWarpStatus2();
*step = 3;
gSoftResetDisabled = 0;
}
diff --git a/src/starter_choose.c b/src/starter_choose.c
index 46aac5590..2d4a1b1e1 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -412,8 +412,8 @@ void CB2_ChooseStarter(void)
LoadPalette(GetOverworldTextboxPalettePtr(), 0xE0, 0x20);
LoadPalette(gBirchBagGrassPal, 0, 0x40);
- LoadCompressedObjectPic(&gUnknown_085B1ED8[0]);
- LoadCompressedObjectPic(&gUnknown_085B1EE8[0]);
+ LoadCompressedSpriteSheet(&gUnknown_085B1ED8[0]);
+ LoadCompressedSpriteSheet(&gUnknown_085B1EE8[0]);
LoadSpritePalettes(gUnknown_085B1EF8);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
@@ -425,7 +425,7 @@ void CB2_ChooseStarter(void)
SetGpuReg(REG_OFFSET_WINOUT, 0x1F);
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_BLDCNT, 0xFE);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 7);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
diff --git a/src/text.c b/src/text.c
index 07c15596e..a439d3ced 100644
--- a/src/text.c
+++ b/src/text.c
@@ -9,12 +9,12 @@
#include "window.h"
#include "text.h"
#include "blit.h"
+#include "menu.h"
#include "dynamic_placeholder_text_util.h"
extern u8 GetKeypadIconWidth(u8 keypadIconId);
extern u16 Font6Func(struct TextPrinter *textPrinter);
extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
-extern int GetPlayerTextSpeed();
EWRAM_DATA struct TextPrinter gTempTextPrinter = {0};
EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS] = {0};
@@ -1858,7 +1858,7 @@ u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32)
return NULL;
}
-u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
+s32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
{
bool8 isJapanese;
int minGlyphWidth;
@@ -1868,7 +1868,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
u32 lineWidth;
const u8 *bufferPointer;
int glyphWidth;
- u32 width;
+ s32 width;
isJapanese = 0;
minGlyphWidth = 0;
@@ -2028,7 +2028,8 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
if (lineWidth > width)
return lineWidth;
- return width;
+ else
+ return width;
}
u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str)
diff --git a/src/title_screen.c b/src/title_screen.c
index d60e3fc0b..48571ff96 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -518,9 +518,9 @@ void CB2_InitTitleScreen(void)
ResetSpriteData();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 9;
- LoadCompressedObjectPic(&sSpriteSheet_EmeraldVersion[0]);
- LoadCompressedObjectPic(&sSpriteSheet_PressStart[0]);
- LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]);
+ LoadCompressedSpriteSheet(&sSpriteSheet_EmeraldVersion[0]);
+ LoadCompressedSpriteSheet(&sSpriteSheet_PressStart[0]);
+ LoadCompressedSpriteSheet(&sPokemonLogoShineSpriteSheet[0]);
LoadPalette(gTitleScreenEmeraldVersionPal, 0x100, 0x20);
LoadSpritePalette(&sSpritePalette_PressStart[0]);
gMain.state = 2;
@@ -553,7 +553,7 @@ void CB2_InitTitleScreen(void)
SetGpuReg(REG_OFFSET_WIN1V, 0);
SetGpuReg(REG_OFFSET_WININ, 0x1F1F);
SetGpuReg(REG_OFFSET_WINOUT, 0x3F1F);
- SetGpuReg(REG_OFFSET_BLDCNT, 0x84);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_LIGHTEN);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0xC);
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_16COLOR | BGCNT_TXT256x256);
@@ -615,8 +615,8 @@ static void Task_TitleScreenPhase1(u8 taskId)
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);
SetGpuReg(REG_OFFSET_WININ, 0);
SetGpuReg(REG_OFFSET_WINOUT, 0);
- SetGpuReg(REG_OFFSET_BLDCNT, 0x3F50);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x10);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
SetGpuReg(REG_OFFSET_BLDY, 0);
// Create left side of version banner
@@ -652,8 +652,8 @@ static void Task_TitleScreenPhase2(u8 taskId)
else
{
gTasks[taskId].tSkipToNext = TRUE;
- SetGpuReg(REG_OFFSET_BLDCNT, 0x2142);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0xF06);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BD);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(6, 15));
SetGpuReg(REG_OFFSET_BLDY, 0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1
| DISPCNT_OBJ_1D_MAP
diff --git a/src/trade.c b/src/trade.c
new file mode 100644
index 000000000..ccdd43986
--- /dev/null
+++ b/src/trade.c
@@ -0,0 +1,6389 @@
+#include "global.h"
+#include "alloc.h"
+#include "battle_anim.h"
+#include "battle_interface.h"
+#include "bg.h"
+#include "cable_club.h"
+#include "data2.h"
+#include "daycare.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "evolution_scene.h"
+#include "field_screen_effect.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "international_string_util.h"
+#include "librfu.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "load_save.h"
+#include "mail.h"
+#include "main.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokeball.h"
+#include "pokedex.h"
+#include "pokemon_icon.h"
+#include "pokemon_summary_screen.h"
+#include "random.h"
+#include "rom_8011DC0.h"
+#include "save.h"
+#include "script.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.h"
+#include "trainer_card.h"
+#include "trade.h"
+#include "util.h"
+#include "window.h"
+#include "constants/easy_chat.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/species.h"
+#include "constants/songs.h"
+#include "constants/rgb.h"
+
+#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20))
+
+struct InGameTrade {
+ /*0x00*/ u8 name[11];
+ /*0x0C*/ u16 species;
+ /*0x0E*/ u8 ivs[6];
+ /*0x14*/ bool8 secondAbility;
+ /*0x18*/ u32 otId;
+ /*0x1C*/ u8 stats[5];
+ /*0x24*/ u32 personality;
+ /*0x28*/ u16 heldItem;
+ /*0x2A*/ u8 mailNum;
+ /*0x2B*/ u8 otName[11];
+ /*0x36*/ u8 otGender;
+ /*0x37*/ u8 sheen;
+ /*0x38*/ u16 playerSpecies;
+};
+
+static EWRAM_DATA u8 *gUnknown_02032184 = NULL;
+static EWRAM_DATA u8 *gUnknown_02032188[14] = {NULL};
+EWRAM_DATA struct MailStruct gUnknown_020321C0[PARTY_SIZE] = {0};
+EWRAM_DATA u8 gUnknown_02032298[2] = {0};
+static EWRAM_DATA struct {
+ /*0x0000*/ u8 unk_0;
+ /*0x0001*/ u8 unk_1;
+ /*0x0002*/ u8 filler_2[0x28 - 2];
+ /*0x0028*/ u8 partyIcons[2][PARTY_SIZE];
+ /*0x0034*/ u8 tradeMenuCursorSpriteIdx;
+ /*0x0035*/ u8 tradeMenuCursorPosition;
+ /*0x0036*/ u8 partyCounts[2];
+ /*0x0038*/ bool8 tradeMenuOptionsActive[12];
+ /*0x0044*/ u8 unk_44;
+ /*0x0045*/ u8 unk_45[2][PARTY_SIZE];
+ /*0x0051*/ u8 unk_51[2][PARTY_SIZE];
+ /*0x005D*/ u8 unk_5D[2][PARTY_SIZE];
+ /*0x0069*/ u8 unk_69;
+ /*0x006A*/ u8 filler_6A[0x6F - 0x6A];
+ /*0x006F*/ u8 unk_6F;
+ /*0x0070*/ u8 unk_70;
+ /*0x0071*/ u8 filler_71;
+ /*0x0072*/ u16 unk_72;
+ /*0x0074*/ u8 unk_74[2];
+ /*0x0076*/ u8 unk_76[2];
+ /*0x0078*/ u8 unk_78;
+ /*0x0079*/ u8 unk_79;
+ /*0x007A*/ u8 unk_7A;
+ /*0x007B*/ u8 unk_7B;
+ /*0x007C*/ u8 filler_7C[0x7E - 0x7C];
+ /*0x007E*/ u8 unk_7E;
+ /*0x007F*/ u8 filler_7F;
+ /*0x0080*/ u16 linkData[20];
+ /*0x00A8*/ u8 unk_A8;
+ /*0x00A9*/ u8 unk_A9[11];
+ /*0x00B4*/ u8 filler_B4[0x8D0-0xB4];
+ /*0x08D0*/ struct {
+ bool8 unk_0;
+ u16 unk_2;
+ u8 unk_4;
+ } unk_8D0[4];
+ /*0x08F0*/ u16 tilemapBuffer[0x400];
+} *gUnknown_0203229C = {NULL};
+static EWRAM_DATA struct {
+ /*0x00*/ struct Pokemon mon;
+ /*0x64*/ u32 timer;
+ /*0x68*/ u32 unk_68[2];
+ /*0x70*/ u8 filler_70[2];
+ /*0x72*/ u8 unk_72;
+ /*0x73*/ u8 unk_73;
+ /*0x74*/ u16 linkData[10];
+ /*0x88*/ u8 unk_88;
+ /*0x89*/ u8 unk_89;
+ /*0x8A*/ u16 unk_8A;
+ /*0x8C*/ u16 unk_8C;
+ /*0x8E*/ u8 pokePicSpriteIdxs[2];
+ /*0x90*/ u8 unk_90;
+ /*0x91*/ u8 unk_91;
+ /*0x92*/ u8 unk_92;
+ /*0x93*/ u8 unk_93;
+ /*0x94*/ u16 state;
+ /*0x96*/ u8 filler_96[0xD2 - 0x96];
+ /*0xD2*/ u8 unk_D2;
+ /*0xD3*/ u8 unk_D3;
+ /*0xD4*/ u16 unk_D4;
+ /*0xD6*/ u16 unk_D6;
+ /*0xD8*/ u16 unk_D8;
+ /*0xDA*/ u16 unk_DA;
+ /*0xDC*/ u16 unk_DC;
+ /*0xDE*/ u16 unk_DE;
+ /*0xE0*/ s16 bg1vofs;
+ /*0xE2*/ s16 bg1hofs;
+ /*0xE4*/ s16 bg2vofs;
+ /*0xE6*/ s16 bg2hofs;
+ /*0xE8*/ u16 unk_E8;
+ /*0xEA*/ u16 unk_EA;
+ /*0xEC*/ u16 unk_EC;
+ /*0xEE*/ bool8 isLinkTrade;
+ /*0xF0*/ u16 tradeSpecies[2];
+ /*0xF4*/ u16 cachedMapMusic;
+ /*0xF6*/ u8 unk_F6[3];
+ /*0xF9*/ u8 filler_F9;
+ /*0xFA*/ u8 unk_FA;
+ /*0xFB*/ u8 unk_FB;
+ /*0xFC*/ u8 unk_FC;
+ /*0xFD*/ u8 unk_FD;
+ /*0xFE*/ u8 unk_FE;
+} *gUnknown_020322A0 = {NULL};
+
+static bool32 sub_8077260(void);
+static void sub_80773D0(void);
+static void sub_807811C(void);
+static void sub_807825C(void);
+static void sub_80782B8(u8);
+static void sub_8078388(void);
+static bool8 shedinja_maker_maybe(void);
+static void sub_8078C34(void);
+static void sub_80795AC(void);
+static void sub_807967C(u8);
+static void sub_80796B4(u8);
+static u8 sub_8079A3C(u8 *, u8, u8);
+static void sub_8079AA4(u8 *, u8, u8);
+static void sub_8079BE0(u8);
+static void sub_8079C4C(u8, u8, u8, u8, u8, u8);
+static void sub_8079E44(u8);
+static void sub_8079F74(void);
+static void sub_8079F88(u8);
+static void sub_807A000(u8 taskId);
+static void sub_807A024(u8 taskId);
+static void sub_807A048(u16, u8);
+static u32 sub_807A09C(void);
+static void sub_807A0C4(void);
+static void sub_807A19C(u8);
+static bool8 sub_807A1F0(void);
+static void sub_807A308(const u8 *, u8 *, u8);
+static void sub_807A320(u8);
+static void sub_807A468(u8);
+static void sub_807A53C(void);
+static void sub_807A5B0(void);
+static u32 sub_807A5F4(struct Pokemon *, int, int);
+static void sub_807AA28(struct Sprite *sprite);
+static void sub_807AA7C(struct Sprite *sprite);
+static void sub_807AABC(struct Sprite *sprite);
+static void sub_807AAE0(struct Sprite *sprite);
+static void sub_807AB04(struct Sprite *sprite);
+static void sub_807B170(void);
+static void sub_807B60C(void);
+static void sub_807B62C(u8);
+static void sub_807BA94(void);
+static void SetTradeSceneStrings(void);
+static u8 sub_807BBC8(void);
+static u8 sub_807BBEC(void);
+static u8 sub_807CFC8(void);
+static void sub_807E55C(struct Sprite *sprite);
+static void sub_807E5D8(struct Sprite *sprite);
+static void sub_807E64C(struct Sprite *sprite);
+static void sub_807E6AC(struct Sprite *sprite);
+static void sub_807E784(void);
+static void sub_807E974(struct MailStruct *mail, const struct InGameTrade *trade);
+static void sub_807EA2C(void);
+static void sub_807EACC(void);
+static void sub_807EB50(void);
+static void c2_080543C4(void);
+static void sub_807F110(u8);
+static void sub_807F14C(void);
+static void c3_08054588(u8);
+static void c3_0805465C(u8);
+static void sub_807F39C(u8);
+static void sub_807F464(void);
+
+static const u32 sUnref_0832C6A8[] =
+{
+ 0x00000F2C,
+ 0x00003D88,
+ 0x0000001C,
+ 0x00000024,
+ 0x00000064,
+ 0x00000528
+};
+static const u16 gTradeMovesBoxTilemap[] = INCBIN_U16("graphics/trade/moves_box_map.bin");
+static const u16 gTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_map.bin");
+static const u8 gTradeStripesBG2Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg2_map.bin");
+static const u8 gTradeStripesBG3Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg3_map.bin");
+static const u8 gText_EmptyString7[] = _("");
+static const u8 gText_ClrWhtHltTrspntShdwDrkGry[] = _("{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GREY}");
+const u8 gText_MaleSymbol4[] = _("♂");
+const u8 gText_FemaleSymbol4[] = _("♀");
+const u8 gText_GenderlessSymbol[] = _("");
+static const u8 gText_SpaceMove[] = _(" MOVE");
+static const u8 gText_NewLine3[] = _("\n");
+static const u8 gText_Slash2[] = _("/");
+static const u8 gText_Lv2[] = _("Lv. ");
+static const u8 gText_ThreeDashes2[] = _("---");
+static const u8 gText_FourQuestionMarks[] = _("????");
+static const u8 gText_832DAE4[] = _("");
+static const u8 gText_IsThisTradeOkay[] = _("Is this trade okay?");
+static const u8 gText_Cancel6[] = _("CANCEL");
+static const u8 gText_ChooseAPkmn[] = _("Choose a POKéMON.");
+static const u8 gText_Summary3[] = _("SUMMARY");
+static const u8 gText_Trade2[] = _("TRADE");
+static const u8 gText_CancelTrade[] = _("Cancel trade?");
+static const u8 gJPText_832DB2E[] = _("Bボタン で もどります");
+static const u8 gText_Summary4[] = _("SUMMARY");
+static const u8 gText_Trade3[] = _("TRADE");
+static const u8 gText_CommunicationStandby6[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}Communication standby…\nPlease wait.");
+static const u8 gText_TheTradeHasBeenCanceled[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}The trade has\nbeen canceled.");
+static const u8 gText_YourOnlyPkmnForBattle[] = _("That's your only\nPOKéMON for battle.");
+static const u8 gText_WaitingForYourFriend[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}Waiting for your friend\nto finish…");
+static const u8 gText_YourFriendWantsToTrade[] = _("Your friend wants\nto trade POKéMON.");
+
+static const struct OamData gOamData_832DC14 = {
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 2,
+ .priority = 1
+};
+
+static const struct OamData gOamData_832DC1C = {
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 3,
+ .priority = 1
+};
+
+static const union AnimCmd gSpriteAnim_832DC24[] = {
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_832DC2C[] = {
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_832DC34[] = {
+ gSpriteAnim_832DC24,
+ gSpriteAnim_832DC2C
+};
+
+static const struct SpriteSheet gUnknown_0832DC3C = {
+ gUnknown_08DDC6E4, 0x800, 300
+};
+
+static const struct SpritePalette gUnknown_0832DC44 = {
+ gUnknown_08DDB444, 2345
+};
+
+static const union AnimCmd gSpriteAnim_832DC4C[] = {
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_832DC54[] = {
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_832DC5C[] = {
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_832DC64[] = {
+ ANIMCMD_FRAME(24, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_832DC6C[] = {
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_832DC74[] = {
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_832DC7C[] = {
+ gSpriteAnim_832DC4C,
+ gSpriteAnim_832DC54,
+ gSpriteAnim_832DC5C,
+ gSpriteAnim_832DC64,
+ gSpriteAnim_832DC6C,
+ gSpriteAnim_832DC74
+};
+
+static const struct SpriteTemplate gSpriteTemplate_832DC94 =
+{
+ .tileTag = 300,
+ .paletteTag = 2345,
+ .oam = &gOamData_832DC1C,
+ .anims = gSpriteAnimTable_832DC34,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate gSpriteTemplate_832DCAC =
+{
+ .tileTag = 200,
+ .paletteTag = 4925,
+ .oam = &gOamData_832DC14,
+ .anims = gSpriteAnimTable_832DC7C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text.gbapal");
+static const struct SpritePalette gSpritePalette_TradeScreenText =
+{
+ TradeScreenTextPalette, 4925
+};
+
+// This is used to determine the next mon to select when the D-Pad is
+// pressed in a given direction.
+// Note that the mons are laid out like this.
+// 0-5 are the player's party and 6-11 are the trading partner's party.
+// 12 is the cancel button.
+// 0 1 6 7
+// 2 3 8 9
+// 4 5 10 11
+// 12
+
+static const u8 gTradeNextSelectedMonTable[][4][6] =
+{
+ {
+ {4, 2, 12, 12, 0, 0},
+ {2, 4, 12, 12, 0, 0},
+ {7, 6, 1, 0, 0, 0},
+ {1, 6, 7, 0, 0, 0}
+ },
+ {
+ {5, 3, 12, 12, 0, 0},
+ {3, 5, 12, 12, 0, 0},
+ {0, 7, 6, 1, 0, 0},
+ {6, 7, 0, 1, 0, 0}
+ },
+ {
+ {0, 0, 0, 0, 0, 0},
+ {4, 0, 0, 0, 0, 0},
+ {9, 8, 7, 6, 0, 0},
+ {3, 1, 0, 0, 0, 0}
+ },
+ {
+ {1, 1, 1, 1, 0, 0},
+ {5, 1, 1, 1, 0, 0},
+ {2, 9, 8, 7, 0, 0},
+ {8, 9, 6, 6, 0, 0}
+ },
+ {
+ {2, 2, 2, 2, 0, 0},
+ {0, 0, 0, 0, 0, 0},
+ {11, 10, 9, 8, 7, 6},
+ {5, 3, 1, 0, 0, 0}
+ },
+ {
+ {3, 3, 3, 3, 0, 0},
+ {1, 1, 1, 1, 0, 0},
+ {4, 4, 4, 4, 0, 0},
+ {10, 8, 6, 0, 0, 0}
+ },
+ {
+ {10, 8, 12, 0, 0, 0},
+ {8, 10, 12, 0, 0, 0},
+ {1, 0, 0, 0, 0, 0},
+ {7, 0, 1, 0, 0, 0}
+ },
+ {
+ {12, 0, 0, 0, 0, 0},
+ {9, 12, 0, 0, 0, 0},
+ {6, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0}
+ },
+ {
+ {6, 0, 0, 0, 0, 0},
+ {10, 6, 0, 0, 0, 0},
+ {3, 2, 1, 0, 0, 0},
+ {9, 7, 0, 0, 0, 0}
+ },
+ {
+ {7, 0, 0, 0, 0, 0},
+ {11, 12, 0, 0, 0, 0},
+ {8, 0, 0, 0, 0, 0},
+ {2, 1, 0, 0, 0, 0}
+ },
+ {
+ {8, 0, 0, 0, 0, 0},
+ {6, 0, 0, 0, 0, 0},
+ {5, 4, 3, 2, 1, 0},
+ {11, 9, 7, 0, 0, 0}
+ },
+ {
+ {9, 0, 0, 0, 0, 0},
+ {12, 0, 0, 0, 0, 0},
+ {10, 0, 0, 0, 0, 0},
+ {4, 2, 0, 0, 0, 0}
+ },
+ {
+ {11, 9, 7, 6, 0, 0},
+ {7, 6, 0, 0, 0, 0},
+ {12, 0, 0, 0, 0, 0},
+ {12, 0, 0, 0, 0, 0}
+ }
+};
+
+static const u8 gTradeMonSpriteCoords[][2] =
+{
+ // Your party
+ {1, 5 },
+ {8, 5 },
+ {1, 10},
+ {8, 10},
+ {1, 15},
+ {8, 15},
+
+ // Friend's party
+ {16, 5 },
+ {23, 5 },
+ {16, 10},
+ {23, 10},
+ {16, 15},
+ {23, 15},
+
+ {23, 18} // CANCEL
+};
+
+static const u8 gTradeLevelDisplayCoords[][6][2] = {
+ {
+ // Your party
+ {5, 4},
+ {12, 4},
+ {5, 9},
+ {12, 9},
+ {5, 14},
+ {12, 14},
+ },
+ {
+ // Friend's party
+ {20, 4},
+ {27, 4},
+ {20, 9},
+ {27, 9},
+ {20, 14},
+ {27, 14}
+ }
+};
+
+static const u8 gTradeMonBoxCoords[][6][2] = {
+ {
+ // Your party
+ {1, 3},
+ {8, 3},
+ {1, 8},
+ {8, 8},
+ {1, 13},
+ {8, 13},
+ },
+ {
+ // Friend's party
+ {16, 3},
+ {23, 3},
+ {16, 8},
+ {23, 8},
+ {16, 13},
+ {23, 13}
+ }
+};
+
+static const u8 sUnref_0832DE6E[] = {
+ 0x00, 0x0e,
+ 0x0f, 0x1d,
+ 0x03, 0x05,
+ 0x03, 0x07,
+ 0x12, 0x05,
+ 0x12, 0x07,
+ 0x08, 0x07,
+ 0x16, 0x0c,
+ 0x08, 0x07,
+ 0x16, 0x0c,
+ 0x06, 0x07,
+ 0x18, 0x0c,
+ 0x06, 0x07,
+ 0x18, 0x0c,
+ 0x08, 0x07,
+ 0x16, 0x0c,
+ 0x07, 0x07,
+ 0x17, 0x0c
+};
+
+static const u8 *const gUnknown_0832DE94[] =
+{
+ gText_Cancel6,
+ gText_ChooseAPkmn,
+ gText_Summary3,
+ gText_Trade2,
+ gText_CancelTrade,
+ gJPText_832DB2E
+};
+
+static const struct MenuAction gUnknown_0832DEAC[] = {
+ {gText_Summary4, sub_807A000},
+ {gText_Trade3, sub_807A024}
+};
+
+static const u8 *const gUnknown_0832DEBC[] = {
+ gText_CommunicationStandby6,
+ gText_TheTradeHasBeenCanceled,
+ gText_YourOnlyPkmnForBattle,
+ gText_OnlyPkmnForBattle,
+ gText_WaitingForYourFriend,
+ gText_YourFriendWantsToTrade,
+ gText_PkmnCantBeTradedNow,
+ gText_EggCantBeTradedNow,
+ gText_OtherTrainersPkmnCantBeTraded
+};
+
+static const u8 gUnknown_0832DEE0[] = { 0, 1, 2 };
+
+static const struct BgTemplate gUnknown_0832DEE4[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 5,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 6,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 7,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+};
+
+static const struct WindowTemplate gUnknown_0832DEF4[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 7,
+ .width = 22,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 30
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 15,
+ .width = 10,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 118
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 5,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 158
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 7,
+ .tilemapTop = 5,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 174
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 10,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 190
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 7,
+ .tilemapTop = 10,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 206
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 15,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 222
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 7,
+ .tilemapTop = 15,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 238
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 5,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 254
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 5,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 270
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 10,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 286
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 10,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 302
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 15,
+ .tilemapTop = 15,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 318
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 15,
+ .width = 8,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 334
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 5,
+ .width = 14,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 350
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 8,
+ .width = 11,
+ .height = 8,
+ .paletteNum = 15,
+ .baseBlock = 378
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 17,
+ .tilemapTop = 5,
+ .width = 14,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 466
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 18,
+ .tilemapTop = 8,
+ .width = 11,
+ .height = 8,
+ .paletteNum = 15,
+ .baseBlock = 494
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+static const struct WindowTemplate gUnknown_0832DF8C =
+{
+ .bg = 0,
+ .tilemapLeft = 23,
+ .tilemapTop = 13,
+ .width = 5,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 582
+};
+
+static const u8 gJPText_Shedinja[] = _("ヌケニン");
+static const u8 gUnknown_0832DF99[][2] =
+{
+ {4, 3},
+ {19, 3},
+ {0, 0}
+};
+
+static const u16 gTradeBallPalette[] = INCBIN_U16("graphics/trade/ball.gbapal");
+static const u8 gTradeBallTiles[] = INCBIN_U8("graphics/trade/ball.4bpp");
+static const u8 gUnknown_832E5C0[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp");
+static const u16 gUnknown_0832FFC0[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin");
+static const u16 gUnknown_083307C0[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin");
+static const u16 sUnref_083308C0[] = INCBIN_U16("graphics/trade/unknown_3308C0.gbapal");
+static const u16 gUnknown_083308E0[] = INCBIN_U16("graphics/trade/gba.gbapal");
+static const u16 gUnref_08330900[] = INCBIN_U16("graphics/trade/shadow.gbapal");
+static const u16 gUnref_08330920[] = INCBIN_U16("graphics/trade/black.gbapal");
+static const u16 gUnknown_08330940[] = INCBIN_U16("graphics/trade/misc.gbapal");
+static const u8 gTradeGlow1Tiles[] = INCBIN_U8("graphics/trade/glow1.4bpp");
+static const u8 gTradeGlow2Tiles[] = INCBIN_U8("graphics/trade/glow2.4bpp");
+static const u8 gTradeCableEndTiles[] = INCBIN_U8("graphics/trade/cable_end.4bpp");
+static const u8 gTradeGBAScreenTiles[] = INCBIN_U8("graphics/trade/gba_screen.4bpp");
+const u16 gUnknown_08331F60[] = INCBIN_U16("graphics/trade/shadow_map.bin");
+static const u8 gUnknown_08332F60[] = INCBIN_U8("graphics/trade/gba_affine.8bpp");
+static const u8 sFiller_08335760[64] = {};
+static const u8 gUnknown_083357A0[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin");
+static const u8 gUnknown_083358A0[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin");
+static const u16 gUnknown_083359A0[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin");
+static const u16 gUnknown_083369A0[] = INCBIN_U16("graphics/trade/gba_map_cable.bin");
+static const u32 gUnknown_083379A0[] = INCBIN_U32("graphics/trade/unknown_3379A0.bin.lz");
+static const u16 gUnknown_08337AA0[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal");
+static const u16 gUnknown_08337CA0[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal");
+static const u16 gUnknown_08337EA0[] = INCBIN_U16("graphics/trade/black.gbapal");
+static const u32 gUnknown_08337EC0[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz");
+static const u32 gUnknown_08338550[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz");
+
+static const struct OamData gOamData_8338C44 = {
+ .affineMode = 1,
+ .size = 1
+};
+
+static const union AnimCmd gSpriteAnim_8338C4C[] = {
+ ANIMCMD_FRAME( 0, 3),
+ ANIMCMD_FRAME( 4, 3),
+ ANIMCMD_FRAME( 8, 3),
+ ANIMCMD_FRAME(12, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(20, 3),
+ ANIMCMD_FRAME(24, 3),
+ ANIMCMD_FRAME(28, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(36, 3),
+ ANIMCMD_FRAME(40, 3),
+ ANIMCMD_FRAME(44, 3),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_FRAME( 0, 3),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_8338C88[] = {
+ ANIMCMD_FRAME( 0, 3),
+ ANIMCMD_FRAME( 4, 3),
+ ANIMCMD_FRAME( 8, 3),
+ ANIMCMD_FRAME(12, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(20, 3),
+ ANIMCMD_FRAME(24, 3),
+ ANIMCMD_FRAME(28, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(36, 3),
+ ANIMCMD_FRAME(40, 3),
+ ANIMCMD_FRAME(44, 3),
+ ANIMCMD_LOOP(2),
+ ANIMCMD_FRAME( 0, 3),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8338C88[] = {
+ gSpriteAnim_8338C4C,
+ gSpriteAnim_8338C88
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_8338CCC[] = {
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_8338CDC[] = {
+ AFFINEANIMCMD_FRAME(-8, 0, 0, 20),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_8338CEC[] = {
+ AFFINEANIMCMD_FRAME(0x60, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME( 0, 0, 0, 5),
+ AFFINEANIMCMD_FRAME( 8, 0, 0, 20),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D0C[] = {
+ gSpriteAffineAnim_8338CCC,
+ gSpriteAffineAnim_8338CDC,
+ gSpriteAffineAnim_8338CEC
+};
+
+static const struct SpriteSheet gUnknown_08338D18 = {
+ gTradeBallTiles, 0x600, 5557
+};
+
+static const struct SpritePalette gUnknown_08338D20 = {
+ gTradeBallPalette, 5558
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8338D28 = {
+ 5557,
+ 5558,
+ &gOamData_8338C44,
+ gSpriteAnimTable_8338C88,
+ NULL,
+ gSpriteAffineAnimTable_8338D0C,
+ sub_807E55C
+};
+
+static const struct OamData gOamData_8338D40 = {
+ .affineMode = 1,
+ .objMode = 1,
+ .size = 2,
+ .priority = 1
+};
+
+static const union AnimCmd gSpriteAnim_8338D48[] = {
+ ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8338D50[] = {
+ gSpriteAnim_8338D48
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_8338D54[] = {
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 5),
+ AFFINEANIMCMD_FRAME(10, 10, 0, 5),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D6C[] = {
+ gSpriteAffineAnim_8338D54
+};
+
+static const struct SpriteSheet gUnknown_08338D70 = {
+ gTradeGlow1Tiles, 0x200, 5550
+};
+
+static const struct SpritePalette gUnknown_08338D78 = {
+ gUnknown_08330940, 5551
+};
+
+static const struct SpritePalette gUnknown_08338D80 = {
+ gUnknown_083308E0, 5555
+};
+
+static const struct SpriteTemplate gUnknown_08338D88 = {
+ 5550,
+ 5551,
+ &gOamData_8338D40,
+ gSpriteAnimTable_8338D50,
+ NULL,
+ gSpriteAffineAnimTable_8338D6C,
+ sub_807AA28
+};
+
+static const struct OamData gOamData_8338DA0 = {
+ .shape = ST_OAM_V_RECTANGLE,
+ .size = 2,
+ .priority = 1
+};
+
+static const union AnimCmd gSpriteAnim_8338DA8[] = {
+ ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_8338DB0[] = {
+ ANIMCMD_FRAME(8, 5, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8338DB8[] = {
+ gSpriteAnim_8338DA8,
+ gSpriteAnim_8338DB0
+};
+
+static const struct SpriteSheet gUnknown_08338DC0 = {
+ gTradeGlow2Tiles, 0x300, 5552
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8338DC8 = {
+ 5552,
+ 5551,
+ &gOamData_8338DA0,
+ gSpriteAnimTable_8338DB8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_807AA7C
+};
+
+static const struct OamData gOamData_8338DE0 = {
+ .shape = ST_OAM_V_RECTANGLE,
+ .size = 2,
+ .priority = 1
+};
+
+static const union AnimCmd gSpriteAnim_8338DE8[] = {
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8338DF0[] = {
+ gSpriteAnim_8338DE8
+};
+
+static const struct SpriteSheet gUnknown_08338DF4 = {
+ gTradeCableEndTiles, 0x100, 5554
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8338DFC = {
+ 5554,
+ 5555,
+ &gOamData_8338DE0,
+ gSpriteAnimTable_8338DF0,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_807AABC
+};
+
+static const struct OamData gOamData_8338E14 = {
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 3,
+ .priority = 1
+};
+
+static const union AnimCmd gSpriteAnim_8338E1C[] = {
+ ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(96, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_LOOP(8),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_8338E40[] = {
+ ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(96, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_LOOP(2),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8338E64[] = {
+ gSpriteAnim_8338E1C
+};
+
+static const union AnimCmd *const gSpriteAnimTable_8338E68[] = {
+ gSpriteAnim_8338E40
+};
+
+static const struct SpriteSheet gUnknown_08338E6C = {
+ gTradeGBAScreenTiles, 0x1000, 5556
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8338E74 = {
+ 5556,
+ 5555,
+ &gOamData_8338E14,
+ gSpriteAnimTable_8338E64,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_807AB04
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8338E8C = {
+ 5556,
+ 5555,
+ &gOamData_8338E14,
+ gSpriteAnimTable_8338E68,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_807AB04
+};
+
+static const u16 gUnknown_08338EA4[] = INCBIN_U16("graphics/trade/unknown_338EA4.gbapal");
+
+static const union AffineAnimCmd gSpriteAffineAnim_8338EBC[] = {
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_JUMP(0)
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338ECC[] = {
+ gSpriteAffineAnim_8338EBC
+};
+
+static const struct InGameTrade gIngameTrades[] = {
+ {
+ _("DOTS"), SPECIES_SEEDOT,
+ 5, 4, 5, 4, 4, 4,
+ TRUE, 38726,
+ 30, 5, 5, 5, 5,
+ 0x84,
+ ITEM_CHESTO_BERRY, -1,
+ _("KOBE"), MALE, 10,
+ SPECIES_RALTS
+ }, {
+ _("PLUSES"), SPECIES_PLUSLE,
+ 4, 4, 4, 5, 5, 4,
+ FALSE, 73996,
+ 5, 5, 30, 5, 5,
+ 0x6F,
+ ITEM_WOOD_MAIL, 0,
+ _("ROMAN"), MALE, 10,
+ SPECIES_VOLBEAT
+ }, {
+ _("SEASOR"),
+ SPECIES_HORSEA,
+ 5, 4, 4, 4, 5, 4,
+ FALSE, 46285,
+ 5, 5, 5, 5, 30,
+ 0x7F,
+ ITEM_WAVE_MAIL, 1,
+ _("SKYLAR"), MALE, 10,
+ SPECIES_BAGON
+ }, {
+ _("MEOWOW"),
+ SPECIES_MEOWTH,
+ 4, 5, 4, 5, 4, 4,
+ FALSE, 91481,
+ 5, 5, 5, 30, 5,
+ 0x8B,
+ ITEM_RETRO_MAIL, 2,
+ _("ISIS"), FEMALE, 10,
+ SPECIES_SKITTY
+ }
+};
+
+static const u16 gIngameTradeMail[][10] = {
+ {
+ EC_WORD_BE,
+ EC_WORD_NICE,
+ EC_WORD_TO,
+ EC_POKEMON(PLUSLE),
+ EC_WORD_EXCL,
+ EC_POKEMON(VOLBEAT),
+ EC_WORD_WILL,
+ EC_WORD_BE,
+ EC_WORD_FANTASTIC,
+ 0
+ }, {
+ EC_WORD_I,
+ EC_WORD_WILL,
+ EC_WORD_MAKE,
+ EC_POKEMON(BAGON),
+ EC_WORD_TOUGH,
+ EC_WORD_PLEASE,
+ EC_WORD_TRAIN,
+ EC_POKEMON(HORSEA),
+ EC_WORD_WELL,
+ 0
+ }, {
+ EC_WORD_THANK_YOU,
+ EC_WORD_FOR,
+ EC_POKEMON(SKITTY),
+ EC_POKEMON2(MEOWTH),
+ EC_WORD_CRIES,
+ EC_WORD_IN,
+ EC_WORD_A,
+ EC_WORD_CUTE,
+ EC_WORD_WAY,
+ 0
+ }
+};
+
+static const struct WindowTemplate gUnknown_08338FFC[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 15,
+ .width = 26,
+ .height = 4,
+ .paletteNum = 0,
+ .baseBlock = 64
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate gUnknown_0833900C =
+{
+ .bg = 0,
+ .tilemapLeft = 21,
+ .tilemapTop = 9,
+ .width = 5,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 188
+};
+
+static const struct BgTemplate gUnknown_08339014[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 5,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 18,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 6,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+};
+
+static const s8 gTradeBallVerticalVelocityTable[] = {
+ 0, 0, 1, 0,
+ 1, 0, 1, 1,
+ 1, 1, 2, 2,
+ 2, 2, 3, 3,
+ 3, 3, 4, 4,
+ 4, 4, -4, -4,
+ -4, -3, -3, -3,
+ -3, -2, -2, -2,
+ -2, -1, -1, -1,
+ -1, 0, -1, 0,
+ -1, 0, 0, 0,
+ 0, 0, 1, 0,
+ 1, 0, 1, 1,
+ 1, 1, 2, 2,
+ 2, 2, 3, 3,
+ 3, 3, 4, 4,
+ 4, 4, -4, -3,
+ -3, -2, -2, -1,
+ -1, -1, 0, -1,
+ 0, 0, 0, 0,
+ 0, 0, 1, 0,
+ 1, 1, 1, 2,
+ 2, 3, 3, 4,
+ -4, -3, -2, -1,
+ -1, -1, 0, 0,
+ 0, 0, 1, 0,
+ 1, 1, 2, 3
+};
+
+static const u8 gUnknown_08339090[][2] =
+{
+ {0, 1},
+ {1, 1},
+ {2, 1},
+ {3, 1},
+ {4, 1},
+ {5, 2},
+ {6, 2},
+ {7, 2},
+ {8, 2},
+ {9, 2},
+ {10, 3},
+ {11, 3},
+ {12, 3},
+ {13, 4},
+ {14, 5},
+ {15, 2},
+ {0, 1},
+ {1, 1},
+ {2, 1},
+ {3, 1},
+ {4, 1},
+ {5, 2},
+ {6, 2},
+ {7, 2},
+ {8, 2},
+ {9, 2},
+ {10, 3},
+ {11, 3},
+ {12, 3},
+ {13, 4},
+ {14, 5},
+ {16, 1},
+ {16, -1},
+ {0, 0}
+};
+
+// external to this file
+extern const struct CompressedSpriteSheet gMonFrontPicTable[];
+extern const struct MonCoords gMonFrontPicCoords[];
+
+static bool8 sub_8077170(const void *a0, u32 a1)
+{
+ if (gUnknown_02022C2C == 29)
+ {
+ rfu_NI_setSendData(gUnknown_03004140.unk_00, 84, a0, a1);
+ return TRUE;
+ }
+ else
+ {
+ return SendBlock(0, a0, a1);
+ }
+}
+
+static void sub_80771AC(u8 a0)
+{
+ sub_800A4D8(a0);
+}
+
+static bool32 sub_80771BC(void)
+{
+ if (gUnknown_02022C2C == 29)
+ {
+ if (gUnknown_03007880[sub_800E87C(gUnknown_03004140.unk_00)]->unk_0 == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ return IsLinkTaskFinished();
+ }
+}
+
+static u32 _GetBlockReceivedStatus(void)
+{
+ return GetBlockReceivedStatus();
+}
+
+static void sub_8077210(void)
+{
+ if (sub_8077260())
+ {
+ rfu_clearSlot(12, gUnknown_03004140.unk_00);
+ }
+ else
+ {
+ ResetBlockReceivedFlags();
+ }
+}
+
+static void sub_8077234(u32 a0)
+{
+ if (sub_8077260())
+ {
+ rfu_clearSlot(12, gUnknown_03004140.unk_00);
+ }
+ else
+ {
+ ResetBlockReceivedFlag(a0);
+ }
+}
+
+static bool32 sub_8077260(void)
+{
+ if (gWirelessCommType && gUnknown_02022C2C == 29)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void sub_8077288(u8 unused)
+{
+ sub_800ADF8();
+}
+
+static bool32 _IsLinkTaskFinished(void)
+{
+ return IsLinkTaskFinished();
+}
+
+static void sub_80772A4(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ ResetPaletteFade();
+
+ gPaletteFade.bufferTransferDisabled = TRUE;
+
+ SetVBlankCallback(sub_807811C);
+ LoadPalette(gUnknown_0860F074, 0xF0, 20);
+ LoadPalette(gUnknown_0860F074, 0xD0, 20);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_0832DEE4, ARRAY_COUNT(gUnknown_0832DEE4));
+ SetBgTilemapBuffer(1, gUnknown_0203229C->tilemapBuffer);
+
+ if (InitWindows(gUnknown_0832DEF4))
+ {
+ u32 i;
+
+ DeactivateAllTextPrinters();
+
+ for (i = 0; i < 18; i++)
+ {
+ ClearWindowTilemap(i);
+ FillWindowPixelBuffer(i, 0);
+ }
+
+ FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 15);
+ LoadUserWindowBorderGfx_(0, 20, 0xC0);
+ LoadUserWindowBorderGfx(2, 1, 0xE0);
+ LoadMonIconPalettes();
+ gUnknown_0203229C->unk_69 = 0;
+ gUnknown_0203229C->unk_6F = 0;
+ gUnknown_0203229C->unk_70 = 0;
+ gUnknown_0203229C->unk_74[0] = 0;
+ gUnknown_0203229C->unk_74[1] = 0;
+ gUnknown_0203229C->unk_7A = 0;
+ gUnknown_0203229C->unk_7B = 0;
+ gUnknown_0203229C->unk_A8 = 0;
+ }
+}
+
+void sub_80773AC(void)
+{
+ SetMainCallback2(sub_80773D0);
+ gMain.callback1 = NULL;
+ gEnemyPartyCount = 0;
+}
+
+static void sub_80773D0(void)
+{
+ int i;
+ struct SpriteTemplate temp;
+ u8 id;
+ u32 xPos;
+
+ switch (gMain.state)
+ {
+ case 0:
+ gUnknown_0203229C = AllocZeroed(sizeof(*gUnknown_0203229C));
+ sub_80772A4();
+ gUnknown_02032184 = AllocZeroed(0xE00);
+
+ for (i = 0; i < 14; i++)
+ {
+ gUnknown_02032188[i] = &gUnknown_02032184[i * 256];
+ }
+
+ gMain.state++;
+ break;
+ case 1:
+ gPaletteFade.bufferTransferDisabled = FALSE;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, 0, 0);
+ }
+
+ sub_807A19C(0);
+ ShowBg(0);
+
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ gLinkType = 0x1122;
+ gUnknown_0203229C->unk_A8 = 0;
+
+ if (gWirelessCommType)
+ {
+ sub_800B488();
+ OpenLink();
+ sub_8011BA4();
+ }
+ else
+ {
+ OpenLink();
+ gMain.state++;
+ CreateTask(task00_08081A90, 1);
+ }
+ }
+ else
+ {
+ gMain.state = 4;
+ }
+ break;
+ case 2:
+ gUnknown_0203229C->unk_A8++;
+ if (gUnknown_0203229C->unk_A8 > 11)
+ {
+ gUnknown_0203229C->unk_A8 = 0;
+ gMain.state++;
+ }
+ break;
+ case 3:
+ if (GetLinkPlayerCount_2() >= sub_800AA48())
+ {
+ if (IsLinkMaster())
+ {
+ if (++gUnknown_0203229C->unk_A8 > 30)
+ {
+ sub_800A620();
+ gMain.state++;
+ }
+ }
+ else
+ {
+ gMain.state++;
+ }
+ }
+ break;
+ case 4:
+ if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
+ {
+ sub_8011BD0();
+ CalculatePlayerPartyCount();
+ gMain.state++;
+ gUnknown_0203229C->unk_A8 = 0;
+ if (gWirelessCommType)
+ {
+ sub_801048C(TRUE);
+ sub_800ADF8();
+ }
+ }
+ break;
+ case 5:
+ if (gWirelessCommType)
+ {
+ if (sub_8010500())
+ {
+ gMain.state++;
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ }
+ else
+ {
+ gMain.state++;
+ }
+ break;
+ case 6:
+ if (shedinja_maker_maybe())
+ {
+ sub_807A5B0();
+ gMain.state++;
+ }
+ break;
+ case 7:
+ CalculateEnemyPartyCount();
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ gUnknown_0203229C->partyCounts[0] = gPlayerPartyCount;
+ gUnknown_0203229C->partyCounts[1] = gEnemyPartyCount;
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
+ {
+ struct Pokemon *mon = &gPlayerParty[i];
+ gUnknown_0203229C->partyIcons[0][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2),
+ sub_80D3014,
+ (gTradeMonSpriteCoords[i][0] * 8) + 14,
+ (gTradeMonSpriteCoords[i][1] * 8) - 12,
+ 1,
+ GetMonData(mon, MON_DATA_PERSONALITY),
+ TRUE);
+ }
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++)
+ {
+ struct Pokemon *mon = &gEnemyParty[i];
+ gUnknown_0203229C->partyIcons[1][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL),
+ sub_80D3014,
+ (gTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8) + 14,
+ (gTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8) - 12,
+ 1,
+ GetMonData(mon, MON_DATA_PERSONALITY),
+ FALSE);
+ }
+ gMain.state++;
+ break;
+ case 8:
+ LoadHeldItemIcons();
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 0);
+ gMain.state++;
+ break;
+ case 9:
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 1);
+ gMain.state++;
+ break;
+ case 10:
+ sub_80C6D80(gSaveBlock2Ptr->playerName, gUnknown_02032188[0], 0, 0, 3);
+ id = GetMultiplayerId();
+ sub_80C6D80(gLinkPlayers[id ^ 1].name, gUnknown_02032188[3], 0, 0, 3);
+ sub_80C6D80(gUnknown_0832DE94[0], gUnknown_02032188[6], 0, 0, 2);
+ sub_807A308(gUnknown_0832DE94[1], gUnknown_02032188[8], 24);
+ gMain.state++;
+ gUnknown_0203229C->unk_A8 = 0;
+ break;
+ case 11:
+ if (sub_807A1F0())
+ gMain.state++;
+ break;
+ case 12:
+ xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120);
+ for (i = 0; i < 3; i++)
+ {
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += i;
+ CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1);
+ }
+
+ xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120);
+ for (i = 0; i < 3; i++)
+ {
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += i + 3;
+ CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1);
+ }
+ gMain.state++;
+ break;
+ case 13:
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += 6;
+ CreateSprite(&temp, 215, 152, 1);
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += 7;
+ CreateSprite(&temp, 247, 152, 1);
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += i + 8;
+ CreateSprite(&temp, (i * 32) + 24, 150, 1);
+ }
+
+ gUnknown_0203229C->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, gTradeMonSpriteCoords[0][0] * 8 + 32, gTradeMonSpriteCoords[0][1] * 8, 2);
+ gUnknown_0203229C->tradeMenuCursorPosition = 0;
+ gMain.state++;
+ rbox_fill_rectangle(0);
+ break;
+ case 14:
+ sub_807A320(0);
+ sub_8079BE0(0);
+ gUnknown_0203229C->unk_0 = 0;
+ gUnknown_0203229C->unk_1 = 0;
+ sub_8078388();
+ gMain.state++;
+ PlayBGM(MUS_P_SCHOOL);
+ break;
+ case 15:
+ sub_807A320(1);
+ sub_8079BE0(1);
+ gMain.state++;
+ // fallthrough
+ case 16:
+ sub_80782B8(0);
+ gMain.state++;
+ break;
+ case 17:
+ sub_80782B8(1);
+ gMain.state++;
+ break;
+ case 18:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gMain.state++;
+ break;
+ case 19:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ sub_80782B8(2);
+ gMain.state++;
+ break;
+ case 20:
+ sub_807A468(0);
+ gMain.state++;
+ break;
+ case 21:
+ sub_807A468(1);
+ sub_807A53C();
+ gMain.state++;
+ break;
+ case 22:
+ if (!gPaletteFade.active)
+ {
+ gMain.callback1 = sub_8078C34;
+ SetMainCallback2(sub_807825C);
+ }
+ break;
+ }
+
+ RunTextPrinters();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_8077B74(void)
+{
+ int i;
+ struct SpriteTemplate temp;
+ u8 id;
+ u32 xPos;
+
+ switch (gMain.state)
+ {
+ case 0:
+ sub_80772A4();
+ gMain.state++;
+ break;
+ case 1:
+ gMain.state++;
+ gUnknown_0203229C->unk_A8 = 0;
+ break;
+ case 2:
+ gMain.state++;
+ break;
+ case 3:
+ gMain.state++;
+ break;
+ case 4:
+ CalculatePlayerPartyCount();
+ gMain.state++;
+ break;
+ case 5:
+ if (gWirelessCommType)
+ {
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ gMain.state++;
+ break;
+ case 6:
+ gMain.state++;
+ break;
+ case 7:
+ CalculateEnemyPartyCount();
+ gUnknown_0203229C->partyCounts[0] = gPlayerPartyCount;
+ gUnknown_0203229C->partyCounts[1] = gEnemyPartyCount;
+ ClearWindowTilemap(0);
+ sub_8079BE0(0);
+ sub_8079BE0(1);
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
+ {
+ struct Pokemon *mon = &gPlayerParty[i];
+ gUnknown_0203229C->partyIcons[0][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL),
+ sub_80D3014,
+ (gTradeMonSpriteCoords[i][0] * 8) + 14,
+ (gTradeMonSpriteCoords[i][1] * 8) - 12,
+ 1,
+ GetMonData(mon, MON_DATA_PERSONALITY),
+ TRUE);
+ }
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++)
+ {
+ struct Pokemon *mon = &gEnemyParty[i];
+ gUnknown_0203229C->partyIcons[1][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL),
+ sub_80D3014,
+ (gTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8) + 14,
+ (gTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8) - 12,
+ 1,
+ GetMonData(mon, MON_DATA_PERSONALITY),
+ FALSE);
+ }
+ gMain.state++;
+ break;
+ case 8:
+ LoadHeldItemIcons();
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 0);
+ gMain.state++;
+ break;
+ case 9:
+ sub_81B5D4C(&gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->partyIcons[0], 1);
+ gMain.state++;
+ break;
+ case 10:
+ sub_80C6D80(gSaveBlock2Ptr->playerName, gUnknown_02032188[0], 0, 0, 3);
+ id = GetMultiplayerId();
+ sub_80C6D80(gLinkPlayers[id ^ 1].name, gUnknown_02032188[3], 0, 0, 3);
+ sub_80C6D80(gUnknown_0832DE94[0], gUnknown_02032188[6], 0, 0, 2);
+ sub_807A308(gUnknown_0832DE94[1], gUnknown_02032188[8], 24);
+ gMain.state++;
+ gUnknown_0203229C->unk_A8 = 0;
+ break;
+ case 11:
+ if (sub_807A1F0())
+ gMain.state++;
+ break;
+ case 12:
+ xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120);
+ for (i = 0; i < 3; i++)
+ {
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += i;
+ CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1);
+ }
+
+ xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120);
+ for (i = 0; i < 3; i++)
+ {
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += i + 3;
+ CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1);
+ }
+ gMain.state++;
+ break;
+ case 13:
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += 6;
+ CreateSprite(&temp, 215, 152, 1);
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += 7;
+ CreateSprite(&temp, 247, 152, 1);
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ temp = gSpriteTemplate_832DCAC;
+ temp.tileTag += i + 8;
+ CreateSprite(&temp, (i * 32) + 24, 150, 1);
+ }
+
+ if (gUnknown_0203229C->tradeMenuCursorPosition < PARTY_SIZE)
+ gUnknown_0203229C->tradeMenuCursorPosition = gUnknown_0203CF20;
+ else
+ gUnknown_0203229C->tradeMenuCursorPosition = gUnknown_0203CF20 + PARTY_SIZE;
+
+ gUnknown_0203229C->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, gTradeMonSpriteCoords[gUnknown_0203229C->tradeMenuCursorPosition][0] * 8 + 32, gTradeMonSpriteCoords[gUnknown_0203229C->tradeMenuCursorPosition][1] * 8, 2);
+ gMain.state = 16;
+ break;
+ case 16:
+ sub_80782B8(0);
+ gMain.state++;
+ break;
+ case 17:
+ sub_80782B8(1);
+ gUnknown_0203229C->unk_0 = 0;
+ gUnknown_0203229C->unk_1 = 0;
+ sub_8078388();
+ gMain.state++;
+ break;
+ case 18:
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gMain.state++;
+ break;
+ case 19:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ sub_80782B8(2);
+ gMain.state++;
+ break;
+ case 20:
+ gMain.state++;
+ break;
+ case 21:
+ sub_807A53C();
+ gMain.state++;
+ break;
+ case 22:
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(sub_807825C);
+ }
+ break;
+ }
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_807811C(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_8078130(void)
+{
+ if (++gUnknown_0203229C->unk_A8 > 15)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_0203229C->unk_6F = 10;
+ }
+}
+
+static void sub_807816C(void)
+{
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02032298[0] = gUnknown_0203229C->tradeMenuCursorPosition;
+ gUnknown_02032298[1] = gUnknown_0203229C->unk_7E;
+
+ if (gWirelessCommType)
+ {
+ gUnknown_0203229C->unk_6F = 16;
+ }
+ else
+ {
+ sub_800ABF4(32);
+ gUnknown_0203229C->unk_6F = 13;
+ }
+ }
+}
+
+static void sub_80781C8(void)
+{
+ gMain.savedCallback = sub_80773AC;
+
+ if (gWirelessCommType)
+ {
+ if (sub_8010500())
+ {
+ Free(gUnknown_02032184);
+ FreeAllWindowBuffers();
+ Free(gUnknown_0203229C);
+ gMain.callback1 = NULL;
+ sub_800E084();
+ SetMainCallback2(sub_807AE50);
+ }
+ }
+ else
+ {
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ Free(gUnknown_02032184);
+ FreeAllWindowBuffers();
+ Free(gUnknown_0203229C);
+ gMain.callback1 = NULL;
+ SetMainCallback2(sub_807AE50);
+ }
+ }
+}
+
+static void sub_807825C(void)
+{
+ u8 temp;
+
+ sub_80795AC();
+ sub_807A0C4();
+ sub_80796B4(0);
+ sub_80796B4(1);
+
+ SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_0203229C->unk_0++);
+ SetGpuReg(REG_OFFSET_BG3HOFS, gUnknown_0203229C->unk_1--);
+
+ RunTextPrintersAndIsPrinter0Active();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_80782B8(u8 a0)
+{
+ int i;
+
+ switch (a0)
+ {
+ case 0:
+ LoadPalette(gUnknown_08DDB3E4, 0, 0x60);
+ LoadBgTiles(1, gUnknown_08DDB464, 0x1280, 0);
+ CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DDCF04, 0, 0, 32, 20, 0);
+ LoadBgTilemap(2, gTradeStripesBG2Tilemap, 0x800, 0);
+ break;
+ case 1:
+ LoadBgTilemap(3, gTradeStripesBG3Tilemap, 0x800, 0);
+ sub_8079E44(0);
+ sub_8079E44(1);
+ CopyBgTilemapBufferToVram(1);
+ break;
+ case 2:
+ for (i = 0; i < 4; i++)
+ {
+ SetGpuReg(REG_OFFSET_BG0HOFS + (i * 2), 0);
+ }
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ break;
+ }
+}
+
+static void sub_8078388(void)
+{
+ int i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (i < gUnknown_0203229C->partyCounts[0])
+ {
+ gSprites[gUnknown_0203229C->partyIcons[0][i]].invisible = FALSE;
+ gUnknown_0203229C->tradeMenuOptionsActive[i] = TRUE;
+ }
+ else
+ {
+ gUnknown_0203229C->tradeMenuOptionsActive[i] = FALSE;
+ }
+
+ if (i < gUnknown_0203229C->partyCounts[1])
+ {
+ gSprites[gUnknown_0203229C->partyIcons[1][i]].invisible = FALSE;
+ gUnknown_0203229C->tradeMenuOptionsActive[i + PARTY_SIZE] = TRUE;
+ }
+ else
+ {
+ gUnknown_0203229C->tradeMenuOptionsActive[i + PARTY_SIZE] = FALSE;
+ }
+ }
+
+ gUnknown_0203229C->unk_44 = 1;
+}
+
+// why not just use memcpy?
+static void Trade_Memcpy(void *dataDest, const void *dataSrc, u32 count)
+{
+ u8 *dest = dataDest;
+ const u8 *src = dataSrc;
+ u32 i;
+
+ for (i = 0; i < count; i++)
+ {
+ dest[i] = src[i];
+ }
+}
+
+static bool8 shedinja_maker_maybe(void)
+{
+ u8 id = GetMultiplayerId();
+ int i;
+ struct Pokemon *mon;
+
+ switch (gUnknown_0203229C->unk_69)
+ {
+ case 0:
+ Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon));
+ gUnknown_0203229C->unk_69++;
+ gUnknown_0203229C->unk_A8 = 0;
+ break;
+ case 1:
+ if (sub_80771BC())
+ {
+ if (_GetBlockReceivedStatus() == 0)
+ {
+ gUnknown_0203229C->unk_69++;
+ }
+ else
+ {
+ sub_8077210();
+ gUnknown_0203229C->unk_69++;
+ }
+ }
+ break;
+ case 3:
+ if (id == 0)
+ {
+ sub_80771AC(1);
+ }
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 4:
+ if (_GetBlockReceivedStatus() == 3)
+ {
+ Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon));
+ sub_8077210();
+ gUnknown_0203229C->unk_69++;
+ }
+ break;
+ case 5:
+ Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon));
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 7:
+ if (id == 0)
+ {
+ sub_80771AC(1);
+ }
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 8:
+ if (_GetBlockReceivedStatus() == 3)
+ {
+ Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 200);
+ sub_8077210();
+ gUnknown_0203229C->unk_69++;
+ }
+ break;
+ case 9:
+ Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 200);
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 11:
+ if (id == 0)
+ {
+ sub_80771AC(1);
+ }
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 12:
+ if (_GetBlockReceivedStatus() == 3)
+ {
+ Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 200);
+ sub_8077210();
+ gUnknown_0203229C->unk_69++;
+ }
+ break;
+ case 13:
+ Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, 220);
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 15:
+ if (id == 0)
+ {
+ sub_80771AC(3);
+ }
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 16:
+ if (_GetBlockReceivedStatus() == 3)
+ {
+ Trade_Memcpy(gUnknown_020321C0, gBlockRecvBuffer[id ^ 1], 216);
+ sub_8077210();
+ gUnknown_0203229C->unk_69++;
+ }
+ break;
+ case 17:
+ Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, 11);
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 19:
+ if (id == 0)
+ {
+ sub_80771AC(4);
+ }
+ gUnknown_0203229C->unk_69++;
+ break;
+ case 20:
+ if (_GetBlockReceivedStatus() == 3)
+ {
+ Trade_Memcpy(gUnknown_0203229C->unk_A9, gBlockRecvBuffer[id ^ 1], 11);
+ sub_8077210();
+ gUnknown_0203229C->unk_69++;
+ }
+ break;
+ case 21:
+ for (i = 0, mon = gEnemyParty; i < PARTY_SIZE; mon++, i++)
+ {
+ u8 name[POKEMON_NAME_LENGTH + 1];
+ u16 species = GetMonData(mon, MON_DATA_SPECIES);
+
+ if (species != SPECIES_NONE)
+ {
+ if (species == SPECIES_SHEDINJA && GetMonData(mon, MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE)
+ {
+ GetMonData(mon, MON_DATA_NICKNAME, name);
+
+ if (!StringCompareWithoutExtCtrlCodes(name, gJPText_Shedinja))
+ {
+ SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]);
+ }
+ }
+ }
+ }
+ return TRUE;
+ case 2:
+ case 6:
+ case 10:
+ case 14:
+ case 18:
+ gUnknown_0203229C->unk_A8++;
+ if (gUnknown_0203229C->unk_A8 > 10)
+ {
+ gUnknown_0203229C->unk_A8 = 0;
+ gUnknown_0203229C->unk_69++;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static void sub_80787B8(void)
+{
+ sub_807A308(gText_IsThisTradeOkay, (void *)(OBJ_VRAM0 + (gUnknown_0203229C->unk_72 * 32)), 24);
+}
+
+static void sub_80787E0(u8 a0, u8 a1)
+{
+ if (a1 & 1)
+ {
+ switch (gBlockRecvBuffer[0][0])
+ {
+ case 0xEEAA:
+ gUnknown_0203229C->unk_78 = 2;
+ break;
+ case 0xAABB:
+ gUnknown_0203229C->unk_78 = 1;
+ break;
+ case 0xBBBB:
+ gUnknown_0203229C->unk_7A = 1;
+ break;
+ case 0xBBCC:
+ gUnknown_0203229C->unk_7A = 2;
+ break;
+ }
+ sub_8077234(0);
+ }
+
+ if (a1 & 2)
+ {
+ switch (gBlockRecvBuffer[1][0])
+ {
+ case 0xEEAA:
+ gUnknown_0203229C->unk_79 = 2;
+ break;
+ case 0xAABB:
+ gUnknown_0203229C->unk_7E = gBlockRecvBuffer[1][1] + 6;
+ gUnknown_0203229C->unk_79 = 1;
+ break;
+ case 0xBBBB:
+ gUnknown_0203229C->unk_7B = 1;
+ break;
+ case 0xBBCC:
+ gUnknown_0203229C->unk_7B = 2;
+ break;
+ }
+ sub_8077234(1);
+ }
+}
+
+static void sub_8078900(u8 a0, u8 a1)
+{
+ if (a1 & 1)
+ {
+ switch (gBlockRecvBuffer[0][0])
+ {
+ case 0xEEBB:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ sub_807A19C(4);
+ gUnknown_0203229C->unk_6F = 11;
+ break;
+ case 0xEECC:
+ sub_807A19C(5);
+ gUnknown_0203229C->unk_6F = 8;
+ break;
+ case 0xDDDD:
+ gUnknown_0203229C->unk_7E = gBlockRecvBuffer[0][1] + 6;
+ rbox_fill_rectangle(0);
+ sub_807967C(gUnknown_0203229C->tradeMenuCursorPosition);
+ sub_807967C(gUnknown_0203229C->unk_7E);
+ gUnknown_0203229C->unk_6F = 7;
+ break;
+ case 0xCCDD:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_0203229C->unk_6F = 10;
+ break;
+ case 0xDDEE:
+ sub_807A19C(1);
+ gUnknown_0203229C->unk_6F = 8;
+ }
+ sub_8077234(0);
+ }
+
+ if (a1 & 2)
+ sub_8077234(1);
+}
+
+static void sub_80789FC(void)
+{
+ if (gUnknown_0203229C->unk_78 && gUnknown_0203229C->unk_79)
+ {
+ if (gUnknown_0203229C->unk_78 == 1 && gUnknown_0203229C->unk_79 == 1)
+ {
+ gUnknown_0203229C->unk_6F = 6;
+ gUnknown_0203229C->linkData[0] = 0xDDDD;
+ gUnknown_0203229C->linkData[1] = gUnknown_0203229C->tradeMenuCursorPosition;
+ sub_807A048(5, 0);
+ gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0;
+ }
+ else if (gUnknown_0203229C->unk_78 == 1 && gUnknown_0203229C->unk_79 == 2)
+ {
+ sub_807A19C(1);
+ gUnknown_0203229C->linkData[0] = 0xEECC;
+ gUnknown_0203229C->linkData[1] = 0;
+ sub_807A048(5, 0);
+ gUnknown_0203229C->unk_7A = gUnknown_0203229C->unk_7B = 0;
+ gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0;
+ gUnknown_0203229C->unk_6F = 8;
+ }
+ else if (gUnknown_0203229C->unk_78 == 2 && gUnknown_0203229C->unk_79 == 1)
+ {
+ sub_807A19C(5);
+ gUnknown_0203229C->linkData[0] = 0xDDEE;
+ gUnknown_0203229C->linkData[1] = 0;
+ sub_807A048(5, 0);
+ gUnknown_0203229C->unk_7A = gUnknown_0203229C->unk_7B = 0;
+ gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0;
+ gUnknown_0203229C->unk_6F = 8;
+ }
+ else if (gUnknown_0203229C->unk_78 == 2 && gUnknown_0203229C->unk_79 == 2)
+ {
+ gUnknown_0203229C->linkData[0] = 0xEEBB;
+ gUnknown_0203229C->linkData[1] = 0;
+ sub_807A048(5, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_0203229C->unk_78 = gUnknown_0203229C->unk_79 = 0;
+ gUnknown_0203229C->unk_6F = 11;
+ }
+ }
+
+ if (gUnknown_0203229C->unk_7A && gUnknown_0203229C->unk_7B)
+ {
+ if (gUnknown_0203229C->unk_7A == 1 && gUnknown_0203229C->unk_7B == 1)
+ {
+ gUnknown_0203229C->linkData[0] = 0xCCDD;
+ gUnknown_0203229C->linkData[1] = 0;
+ sub_807A048(5, 0);
+ gUnknown_0203229C->unk_7A = 0;
+ gUnknown_0203229C->unk_7B = 0;
+ gUnknown_0203229C->unk_6F = 9;
+ }
+
+ if (gUnknown_0203229C->unk_7A == 2 || gUnknown_0203229C->unk_7B == 2)
+ {
+ sub_807A19C(1);
+ gUnknown_0203229C->linkData[0] = 0xDDEE;
+ gUnknown_0203229C->linkData[1] = 0;
+ sub_807A048(5, 0);
+ gUnknown_0203229C->unk_7A = 0;
+ gUnknown_0203229C->unk_7B = 0;
+ gUnknown_0203229C->unk_6F = 8;
+ }
+ }
+}
+
+static void sub_8078BFC(u16 *a0, u16 a1, u16 a2)
+{
+ a0[0] = a1;
+ a0[1] = a2;
+ sub_807A048(5, 0);
+}
+
+static void sub_8078C10(u16 a0, u16 a1)
+{
+ sub_8078BFC(gUnknown_0203229C->linkData, a0, a1);
+}
+
+static void sub_8078C34(void)
+{
+ u8 mpId = GetMultiplayerId();
+ u8 status;
+
+ if ((status = _GetBlockReceivedStatus()))
+ {
+ if (mpId == 0)
+ sub_80787E0(mpId, status);
+ else
+ sub_8078900(mpId, status);
+ }
+
+ if (mpId == 0)
+ sub_80789FC();
+}
+
+static u8 sub_8078C6C(u8 oldPosition, u8 direction)
+{
+ int i;
+ u8 newPosition = 0;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (gUnknown_0203229C->tradeMenuOptionsActive[gTradeNextSelectedMonTable[oldPosition][direction][i]] == TRUE)
+ {
+ newPosition = gTradeNextSelectedMonTable[oldPosition][direction][i];
+ break;
+ }
+ }
+
+ return newPosition;
+}
+
+static void TradeMenuMoveCursor(u8 *tradeMenuCursorPosition, u8 direction)
+{
+ u8 newPosition = sub_8078C6C(*tradeMenuCursorPosition, direction);
+
+ if (newPosition == 12) // CANCEL
+ {
+ StartSpriteAnim(&gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx], 1);
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.x = 224;
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.y = 160;
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx], 0);
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.x = gTradeMonSpriteCoords[newPosition][0] * 8 + 32;
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].pos1.y = gTradeMonSpriteCoords[newPosition][1] * 8;
+ }
+
+ if (*tradeMenuCursorPosition != newPosition)
+ {
+ PlaySE(SE_SELECT);
+ }
+
+ *tradeMenuCursorPosition = newPosition;
+}
+
+static void sub_8078D78(void)
+{
+ sub_807A19C(0);
+ gUnknown_0203229C->unk_6F = 100;
+
+ if (GetMultiplayerId() == 1)
+ {
+ sub_8078C10(0xAABB, gUnknown_0203229C->tradeMenuCursorPosition);
+ }
+ else
+ {
+ gUnknown_0203229C->unk_78 = 1;
+ }
+}
+
+static void sub_8078DBC(void)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 0);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 1);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 2);
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ TradeMenuMoveCursor(&gUnknown_0203229C->tradeMenuCursorPosition, 3);
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+
+ if (gUnknown_0203229C->tradeMenuCursorPosition < 6)
+ {
+ sub_8098858(1, 1, 14);
+ FillWindowPixelBuffer(1, 0x11);
+ PrintMenuTable(1, 2, gUnknown_0832DEAC);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(1, 2, 0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 3);
+ gUnknown_0203229C->unk_6F = 1;
+ }
+ else if (gUnknown_0203229C->tradeMenuCursorPosition < 12)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_0203229C->unk_6F = 2;
+ }
+ else if (gUnknown_0203229C->tradeMenuCursorPosition == 12)
+ {
+ CreateYesNoMenu(&gUnknown_0832DF8C, 1, 14, 0);
+ gUnknown_0203229C->unk_6F = 4;
+ sub_807A308(gUnknown_0832DE94[4], (void *)(OBJ_VRAM0 + gUnknown_0203229C->unk_72 * 32), 24);
+ }
+ }
+}
+
+static void sub_8078EF8(void)
+{
+ sub_8079F74();
+ gUnknown_0203229C->unk_6F = 0;
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = FALSE;
+ sub_807A308(gUnknown_0832DE94[1], (void *)(OBJ_VRAM0 + gUnknown_0203229C->unk_72 * 32), 24);
+}
+
+static void sub_8078F50(void)
+{
+ switch (Menu_ProcessInputNoWrap())
+ {
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ sub_8078EF8();
+ break;
+ case MENU_NOTHING_CHOSEN:
+ break;
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_0203229C->unk_6F = 2;
+ break;
+ case 1:
+ switch (sub_807A5F4(gPlayerParty, gPlayerPartyCount, gUnknown_0203229C->tradeMenuCursorPosition))
+ {
+ case 0:
+ sub_8078D78();
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = TRUE;
+ break;
+ case 1:
+ sub_807A048(3, 3);
+ gUnknown_0203229C->unk_6F = 8;
+ break;
+ case 2:
+ case 4:
+ sub_807A048(3, 6);
+ gUnknown_0203229C->unk_6F = 8;
+ break;
+ case 3:
+ case 5:
+ sub_807A048(3, 7);
+ gUnknown_0203229C->unk_6F = 8;
+ break;
+ }
+ break;
+ }
+}
+
+static void sub_8079034(void)
+{
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sub_8078EF8();
+ }
+}
+
+static void sub_807905C(void)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gUnknown_0203229C->tradeMenuCursorPosition < PARTY_SIZE)
+ {
+ ShowPokemonSummaryScreen(PSS_MODE_UNK1, gPlayerParty, gUnknown_0203229C->tradeMenuCursorPosition, gUnknown_0203229C->partyCounts[0] - 1, sub_8077B74);
+ }
+ else
+ {
+ ShowPokemonSummaryScreen(PSS_MODE_UNK1, gEnemyParty, gUnknown_0203229C->tradeMenuCursorPosition - PARTY_SIZE, gUnknown_0203229C->partyCounts[1] - 1, sub_8077B74);
+ }
+ FreeAllWindowBuffers();
+ }
+}
+
+static u8 sub_80790D4(u8 *a0, u8 a1, u8 a2, u8 a3)
+{
+ int i;
+ u16 species;
+ u8 res = 0;
+
+ for (i = 0; i < a1; i++)
+ {
+ if (a2 != i)
+ {
+ res += a0[i];
+ }
+ }
+
+ a3 %= PARTY_SIZE;
+ species = GetMonData(&gEnemyParty[a3], MON_DATA_SPECIES);
+
+ if (species == SPECIES_DEOXYS || species == SPECIES_MEW)
+ {
+ if (!GetMonData(&gEnemyParty[a3], MON_DATA_OBEDIENCE))
+ {
+ return 2;
+ }
+ }
+
+ if (!IsNationalPokedexEnabled())
+ {
+ if (gUnknown_0203229C->unk_51[1][a3] || !IsSpeciesInHoennDex(species))
+ {
+ return 2;
+ }
+ }
+
+ if (res)
+ {
+ res = 1;
+ }
+
+ return res;
+}
+
+static bool32 sub_8079174(void)
+{
+ int i;
+ u8 arr[12];
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
+ {
+ arr[i] = gUnknown_0203229C->unk_45[0][i];
+ }
+
+ switch (sub_80790D4(arr, gUnknown_0203229C->partyCounts[0], gUnknown_0203229C->tradeMenuCursorPosition, gUnknown_0203229C->unk_7E))
+ {
+ case 0:
+ sub_807A048(3, 3);
+ sub_8078C10(0xBBCC, 0);
+ break;
+ case 1:
+ sub_807A048(3, 1);
+ sub_8078C10(0xBBBB, 0);
+ break;
+ case 2:
+ sub_807A048(3, 8);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_8079218(void)
+{
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case 0:
+ if (!sub_8079174())
+ {
+ gUnknown_0203229C->unk_6F = 100;
+ }
+ else
+ {
+ gUnknown_0203229C->unk_6F = 17;
+ }
+ PutWindowTilemap(17);
+ break;
+ case 1:
+ case MENU_B_PRESSED:
+ sub_807A048(3, 1);
+ if (sub_80771BC())
+ sub_8078C10(0xBBCC, 0);
+ gUnknown_0203229C->unk_6F = 100;
+ PutWindowTilemap(17);
+ break;
+ }
+}
+
+static void sub_807929C(void)
+{
+ int i;
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1] - 4; i++)
+ {
+ PutWindowTilemap(i + 12);
+ CopyWindowToVram(i + 12, 1);
+ }
+}
+
+static void sub_80792E4(void)
+{
+ switch (Menu_ProcessInputNoWrapClearOnChoose())
+ {
+ case 0:
+ sub_807A19C(4);
+ sub_8078C10(0xEEAA, 0);
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = TRUE;
+ gUnknown_0203229C->unk_6F = 100;
+ sub_807929C();
+ break;
+ case 1:
+ case MENU_B_PRESSED:
+ PlaySE(SE_SELECT);
+ sub_8078EF8();
+ break;
+ }
+}
+
+static void sub_807935C(void)
+{
+ if (GetMultiplayerId() == 0)
+ {
+ rbox_fill_rectangle(0);
+ sub_807967C(gUnknown_0203229C->tradeMenuCursorPosition);
+ sub_807967C(gUnknown_0203229C->unk_7E);
+ }
+ gUnknown_0203229C->unk_6F = 7;
+}
+
+static void sub_8079398(void)
+{
+ if (gUnknown_0203229C->unk_74[0] == 5 && gUnknown_0203229C->unk_74[1] == 5)
+ {
+ sub_80787B8();
+ gUnknown_0203229C->unk_6F = 14;
+ }
+}
+
+static void DisplayMessageAndContinueTask(void)
+{
+ gUnknown_0203229C->unk_A8++;
+
+ if (gUnknown_0203229C->unk_A8 > 120)
+ {
+ CreateYesNoMenu(&gUnknown_0832DF8C, 1, 14, 0);
+ gUnknown_0203229C->unk_A8 = 0;
+ gUnknown_0203229C->unk_6F = 3;
+ }
+}
+
+static void sub_8079408(void)
+{
+ int i;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ rbox_fill_rectangle(0);
+ rbox_fill_rectangle(1);
+
+ for (i = 0; i < 4; i++)
+ {
+ FillWindowPixelBuffer(i + 14, 0);
+ rbox_fill_rectangle(i + 14);
+ }
+
+ sub_8079F88(0);
+ sub_8079F88(1);
+ gUnknown_0203229C->unk_6F = 0;
+ gSprites[gUnknown_0203229C->tradeMenuCursorSpriteIdx].invisible = FALSE;
+ }
+}
+
+static void sub_8079490(void)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gWirelessCommType)
+ {
+ sub_800ADF8();
+ }
+ else
+ {
+ sub_800ABF4(12);
+ }
+
+ gUnknown_0203229C->unk_6F = 12;
+ }
+}
+
+static void sub_80794CC(void)
+{
+ if (gWirelessCommType)
+ {
+ if (sub_80771BC() && sub_807A09C() == 0)
+ {
+ Free(gUnknown_02032184);
+ Free(gUnknown_0203229C);
+ FreeAllWindowBuffers();
+ sub_800E084();
+ SetMainCallback2(c2_8056854);
+ }
+ }
+ else
+ {
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ Free(gUnknown_02032184);
+ Free(gUnknown_0203229C);
+ FreeAllWindowBuffers();
+ SetMainCallback2(c2_8056854);
+ }
+ }
+}
+
+static void sub_8079550(void)
+{
+ if (!sub_801048C(FALSE) && sub_807A09C() == 0)
+ {
+ sub_800ADF8();
+ gUnknown_0203229C->unk_6F = 13;
+ }
+}
+
+static void sub_807957C(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_8078C10(0xBBCC, 0);
+ gUnknown_0203229C->unk_6F = 100;
+ }
+}
+
+static void sub_80795AC(void)
+{
+ switch (gUnknown_0203229C->unk_6F)
+ {
+ case 0:
+ sub_8078DBC();
+ break;
+ case 1:
+ sub_8078F50();
+ break;
+ case 2:
+ sub_807905C();
+ break;
+ case 3:
+ sub_8079218();
+ break;
+ case 4:
+ sub_80792E4();
+ break;
+ case 6:
+ sub_807935C();
+ break;
+ case 7:
+ sub_8079398();
+ break;
+ case 8:
+ sub_8079408();
+ break;
+ case 9:
+ sub_8078130();
+ break;
+ case 10:
+ sub_807816C();
+ break;
+ case 11:
+ sub_8079490();
+ break;
+ case 12:
+ sub_80794CC();
+ break;
+ case 13:
+ sub_80781C8();
+ break;
+ case 14:
+ DisplayMessageAndContinueTask();
+ break;
+ case 15:
+ sub_8079034();
+ break;
+ case 16:
+ sub_8079550();
+ break;
+ case 17:
+ sub_807957C();
+ break;
+ }
+}
+
+static void sub_807967C(u8 a0)
+{
+ u8 whichParty = a0 / PARTY_SIZE;
+
+ if (gUnknown_0203229C->unk_74[whichParty] == 0)
+ {
+ gUnknown_0203229C->unk_74[whichParty] = 1;
+ gUnknown_0203229C->unk_76[whichParty] = a0;
+ }
+}
+
+static void sub_80796B4(u8 a0)
+{
+ s8 nameStringWidth;
+ u8 nickname[20];
+ u8 movesString[56];
+ u8 i;
+ u8 partyIdx;
+ u8 whichParty;
+ u8 monIdx = gUnknown_0203229C->unk_76[a0];
+
+ whichParty = 1;
+ if (gUnknown_0203229C->unk_76[a0] < PARTY_SIZE)
+ whichParty = 0;
+ partyIdx = monIdx % PARTY_SIZE;
+ nameStringWidth = 0;
+
+ switch (gUnknown_0203229C->unk_74[a0])
+ {
+ case 1:
+ for (i = 0; i < gUnknown_0203229C->partyCounts[a0]; i++)
+ {
+ gSprites[gUnknown_0203229C->partyIcons[0][i + (whichParty * PARTY_SIZE)]].invisible = TRUE;
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ ClearWindowTilemap(i + (a0 * 6 + 2));
+ }
+
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].invisible = FALSE;
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[0] = 20;
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[2] = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][0] + gTradeMonSpriteCoords[whichParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[4] = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12;
+ StoreSpriteCallbackInData6(&gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]], sub_80D3014);
+ gUnknown_0203229C->unk_74[a0]++;
+ sub_80A6DEC(&gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]]);
+ CopyToBgTilemapBufferRect_ChangePalette(1, gTradePartyBoxTilemap, a0 * 15, 0, 15, 17, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(0);
+
+ if (whichParty == 0)
+ sub_8079F74();
+ break;
+ case 2:
+ if (gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].callback == sub_80D3014)
+ gUnknown_0203229C->unk_74[a0] = 3;
+ break;
+ case 3:
+ CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMovesBoxTilemap, whichParty * 15, 0, 15, 17, 0);
+ CopyBgTilemapBufferToVram(1);
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos1.x = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][0] + gTradeMonSpriteCoords[whichParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14;
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos1.y = (gTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12;
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos2.x = 0;
+ gSprites[gUnknown_0203229C->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].pos2.y = 0;
+ nameStringWidth = sub_8079A3C(nickname, whichParty, partyIdx);
+ AddTextPrinterParameterized3((a0 * 2) + 14, 0, (80 - nameStringWidth) / 2, 4, gUnknown_0832DEE0, 0, nickname);
+ sub_8079AA4(movesString, whichParty, partyIdx);
+ AddTextPrinterParameterized4((a0 * 2) + 15, 1, 0, 0, 0, 0, gUnknown_0832DEE0, 0, movesString);
+ PutWindowTilemap((a0 * 2) + 14);
+ CopyWindowToVram((a0 * 2) + 14, 3);
+ PutWindowTilemap((a0 * 2) + 15);
+ CopyWindowToVram((a0 * 2) + 15, 3);
+ gUnknown_0203229C->unk_74[a0]++;
+ break;
+ case 4:
+ sub_8079C4C(a0, partyIdx, gUnknown_0832DF99[a0][0] + 4, gUnknown_0832DF99[a0][1] + 1, gUnknown_0832DF99[a0][0], gUnknown_0832DF99[a0][1]);
+ gUnknown_0203229C->unk_74[a0]++;
+ break;
+ }
+}
+
+static u8 sub_8079A3C(u8 *str, u8 whichParty, u8 monIdx)
+{
+ u8 nickname[12];
+
+ if (whichParty == 0)
+ GetMonData(&gPlayerParty[monIdx], MON_DATA_NICKNAME, nickname);
+ else
+ GetMonData(&gEnemyParty[monIdx], MON_DATA_NICKNAME, nickname);
+
+ StringCopy10(str, nickname);
+ return GetStringWidth(0, str, GetFontAttribute(0, FONTATTR_LETTER_SPACING));
+}
+
+static void sub_8079AA4(u8 *a0, u8 a1, u8 a2)
+{
+ u16 arr[4];
+ u16 i;
+
+ if (!gUnknown_0203229C->unk_51[a1][a2])
+ {
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (!a1)
+ {
+ arr[i] = GetMonData(&gPlayerParty[a2], i + MON_DATA_MOVE1, NULL);
+ }
+ else
+ {
+ arr[i] = GetMonData(&gEnemyParty[a2], i + MON_DATA_MOVE1, NULL);
+ }
+ }
+
+ StringCopy(a0, gText_EmptyString7);
+
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (arr[i] != MOVE_NONE)
+ {
+ StringAppend(a0, gMoveNames[arr[i]]);
+ }
+
+ StringAppend(a0, gText_NewLine3);
+ }
+ }
+ else
+ {
+ StringCopy(a0, gText_EmptyString7);
+ StringAppend(a0, gText_FourQuestionMarks);
+ }
+}
+
+static void sub_8079B84(u8 whichParty, u8 windowId, u8 *str)
+{
+ u8 xPos;
+ windowId += (whichParty * PARTY_SIZE) + 2;
+ xPos = GetStringCenterAlignXOffset(0, str, 64);
+ AddTextPrinterParameterized3(windowId, 0, xPos, 4, gUnknown_0832DEE0, 0, str);
+ PutWindowTilemap(windowId);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void sub_8079BE0(u8 whichParty)
+{
+ u8 i;
+ u8 sp[20];
+ u8 sp14[32];
+ struct Pokemon *mons = whichParty == 0 ? gPlayerParty : gEnemyParty;
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[whichParty]; i++)
+ {
+ GetMonData(&mons[i], MON_DATA_NICKNAME, sp);
+ StringCopy10(sp14, sp);
+ sub_8079B84(whichParty, i, sp14);
+ }
+}
+
+static void sub_8079C4C(u8 whichParty, u8 monIdx, u8 a2, u8 a3, u8 a4, u8 a5)
+{
+ u8 level;
+ u32 r2;
+ u8 gender;
+ u8 nickname[12];
+
+ CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_08DDD704, a4, a5, 6, 3, 0);
+ CopyBgTilemapBufferToVram(1);
+
+ if (whichParty == 0)
+ level = GetMonData(&gPlayerParty[monIdx], MON_DATA_LEVEL, NULL);
+ else
+ level = GetMonData(&gEnemyParty[monIdx], MON_DATA_LEVEL, NULL);
+
+ if (gUnknown_0203229C->unk_51[whichParty][monIdx] == 0)
+ {
+ if (level / 10 != 0)
+ gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32)] = (level / 10) + 0x60;
+
+ gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) + 1] = (level % 10) + 0x70;
+ }
+ else
+ {
+ gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 32] = gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 33];
+ gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 31] = gUnknown_0203229C->tilemapBuffer[a2 + (a3 * 32) - 36] | 0x400;
+ }
+
+ if (gUnknown_0203229C->unk_51[whichParty][monIdx] != 0)
+ {
+ r2 = 0x480;
+ }
+ else
+ {
+ if (whichParty == 0)
+ {
+ gender = GetMonGender(&gPlayerParty[monIdx]);
+ GetMonData(&gPlayerParty[monIdx], MON_DATA_NICKNAME, nickname);
+ }
+ else
+ {
+ gender = GetMonGender(&gEnemyParty[monIdx]);
+ GetMonData(&gEnemyParty[monIdx], MON_DATA_NICKNAME, nickname);
+ }
+
+ switch (gender)
+ {
+ case MON_MALE:
+ r2 = !NameHasGenderSymbol(nickname, MON_MALE) ? 0x84 : 0x83;
+ break;
+ case MON_FEMALE:
+ r2 = !NameHasGenderSymbol(nickname, MON_FEMALE) ? 0x85 : 0x83;
+ break;
+ default:
+ r2 = 0x83;
+ break;
+ }
+ }
+ gUnknown_0203229C->tilemapBuffer[(a3 - 1) * 32 + a2 + 1] = r2;
+}
+
+// Very close but loop preamble not working.
+#ifdef NONMATCHING
+static void sub_8079E44(u8 whichParty)
+{
+ int i;
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[whichParty]; i++)
+ {
+ sub_8079C4C(whichParty, i, gTradeLevelDisplayCoords[whichParty][i][0], gTradeLevelDisplayCoords[whichParty][i][1], gTradeMonBoxCoords[whichParty][i][0], gTradeMonBoxCoords[whichParty][i][1]);
+ }
+}
+#else
+NAKED
+static void sub_8079E44(u8 whichParty)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ sub sp, 0x8\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ movs r7, 0\n\
+ ldr r0, =gUnknown_0203229C\n\
+ ldr r0, [r0]\n\
+ adds r0, 0x36\n\
+ adds r0, r6\n\
+ ldrb r0, [r0]\n\
+ cmp r7, r0\n\
+ bge _08079E94\n\
+ lsls r0, r6, 1\n\
+ adds r0, r6\n\
+ ldr r1, =gTradeLevelDisplayCoords\n\
+ lsls r0, 2\n\
+ adds r5, r0, r1\n\
+ ldr r1, =gTradeMonBoxCoords\n\
+ adds r4, r0, r1\n\
+_08079E6A:\n\
+ lsls r1, r7, 24\n\
+ lsrs r1, 24\n\
+ ldrb r2, [r5]\n\
+ ldrb r3, [r5, 0x1]\n\
+ ldrb r0, [r4]\n\
+ str r0, [sp]\n\
+ ldrb r0, [r4, 0x1]\n\
+ str r0, [sp, 0x4]\n\
+ adds r0, r6, 0\n\
+ bl sub_8079C4C\n\
+ adds r5, 0x2\n\
+ adds r4, 0x2\n\
+ adds r7, 0x1\n\
+ ldr r0, =gUnknown_0203229C\n\
+ ldr r0, [r0]\n\
+ adds r0, 0x36\n\
+ adds r0, r6\n\
+ ldrb r0, [r0]\n\
+ cmp r7, r0\n\
+ blt _08079E6A\n\
+_08079E94:\n\
+ add sp, 0x8\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool");
+}
+#endif // NONMATCHING
+
+static void sub_8079EA8(u8 whichParty)
+{
+ int i;
+
+ for (i = 0; i < gUnknown_0203229C->partyCounts[whichParty]; i++)
+ {
+ gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].invisible = FALSE;
+ gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos1.x = gTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][0] * 8 + 14;
+ gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos1.y = gTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][1] * 8 - 12;
+ gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos2.x = 0;
+ gSprites[gUnknown_0203229C->partyIcons[whichParty][i]].pos2.y = 0;
+ }
+}
+
+static void sub_8079F74(void)
+{
+ rbox_fill_rectangle(1);
+ sub_8079BE0(1);
+}
+
+static void sub_8079F88(u8 a0)
+{
+ CopyToBgTilemapBufferRect_ChangePalette(1, gTradePartyBoxTilemap, a0 * 15, 0, 15, 17, 0);
+ CopyBgTilemapBufferToVram(1);
+ sub_8079E44(a0);
+ sub_8079BE0(a0);
+ sub_8079EA8(a0);
+ sub_807A308(gUnknown_0832DE94[1], (void *)(OBJ_VRAM0 + (gUnknown_0203229C->unk_72 * 32)), 24);
+ gUnknown_0203229C->unk_74[a0] = 0;
+}
+
+static void sub_807A000(u8 taskId)
+{
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_807A024(u8 taskId)
+{
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_807A048(u16 a0, u8 a1)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!gUnknown_0203229C->unk_8D0[i].unk_0)
+ {
+ gUnknown_0203229C->unk_8D0[i].unk_2 = a0;
+ gUnknown_0203229C->unk_8D0[i].unk_4 = a1;
+ gUnknown_0203229C->unk_8D0[i].unk_0 = TRUE;
+ break;
+ }
+ }
+}
+
+static u32 sub_807A09C(void)
+{
+ u32 acc = 0;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ acc += gUnknown_0203229C->unk_8D0[i].unk_0;
+ }
+
+ return acc;
+}
+
+static void sub_807A0C4(void)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_0203229C->unk_8D0[i].unk_0)
+ {
+ if (gUnknown_0203229C->unk_8D0[i].unk_2)
+ {
+ gUnknown_0203229C->unk_8D0[i].unk_2--;
+ }
+ else
+ {
+ switch (gUnknown_0203229C->unk_8D0[i].unk_4)
+ {
+ case 0:
+ sub_8077170(gUnknown_0203229C->linkData, 20);
+ break;
+ case 1:
+ sub_807A19C(0);
+ break;
+ case 2:
+ sub_807A19C(2);
+ break;
+ case 3:
+ case 4:
+ case 5:
+ sub_807A19C(3);
+ break;
+ case 6:
+ sub_807A19C(6);
+ break;
+ case 7:
+ sub_807A19C(7);
+ break;
+ case 8:
+ sub_807A19C(8);
+ break;
+ }
+ gUnknown_0203229C->unk_8D0[i].unk_0 = 0;
+ }
+ }
+ }
+}
+
+static void sub_807A19C(u8 a0)
+{
+ FillWindowPixelBuffer(0, 0x11);
+ AddTextPrinterParameterized(0, 1, gUnknown_0832DEBC[a0], 0, 1, TEXT_SPEED_FF, NULL);
+ sub_8098858(0, 20, 12);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+}
+
+static bool8 sub_807A1F0(void)
+{
+ struct SpriteSheet sheet;
+
+ if (gUnknown_0203229C->unk_A8 < 14)
+ {
+ sheet.data = gUnknown_02032188[gUnknown_0203229C->unk_A8];
+ sheet.size = 0x100;
+ sheet.tag = 200 + gUnknown_0203229C->unk_A8;
+ }
+
+ switch (gUnknown_0203229C->unk_A8)
+ {
+ case 0 ... 7:
+ LoadSpriteSheet(&sheet);
+ gUnknown_0203229C->unk_A8++;
+ break;
+ case 8:
+ gUnknown_0203229C->unk_72 = LoadSpriteSheet(&sheet);
+ gUnknown_0203229C->unk_A8++;
+ break;
+ case 9 ... 13:
+ LoadSpriteSheet(&sheet);
+ gUnknown_0203229C->unk_A8++;
+ break;
+ case 14:
+ LoadSpritePalette(&gSpritePalette_TradeScreenText);
+ gUnknown_0203229C->unk_A8++;
+ break;
+ case 15:
+ LoadSpritePalette(&gUnknown_0832DC44);
+ gUnknown_0203229C->unk_A8++;
+ break;
+ case 16:
+ LoadSpriteSheet(&gUnknown_0832DC3C);
+ gUnknown_0203229C->unk_A8++;
+ break;
+ case 17:
+ gUnknown_0203229C->unk_A8 = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_807A308(const u8 *a0, u8 *a1, u8 unused)
+{
+ sub_80C6D80(a0, a1, 0, 0, 6);
+}
+
+static void sub_807A320(u8 who)
+{
+ int i;
+
+ switch (who)
+ {
+ case 0:
+ for (i = 0; i < gUnknown_0203229C->partyCounts[who]; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) == TRUE)
+ {
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 1;
+ }
+ else if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
+ {
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 0;
+ }
+ else
+ {
+ gUnknown_0203229C->unk_45[who][i] = 1;
+ gUnknown_0203229C->unk_51[who][i] = 0;
+ }
+ }
+ break;
+ case 1:
+ for (i = 0; i < gUnknown_0203229C->partyCounts[who]; i++)
+ {
+ if (GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG) == TRUE)
+ {
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 1;
+ }
+ else if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)
+ {
+ gUnknown_0203229C->unk_45[who][i] = 0;
+ gUnknown_0203229C->unk_51[who][i] = 0;
+ }
+ else
+ {
+ gUnknown_0203229C->unk_45[who][i] = 1;
+ gUnknown_0203229C->unk_51[who][i] = 0;
+ }
+ }
+ break;
+ }
+}
+
+static void sub_807A468(u8 who)
+{
+ u16 i, curHp, maxHp;
+
+ switch (who)
+ {
+ case 0:
+ for (i = 0; i < gUnknown_0203229C->partyCounts[0]; i++)
+ {
+ curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
+ gUnknown_0203229C->unk_5D[0][i] = GetHPBarLevel(curHp, maxHp);
+ }
+ break;
+ case 1:
+ for (i = 0; i < gUnknown_0203229C->partyCounts[1]; i++)
+ {
+ curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP);
+ maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP);
+ gUnknown_0203229C->unk_5D[1][i] = GetHPBarLevel(curHp, maxHp);
+ }
+ break;
+ }
+}
+
+static void sub_807A53C(void)
+{
+ int i, j;
+
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < gUnknown_0203229C->partyCounts[i]; j++)
+ {
+ sub_80D32C8(&gSprites[gUnknown_0203229C->partyIcons[i][j]], 4 - gUnknown_0203229C->unk_5D[i][j]);
+ }
+ }
+}
+
+static void sub_807A5B0(void)
+{
+ int i;
+
+ for (i = 0; i < 11; i++)
+ {
+ if (gSaveBlock1Ptr->giftRibbons[i] == 0 && gUnknown_0203229C->unk_A9[i] != 0)
+ {
+ if (gUnknown_0203229C->unk_A9[i] < 64)
+ gSaveBlock1Ptr->giftRibbons[i] = gUnknown_0203229C->unk_A9[i];
+ }
+ }
+}
+
+static u32 sub_807A5F4(struct Pokemon *monList, int a1, int monIdx)
+{
+ int i, sum;
+ struct LinkPlayer *player;
+ u32 species[6];
+ u32 species2[6];
+
+ for (i = 0; i < a1; i++)
+ {
+ species2[i] = GetMonData(&monList[i], MON_DATA_SPECIES2);
+ species[i] = GetMonData(&monList[i], MON_DATA_SPECIES);
+ }
+
+ if (!IsNationalPokedexEnabled())
+ {
+ if (species2[monIdx] == SPECIES_EGG)
+ {
+ return 3;
+ }
+
+ if (!IsSpeciesInHoennDex(species2[monIdx]))
+ {
+ return 2;
+ }
+ }
+
+ player = &gLinkPlayers[GetMultiplayerId() ^ 1];
+ if ((player->version & 0xFF) != VERSION_RUBY &&
+ (player->version & 0xFF) != VERSION_SAPPHIRE)
+ {
+ if ((player->name[10] & 0xF) == 0)
+ {
+ if (species2[monIdx] == SPECIES_EGG)
+ {
+ return 5;
+ }
+
+ if (!IsSpeciesInHoennDex(species2[monIdx]))
+ {
+ return 4;
+ }
+ }
+ }
+
+ if (species[monIdx] == SPECIES_DEOXYS || species[monIdx] == SPECIES_MEW)
+ {
+ if (!GetMonData(&monList[monIdx], MON_DATA_OBEDIENCE))
+ {
+ return 4;
+ }
+ }
+
+ for (i = 0; i < a1; i++)
+ {
+ if (species2[i] == SPECIES_EGG)
+ {
+ species2[i] = SPECIES_NONE;
+ }
+ }
+
+ for (sum = 0, i = 0; i < a1; i++)
+ {
+ if (i != monIdx)
+ {
+ sum += species2[i];
+ }
+ }
+
+ if (sum != 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
+}
+
+#ifdef NONMATCHING
+s32 sub_807A728(void)
+{
+ s32 val;
+ u16 version;
+
+ if (gReceivedRemoteLinkPlayers)
+ {
+ val = 0;
+ version = (gLinkPlayers[GetMultiplayerId() ^ 1].version & 0xFF);
+
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE || version == VERSION_EMERALD)
+ {
+ // this value could actually be anything 0 or less
+ val = 0;
+ }
+ else if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN)
+ {
+ val = 2;
+ }
+
+ if (val > 0)
+ {
+ if (gLinkPlayers[GetMultiplayerId()].name[10] & 0xF0)
+ {
+ if (val == 2)
+ {
+ if (gLinkPlayers[GetMultiplayerId() ^ 1].name[10] & 0xF0)
+ {
+ return 0;
+ }
+ else
+ {
+ return 2;
+ }
+ }
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+#else
+NAKED
+s32 sub_807A728(void)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ ldr r0, =gReceivedRemoteLinkPlayers\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _0807A7B4\n\
+ movs r4, 0\n\
+ bl GetMultiplayerId\n\
+ ldr r5, =gLinkPlayers\n\
+ movs r7, 0x1\n\
+ eors r0, r7\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r0, 3\n\
+ subs r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r5\n\
+ ldrb r1, [r1]\n\
+ subs r0, r1, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x2\n\
+ bls _0807A7B4\n\
+ subs r0, r1, 0x4\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1\n\
+ bhi _0807A762\n\
+ movs r4, 0x2\n\
+_0807A762:\n\
+ cmp r4, 0\n\
+ ble _0807A7B4\n\
+ bl GetMultiplayerId\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r0, 3\n\
+ subs r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r5\n\
+ ldrb r1, [r1, 0x12]\n\
+ movs r6, 0xF0\n\
+ adds r0, r6, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0807A7B0\n\
+ cmp r4, 0x2\n\
+ bne _0807A7B4\n\
+ bl GetMultiplayerId\n\
+ eors r0, r7\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r0, 3\n\
+ subs r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r5\n\
+ ldrb r1, [r1, 0x12]\n\
+ adds r0, r6, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0807A7B4\n\
+ movs r0, 0x2\n\
+ b _0807A7B6\n\
+ .pool\n\
+_0807A7B0:\n\
+ movs r0, 0x1\n\
+ b _0807A7B6\n\
+_0807A7B4:\n\
+ movs r0, 0\n\
+_0807A7B6:\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#endif // NONMATCHING
+
+static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet)
+{
+ if (species == SPECIES_DEOXYS || species == SPECIES_MEW)
+ {
+ if (!isObedientBitSet)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+int sub_807A7E0(struct UnkLinkRfuStruct_02022B14Substruct a0, struct UnkLinkRfuStruct_02022B14Substruct a1, u16 species1, u16 species2, u8 type, u16 species3, u8 isObedientBitSet)
+{
+ u8 r9 = a0.unk_01_0;
+ u8 r2 = a0.unk_00_7;
+ u8 r10 = a1.unk_01_0;
+ u8 r0 = a1.unk_00_7;
+ u8 r1 = a1.unk_01_2;
+
+ if (r1 != 3)
+ {
+ if (!r2)
+ {
+ return 8;
+ }
+ else if (!r0)
+ {
+ return 9;
+ }
+ }
+
+ if (IsDeoxysOrMewUntradable(species3, isObedientBitSet))
+ {
+ return 4;
+ }
+
+ if (species2 == SPECIES_EGG)
+ {
+ if (species1 != species2)
+ {
+ return 2;
+ }
+ }
+ else
+ {
+ if (gBaseStats[species1].type1 != type && gBaseStats[species1].type2 != type)
+ {
+ return 1;
+ }
+ }
+
+ if (species1 == SPECIES_EGG && species1 != species2)
+ {
+ return 3;
+ }
+
+ if (!r9)
+ {
+ if (species1 == SPECIES_EGG)
+ {
+ return 6;
+ }
+
+ if (!IsSpeciesInHoennDex(species1))
+ {
+ return 4;
+ }
+
+ if (!IsSpeciesInHoennDex(species2))
+ {
+ return 5;
+ }
+ }
+
+ if (!r10 && !IsSpeciesInHoennDex(species1))
+ {
+ return 7;
+ }
+
+ return 0;
+}
+
+int sub_807A8D0(struct UnkLinkRfuStruct_02022B14Substruct a0, u16 species, u16 a2, u8 a3)
+{
+ u8 unk = a0.unk_01_0;
+
+ if (IsDeoxysOrMewUntradable(a2, a3))
+ {
+ return 1;
+ }
+
+ if (unk)
+ {
+ return 0;
+ }
+
+ if (species == SPECIES_EGG)
+ {
+ return 2;
+ }
+
+ if (IsSpeciesInHoennDex(species))
+ {
+ return 0;
+ }
+
+ return 1;
+}
+
+// r6/r7 flip. Ugh.
+#ifdef NONMATCHING
+int sub_807A918(struct Pokemon *mon, u16 monIdx)
+{
+ int i, version, versions, unk, unk2;
+ int speciesArray[PARTY_SIZE];
+
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ speciesArray[i] = GetMonData(&mon[i], MON_DATA_SPECIES2);
+ if (speciesArray[i] == SPECIES_EGG)
+ {
+ speciesArray[i] = 0;
+ }
+ }
+
+ versions = 0;
+ unk = 1;
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ version = gLinkPlayers[i].version & 0xFF;
+ if (version == VERSION_FIRE_RED ||
+ version == VERSION_LEAF_GREEN)
+ {
+ versions = 0;
+ }
+ else
+ {
+ versions |= 1;
+ }
+ }
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ struct LinkPlayer *player = &gLinkPlayers[i];
+ if ((player->name[8] & 0xF) == 0)
+ {
+ unk = 0;
+ }
+
+ if (versions && (player->name[8] / 16))
+ {
+ unk = 0;
+ }
+ }
+
+ if (unk == 0)
+ {
+ if (!IsSpeciesInHoennDex(speciesArray[monIdx]))
+ {
+ return 2;
+ }
+
+ if (speciesArray[monIdx] == SPECIES_NONE)
+ {
+ return 3;
+ }
+ }
+
+ unk2 = 0;
+ for (i = 0; i < gPlayerPartyCount; i++)
+ {
+ if (monIdx != i)
+ {
+ unk2 += speciesArray[i];
+ }
+ }
+
+ if (!unk2)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+#else
+NAKED
+int sub_807A918(struct Pokemon *mon, u16 a1)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ sub sp, 0x18\n\
+ adds r6, r0, 0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ mov r8, r1\n\
+ movs r5, 0\n\
+ ldr r0, =gPlayerPartyCount\n\
+ ldrb r0, [r0]\n\
+ cmp r5, r0\n\
+ bge _0807A95A\n\
+ mov r4, sp\n\
+_0807A934:\n\
+ movs r0, 0x64\n\
+ muls r0, r5\n\
+ adds r0, r6, r0\n\
+ movs r1, 0x41\n\
+ bl GetMonData\n\
+ str r0, [r4]\n\
+ movs r1, 0xCE\n\
+ lsls r1, 1\n\
+ cmp r0, r1\n\
+ bne _0807A94E\n\
+ movs r0, 0\n\
+ str r0, [r4]\n\
+_0807A94E:\n\
+ adds r4, 0x4\n\
+ adds r5, 0x1\n\
+ ldr r0, =gPlayerPartyCount\n\
+ ldrb r0, [r0]\n\
+ cmp r5, r0\n\
+ blt _0807A934\n\
+_0807A95A:\n\
+ movs r7, 0\n\
+ movs r6, 0x1\n\
+ movs r5, 0\n\
+ ldr r4, =gLinkPlayers\n\
+ b _0807A980\n\
+ .pool\n\
+_0807A96C:\n\
+ ldrb r0, [r4]\n\
+ subs r0, 0x4\n\
+ cmp r0, 0x1\n\
+ bhi _0807A978\n\
+ movs r7, 0\n\
+ b _0807A97C\n\
+_0807A978:\n\
+ movs r0, 0x1\n\
+ orrs r7, r0\n\
+_0807A97C:\n\
+ adds r4, 0x1C\n\
+ adds r5, 0x1\n\
+_0807A980:\n\
+ bl GetLinkPlayerCount\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r5, r0\n\
+ blt _0807A96C\n\
+ movs r5, 0\n\
+ movs r4, 0\n\
+ b _0807A9B4\n\
+_0807A992:\n\
+ ldr r0, =gLinkPlayers\n\
+ adds r2, r4, r0\n\
+ ldrb r1, [r2, 0x10]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0807A9A2\n\
+ movs r6, 0\n\
+_0807A9A2:\n\
+ cmp r7, 0\n\
+ beq _0807A9B0\n\
+ ldrb r0, [r2, 0x10]\n\
+ lsrs r0, 4\n\
+ cmp r0, 0\n\
+ beq _0807A9B0\n\
+ movs r6, 0\n\
+_0807A9B0:\n\
+ adds r4, 0x1C\n\
+ adds r5, 0x1\n\
+_0807A9B4:\n\
+ bl GetLinkPlayerCount\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r5, r0\n\
+ blt _0807A992\n\
+ cmp r6, 0\n\
+ bne _0807A9EA\n\
+ mov r1, r8\n\
+ lsls r0, r1, 2\n\
+ mov r1, sp\n\
+ adds r4, r1, r0\n\
+ ldrh r0, [r4]\n\
+ bl IsSpeciesInHoennDex\n\
+ cmp r0, 0\n\
+ bne _0807A9E0\n\
+ movs r0, 0x2\n\
+ b _0807AA1A\n\
+ .pool\n\
+_0807A9E0:\n\
+ ldr r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _0807A9EA\n\
+ movs r0, 0x3\n\
+ b _0807AA1A\n\
+_0807A9EA:\n\
+ movs r2, 0\n\
+ movs r5, 0\n\
+ ldr r0, =gPlayerPartyCount\n\
+ ldrb r0, [r0]\n\
+ cmp r2, r0\n\
+ bge _0807AA0A\n\
+ adds r3, r0, 0\n\
+ mov r1, sp\n\
+_0807A9FA:\n\
+ cmp r8, r5\n\
+ beq _0807AA02\n\
+ ldr r0, [r1]\n\
+ adds r2, r0\n\
+_0807AA02:\n\
+ adds r1, 0x4\n\
+ adds r5, 0x1\n\
+ cmp r5, r3\n\
+ blt _0807A9FA\n\
+_0807AA0A:\n\
+ cmp r2, 0\n\
+ beq _0807AA18\n\
+ movs r0, 0\n\
+ b _0807AA1A\n\
+ .pool\n\
+_0807AA18:\n\
+ movs r0, 0x1\n\
+_0807AA1A:\n\
+ add sp, 0x18\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#endif // NONMATCHING
+
+static void sub_807AA28(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 10)
+ {
+ PlaySE(SE_BOWA);
+ sprite->data[0] = 0;
+ }
+}
+
+static void sub_807AA4C(struct Sprite *sprite)
+{
+ if (!sprite->invisible && ++sprite->data[0] == 10)
+ {
+ PlaySE(SE_W207B);
+ sprite->data[0] = 0;
+ }
+}
+
+static void sub_807AA7C(struct Sprite *sprite)
+{
+ if (!sprite->data[1])
+ {
+ if (++sprite->data[0] == 12)
+ sprite->data[0] = 0;
+
+ LoadPalette(&gUnknown_08338EA4[sprite->data[0]], (sprite->oam.paletteNum + 16) * 16 + 4, 2);
+ }
+}
+
+static void sub_807AABC(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+ sprite->pos2.y++;
+
+ if (sprite->data[0] == 10)
+ DestroySprite(sprite);
+}
+
+static void sub_807AAE0(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+ sprite->pos2.y--;
+
+ if (sprite->data[0] == 10)
+ DestroySprite(sprite);
+}
+
+static void sub_807AB04(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 15)
+ {
+ PlaySE(SE_W107);
+ sprite->data[0] = 0;
+ }
+}
+
+static void sub_807AB28(void)
+{
+ struct BgAffineDstData affine;
+
+ DoBgAffineSet(&affine, gUnknown_020322A0->unk_D4 * 0x100, gUnknown_020322A0->unk_D6 * 0x100, gUnknown_020322A0->unk_DC, gUnknown_020322A0->unk_DE, gUnknown_020322A0->unk_E8, gUnknown_020322A0->unk_E8, gUnknown_020322A0->unk_EC);
+ SetGpuReg(REG_OFFSET_BG2PA, affine.pa);
+ SetGpuReg(REG_OFFSET_BG2PB, affine.pb);
+ SetGpuReg(REG_OFFSET_BG2PC, affine.pc);
+ SetGpuReg(REG_OFFSET_BG2PD, affine.pd);
+ SetGpuReg(REG_OFFSET_BG2X_L, affine.dx);
+ SetGpuReg(REG_OFFSET_BG2X_H, affine.dx >> 16);
+ SetGpuReg(REG_OFFSET_BG2Y_L, affine.dy);
+ SetGpuReg(REG_OFFSET_BG2Y_H, affine.dy >> 16);
+}
+
+static void sub_807ABCC(void)
+{
+ u16 dispcnt;
+
+ SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_020322A0->bg1vofs);
+ SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_020322A0->bg1hofs);
+
+ dispcnt = GetGpuReg(REG_OFFSET_DISPCNT);
+ if ((dispcnt & 7) == DISPCNT_MODE_0)
+ {
+ SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_020322A0->bg2vofs);
+ SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_020322A0->bg2hofs);
+ }
+ else
+ {
+ sub_807AB28();
+ }
+}
+
+static void sub_807AC24(void)
+{
+ sub_807ABCC();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_807AC3C(void)
+{
+ gUnknown_020322A0->unk_8A = 0;
+ gUnknown_020322A0->unk_88 = 0;
+ gUnknown_020322A0->unk_89 = 0;
+}
+
+static void sub_807AC64(void)
+{
+ if (gUnknown_020322A0->unk_88 == gUnknown_020322A0->unk_89)
+ gUnknown_020322A0->unk_8A++;
+ else
+ gUnknown_020322A0->unk_8A = 0;
+
+ if (gUnknown_020322A0->unk_8A > 300)
+ {
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ gUnknown_020322A0->unk_8A = 0;
+ gUnknown_020322A0->unk_89 = 0;
+ gUnknown_020322A0->unk_88 = 0;
+ }
+
+ gUnknown_020322A0->unk_89 = gUnknown_020322A0->unk_88;
+}
+
+static u32 sub_807ACDC(void)
+{
+ if (gReceivedRemoteLinkPlayers)
+ return GetMultiplayerId();
+ return 0;
+}
+
+static void sub_807ACFC(u8 whichParty, u8 a1)
+{
+ int pos = 0;
+ struct Pokemon *mon = NULL;
+ u16 species;
+ u32 personality;
+
+ if (whichParty == 0)
+ {
+ mon = &gPlayerParty[gUnknown_02032298[0]];
+ pos = 1;
+ }
+
+ if (whichParty == 1)
+ {
+ mon = &gEnemyParty[gUnknown_02032298[1] % PARTY_SIZE];
+ pos = 3;
+ }
+
+ switch (a1)
+ {
+ case 0:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+
+ if (whichParty == 0)
+ HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
+ else
+ HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality);
+
+ LoadCompressedSpritePalette(GetMonSpritePalStruct(mon));
+ gUnknown_020322A0->tradeSpecies[whichParty] = species;
+ gUnknown_020322A0->unk_68[whichParty] = personality;
+ break;
+ case 1:
+ SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos);
+ gUnknown_020322A0->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6);
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[whichParty]].invisible = TRUE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy;
+ break;
+ }
+}
+
+void sub_807AE50(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ gLinkType = 0x1144;
+ CloseLink();
+ }
+ gUnknown_020322A0 = AllocZeroed(sizeof(*gUnknown_020322A0));
+ AllocateMonSpritesGfx();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ SetVBlankCallback(sub_807AC24);
+ sub_807B170();
+ sub_807AC3C();
+ gMain.state++;
+ gUnknown_020322A0->unk_8C = 0;
+ gUnknown_020322A0->state = 0;
+ gUnknown_020322A0->isLinkTrade = TRUE;
+ gUnknown_020322A0->unk_D4 = 64;
+ gUnknown_020322A0->unk_D6 = 64;
+ gUnknown_020322A0->unk_D8 = 0;
+ gUnknown_020322A0->unk_DA = 0;
+ gUnknown_020322A0->unk_DC = 120;
+ gUnknown_020322A0->unk_DE = 80;
+ gUnknown_020322A0->unk_E8 = 256;
+ gUnknown_020322A0->unk_EC = 0;
+ break;
+ case 1:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ gUnknown_020322A0->unk_FA = 1;
+ OpenLink();
+ gMain.state++;
+ gUnknown_020322A0->timer = 0;
+ }
+ else
+ {
+ gMain.state = 4;
+ }
+ break;
+ case 2:
+ if (++gUnknown_020322A0->timer > 60)
+ {
+ gUnknown_020322A0->timer = 0;
+ gMain.state++;
+ }
+ break;
+ case 3:
+ if (IsLinkMaster())
+ {
+ if (GetLinkPlayerCount_2() >= sub_800AA48())
+ {
+ if (++gUnknown_020322A0->timer > 30)
+ {
+ sub_800A620();
+ gMain.state++;
+ }
+ }
+ else
+ {
+ sub_807AC64();
+ }
+ }
+ else
+ {
+ gMain.state++;
+ }
+ break;
+ case 4:
+ sub_807AC64();
+ if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
+ gMain.state++;
+ break;
+ case 5:
+ gUnknown_020322A0->unk_72 = 0;
+ gUnknown_020322A0->unk_73 = 0;
+ gUnknown_020322A0->unk_93 = 0;
+ sub_807ACFC(0, 0);
+ gMain.state++;
+ break;
+ case 6:
+ sub_807ACFC(0, 1);
+ gMain.state++;
+ break;
+ case 7:
+ sub_807ACFC(1, 0);
+ gMain.state++;
+ break;
+ case 8:
+ sub_807ACFC(1, 1);
+ sub_807B154();
+ gMain.state++;
+ break;
+ case 9:
+ sub_807BA94();
+ LoadSpriteSheet(&gUnknown_08338D18);
+ LoadSpritePalette(&gUnknown_08338D20);
+ gMain.state++;
+ break;
+ case 10:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ ShowBg(0);
+ gMain.state++;
+ break;
+ case 11:
+ sub_807B140();
+ SetTradeSceneStrings();
+ gMain.state++;
+ break;
+ case 12:
+ if (!gPaletteFade.active)
+ {
+ if (gWirelessCommType)
+ {
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ }
+ SetMainCallback2(sub_807EA2C);
+ }
+ break;
+ }
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_807B140(void)
+{
+ sub_807B62C(5);
+ sub_807B62C(0);
+}
+
+void sub_807B154(void)
+{
+ FillWindowPixelBuffer(0, 0xFF);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+}
+
+static void sub_807B170(void)
+{
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_08339014, ARRAY_COUNT(gUnknown_08339014));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ SetBgTilemapBuffer(0, Alloc(0x800));
+ SetBgTilemapBuffer(1, Alloc(0x800));
+ SetBgTilemapBuffer(3, Alloc(0x800));
+ DeactivateAllTextPrinters();
+ DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0);
+ LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer);
+ CopyToBgTilemapBuffer(0, gDecompressionBuffer, 0x800, 0);
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
+ InitWindows(gUnknown_08338FFC);
+ DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0);
+ LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer);
+ CopyToBgTilemapBuffer(0, gDecompressionBuffer, 0x800, 0);
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
+}
+
+// In-game trade init
+static void sub_807B270(void)
+{
+ u8 otName[11];
+
+ switch (gMain.state)
+ {
+ case 0:
+ gUnknown_02032298[0] = gSpecialVar_0x8005;
+ gUnknown_02032298[1] = 6;
+ StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName);
+ GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName);
+ StringCopy(gLinkPlayers[1].name, otName);
+ gLinkPlayers[0].language = LANGUAGE_ENGLISH;
+ gLinkPlayers[1].language = GetMonData(&gEnemyParty[0], MON_DATA_LANGUAGE);
+ gUnknown_020322A0 = AllocZeroed(sizeof(*gUnknown_020322A0));
+ AllocateMonSpritesGfx();
+ ResetTasks();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ SetVBlankCallback(sub_807AC24);
+ sub_807B170();
+ gUnknown_020322A0->isLinkTrade = FALSE;
+ gUnknown_020322A0->unk_8C = 0;
+ gUnknown_020322A0->state = 0;
+ gUnknown_020322A0->unk_D4 = 64;
+ gUnknown_020322A0->unk_D6 = 64;
+ gUnknown_020322A0->unk_D8 = 0;
+ gUnknown_020322A0->unk_DA = 0;
+ gUnknown_020322A0->unk_DC = 120;
+ gUnknown_020322A0->unk_DE = 80;
+ gUnknown_020322A0->unk_E8 = 256;
+ gUnknown_020322A0->unk_EC = 0;
+ gUnknown_020322A0->timer = 0;
+ gMain.state = 5;
+ break;
+ case 5:
+ sub_807ACFC(0, 0);
+ gMain.state++;
+ break;
+ case 6:
+ sub_807ACFC(0, 1);
+ gMain.state++;
+ break;
+ case 7:
+ sub_807ACFC(1, 0);
+ ShowBg(0);
+ gMain.state++;
+ break;
+ case 8:
+ sub_807ACFC(1, 1);
+ FillWindowPixelBuffer(0, 0xFF);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ gMain.state++;
+ break;
+ case 9:
+ sub_807BA94();
+ LoadSpriteSheet(&gUnknown_08338D18);
+ LoadSpritePalette(&gUnknown_08338D20);
+ gMain.state++;
+ break;
+ case 10:
+ ShowBg(0);
+ gMain.state++;
+ break;
+ case 11:
+ sub_807B62C(5);
+ sub_807B62C(0);
+ SetTradeSceneStrings();
+ gMain.state++;
+ break;
+ case 12:
+ SetMainCallback2(sub_807B60C);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_807B464(u8 partyIdx)
+{
+ struct Pokemon *mon = &gPlayerParty[partyIdx];
+
+ if (!GetMonData(mon, MON_DATA_IS_EGG))
+ {
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL);
+ species = SpeciesToNationalPokedexNum(species);
+ GetSetPokedexFlag(species, FLAG_SET_SEEN);
+ HandleSetPokedexFlag(species, FLAG_SET_CAUGHT, personality);
+ }
+}
+
+static void sub_807B4C4(void)
+{
+ u8 mpId = GetMultiplayerId();
+ // Originally in Ruby but commented out
+ /*if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000)
+ EnableNationalPokedex();*/
+}
+
+static void sub_807B4D0(u8 a0, u8 a1)
+{
+ u8 friendship;
+
+ struct Pokemon *playerMon = &gPlayerParty[a0];
+ u16 playerMail = GetMonData(playerMon, MON_DATA_MAIL);
+
+ struct Pokemon *partnerMon = &gEnemyParty[a1];
+ u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL);
+
+ if (playerMail != 0xFF)
+ ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]);
+
+ // This is where the actual trade happens!!
+ gUnknown_020322A0->mon = *playerMon;
+ *playerMon = *partnerMon;
+ *partnerMon = gUnknown_020322A0->mon;
+
+ friendship = 70;
+ if (!GetMonData(playerMon, MON_DATA_IS_EGG))
+ SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship);
+
+ if (partnerMail != 0xFF)
+ GiveMailToMon2(playerMon, &gUnknown_020321C0[partnerMail]);
+
+ sub_807B464(a0);
+ if (gReceivedRemoteLinkPlayers)
+ sub_807B4C4();
+}
+
+static void sub_807B5B8(void)
+{
+ switch (gUnknown_020322A0->unk_93)
+ {
+ case 1:
+ if (IsLinkTaskFinished())
+ {
+ Trade_SendData(gUnknown_020322A0);
+ gUnknown_020322A0->unk_93++;
+ }
+ // fallthrough
+ case 2:
+ gUnknown_020322A0->unk_93 = 0;
+ break;
+ }
+}
+
+static void sub_807B60C(void)
+{
+ sub_807BBC8();
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_807B62C(u8 a0)
+{
+ switch (a0)
+ {
+ case 0:
+ gUnknown_020322A0->bg2vofs = 0;
+ gUnknown_020322A0->bg2hofs = 180;
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG0_ON |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) |
+ BGCNT_CHARBASE(1) |
+ BGCNT_16COLOR |
+ BGCNT_SCREENBASE(18) |
+ BGCNT_TXT512x256);
+ LoadPalette(gTradeGba2_Pal, 16, 0x60);
+ DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000);
+ DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
+ break;
+ case 1:
+ gUnknown_020322A0->bg1hofs = 0;
+ gUnknown_020322A0->bg1vofs = 348;
+ SetGpuReg(REG_OFFSET_BG1VOFS, 348);
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) |
+ BGCNT_CHARBASE(0) |
+ BGCNT_16COLOR |
+ BGCNT_SCREENBASE(5) |
+ BGCNT_TXT256x512);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) |
+ BGCNT_CHARBASE(1) |
+ BGCNT_16COLOR |
+ BGCNT_SCREENBASE(18) |
+ BGCNT_TXT256x512);
+
+ if (gUnknown_020322A0->unk_FA)
+ {
+ DmaCopy16Defvars(3, gUnknown_083369A0, (void *) BG_SCREEN_ADDR(5), 0x1000);
+ }
+ else
+ {
+ DmaCopy16Defvars(3, gUnknown_083359A0, (void *) BG_SCREEN_ADDR(5), 0x1000);
+ }
+
+ DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(0), 0x1420, 0x1000);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ break;
+ case 2:
+ gUnknown_020322A0->bg1vofs = 0;
+ gUnknown_020322A0->bg1hofs = 0;
+ if (!gUnknown_020322A0->unk_FA)
+ {
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ LZ77UnCompVram(gUnknown_083379A0, (void *) BG_SCREEN_ADDR(5));
+ BlendPalettes(0x8, 16, RGB_BLACK);
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ DmaCopy16Defvars(3, gUnknown_0832FFC0, (void *) BG_SCREEN_ADDR(5), 0x800);
+ BlendPalettes(0x1, 16, RGB_BLACK);
+ }
+ break;
+ case 3:
+ LoadPalette(gUnknown_08337EA0, 48, 0x20);
+ LZ77UnCompVram(gUnknown_08337EC0, (void *) BG_CHAR_ADDR(1));
+ LZ77UnCompVram(gUnknown_08338550, (void *) BG_SCREEN_ADDR(18));
+ gUnknown_020322A0->bg2vofs = 80;
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ break;
+ case 4:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) |
+ BGCNT_CHARBASE(1) |
+ BGCNT_256COLOR |
+ BGCNT_SCREENBASE(18) |
+ BGCNT_AFF128x128);
+ gUnknown_020322A0->unk_D4 = 64;
+ gUnknown_020322A0->unk_D6 = 92;
+ gUnknown_020322A0->unk_E8 = 32;
+ gUnknown_020322A0->unk_EA = 1024;
+ gUnknown_020322A0->unk_EC = 0;
+
+ DmaCopyLarge16(3, gUnknown_08332F60, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000);
+
+ if (gUnknown_020322A0->unk_FA)
+ {
+ DmaCopy16Defvars(3, gUnknown_083357A0, (void *) BG_SCREEN_ADDR(18), 0x100);
+ }
+ else
+ {
+ DmaCopy16Defvars(3, gUnknown_083358A0, (void *) BG_SCREEN_ADDR(18), 0x100);
+ }
+ break;
+ case 5:
+ gUnknown_020322A0->bg1vofs = 0;
+ gUnknown_020322A0->bg1hofs = 0;
+ break;
+ case 6:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) |
+ BGCNT_CHARBASE(1) |
+ BGCNT_256COLOR |
+ BGCNT_SCREENBASE(18) |
+ BGCNT_AFF128x128);
+ gUnknown_020322A0->unk_D4 = 64;
+ gUnknown_020322A0->unk_D6 = 92;
+ gUnknown_020322A0->unk_E8 = 256;
+ gUnknown_020322A0->unk_EA = 128;
+ gUnknown_020322A0->unk_DC = 120;
+ gUnknown_020322A0->unk_DE = 80;
+ gUnknown_020322A0->unk_EC = 0;
+
+ DmaCopyLarge16(3, gUnknown_08332F60, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000);
+
+ if (gUnknown_020322A0->unk_FA)
+ {
+ DmaCopy16Defvars(3, gUnknown_083357A0, (void *) BG_SCREEN_ADDR(18), 0x100);
+ }
+ else
+ {
+ DmaCopy16Defvars(3, gUnknown_083358A0, (void *) BG_SCREEN_ADDR(18), 0x100);
+ }
+ break;
+ case 7:
+ gUnknown_020322A0->bg2vofs = 0;
+ gUnknown_020322A0->bg2hofs = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) |
+ BGCNT_CHARBASE(1) |
+ BGCNT_16COLOR |
+ BGCNT_SCREENBASE(18) |
+ BGCNT_TXT512x256);
+ LoadPalette(gTradeGba2_Pal, 16, 0x60);
+ DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000);
+ DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000);
+ break;
+ }
+}
+
+static void sub_807BA94(void)
+{
+ LoadSpriteSheet(&gUnknown_08338D70);
+ LoadSpriteSheet(&gUnknown_08338DC0);
+ LoadSpriteSheet(&gUnknown_08338DF4);
+ LoadSpriteSheet(&gUnknown_08338E6C);
+ LoadSpritePalette(&gUnknown_08338D78);
+ LoadSpritePalette(&gUnknown_08338D80);
+}
+
+static void SetTradeSceneStrings(void)
+{
+ /*Sets the variable strings printed on the
+ *actual trading screen. For use in strings
+ *like "[Pokemon] will be sent to [Trainer]."
+ */
+ u8 mpId;
+ u8 name[20];
+ const struct InGameTrade *ingameTrade;
+
+ if (gUnknown_020322A0->isLinkTrade)
+ {
+ mpId = GetMultiplayerId();
+ StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name);
+ GetMonData(&gEnemyParty[gUnknown_02032298[1] % PARTY_SIZE], MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar3, name);
+ GetMonData(&gPlayerParty[gUnknown_02032298[0]], MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar2, name);
+ }
+ else
+ {
+ ingameTrade = &gIngameTrades[gSpecialVar_0x8004];
+ StringCopy(gStringVar1, ingameTrade->otName);
+ StringCopy10(gStringVar3, ingameTrade->name);
+ GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar2, name);
+ }
+}
+
+static u8 sub_807BBC8(void)
+{
+ if (gUnknown_020322A0->unk_FA)
+ {
+ return sub_807BBEC();
+ }
+ else
+ {
+ return sub_807CFC8();
+ }
+}
+
+static bool8 sub_807BBEC(void)
+{
+ u16 evoTarget;
+
+ switch (gUnknown_020322A0->state)
+ {
+ case 0:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = -180;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[0]].y_offset;
+ gUnknown_020322A0->state++;
+ gUnknown_020322A0->cachedMapMusic = GetCurrentMapMusic();
+ PlayNewMapMusic(MUS_SHINKA);
+ break;
+ case 1:
+ if (gUnknown_020322A0->bg2hofs > 0)
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x += 3;
+ gUnknown_020322A0->bg2hofs -= 3;
+ }
+ else
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = 0;
+ gUnknown_020322A0->bg2hofs = 0;
+ gUnknown_020322A0->state = 10;
+ }
+ break;
+ case 10:
+ StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY);
+ sub_807F1A8(0, gStringVar4, 0);
+
+ if (gUnknown_020322A0->tradeSpecies[0] != SPECIES_EGG)
+ {
+ PlayCry1(gUnknown_020322A0->tradeSpecies[0], 0);
+ }
+
+ gUnknown_020322A0->state = 11;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 11:
+ if (++gUnknown_020322A0->timer == 80)
+ {
+ gUnknown_020322A0->unk_D2 = sub_807671C(gUnknown_020322A0->pokePicSpriteIdxs[0], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff);
+ gUnknown_020322A0->state++;
+ StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1);
+ sub_807F1A8(0, gStringVar4, 0);
+ }
+ break;
+ case 12:
+ if (gSprites[gUnknown_020322A0->unk_D2].callback == SpriteCallbackDummy)
+ {
+ gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0);
+ gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E5D8;
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_D2]);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 13:
+ // The game waits here for the sprite to finish its animation sequence.
+ break;
+ case 14:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state = 20;
+ break;
+ case 20:
+ if (!gPaletteFade.active)
+ {
+ sub_807B62C(4);
+ FillWindowPixelBuffer(0, 0xFF);
+ CopyWindowToVram(0, 3);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 21:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 22:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state = 23;
+ }
+ break;
+ case 23:
+ if (gUnknown_020322A0->unk_EA > 0x100)
+ {
+ gUnknown_020322A0->unk_EA -= 0x34;
+ }
+ else
+ {
+ sub_807B62C(1);
+ gUnknown_020322A0->unk_EA = 0x80;
+ gUnknown_020322A0->state++;
+ gUnknown_020322A0->timer = 0;
+ }
+ gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA;
+ break;
+ case 24:
+ if (++gUnknown_020322A0->timer > 20)
+ {
+ sub_807AB28();
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 25:
+ if (gSprites[gUnknown_020322A0->unk_91].animEnded)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND |
+ BLDCNT_TGT2_BG1 |
+ BLDCNT_TGT2_BG2);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4));
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 26:
+ if (--gUnknown_020322A0->bg1vofs == 316)
+ {
+ gUnknown_020322A0->state++;
+ }
+ if (gUnknown_020322A0->bg1vofs == 328)
+ {
+ gUnknown_020322A0->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0);
+ }
+ break;
+ case 27:
+ gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 128, 80, 3);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 128, 80, 0);
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1);
+ gUnknown_020322A0->state++;
+ break;
+ case 28:
+ if ((gUnknown_020322A0->bg1vofs -= 2) == 166)
+ {
+ gUnknown_020322A0->state = 200;
+ }
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ break;
+ case 200:
+ gSprites[gUnknown_020322A0->unk_90].pos1.y -= 2;
+ gSprites[gUnknown_020322A0->unk_91].pos1.y -= 2;
+ if (gSprites[gUnknown_020322A0->unk_90].pos1.y < -8)
+ {
+ gUnknown_020322A0->state = 29;
+ }
+ break;
+ case 29:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state = 30;
+ break;
+ case 30:
+ if (!gPaletteFade.active)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ sub_807B62C(2);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 31:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->unk_90 = CreateSprite(&gSpriteTemplate_8338DC8, 111, 170, 0);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 129, -10, 0);
+ gUnknown_020322A0->state++;
+ break;
+ case 32:
+ if (!gPaletteFade.active)
+ {
+ PlaySE(SE_TK_WARPOUT);
+ gUnknown_020322A0->state++;
+ }
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ break;
+ case 33:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -90)
+ {
+ gSprites[gUnknown_020322A0->unk_90].data[1] = 1;
+ gSprites[gUnknown_020322A0->unk_91].data[1] = 1;
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 34:
+ BlendPalettes(0x1, 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 35:
+ BlendPalettes(0x1, 0, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 36:
+ BlendPalettes(0x1, 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 37:
+ if (!IsMonSpriteNotFlipped(gUnknown_020322A0->tradeSpecies[0]))
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8338ECC;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.affineMode = 3;
+ CalcCenterToCornerVec(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0, 3, 3);
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0);
+ }
+ else
+ {
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0);
+ }
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0);
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.x = 60;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 180;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.y = 192;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = -32;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = FALSE;
+ gUnknown_020322A0->state++;
+ break;
+ case 38:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y >= -163)
+ {
+ PlaySE(SE_TK_WARPIN);
+ }
+ if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -222)
+ {
+ gSprites[gUnknown_020322A0->unk_90].data[1] = 0;
+ gSprites[gUnknown_020322A0->unk_91].data[1] = 0;
+ gUnknown_020322A0->state++;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = TRUE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = TRUE;
+ BlendPalettes(0x1, 0, RGB_WHITEALPHA);
+ }
+ break;
+ case 39:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -222)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ }
+ break;
+ case 40:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state++;
+ sub_807B62C(1);
+ gUnknown_020322A0->bg1vofs = 166;
+ gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 128, -20, 3);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 128, -20, 0);
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1);
+ }
+ break;
+ case 41:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 42:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 43:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y += 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y + gSprites[gUnknown_020322A0->unk_90].pos1.y == 64)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 44:
+ if ((gUnknown_020322A0->bg1vofs += 2) > 316)
+ {
+ gUnknown_020322A0->bg1vofs = 316;
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 45:
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ gUnknown_020322A0->state++;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 46:
+ if (++gUnknown_020322A0->timer == 10)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 47:
+ if (++gUnknown_020322A0->bg1vofs > 348)
+ {
+ gUnknown_020322A0->bg1vofs = 348;
+ gUnknown_020322A0->state++;
+ }
+ if (gUnknown_020322A0->bg1vofs == 328 && gUnknown_020322A0->unk_FA)
+ {
+ gUnknown_020322A0->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0);
+ gSprites[gUnknown_020322A0->unk_92].callback = sub_807AAE0;
+ }
+ break;
+ case 48:
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
+ gUnknown_020322A0->state = 50;
+ break;
+ case 50:
+ if (gSprites[gUnknown_020322A0->unk_91].animEnded)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ sub_807B62C(6);
+ gUnknown_020322A0->state++;
+ PlaySE(SE_W028);
+ }
+ break;
+ case 51:
+ if (gUnknown_020322A0->unk_EA < 0x400)
+ {
+ gUnknown_020322A0->unk_EA += 0x34;
+ }
+ else
+ {
+ gUnknown_020322A0->unk_EA = 0x400;
+ gUnknown_020322A0->state++;
+ }
+ gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA;
+ break;
+ case 52:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state = 60;
+ break;
+
+ case 60:
+ if (!gPaletteFade.active)
+ {
+ sub_807B62C(5);
+ sub_807B62C(7);
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 61:
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 62:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 63:
+ gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, -8, 0);
+ gSprites[gUnknown_020322A0->unk_D3].data[3] = 74;
+ gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E6AC;
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_D3], 1);
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->unk_D3], 2);
+ BlendPalettes(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 64:
+ BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 65:
+ if (gSprites[gUnknown_020322A0->unk_D3].callback == SpriteCallbackDummy)
+ {
+ HandleLoadSpecialPokePic_2(&gMonFrontPicTable[gUnknown_020322A0->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], gUnknown_020322A0->tradeSpecies[1], gUnknown_020322A0->unk_68[1]);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 66:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 120;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[1]].y_offset + 60;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.x = 0;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y = 0;
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0);
+ CreatePokeballSpriteToReleaseMon(gUnknown_020322A0->pokePicSpriteIdxs[1], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, gUnknown_020322A0->tradeSpecies[1]);
+ FreeSpriteOamMatrix(&gSprites[gUnknown_020322A0->unk_D3]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_D3]);
+ gUnknown_020322A0->state++;
+ break;
+ case 67:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG0_ON |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ StringExpandPlaceholders(gStringVar4, gText_XSentOverY);
+ sub_807F1A8(0, gStringVar4, 0);
+ gUnknown_020322A0->state = 167;
+ gUnknown_020322A0->timer = 0;
+ break;
+ // 167 and 267 are extra cases added in for animations
+ case 167:
+ if (++gUnknown_020322A0->timer > 60)
+ {
+ gUnknown_020322A0->state = 267;
+ gUnknown_020322A0->timer = 0;
+ }
+ break;
+ case 267:
+ if (IsCryFinished())
+ {
+ gUnknown_020322A0->state = 68;
+ }
+ break;
+ case 68:
+ if (++gUnknown_020322A0->timer == 10)
+ {
+ PlayFanfare(MUS_FANFA5);
+ }
+ if (gUnknown_020322A0->timer == 250)
+ {
+ gUnknown_020322A0->state++;
+ StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX);
+ sub_807F1A8(0, gStringVar4, 0);
+ gUnknown_020322A0->timer = 0;
+ }
+ break;
+ case 69:
+ if (++gUnknown_020322A0->timer == 60)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 70:
+ sub_807F14C();
+ gUnknown_020322A0->state++;
+ break;
+ case 71:
+ if (gUnknown_020322A0->isLinkTrade)
+ {
+ return TRUE;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 72: // Only if in-game trade
+ sub_807B4D0(gSpecialVar_0x8005, 0);
+ gCB2_AfterEvolution = sub_807B60C;
+ evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_02032298[0]], TRUE, ITEM_NONE);
+ if (evoTarget != SPECIES_NONE)
+ {
+ TradeEvolutionScene(&gPlayerParty[gUnknown_02032298[0]], evoTarget, gUnknown_020322A0->pokePicSpriteIdxs[1], gUnknown_02032298[0]);
+ }
+ gUnknown_020322A0->state++;
+ break;
+ case 73:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 74:
+ if (!gPaletteFade.active)
+ {
+ PlayNewMapMusic(gUnknown_020322A0->cachedMapMusic);
+ if (gUnknown_020322A0)
+ {
+ FreeAllWindowBuffers();
+ Free(GetBgTilemapBuffer(3));
+ Free(GetBgTilemapBuffer(1));
+ Free(GetBgTilemapBuffer(0));
+ FreeMonSpritesGfx();
+ FREE_AND_SET_NULL(gUnknown_020322A0);
+ }
+ SetMainCallback2(CB2_ReturnToField);
+ sub_807E784();
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static bool8 sub_807CFC8(void)
+{
+ u16 evoTarget;
+
+ switch (gUnknown_020322A0->state)
+ {
+ case 0:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = -180;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[0]].y_offset;
+ gUnknown_020322A0->state++;
+ gUnknown_020322A0->cachedMapMusic = GetCurrentMapMusic();
+ PlayNewMapMusic(MUS_SHINKA);
+ break;
+ case 1:
+ if (gUnknown_020322A0->bg2hofs > 0)
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x += 3;
+ gUnknown_020322A0->bg2hofs -= 3;
+ }
+ else
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.x = 0;
+ gUnknown_020322A0->bg2hofs = 0;
+ gUnknown_020322A0->state = 10;
+ }
+ break;
+ case 10:
+ StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY);
+ sub_807F1A8(0, gStringVar4, 0);
+
+ if (gUnknown_020322A0->tradeSpecies[0] != SPECIES_EGG)
+ {
+ PlayCry1(gUnknown_020322A0->tradeSpecies[0], 0);
+ }
+
+ gUnknown_020322A0->state = 11;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 11:
+ if (++gUnknown_020322A0->timer == 80)
+ {
+ gUnknown_020322A0->unk_D2 = sub_807671C(gUnknown_020322A0->pokePicSpriteIdxs[0], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff);
+ gUnknown_020322A0->state++;
+ StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1);
+ sub_807F1A8(0, gStringVar4, 0);
+ }
+ break;
+ case 12:
+ if (gSprites[gUnknown_020322A0->unk_D2].callback == SpriteCallbackDummy)
+ {
+ gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0);
+ gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E5D8;
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_D2]);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 13:
+ // The game waits here for the sprite to finish its animation sequence.
+ break;
+ case 14:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state = 20;
+ break;
+ case 20:
+ if (!gPaletteFade.active)
+ {
+ sub_807B62C(4);
+ FillWindowPixelBuffer(0, 0xFF);
+ CopyWindowToVram(0, 3);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 21:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 22:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state = 23;
+ }
+ break;
+ case 23:
+ if (gUnknown_020322A0->unk_EA > 0x100)
+ {
+ gUnknown_020322A0->unk_EA -= 0x34;
+ }
+ else
+ {
+ sub_807B62C(1);
+ gUnknown_020322A0->unk_EA = 0x80;
+ gUnknown_020322A0->state = 124;
+ gUnknown_020322A0->timer = 0;
+ }
+ gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA;
+ break;
+ case 124:
+ if (++gUnknown_020322A0->timer > 20)
+ {
+ sub_807B62C(3);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E8C, 120, 80, 0);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 125:
+ if (gSprites[gUnknown_020322A0->unk_91].animEnded)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 |
+ BLDCNT_TGT1_OBJ |
+ BLDCNT_EFFECT_BLEND |
+ BLDCNT_TGT2_BG2);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4));
+ CreateTask(c3_08054588, 5);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 126:
+ if (!FuncIsActiveTask(c3_08054588))
+ {
+ gUnknown_020322A0->state = 26;
+ }
+ break;
+ case 26:
+ if (--gUnknown_020322A0->bg1vofs == 316)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 27:
+ gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 120, 80, 3);
+ gSprites[gUnknown_020322A0->unk_90].callback = sub_807AA4C;
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 120, 80, 0);
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1);
+ gUnknown_020322A0->state++;
+ break;
+ case 28:
+ if ((gUnknown_020322A0->bg1vofs -= 3) == 166)
+ {
+ gUnknown_020322A0->state = 200;
+ }
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ break;
+ case 200:
+ gSprites[gUnknown_020322A0->unk_90].pos1.y -= 2;
+ gSprites[gUnknown_020322A0->unk_91].pos1.y -= 2;
+ if (gSprites[gUnknown_020322A0->unk_90].pos1.y < -8)
+ {
+ gUnknown_020322A0->state = 29;
+ }
+ break;
+ case 29:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state = 30;
+ break;
+ case 30:
+ if (!gPaletteFade.active)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ sub_807B62C(2);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 31:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->unk_90 = CreateSprite(&gSpriteTemplate_8338DC8, 111, 170, 0);
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 129, -10, 0);
+ gUnknown_020322A0->state++;
+ break;
+ case 32:
+ if (!gPaletteFade.active)
+ {
+ PlaySE(SE_TK_WARPOUT);
+ gUnknown_020322A0->state++;
+ }
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ break;
+ case 33:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -90)
+ {
+ gSprites[gUnknown_020322A0->unk_90].data[1] = 1;
+ gSprites[gUnknown_020322A0->unk_91].data[1] = 1;
+ gUnknown_020322A0->state++;
+ CreateTask(c3_0805465C, 5);
+ }
+ break;
+ case 34:
+ BlendPalettes(0x8, 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 35:
+ BlendPalettes(0x8, 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 36:
+ BlendPalettes(0x8, 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 37:
+ if (!IsMonSpriteNotFlipped(gUnknown_020322A0->tradeSpecies[0]))
+ {
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8338ECC;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].oam.affineMode = 3;
+ CalcCenterToCornerVec(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0, 3, 3);
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0);
+ }
+ else
+ {
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]], 0);
+ }
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0);
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.x = 40;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 200;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos1.y = 192;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = -32;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = FALSE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = FALSE;
+ gUnknown_020322A0->state++;
+ break;
+ case 38:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -160 && gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y >= -163)
+ {
+ PlaySE(SE_TK_WARPIN);
+ }
+ if (gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].pos2.y < -222)
+ {
+ gSprites[gUnknown_020322A0->unk_90].data[1] = 0;
+ gSprites[gUnknown_020322A0->unk_91].data[1] = 0;
+ gUnknown_020322A0->state++;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]].invisible = TRUE;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].invisible = TRUE;
+ CreateTask(sub_807F39C, 5);
+ }
+ break;
+ case 39:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y -= 3;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 3;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y <= -222)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ }
+ break;
+ case 40:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state++;
+ sub_807B62C(1);
+ gUnknown_020322A0->bg1vofs = 166;
+ sub_807B62C(3);
+ gUnknown_020322A0->bg2vofs = 412;
+ gUnknown_020322A0->unk_90 = CreateSprite(&gUnknown_08338D88, 120, -20, 3);
+ gSprites[gUnknown_020322A0->unk_90].callback = sub_807AA4C;
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338DC8, 120, -20, 0);
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_91], 1);
+ }
+ break;
+ case 41:
+ BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 42:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_OBJ_ON);
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 43:
+ gSprites[gUnknown_020322A0->unk_90].pos2.y += 4;
+ gSprites[gUnknown_020322A0->unk_91].pos2.y += 4;
+ if (gSprites[gUnknown_020322A0->unk_90].pos2.y + gSprites[gUnknown_020322A0->unk_90].pos1.y == 64)
+ {
+ gUnknown_020322A0->state = 144;
+ gUnknown_020322A0->timer = 0;
+ }
+ break;
+ case 144:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG1_ON |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ gUnknown_020322A0->bg1vofs += 3;
+ gUnknown_020322A0->bg2vofs += 3;
+ if (++gUnknown_020322A0->timer == 10)
+ {
+ u8 taskId = CreateTask(c3_08054588, 5);
+ gTasks[taskId].data[2] = 1;
+ }
+ if (gUnknown_020322A0->bg1vofs > 316)
+ {
+ gUnknown_020322A0->bg1vofs = 316;
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 145:
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_90]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ gUnknown_020322A0->state++;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 146:
+ if (!FuncIsActiveTask(c3_08054588))
+ {
+ gUnknown_020322A0->state = 46;
+ gUnknown_020322A0->timer = 0;
+ }
+ break;
+ case 46:
+ if (++gUnknown_020322A0->timer == 10)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 47:
+ if (++gUnknown_020322A0->bg1vofs > 348)
+ {
+ gUnknown_020322A0->bg1vofs = 348;
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 48:
+ gUnknown_020322A0->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0);
+ gUnknown_020322A0->state = 50;
+ break;
+ case 50:
+ if (gSprites[gUnknown_020322A0->unk_91].animEnded)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_91]);
+ sub_807B62C(6);
+ gUnknown_020322A0->state++;
+ PlaySE(SE_W028);
+ }
+ break;
+ case 51:
+ if (gUnknown_020322A0->unk_EA < 0x400)
+ {
+ gUnknown_020322A0->unk_EA += 0x34;
+ }
+ else
+ {
+ gUnknown_020322A0->unk_EA = 0x400;
+ gUnknown_020322A0->state++;
+ }
+ gUnknown_020322A0->unk_E8 = 0x8000 / gUnknown_020322A0->unk_EA;
+ break;
+ case 52:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state = 60;
+ break;
+ case 60:
+ if (!gPaletteFade.active)
+ {
+ sub_807B62C(5);
+ sub_807B62C(7);
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 61:
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 62:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ if (!gPaletteFade.active)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 63:
+ gUnknown_020322A0->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, -8, 0);
+ gSprites[gUnknown_020322A0->unk_D3].data[3] = 74;
+ gSprites[gUnknown_020322A0->unk_D3].callback = sub_807E6AC;
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->unk_D3], 1);
+ StartSpriteAffineAnim(&gSprites[gUnknown_020322A0->unk_D3], 2);
+ BlendPalettes(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 64:
+ BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_020322A0->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA);
+ gUnknown_020322A0->state++;
+ break;
+ case 65:
+ if (gSprites[gUnknown_020322A0->unk_D3].callback == SpriteCallbackDummy)
+ {
+ HandleLoadSpecialPokePic_2(&gMonFrontPicTable[gUnknown_020322A0->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], gUnknown_020322A0->tradeSpecies[1], gUnknown_020322A0->unk_68[1]);
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 66:
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.x = 120;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_020322A0->tradeSpecies[1]].y_offset + 60;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.x = 0;
+ gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].pos2.y = 0;
+ StartSpriteAnim(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]], 0);
+ CreatePokeballSpriteToReleaseMon(gUnknown_020322A0->pokePicSpriteIdxs[1], gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, gUnknown_020322A0->tradeSpecies[1]);
+ FreeSpriteOamMatrix(&gSprites[gUnknown_020322A0->unk_D3]);
+ DestroySprite(&gSprites[gUnknown_020322A0->unk_D3]);
+ gUnknown_020322A0->state++;
+ break;
+ case 67:
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_BG0_ON |
+ DISPCNT_BG2_ON |
+ DISPCNT_OBJ_ON);
+ StringExpandPlaceholders(gStringVar4, gText_XSentOverY);
+ sub_807F1A8(0, gStringVar4, 0);
+ gUnknown_020322A0->state = 167;
+ gUnknown_020322A0->timer = 0;
+ break;
+ // 167 and 267 are extra cases added in for animations
+ case 167:
+ if (++gUnknown_020322A0->timer > 60)
+ {
+ gUnknown_020322A0->state = 267;
+ gUnknown_020322A0->timer = 0;
+ }
+ break;
+ case 267:
+ if (IsCryFinished())
+ {
+ gUnknown_020322A0->state = 68;
+ }
+ break;
+ case 68:
+ if (++gUnknown_020322A0->timer == 10)
+ {
+ PlayFanfare(MUS_FANFA5);
+ }
+ if (gUnknown_020322A0->timer == 250)
+ {
+ gUnknown_020322A0->state++;
+ StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX);
+ sub_807F1A8(0, gStringVar4, 0);
+ gUnknown_020322A0->timer = 0;
+ }
+ break;
+ case 69:
+ if (++gUnknown_020322A0->timer == 60)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 70:
+ sub_807F14C();
+ gUnknown_020322A0->state++;
+ break;
+ case 71:
+ if (gUnknown_020322A0->isLinkTrade)
+ {
+ return TRUE;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_020322A0->state++;
+ }
+ break;
+ case 72: // Only if in-game trade
+ sub_807B4D0(gSpecialVar_0x8005, 0);
+ gCB2_AfterEvolution = sub_807B60C;
+ evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_02032298[0]], TRUE, ITEM_NONE);
+ if (evoTarget != SPECIES_NONE)
+ {
+ TradeEvolutionScene(&gPlayerParty[gUnknown_02032298[0]], evoTarget, gUnknown_020322A0->pokePicSpriteIdxs[1], gUnknown_02032298[0]);
+ }
+ gUnknown_020322A0->state++;
+ break;
+ case 73:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_020322A0->state++;
+ break;
+ case 74:
+ if (!gPaletteFade.active)
+ {
+ PlayNewMapMusic(gUnknown_020322A0->cachedMapMusic);
+ if (gUnknown_020322A0)
+ {
+ FreeAllWindowBuffers();
+ Free(GetBgTilemapBuffer(3));
+ Free(GetBgTilemapBuffer(1));
+ Free(GetBgTilemapBuffer(0));
+ FreeMonSpritesGfx();
+ FREE_AND_SET_NULL(gUnknown_020322A0);
+ }
+ SetMainCallback2(CB2_ReturnToField);
+ sub_807E784();
+ }
+ break;
+ }
+ return FALSE;
+}
+
+static void c2_08053788(void)
+{
+ u16 evoTarget;
+ switch (gMain.state)
+ {
+ case 0:
+ gMain.state = 4;
+ gSoftResetDisabled = TRUE;
+ break;
+ case 4:
+ gCB2_AfterEvolution = sub_807EB50;
+ evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_02032298[0]], TRUE, ITEM_NONE);
+ if (evoTarget != SPECIES_NONE)
+ TradeEvolutionScene(&gPlayerParty[gUnknown_02032298[0]], evoTarget, gUnknown_020322A0->pokePicSpriteIdxs[1], gUnknown_02032298[0]);
+ else if (sub_8077260())
+ SetMainCallback2(sub_807F464);
+ else
+ SetMainCallback2(sub_807EB50);
+ gUnknown_02032298[0] = 255;
+ break;
+ }
+ if (!HasLinkErrorOccurred())
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_807E4DC(void)
+{
+ u8 blockReceivedStatus;
+ sub_807ACDC();
+ blockReceivedStatus = GetBlockReceivedStatus();
+ if (blockReceivedStatus & 0x01)
+ {
+ if (gBlockRecvBuffer[0][0] == 0xDCBA)
+ {
+ SetMainCallback2(c2_08053788);
+ }
+ if (gBlockRecvBuffer[0][0] == 0xABCD)
+ {
+ gUnknown_020322A0->unk_72 = 1;
+ }
+ ResetBlockReceivedFlag(0);
+ }
+ if (blockReceivedStatus & 0x02)
+ {
+ if (gBlockRecvBuffer[1][0] == 0xABCD)
+ {
+ gUnknown_020322A0->unk_73 = 1;
+ }
+ ResetBlockReceivedFlag(1);
+ }
+}
+
+static void sub_807E55C(struct Sprite *sprite)
+{
+ sprite->pos1.y += sprite->data[0] / 10;
+ sprite->data[5] += sprite->data[1];
+ sprite->pos1.x = sprite->data[5] / 10;
+ if (sprite->pos1.y > 0x4c)
+ {
+ sprite->pos1.y = 0x4c;
+ sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100;
+ sprite->data[3] ++;
+ }
+ if (sprite->pos1.x == 0x78)
+ sprite->data[1] = 0;
+ sprite->data[0] += sprite->data[4];
+ if (sprite->data[3] == 4)
+ {
+ sprite->data[7] = 1;
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_807E5D8(struct Sprite *sprite)
+{
+ sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]];
+ if (sprite->data[0] == 22)
+ PlaySE(SE_KON);
+ if (++ sprite->data[0] == 44)
+ {
+ PlaySE(SE_W025);
+ sprite->callback = sub_807E64C;
+ sprite->data[0] = 0;
+ BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, RGB_WHITEALPHA);
+ }
+}
+
+static void sub_807E64C(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 20)
+ StartSpriteAffineAnim(sprite, 1);
+ if (++ sprite->data[1] > 20)
+ {
+ sprite->pos2.y -= gTradeBallVerticalVelocityTable[sprite->data[0]];
+ if (++ sprite->data[0] == 23)
+ {
+ DestroySprite(sprite);
+ gUnknown_020322A0->state = 14; // Resume the master trade animation
+ }
+ }
+}
+
+static void sub_807E6AC(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ if ((sprite->pos1.y += 4) > sprite->data[3])
+ {
+ sprite->data[2] ++;
+ sprite->data[0] = 0x16;
+ PlaySE(SE_KON);
+ }
+ }
+ else
+ {
+ if (sprite->data[0] == 0x42)
+ PlaySE(SE_KON2);
+ if (sprite->data[0] == 0x5c)
+ PlaySE(SE_KON3);
+ if (sprite->data[0] == 0x6b)
+ PlaySE(SE_KON4);
+ sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]];
+ if (++sprite->data[0] == 0x6c)
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+u16 GetInGameTradeSpeciesInfo(void)
+{
+ const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004];
+ StringCopy(gStringVar1, gSpeciesNames[inGameTrade->playerSpecies]);
+ StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]);
+ return inGameTrade->playerSpecies;
+}
+
+static void sub_807E784(void)
+{
+ u8 nickname[32];
+ const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004];
+ GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname);
+ StringCopy10(gStringVar1, nickname);
+ StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]);
+}
+
+static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade)
+{
+ const struct InGameTrade *inGameTrade = &gIngameTrades[whichInGameTrade];
+ u8 level = GetMonData(&gPlayerParty[whichPlayerMon], MON_DATA_LEVEL);
+
+ struct MailStruct mail;
+ u8 metLocation = 0xFE;
+ u8 isMail;
+ struct Pokemon *pokemon = &gEnemyParty[0];
+
+ CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId);
+
+ SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]);
+ SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]);
+ SetMonData(pokemon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]);
+ SetMonData(pokemon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]);
+ SetMonData(pokemon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]);
+ SetMonData(pokemon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]);
+ SetMonData(pokemon, MON_DATA_NICKNAME, inGameTrade->name);
+ SetMonData(pokemon, MON_DATA_OT_NAME, inGameTrade->otName);
+ SetMonData(pokemon, MON_DATA_OT_GENDER, &inGameTrade->otGender);
+ SetMonData(pokemon, MON_DATA_ALT_ABILITY, &inGameTrade->secondAbility);
+ SetMonData(pokemon, MON_DATA_BEAUTY, &inGameTrade->stats[1]);
+ SetMonData(pokemon, MON_DATA_CUTE, &inGameTrade->stats[2]);
+ SetMonData(pokemon, MON_DATA_COOL, &inGameTrade->stats[0]);
+ SetMonData(pokemon, MON_DATA_SMART, &inGameTrade->stats[3]);
+ SetMonData(pokemon, MON_DATA_TOUGH, &inGameTrade->stats[4]);
+ SetMonData(pokemon, MON_DATA_SHEEN, &inGameTrade->sheen);
+ SetMonData(pokemon, MON_DATA_MET_LOCATION, &metLocation);
+
+ isMail = FALSE;
+ if (inGameTrade->heldItem != ITEM_NONE)
+ {
+ if (ItemIsMail(inGameTrade->heldItem))
+ {
+ sub_807E974(&mail, inGameTrade);
+ gUnknown_020321C0[0] = mail;
+ SetMonData(pokemon, MON_DATA_MAIL, &isMail);
+ SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem);
+ }
+ else
+ {
+ SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem);
+ }
+ }
+ CalculateMonStats(&gEnemyParty[0]);
+}
+
+static void sub_807E974(struct MailStruct *mail, const struct InGameTrade *trade) {
+ s32 i;
+
+ for (i = 0; i < 9; i++)
+ {
+ mail->words[i] = gIngameTradeMail[trade->mailNum][i];
+ }
+
+ StringCopy(mail->playerName, trade->otName);
+ PadNameString(mail->playerName, CHAR_SPACE);
+
+ mail->trainerId[0] = trade->otId >> 24;
+ mail->trainerId[1] = trade->otId >> 16;
+ mail->trainerId[2] = trade->otId >> 8;
+ mail->trainerId[3] = trade->otId;
+ mail->species = trade->species;
+ mail->itemId = trade->heldItem;
+}
+
+u16 GetTradeSpecies(void)
+{
+ if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG))
+ return SPECIES_NONE;
+ return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES);
+}
+
+void CreateInGameTradePokemon(void)
+{
+ _CreateInGameTradePokemon(gSpecialVar_0x8005, gSpecialVar_0x8004);
+}
+
+static void sub_807EA2C(void)
+{
+ if (sub_807BBC8() == TRUE)
+ {
+ DestroySprite(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[0]]);
+ FreeSpriteOamMatrix(&gSprites[gUnknown_020322A0->pokePicSpriteIdxs[1]]);
+ sub_807B4D0(gUnknown_02032298[0], gUnknown_02032298[1] % 6);
+ if (!sub_8077260())
+ {
+ gUnknown_020322A0->linkData[0] = 0xABCD;
+ gUnknown_020322A0->unk_93 = 1;
+ }
+ SetMainCallback2(sub_807EACC);
+ }
+ sub_807B5B8();
+ sub_807E4DC();
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_807EACC(void)
+{
+ u8 mpId = sub_807ACDC();
+ if (sub_8077260())
+ {
+ SetMainCallback2(c2_08053788);
+ }
+ else
+ {
+ sub_807E4DC();
+ if (mpId == 0 && gUnknown_020322A0->unk_72 == 1 && gUnknown_020322A0->unk_73 == 1)
+ {
+ gUnknown_020322A0->linkData[0] = 0xDCBA;
+ Trade_SendData(gUnknown_020322A0);
+ gUnknown_020322A0->unk_72 = 2;
+ gUnknown_020322A0->unk_73 = 2;
+ }
+ }
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void sub_807EB50(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ gMain.state++;
+ StringExpandPlaceholders(gStringVar4, gText_CommunicationStandby5);
+ sub_807F1A8(0, gStringVar4, 0);
+ break;
+ case 1:
+ sub_8077288(0);
+ gMain.state = 100;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 100:
+ if (++gUnknown_020322A0->timer > 180)
+ {
+ gMain.state = 101;
+ gUnknown_020322A0->timer = 0;
+ }
+ if (_IsLinkTaskFinished())
+ {
+ gMain.state = 2;
+ }
+ break;
+ case 101:
+ if (_IsLinkTaskFinished())
+ {
+ gMain.state = 2;
+ }
+ break;
+ case 2:
+ gMain.state = 50;
+ StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffPower);
+ sub_807F1A8(0, gStringVar4, 0);
+ break;
+ case 50:
+ if (!InUnionRoom())
+ IncrementGameStat(GAME_STAT_POKEMON_TRADES);
+ if (gWirelessCommType)
+ {
+ sub_801B990(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ }
+ SetContinueGameWarpStatusToDynamicWarp();
+ sub_8153380();
+ gMain.state++;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 51:
+ if (++gUnknown_020322A0->timer == 5)
+ {
+ gMain.state++;
+ }
+ break;
+ case 52:
+ if (sub_81533AC())
+ {
+ ClearContinueGameWarpStatus2();
+ gMain.state = 4;
+ }
+ else
+ {
+ gUnknown_020322A0->timer = 0;
+ gMain.state = 51;
+ }
+ break;
+ case 4:
+ sub_81533E0();
+ gMain.state = 40;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 40:
+ if (++gUnknown_020322A0->timer > 50)
+ {
+ if (GetMultiplayerId() == 0)
+ {
+ gUnknown_020322A0->timer = Random() % 30;
+ }
+ else
+ {
+ gUnknown_020322A0->timer = 0;
+ }
+ gMain.state = 41;
+ }
+ break;
+ case 41:
+ if (gUnknown_020322A0->timer == 0)
+ {
+ sub_8077288(1);
+ gMain.state = 42;
+ }
+ else
+ {
+ gUnknown_020322A0->timer--;
+ }
+ break;
+ case 42:
+ if (_IsLinkTaskFinished())
+ {
+ sub_8153408();
+ gMain.state = 5;
+ }
+ break;
+ case 5:
+ if (++gUnknown_020322A0->timer > 60)
+ {
+ gMain.state++;
+ sub_8077288(2);
+ }
+ break;
+ case 6:
+ if (_IsLinkTaskFinished())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gMain.state ++;
+ }
+ break;
+ case 7:
+ if (!gPaletteFade.active)
+ {
+ FadeOutBGM(3);
+ gMain.state++;
+ }
+ break;
+ case 8:
+ if (IsBGMStopped() == TRUE)
+ {
+ if (gWirelessCommType && gMain.savedCallback == sub_80773AC)
+ {
+ sub_8077288(3);
+ }
+ else
+ {
+ sub_800AC34();
+ }
+ gMain.state++;
+ }
+ break;
+ case 9:
+ if (gWirelessCommType && gMain.savedCallback == sub_80773AC)
+ {
+ if (_IsLinkTaskFinished())
+ {
+ gSoftResetDisabled = FALSE;
+ SetMainCallback2(c2_080543C4);
+ }
+ }
+ else if (!gReceivedRemoteLinkPlayers)
+ {
+ gSoftResetDisabled = FALSE;
+ SetMainCallback2(c2_080543C4);
+ }
+ break;
+ }
+ if (!HasLinkErrorOccurred())
+ {
+ RunTasks();
+ }
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void c2_080543C4(void)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ Free(GetBgTilemapBuffer(3));
+ Free(GetBgTilemapBuffer(1));
+ Free(GetBgTilemapBuffer(0));
+ FreeMonSpritesGfx();
+ FREE_AND_SET_NULL(gUnknown_020322A0);
+ if (gWirelessCommType)
+ sub_800E084();
+ SetMainCallback2(gMain.savedCallback);
+ }
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void DoInGameTradeScene(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(sub_807F110, 10);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+}
+
+static void sub_807F110(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(sub_807B270);
+ gFieldCallback = sub_80AF168;
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_807F14C(void)
+{
+ u8 i;
+ u8 numRibbons = 0;
+ for (i = 0; i < 12; i ++)
+ {
+ numRibbons += GetMonData(&gEnemyParty[gUnknown_02032298[1] % 6], MON_DATA_CHAMPION_RIBBON + i);
+ }
+ if (numRibbons != 0)
+ FlagSet(FLAG_SYS_RIBBON_GET);
+}
+
+void sub_807F19C(void)
+{
+ sub_807B170();
+}
+
+void sub_807F1A8(u8 windowId, const u8 *str, u8 speed)
+{
+ FillWindowPixelBuffer(windowId, 0xFF);
+ gUnknown_020322A0->unk_F6[0] = 15;
+ gUnknown_020322A0->unk_F6[1] = 1;
+ gUnknown_020322A0->unk_F6[2] = 6;
+ AddTextPrinterParameterized4(windowId, 1, 0, 2, 0, 0, gUnknown_020322A0->unk_F6, speed, str);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void c3_08054588(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ u16 unk = gUnknown_08339090[data[0]][0] * 16;
+
+ if (!data[2])
+ {
+ if (unk == 0x100)
+ LoadPalette(gUnknown_08337EA0, 0x30, 32);
+ else
+ LoadPalette(&gUnknown_08337AA0[unk], 0x30, 32);
+ }
+ else
+ {
+ if (unk == 0x100)
+ LoadPalette(gUnknown_08337EA0, 0x30, 32);
+ else
+ LoadPalette(&gUnknown_08337CA0[unk], 0x30, 32);
+ }
+
+ if (gUnknown_08339090[data[0]][0] == 0 && data[1] == 0)
+ PlaySE(SE_W215);
+
+ if (data[1] == gUnknown_08339090[data[0]][1])
+ {
+ data[0]++;
+ data[1] = 0;
+ if (gUnknown_08339090[data[0]][1] == 0xFF)
+ {
+ DestroyTask(taskId);
+ }
+ }
+ else
+ {
+ data[1]++;
+ }
+}
+
+static void c3_0805465C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ gUnknown_020322A0->unk_FB = gUnknown_020322A0->unk_FD = 120;
+ gUnknown_020322A0->unk_FC = 0;
+ gUnknown_020322A0->unk_FE = 160;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |
+ WININ_WIN0_BG1 |
+ WININ_WIN0_OBJ);
+ }
+
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(gUnknown_020322A0->unk_FB, gUnknown_020322A0->unk_FD));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(gUnknown_020322A0->unk_FC, gUnknown_020322A0->unk_FE));
+
+ data[0]++;
+ gUnknown_020322A0->unk_FB -= 5;
+ gUnknown_020322A0->unk_FD += 5;
+
+ if (gUnknown_020322A0->unk_FB < 80)
+ {
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_807F39C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ gUnknown_020322A0->unk_FB = 80;
+ gUnknown_020322A0->unk_FD = 160;
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |
+ WININ_WIN0_BG1 |
+ WININ_WIN0_OBJ);
+ }
+
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(gUnknown_020322A0->unk_FB, gUnknown_020322A0->unk_FD));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(gUnknown_020322A0->unk_FC, gUnknown_020322A0->unk_FE));
+
+ if (gUnknown_020322A0->unk_FB != 120)
+ {
+ data[0]++;
+ gUnknown_020322A0->unk_FB += 5;
+ gUnknown_020322A0->unk_FD -= 5;
+
+ if (gUnknown_020322A0->unk_FB >= 116)
+ BlendPalettes(0x8, 0, RGB_WHITEALPHA);
+ }
+ else
+ {
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_807F464(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ gMain.state = 1;
+ StringExpandPlaceholders(gStringVar4, gText_CommunicationStandby5);
+ sub_807F1A8(0, gStringVar4, 0);
+ break;
+ case 1:
+ sub_8077288(0);
+ gMain.state = 2;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 2:
+ if (_IsLinkTaskFinished())
+ {
+ gMain.state = 3;
+ StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffPower);
+ sub_807F1A8(0, gStringVar4, 0);
+ IncrementGameStat(GAME_STAT_POKEMON_TRADES);
+ sub_8153380();
+ gUnknown_020322A0->timer = 0;
+ }
+ break;
+ case 3:
+ if (++gUnknown_020322A0->timer == 5)
+ {
+ gMain.state = 4;
+ }
+ break;
+ case 4:
+ if (sub_81533AC())
+ {
+ gMain.state = 5;
+ }
+ else
+ {
+ gUnknown_020322A0->timer = 0;
+ gMain.state = 3;
+ }
+ break;
+ case 5:
+ sub_81533E0();
+ gMain.state = 6;
+ gUnknown_020322A0->timer = 0;
+ break;
+ case 6:
+ if (++gUnknown_020322A0->timer > 10)
+ {
+ if (GetMultiplayerId() == 0)
+ {
+ gUnknown_020322A0->timer = Random() % 30;
+ }
+ else
+ {
+ gUnknown_020322A0->timer = 0;
+ }
+ gMain.state = 7;
+ }
+ break;
+ case 7:
+ if (gUnknown_020322A0->timer == 0)
+ {
+ sub_8077288(1);
+ gMain.state = 8;
+ }
+ else
+ {
+ gUnknown_020322A0->timer--;
+ }
+ break;
+ case 8:
+ if (_IsLinkTaskFinished())
+ {
+ sub_8153408();
+ gMain.state = 9;
+ }
+ break;
+ case 9:
+ if (++gUnknown_020322A0->timer > 60)
+ {
+ gMain.state++;
+ sub_8077288(2);
+ }
+ break;
+ case 10:
+ if (_IsLinkTaskFinished())
+ {
+ FadeOutBGM(3);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gMain.state = 11;
+ }
+ break;
+ case 11:
+ if (!gPaletteFade.active && IsBGMStopped() == TRUE)
+ {
+ sub_8077288(3);
+ gMain.state = 12;
+ }
+ break;
+ case 12:
+ if (_IsLinkTaskFinished())
+ {
+ gSoftResetDisabled = FALSE;
+ SetMainCallback2(c2_080543C4);
+ }
+ break;
+ }
+
+ if (!HasLinkErrorOccurred())
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c
index f5354a1e8..5ddae218b 100644
--- a/src/trainer_pokemon_sprites.c
+++ b/src/trainer_pokemon_sprites.c
@@ -115,7 +115,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8
else
{
sCreatingSpriteTemplate.paletteTag = paletteTag;
- LoadCompressedObjectPalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
+ LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality));
}
}
else
@@ -128,7 +128,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8
else
{
sCreatingSpriteTemplate.paletteTag = paletteTag;
- LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]);
+ LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]);
}
}
}
diff --git a/src/tv.c b/src/tv.c
index 4e7c46a7e..27e2922f4 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -6,6 +6,8 @@
#include "event_data.h"
#include "fieldmap.h"
#include "field_camera.h"
+#include "field_specials.h"
+#include "fldeff.h"
#include "strings.h"
#include "string_util.h"
#include "international_string_util.h"
@@ -24,7 +26,6 @@
#include "event_scripts.h"
#include "shop.h"
#include "lilycove_lady.h"
-#include "rom6.h"
#include "pokedex.h"
#include "event_object_movement.h"
#include "text.h"
@@ -861,13 +862,13 @@ void SetTVMetatilesOnMap(int width, int height, u16 tileId)
void TurnOffTVScreen(void)
{
- SetTVMetatilesOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height, 0x0002);
+ SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0002);
DrawWholeMapView();
}
void TurnOnTVScreen(void)
{
- SetTVMetatilesOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height, 0x0003);
+ SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0003);
DrawWholeMapView();
}
@@ -3469,7 +3470,7 @@ void ChangeBoxPokemonNickname(void)
void ChangeBoxPokemonNickname_CB(void)
{
- SetBoxMonNickFromAnyBox(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2);
+ SetBoxMonNickAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2);
CB2_ReturnToFieldContinueScriptPlayMapMusic();
}
diff --git a/src/unk_pokedex_area_screen_helper.c b/src/unk_pokedex_area_screen_helper.c
index 67fd52cb5..0041d628c 100644
--- a/src/unk_pokedex_area_screen_helper.c
+++ b/src/unk_pokedex_area_screen_helper.c
@@ -22,21 +22,21 @@ void sub_81C4D70(const struct UnkStruct_1C4D70 *template)
if (unk == 0)
{
- SetBgAttribute(template->bg, BG_CTRL_ATTR_WRAPAROUND, 0);
+ SetBgAttribute(template->bg, BG_ATTR_METRIC, 0);
decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861D1A0, 0, template->unk2, unk);
sub_8199D3C(decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861DEF4, 0, 0, 1), template->unk2, 32, 32, unk);
}
else
{
- SetBgAttribute(template->bg, BG_CTRL_ATTR_WRAPAROUND, 2);
- SetBgAttribute(template->bg, 9, 1);
+ SetBgAttribute(template->bg, BG_ATTR_METRIC, 2);
+ SetBgAttribute(template->bg, BG_ATTR_TYPE, 1);
decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861E208, 0, template->unk2, 0);
sub_8199D3C(decompress_and_copy_tile_data_to_vram(template->bg, gUnknown_0861EF64, 0, 0, 1), template->unk2, 64, 64, 1);
}
ChangeBgX(template->bg, 0, 0);
ChangeBgY(template->bg, 0, 0);
- SetBgAttribute(template->bg, BG_CTRL_ATTR_SCREENSIZE, 1);
+ SetBgAttribute(template->bg, BG_ATTR_PALETTEMODE, 1);
CpuCopy32(gUnknown_0861D140, &gPlttBufferUnfaded[0x70], 0x60);
*gUnknown_0203CF28 = template->bg;
}
diff --git a/src/unk_transition.c b/src/unk_transition.c
index 18cee2544..d56998b5b 100644
--- a/src/unk_transition.c
+++ b/src/unk_transition.c
@@ -35,11 +35,13 @@ static bool8 sub_81DB290(struct Task *task);
static bool8 sub_81DB328(struct Task *task);
// const rom data
-// TODO: move those from .s file to .c
-extern const u32 gUnknown_0862AD54[];
-extern const u32 gUnknown_0862AF30[];
-extern const u32 gUnknown_0862B0DC[];
-extern const u16 gUnknown_0862B53C[];
+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. Feel free to delete.
+static const u8 sFiller[0x1C0] = {0};
static const struct OamData sOamData_862B71C =
{
@@ -185,7 +187,7 @@ static void sub_81DA700(void)
LZ77UnCompVram(gUnknown_0862AD54, dst2);
LZ77UnCompVram(gUnknown_0862AF30, dst1);
LoadPalette(gUnknown_0862B53C, 0xF0, 0x20);
- LoadCompressedObjectPic(&sUnknown_0862B724);
+ LoadCompressedSpriteSheet(&sUnknown_0862B724);
LoadSpritePalette(&sUnknown_0862B72C);
}
@@ -335,8 +337,8 @@ static bool8 sub_81DAACC(struct Task *task)
else
{
sub_81DA700();
- SetGpuReg(REG_OFFSET_BLDCNT, 0x3F41);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000);
+ 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);
@@ -366,11 +368,11 @@ static bool8 sub_81DAB4C(struct Task *task)
}
else
{
- u16 var;
+ u16 blnd;
task->data[2]++;
- var = task->data[2];
- SetGpuReg(REG_OFFSET_BLDALPHA, (var) | ((16 - var) << 8));
+ blnd = task->data[2];
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(blnd, 16 - blnd));
}
return FALSE;
diff --git a/src/walda_phrase.c b/src/walda_phrase.c
index ff2ee7399..83004777f 100644
--- a/src/walda_phrase.c
+++ b/src/walda_phrase.c
@@ -7,18 +7,11 @@
#include "text.h"
#include "new_game.h"
#include "overworld.h"
+#include "pokemon_storage_system.h"
+#include "field_screen_effect.h"
extern const u8 gText_Peekaboo[];
-extern u8 *GetWaldaPhrasePtr(void);
-extern bool32 IsWaldaPhraseEmpty(void);
-extern void sub_80AF168(void);
-extern void SetWaldaPhrase(const u8 *src);
-extern void SetWaldaWallpaperPatternId(u8 patternId);
-extern void SetWaldaWallpaperIconId(u8 iconId);
-extern void SetWaldaWallpaperColors(u16 backgroundColor, u16 foregroundColor);
-extern void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked);
-
// this file's functions
static void CB2_HandleGivenWaldaPhrase(void);
static u32 GetWaldaPhraseInputCase(u8 *inputPtr);
diff --git a/src/wallclock.c b/src/wallclock.c
index 5c8d920e7..546750ba6 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -585,11 +585,11 @@ static void WallClockVblankCallback(void)
static void LoadWallClockGraphics(void)
{
SetVBlankCallback(NULL);
- SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
- SetGpuReg(REG_OFFSET_BG3CNT, 0x0000);
- SetGpuReg(REG_OFFSET_BG2CNT, 0x0000);
- SetGpuReg(REG_OFFSET_BG1CNT, 0x0000);
- SetGpuReg(REG_OFFSET_BG0CNT, 0x0000);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_BG3CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
@@ -623,7 +623,7 @@ static void LoadWallClockGraphics(void)
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
- LoadCompressedObjectPic(&gUnknown_085B2208);
+ LoadCompressedSpriteSheet(&gUnknown_085B2208);
LoadSpritePalettes(gUnknown_085B2218);
}
@@ -633,9 +633,9 @@ static void WallClockInit(void)
EnableInterrupts(INTR_FLAG_VBLANK);
SetVBlankCallback(WallClockVblankCallback);
SetMainCallback2(WallClockMainCallback);
- SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000);
- SetGpuReg(REG_OFFSET_BLDY, 0x0000);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
ShowBg(0);
ShowBg(2);
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 906cca3a0..2e6f1642a 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -88,20 +88,12 @@ static bool8 CheckFeebas(void)
x -= 7;
y -= 7;
-#ifdef NONMATCHING
+ if (y >= gRoute119WaterTileData[3 * 0 + 0] && y <= gRoute119WaterTileData[3 * 0 + 1])
+ route119Section = 0;
if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1])
route119Section = 1;
if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1])
route119Section = 2;
-#else
- {
- register const u16 *arr asm("r0");
- if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1])
- route119Section = 1;
- if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1])
- route119Section = 2;
- }
-#endif
if (Random() % 100 > 49) // 50% chance of encountering Feebas
return FALSE;
@@ -251,7 +243,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon)
rand = Random() % range;
// check ability for max level mon
- if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u8 ability = GetMonAbility(&gPlayerParty[0]);
if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)
@@ -332,7 +324,7 @@ static u8 PickWildMonNature(void)
}
}
// check synchronize for a pokemon with the same ability
- if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)
&& GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE
&& Random() % 2 == 0)
{
@@ -360,7 +352,7 @@ static void CreateWildMon(u16 species, u8 level)
}
if (checkCuteCharm
- && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)
+ && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG)
&& GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM
&& Random() % 3 != 0)
{
@@ -478,7 +470,7 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility)
encounterRate = encounterRate * 80 / 100;
ApplyFluteEncounterRateMod(&encounterRate);
ApplyCleanseTagEncounterRateMod(&encounterRate);
- if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u32 ability = GetMonAbility(&gPlayerParty[0]);
@@ -868,7 +860,7 @@ static bool8 IsAbilityAllowingEncounter(u8 level)
{
u8 ability;
- if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
return TRUE;
ability = GetMonAbility(&gPlayerParty[0]);
@@ -905,7 +897,7 @@ static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex)
{
- if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
return FALSE;
else if (GetMonAbility(&gPlayerParty[0]) != ability)
return FALSE;
diff --git a/src/window.c b/src/window.c
index 4e1a38eff..3da529178 100644
--- a/src/window.c
+++ b/src/window.c
@@ -63,7 +63,7 @@ bool16 InitWindows(const struct WindowTemplate *templates)
if (gUnknown_03002F70[bgLayer] == NULL)
{
- attrib = GetBgAttribute(bgLayer, 0x8);
+ attrib = GetBgAttribute(bgLayer, BG_ATTR_METRIC);
if (attrib != 0xFFFF)
{
@@ -141,7 +141,7 @@ u16 AddWindow(const struct WindowTemplate *template)
if (gUnknown_03002F70[bgLayer] == NULL)
{
- attrib = GetBgAttribute(bgLayer, 0x8);
+ attrib = GetBgAttribute(bgLayer, BG_ATTR_METRIC);
if (attrib != 0xFFFF)
{
@@ -276,16 +276,16 @@ void CopyWindowToVram(u8 windowId, u8 mode)
switch (mode)
{
- case 1:
- CopyBgTilemapBufferToVram(windowLocal.window.bg);
- break;
- case 2:
- LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock);
- break;
- case 3:
- LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock);
- CopyBgTilemapBufferToVram(windowLocal.window.bg);
- break;
+ case 1:
+ CopyBgTilemapBufferToVram(windowLocal.window.bg);
+ break;
+ case 2:
+ LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock);
+ break;
+ case 3:
+ LoadBgTiles(windowLocal.window.bg, windowLocal.tileData, windowSize, windowLocal.window.baseBlock);
+ CopyBgTilemapBufferToVram(windowLocal.window.bg);
+ break;
}
}
@@ -308,16 +308,16 @@ void CopyWindowRectToVram(u32 windowId, u32 mode, u32 x, u32 y, u32 w, u32 h)
switch (mode)
{
- case 1:
- CopyBgTilemapBufferToVram(windowLocal.window.bg);
- break;
- case 2:
- LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos);
- break;
- case 3:
- LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos);
- CopyBgTilemapBufferToVram(windowLocal.window.bg);
- break;
+ case 1:
+ CopyBgTilemapBufferToVram(windowLocal.window.bg);
+ break;
+ case 2:
+ LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos);
+ break;
+ case 3:
+ LoadBgTiles(windowLocal.window.bg, windowLocal.tileData + (rectPos * 32), rectSize, windowLocal.window.baseBlock + rectPos);
+ CopyBgTilemapBufferToVram(windowLocal.window.bg);
+ break;
}
}
}
@@ -328,7 +328,7 @@ void PutWindowTilemap(u8 windowId)
WriteSequenceToBgTilemapBuffer(
windowLocal.window.bg,
- GetBgAttribute(windowLocal.window.bg, 0xA) + windowLocal.window.baseBlock,
+ GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE) + windowLocal.window.baseBlock,
windowLocal.window.tilemapLeft,
windowLocal.window.tilemapTop,
windowLocal.window.width,
@@ -340,7 +340,7 @@ void PutWindowTilemap(u8 windowId)
void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette)
{
struct Window windowLocal = gWindows[windowId];
- u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, 0xA);
+ u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE);
int i;
for (i = 0; i < height; ++i)
@@ -376,7 +376,7 @@ void ClearWindowTilemap(u8 windowId)
void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height)
{
struct Window windowLocal = gWindows[windowId];
- u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, 0xA);
+ u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.bg, BG_ATTR_BASETILE);
int i;
for (i = 0; i < height; ++i)
@@ -601,7 +601,7 @@ static void nullsub_9(void)
}
-u16 AddWindow8Bit(struct WindowTemplate *template)
+u16 AddWindow8Bit(const struct WindowTemplate *template)
{
u16 windowId;
u8* memAddress;
@@ -617,7 +617,7 @@ u16 AddWindow8Bit(struct WindowTemplate *template)
bgLayer = template->bg;
if (gUnknown_03002F70[bgLayer] == 0)
{
- u16 attribute = GetBgAttribute(bgLayer, 8);
+ u16 attribute = GetBgAttribute(bgLayer, BG_ATTR_METRIC);
if (attribute != 0xFFFF)
{
s32 i;
@@ -669,12 +669,12 @@ void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width,
FillBitmapRect8Bit(&pixelRect, x, y, width, height, fillValue);
}
-void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum)
+void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum)
{
struct Bitmap sourceRect;
struct Bitmap destRect;
- sourceRect.pixels = (u8*)pixels;
+ sourceRect.pixels = (u8*) pixels;
sourceRect.width = srcWidth;
sourceRect.height = srcHeight;
@@ -692,16 +692,16 @@ void CopyWindowToVram8Bit(u8 windowId, u8 mode)
switch (mode)
{
- case 1:
- CopyBgTilemapBufferToVram(sWindowPtr->window.bg);
- break;
- case 2:
- LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);
- break;
- case 3:
- LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);
- CopyBgTilemapBufferToVram(sWindowPtr->window.bg);
- break;
+ case 1:
+ CopyBgTilemapBufferToVram(sWindowPtr->window.bg);
+ break;
+ case 2:
+ LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);
+ break;
+ case 3:
+ LoadBgTiles(sWindowPtr->window.bg, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock);
+ CopyBgTilemapBufferToVram(sWindowPtr->window.bg);
+ break;
}
}