summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_anim_effects_1.c53
-rwxr-xr-xsrc/battle_anim_effects_2.c4
-rwxr-xr-xsrc/battle_anim_effects_3.c36
-rw-r--r--src/battle_anim_mons.c4
-rwxr-xr-xsrc/battle_anim_special.c2
-rw-r--r--src/battle_controllers.c35
-rw-r--r--src/battle_dome.c4
-rw-r--r--src/battle_factory.c6
-rw-r--r--src/battle_factory_screen.c6
-rw-r--r--src/battle_gfx_sfx_util.c28
-rw-r--r--src/battle_interface.c2
-rw-r--r--src/battle_intro.c127
-rw-r--r--src/battle_main.c9
-rw-r--r--src/battle_pike.c10
-rw-r--r--src/battle_setup.c163
-rw-r--r--src/battle_tent.c2
-rw-r--r--src/battle_tower.c2
-rw-r--r--src/battle_transition.c8
-rw-r--r--src/berry_blender.c8
-rwxr-xr-xsrc/berry_crush.c200
-rw-r--r--src/bg.c21
-rw-r--r--src/cable_car.c2
-rw-r--r--src/contest.c6
-rw-r--r--src/contest_link_80F57C4.c918
-rw-r--r--src/contest_painting.c19
-rw-r--r--src/credits.c475
-rw-r--r--src/crt0.s199
-rwxr-xr-xsrc/data/field_event_obj/event_object_graphics_info_pointers.h478
-rw-r--r--src/data/lilycove_lady.h470
-rw-r--r--src/data/region_map/city_map_entries.h113
-rw-r--r--src/data/region_map/city_map_tilemaps.h22
-rw-r--r--src/data/text/gift_ribbon_descriptions.h115
-rw-r--r--src/data/text/match_call_messages.h476
-rw-r--r--src/data/text/ribbon_descriptions.h48
-rw-r--r--src/daycare.c4
-rw-r--r--src/diploma.c2
-rw-r--r--src/dma3_manager.c4
-rw-r--r--src/dodrio_berry_picking.c5465
-rw-r--r--src/easy_chat.c30
-rw-r--r--src/egg_hatch.c4
-rw-r--r--src/electric.c4
-rwxr-xr-xsrc/ereader_helpers.c22
-rwxr-xr-xsrc/ereader_screen.c2
-rw-r--r--src/field_camera.c10
-rw-r--r--src/field_control_avatar.c2
-rw-r--r--src/field_effect.c2
-rw-r--r--src/field_player_avatar.c11
-rw-r--r--src/field_specials.c2
-rw-r--r--src/field_weather.c2
-rw-r--r--src/fight.c4
-rw-r--r--src/fire.c1
-rw-r--r--src/fldeff_cut.c10
-rw-r--r--src/fldeff_flash.c8
-rw-r--r--src/flying.c2
-rw-r--r--src/frontier_util.c2
-rw-r--r--src/ghost.c5
-rw-r--r--src/gpu_regs.c6
-rw-r--r--src/hall_of_fame.c2
-rw-r--r--src/item.c3
-rwxr-xr-xsrc/item_menu.c38
-rw-r--r--src/libagbsyscall.s116
-rw-r--r--src/libgcnmultiboot.s550
-rw-r--r--src/librfu.c9
-rw-r--r--src/librfu_intr.c1
-rw-r--r--src/librfu_stwi.c2
-rw-r--r--src/lilycove_lady.c947
-rw-r--r--src/link.c31
-rw-r--r--src/link_rfu.c78
-rw-r--r--src/load_save.c8
-rw-r--r--src/m4a.c1
-rw-r--r--src/m4a_1.s1934
-rw-r--r--src/main.c20
-rw-r--r--src/main_menu.c2
-rw-r--r--src/mauville_old_man.c2
-rw-r--r--src/menu.c358
-rw-r--r--src/menu_helpers.c2
-rw-r--r--src/menu_specialized.c410
-rw-r--r--src/mirage_tower.c4
-rw-r--r--src/multiboot.c4
-rw-r--r--src/new_game.c5
-rw-r--r--src/overworld.c18
-rw-r--r--src/palette.c6
-rwxr-xr-xsrc/party_menu.c8
-rw-r--r--src/pokedex.c58
-rwxr-xr-xsrc/pokedex_area_screen.c10
-rw-r--r--src/pokemon.c53
-rw-r--r--src/pokemon_animation.c35
-rwxr-xr-xsrc/pokemon_jump.c2642
-rw-r--r--src/pokemon_storage_system.c4
-rw-r--r--src/pokenav.c104
-rw-r--r--src/pokenav_main_menu.c44
-rw-r--r--src/pokenav_match_call_data.c350
-rw-r--r--src/pokenav_match_call_ui.c940
-rw-r--r--src/pokenav_unk_1.c12
-rw-r--r--src/pokenav_unk_10.c776
-rw-r--r--src/pokenav_unk_2.c1265
-rwxr-xr-xsrc/pokenav_unk_3.c92
-rwxr-xr-xsrc/pokenav_unk_4.c236
-rwxr-xr-xsrc/pokenav_unk_5.c147
-rw-r--r--src/pokenav_unk_6.c625
-rw-r--r--src/pokenav_unk_7.c884
-rw-r--r--src/pokenav_unk_8.c710
-rw-r--r--src/pokenav_unk_9.c726
-rw-r--r--src/random.c4
-rw-r--r--src/record_mixing.c34
-rw-r--r--src/recorded_battle.c4
-rw-r--r--src/reset_rtc_screen.c2
-rw-r--r--src/reset_save_heap.c2
-rw-r--r--src/roamer.c2
-rw-r--r--src/rock.c2
-rw-r--r--src/rom_8034C54.c6
-rw-r--r--src/roulette.c8
-rwxr-xr-xsrc/roulette_util.c3
-rw-r--r--src/rtc.c8
-rw-r--r--src/save.c5
-rw-r--r--src/scrcmd.c27
-rw-r--r--src/script.c12
-rw-r--r--src/script_menu.c14
-rwxr-xr-xsrc/script_pokemon_util_80F87D8.c4
-rw-r--r--src/secret_base.c4
-rwxr-xr-xsrc/shop.c8
-rw-r--r--src/slot_machine.c2
-rw-r--r--src/sound.c10
-rw-r--r--src/sprite.c8
-rw-r--r--src/starter_choose.c2
-rw-r--r--src/strings.c44
-rw-r--r--src/text.c105
-rw-r--r--src/trade.c11
-rw-r--r--src/trainer_hill.c2
-rw-r--r--src/trainer_pokemon_sprites.c4
-rw-r--r--src/trainer_see.c2
-rw-r--r--src/tv.c23
-rw-r--r--src/union_room.c80
-rw-r--r--src/union_room_battle.c2
-rw-r--r--src/use_pokeblock.c269
135 files changed, 18755 insertions, 5905 deletions
diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c
index 49bb0216b..dfe5f0f3d 100644
--- a/src/battle_anim_effects_1.c
+++ b/src/battle_anim_effects_1.c
@@ -2547,7 +2547,7 @@ static void AnimPetalDanceSmallFlowerStep(struct Sprite* sprite)
{
sprite->pos2.x += Sin(sprite->data[5], 8);
if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5)
- sprite->oam.matrixNum ^= 0x8; // horizontal flip
+ sprite->oam.matrixNum ^= ST_OAM_HFLIP;
sprite->data[5] += 5;
sprite->data[5] &= 0xFF;
@@ -4380,19 +4380,19 @@ void sub_8101898(struct Sprite* sprite)
{
sprite->pos1.x -= 0x18;
sprite->pos1.y += 0x18;
- sprite->oam.matrixNum = 16;
+ sprite->oam.matrixNum = ST_OAM_VFLIP;
}
else if ((s16)sprite->oam.affineParam == 3)
{
sprite->pos1.x += 0x18;
sprite->pos1.y -= 0x18;
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
}
else
{
sprite->pos1.x += 0x18;
sprite->pos1.y += 0x18;
- sprite->oam.matrixNum = 24;
+ sprite->oam.matrixNum = ST_OAM_HFLIP | ST_OAM_VFLIP;
}
sprite->oam.tileNum = (sprite->oam.tileNum + 16);
@@ -5105,7 +5105,7 @@ void sub_8102844(struct Sprite* sprite)
sprite->data[7] = sprite->pos1.y;
if (IsContest())
{
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
sprite->pos1.x += 40;
sprite->pos1.y += 20;
sprite->data[2] = sprite->pos1.x << 7;
@@ -5130,7 +5130,7 @@ void sub_8102844(struct Sprite* sprite)
sprite->data[3] = -0x1400 / sprite->data[1];
sprite->data[4] = sprite->pos1.y << 7;
sprite->data[5] = 0xA00 / sprite->data[1];
- sprite->oam.matrixNum = 24;
+ sprite->oam.matrixNum = (ST_OAM_HFLIP | ST_OAM_VFLIP);
}
sprite->callback = sub_810296C;
@@ -5315,21 +5315,19 @@ static void sub_8102D8C(s16 a, s16 b, s16* c, s16* d, s8 e)
static void sub_8102DE4(struct Sprite* sprite)
{
- int b;
- s16 a;
- int c;
+ s16 y, yDelta;
u8 index;
+
sprite->data[0]++;
- b = sprite->data[0] * 5 - ((sprite->data[0] * 5 / 256) << 8);
+ yDelta = sprite->data[0] * 5 - ((sprite->data[0] * 5 / 256) << 8);
sprite->data[4] += sprite->data[6];
sprite->data[5] += sprite->data[7];
sprite->pos1.x = sprite->data[4] >> 4;
sprite->pos1.y = sprite->data[5] >> 4;
- sprite->pos2.y = Sin(b, 15);
- a = (u16)sprite->pos1.y;
- c = (u16)sprite->pos1.x;
+ sprite->pos2.y = Sin(yDelta, 15);
- if ((u32)((c + 16) << 16) > (0x110) << 16 || a < -16 || a > 0x80)
+ y = sprite->pos1.y;
+ if (sprite->pos1.x < -16 || sprite->pos1.x > 256 || y < -16 || y > 128)
{
DestroySpriteAndMatrix(sprite);
}
@@ -5350,12 +5348,8 @@ static void sub_8102DE4(struct Sprite* sprite)
void sub_8102EB0(struct Sprite* sprite)
{
- int a;
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
- {
- a = gBattleAnimArgs[1];
- (u16)gBattleAnimArgs[1] = -a;
- }
+ gBattleAnimArgs[1] *= -1;
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2];
@@ -5393,7 +5387,7 @@ void sub_8102FB8(struct Sprite* sprite)
s16 a;
if (gBattleAnimArgs[0] == 1)
{
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
a = 16;
}
else
@@ -5541,8 +5535,8 @@ static void sub_8103300(struct Sprite* sprite)
static void sub_8103320(struct Sprite* sprite)
{
- s16 temp;
- s16 temp2;
+ s16 x1, x2;
+
sprite->data[1] += 4;
if (sprite->data[1] > 254)
{
@@ -5564,20 +5558,21 @@ static void sub_8103320(struct Sprite* sprite)
if (sprite->data[1] > 0x9F)
sprite->subpriority = sprite->data[2];
- temp = gSineTable[sprite->data[1]];
- sprite->pos2.x = (temp2 = temp >> 3) + (temp2 >> 1);
+ x1 = gSineTable[sprite->data[1]];
+ x2 = x1 >> 3;
+ sprite->pos2.x = (x1 >> 3) + (x2 >> 1);
}
void sub_8103390(struct Sprite* sprite)
{
- u8 bank;
+ u8 battler;
if (gBattleAnimArgs[0] == 0)
- bank = gBattleAnimAttacker;
+ battler = gBattleAnimAttacker;
else
- bank = gBattleAnimTarget;
+ battler = gBattleAnimTarget;
- sub_810310C(bank, sprite);
- if (GetBattlerSide(bank) == B_SIDE_PLAYER)
+ sub_810310C(battler, sprite);
+ if (GetBattlerSide(battler) == B_SIDE_PLAYER)
{
StartSpriteAnim(sprite, 0);
sprite->data[0] = 2;
diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c
index 65cc55604..3b7d26aab 100755
--- a/src/battle_anim_effects_2.c
+++ b/src/battle_anim_effects_2.c
@@ -1609,10 +1609,10 @@ static void sub_8103C0C(u8 taskId)
switch (gTasks[taskId].data[4])
{
case 1:
- sprite->oam.matrixNum |= 24;
+ sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP);
break;
case 2:
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
break;
}
diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c
index ab765b8c1..79b728e61 100755
--- a/src/battle_anim_effects_3.c
+++ b/src/battle_anim_effects_3.c
@@ -1618,7 +1618,7 @@ void sub_815AAA4(struct Sprite *sprite)
if (gBattleAnimArgs[2] == 0)
{
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
sprite->pos2.x = -12;
sprite->data[1] = 2;
}
@@ -2504,13 +2504,10 @@ void sub_815BE04(struct Sprite *sprite)
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;
- sprite->data[3] = var0 & 0xFF;
+ s16 delta = sprite->data[3] + sprite->data[2];
+ sprite->pos2.y -= delta >> 8;
+ sprite->data[3] += sprite->data[2];
+ sprite->data[3] &= 0xFF;
if (sprite->data[4] == 0 && sprite->pos2.y < -8)
{
gSprites[sprite->data[6]].invisible = 0;
@@ -2543,19 +2540,12 @@ static void sub_815BFF4(struct Sprite *sprite)
static void sub_815C050(struct Sprite *sprite)
{
- u16 d2;
- register u16 d3 asm("r1");
- int var0;
- s8 var1;
-
if (!sprite->invisible)
{
- d2 = sprite->data[2];
- d3 = sprite->data[3];
- var0 = d2 + d3;
- var1 = var0 >> 8;
- sprite->pos2.y -= var1;
- sprite->data[3] = var0 & 0xFF;
+ s16 delta = sprite->data[3] + sprite->data[2];
+ sprite->pos2.y -= delta >> 8;
+ sprite->data[3] += sprite->data[2];
+ sprite->data[3] &= 0xFF;
if (--sprite->data[1] == -1)
{
sprite->invisible = 1;
@@ -4177,7 +4167,7 @@ void AnimSmellingSaltsHand(struct Sprite *sprite)
sprite->pos1.y = GetBattlerSpriteCoord(battler, 3);
if (gBattleAnimArgs[1] == 0)
{
- sprite->oam.matrixNum |= 0x8;
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;
}
else
@@ -4322,12 +4312,12 @@ static void AnimSmellingSaltExclamationStep(struct Sprite *sprite)
// Claps a hand several times.
// arg 0: which hand
-// arg 1:
+// arg 1:
void AnimHelpingHandClap(struct Sprite *sprite)
{
if (gBattleAnimArgs[0] == 0)
{
- sprite->oam.matrixNum |= 0x8; // horizontal flip
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
sprite->pos1.x = 100;
sprite->data[7] = 1;
}
@@ -4555,7 +4545,7 @@ void AnimForesightMagnifyingGlass(struct Sprite *sprite)
}
if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT)
- sprite->oam.matrixNum = 8; // horizontal flip
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);
sprite->oam.objMode = ST_OAM_OBJ_BLEND;
diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c
index c6058204d..a667daecf 100644
--- a/src/battle_anim_mons.c
+++ b/src/battle_anim_mons.c
@@ -2037,7 +2037,7 @@ u8 sub_80A8394(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority
gMonSpritesGfxPtr->field_17C = AllocZeroed(0x2000);
if (!isBackpic)
{
- LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20);
+ LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20);
if (a10 == 1 || sub_80688F8(5, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0)
LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species],
gMonSpritesGfxPtr->field_17C,
@@ -2053,7 +2053,7 @@ u8 sub_80A8394(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority
}
else
{
- LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20);
+ LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20);
if (a10 == 1 || sub_80688F8(5, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0)
LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species],
gMonSpritesGfxPtr->field_17C,
diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c
index 740340d14..6780f0a32 100755
--- a/src/battle_anim_special.c
+++ b/src/battle_anim_special.c
@@ -2029,7 +2029,7 @@ void sub_8172EF0(u8 battler, struct Pokemon *mon)
if (IsBattlerSpriteVisible(battler))
{
shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
- if (shinyValue < 8)
+ if (shinyValue < SHINY_ODDS)
isShiny = TRUE;
if (isShiny)
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index 29272c19a..1225d1953 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -64,7 +64,7 @@ void SetUpBattleVarsAndBirchZigzagoon(void)
if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
{
ZeroEnemyPartyMons();
- CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, 0, 0);
+ CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, OT_ID_PLAYER_ID, 0);
i = 0;
SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &i);
}
@@ -819,15 +819,11 @@ static void Task_HandleSendLinkBuffersData(u8 taskId)
}
}
-// fix me
void sub_8033648(void)
{
u8 i;
s32 j;
- u16 r6;
u8 *recvBuffer;
- u8 *dest;
- u8 *src;
if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & BATTLE_TYPE_20))
{
@@ -838,25 +834,24 @@ void sub_8033648(void)
{
ResetBlockReceivedFlag(i);
recvBuffer = (u8 *)gBlockRecvBuffer[i];
- #ifndef NONMATCHING
- asm("");
- recvBuffer = (u8 *)&gBlockRecvBuffer[i];
- #endif
- r6 = gBlockRecvBuffer[i][2];
-
- if (gTasks[sLinkReceiveTaskId].data[14] + 9 + r6 > 0x1000)
{
- gTasks[sLinkReceiveTaskId].data[12] = gTasks[sLinkReceiveTaskId].data[14];
- gTasks[sLinkReceiveTaskId].data[14] = 0;
- }
+ u8 *dest, *src;
+ u16 r6 = gBlockRecvBuffer[i][2];
+
+ if (gTasks[sLinkReceiveTaskId].data[14] + 9 + r6 > 0x1000)
+ {
+ gTasks[sLinkReceiveTaskId].data[12] = gTasks[sLinkReceiveTaskId].data[14];
+ gTasks[sLinkReceiveTaskId].data[14] = 0;
+ }
- dest = &gLinkBattleRecvBuffer[gTasks[sLinkReceiveTaskId].data[14]];
- src = recvBuffer;
+ dest = &gLinkBattleRecvBuffer[gTasks[sLinkReceiveTaskId].data[14]];
+ src = recvBuffer;
- for (j = 0; j < r6 + 8; j++)
- dest[j] = src[j];
+ for (j = 0; j < r6 + 8; j++)
+ dest[j] = src[j];
- gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + r6 + 8;
+ gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + r6 + 8;
+ }
}
}
}
diff --git a/src/battle_dome.c b/src/battle_dome.c
index 162d46d61..1c116467d 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -1024,13 +1024,13 @@ static const union AnimCmd gUnknown_0860D020[] =
static const union AnimCmd gUnknown_0860D028[] =
{
- ANIMCMD_FRAME(18, 129, .vFlip = TRUE),
+ ANIMCMD_FRAME(18, 1, .vFlip = TRUE),
ANIMCMD_END,
};
static const union AnimCmd gUnknown_0860D030[] =
{
- ANIMCMD_FRAME(16, 65, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 1, .hFlip = TRUE),
ANIMCMD_END,
};
diff --git a/src/battle_factory.c b/src/battle_factory.c
index 1a150db1e..bc47b1fda 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -16,7 +16,7 @@
#include "constants/moves.h"
// IWRAM bss
-static IWRAM_DATA bool8 sPerformedRentalSwap;
+static bool8 sPerformedRentalSwap;
// This file's functions.
static void InitFactoryChallenge(void);
@@ -415,7 +415,7 @@ static void SetPlayerAndOpponentParties(void)
monLevel,
ivs,
TRUE, gSaveBlock2Ptr->frontier.rentalMons[i].personality,
- 0, 0);
+ OT_ID_PLAYER_ID, 0);
count = 0;
bits = gFacilityTrainerMons[monSetId].evSpread;
@@ -456,7 +456,7 @@ static void SetPlayerAndOpponentParties(void)
monLevel,
ivs,
TRUE, gSaveBlock2Ptr->frontier.rentalMons[i + 3].personality,
- 0, 0);
+ OT_ID_PLAYER_ID, 0);
count = 0;
bits = gFacilityTrainerMons[monSetId].evSpread;
diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c
index 280b65dc8..f56442432 100644
--- a/src/battle_factory_screen.c
+++ b/src/battle_factory_screen.c
@@ -227,9 +227,9 @@ static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL;
static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL;
// IWRAM bss
-static IWRAM_DATA struct FactorySelectMonsStruct *sFactorySelectScreen;
-static IWRAM_DATA void (*sSwap_CurrentTableFunc)(u8 taskId);
-static IWRAM_DATA struct FactorySwapMonsStruct *sFactorySwapScreen;
+static struct FactorySelectMonsStruct *sFactorySelectScreen;
+static void (*sSwap_CurrentTableFunc)(u8 taskId);
+static struct FactorySwapMonsStruct *sFactorySwapScreen;
// IWRAM common
u8 (*gUnknown_030062E8)(void);
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index d6b1b6dee..cdd7e8158 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -534,7 +534,7 @@ void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId)
if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)
lzPaletteData = GetMonFrontSpritePal(mon);
else
- lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);
+ lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);
LZDecompressWram(lzPaletteData, gDecompressionBuffer);
LoadPalette(gDecompressionBuffer, paletteOffset, 0x20);
@@ -597,7 +597,7 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId)
if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE)
lzPaletteData = GetMonFrontSpritePal(mon);
else
- lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);
+ lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality);
LZDecompressWram(lzPaletteData, gDecompressionBuffer);
LoadPalette(gDecompressionBuffer, paletteOffset, 0x20);
@@ -918,7 +918,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32);
DmaCopy32(3, src, dst, 0x800);
paletteOffset = 0x100 + battlerAtk * 16;
- lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue);
+ lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue);
LZDecompressWram(lzPaletteData, gDecompressionBuffer);
LoadPalette(gDecompressionBuffer, paletteOffset, 32);
@@ -945,10 +945,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite)
{
- u8 position;
- s32 i;
- u32 var;
- const void *substitutePal;
+ s32 i, position, palOffset;
if (!loadMonSprite)
{
@@ -964,19 +961,16 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite)
else
LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[position]);
- i = 1;
- var = battlerId * 16;
- substitutePal = gSubstituteDollPal;
- for (; i < 4; i++)
+ for (i = 1; i < 4; i++)
{
- register void *dmaSrc asm("r0") = gMonSpritesGfxPtr->sprites[position];
- void *dmaDst = (i * 0x800) + dmaSrc;
- u32 dmaSize = 0x800;
- DmaCopy32(3, dmaSrc, dmaDst, dmaSize);
- i++;i--;
+ u8 (*ptr)[4][0x800] = gMonSpritesGfxPtr->sprites[position];
+ ptr++;ptr--; // Needed to match.
+
+ DmaCopy32Defvars(3, (*ptr)[0], (*ptr)[i], 0x800);
}
- LoadCompressedPalette(substitutePal, 0x100 + var, 32);
+ palOffset = (battlerId * 16) + 0x100;
+ LoadCompressedPalette(gSubstituteDollPal, palOffset, 32);
}
else
{
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 922437597..8fabfed68 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -1536,7 +1536,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo,
if (isOpponent)
{
gSprites[summaryBarSpriteId].pos1.x -= 96;
- gSprites[summaryBarSpriteId].oam.matrixNum = 8;
+ gSprites[summaryBarSpriteId].oam.matrixNum = ST_OAM_HFLIP;
}
else
{
diff --git a/src/battle_intro.c b/src/battle_intro.c
index 043cf855a..6964428a3 100644
--- a/src/battle_intro.c
+++ b/src/battle_intro.c
@@ -205,7 +205,7 @@ static void BattleIntroSlide1(u8 taskId)
if (gBattle_WIN0V & 0xFF00)
gBattle_WIN0V -= 0x3FC;
-
+
if (gTasks[taskId].data[2])
gTasks[taskId].data[2] -= 2;
@@ -314,7 +314,7 @@ static void BattleIntroSlide2(u8 taskId)
if (gBattle_WIN0V & 0xFF00)
gBattle_WIN0V -= 0x3FC;
-
+
if (gTasks[taskId].data[2])
gTasks[taskId].data[2] -= 2;
@@ -402,7 +402,7 @@ static void BattleIntroSlide3(u8 taskId)
if (gBattle_WIN0V & 0xFF00)
gBattle_WIN0V -= 0x3FC;
-
+
if (gTasks[taskId].data[2])
gTasks[taskId].data[2] -= 2;
@@ -484,7 +484,7 @@ static void BattleIntroSlideLink(u8 taskId)
case 3:
if (gBattle_WIN0V & 0xFF00)
gBattle_WIN0V -= 0x3FC;
-
+
if (gTasks[taskId].data[2])
gTasks[taskId].data[2] -= 2;
@@ -537,7 +537,7 @@ static void BattleIntroSlidePartner(u8 taskId)
gBattle_WIN0V += 0x100;
if ((gBattle_WIN0V & 0xFF00) != 0x100)
gBattle_WIN0V--;
-
+
if ((gBattle_WIN0V & 0xFF00) == 0x2000)
{
gTasks[taskId].data[0]++;
@@ -600,129 +600,18 @@ void sub_8118FBC(int bgId, u8 arg1, u8 arg2, u8 battlerPosition, u8 arg4, u8 *ar
LoadBgTilemap(bgId, arg6, BG_SCREEN_SIZE, 0);
}
-#ifdef NONMATCHING
void unref_sub_8119094(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u16 arg5, u8 arg6, u8 arg7)
{
- int i, j;
- int offset;
+ int i, j, offset;
+
DmaCopy16(3, gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE);
offset = (arg5 >> 5) - (arg7 << 9);
for (i = arg1; i < arg1 + 8; i++)
{
for (j = arg0; j < arg0 + 8; j++)
{
- ((u16 *)BG_VRAM)[i * 32 + j + (arg6 * 0x400) + arg0] = offset | (arg4 << 12);
+ *((u16 *)(BG_VRAM) + (i * 32) + (j + (arg6 << 10))) = offset | (arg4 << 12);
offset++;
}
}
}
-#else
-NAKED
-void unref_sub_8119094(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u16 arg5, u8 arg6, u8 arg7)
-{
- 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\
- ldr r4, [sp, 0x24]\n\
- ldr r5, [sp, 0x28]\n\
- mov r8, r5\n\
- ldr r5, [sp, 0x2C]\n\
- ldr r6, [sp, 0x30]\n\
- mov r9, r6\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r12, r0\n\
- lsls r1, 24\n\
- lsls r2, 24\n\
- lsls r3, 24\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- mov r10, r4\n\
- mov r7, r8\n\
- lsls r7, 16\n\
- lsrs r6, r7, 16\n\
- lsls r5, 24\n\
- lsrs r5, 24\n\
- mov r0, r9\n\
- lsls r0, 24\n\
- mov r9, r0\n\
- ldr r4, =0x040000d4\n\
- ldr r0, =gMonSpritesGfxPtr\n\
- ldr r0, [r0]\n\
- lsrs r2, 22\n\
- adds r0, 0x4\n\
- adds r0, r2\n\
- lsrs r3, 13\n\
- ldr r0, [r0]\n\
- adds r0, r3\n\
- str r0, [r4]\n\
- movs r0, 0xC0\n\
- lsls r0, 19\n\
- adds r6, r0\n\
- str r6, [r4, 0x4]\n\
- ldr r0, =0x80000400\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- adds r2, r7, 0\n\
- lsrs r2, 21\n\
- mov r6, r9\n\
- lsrs r6, 15\n\
- subs r4, r2, r6\n\
- lsrs r0, r1, 24\n\
- adds r1, r0, 0\n\
- adds r1, 0x8\n\
- cmp r0, r1\n\
- bge _08119148\n\
- mov r9, r1\n\
- mov r7, r12\n\
- lsls r7, 1\n\
- mov r8, r7\n\
- lsls r5, 11\n\
- str r5, [sp]\n\
-_08119110:\n\
- mov r2, r12\n\
- adds r3, r2, 0\n\
- adds r3, 0x8\n\
- adds r5, r0, 0x1\n\
- cmp r2, r3\n\
- bge _08119142\n\
- mov r1, r10\n\
- lsls r6, r1, 12\n\
- lsls r0, 6\n\
- movs r7, 0xC0\n\
- lsls r7, 19\n\
- adds r0, r7\n\
- ldr r1, [sp]\n\
- adds r0, r1, r0\n\
- mov r7, r8\n\
- adds r1, r7, r0\n\
- subs r2, r3, r2\n\
-_08119132:\n\
- adds r0, r4, 0\n\
- orrs r0, r6\n\
- strh r0, [r1]\n\
- adds r4, 0x1\n\
- adds r1, 0x2\n\
- subs r2, 0x1\n\
- cmp r2, 0\n\
- bne _08119132\n\
-_08119142:\n\
- adds r0, r5, 0\n\
- cmp r0, r9\n\
- blt _08119110\n\
-_08119148:\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");
-}
-#endif
diff --git a/src/battle_main.c b/src/battle_main.c
index b4c4bdf5c..92e21db75 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -72,6 +72,9 @@ extern const u8 *const gBattlescriptsForUsingItem[];
extern const u8 *const gBattlescriptsForSafariActions[];
// this file's functions
+#if !defined(NONMATCHING) && MODERN
+#define static
+#endif
static void CB2_InitBattleInternal(void);
static void CB2_PreInitMultiBattle(void);
static void CB2_PreInitIngamePlayerPartnerBattle(void);
@@ -2001,7 +2004,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0);
+ CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
for (j = 0; j < MAX_MON_MOVES; j++)
{
@@ -2019,7 +2022,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0);
+ CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
break;
@@ -2033,7 +2036,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0);
+ CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem);
diff --git a/src/battle_pike.c b/src/battle_pike.c
index 7fdb0a07c..8846e2d1a 100644
--- a/src/battle_pike.c
+++ b/src/battle_pike.c
@@ -53,11 +53,11 @@ struct PikeWildMon
};
// IWRAM bss
-static IWRAM_DATA u8 sRoomType;
-static IWRAM_DATA u8 sStatusMon;
-static IWRAM_DATA bool8 sUnknown_0300128E;
-static IWRAM_DATA u32 sStatusFlags;
-static IWRAM_DATA u8 sNpcId;
+static u8 sRoomType;
+static u8 sStatusMon;
+static bool8 sUnknown_0300128E;
+static u32 sStatusFlags;
+static u8 sNpcId;
// This file's functions.
static void SetRoomType(void);
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 288fdb3e9..c2d7cb6c6 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -231,86 +231,93 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[]
{&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
};
+#define REMATCH(trainer1, trainer2, trainer3, trainer4, trainer5, map) \
+{ \
+ .trainerIds = {trainer1, trainer2, trainer3, trainer4, trainer5}, \
+ .mapGroup = MAP_GROUP(map), \
+ .mapNum = MAP_NUM(map), \
+}
+
const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] =
{
- [REMATCH_ROSE] = {{TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5}, 0x0, 0x21},
- [REMATCH_ANDRES] = {{TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5}, 0x0, 0x14},
- [REMATCH_DUSTY] = {{TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5}, 0x0, 0x1a},
- [REMATCH_LOLA] = {{TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5}, 0x0, 0x18},
- [REMATCH_RICKY] = {{TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5}, 0x0, 0x18},
- [REMATCH_LILA_AND_ROY] = {{TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5}, 0x0, 0x27},
- [REMATCH_CRISTIN] = {{TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5}, 0x0, 0x24},
- [REMATCH_BROOKE] = {{TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5}, 0x0, 0x1a},
- [REMATCH_WILTON] = {{TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5}, 0x0, 0x1a},
- [REMATCH_VALERIE] = {{TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5}, 0x18, 0x14},
- [REMATCH_CINDY] = {{TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6}, 0x0, 0x13},
- [REMATCH_THALIA] = {{TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5}, 0x18, 0x38},
- [REMATCH_JESSICA] = {{TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5}, 0x0, 0x24},
- [REMATCH_WINSTON] = {{TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5}, 0x0, 0x13},
- [REMATCH_STEVE] = {{TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5}, 0x0, 0x1d},
- [REMATCH_TONY] = {{TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5}, 0x0, 0x16},
- [REMATCH_NOB] = {{TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5}, 0x0, 0x1e},
- [REMATCH_KOJI] = {{TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5}, 0x0, 0x2a},
- [REMATCH_FERNANDO] = {{TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5}, 0x0, 0x26},
- [REMATCH_DALTON] = {{TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5}, 0x0, 0x21},
- [REMATCH_BERNIE] = {{TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5}, 0x0, 0x1d},
- [REMATCH_ETHAN] = {{TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5}, 0x18, 0xd},
- [REMATCH_JOHN_AND_JAY] = {{TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5}, 0x18, 0x1},
- [REMATCH_JEFFREY] = {{TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5}, 0x0, 0x23},
- [REMATCH_CAMERON] = {{TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5}, 0x0, 0x26},
- [REMATCH_JACKI] = {{TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5}, 0x0, 0x26},
- [REMATCH_WALTER] = {{TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5}, 0x0, 0x24},
- [REMATCH_KAREN] = {{TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5}, 0x0, 0x1f},
- [REMATCH_JERRY] = {{TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5}, 0x0, 0x1f},
- [REMATCH_ANNA_AND_MEG] = {{TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5}, 0x0, 0x20},
- [REMATCH_ISABEL] = {{TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5}, 0x0, 0x19},
- [REMATCH_MIGUEL] = {{TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5}, 0x0, 0x12},
- [REMATCH_TIMOTHY] = {{TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5}, 0x0, 0x1e},
- [REMATCH_SHELBY] = {{TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5}, 0x18, 0xc},
- [REMATCH_CALVIN] = {{TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5}, 0x0, 0x11},
- [REMATCH_ELLIOT] = {{TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5}, 0x0, 0x15},
- [REMATCH_ISAIAH] = {{TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5}, 0x0, 0x2b},
- [REMATCH_MARIA] = {{TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5}, 0x0, 0x20},
- [REMATCH_ABIGAIL] = {{TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5}, 0x0, 0x19},
- [REMATCH_DYLAN] = {{TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5}, 0x0, 0x20},
- [REMATCH_KATELYN] = {{TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5}, 0x0, 0x2b},
- [REMATCH_BENJAMIN] = {{TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5}, 0x0, 0x19},
- [REMATCH_PABLO] = {{TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5}, 0x0, 0x29},
- [REMATCH_NICOLAS] = {{TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5}, 0x18, 0x1},
- [REMATCH_ROBERT] = {{TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5}, 0x0, 0x23},
- [REMATCH_LAO] = {{TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5}, 0x0, 0x1c},
- [REMATCH_CYNDY] = {{TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5}, 0x0, 0x1e},
- [REMATCH_MADELINE] = {{TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5}, 0x0, 0x1c},
- [REMATCH_JENNY] = {{TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5}, 0x0, 0x27},
- [REMATCH_DIANA] = {{TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5}, 0x18, 0xd},
- [REMATCH_AMY_AND_LIV] = {{TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6}, 0x0, 0x12},
- [REMATCH_ERNEST] = {{TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5}, 0x0, 0x28},
- [REMATCH_CORY] = {{TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5}, 0x0, 0x17},
- [REMATCH_EDWIN] = {{TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5}, 0x0, 0x19},
- [REMATCH_LYDIA] = {{TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5}, 0x0, 0x20},
- [REMATCH_ISAAC] = {{TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5}, 0x0, 0x20},
- [REMATCH_GABRIELLE] = {{TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5}, 0x18, 0x11},
- [REMATCH_CATHERINE] = {{TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5}, 0x0, 0x22},
- [REMATCH_JACKSON] = {{TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5}, 0x0, 0x22},
- [REMATCH_HALEY] = {{TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5}, 0x0, 0x13},
- [REMATCH_JAMES] = {{TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5}, 0x18, 0xb},
- [REMATCH_TRENT] = {{TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5}, 0x0, 0x1b},
- [REMATCH_SAWYER] = {{TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5}, 0x18, 0xc},
- [REMATCH_KIRA_AND_DAN] = {{TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5}, 0x18, 0x3e},
- [REMATCH_WALLY_3] = {{TRAINER_WALLY_3, TRAINER_WALLY_4, TRAINER_WALLY_5, TRAINER_WALLY_6, TRAINER_WALLY_6}, 0x18, 0x2b},
- [REMATCH_ROXANNE] = {{TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5}, 0x0, 0x3},
- [REMATCH_BRAWLY] = {{TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5}, 0x0, 0xb},
- [REMATCH_WATTSON] = {{TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5}, 0x0, 0x2},
- [REMATCH_FLANNERY] = {{TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5}, 0x0, 0xc},
- [REMATCH_NORMAN] = {{TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5}, 0x0, 0x0},
- [REMATCH_WINONA] = {{TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5}, 0x0, 0x4},
- [REMATCH_TATE_AND_LIZA] = {{TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5}, 0x0, 0x6},
- [REMATCH_JUAN] = {{TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5}, 0x0, 0x7},
- [REMATCH_SIDNEY] = {{TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY}, 0x0, 0x8},
- [REMATCH_PHOEBE] = {{TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE}, 0x0, 0x8},
- [REMATCH_GLACIA] = {{TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA}, 0x0, 0x8},
- [REMATCH_DRAKE] = {{TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE}, 0x0, 0x8},
- [REMATCH_WALLACE] = {{TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE}, 0x0, 0x8},
+ [REMATCH_ROSE] = REMATCH(TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5, ROUTE118),
+ [REMATCH_ANDRES] = REMATCH(TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5, ROUTE105),
+ [REMATCH_DUSTY] = REMATCH(TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5, ROUTE111),
+ [REMATCH_LOLA] = REMATCH(TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5, ROUTE109),
+ [REMATCH_RICKY] = REMATCH(TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5, ROUTE109),
+ [REMATCH_LILA_AND_ROY] = REMATCH(TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5, ROUTE124),
+ [REMATCH_CRISTIN] = REMATCH(TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5, ROUTE121),
+ [REMATCH_BROOKE] = REMATCH(TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5, ROUTE111),
+ [REMATCH_WILTON] = REMATCH(TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5, ROUTE111),
+ [REMATCH_VALERIE] = REMATCH(TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5, MT_PYRE_6F),
+ [REMATCH_CINDY] = REMATCH(TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6, ROUTE104),
+ [REMATCH_THALIA] = REMATCH(TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5, ABANDONED_SHIP_ROOMS_1F),
+ [REMATCH_JESSICA] = REMATCH(TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5, ROUTE121),
+ [REMATCH_WINSTON] = REMATCH(TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5, ROUTE104),
+ [REMATCH_STEVE] = REMATCH(TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5, ROUTE114),
+ [REMATCH_TONY] = REMATCH(TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5, ROUTE107),
+ [REMATCH_NOB] = REMATCH(TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5, ROUTE115),
+ [REMATCH_KOJI] = REMATCH(TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5, ROUTE127),
+ [REMATCH_FERNANDO] = REMATCH(TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5, ROUTE123),
+ [REMATCH_DALTON] = REMATCH(TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5, ROUTE118),
+ [REMATCH_BERNIE] = REMATCH(TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5, ROUTE114),
+ [REMATCH_ETHAN] = REMATCH(TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5, JAGGED_PASS),
+ [REMATCH_JOHN_AND_JAY] = REMATCH(TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5, METEOR_FALLS_1F_2R),
+ [REMATCH_JEFFREY] = REMATCH(TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5, ROUTE120),
+ [REMATCH_CAMERON] = REMATCH(TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5, ROUTE123),
+ [REMATCH_JACKI] = REMATCH(TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5, ROUTE123),
+ [REMATCH_WALTER] = REMATCH(TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5, ROUTE121),
+ [REMATCH_KAREN] = REMATCH(TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5, ROUTE116),
+ [REMATCH_JERRY] = REMATCH(TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5, ROUTE116),
+ [REMATCH_ANNA_AND_MEG] = REMATCH(TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5, ROUTE117),
+ [REMATCH_ISABEL] = REMATCH(TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5, ROUTE110),
+ [REMATCH_MIGUEL] = REMATCH(TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5, ROUTE103),
+ [REMATCH_TIMOTHY] = REMATCH(TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5, ROUTE115),
+ [REMATCH_SHELBY] = REMATCH(TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5, MT_CHIMNEY),
+ [REMATCH_CALVIN] = REMATCH(TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5, ROUTE102),
+ [REMATCH_ELLIOT] = REMATCH(TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5, ROUTE106),
+ [REMATCH_ISAIAH] = REMATCH(TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5, ROUTE128),
+ [REMATCH_MARIA] = REMATCH(TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5, ROUTE117),
+ [REMATCH_ABIGAIL] = REMATCH(TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5, ROUTE110),
+ [REMATCH_DYLAN] = REMATCH(TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5, ROUTE117),
+ [REMATCH_KATELYN] = REMATCH(TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5, ROUTE128),
+ [REMATCH_BENJAMIN] = REMATCH(TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5, ROUTE110),
+ [REMATCH_PABLO] = REMATCH(TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5, ROUTE126),
+ [REMATCH_NICOLAS] = REMATCH(TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5, METEOR_FALLS_1F_2R),
+ [REMATCH_ROBERT] = REMATCH(TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5, ROUTE120),
+ [REMATCH_LAO] = REMATCH(TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5, ROUTE113),
+ [REMATCH_CYNDY] = REMATCH(TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5, ROUTE115),
+ [REMATCH_MADELINE] = REMATCH(TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5, ROUTE113),
+ [REMATCH_JENNY] = REMATCH(TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5, ROUTE124),
+ [REMATCH_DIANA] = REMATCH(TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5, JAGGED_PASS),
+ [REMATCH_AMY_AND_LIV] = REMATCH(TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6, ROUTE103),
+ [REMATCH_ERNEST] = REMATCH(TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5, ROUTE125),
+ [REMATCH_CORY] = REMATCH(TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5, ROUTE108),
+ [REMATCH_EDWIN] = REMATCH(TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5, ROUTE110),
+ [REMATCH_LYDIA] = REMATCH(TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5, ROUTE117),
+ [REMATCH_ISAAC] = REMATCH(TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5, ROUTE117),
+ [REMATCH_GABRIELLE] = REMATCH(TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5, MT_PYRE_3F),
+ [REMATCH_CATHERINE] = REMATCH(TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5, ROUTE119),
+ [REMATCH_JACKSON] = REMATCH(TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5, ROUTE119),
+ [REMATCH_HALEY] = REMATCH(TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5, ROUTE104),
+ [REMATCH_JAMES] = REMATCH(TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5, PETALBURG_WOODS),
+ [REMATCH_TRENT] = REMATCH(TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5, ROUTE112),
+ [REMATCH_SAWYER] = REMATCH(TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5, MT_CHIMNEY),
+ [REMATCH_KIRA_AND_DAN] = REMATCH(TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5, ABANDONED_SHIP_ROOMS2_1F),
+ [REMATCH_WALLY_3] = REMATCH(TRAINER_WALLY_3, TRAINER_WALLY_4, TRAINER_WALLY_5, TRAINER_WALLY_6, TRAINER_WALLY_6, VICTORY_ROAD_1F),
+ [REMATCH_ROXANNE] = REMATCH(TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5, RUSTBORO_CITY),
+ [REMATCH_BRAWLY] = REMATCH(TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5, DEWFORD_TOWN),
+ [REMATCH_WATTSON] = REMATCH(TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5, MAUVILLE_CITY),
+ [REMATCH_FLANNERY] = REMATCH(TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5, LAVARIDGE_TOWN),
+ [REMATCH_NORMAN] = REMATCH(TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5, PETALBURG_CITY),
+ [REMATCH_WINONA] = REMATCH(TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5, FORTREE_CITY),
+ [REMATCH_TATE_AND_LIZA] = REMATCH(TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5, MOSSDEEP_CITY),
+ [REMATCH_JUAN] = REMATCH(TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5, SOOTOPOLIS_CITY),
+ [REMATCH_SIDNEY] = REMATCH(TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, EVER_GRANDE_CITY),
+ [REMATCH_PHOEBE] = REMATCH(TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, EVER_GRANDE_CITY),
+ [REMATCH_GLACIA] = REMATCH(TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, EVER_GRANDE_CITY),
+ [REMATCH_DRAKE] = REMATCH(TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, EVER_GRANDE_CITY),
+ [REMATCH_WALLACE] = REMATCH(TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, EVER_GRANDE_CITY),
};
static const u16 sBadgeFlags[8] =
diff --git a/src/battle_tent.c b/src/battle_tent.c
index 85194417f..34e3e9628 100644
--- a/src/battle_tent.c
+++ b/src/battle_tent.c
@@ -44,7 +44,7 @@ static void sub_81BA040(void);
static void sub_81B9EC0(void);
// IWRAM bss
-static IWRAM_DATA u16 sRandMonSetId;
+static u16 sRandMonSetId;
// const rom data
void static (*const gUnknown_086160B4[])(void) =
diff --git a/src/battle_tower.c b/src/battle_tower.c
index 6f8e3e25f..8ef848e39 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -3190,7 +3190,7 @@ static void FillPartnerParty(u16 trainerId)
sStevenMons[i].level,
sStevenMons[i].fixedIV,
TRUE, i, // BUG: personality was stored in the 'j' variable. As a result, Steven's pokemon do not have the intended natures.
- TRUE, STEVEN_OTID);
+ OT_ID_PRESET, 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 < MAX_MON_MOVES; j++)
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 7edb1bd93..3e86fcf51 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -262,10 +262,10 @@ static bool8 sub_814842C(struct Sprite *sprite);
static bool8 sub_8148458(struct Sprite *sprite);
// iwram bss vars
-IWRAM_DATA static s16 sUnusedRectangularSpiralVar;
-IWRAM_DATA static u8 sTestingTransitionId;
-IWRAM_DATA static u8 sTestingTransitionState;
-IWRAM_DATA static struct StructRectangularSpiral sRectangularSpiralTransition[4];
+static s16 sUnusedRectangularSpiralVar;
+static u8 sTestingTransitionId;
+static u8 sTestingTransitionState;
+static struct StructRectangularSpiral sRectangularSpiralTransition[4];
// ewram vars
EWRAM_DATA static struct TransitionData *sTransitionStructPtr = NULL;
diff --git a/src/berry_blender.c b/src/berry_blender.c
index d6a7879f4..03764b2f8 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -194,10 +194,10 @@ EWRAM_DATA static s32 sUnknown_020322BC[5] = {0};
EWRAM_DATA static u32 sUnknown_020322D0 = 0;
// IWRAM bss
-IWRAM_DATA static s16 sUnknown_03000DE8[8];
-IWRAM_DATA static s16 sUnknown_03000DF8[6];
-IWRAM_DATA static s16 sUnknown_03000E04;
-IWRAM_DATA static s16 sUnknown_03000E06;
+static s16 sUnknown_03000DE8[8];
+static s16 sUnknown_03000DF8[6];
+static s16 sUnknown_03000E04;
+static s16 sUnknown_03000E06;
// IWRAM common
u8 gInGameOpponentsNo;
diff --git a/src/berry_crush.c b/src/berry_crush.c
index a5d964cc9..6259e0a41 100755
--- a/src/berry_crush.c
+++ b/src/berry_crush.c
@@ -55,7 +55,10 @@ struct BerryCrushGame_138_C
struct BerryCrushGame_138
{
- u8 filler0[0xC];
+ u8 filler0[0x4];
+ u16 unk4;
+ u16 unk6;
+ u16 unk8;
struct BerryCrushGame_138_C *unkC[5];
u8 filler1C[0x4];
struct Sprite *unk24[5];
@@ -105,7 +108,7 @@ struct BerryCrushGame
u8 filler26[0x2];
u16 unk28;
u16 unk2A;
- u16 unk2C;
+ s16 unk2C;
u8 filler2E[0x8];
u8 unk36[0xA];
struct BerryCrushGame_40 unk40;
@@ -149,6 +152,8 @@ extern const struct SpriteTemplate gUnknown_082F436C;
extern const u16 gUnknown_082F41E8[];
extern const s8 gUnknown_082F41CC[][2];
extern const s8 gUnknown_082F41D2[][2];
+extern const u32 gUnknown_082F334C[];
+extern const u8 gUnknown_082F32D8[][3];
struct BerryCrushGame *sub_8020C00(void)
{
@@ -700,76 +705,121 @@ void sub_80216A8(struct BerryCrushGame *arg0)
}
}
-// void sub_80216E0(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1)
-// {
-// u8 sp4;
-// struct BerryCrushGame_4E *var4E;
-// u8 i;
-// u16 var0;
-
-// sp4 = 0;
-// var4E = &arg0->unk40.unkE;
-// for (i = 0; i < arg0->unk9; i++)
-// {
-// var0 = var4E->unkA >> (i * 3);
-// var0 &= 7;
-// if (var0)
-// {
-// int offset;
-// sp4++;
-// if (var0 & 0x4)
-// StartSpriteAnim(arg1->unk24[i], 1);
-// else
-// StartSpriteAnim(arg1->unk24[i], 0);
-
-// arg1->unk24[i]->invisible = 0;
-// arg1->unk24[i]->animPaused = 0;
-// offset = (var0 % 4) - 1;
-// arg1->unk24[i]->pos2.x = gUnknown_082F41CC[offset][0];
-// arg1->unk24[i]->pos2.y = gUnknown_082F41CC[offset][1];
-// }
-// }
-
-// if (sp4 == 0)
-// {
-// arg0->unk25_2 = 0;
-// }
-// else
-// {
-// u8 var3 = arg0->unk28 % 3;
-// u16 var2 = var3;
-// for (i = 0; i < var4E->unkC * 2 + 3; i++)
-// {
-// if (arg1->unk4C[i]->invisible)
-// {
-// arg1->unk4C[i]->callback = sub_8022B28;
-// arg1->unk4C[i]->pos1.x = gUnknown_082F41D2[i][0] + 120;
-// arg1->unk4C[i]->pos1.y = gUnknown_082F41D2[i][1] + (136 - var2 * 4);
-// arg1->unk4C[i]->pos2.x = gUnknown_082F41D2[i][0] / (var3 * 4);
-// arg1->unk4C[i]->pos2.y = gUnknown_082F41D2[i][1];
-// if (var4E->unk4 & 0x2)
-// StartSpriteAnim(arg1->unk4C[i], 1);
-// else
-// StartSpriteAnim(arg1->unk4C[i], 0);
-
-// var2++;
-// if (var2 > 3)
-// var2 = 0;
-// }
-// }
-
-// if (arg0->unk25_2)
-// {
-// arg0->unk25_2 = 0;
-// }
-// else
-// {
-// if (sp4 == 1)
-// PlaySE(SE_TOY_DANGO);
-// else
-// PlaySE(SE_TOY_KABE);
-
-// arg0->unk25_2 = 1;
-// }
-// }
-// }
+void sub_80216E0(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1)
+{
+ u8 sp4;
+ struct BerryCrushGame_4E *var4E;
+ u8 i;
+ u16 var, var2;
+
+ sp4 = 0;
+ var4E = &arg0->unk40.unkE;
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ var = var4E->unkA >> (i * 3);
+ var &= 7;
+ if (var)
+ {
+ sp4++;
+ if (var & 0x4)
+ StartSpriteAnim(arg1->unk24[i], 1);
+ else
+ StartSpriteAnim(arg1->unk24[i], 0);
+
+ arg1->unk24[i]->invisible = 0;
+ arg1->unk24[i]->animPaused = 0;
+ arg1->unk24[i]->pos2.x = gUnknown_082F41CC[(var % 4) - 1][0];
+ arg1->unk24[i]->pos2.y = gUnknown_082F41CC[(var % 4) - 1][1];
+ }
+ }
+
+ if (sp4 == 0)
+ {
+ arg0->unk25_2 = 0;
+ }
+ else
+ {
+ var = (u8)(arg0->unk28 % 3);
+ var2 = var;
+ for (i = 0; i < var4E->unkC * 2 + 3; i++)
+ {
+ if (arg1->unk4C[i]->invisible)
+ {
+ arg1->unk4C[i]->callback = sub_8022B28;
+ arg1->unk4C[i]->pos1.x = gUnknown_082F41D2[i][0] + 120;
+ arg1->unk4C[i]->pos1.y = gUnknown_082F41D2[i][1] + 136 - (var * 4);
+ arg1->unk4C[i]->pos2.x = gUnknown_082F41D2[i][0] + (gUnknown_082F41D2[i][0] / (var2 * 4));
+ arg1->unk4C[i]->pos2.y = gUnknown_082F41D2[i][1];
+ if (var4E->unk4 & 0x2)
+ StartSpriteAnim(arg1->unk4C[i], 1);
+ else
+ StartSpriteAnim(arg1->unk4C[i], 0);
+
+ var++;
+ if (var > 3)
+ var = 0;
+ }
+ }
+
+ if (arg0->unk25_2)
+ {
+ arg0->unk25_2 = 0;
+ }
+ else
+ {
+ if (sp4 == 1)
+ PlaySE(SE_TOY_DANGO);
+ else
+ PlaySE(SE_TOY_KABE);
+
+ arg0->unk25_2 = 1;
+ }
+ }
+}
+
+bool32 sub_80218D4(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1)
+{
+ u8 i;
+
+ for (i = 0; i < arg0->unk9; i++)
+ {
+ if (!arg1->unk24[i]->invisible)
+ return FALSE;
+ }
+
+ for (i = 0; i < 11; i++)
+ {
+ if (!arg1->unk4C[i]->invisible)
+ return FALSE;
+ }
+
+ if (arg0->unk2C != 0)
+ arg0->unk2C = 0;
+
+ return TRUE;
+}
+
+void sub_8021944(struct BerryCrushGame_138 *arg0, u16 arg1)
+{
+ u8 i = 0;
+ u32 r7 = 0;
+ s16 r3 = 0;
+
+ arg0->unk4 = arg1 / 3600;
+ arg0->unk6 = (arg1 % 3600) / 60;
+ r3 = sub_8151534((arg1 % 60) << 8, 4);
+
+ for (i = 0; i < 8; i++)
+ {
+ if ((r3 >> (7 - i)) & 1)
+ r7 += gUnknown_082F334C[i];
+ }
+
+ arg0->unk8 = r7 / 1000000;
+}
+
+void sub_80219C8(u8 windowId, u8 left, u8 colorId, const u8 *string)
+{
+ left = (left * 4) - (GetStringWidth(2, string, -1) / 2u);
+ AddTextPrinterParameterized3(windowId, 2, left, 0, gUnknown_082F32D8[colorId], 0, string);
+}
diff --git a/src/bg.c b/src/bg.c
index 1826f9a28..1678f4023 100644
--- a/src/bg.c
+++ b/src/bg.c
@@ -37,9 +37,9 @@ struct BgConfig2
s32 bg_y;
};
-static IWRAM_DATA struct BgControl sGpuBgConfigs;
-static IWRAM_DATA struct BgConfig2 sGpuBgConfigs2[4];
-static IWRAM_DATA u32 sDmaBusyBitfield[4];
+static struct BgControl sGpuBgConfigs;
+static struct BgConfig2 sGpuBgConfigs2[4];
+static u32 sDmaBusyBitfield[4];
u32 gUnneededFireRedVariable;
@@ -220,7 +220,7 @@ static void ShowBgInternal(u8 bg)
(sGpuBgConfigs.configs[bg].wraparound << 13) |
(sGpuBgConfigs.configs[bg].screenSize << 14);
- SetGpuReg((bg << 1) + 0x8, value);
+ SetGpuReg((bg << 1) + REG_OFFSET_BG0CNT, value);
sGpuBgConfigs.bgVisibilityAndMode |= 1 << (bg + 8);
sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS;
@@ -914,7 +914,6 @@ void CopyBgTilemapBufferToVram(u8 bg)
void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 width, u8 height)
{
- const void *srcCopy;
u16 destX16;
u16 destY16;
u16 mode;
@@ -924,27 +923,31 @@ void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 wi
switch (GetBgType(bg))
{
case 0:
- srcCopy = src;
+ {
+ const u16 * srcCopy = src;
for (destY16 = destY; destY16 < (destY + height); destY16++)
{
for (destX16 = destX; destX16 < (destX + width); destX16++)
{
- ((u16*)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *((u16*)srcCopy)++;
+ ((u16*)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *srcCopy++;
}
}
break;
+ }
case 1:
- srcCopy = src;
+ {
+ const u8 * srcCopy = src;
mode = GetBgMetricAffineMode(bg, 0x1);
for (destY16 = destY; destY16 < (destY + height); destY16++)
{
for (destX16 = destX; destX16 < (destX + width); destX16++)
{
- ((u8*)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *((u8*)srcCopy)++;
+ ((u8*)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *srcCopy++;
}
}
break;
}
+ }
}
}
diff --git a/src/cable_car.c b/src/cable_car.c
index d44c9a241..adeee2647 100644
--- a/src/cable_car.c
+++ b/src/cable_car.c
@@ -245,7 +245,7 @@ static void CableCarMainCallback_Setup(void)
{
u16 imebak;
u8 i = 0;
- int sizeOut = 0;
+ u32 sizeOut = 0;
switch (gMain.state)
{
diff --git a/src/contest.c b/src/contest.c
index eb3252f72..662a27060 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -269,8 +269,6 @@ extern const u8 gText_Contest_Fear[];
extern const u8 gText_BDot[];
extern const u8 gText_CDot[];
extern const u8 *const gUnknown_08587E10[];
-extern const struct SpriteTemplate gSpriteTemplate_8587AD0;
-extern const struct SpriteTemplate gSpriteTemplate_8587B18[];
extern void (*const gContestEffectFuncs[])(void);
static const u8 gUnknown_08587A6C[] =
@@ -1268,7 +1266,7 @@ static void sub_80D8108(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 1:
- (s16)gBattle_BG1_Y += 7;
+ *(s16*)&gBattle_BG1_Y += 7;
if ((s16)gBattle_BG1_Y <= 160)
break;
gTasks[taskId].data[0]++;
@@ -2975,7 +2973,7 @@ static u8 sub_80DB174(u16 species, u32 otId, u32 personality, u32 index)
else
HandleLoadSpecialPokePic_DontHandleDeoxys(gMonBackPicTable + species, gMonSpritesGfxPtr->sprites[0], species, personality);
- LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x120, 0x20);
+ LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x120, 0x20);
SetMultiuseSpriteTemplateToPokemon(species, 0);
spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x70, GetBattlerSpriteFinal_Y(2, species, FALSE), 30);
diff --git a/src/contest_link_80F57C4.c b/src/contest_link_80F57C4.c
index bae7859b5..a0a29f0ad 100644
--- a/src/contest_link_80F57C4.c
+++ b/src/contest_link_80F57C4.c
@@ -71,15 +71,10 @@ struct ContestLinkUnk14
u8 unk12;
};
-struct ContestLinkUnk4
-{
- struct ContestLinkUnk14 unk0[4];
-};
-
struct ContestLink80F57C4
{
struct ContestLinkUnk0 *unk0;
- struct ContestLinkUnk4 *unk4;
+ struct ContestLinkUnk14 (*unk4)[4];
u8 *unk8;
u8 *unkC[4];
u8 *unk1C;
@@ -205,9 +200,7 @@ void sub_80F57C4(void)
void sub_80F591C(void)
{
int i, j;
- s8 var0;
- s8 var1;
- int var2;
+ s8 var0, var1;
u16 tile1, tile2;
LZDecompressVram(gUnknown_08C19588, (void *)BG_CHAR_ADDR(0));
@@ -228,11 +221,7 @@ void sub_80F591C(void)
if (j < var0)
tile1 += 2;
- var2 = var1;
- if (var1 < 0)
- var2 = -var2;
-
- if (j < var2)
+ if (j < abs(var1))
{
tile2 = 0x60A4;
if (var1 < 0)
@@ -719,7 +708,7 @@ static void sub_80F6404(u8 taskId)
if (top > 80)
top = 80;
- gBattle_WIN0V = (top << 8) | (160 - top);;
+ gBattle_WIN0V = (top << 8) | (160 - top);
if (top == 80)
gTasks[taskId].data[0]++;
}
@@ -737,8 +726,7 @@ static void sub_80F6404(u8 taskId)
static void sub_80F66B4(u8 taskId)
{
- int i;
- u16 nationalDexNum;
+ int i, nationalDexNum;
if (gMain.newKeys & A_BUTTON)
{
@@ -859,13 +847,13 @@ static void sub_80F68F0(u8 taskId)
void sub_80F69B8(u16 species, u8 monIndex, u8 srcOffset, u8 useDmaNow, u32 personality)
{
- u8 frameNum;
const u8 *iconPtr;
- u16 var0;
- u16 var1;
+ u16 var0, var1, frameNum;
- u8 *contestPlayerMonIndex = &gContestPlayerMonIndex; // fake match
- frameNum = (monIndex == *contestPlayerMonIndex) ? 1 : 0;
+ if (monIndex == gContestPlayerMonIndex)
+ frameNum = 1;
+ else
+ frameNum = 0;
iconPtr = GetMonIconPtr(species, personality, frameNum);
iconPtr += srcOffset * 0x200 + 0x80;
@@ -892,13 +880,12 @@ static void LoadAllContestMonIcons(u8 srcOffset, u8 useDmaNow)
static void sub_80F6A9C(void)
{
- int i;
- register u16 species asm("r0");
+ int i, species;
for (i = 0; i < 4; i++)
{
- species = GetIconSpecies(gContestMons[i].species, 0);
- LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[species]], i * 0x10 + 0xA0, 0x20);
+ species = gContestMons[i].species;
+ LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[GetIconSpecies(species, 0)]], i * 0x10 + 0xA0, 0x20);
}
}
@@ -1335,11 +1322,11 @@ static void sub_80F6F40(struct Sprite *sprite)
static void sub_80F6F68(struct Sprite *sprite)
{
int i;
- s16 var0;
- var0 = (u16)sprite->data[7] + (u16)sprite->data[6];
- sprite->pos1.x -= var0 >> 8;
- sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF;
+ s16 delta = sprite->data[7] + sprite->data[6];
+ sprite->pos1.x -= delta >> 8;
+ sprite->data[7] += sprite->data[6];
+ sprite->data[7] &= 0xFF;
if (sprite->pos1.x < sprite->data[4])
sprite->pos1.x = sprite->data[4];
@@ -1366,11 +1353,12 @@ static void sub_80F6FDC(struct Sprite *sprite)
static void sub_80F7014(struct Sprite *sprite)
{
int i;
- s16 var0;
+ s16 delta;
- var0 = (u16)sprite->data[7] + (u16)sprite->data[6];
- sprite->pos1.x -= var0 >> 8;
- sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF;
+ delta = sprite->data[7] + sprite->data[6];
+ sprite->pos1.x -= delta >> 8;
+ sprite->data[7] += sprite->data[6];
+ sprite->data[7] &= 0xFF;
for (i = 0; i < 3; i++)
{
struct Sprite *sprite2 = &gSprites[sprite->data[i]];
@@ -1487,14 +1475,11 @@ static void sub_80F71C8(void)
CopyToBgTilemapBufferRect_ChangePalette(2, gUnknown_0203A034->unkC[2], 0, 0, 32, 4, palette);
}
-// fakematching?
u8 sub_80F7310(u8 monIndex, u8 arg1)
{
- u32 var0;
- u32 var1;
+ u32 var0 = gContestMonConditions[monIndex] << 16;
+ u32 var1 = var0 / 0x3F;
- var0 = gContestMonConditions[monIndex] << 16;
- var1 = var0 / 0x3F;
if (var1 & 0xFFFF)
var1 += 0x10000;
@@ -1510,8 +1495,7 @@ u8 sub_80F7310(u8 monIndex, u8 arg1)
s8 sub_80F7364(u8 arg0, u8 arg1)
{
- u32 r4;
- u32 r2;
+ u32 r4, r2;
s16 val;
s8 ret;
@@ -1607,9 +1591,10 @@ static void sub_80F75A8(struct Sprite *sprite)
}
else
{
- s16 delta = (u16)sprite->data[1] + 0x600;
+ s16 delta = sprite->data[1] + 0x600;
sprite->pos1.x -= delta >> 8;
- sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF;
+ sprite->data[1] += 0x600;
+ sprite->data[1] &= 0xFF;
if (sprite->pos1.x < 120)
sprite->pos1.x = 120;
@@ -1624,9 +1609,10 @@ static void sub_80F75A8(struct Sprite *sprite)
static void sub_80F7620(struct Sprite *sprite)
{
- s16 delta = (u16)sprite->data[1] + 0x600;
+ s16 delta = sprite->data[1] + 0x600;
sprite->pos1.x -= delta >> 8;
- sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF;
+ sprite->data[1] += + 0x600;
+ sprite->data[1] &= 0xFF;
if (sprite->pos1.x < -32)
{
sprite->callback = SpriteCallbackDummy;
@@ -1657,14 +1643,15 @@ static void sub_80F7670(u8 taskId)
void sub_80F7768(struct Sprite *sprite)
{
- register s16 var0 asm("r1");
+ s16 delta;
sprite->data[3] += sprite->data[0];
sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]);
- var0 = sprite->data[4] + sprite->data[2];
- sprite->pos1.x += var0 >> 8;
- var0 = var0 & 0xFF;
- sprite->data[4] = var0;
+ delta = sprite->data[4] + sprite->data[2];
+ sprite->pos1.x += delta >> 8;
+ sprite->data[4] += sprite->data[2];
+ sprite->data[4] &= 0xff;
+
sprite->pos1.y++;
if (gUnknown_0203A034->unk0->unk9)
sprite->invisible = 1;
@@ -1695,705 +1682,145 @@ static void sub_80F7824(u8 taskId)
}
}
-// static void sub_80F7880(void)
-// {
-// int i;
-// int var0;
-// int var1;
-// int var2;
-// int var3;
-// u32 var4;
-// int var5;
-// int var6;
-// s16 var7;
-// s16 var8;
-// s16 r2;
-
-// r2 = gUnknown_02039F08[0];
-// for (i = 1; i < 4; i++)
-// {
-// if (r2 < gUnknown_02039F08[i])
-// r2 = gUnknown_02039F08[i];
-// }
-
-// if (r2 < 0)
-// {
-// r2 = gUnknown_02039F08[0];
-// for (i = 1; i < 4; i++)
-// {
-// if (r2 > gUnknown_02039F08[i])
-// r2 = gUnknown_02039F08[i];
-// }
-// }
-
-// // _080F78E4
-// for (i = 0; i < 4; i++)
-// {
-// var0 = gContestMonConditions[i] * 1000;
-// var1 = r2;
-// if (r2 < 0)
-// var1 = -var1;
-
-// var2 = var0 / var1;
-// if (var2 % 10 > 4)
-// var2 += 10;
-
-// gUnknown_0203A034->unk4->unk0[i].unk0 = var2 / 10;
-// var3 = gUnknown_02039F18[i];
-// if (var3 < 0)
-// var3 = -var3;
-
-// var0 = var3 * 1000;
-// var1 = r2;
-// if (r2 < 0)
-// var1 = -var1;
-
-// var2 = var0 / var1;
-// if (var2 % 10 > 4)
-// var2 += 10;
-
-// // _080F7966
-// gUnknown_0203A034->unk4->unk0[i].unk4 = var2 / 10;
-// if (gUnknown_02039F18[i] < 0)
-// gUnknown_0203A034->unk4->unk0[i].unk10 = 1;
-
-// var4 = gUnknown_0203A034->unk4->unk0[i].unk0 * 22528 / 100;
-// if ((var4 & 0xFF) > 0x7F)
-// var4 += 0x100;
-
-// gUnknown_0203A034->unk4->unk0[i].unk8 = var4 >> 8;
-// var4 = gUnknown_0203A034->unk4->unk0[i].unk4 * 22528 / 100;
-// if ((var4 & 0xFF) > 0x7F)
-// var4 += 0x100;
-
-// gUnknown_0203A034->unk4->unk0[i].unkC = var4 >> 8;
-// gUnknown_0203A034->unk4->unk0[i].unk11 = sub_80F7310(i, 1);
-// var5 = sub_80F7364(i, 1);
-// if (var5 < 0)
-// var5 = -var5;
-
-// gUnknown_0203A034->unk4->unk0[i].unk12 = var5;
-// if (gContestFinalStandings[i])
-// {
-// var7 = gUnknown_0203A034->unk4->unk0[i].unk8;
-// var8 = gUnknown_0203A034->unk4->unk0[i].unkC;
-// if (gUnknown_0203A034->unk4->unk0[i].unk10)
-// var8 = -var8;
-
-// if (var7 + var8 == 88)
-// {
-// if (var8 > 0)
-// gUnknown_0203A034->unk4->unk0[i].unkC--;
-// else if (var7 > 0)
-// gUnknown_0203A034->unk4->unk0[i].unk8--;
-// }
-// }
-// }
-// }
-
-NAKED
static void sub_80F7880(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\
- sub sp, 0x4\n\
- ldr r0, =gUnknown_02039F08\n\
- ldrh r2, [r0]\n\
- adds r4, r0, 0\n\
- adds r3, r4, 0x2\n\
- movs r0, 0x2\n\
- mov r8, r0\n\
-_080F7898:\n\
- lsls r0, r2, 16\n\
- asrs r0, 16\n\
- movs r5, 0\n\
- ldrsh r1, [r3, r5]\n\
- cmp r0, r1\n\
- bge _080F78A6\n\
- ldrh r2, [r3]\n\
-_080F78A6:\n\
- adds r3, 0x2\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- add r8, r0\n\
- mov r1, r8\n\
- cmp r1, 0\n\
- bge _080F7898\n\
- lsls r0, r2, 16\n\
- str r0, [sp]\n\
- cmp r0, 0\n\
- bge _080F78E4\n\
- ldrh r2, [r4]\n\
- adds r3, r4, 0x2\n\
- movs r4, 0x2\n\
- mov r8, r4\n\
-_080F78C4:\n\
- lsls r0, r2, 16\n\
- asrs r0, 16\n\
- movs r5, 0\n\
- ldrsh r1, [r3, r5]\n\
- cmp r0, r1\n\
- ble _080F78D2\n\
- ldrh r2, [r3]\n\
-_080F78D2:\n\
- adds r3, 0x2\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- add r8, r0\n\
- lsls r1, r2, 16\n\
- str r1, [sp]\n\
- mov r4, r8\n\
- cmp r4, 0\n\
- bge _080F78C4\n\
-_080F78E4:\n\
- movs r5, 0\n\
- mov r8, r5\n\
- mov r10, r5\n\
-_080F78EA:\n\
- ldr r0, =gContestMonConditions\n\
- mov r1, r8\n\
- lsls r7, r1, 1\n\
- adds r0, r7, r0\n\
- movs r2, 0\n\
- ldrsh r1, [r0, r2]\n\
- lsls r0, r1, 5\n\
- subs r0, r1\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- lsls r0, 3\n\
- ldr r4, [sp]\n\
- asrs r5, r4, 16\n\
- adds r1, r5, 0\n\
- cmp r5, 0\n\
- bge _080F790C\n\
- negs r1, r5\n\
-_080F790C:\n\
- bl __divsi3\n\
- adds r4, r0, 0\n\
- movs r1, 0xA\n\
- bl __modsi3\n\
- cmp r0, 0x4\n\
- ble _080F791E\n\
- adds r4, 0xA\n\
-_080F791E:\n\
- ldr r0, =gUnknown_0203A034\n\
- mov r9, r0\n\
- ldr r0, [r0]\n\
- ldr r0, [r0, 0x4]\n\
- mov r1, r10\n\
- adds r6, r1, r0\n\
- adds r0, r4, 0\n\
- movs r1, 0xA\n\
- bl __divsi3\n\
- str r0, [r6]\n\
- ldr r0, =gUnknown_02039F18\n\
- adds r7, r0\n\
- movs r2, 0\n\
- ldrsh r1, [r7, r2]\n\
- cmp r1, 0\n\
- bge _080F7942\n\
- negs r1, r1\n\
-_080F7942:\n\
- lsls r0, r1, 5\n\
- subs r0, r1\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- lsls r0, 3\n\
- adds r1, r5, 0\n\
- cmp r1, 0\n\
- bge _080F7954\n\
- negs r1, r1\n\
-_080F7954:\n\
- bl __divsi3\n\
- adds r4, r0, 0\n\
- movs r1, 0xA\n\
- bl __modsi3\n\
- cmp r0, 0x4\n\
- ble _080F7966\n\
- adds r4, 0xA\n\
-_080F7966:\n\
- adds r0, r4, 0\n\
- movs r1, 0xA\n\
- bl __divsi3\n\
- str r0, [r6, 0x4]\n\
- movs r4, 0\n\
- ldrsh r0, [r7, r4]\n\
- cmp r0, 0\n\
- bge _080F797C\n\
- movs r0, 0x1\n\
- strb r0, [r6, 0x10]\n\
-_080F797C:\n\
- mov r5, r9\n\
- ldr r0, [r5]\n\
- ldr r0, [r0, 0x4]\n\
- mov r1, r10\n\
- adds r4, r1, r0\n\
- ldr r1, [r4]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- subs r0, r1\n\
- lsls r0, 11\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- movs r5, 0xFF\n\
- ands r0, r5\n\
- cmp r0, 0x7F\n\
- bls _080F79A8\n\
- movs r2, 0x80\n\
- lsls r2, 1\n\
- adds r1, r2\n\
-_080F79A8:\n\
- lsrs r0, r1, 8\n\
- str r0, [r4, 0x8]\n\
- ldr r1, [r4, 0x4]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- subs r0, r1\n\
- lsls r0, 11\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- ands r0, r5\n\
- cmp r0, 0x7F\n\
- bls _080F79CC\n\
- movs r5, 0x80\n\
- lsls r5, 1\n\
- adds r1, r5\n\
-_080F79CC:\n\
- lsrs r0, r1, 8\n\
- str r0, [r4, 0xC]\n\
- mov r0, r8\n\
- lsls r4, r0, 24\n\
- lsrs r4, 24\n\
- adds r0, r4, 0\n\
- movs r1, 0x1\n\
- bl sub_80F7310\n\
- mov r2, r9\n\
- ldr r1, [r2]\n\
- ldr r1, [r1, 0x4]\n\
- add r1, r10\n\
- strb r0, [r1, 0x11]\n\
- adds r0, r4, 0\n\
- movs r1, 0x1\n\
- bl sub_80F7364\n\
- mov r4, r9\n\
- ldr r1, [r4]\n\
- ldr r1, [r1, 0x4]\n\
- add r1, r10\n\
- lsls r0, 24\n\
- asrs r0, 24\n\
- cmp r0, 0\n\
- bge _080F7A02\n\
- negs r0, r0\n\
-_080F7A02:\n\
- strb r0, [r1, 0x12]\n\
- ldr r0, =gContestFinalStandings\n\
- add r0, r8\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _080F7A60\n\
- mov r5, r9\n\
- ldr r0, [r5]\n\
- ldr r0, [r0, 0x4]\n\
- mov r2, r10\n\
- adds r1, r2, r0\n\
- ldr r5, [r1, 0x8]\n\
- ldrh r3, [r1, 0x8]\n\
- ldr r4, [r1, 0xC]\n\
- ldrh r2, [r1, 0xC]\n\
- ldrb r0, [r1, 0x10]\n\
- cmp r0, 0\n\
- beq _080F7A2C\n\
- lsls r0, r2, 16\n\
- negs r0, r0\n\
- lsrs r2, r0, 16\n\
-_080F7A2C:\n\
- lsls r0, r3, 16\n\
- asrs r3, r0, 16\n\
- lsls r0, r2, 16\n\
- asrs r2, r0, 16\n\
- adds r0, r3, r2\n\
- cmp r0, 0x58\n\
- bne _080F7A60\n\
- cmp r2, 0\n\
- ble _080F7A58\n\
- subs r0, r4, 0x1\n\
- str r0, [r1, 0xC]\n\
- b _080F7A60\n\
- .pool\n\
-_080F7A58:\n\
- cmp r3, 0\n\
- ble _080F7A60\n\
- subs r0, r5, 0x1\n\
- str r0, [r1, 0x8]\n\
-_080F7A60:\n\
- movs r4, 0x14\n\
- add r10, r4\n\
- movs r5, 0x1\n\
- add r8, r5\n\
- mov r0, r8\n\
- cmp r0, 0x3\n\
- bgt _080F7A70\n\
- b _080F78EA\n\
-_080F7A70:\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");
-}
-
-// static void sub_80F7A80(u8 arg0, u8 arg1)
-// {
-// int i;
-// u8 taskId;
-// u8 sp8, spC;
-
-// sp8 = 0;
-// spC = 0;
-// if (!arg0)
-// {
-// u32 var0;
-// for (i = 0; i < 4; i++)
-// {
-// int var1 = gUnknown_0203A034->unk4->unk0[i].unk11;
-// if (arg1 < var1)
-// {
-// int x = var1 + 19;
-// x -= arg1;
-// x--;
-// FillBgTilemapBufferRect_Palette0(1, 0x60B3, x, i * 3 + 5, 1, 1);
-// taskId = CreateTask(sub_80F7CA8, 10);
-// var0 = ((gUnknown_0203A034->unk4->unk0[i].unk8 << 16) / gUnknown_0203A034->unk4->unk0[i].unk11) * (arg1 + 1);
-// var0 &= 0xFFFF;
-// if (var0 > 0x7FFF)
-// var0 += 0x10000;
-
-// gTasks[taskId].data[0] = i;
-// gTasks[taskId].data[1] = var0 >> 16;
-// gUnknown_0203A034->unk0->unk14++;
-// sp8++;
-// }
-// }
-// }
-// else
-// {
-// u32 var0;
-// for (i = 0; i < 4; i++)
-// {
-// int tile;
-// s8 var1 = gUnknown_0203A034->unk4->unk0[i].unk12;
-// tile = gUnknown_0203A034->unk4->unk0[i].unk10 ? 0x60A5 : 0x60A3;
-// if (arg1 < var1)
-// {
-// int thing = ((s8)arg1 - 19);
-// int x = var1 - thing;
-// x--;
-// FillBgTilemapBufferRect_Palette0(1, tile, x, i * 3 + 6, 1, 1);
-// taskId = CreateTask(sub_80F7CA8, 10);
-// var0 = ((gUnknown_0203A034->unk4->unk0[i].unkC << 16) / gUnknown_0203A034->unk4->unk0[i].unk12) * (arg1 + 1);
-// var0 &= 0xFFFF;
-// if (var0 > 0x7FFF)
-// var0 += 0x10000;
-
-// gTasks[taskId].data[0] = i;
-// if (gUnknown_0203A034->unk4->unk0[i].unk10)
-// {
-// gTasks[taskId].data[2] = 1;
-// spC++;
-// }
-// else
-// {
-// sp8++;
-// }
-
-// if (gUnknown_0203A034->unk4->unk0[i].unk10)
-// gTasks[taskId].data[1] = gUnknown_0203A034->unk4->unk0[i].unk8 - (var0 >> 16);
-// else
-// gTasks[taskId].data[1] = gUnknown_0203A034->unk4->unk0[i].unk8 + (var0 >> 16);
-
-// gUnknown_0203A034->unk0->unk14++;
-// }
-// }
-// }
-
-// if (spC)
-// PlaySE(SE_PIN);
-
-// if (sp8)
-// PlaySE(SE_BAN);
-// }
+ int i, r4;
+ u32 r1;
+ s16 r2;
+ s8 var;
+
+ r2 = gUnknown_02039F08[0];
+ for (i = 1; i < 4; i++)
+ {
+ if (r2 < gUnknown_02039F08[i])
+ r2 = gUnknown_02039F08[i];
+ }
+
+ if (r2 < 0)
+ {
+ r2 = gUnknown_02039F08[0];
+ for (i = 1; i < 4; i++)
+ {
+ if (r2 > gUnknown_02039F08[i])
+ r2 = gUnknown_02039F08[i];
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ r4 = (gContestMonConditions[i] * 1000) / abs(r2);
+ if (r4 % 10 > 4)
+ r4 += 10;
+ (*gUnknown_0203A034->unk4)[i].unk0 = r4 / 10;
+
+ r4 = (abs(gUnknown_02039F18[i]) * 1000) / abs(r2);
+ if (r4 % 10 > 4)
+ r4 += 10;
+ (*gUnknown_0203A034->unk4)[i].unk4 = r4 / 10;
+
+ if (gUnknown_02039F18[i] < 0)
+ (*gUnknown_0203A034->unk4)[i].unk10 = 1;
+
+ r1 = ((*gUnknown_0203A034->unk4)[i].unk0 * 22528) / 100;
+ if ((r1 & 0xFF) > 0x7F)
+ r1 += 0x100;
+ (*gUnknown_0203A034->unk4)[i].unk8 = r1 >> 8;
+
+ r1 = ((*gUnknown_0203A034->unk4)[i].unk4 * 22528) / 100;
+ if ((r1 & 0xFF) > 0x7F)
+ r1 += 0x100;
+ (*gUnknown_0203A034->unk4)[i].unkC = r1 >> 8;
+
+ (*gUnknown_0203A034->unk4)[i].unk11 = sub_80F7310(i, 1);
+ var = sub_80F7364(i, 1);
+ (*gUnknown_0203A034->unk4)[i].unk12 = abs(var);
+
+ if (gContestFinalStandings[i])
+ {
+ s16 var1 = (*gUnknown_0203A034->unk4)[i].unk8;
+ s16 var2 = (*gUnknown_0203A034->unk4)[i].unkC;
+
+ if ((*gUnknown_0203A034->unk4)[i].unk10)
+ var2 *= -1;
+
+ if (var1 + var2 == 88)
+ {
+ if (var2 > 0)
+ (*gUnknown_0203A034->unk4)[i].unkC--;
+ else if (var1 > 0)
+ (*gUnknown_0203A034->unk4)[i].unk8--;
+ }
+ }
+ }
+}
-NAKED
static void sub_80F7A80(u8 arg0, u8 arg1)
{
- 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, 0x14\n\
- lsls r0, 24\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r8, r1\n\
- movs r1, 0\n\
- str r1, [sp, 0x8]\n\
- movs r3, 0\n\
- str r3, [sp, 0xC]\n\
- cmp r0, 0\n\
- bne _080F7B5C\n\
- mov r9, r3\n\
- ldr r4, =gUnknown_0203A034\n\
- mov r10, r4\n\
- movs r7, 0xA0\n\
- lsls r7, 19\n\
- movs r6, 0\n\
-_080F7AAC:\n\
- mov r1, r10\n\
- ldr r0, [r1]\n\
- ldr r0, [r0, 0x4]\n\
- adds r0, r6, r0\n\
- ldrb r2, [r0, 0x11]\n\
- cmp r8, r2\n\
- bcs _080F7B2E\n\
- adds r2, 0x13\n\
- mov r3, r8\n\
- subs r2, r3\n\
- subs r2, 0x1\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- lsrs r3, r7, 24\n\
- movs r0, 0x1\n\
- str r0, [sp]\n\
- str r0, [sp, 0x4]\n\
- ldr r1, =0x000060b3\n\
- bl FillBgTilemapBufferRect_Palette0\n\
- ldr r0, =sub_80F7CA8\n\
- movs r1, 0xA\n\
- bl CreateTask\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- mov r0, r10\n\
- ldr r4, [r0]\n\
- ldr r1, [r4, 0x4]\n\
- adds r1, r6, r1\n\
- ldr r0, [r1, 0x8]\n\
- lsls r0, 16\n\
- ldrb r1, [r1, 0x11]\n\
- bl __udivsi3\n\
- mov r1, r8\n\
- adds r1, 0x1\n\
- adds r3, r0, 0\n\
- muls r3, r1\n\
- ldr r0, =0x0000ffff\n\
- ands r0, r3\n\
- ldr r1, =0x00007fff\n\
- cmp r0, r1\n\
- bls _080F7B0A\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- adds r3, r1\n\
-_080F7B0A:\n\
- ldr r1, =gTasks\n\
- lsls r0, r5, 2\n\
- adds r0, r5\n\
- lsls r0, 3\n\
- adds r0, r1\n\
- mov r1, r9\n\
- strh r1, [r0, 0x8]\n\
- lsrs r1, r3, 16\n\
- strh r1, [r0, 0xA]\n\
- ldr r1, [r4]\n\
- ldrb r0, [r1, 0x14]\n\
- adds r0, 0x1\n\
- strb r0, [r1, 0x14]\n\
- ldr r0, [sp, 0x8]\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0x8]\n\
-_080F7B2E:\n\
- movs r3, 0xC0\n\
- lsls r3, 18\n\
- adds r7, r3\n\
- adds r6, 0x14\n\
- movs r4, 0x1\n\
- add r9, r4\n\
- mov r0, r9\n\
- cmp r0, 0x3\n\
- ble _080F7AAC\n\
- b _080F7C7E\n\
- .pool\n\
-_080F7B5C:\n\
- movs r1, 0\n\
- mov r9, r1\n\
- mov r10, r1\n\
- movs r3, 0xC0\n\
- lsls r3, 19\n\
- str r3, [sp, 0x10]\n\
-_080F7B68:\n\
- ldr r4, =gUnknown_0203A034\n\
- ldr r0, [r4]\n\
- ldr r0, [r0, 0x4]\n\
- add r0, r10\n\
- ldrb r2, [r0, 0x12]\n\
- ldrb r0, [r0, 0x10]\n\
- ldr r1, =0x000060a3\n\
- cmp r0, 0\n\
- beq _080F7B7C\n\
- adds r1, 0x2\n\
-_080F7B7C:\n\
- lsls r0, r2, 24\n\
- asrs r0, 24\n\
- cmp r8, r0\n\
- bge _080F7C64\n\
- mov r3, r8\n\
- lsls r2, r3, 24\n\
- asrs r2, 24\n\
- subs r2, 0x13\n\
- subs r2, r0, r2\n\
- subs r2, 0x1\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- ldr r4, [sp, 0x10]\n\
- lsrs r3, r4, 24\n\
- movs r7, 0x1\n\
- str r7, [sp]\n\
- str r7, [sp, 0x4]\n\
- movs r0, 0x1\n\
- bl FillBgTilemapBufferRect_Palette0\n\
- ldr r0, =sub_80F7CA8\n\
- movs r1, 0xA\n\
- bl CreateTask\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- ldr r0, =gUnknown_0203A034\n\
- ldr r6, [r0]\n\
- ldr r1, [r6, 0x4]\n\
- add r1, r10\n\
- ldr r0, [r1, 0xC]\n\
- lsls r0, 16\n\
- ldrb r1, [r1, 0x12]\n\
- bl __udivsi3\n\
- mov r1, r8\n\
- adds r1, 0x1\n\
- adds r3, r0, 0\n\
- muls r3, r1\n\
- ldr r0, =0x0000ffff\n\
- ands r0, r3\n\
- ldr r1, =0x00007fff\n\
- cmp r0, r1\n\
- bls _080F7BDA\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- adds r3, r1\n\
-_080F7BDA:\n\
- ldr r1, =gTasks\n\
- lsls r2, r5, 2\n\
- adds r0, r2, r5\n\
- lsls r0, 3\n\
- adds r4, r0, r1\n\
- mov r0, r9\n\
- strh r0, [r4, 0x8]\n\
- ldr r0, [r6, 0x4]\n\
- add r0, r10\n\
- ldrb r0, [r0, 0x10]\n\
- adds r6, r1, 0\n\
- cmp r0, 0\n\
- beq _080F7C1C\n\
- strh r7, [r4, 0xC]\n\
- ldr r0, [sp, 0xC]\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0xC]\n\
- b _080F7C26\n\
- .pool\n\
-_080F7C1C:\n\
- ldr r0, [sp, 0x8]\n\
- adds r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0x8]\n\
-_080F7C26:\n\
- ldr r1, =gUnknown_0203A034\n\
- ldr r0, [r1]\n\
- ldr r0, [r0, 0x4]\n\
- mov r4, r10\n\
- adds r1, r4, r0\n\
- ldrb r0, [r1, 0x10]\n\
- ldr r4, =gUnknown_0203A034\n\
- cmp r0, 0\n\
- beq _080F7C4C\n\
- adds r0, r2, r5\n\
- lsls r0, 3\n\
- adds r0, r6\n\
- lsrs r2, r3, 16\n\
- ldr r1, [r1, 0x8]\n\
- subs r1, r2\n\
- b _080F7C58\n\
- .pool\n\
-_080F7C4C:\n\
- adds r0, r2, r5\n\
- lsls r0, 3\n\
- adds r0, r6\n\
- lsrs r2, r3, 16\n\
- ldr r1, [r1, 0x8]\n\
- adds r1, r2\n\
-_080F7C58:\n\
- strh r1, [r0, 0xA]\n\
- ldr r0, [r4]\n\
- ldr r1, [r0]\n\
- ldrb r0, [r1, 0x14]\n\
- adds r0, 0x1\n\
- strb r0, [r1, 0x14]\n\
-_080F7C64:\n\
- movs r0, 0x14\n\
- add r10, r0\n\
- ldr r1, [sp, 0x10]\n\
- movs r3, 0xC0\n\
- lsls r3, 18\n\
- adds r1, r3\n\
- str r1, [sp, 0x10]\n\
- movs r4, 0x1\n\
- add r9, r4\n\
- mov r0, r9\n\
- cmp r0, 0x3\n\
- bgt _080F7C7E\n\
- b _080F7B68\n\
-_080F7C7E:\n\
- ldr r1, [sp, 0xC]\n\
- cmp r1, 0\n\
- beq _080F7C8A\n\
- movs r0, 0x16\n\
- bl PlaySE\n\
-_080F7C8A:\n\
- ldr r3, [sp, 0x8]\n\
- cmp r3, 0\n\
- beq _080F7C96\n\
- movs r0, 0x15\n\
- bl PlaySE\n\
-_080F7C96:\n\
- add sp, 0x14\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");
+ int i, taskId;
+ u32 var0;
+ u8 sp8 = 0, spC = 0;
+
+ if (!arg0)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ u8 unk = (*gUnknown_0203A034->unk4)[i].unk11;
+ if (arg1 < unk)
+ {
+ FillBgTilemapBufferRect_Palette0(1, 0x60B3, ((19 + unk) - arg1) - 1, i * 3 + 5, 1, 1);
+ taskId = CreateTask(sub_80F7CA8, 10);
+
+ var0 = (((*gUnknown_0203A034->unk4)[i].unk8 << 16) / (*gUnknown_0203A034->unk4)[i].unk11) * (arg1 + 1);
+ if ((var0 & 0xFFFF) > 0x7FFF)
+ var0 += 0x10000;
+
+ gTasks[taskId].data[0] = i;
+ gTasks[taskId].data[1] = var0 >> 16;
+ gUnknown_0203A034->unk0->unk14++;
+ sp8++;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ {
+ s8 unk = (*gUnknown_0203A034->unk4)[i].unk12;
+ u32 tile = (*gUnknown_0203A034->unk4)[i].unk10 ? 0x60A5 : 0x60A3;
+ if (arg1 < unk)
+ {
+ FillBgTilemapBufferRect_Palette0(1, tile, ((19 + unk) - arg1) - 1, i * 3 + 6, 1, 1);
+ taskId = CreateTask(sub_80F7CA8, 10);
+
+ var0 = (((*gUnknown_0203A034->unk4)[i].unkC << 16) / (*gUnknown_0203A034->unk4)[i].unk12) * (arg1 + 1);
+ if ((var0 & 0xFFFF) > 0x7FFF)
+ var0 += 0x10000;
+
+ gTasks[taskId].data[0] = i;
+ if ((*gUnknown_0203A034->unk4)[i].unk10)
+ {
+ gTasks[taskId].data[2] = 1;
+ spC++;
+ }
+ else
+ {
+ sp8++;
+ }
+
+ if ((*gUnknown_0203A034->unk4)[i].unk10)
+ gTasks[taskId].data[1] = -(var0 >> 16) + (*gUnknown_0203A034->unk4)[i].unk8 ;
+ else
+ gTasks[taskId].data[1] = (var0 >> 16) + (*gUnknown_0203A034->unk4)[i].unk8;
+
+ gUnknown_0203A034->unk0->unk14++;
+ }
+ }
+ }
+
+ if (spC)
+ PlaySE(SE_BOO);
+ if (sp8)
+ PlaySE(SE_PIN);
}
void sub_80F7CA8(u8 taskId)
@@ -2624,8 +2051,7 @@ void sub_80F8290(void)
void sub_80F82B4(void)
{
- u8 i;
- u8 count;
+ u8 i, count;
for (i = 0, count = 0; i < 4; i++)
{
diff --git a/src/contest_painting.c b/src/contest_painting.c
index b43923c7b..1b95e1ed9 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -28,11 +28,11 @@ struct ContestWinner *gUnknown_030061C0;
u16 *gContestPaintingMonPalette;
// IWRAM bss
-IWRAM_DATA u8 gContestPaintingState;
-IWRAM_DATA u16 gContestPaintingMosaicVal;
-IWRAM_DATA u16 gContestPaintingFadeCounter;
-IWRAM_DATA bool8 gUnknown_030011F6;
-IWRAM_DATA u8 gContestPaintingWindowId;
+static u8 gContestPaintingState;
+static u16 gContestPaintingMosaicVal;
+static u16 gContestPaintingFadeCounter;
+static bool8 gUnknown_030011F6;
+static u8 gContestPaintingWindowId;
static void ShowContestPainting(void);
static void HoldContestPainting(void);
@@ -250,8 +250,7 @@ static void HoldContestPainting(void)
case 1:
if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
{
- u8 two = 2; //needed to make the asm match
- gContestPaintingState = two;
+ gContestPaintingState++;
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
}
@@ -293,7 +292,7 @@ static void PrintContestPaintingCaption(u8 contestType, u8 arg1)
category = gUnknown_030061C0->contestCategory;
if (contestType < 8)
{
- sub_818E868(gStringVar1, category);
+ BufferContestName(gStringVar1, category);
StringAppend(gStringVar1, gText_Space);
StringAppend(gStringVar1, gContestRankTextPointers[gUnknown_030061C0->contestRank]);
StringCopy(gStringVar2, gUnknown_030061C0->trainerName);
@@ -363,7 +362,7 @@ static void VBlankCB_ContestPainting(void)
void sub_81302E8(u16 species, u8 arg1)
{
- const void *pal = GetFrontSpritePalFromSpeciesAndPersonality(species, gUnknown_030061C0->trainerId, gUnknown_030061C0->personality);
+ const void *pal = GetMonSpritePalFromSpeciesAndPersonality(species, gUnknown_030061C0->trainerId, gUnknown_030061C0->personality);
LZDecompressVram(pal, gContestPaintingMonPalette);
if (!arg1)
{
@@ -685,7 +684,7 @@ static void sub_8130760(u8 contestResult)
gUnknown_030061A0.var_16 = 2;
gUnknown_030061A0.var_0 = contestResult;
- gUnknown_030061A0.var_10 = 0x6010000;
+ gUnknown_030061A0.var_10 = OBJ_VRAM0;
sub_8124F2C(&gUnknown_030061A0);
sub_81261A4(&gUnknown_030061A0);
diff --git a/src/credits.c b/src/credits.c
index 1e96514b1..44fa2002c 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -143,7 +143,7 @@ struct Unk201C000
struct CreditsEntry
{
u8 var_0;
- u8 var_1;
+ bool8 isTitle;
const u8 *text;
};
@@ -165,7 +165,7 @@ static const u32 gCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_e
static void sub_81772B8(struct Sprite *sprite);
-static const u8 gUnknown_085E5BAC[] =
+static const u8 sTheEnd_LetterTMap[] =
{
0, 1, 0,
0xFF, 1, 0xFF,
@@ -174,7 +174,7 @@ static const u8 gUnknown_085E5BAC[] =
0xFF, 1, 0xFF,
};
-static const u8 gUnknown_085E5BBB[] =
+static const u8 sTheEnd_LetterHMap[] =
{
1, 0xFF, 1,
1, 0xFF, 1,
@@ -183,7 +183,7 @@ static const u8 gUnknown_085E5BBB[] =
1, 0xFF, 1,
};
-static const u8 gUnknown_085E5BCA[] =
+static const u8 sTheEnd_LetterEMap[] =
{
1, 0, 0,
1, 0xFF, 0xFF,
@@ -192,7 +192,7 @@ static const u8 gUnknown_085E5BCA[] =
1, 0x80, 0x80,
};
-static const u8 gUnknown_085E5BD9[] =
+static const u8 sTheEnd_LetterNMap[] =
{
1, 3, 1,
1, 4, 1,
@@ -201,7 +201,7 @@ static const u8 gUnknown_085E5BD9[] =
1, 0xC3, 1,
};
-static const u8 gUnknown_085E5BE8[] =
+static const u8 sTheEnd_LetterDMap[] =
{
1, 6, 7,
1, 8, 9,
@@ -369,165 +369,165 @@ static const u8 gCreditsText_MotoyasuTojima[] = _("Motoyasu Tojima");
static const u8 gCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow");
static const u8 gCreditsText_ShellieDow[] = _("Shellie Dow");
static const u8 gCreditsText_ErikJohnson[] = _("Erik Johnson");
-static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, 0, gCreditsText_EmptyString};
-static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, 1, gCreditsText_PkmnEmeraldVersion};
-static const struct CreditsEntry gCreditsEntry_Credits[] = {11, 1, gCreditsText_Credits};
-static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, 1, gCreditsText_ExecutiveDirector};
-static const struct CreditsEntry gCreditsEntry_Director[] = {12, 1, gCreditsText_Director};
-static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, 1, gCreditsText_ArtDirector};
-static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, 1, gCreditsText_BattleDirector};
-static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, 1, gCreditsText_MainProgrammer};
-static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, 1, gCreditsText_BattleSystemPgrms};
-static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, 1, gCreditsText_FieldSystemPgrms};
-static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, 1, gCreditsText_Programmers};
-static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, 1, gCreditsText_MainGraphicDesigner};
-static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, 1, gCreditsText_GraphicDesigners};
-static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, 1, gCreditsText_PkmnDesigners};
-static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, 1, gCreditsText_MusicComposition};
-static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, 1, gCreditsText_SoundEffectsAndPkmnVoices};
-static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, 1, gCreditsText_GameDesigners};
-static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, 1, gCreditsText_ScenarioPlot};
-static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, 1, gCreditsText_Scenario};
-static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, 1, gCreditsText_ScriptDesigners};
-static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, 1, gCreditsText_MapDesigners};
-static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, 1, gCreditsText_MapDataDesigners};
-static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, 1, gCreditsText_ParametricDesigners};
-static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, 1, gCreditsText_PokedexText};
-static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, 1, gCreditsText_EnvAndToolPgrms};
-static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, 1, gCreditsText_NCLProductTesting};
-static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, 1, gCreditsText_SpecialThanks};
-static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, 1, gCreditsText_Coordinators};
-static const struct CreditsEntry gCreditsEntry_Producers[] = {11, 1, gCreditsText_Producers};
-static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, 1, gCreditsText_ExecProducers};
-static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, 1, gCreditsText_InfoSupervisors};
-static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, 1, gCreditsText_TaskManagers};
-static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, 1, gCreditsText_BrailleCodeCheck};
-static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, 1, gCreditsText_WorldDirector};
-static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, 1, gCreditsText_BattleFrontierData};
-static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, 1, gCreditsText_SupportProgrammers};
-static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, 1, gCreditsText_Artwork};
-static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, 1, gCreditsText_LeadProgrammer};
-static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, 1, gCreditsText_LeadGraphicArtist};
-static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, 0, gCreditsText_SatoshiTajiri};
-static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, 0, gCreditsText_JunichiMasuda};
-static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, 0, gCreditsText_KenSugimori};
-static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, 0, gCreditsText_ShigekiMorimoto};
-static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, 0, gCreditsText_TetsuyaWatanabe};
-static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, 0, gCreditsText_HisashiSogabe};
-static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, 0, gCreditsText_SosukeTamada};
-static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, 0, gCreditsText_AkitoMori};
-static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, 0, gCreditsText_KeitaKagaya};
-static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, 0, gCreditsText_YoshinoriMatsuda};
-static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, 0, gCreditsText_HiroyukiNakamura};
-static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, 0, gCreditsText_MasaoTaya};
-static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, 0, gCreditsText_SatoshiNohara};
-static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, 0, gCreditsText_TomomichiOhta};
-static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, 0, gCreditsText_MiyukiIwasawa};
-static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, 0, gCreditsText_TakenoriOhta};
-static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, 0, gCreditsText_HironobuYoshida};
-static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, 0, gCreditsText_MotofumiFujiwara};
-static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, 0, gCreditsText_SatoshiOhta};
-static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, 0, gCreditsText_AsukaIwashita};
-static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, 0, gCreditsText_AimiTomita};
-static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, 0, gCreditsText_TakaoUnno};
-static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, 0, gCreditsText_KanakoEo};
-static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, 0, gCreditsText_JunOkutani};
-static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, 0, gCreditsText_AtsukoNishida};
-static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, 0, gCreditsText_MuneoSaito};
-static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, 0, gCreditsText_RenaYoshikawa};
-static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, 0, gCreditsText_GoIchinose};
-static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, 0, gCreditsText_MorikazuAoki};
-static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, 0, gCreditsText_KojiNishino};
-static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, 0, gCreditsText_KenjiMatsushima};
-static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, 0, gCreditsText_TetsujiOhta};
-static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, 0, gCreditsText_HitomiSato};
-static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, 0, gCreditsText_TakeshiKawachimaru};
-static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, 0, gCreditsText_TeruyukiShimoyamada};
-static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, 0, gCreditsText_ShigeruOhmori};
-static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, 0, gCreditsText_TadashiTakahashi};
-static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, 0, gCreditsText_ToshinobuMatsumiya};
-static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, 0, gCreditsText_AkihitoTomisawa};
-static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, 0, gCreditsText_HirokiEnomoto};
-static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, 0, gCreditsText_KazuyukiTerada};
-static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, 0, gCreditsText_YuriSakurai};
-static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, 0, gCreditsText_HiromiSagawa};
-static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, 0, gCreditsText_KenjiTominaga};
-static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, 0, gCreditsText_YoshioTajiri};
-static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, 0, gCreditsText_TeikoSasaki};
-static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, 0, gCreditsText_SachikoHamano};
-static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, 0, gCreditsText_ChieMatsumiya};
-static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, 0, gCreditsText_AkikoShinozaki};
-static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, 0, gCreditsText_AstukoFujii};
-static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, 0, gCreditsText_NozomuSaito};
-static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, 0, gCreditsText_KenkichiToyama};
-static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, 0, gCreditsText_SuguruNakatsui};
-static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, 0, gCreditsText_YumiFunasaka};
-static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, 0, gCreditsText_NaokoYanase};
-static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, 0, gCreditsText_NCLSuperMarioClub};
-static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, 0, gCreditsText_AtsushiTada};
-static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, 0, gCreditsText_TakahiroOhnishi};
-static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, 0, gCreditsText_NorihideOkamura};
-static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, 0, gCreditsText_HiroNakamura};
-static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, 0, gCreditsText_HiroyukiUesugi};
-static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, 0, gCreditsText_TerukiMurakawa};
-static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, 0, gCreditsText_AkiraKinashi};
-static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, 0, gCreditsText_MichikoTakizawa};
-static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, 0, gCreditsText_MakikoTakada};
-static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, 0, gCreditsText_TakanaoKondo};
-static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, 0, gCreditsText_AiMashima};
-static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, 0, gCreditsText_GakujiNomoto};
-static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, 0, gCreditsText_TakehiroIzushi};
-static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, 0, gCreditsText_HitoshiYamagami};
-static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, 0, gCreditsText_KyokoWatanabe};
-static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, 0, gCreditsText_TakaoNakano};
-static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, 0, gCreditsText_HiroyukiJinnai};
-static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, 0, gCreditsText_HiroakiTsuru};
-static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, 0, gCreditsText_TsunekazIshihara};
-static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, 0, gCreditsText_SatoruIwata};
-static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, 0, gCreditsText_KazuyaSuyama};
-static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, 0, gCreditsText_SatoshiMitsuhara};
-static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, 0, gCreditsText_JapanBrailleLibrary};
-static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, 0, gCreditsText_TomotakaKomura};
-static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, 0, gCreditsText_MikikoOhhashi};
-static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, 0, gCreditsText_DaisukeHoshino};
-static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, 0, gCreditsText_KenjiroIto};
-static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, 0, gCreditsText_RuiKawaguchi};
-static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, 0, gCreditsText_ShunsukeKohori};
-static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, 0, gCreditsText_SachikoNakamichi};
-static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, 0, gCreditsText_FujikoNomura};
-static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, 0, gCreditsText_KazukiYoshihara};
-static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, 0, gCreditsText_RetsujiNomoto};
-static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, 0, gCreditsText_AzusaTajima};
-static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, 0, gCreditsText_ShusakuEgami};
-static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, 1, gCreditsText_PackageAndManual};
-static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, 1, gCreditsText_EnglishVersion};
-static const struct CreditsEntry gCreditsEntry_Translator[] = {0, 1, gCreditsText_Translator};
-static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, 1, gCreditsText_TextEditor};
-static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, 1, gCreditsText_NCLCoordinator};
-static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, 1, gCreditsText_GraphicDesigner};
-static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, 1, gCreditsText_NOAProductTesting};
-static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, 0, gCreditsText_HideyukiNakajima};
-static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, 0, gCreditsText_HidenoriSaeki};
-static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, 0, gCreditsText_YokoWatanabe};
-static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, 0, gCreditsText_SakaeKimura};
-static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, 0, gCreditsText_ChiakiShinkai};
-static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, 0, gCreditsText_SethMcMahill};
-static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, 0, gCreditsText_NobOgasawara};
-static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, 0, gCreditsText_TeresaLillygren};
-static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, 0, gCreditsText_KimikoNakamichi};
-static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, 0, gCreditsText_SouichiYamamoto};
-static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, 0, gCreditsText_YuichiroIto};
-static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, 0, gCreditsText_ThomasHertzog};
-static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, 0, gCreditsText_MikaKurosawa};
-static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, 0, gCreditsText_NationalFederationBlind};
-static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, 0, gCreditsText_PatriciaAMaurer};
-static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, 0, gCreditsText_EuropeanBlindUnion};
-static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, 0, gCreditsText_AustralianBrailleAuthority};
-static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, 0, gCreditsText_RoyalNewZealandFederationBlind};
-static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, 0, gCreditsText_MotoyasuTojima};
-static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, 0, gCreditsText_NicolaPrattBarlow};
-static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, 0, gCreditsText_ShellieDow};
-static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, 0, gCreditsText_ErikJohnson};
+static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, FALSE, gCreditsText_EmptyString};
+static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, TRUE, gCreditsText_PkmnEmeraldVersion};
+static const struct CreditsEntry gCreditsEntry_Credits[] = {11, TRUE, gCreditsText_Credits};
+static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, TRUE, gCreditsText_ExecutiveDirector};
+static const struct CreditsEntry gCreditsEntry_Director[] = {12, TRUE, gCreditsText_Director};
+static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, TRUE, gCreditsText_ArtDirector};
+static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, TRUE, gCreditsText_BattleDirector};
+static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, TRUE, gCreditsText_MainProgrammer};
+static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, TRUE, gCreditsText_BattleSystemPgrms};
+static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, TRUE, gCreditsText_FieldSystemPgrms};
+static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, TRUE, gCreditsText_Programmers};
+static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, TRUE, gCreditsText_MainGraphicDesigner};
+static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, TRUE, gCreditsText_GraphicDesigners};
+static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, TRUE, gCreditsText_PkmnDesigners};
+static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, TRUE, gCreditsText_MusicComposition};
+static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, TRUE, gCreditsText_SoundEffectsAndPkmnVoices};
+static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, TRUE, gCreditsText_GameDesigners};
+static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, TRUE, gCreditsText_ScenarioPlot};
+static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, TRUE, gCreditsText_Scenario};
+static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, TRUE, gCreditsText_ScriptDesigners};
+static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, TRUE, gCreditsText_MapDesigners};
+static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, TRUE, gCreditsText_MapDataDesigners};
+static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, TRUE, gCreditsText_ParametricDesigners};
+static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, TRUE, gCreditsText_PokedexText};
+static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, TRUE, gCreditsText_EnvAndToolPgrms};
+static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, TRUE, gCreditsText_NCLProductTesting};
+static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, TRUE, gCreditsText_SpecialThanks};
+static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, TRUE, gCreditsText_Coordinators};
+static const struct CreditsEntry gCreditsEntry_Producers[] = {11, TRUE, gCreditsText_Producers};
+static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, TRUE, gCreditsText_ExecProducers};
+static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, TRUE, gCreditsText_InfoSupervisors};
+static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, TRUE, gCreditsText_TaskManagers};
+static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, TRUE, gCreditsText_BrailleCodeCheck};
+static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, TRUE, gCreditsText_WorldDirector};
+static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, TRUE, gCreditsText_BattleFrontierData};
+static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, TRUE, gCreditsText_SupportProgrammers};
+static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, TRUE, gCreditsText_Artwork};
+static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, TRUE, gCreditsText_LeadProgrammer};
+static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, TRUE, gCreditsText_LeadGraphicArtist};
+static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, FALSE, gCreditsText_SatoshiTajiri};
+static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, FALSE, gCreditsText_JunichiMasuda};
+static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, FALSE, gCreditsText_KenSugimori};
+static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, FALSE, gCreditsText_ShigekiMorimoto};
+static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, FALSE, gCreditsText_TetsuyaWatanabe};
+static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, FALSE, gCreditsText_HisashiSogabe};
+static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, FALSE, gCreditsText_SosukeTamada};
+static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, FALSE, gCreditsText_AkitoMori};
+static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, FALSE, gCreditsText_KeitaKagaya};
+static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, FALSE, gCreditsText_YoshinoriMatsuda};
+static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, FALSE, gCreditsText_HiroyukiNakamura};
+static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, FALSE, gCreditsText_MasaoTaya};
+static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, FALSE, gCreditsText_SatoshiNohara};
+static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, FALSE, gCreditsText_TomomichiOhta};
+static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, FALSE, gCreditsText_MiyukiIwasawa};
+static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, FALSE, gCreditsText_TakenoriOhta};
+static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, FALSE, gCreditsText_HironobuYoshida};
+static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, FALSE, gCreditsText_MotofumiFujiwara};
+static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, FALSE, gCreditsText_SatoshiOhta};
+static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, FALSE, gCreditsText_AsukaIwashita};
+static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, FALSE, gCreditsText_AimiTomita};
+static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, FALSE, gCreditsText_TakaoUnno};
+static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, FALSE, gCreditsText_KanakoEo};
+static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, FALSE, gCreditsText_JunOkutani};
+static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, FALSE, gCreditsText_AtsukoNishida};
+static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, FALSE, gCreditsText_MuneoSaito};
+static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, FALSE, gCreditsText_RenaYoshikawa};
+static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, FALSE, gCreditsText_GoIchinose};
+static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, FALSE, gCreditsText_MorikazuAoki};
+static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, FALSE, gCreditsText_KojiNishino};
+static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, FALSE, gCreditsText_KenjiMatsushima};
+static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, FALSE, gCreditsText_TetsujiOhta};
+static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, FALSE, gCreditsText_HitomiSato};
+static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, FALSE, gCreditsText_TakeshiKawachimaru};
+static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, FALSE, gCreditsText_TeruyukiShimoyamada};
+static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, FALSE, gCreditsText_ShigeruOhmori};
+static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, FALSE, gCreditsText_TadashiTakahashi};
+static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, FALSE, gCreditsText_ToshinobuMatsumiya};
+static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, FALSE, gCreditsText_AkihitoTomisawa};
+static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, FALSE, gCreditsText_HirokiEnomoto};
+static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, FALSE, gCreditsText_KazuyukiTerada};
+static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, FALSE, gCreditsText_YuriSakurai};
+static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, FALSE, gCreditsText_HiromiSagawa};
+static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, FALSE, gCreditsText_KenjiTominaga};
+static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, FALSE, gCreditsText_YoshioTajiri};
+static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, FALSE, gCreditsText_TeikoSasaki};
+static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, FALSE, gCreditsText_SachikoHamano};
+static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, FALSE, gCreditsText_ChieMatsumiya};
+static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, FALSE, gCreditsText_AkikoShinozaki};
+static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, FALSE, gCreditsText_AstukoFujii};
+static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, FALSE, gCreditsText_NozomuSaito};
+static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, FALSE, gCreditsText_KenkichiToyama};
+static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, FALSE, gCreditsText_SuguruNakatsui};
+static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, FALSE, gCreditsText_YumiFunasaka};
+static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, FALSE, gCreditsText_NaokoYanase};
+static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, FALSE, gCreditsText_NCLSuperMarioClub};
+static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, FALSE, gCreditsText_AtsushiTada};
+static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, FALSE, gCreditsText_TakahiroOhnishi};
+static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, FALSE, gCreditsText_NorihideOkamura};
+static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, FALSE, gCreditsText_HiroNakamura};
+static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, FALSE, gCreditsText_HiroyukiUesugi};
+static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, FALSE, gCreditsText_TerukiMurakawa};
+static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, FALSE, gCreditsText_AkiraKinashi};
+static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, FALSE, gCreditsText_MichikoTakizawa};
+static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, FALSE, gCreditsText_MakikoTakada};
+static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, FALSE, gCreditsText_TakanaoKondo};
+static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, FALSE, gCreditsText_AiMashima};
+static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, FALSE, gCreditsText_GakujiNomoto};
+static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, FALSE, gCreditsText_TakehiroIzushi};
+static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, FALSE, gCreditsText_HitoshiYamagami};
+static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, FALSE, gCreditsText_KyokoWatanabe};
+static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, FALSE, gCreditsText_TakaoNakano};
+static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, FALSE, gCreditsText_HiroyukiJinnai};
+static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, FALSE, gCreditsText_HiroakiTsuru};
+static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, FALSE, gCreditsText_TsunekazIshihara};
+static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, FALSE, gCreditsText_SatoruIwata};
+static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, FALSE, gCreditsText_KazuyaSuyama};
+static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, FALSE, gCreditsText_SatoshiMitsuhara};
+static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, FALSE, gCreditsText_JapanBrailleLibrary};
+static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, FALSE, gCreditsText_TomotakaKomura};
+static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, FALSE, gCreditsText_MikikoOhhashi};
+static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, FALSE, gCreditsText_DaisukeHoshino};
+static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, FALSE, gCreditsText_KenjiroIto};
+static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, FALSE, gCreditsText_RuiKawaguchi};
+static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, FALSE, gCreditsText_ShunsukeKohori};
+static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, FALSE, gCreditsText_SachikoNakamichi};
+static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, FALSE, gCreditsText_FujikoNomura};
+static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, FALSE, gCreditsText_KazukiYoshihara};
+static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, FALSE, gCreditsText_RetsujiNomoto};
+static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, FALSE, gCreditsText_AzusaTajima};
+static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, FALSE, gCreditsText_ShusakuEgami};
+static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, TRUE, gCreditsText_PackageAndManual};
+static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, TRUE, gCreditsText_EnglishVersion};
+static const struct CreditsEntry gCreditsEntry_Translator[] = {0, TRUE, gCreditsText_Translator};
+static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, TRUE, gCreditsText_TextEditor};
+static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, TRUE, gCreditsText_NCLCoordinator};
+static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, TRUE, gCreditsText_GraphicDesigner};
+static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, TRUE, gCreditsText_NOAProductTesting};
+static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, FALSE, gCreditsText_HideyukiNakajima};
+static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, FALSE, gCreditsText_HidenoriSaeki};
+static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, FALSE, gCreditsText_YokoWatanabe};
+static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, FALSE, gCreditsText_SakaeKimura};
+static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, FALSE, gCreditsText_ChiakiShinkai};
+static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, FALSE, gCreditsText_SethMcMahill};
+static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, FALSE, gCreditsText_NobOgasawara};
+static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, FALSE, gCreditsText_TeresaLillygren};
+static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, FALSE, gCreditsText_KimikoNakamichi};
+static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, FALSE, gCreditsText_SouichiYamamoto};
+static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, FALSE, gCreditsText_YuichiroIto};
+static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, FALSE, gCreditsText_ThomasHertzog};
+static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, FALSE, gCreditsText_MikaKurosawa};
+static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, FALSE, gCreditsText_NationalFederationBlind};
+static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, FALSE, gCreditsText_PatriciaAMaurer};
+static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, FALSE, gCreditsText_EuropeanBlindUnion};
+static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, FALSE, gCreditsText_AustralianBrailleAuthority};
+static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, FALSE, gCreditsText_RoyalNewZealandFederationBlind};
+static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, FALSE, gCreditsText_MotoyasuTojima};
+static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, FALSE, gCreditsText_NicolaPrattBarlow};
+static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, FALSE, gCreditsText_ShellieDow};
+static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, FALSE, gCreditsText_ErikJohnson};
#define _ gCreditsEntry_EmptyString
static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] =
@@ -934,7 +934,7 @@ static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] =
};
#undef _
-static const struct BgTemplate gUnknown_085E6F68[] =
+static const struct BgTemplate sBackgroundTemplates[] =
{
{
.bg = 0,
@@ -946,7 +946,7 @@ static const struct BgTemplate gUnknown_085E6F68[] =
.baseTile = 0
},
};
-static const struct WindowTemplate gUnknown_085E6F6C[] =
+static const struct WindowTemplate sWindowTemplates[] =
{
{
.bg = 0,
@@ -1102,51 +1102,51 @@ static const struct SpriteTemplate gUnknown_085E7068 =
.callback = sub_81772B8,
};
-static void sub_8175744(u8 taskIdA);
-static void sub_8175774(u8 taskIdA);
+static void Task_WaitPaletteFade(u8 taskIdA);
+static void Task_ProgressCreditTasks(u8 taskIdA);
static void sub_8175808(u8 taskIdA);
static void c2_080C9BFC(u8 taskIdA);
-static void sub_81758E4(u8 taskIdA);
+static void Task_CreditsLoadGrassScene(u8 taskIdA);
static void sub_81758A4(u8 taskIdA);
-static void sub_8175A9C(u8 taskIdA);
-static void sub_8175AE4(u8 taskIdA);
-static void sub_8175B1C(u8 taskIdA);
-static void sub_8175B90(u8 taskIdA);
-static void sub_8175BD8(u8 taskIdA);
-static void sub_8175C34(u8 taskIdA);
-static void sub_8175CC8(u8 taskIdA);
-static void sub_8175CE4(void);
+static void Task_CreditsTheEnd1(u8 taskIdA);
+static void Task_CreditsTheEnd2(u8 taskIdA);
+static void Task_CreditsTheEnd3(u8 taskIdA);
+static void Task_CreditsTheEnd4(u8 taskIdA);
+static void Task_CreditsTheEnd5(u8 taskIdA);
+static void Task_CreditsTheEnd6(u8 taskIdA);
+static void Task_CreditsSoftReset(u8 taskIdA);
+static void ResetGpuAndVram(void);
static void sub_8175DA0(u8 taskIdB);
-static u8 sub_817603C(u8 page, u8 taskIdA);
+static u8 CheckChangeScene(u8 page, u8 taskIdA);
static void sub_81760FC(u8 taskIdA);
static void sub_817651C(u8 taskIdA);
static void sub_817624C(u8 taskIdA);
static bool8 sub_8176AB0(u8 data, u8 taskIdA);
-static void sub_8176CA0(u8 taskIdA);
-static void sub_8176D1C(u16, u16, u16);
+static void ResetCreditsTasks(u8 taskIdA);
+static void LoadTheEndScreen(u16, u16, u16);
static void sub_8176E40(u16 arg0, u16 palette);
static void sub_8176EE8(struct Sprite *sprite);
static void sub_8176F90(struct Sprite *sprite);
static u8 sub_8177224(u16 species, s16 x, s16 y, u16 position);
static void sub_8177388(void);
-static void sub_81754C8(void)
+static void CreditsVBlankCallback(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-static void sub_81754DC(void)
+static void CB2_RunCreditsSequence(void)
{
RunTasks();
AnimateSprites();
if ((gMain.heldKeys & B_BUTTON)
&& gHasHallOfFameRecords != 0
- && gTasks[gUnknown_0203BCE2].func == sub_8175774)
+ && gTasks[gUnknown_0203BCE2].func == Task_ProgressCreditTasks)
{
- sub_81754C8();
+ CreditsVBlankCallback();
RunTasks();
AnimateSprites();
gUnknown_0203BCE5 = 1;
@@ -1158,10 +1158,10 @@ static void sub_81754DC(void)
static void sub_8175548(void)
{
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_085E6F68, 1);
+ InitBgsFromTemplates(0, sBackgroundTemplates, 1);
SetBgTilemapBuffer(0, AllocZeroed(0x800));
LoadPalette(gUnknown_085E56F0, 0x80, 0x40);
- InitWindows(gUnknown_085E6F6C);
+ InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
PutWindowTilemap(0);
CopyWindowToVram(0, 3);
@@ -1177,14 +1177,14 @@ static void sub_81755A4(void)
Free(ptr);
}
-static void sub_81755BC(const u8 *string, u8 y, u8 a2)
+static void PrintCreditsText(const u8 *string, u8 y, bool8 isTitle)
{
u8 x;
u8 color[3];
color[0] = 0;
- if (a2 == 1)
+ if (isTitle == TRUE)
{
color[1] = 3;
color[2] = 4;
@@ -1199,20 +1199,20 @@ static void sub_81755BC(const u8 *string, u8 y, u8 a2)
AddTextPrinterParameterized4(0, 1, x, y, 1, 0, color, -1, string);
}
-void sub_8175620(void)
+void CB2_StartCreditsSequence(void)
{
u8 taskIdA;
s16 taskIdC;
u8 taskIdB;
- sub_8175CE4();
+ ResetGpuAndVram();
SetVBlankCallback(NULL);
InitHeap(gHeap, HEAP_SIZE);
ResetPaletteFade();
ResetTasks();
sub_8175548();
- taskIdA = CreateTask(sub_8175744, 0);
+ taskIdA = CreateTask(Task_WaitPaletteFade, 0);
gTasks[taskIdA].data[TDA_4] = 0;
gTasks[taskIdA].data[TDA_7] = 0;
@@ -1237,9 +1237,9 @@ void sub_8175620(void)
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
EnableInterrupts(INTR_FLAG_VBLANK);
- SetVBlankCallback(sub_81754C8);
+ SetVBlankCallback(CreditsVBlankCallback);
m4aSongNumStart(MUS_THANKFOR);
- SetMainCallback2(sub_81754DC);
+ SetMainCallback2(CB2_RunCreditsSequence);
gUnknown_0203BCE5 = 0;
gUnknown_0203BCE8 = AllocZeroed(sizeof(struct Unk201C000));
@@ -1252,13 +1252,13 @@ void sub_8175620(void)
gUnknown_0203BCE2 = taskIdA;
}
-static void sub_8175744(u8 taskIdA)
+static void Task_WaitPaletteFade(u8 taskIdA)
{
if (!gPaletteFade.active)
- gTasks[taskIdA].func = sub_8175774;
+ gTasks[taskIdA].func = Task_ProgressCreditTasks;
}
-static void sub_8175774(u8 taskIdA)
+static void Task_ProgressCreditTasks(u8 taskIdA)
{
u16 data1;
@@ -1270,7 +1270,7 @@ static void sub_8175774(u8 taskIdA)
gTasks[taskIdC].data[TDC_0] = 30;
gTasks[taskIdA].data[TDA_12] = 0x100;
- gTasks[taskIdA].func = sub_8175A9C;
+ gTasks[taskIdA].func = Task_CreditsTheEnd1;
return;
}
@@ -1298,7 +1298,7 @@ static void sub_8175808(u8 taskIdA)
if (!gPaletteFade.active)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- sub_8176CA0(taskIdA);
+ ResetCreditsTasks(taskIdA);
gTasks[taskIdA].func = c2_080C9BFC;
}
}
@@ -1313,8 +1313,8 @@ static void c2_080C9BFC(u8 taskIdA)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
EnableInterrupts(INTR_FLAG_VBLANK);
- SetVBlankCallback(sub_81754C8);
- gTasks[taskIdA].func = sub_8175744;
+ SetVBlankCallback(CreditsVBlankCallback);
+ gTasks[taskIdA].func = Task_WaitPaletteFade;
}
}
@@ -1323,12 +1323,12 @@ static void sub_81758A4(u8 taskIdA)
if (!gPaletteFade.active)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- sub_8176CA0(taskIdA);
- gTasks[taskIdA].func = sub_81758E4;
+ ResetCreditsTasks(taskIdA);
+ gTasks[taskIdA].func = Task_CreditsLoadGrassScene;
}
}
-static void sub_81758E4(u8 taskIdA)
+static void Task_CreditsLoadGrassScene(u8 taskIdA)
{
switch (gMain.state)
{
@@ -1387,12 +1387,12 @@ static void sub_81758E4(u8 taskIdA)
gMain.state = 0;
gUnknown_0203BD28 = 0;
- gTasks[taskIdA].func = sub_8175744;
+ gTasks[taskIdA].func = Task_WaitPaletteFade;
break;
}
}
-static void sub_8175A9C(u8 taskIdA)
+static void Task_CreditsTheEnd1(u8 taskIdA)
{
if (gTasks[taskIdA].data[TDA_12])
{
@@ -1401,23 +1401,23 @@ static void sub_8175A9C(u8 taskIdA)
}
BeginNormalPaletteFade(0xFFFFFFFF, 12, 0, 16, RGB_BLACK);
- gTasks[taskIdA].func = sub_8175AE4;
+ gTasks[taskIdA].func = Task_CreditsTheEnd2;
}
-static void sub_8175AE4(u8 taskIdA)
+static void Task_CreditsTheEnd2(u8 taskIdA)
{
if (!gPaletteFade.active)
{
- sub_8176CA0(taskIdA);
- gTasks[taskIdA].func = sub_8175B1C;
+ ResetCreditsTasks(taskIdA);
+ gTasks[taskIdA].func = Task_CreditsTheEnd3;
}
}
-static void sub_8175B1C(u8 taskIdA)
+static void Task_CreditsTheEnd3(u8 taskIdA)
{
- sub_8175CE4();
+ ResetGpuAndVram();
ResetPaletteFade();
- sub_8176D1C(0, 0x3800, 0);
+ LoadTheEndScreen(0, 0x3800, 0);
ResetSpriteData();
FreeAllSpritePalettes();
BeginNormalPaletteFade(0xFFFFFFFF, 8, 16, 0, RGB_BLACK);
@@ -1432,11 +1432,11 @@ static void sub_8175B1C(u8 taskIdA)
| DISPCNT_OBJ_1D_MAP
| DISPCNT_BG0_ON);
- gTasks[taskIdA].data[TDA_0] = 0xEB;
- gTasks[taskIdA].func = sub_8175B90;
+ gTasks[taskIdA].data[TDA_0] = 235; //set this to 215 to actually show "THE END" in time to the last song beat
+ gTasks[taskIdA].func = Task_CreditsTheEnd4;
}
-static void sub_8175B90(u8 taskIdA)
+static void Task_CreditsTheEnd4(u8 taskIdA)
{
if (gTasks[taskIdA].data[TDA_0])
{
@@ -1445,10 +1445,10 @@ static void sub_8175B90(u8 taskIdA)
}
BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 16, RGB_BLACK);
- gTasks[taskIdA].func = sub_8175BD8;
+ gTasks[taskIdA].func = Task_CreditsTheEnd5;
}
-static void sub_8175BD8(u8 taskIdA)
+static void Task_CreditsTheEnd5(u8 taskIdA)
{
if (!gPaletteFade.active)
{
@@ -1456,11 +1456,11 @@ static void sub_8175BD8(u8 taskIdA)
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0, RGB_BLACK);
gTasks[taskIdA].data[TDA_0] = 7200;
- gTasks[taskIdA].func = sub_8175C34;
+ gTasks[taskIdA].func = Task_CreditsTheEnd6;
}
}
-static void sub_8175C34(u8 taskIdA)
+static void Task_CreditsTheEnd6(u8 taskIdA)
{
if (!gPaletteFade.active)
{
@@ -1468,7 +1468,7 @@ static void sub_8175C34(u8 taskIdA)
{
FadeOutBGM(4);
BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA);
- gTasks[taskIdA].func = sub_8175CC8;
+ gTasks[taskIdA].func = Task_CreditsSoftReset;
return;
}
@@ -1482,13 +1482,13 @@ static void sub_8175C34(u8 taskIdA)
}
}
-static void sub_8175CC8(u8 taskIdA)
+static void Task_CreditsSoftReset(u8 taskIdA)
{
if (!gPaletteFade.active)
SoftReset(0xFF);
}
-static void sub_8175CE4(void)
+static void ResetGpuAndVram(void)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
@@ -1539,12 +1539,15 @@ static void sub_8175DA0(u8 taskIdB)
gTasks[taskIdB].data[TDB_0] += 1;
return;
case 2:
- if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == sub_8175774)
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == Task_ProgressCreditTasks)
{
if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT)
{
for (i = 0; i < 5; i++)
- sub_81755BC(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 5 + i * 16, gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->var_1);
+ PrintCreditsText(
+ gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text,
+ 5 + i * 16,
+ gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->isTitle);
CopyWindowToVram(0, 2);
@@ -1578,7 +1581,7 @@ static void sub_8175DA0(u8 taskIdB)
return;
}
- if (sub_817603C((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID]))
+ if (CheckChangeScene((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID]))
{
gTasks[taskIdB].data[TDB_0] += 1;
return;
@@ -1606,7 +1609,7 @@ static void sub_8175DA0(u8 taskIdB)
}
}
-static u8 sub_817603C(u8 page, u8 taskIdA)
+static u8 CheckChangeScene(u8 page, u8 taskIdA)
{
// Starts with bike + ocean + morning
@@ -1685,7 +1688,7 @@ static void sub_81760FC(u8 taskIdD)
gTasks[taskIdD].data[TDD_STATE]++;
break;
case 2:
- if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != sub_8175774)
+ if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != Task_ProgressCreditTasks)
break;
r2 = sub_8177224(gUnknown_0203BCE8->unk0[gUnknown_0203BCE8->unk92], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][0], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][1], gUnknown_0203BCE8->unk90);
if (gUnknown_0203BCE8->unk92 < gUnknown_0203BCE8->unk94 - 1)
@@ -2006,7 +2009,7 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA)
return FALSE;
}
-static void sub_8176CA0(u8 taskIdA)
+static void ResetCreditsTasks(u8 taskIdA)
{
if (gTasks[taskIdA].data[TDA_0] != 0)
{
@@ -2035,7 +2038,7 @@ static void sub_8176CA0(u8 taskIdA)
gUnknown_0203BD28 = 1;
}
-static void sub_8176D1C(u16 arg0, u16 arg1, u16 arg2)
+static void LoadTheEndScreen(u16 arg0, u16 arg1, u16 arg2)
{
u16 baseTile;
u16 i;
@@ -2084,12 +2087,12 @@ static void sub_8176E40(u16 arg0, u16 palette)
for (pos = 0; pos < 32 * 32; pos++)
((u16 *) (VRAM + arg0))[pos] = baseTile + 1;
- sub_8176DBC(gUnknown_085E5BAC, 3, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BBB, 7, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BCA, 11, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BCA, 16, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BD9, 20, 7, arg0, palette);
- sub_8176DBC(gUnknown_085E5BE8, 24, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterTMap, 3, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterHMap, 7, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterEMap, 11, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterEMap, 16, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterNMap, 20, 7, arg0, palette);
+ sub_8176DBC(sTheEnd_LetterDMap, 24, 7, arg0, palette);
}
static void sub_8176EE8(struct Sprite *sprite)
diff --git a/src/crt0.s b/src/crt0.s
new file mode 100644
index 000000000..9ed678968
--- /dev/null
+++ b/src/crt0.s
@@ -0,0 +1,199 @@
+ .include "constants/gba_constants.inc"
+
+ .syntax unified
+
+ .global Start
+
+ .text
+
+ .arm
+
+Start: @ 8000000
+ b Init
+
+ .include "asm/rom_header.inc"
+
+@ 80000C0
+ .word 0
+
+ .global GPIOPortData
+GPIOPortData: @ 80000C4
+ .2byte 0
+
+ .global GPIOPortDirection
+GPIOPortDirection: @ 80000C6
+ .2byte 0
+
+ .global GPIOPortReadEnable
+GPIOPortReadEnable: @ 80000C8
+ .2byte 0
+
+@ 80000CA
+ .2byte 0
+
+@ 80000CC
+ .space 0x34
+
+ .4byte 3
+ .4byte 2
+
+ .ascii "pokemon emerald version"
+ .space 9
+
+ .4byte gMonFrontPicTable
+ .4byte gMonBackPicTable
+ .4byte gMonPaletteTable
+ .4byte gMonShinyPaletteTable
+ .4byte gMonIconTable
+ .4byte gMonIconPaletteIndices
+ .4byte gMonIconPaletteTable
+ .4byte gSpeciesNames
+ .4byte gMoveNames
+ .4byte gDecorations
+
+ .4byte 0x00001270, 0x0000139c, 0x00000018, 0x00000988
+ .4byte 0x00003b24, 0x00000046, 0x000008e4, 0x000008ac
+ .4byte 0x00000182
+
+ .byte 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x06, 0x0c
+ .byte 0x06, 0x10, 0x12, 0x0c, 0x0f, 0x0b, 0x01, 0x08
+
+ .4byte 0x0000000c, 0x00000f2c, 0x00003d88, 0x00000234
+ .4byte 0x00000238, 0x00000009, 0x0000000a, 0x00000000
+ .4byte 0x00000008, 0x00000ca8, 0x00000ca8, 0x000031c7
+ .4byte 0x000031b3, 0x00000000
+
+ .4byte gBaseStats
+ .4byte gAbilityNames
+ .4byte gAbilityDescriptionPointers
+ .4byte gItems
+ .4byte gBattleMoves
+ .4byte gBallSpriteSheets
+ .4byte gBallSpritePalettes
+
+ .4byte 0x000000a8, 0x00000864, 0x0000089b
+
+ .byte 0x1e, 0x1e, 0x10, 0x40
+
+ .4byte 0x0000322e, 0x00000498, 0x000031a8, 0x000031f8
+ .4byte 0x00000034, 0x00000000, 0x00000000
+
+ .arm
+ .align 2, 0
+ .global Init
+Init: @ 8000204
+ mov r0, PSR_IRQ_MODE
+ msr cpsr_cf, r0
+ ldr sp, sp_irq
+ mov r0, PSR_SYS_MODE
+ msr cpsr_cf, r0
+ ldr sp, sp_sys
+ ldr r1, =INTR_VECTOR
+ adr r0, IntrMain
+ str r0, [r1]
+ ldr r1, =AgbMain + 1
+ mov lr, pc
+ bx r1
+ b Init
+
+ .align 2, 0
+sp_sys: .word IWRAM_END - 0x1c0
+sp_irq: .word IWRAM_END - 0x60
+
+ .pool
+
+ .arm
+ .align 2, 0
+ .global IntrMain
+IntrMain: @ 8000248
+ mov r3, REG_BASE
+ add r3, r3, 0x200
+ ldr r2, [r3, OFFSET_REG_IE - 0x200]
+ ldrh r1, [r3, OFFSET_REG_IME - 0x200]
+ mrs r0, spsr
+ stmdb sp!, {r0-r3,lr}
+ mov r0, 0
+ strh r0, [r3, OFFSET_REG_IME - 0x200]
+ and r1, r2, r2, lsr 16
+ mov r12, 0
+ ands r0, r1, INTR_FLAG_VCOUNT
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ mov r0, 0x1
+ strh r0, [r3, OFFSET_REG_IME - 0x200]
+ ands r0, r1, INTR_FLAG_SERIAL
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_TIMER3
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_HBLANK
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_VBLANK
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_TIMER0
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_TIMER1
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_TIMER2
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_DMA0
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_DMA1
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_DMA2
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_DMA3
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_KEYPAD
+ bne IntrMain_FoundIntr
+ add r12, r12, 0x4
+ ands r0, r1, INTR_FLAG_GAMEPAK
+ strbne r0, [r3, OFFSET_REG_SOUNDCNT_X - 0x200]
+ bne . @ spin
+IntrMain_FoundIntr:
+ strh r0, [r3, OFFSET_REG_IF - 0x200]
+ bic r2, r2, r0
+ ldr r0, =gRfuState
+ ldr r0, [r0]
+ ldrb r0, [r0, 0xA]
+ mov r1, 0x8
+ mov r0, r1, lsl r0
+ orr r0, r0, INTR_FLAG_GAMEPAK
+ orr r1, r0, INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK
+ and r1, r1, r2
+ strh r1, [r3, OFFSET_REG_IE - 0x200]
+ mrs r3, cpsr
+ bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK
+ orr r3, r3, PSR_SYS_MODE
+ msr cpsr_cf, r3
+ ldr r1, =gIntrTable
+ add r1, r1, r12
+ ldr r0, [r1]
+ stmdb sp!, {lr}
+ adr lr, IntrMain_RetAddr
+ bx r0
+IntrMain_RetAddr:
+ ldmia sp!, {lr}
+ mrs r3, cpsr
+ bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK
+ orr r3, r3, PSR_I_BIT | PSR_IRQ_MODE
+ msr cpsr_cf, r3
+ ldmia sp!, {r0-r3,lr}
+ strh r2, [r3, OFFSET_REG_IE - 0x200]
+ strh r1, [r3, OFFSET_REG_IME - 0x200]
+ msr spsr_cf, r0
+ bx lr
+
+ .pool
+
+ .align 2, 0 @ Don't pad with nop.
diff --git a/src/data/field_event_obj/event_object_graphics_info_pointers.h b/src/data/field_event_obj/event_object_graphics_info_pointers.h
index 2f504737a..0b8aa79b2 100755
--- a/src/data/field_event_obj/event_object_graphics_info_pointers.h
+++ b/src/data/field_event_obj/event_object_graphics_info_pointers.h
@@ -247,245 +247,245 @@ const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldM
const struct EventObjectGraphicsInfo *const gEventObjectGraphicsInfoPointers[] = {
- &gEventObjectGraphicsInfo_BrendanNormal,
- &gEventObjectGraphicsInfo_BrendanMachBike,
- &gEventObjectGraphicsInfo_BrendanSurfing,
- &gEventObjectGraphicsInfo_BrendanFieldMove,
- &gEventObjectGraphicsInfo_QuintyPlump,
- &gEventObjectGraphicsInfo_NinjaBoy,
- &gEventObjectGraphicsInfo_Twin,
- &gEventObjectGraphicsInfo_Boy1,
- &gEventObjectGraphicsInfo_Girl1,
- &gEventObjectGraphicsInfo_Boy2,
- &gEventObjectGraphicsInfo_Girl2,
- &gEventObjectGraphicsInfo_LittleBoy,
- &gEventObjectGraphicsInfo_LittleGirl,
- &gEventObjectGraphicsInfo_Boy3,
- &gEventObjectGraphicsInfo_Girl3,
- &gEventObjectGraphicsInfo_RichBoy,
- &gEventObjectGraphicsInfo_Woman1,
- &gEventObjectGraphicsInfo_FatMan,
- &gEventObjectGraphicsInfo_PokefanF,
- &gEventObjectGraphicsInfo_Man1,
- &gEventObjectGraphicsInfo_Woman2,
- &gEventObjectGraphicsInfo_ExpertM,
- &gEventObjectGraphicsInfo_ExpertF,
- &gEventObjectGraphicsInfo_Man2,
- &gEventObjectGraphicsInfo_Woman3,
- &gEventObjectGraphicsInfo_PokefanM,
- &gEventObjectGraphicsInfo_Woman4,
- &gEventObjectGraphicsInfo_Cook,
- &gEventObjectGraphicsInfo_LinkReceptionist,
- &gEventObjectGraphicsInfo_OldMan,
- &gEventObjectGraphicsInfo_OldWoman,
- &gEventObjectGraphicsInfo_Camper,
- &gEventObjectGraphicsInfo_Picnicker,
- &gEventObjectGraphicsInfo_Man3,
- &gEventObjectGraphicsInfo_Woman5,
- &gEventObjectGraphicsInfo_Youngster,
- &gEventObjectGraphicsInfo_BugCatcher,
- &gEventObjectGraphicsInfo_PsychicM,
- &gEventObjectGraphicsInfo_SchoolKidM,
- &gEventObjectGraphicsInfo_Maniac,
- &gEventObjectGraphicsInfo_HexManiac,
- &gEventObjectGraphicsInfo_Rayquaza1,
- &gEventObjectGraphicsInfo_SwimmerM,
- &gEventObjectGraphicsInfo_SwimmerF,
- &gEventObjectGraphicsInfo_BlackBelt,
- &gEventObjectGraphicsInfo_Beauty,
- &gEventObjectGraphicsInfo_Scientist1,
- &gEventObjectGraphicsInfo_Lass,
- &gEventObjectGraphicsInfo_Gentleman,
- &gEventObjectGraphicsInfo_Sailor,
- &gEventObjectGraphicsInfo_Fisherman,
- &gEventObjectGraphicsInfo_RunningTriathleteM,
- &gEventObjectGraphicsInfo_RunningTriathleteF,
- &gEventObjectGraphicsInfo_TuberF,
- &gEventObjectGraphicsInfo_TuberM,
- &gEventObjectGraphicsInfo_Hiker,
- &gEventObjectGraphicsInfo_CyclingTriathleteM,
- &gEventObjectGraphicsInfo_CyclingTriathleteF,
- &gEventObjectGraphicsInfo_Nurse,
- &gEventObjectGraphicsInfo_ItemBall,
- &gEventObjectGraphicsInfo_BerryTree,
- &gEventObjectGraphicsInfo_BerryTreeEarlyStages,
- &gEventObjectGraphicsInfo_BerryTreeLateStages,
- &gEventObjectGraphicsInfo_BrendanAcroBike,
- &gEventObjectGraphicsInfo_ProfBirch,
- &gEventObjectGraphicsInfo_Man4,
- &gEventObjectGraphicsInfo_Man5,
- &gEventObjectGraphicsInfo_ReporterM,
- &gEventObjectGraphicsInfo_ReporterF,
- &gEventObjectGraphicsInfo_Bard,
- &gEventObjectGraphicsInfo_Anabel,
- &gEventObjectGraphicsInfo_Tucker,
- &gEventObjectGraphicsInfo_Greta,
- &gEventObjectGraphicsInfo_Spenser,
- &gEventObjectGraphicsInfo_Noland,
- &gEventObjectGraphicsInfo_Lucy,
- &gEventObjectGraphicsInfo_UnusedNatuDoll,
- &gEventObjectGraphicsInfo_UnusedMagnemiteDoll,
- &gEventObjectGraphicsInfo_UnusedSquirtleDoll,
- &gEventObjectGraphicsInfo_UnusedWooperDoll,
- &gEventObjectGraphicsInfo_UnusedPikachuDoll,
- &gEventObjectGraphicsInfo_UnusedPorygon2Doll,
- &gEventObjectGraphicsInfo_CuttableTree,
- &gEventObjectGraphicsInfo_MartEmployee,
- &gEventObjectGraphicsInfo_RooftopSaleWoman,
- &gEventObjectGraphicsInfo_Teala,
- &gEventObjectGraphicsInfo_BreakableRock,
- &gEventObjectGraphicsInfo_PushableBoulder,
- &gEventObjectGraphicsInfo_MrBrineysBoat,
- &gEventObjectGraphicsInfo_MayNormal,
- &gEventObjectGraphicsInfo_MayMachBike,
- &gEventObjectGraphicsInfo_MayAcroBike,
- &gEventObjectGraphicsInfo_MaySurfing,
- &gEventObjectGraphicsInfo_MayFieldMove,
- &gEventObjectGraphicsInfo_Truck,
- &gEventObjectGraphicsInfo_VigorothCarryingBox,
- &gEventObjectGraphicsInfo_VigorothFacingAway,
- &gEventObjectGraphicsInfo_BirchsBag,
- &gEventObjectGraphicsInfo_EnemyZigzagoon,
- &gEventObjectGraphicsInfo_Artist,
- &gEventObjectGraphicsInfo_RivalBrendanNormal,
- &gEventObjectGraphicsInfo_RivalBrendanMachBike,
- &gEventObjectGraphicsInfo_RivalBrendanAcroBike,
- &gEventObjectGraphicsInfo_RivalBrendanSurfing,
- &gEventObjectGraphicsInfo_RivalBrendanFieldMove,
- &gEventObjectGraphicsInfo_RivalMayNormal,
- &gEventObjectGraphicsInfo_RivalMayMachBike,
- &gEventObjectGraphicsInfo_RivalMayAcroBike,
- &gEventObjectGraphicsInfo_RivalMaySurfing,
- &gEventObjectGraphicsInfo_RivalMayFieldMove,
- &gEventObjectGraphicsInfo_Cameraman,
- &gEventObjectGraphicsInfo_BrendanUnderwater,
- &gEventObjectGraphicsInfo_MayUnderwater,
- &gEventObjectGraphicsInfo_MovingBox,
- &gEventObjectGraphicsInfo_CableCar,
- &gEventObjectGraphicsInfo_Scientist2,
- &gEventObjectGraphicsInfo_DevonEmployee,
- &gEventObjectGraphicsInfo_AquaMemberM,
- &gEventObjectGraphicsInfo_AquaMemberF,
- &gEventObjectGraphicsInfo_MagmaMemberM,
- &gEventObjectGraphicsInfo_MagmaMemberF,
- &gEventObjectGraphicsInfo_Sidney,
- &gEventObjectGraphicsInfo_Phoebe,
- &gEventObjectGraphicsInfo_Glacia,
- &gEventObjectGraphicsInfo_Drake,
- &gEventObjectGraphicsInfo_Roxanne,
- &gEventObjectGraphicsInfo_Brawly,
- &gEventObjectGraphicsInfo_Wattson,
- &gEventObjectGraphicsInfo_Flannery,
- &gEventObjectGraphicsInfo_Norman,
- &gEventObjectGraphicsInfo_Winona,
- &gEventObjectGraphicsInfo_Liza,
- &gEventObjectGraphicsInfo_Tate,
- &gEventObjectGraphicsInfo_Wallace,
- &gEventObjectGraphicsInfo_Steven,
- &gEventObjectGraphicsInfo_Wally,
- &gEventObjectGraphicsInfo_RubySapphireLittleBoy,
- &gEventObjectGraphicsInfo_BrendanFishing,
- &gEventObjectGraphicsInfo_MayFishing,
- &gEventObjectGraphicsInfo_HotSpringsOldWoman,
- &gEventObjectGraphicsInfo_SSTidal,
- &gEventObjectGraphicsInfo_SubmarineShadow,
- &gEventObjectGraphicsInfo_PichuDoll,
- &gEventObjectGraphicsInfo_PikachuDoll,
- &gEventObjectGraphicsInfo_MarillDoll,
- &gEventObjectGraphicsInfo_TogepiDoll,
- &gEventObjectGraphicsInfo_CyndaquilDoll,
- &gEventObjectGraphicsInfo_ChikoritaDoll,
- &gEventObjectGraphicsInfo_TotodileDoll,
- &gEventObjectGraphicsInfo_JigglypuffDoll,
- &gEventObjectGraphicsInfo_MeowthDoll,
- &gEventObjectGraphicsInfo_ClefairyDoll,
- &gEventObjectGraphicsInfo_DittoDoll,
- &gEventObjectGraphicsInfo_SmoochumDoll,
- &gEventObjectGraphicsInfo_TreeckoDoll,
- &gEventObjectGraphicsInfo_TorchicDoll,
- &gEventObjectGraphicsInfo_MudkipDoll,
- &gEventObjectGraphicsInfo_DuskullDoll,
- &gEventObjectGraphicsInfo_WynautDoll,
- &gEventObjectGraphicsInfo_BaltoyDoll,
- &gEventObjectGraphicsInfo_KecleonDoll,
- &gEventObjectGraphicsInfo_AzurillDoll,
- &gEventObjectGraphicsInfo_SkittyDoll,
- &gEventObjectGraphicsInfo_SwabluDoll,
- &gEventObjectGraphicsInfo_GulpinDoll,
- &gEventObjectGraphicsInfo_LotadDoll,
- &gEventObjectGraphicsInfo_SeedotDoll,
- &gEventObjectGraphicsInfo_PikaCushion,
- &gEventObjectGraphicsInfo_RoundCushion,
- &gEventObjectGraphicsInfo_KissCushion,
- &gEventObjectGraphicsInfo_ZigzagCushion,
- &gEventObjectGraphicsInfo_SpinCushion,
- &gEventObjectGraphicsInfo_DiamondCushion,
- &gEventObjectGraphicsInfo_BallCushion,
- &gEventObjectGraphicsInfo_GrassCushion,
- &gEventObjectGraphicsInfo_FireCushion,
- &gEventObjectGraphicsInfo_WaterCushion,
- &gEventObjectGraphicsInfo_BigSnorlaxDoll,
- &gEventObjectGraphicsInfo_BigRhydonDoll,
- &gEventObjectGraphicsInfo_BigLaprasDoll,
- &gEventObjectGraphicsInfo_BigVenusaurDoll,
- &gEventObjectGraphicsInfo_BigCharizardDoll,
- &gEventObjectGraphicsInfo_BigBlastoiseDoll,
- &gEventObjectGraphicsInfo_BigWailmerDoll,
- &gEventObjectGraphicsInfo_BigRegirockDoll,
- &gEventObjectGraphicsInfo_BigRegiceDoll,
- &gEventObjectGraphicsInfo_BigRegisteelDoll,
- &gEventObjectGraphicsInfo_Latias,
- &gEventObjectGraphicsInfo_Latios,
- &gEventObjectGraphicsInfo_GameboyKid,
- &gEventObjectGraphicsInfo_ContestJudge,
- &gEventObjectGraphicsInfo_BrendanWatering,
- &gEventObjectGraphicsInfo_MayWatering,
- &gEventObjectGraphicsInfo_BrendanDecorating,
- &gEventObjectGraphicsInfo_MayDecorating,
- &gEventObjectGraphicsInfo_Archie,
- &gEventObjectGraphicsInfo_Maxie,
- &gEventObjectGraphicsInfo_Kyogre1,
- &gEventObjectGraphicsInfo_Groudon1,
- &gEventObjectGraphicsInfo_Fossil,
- &gEventObjectGraphicsInfo_Regirock,
- &gEventObjectGraphicsInfo_Regice,
- &gEventObjectGraphicsInfo_Registeel,
- &gEventObjectGraphicsInfo_Skitty,
- &gEventObjectGraphicsInfo_Kecleon1,
- &gEventObjectGraphicsInfo_Kyogre2,
- &gEventObjectGraphicsInfo_Groudon2,
- &gEventObjectGraphicsInfo_Rayquaza2,
- &gEventObjectGraphicsInfo_Zigzagoon,
- &gEventObjectGraphicsInfo_Pikachu,
- &gEventObjectGraphicsInfo_Azumarill,
- &gEventObjectGraphicsInfo_Wingull,
- &gEventObjectGraphicsInfo_Kecleon2,
- &gEventObjectGraphicsInfo_TuberMSwimming,
- &gEventObjectGraphicsInfo_Azurill,
- &gEventObjectGraphicsInfo_Mom,
- &gEventObjectGraphicsInfo_LinkBrendan,
- &gEventObjectGraphicsInfo_LinkMay,
- &gEventObjectGraphicsInfo_Juan,
- &gEventObjectGraphicsInfo_Scott,
- &gEventObjectGraphicsInfo_Poochyena,
- &gEventObjectGraphicsInfo_Kyogre3,
- &gEventObjectGraphicsInfo_Groudon3,
- &gEventObjectGraphicsInfo_MysteryEventDeliveryman,
- &gEventObjectGraphicsInfo_Statue,
- &gEventObjectGraphicsInfo_Kirlia,
- &gEventObjectGraphicsInfo_Dusclops,
- &gEventObjectGraphicsInfo_UnionRoomAttendant,
- &gEventObjectGraphicsInfo_Sudowoodo,
- &gEventObjectGraphicsInfo_Mew,
- &gEventObjectGraphicsInfo_Red,
- &gEventObjectGraphicsInfo_Leaf,
- &gEventObjectGraphicsInfo_Deoxys,
- &gEventObjectGraphicsInfo_BirthIslandStone,
- &gEventObjectGraphicsInfo_Brandon,
- &gEventObjectGraphicsInfo_RubySapphireBrendan,
- &gEventObjectGraphicsInfo_RubySapphireMay,
- &gEventObjectGraphicsInfo_Lugia,
- &gEventObjectGraphicsInfo_HoOh,
+ [EVENT_OBJ_GFX_BRENDAN_NORMAL] = &gEventObjectGraphicsInfo_BrendanNormal,
+ [EVENT_OBJ_GFX_BRENDAN_MACH_BIKE] = &gEventObjectGraphicsInfo_BrendanMachBike,
+ [EVENT_OBJ_GFX_BRENDAN_SURFING] = &gEventObjectGraphicsInfo_BrendanSurfing,
+ [EVENT_OBJ_GFX_BRENDAN_FIELD_MOVE] = &gEventObjectGraphicsInfo_BrendanFieldMove,
+ [EVENT_OBJ_GFX_QUINTY_PLUMP] = &gEventObjectGraphicsInfo_QuintyPlump,
+ [EVENT_OBJ_GFX_NINJA_BOY] = &gEventObjectGraphicsInfo_NinjaBoy,
+ [EVENT_OBJ_GFX_TWIN] = &gEventObjectGraphicsInfo_Twin,
+ [EVENT_OBJ_GFX_BOY_1] = &gEventObjectGraphicsInfo_Boy1,
+ [EVENT_OBJ_GFX_GIRL_1] = &gEventObjectGraphicsInfo_Girl1,
+ [EVENT_OBJ_GFX_BOY_2] = &gEventObjectGraphicsInfo_Boy2,
+ [EVENT_OBJ_GFX_GIRL_2] = &gEventObjectGraphicsInfo_Girl2,
+ [EVENT_OBJ_GFX_LITTLE_BOY] = &gEventObjectGraphicsInfo_LittleBoy,
+ [EVENT_OBJ_GFX_LITTLE_GIRL] = &gEventObjectGraphicsInfo_LittleGirl,
+ [EVENT_OBJ_GFX_BOY_3] = &gEventObjectGraphicsInfo_Boy3,
+ [EVENT_OBJ_GFX_GIRL_3] = &gEventObjectGraphicsInfo_Girl3,
+ [EVENT_OBJ_GFX_RICH_BOY] = &gEventObjectGraphicsInfo_RichBoy,
+ [EVENT_OBJ_GFX_WOMAN_1] = &gEventObjectGraphicsInfo_Woman1,
+ [EVENT_OBJ_GFX_FAT_MAN] = &gEventObjectGraphicsInfo_FatMan,
+ [EVENT_OBJ_GFX_POKEFAN_F] = &gEventObjectGraphicsInfo_PokefanF,
+ [EVENT_OBJ_GFX_MAN_1] = &gEventObjectGraphicsInfo_Man1,
+ [EVENT_OBJ_GFX_WOMAN_2] = &gEventObjectGraphicsInfo_Woman2,
+ [EVENT_OBJ_GFX_EXPERT_M] = &gEventObjectGraphicsInfo_ExpertM,
+ [EVENT_OBJ_GFX_EXPERT_F] = &gEventObjectGraphicsInfo_ExpertF,
+ [EVENT_OBJ_GFX_MAN_2] = &gEventObjectGraphicsInfo_Man2,
+ [EVENT_OBJ_GFX_WOMAN_3] = &gEventObjectGraphicsInfo_Woman3,
+ [EVENT_OBJ_GFX_POKEFAN_M] = &gEventObjectGraphicsInfo_PokefanM,
+ [EVENT_OBJ_GFX_WOMAN_4] = &gEventObjectGraphicsInfo_Woman4,
+ [EVENT_OBJ_GFX_COOK] = &gEventObjectGraphicsInfo_Cook,
+ [EVENT_OBJ_GFX_LINK_RECEPTIONIST] = &gEventObjectGraphicsInfo_LinkReceptionist,
+ [EVENT_OBJ_GFX_OLD_MAN] = &gEventObjectGraphicsInfo_OldMan,
+ [EVENT_OBJ_GFX_OLD_WOMAN] = &gEventObjectGraphicsInfo_OldWoman,
+ [EVENT_OBJ_GFX_CAMPER] = &gEventObjectGraphicsInfo_Camper,
+ [EVENT_OBJ_GFX_PICNICKER] = &gEventObjectGraphicsInfo_Picnicker,
+ [EVENT_OBJ_GFX_MAN_3] = &gEventObjectGraphicsInfo_Man3,
+ [EVENT_OBJ_GFX_WOMAN_5] = &gEventObjectGraphicsInfo_Woman5,
+ [EVENT_OBJ_GFX_YOUNGSTER] = &gEventObjectGraphicsInfo_Youngster,
+ [EVENT_OBJ_GFX_BUG_CATCHER] = &gEventObjectGraphicsInfo_BugCatcher,
+ [EVENT_OBJ_GFX_PSYCHIC_M] = &gEventObjectGraphicsInfo_PsychicM,
+ [EVENT_OBJ_GFX_SCHOOL_KID_M] = &gEventObjectGraphicsInfo_SchoolKidM,
+ [EVENT_OBJ_GFX_MANIAC] = &gEventObjectGraphicsInfo_Maniac,
+ [EVENT_OBJ_GFX_HEX_MANIAC] = &gEventObjectGraphicsInfo_HexManiac,
+ [EVENT_OBJ_GFX_RAYQUAZA_1] = &gEventObjectGraphicsInfo_Rayquaza1,
+ [EVENT_OBJ_GFX_SWIMMER_M] = &gEventObjectGraphicsInfo_SwimmerM,
+ [EVENT_OBJ_GFX_SWIMMER_F] = &gEventObjectGraphicsInfo_SwimmerF,
+ [EVENT_OBJ_GFX_BLACK_BELT] = &gEventObjectGraphicsInfo_BlackBelt,
+ [EVENT_OBJ_GFX_BEAUTY] = &gEventObjectGraphicsInfo_Beauty,
+ [EVENT_OBJ_GFX_SCIENTIST_1] = &gEventObjectGraphicsInfo_Scientist1,
+ [EVENT_OBJ_GFX_LASS] = &gEventObjectGraphicsInfo_Lass,
+ [EVENT_OBJ_GFX_GENTLEMAN] = &gEventObjectGraphicsInfo_Gentleman,
+ [EVENT_OBJ_GFX_SAILOR] = &gEventObjectGraphicsInfo_Sailor,
+ [EVENT_OBJ_GFX_FISHERMAN] = &gEventObjectGraphicsInfo_Fisherman,
+ [EVENT_OBJ_GFX_RUNNING_TRIATHLETE_M] = &gEventObjectGraphicsInfo_RunningTriathleteM,
+ [EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F] = &gEventObjectGraphicsInfo_RunningTriathleteF,
+ [EVENT_OBJ_GFX_TUBER_F] = &gEventObjectGraphicsInfo_TuberF,
+ [EVENT_OBJ_GFX_TUBER_M] = &gEventObjectGraphicsInfo_TuberM,
+ [EVENT_OBJ_GFX_HIKER] = &gEventObjectGraphicsInfo_Hiker,
+ [EVENT_OBJ_GFX_CYCLING_TRIATHLETE_M] = &gEventObjectGraphicsInfo_CyclingTriathleteM,
+ [EVENT_OBJ_GFX_CYCLING_TRIATHLETE_F] = &gEventObjectGraphicsInfo_CyclingTriathleteF,
+ [EVENT_OBJ_GFX_NURSE] = &gEventObjectGraphicsInfo_Nurse,
+ [EVENT_OBJ_GFX_ITEM_BALL] = &gEventObjectGraphicsInfo_ItemBall,
+ [EVENT_OBJ_GFX_BERRY_TREE] = &gEventObjectGraphicsInfo_BerryTree,
+ [EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES] = &gEventObjectGraphicsInfo_BerryTreeEarlyStages,
+ [EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES] = &gEventObjectGraphicsInfo_BerryTreeLateStages,
+ [EVENT_OBJ_GFX_BRENDAN_ACRO_BIKE] = &gEventObjectGraphicsInfo_BrendanAcroBike,
+ [EVENT_OBJ_GFX_PROF_BIRCH] = &gEventObjectGraphicsInfo_ProfBirch,
+ [EVENT_OBJ_GFX_MAN_4] = &gEventObjectGraphicsInfo_Man4,
+ [EVENT_OBJ_GFX_MAN_5] = &gEventObjectGraphicsInfo_Man5,
+ [EVENT_OBJ_GFX_REPORTER_M] = &gEventObjectGraphicsInfo_ReporterM,
+ [EVENT_OBJ_GFX_REPORTER_F] = &gEventObjectGraphicsInfo_ReporterF,
+ [EVENT_OBJ_GFX_BARD] = &gEventObjectGraphicsInfo_Bard,
+ [EVENT_OBJ_GFX_ANABEL] = &gEventObjectGraphicsInfo_Anabel,
+ [EVENT_OBJ_GFX_TUCKER] = &gEventObjectGraphicsInfo_Tucker,
+ [EVENT_OBJ_GFX_GRETA] = &gEventObjectGraphicsInfo_Greta,
+ [EVENT_OBJ_GFX_SPENSER] = &gEventObjectGraphicsInfo_Spenser,
+ [EVENT_OBJ_GFX_NOLAND] = &gEventObjectGraphicsInfo_Noland,
+ [EVENT_OBJ_GFX_LUCY] = &gEventObjectGraphicsInfo_Lucy,
+ [EVENT_OBJ_GFX_UNUSED_NATU_DOLL] = &gEventObjectGraphicsInfo_UnusedNatuDoll,
+ [EVENT_OBJ_GFX_UNUSED_MAGNEMITE_DOLL] = &gEventObjectGraphicsInfo_UnusedMagnemiteDoll,
+ [EVENT_OBJ_GFX_UNUSED_SQUIRTLE_DOLL] = &gEventObjectGraphicsInfo_UnusedSquirtleDoll,
+ [EVENT_OBJ_GFX_UNUSED_WOOPER_DOLL] = &gEventObjectGraphicsInfo_UnusedWooperDoll,
+ [EVENT_OBJ_GFX_UNUSED_PIKACHU_DOLL] = &gEventObjectGraphicsInfo_UnusedPikachuDoll,
+ [EVENT_OBJ_GFX_UNUSED_PORYGON2_DOLL] = &gEventObjectGraphicsInfo_UnusedPorygon2Doll,
+ [EVENT_OBJ_GFX_CUTTABLE_TREE] = &gEventObjectGraphicsInfo_CuttableTree,
+ [EVENT_OBJ_GFX_MART_EMPLOYEE] = &gEventObjectGraphicsInfo_MartEmployee,
+ [EVENT_OBJ_GFX_ROOFTOP_SALE_WOMAN] = &gEventObjectGraphicsInfo_RooftopSaleWoman,
+ [EVENT_OBJ_GFX_TEALA] = &gEventObjectGraphicsInfo_Teala,
+ [EVENT_OBJ_GFX_BREAKABLE_ROCK] = &gEventObjectGraphicsInfo_BreakableRock,
+ [EVENT_OBJ_GFX_PUSHABLE_BOULDER] = &gEventObjectGraphicsInfo_PushableBoulder,
+ [EVENT_OBJ_GFX_MR_BRINEYS_BOAT] = &gEventObjectGraphicsInfo_MrBrineysBoat,
+ [EVENT_OBJ_GFX_MAY_NORMAL] = &gEventObjectGraphicsInfo_MayNormal,
+ [EVENT_OBJ_GFX_MAY_MACH_BIKE] = &gEventObjectGraphicsInfo_MayMachBike,
+ [EVENT_OBJ_GFX_MAY_ACRO_BIKE] = &gEventObjectGraphicsInfo_MayAcroBike,
+ [EVENT_OBJ_GFX_MAY_SURFING] = &gEventObjectGraphicsInfo_MaySurfing,
+ [EVENT_OBJ_GFX_MAY_FIELD_MOVE] = &gEventObjectGraphicsInfo_MayFieldMove,
+ [EVENT_OBJ_GFX_TRUCK] = &gEventObjectGraphicsInfo_Truck,
+ [EVENT_OBJ_GFX_VIGOROTH_CARRYING_BOX] = &gEventObjectGraphicsInfo_VigorothCarryingBox,
+ [EVENT_OBJ_GFX_VIGOROTH_FACING_AWAY] = &gEventObjectGraphicsInfo_VigorothFacingAway,
+ [EVENT_OBJ_GFX_BIRCHS_BAG] = &gEventObjectGraphicsInfo_BirchsBag,
+ [EVENT_OBJ_GFX_ZIGZAGOON_1] = &gEventObjectGraphicsInfo_EnemyZigzagoon,
+ [EVENT_OBJ_GFX_ARTIST] = &gEventObjectGraphicsInfo_Artist,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL] = &gEventObjectGraphicsInfo_RivalBrendanNormal,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE] = &gEventObjectGraphicsInfo_RivalBrendanMachBike,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE] = &gEventObjectGraphicsInfo_RivalBrendanAcroBike,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_SURFING] = &gEventObjectGraphicsInfo_RivalBrendanSurfing,
+ [EVENT_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE] = &gEventObjectGraphicsInfo_RivalBrendanFieldMove,
+ [EVENT_OBJ_GFX_RIVAL_MAY_NORMAL] = &gEventObjectGraphicsInfo_RivalMayNormal,
+ [EVENT_OBJ_GFX_RIVAL_MAY_MACH_BIKE] = &gEventObjectGraphicsInfo_RivalMayMachBike,
+ [EVENT_OBJ_GFX_RIVAL_MAY_ACRO_BIKE] = &gEventObjectGraphicsInfo_RivalMayAcroBike,
+ [EVENT_OBJ_GFX_RIVAL_MAY_SURFING] = &gEventObjectGraphicsInfo_RivalMaySurfing,
+ [EVENT_OBJ_GFX_RIVAL_MAY_FIELD_MOVE] = &gEventObjectGraphicsInfo_RivalMayFieldMove,
+ [EVENT_OBJ_GFX_CAMERAMAN] = &gEventObjectGraphicsInfo_Cameraman,
+ [EVENT_OBJ_GFX_BRENDAN_UNDERWATER] = &gEventObjectGraphicsInfo_BrendanUnderwater,
+ [EVENT_OBJ_GFX_MAY_UNDERWATER] = &gEventObjectGraphicsInfo_MayUnderwater,
+ [EVENT_OBJ_GFX_MOVING_BOX] = &gEventObjectGraphicsInfo_MovingBox,
+ [EVENT_OBJ_GFX_CABLE_CAR] = &gEventObjectGraphicsInfo_CableCar,
+ [EVENT_OBJ_GFX_SCIENTIST_2] = &gEventObjectGraphicsInfo_Scientist2,
+ [EVENT_OBJ_GFX_DEVON_EMPLOYEE] = &gEventObjectGraphicsInfo_DevonEmployee,
+ [EVENT_OBJ_GFX_AQUA_MEMBER_M] = &gEventObjectGraphicsInfo_AquaMemberM,
+ [EVENT_OBJ_GFX_AQUA_MEMBER_F] = &gEventObjectGraphicsInfo_AquaMemberF,
+ [EVENT_OBJ_GFX_MAGMA_MEMBER_M] = &gEventObjectGraphicsInfo_MagmaMemberM,
+ [EVENT_OBJ_GFX_MAGMA_MEMBER_F] = &gEventObjectGraphicsInfo_MagmaMemberF,
+ [EVENT_OBJ_GFX_SIDNEY] = &gEventObjectGraphicsInfo_Sidney,
+ [EVENT_OBJ_GFX_PHOEBE] = &gEventObjectGraphicsInfo_Phoebe,
+ [EVENT_OBJ_GFX_GLACIA] = &gEventObjectGraphicsInfo_Glacia,
+ [EVENT_OBJ_GFX_DRAKE] = &gEventObjectGraphicsInfo_Drake,
+ [EVENT_OBJ_GFX_ROXANNE] = &gEventObjectGraphicsInfo_Roxanne,
+ [EVENT_OBJ_GFX_BRAWLY] = &gEventObjectGraphicsInfo_Brawly,
+ [EVENT_OBJ_GFX_WATTSON] = &gEventObjectGraphicsInfo_Wattson,
+ [EVENT_OBJ_GFX_FLANNERY] = &gEventObjectGraphicsInfo_Flannery,
+ [EVENT_OBJ_GFX_NORMAN] = &gEventObjectGraphicsInfo_Norman,
+ [EVENT_OBJ_GFX_WINONA] = &gEventObjectGraphicsInfo_Winona,
+ [EVENT_OBJ_GFX_LIZA] = &gEventObjectGraphicsInfo_Liza,
+ [EVENT_OBJ_GFX_TATE] = &gEventObjectGraphicsInfo_Tate,
+ [EVENT_OBJ_GFX_WALLACE] = &gEventObjectGraphicsInfo_Wallace,
+ [EVENT_OBJ_GFX_STEVEN] = &gEventObjectGraphicsInfo_Steven,
+ [EVENT_OBJ_GFX_WALLY] = &gEventObjectGraphicsInfo_Wally,
+ [EVENT_OBJ_GFX_LITTLE_BOY_3] = &gEventObjectGraphicsInfo_RubySapphireLittleBoy,
+ [EVENT_OBJ_GFX_BRENDAN_FISHING] = &gEventObjectGraphicsInfo_BrendanFishing,
+ [EVENT_OBJ_GFX_MAY_FISHING] = &gEventObjectGraphicsInfo_MayFishing,
+ [EVENT_OBJ_GFX_HOT_SPRINGS_OLD_WOMAN] = &gEventObjectGraphicsInfo_HotSpringsOldWoman,
+ [EVENT_OBJ_GFX_SS_TIDAL] = &gEventObjectGraphicsInfo_SSTidal,
+ [EVENT_OBJ_GFX_SUBMARINE_SHADOW] = &gEventObjectGraphicsInfo_SubmarineShadow,
+ [EVENT_OBJ_GFX_PICHU_DOLL] = &gEventObjectGraphicsInfo_PichuDoll,
+ [EVENT_OBJ_GFX_PIKACHU_DOLL] = &gEventObjectGraphicsInfo_PikachuDoll,
+ [EVENT_OBJ_GFX_MARILL_DOLL] = &gEventObjectGraphicsInfo_MarillDoll,
+ [EVENT_OBJ_GFX_TOGEPI_DOLL] = &gEventObjectGraphicsInfo_TogepiDoll,
+ [EVENT_OBJ_GFX_CYNDAQUIL_DOLL] = &gEventObjectGraphicsInfo_CyndaquilDoll,
+ [EVENT_OBJ_GFX_CHIKORITA_DOLL] = &gEventObjectGraphicsInfo_ChikoritaDoll,
+ [EVENT_OBJ_GFX_TOTODILE_DOLL] = &gEventObjectGraphicsInfo_TotodileDoll,
+ [EVENT_OBJ_GFX_JIGGLYPUFF_DOLL] = &gEventObjectGraphicsInfo_JigglypuffDoll,
+ [EVENT_OBJ_GFX_MEOWTH_DOLL] = &gEventObjectGraphicsInfo_MeowthDoll,
+ [EVENT_OBJ_GFX_CLEFAIRY_DOLL] = &gEventObjectGraphicsInfo_ClefairyDoll,
+ [EVENT_OBJ_GFX_DITTO_DOLL] = &gEventObjectGraphicsInfo_DittoDoll,
+ [EVENT_OBJ_GFX_SMOOCHUM_DOLL] = &gEventObjectGraphicsInfo_SmoochumDoll,
+ [EVENT_OBJ_GFX_TREECKO_DOLL] = &gEventObjectGraphicsInfo_TreeckoDoll,
+ [EVENT_OBJ_GFX_TORCHIC_DOLL] = &gEventObjectGraphicsInfo_TorchicDoll,
+ [EVENT_OBJ_GFX_MUDKIP_DOLL] = &gEventObjectGraphicsInfo_MudkipDoll,
+ [EVENT_OBJ_GFX_DUSKULL_DOLL] = &gEventObjectGraphicsInfo_DuskullDoll,
+ [EVENT_OBJ_GFX_WYNAUT_DOLL] = &gEventObjectGraphicsInfo_WynautDoll,
+ [EVENT_OBJ_GFX_BALTOY_DOLL] = &gEventObjectGraphicsInfo_BaltoyDoll,
+ [EVENT_OBJ_GFX_KECLEON_DOLL] = &gEventObjectGraphicsInfo_KecleonDoll,
+ [EVENT_OBJ_GFX_AZURILL_DOLL] = &gEventObjectGraphicsInfo_AzurillDoll,
+ [EVENT_OBJ_GFX_SKITTY_DOLL] = &gEventObjectGraphicsInfo_SkittyDoll,
+ [EVENT_OBJ_GFX_SWABLU_DOLL] = &gEventObjectGraphicsInfo_SwabluDoll,
+ [EVENT_OBJ_GFX_GULPIN_DOLL] = &gEventObjectGraphicsInfo_GulpinDoll,
+ [EVENT_OBJ_GFX_LOTAD_DOLL] = &gEventObjectGraphicsInfo_LotadDoll,
+ [EVENT_OBJ_GFX_SEEDOT_DOLL] = &gEventObjectGraphicsInfo_SeedotDoll,
+ [EVENT_OBJ_GFX_PIKA_CUSHION] = &gEventObjectGraphicsInfo_PikaCushion,
+ [EVENT_OBJ_GFX_ROUND_CUSHION] = &gEventObjectGraphicsInfo_RoundCushion,
+ [EVENT_OBJ_GFX_KISS_CUSHION] = &gEventObjectGraphicsInfo_KissCushion,
+ [EVENT_OBJ_GFX_ZIGZAG_CUSHION] = &gEventObjectGraphicsInfo_ZigzagCushion,
+ [EVENT_OBJ_GFX_SPIN_CUSHION] = &gEventObjectGraphicsInfo_SpinCushion,
+ [EVENT_OBJ_GFX_DIAMOND_CUSHION] = &gEventObjectGraphicsInfo_DiamondCushion,
+ [EVENT_OBJ_GFX_BALL_CUSHION] = &gEventObjectGraphicsInfo_BallCushion,
+ [EVENT_OBJ_GFX_GRASS_CUSHION] = &gEventObjectGraphicsInfo_GrassCushion,
+ [EVENT_OBJ_GFX_FIRE_CUSHION] = &gEventObjectGraphicsInfo_FireCushion,
+ [EVENT_OBJ_GFX_WATER_CUSHION] = &gEventObjectGraphicsInfo_WaterCushion,
+ [EVENT_OBJ_GFX_BIG_SNORLAX_DOLL] = &gEventObjectGraphicsInfo_BigSnorlaxDoll,
+ [EVENT_OBJ_GFX_BIG_RHYDON_DOLL] = &gEventObjectGraphicsInfo_BigRhydonDoll,
+ [EVENT_OBJ_GFX_BIG_LAPRAS_DOLL] = &gEventObjectGraphicsInfo_BigLaprasDoll,
+ [EVENT_OBJ_GFX_BIG_VENUSAUR_DOLL] = &gEventObjectGraphicsInfo_BigVenusaurDoll,
+ [EVENT_OBJ_GFX_BIG_CHARIZARD_DOLL] = &gEventObjectGraphicsInfo_BigCharizardDoll,
+ [EVENT_OBJ_GFX_BIG_BLASTOISE_DOLL] = &gEventObjectGraphicsInfo_BigBlastoiseDoll,
+ [EVENT_OBJ_GFX_BIG_WAILMER_DOLL] = &gEventObjectGraphicsInfo_BigWailmerDoll,
+ [EVENT_OBJ_GFX_BIG_REGIROCK_DOLL] = &gEventObjectGraphicsInfo_BigRegirockDoll,
+ [EVENT_OBJ_GFX_BIG_REGICE_DOLL] = &gEventObjectGraphicsInfo_BigRegiceDoll,
+ [EVENT_OBJ_GFX_BIG_REGISTEEL_DOLL] = &gEventObjectGraphicsInfo_BigRegisteelDoll,
+ [EVENT_OBJ_GFX_LATIAS] = &gEventObjectGraphicsInfo_Latias,
+ [EVENT_OBJ_GFX_LATIOS] = &gEventObjectGraphicsInfo_Latios,
+ [EVENT_OBJ_GFX_GAMEBOY_KID] = &gEventObjectGraphicsInfo_GameboyKid,
+ [EVENT_OBJ_GFX_CONTEST_JUDGE] = &gEventObjectGraphicsInfo_ContestJudge,
+ [EVENT_OBJ_GFX_BRENDAN_WATERING] = &gEventObjectGraphicsInfo_BrendanWatering,
+ [EVENT_OBJ_GFX_MAY_WATERING] = &gEventObjectGraphicsInfo_MayWatering,
+ [EVENT_OBJ_GFX_BRENDAN_DECORATING] = &gEventObjectGraphicsInfo_BrendanDecorating,
+ [EVENT_OBJ_GFX_MAY_DECORATING] = &gEventObjectGraphicsInfo_MayDecorating,
+ [EVENT_OBJ_GFX_ARCHIE] = &gEventObjectGraphicsInfo_Archie,
+ [EVENT_OBJ_GFX_MAXIE] = &gEventObjectGraphicsInfo_Maxie,
+ [EVENT_OBJ_GFX_KYOGRE_1] = &gEventObjectGraphicsInfo_Kyogre1,
+ [EVENT_OBJ_GFX_GROUDON_1] = &gEventObjectGraphicsInfo_Groudon1,
+ [EVENT_OBJ_GFX_FOSSIL] = &gEventObjectGraphicsInfo_Fossil,
+ [EVENT_OBJ_GFX_REGIROCK] = &gEventObjectGraphicsInfo_Regirock,
+ [EVENT_OBJ_GFX_REGICE] = &gEventObjectGraphicsInfo_Regice,
+ [EVENT_OBJ_GFX_REGISTEEL] = &gEventObjectGraphicsInfo_Registeel,
+ [EVENT_OBJ_GFX_SKITTY] = &gEventObjectGraphicsInfo_Skitty,
+ [EVENT_OBJ_GFX_KECLEON_1] = &gEventObjectGraphicsInfo_Kecleon1,
+ [EVENT_OBJ_GFX_KYOGRE_2] = &gEventObjectGraphicsInfo_Kyogre2,
+ [EVENT_OBJ_GFX_GROUDON_2] = &gEventObjectGraphicsInfo_Groudon2,
+ [EVENT_OBJ_GFX_RAYQUAZA_2] = &gEventObjectGraphicsInfo_Rayquaza2,
+ [EVENT_OBJ_GFX_ZIGZAGOON_2] = &gEventObjectGraphicsInfo_Zigzagoon,
+ [EVENT_OBJ_GFX_PIKACHU] = &gEventObjectGraphicsInfo_Pikachu,
+ [EVENT_OBJ_GFX_AZUMARILL] = &gEventObjectGraphicsInfo_Azumarill,
+ [EVENT_OBJ_GFX_WINGULL] = &gEventObjectGraphicsInfo_Wingull,
+ [EVENT_OBJ_GFX_KECLEON_2] = &gEventObjectGraphicsInfo_Kecleon2,
+ [EVENT_OBJ_GFX_TUBER_M_SWIMMING] = &gEventObjectGraphicsInfo_TuberMSwimming,
+ [EVENT_OBJ_GFX_AZURILL] = &gEventObjectGraphicsInfo_Azurill,
+ [EVENT_OBJ_GFX_MOM] = &gEventObjectGraphicsInfo_Mom,
+ [EVENT_OBJ_GFX_LINK_BRENDAN] = &gEventObjectGraphicsInfo_LinkBrendan,
+ [EVENT_OBJ_GFX_LINK_MAY] = &gEventObjectGraphicsInfo_LinkMay,
+ [EVENT_OBJ_GFX_JUAN] = &gEventObjectGraphicsInfo_Juan,
+ [EVENT_OBJ_GFX_SCOTT] = &gEventObjectGraphicsInfo_Scott,
+ [EVENT_OBJ_GFX_POOCHYENA] = &gEventObjectGraphicsInfo_Poochyena,
+ [EVENT_OBJ_GFX_KYOGRE_3] = &gEventObjectGraphicsInfo_Kyogre3,
+ [EVENT_OBJ_GFX_GROUDON_3] = &gEventObjectGraphicsInfo_Groudon3,
+ [EVENT_OBJ_GFX_MYSTERY_GIFT_MAN] = &gEventObjectGraphicsInfo_MysteryEventDeliveryman,
+ [EVENT_OBJ_GFX_TRICK_HOUSE_STATUE] = &gEventObjectGraphicsInfo_Statue,
+ [EVENT_OBJ_GFX_KIRLIA] = &gEventObjectGraphicsInfo_Kirlia,
+ [EVENT_OBJ_GFX_DUSCLOPS] = &gEventObjectGraphicsInfo_Dusclops,
+ [EVENT_OBJ_GFX_UNION_ROOM_NURSE] = &gEventObjectGraphicsInfo_UnionRoomAttendant,
+ [EVENT_OBJ_GFX_SUDOWOODO] = &gEventObjectGraphicsInfo_Sudowoodo,
+ [EVENT_OBJ_GFX_MEW] = &gEventObjectGraphicsInfo_Mew,
+ [EVENT_OBJ_GFX_RED] = &gEventObjectGraphicsInfo_Red,
+ [EVENT_OBJ_GFX_LEAF] = &gEventObjectGraphicsInfo_Leaf,
+ [EVENT_OBJ_GFX_DEOXYS] = &gEventObjectGraphicsInfo_Deoxys,
+ [EVENT_OBJ_GFX_DEOXYS_TRIANGLE] = &gEventObjectGraphicsInfo_BirthIslandStone,
+ [EVENT_OBJ_GFX_BRANDON] = &gEventObjectGraphicsInfo_Brandon,
+ [EVENT_OBJ_GFX_LINK_RS_BRENDAN] = &gEventObjectGraphicsInfo_RubySapphireBrendan,
+ [EVENT_OBJ_GFX_LINK_RS_MAY] = &gEventObjectGraphicsInfo_RubySapphireMay,
+ [EVENT_OBJ_GFX_LUGIA] = &gEventObjectGraphicsInfo_Lugia,
+ [EVENT_OBJ_GFX_HOOH] = &gEventObjectGraphicsInfo_HoOh,
};
const struct EventObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = {
diff --git a/src/data/lilycove_lady.h b/src/data/lilycove_lady.h
new file mode 100644
index 000000000..f60e527a5
--- /dev/null
+++ b/src/data/lilycove_lady.h
@@ -0,0 +1,470 @@
+#include "constants/easy_chat.h"
+#include "constants/event_objects.h"
+#include "constants/items.h"
+#include "constants/species.h"
+#include "constants/moves.h"
+
+static const u16 sContestLadyMonGfxId[] =
+{
+ EVENT_OBJ_GFX_ZIGZAGOON_1,
+ EVENT_OBJ_GFX_SKITTY,
+ EVENT_OBJ_GFX_POOCHYENA,
+ EVENT_OBJ_GFX_KECLEON_1,
+ EVENT_OBJ_GFX_PIKACHU
+};
+
+static const u16 sLilycoveLadyGfxId[] =
+{
+ EVENT_OBJ_GFX_WOMAN_4,
+ EVENT_OBJ_GFX_WOMAN_2,
+ EVENT_OBJ_GFX_GIRL_2
+};
+
+// Quiz Lady data
+static const u16 sQuizLadyQuestion1[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_STORES,
+ EC_WORD_INFORMATION,
+ EC_WORD_ON,
+ EC_WORD_POKEMON,
+ EC_WORD_QUES,
+ EC_WORD_CAMERA,
+ EC_WORD_POKEDEX,
+ EC_WORD_POKENAV
+};
+
+static const u16 sQuizLadyQuestion2[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_ISN_T,
+ EC_WORD_A,
+ EC_WORD_GAME,
+ EC_WORD_VERSION,
+ EC_WORD_QUES,
+ EC_WORD_RUBY,
+ EC_WORD_SAPPHIRE,
+ EC_WORD_DARK
+};
+
+static const u16 sQuizLadyQuestion3[] =
+{
+ EC_WORD_HOW,
+ EC_WORD_DO,
+ EC_WORD_POKEMON,
+ EC_WORD_EVOLVE,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_LEVEL,
+ EC_WORD_INSOMNIA,
+ EC_WORD_CUTE_CHARM
+};
+
+static const u16 sQuizLadyQuestion4[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_IS,
+ EC_WORD_THE,
+ EC_WORD_PRETTY,
+ EC_WORD_ITEM,
+ EC_WORD_QUES,
+ EC_WORD_COLD,
+ EC_WORD_FLOWERS,
+ EC_WORD_MACHINE
+};
+
+static const u16 sQuizLadyQuestion5[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_ITEM,
+ EC_WORD_DO,
+ EC_WORD_YOU,
+ EC_WORD_BREAK,
+ EC_WORD_QUES,
+ EC_WORD_EGG,
+ EC_WORD_MAIL,
+ EC_WORD_PHONE
+};
+
+static const u16 sQuizLadyQuestion6[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_WILL,
+ EC_WORD_STOP,
+ EC_MOVE2(CONFUSION),
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_ILLUMINATE,
+ EC_WORD_OWN_TEMPO,
+ EC_WORD_SWIFT_SWIM
+};
+
+static const u16 sQuizLadyQuestion7[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_OF,
+ EC_WORD_THESE,
+ EC_WORD_IS,
+ EC_WORD_MUSIC,
+ EC_WORD_QUES,
+ EC_WORD_FLYING,
+ EC_WORD_STEEL,
+ EC_WORD_ROCK
+};
+
+static const u16 sQuizLadyQuestion8[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_WILL,
+ EC_MOVE2(BLOCK),
+ EC_WORD_ESCAPE,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_RUN_AWAY,
+ EC_WORD_SHADOW_TAG,
+ EC_WORD_WONDER_GUARD
+};
+
+static const u16 sQuizLadyQuestion9[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_WILL,
+ EC_WORD_STOP,
+ EC_WORD_POISON,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_GUTS,
+ EC_WORD_IMMUNITY,
+ EC_WORD_SHED_SKIN
+};
+
+static const u16 sQuizLadyQuestion10[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_GOES,
+ EC_WORD_WITH,
+ EC_WORD_CENTER,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_POKEDEX,
+ EC_WORD_POKEMON,
+ EC_WORD_POKENAV
+};
+
+static const u16 sQuizLadyQuestion11[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_STORES,
+ EC_WORD_YOUR,
+ EC_WORD_POKEMON,
+ EC_WORD_QUES,
+ 0xFFFF,
+ EC_WORD_PC,
+ EC_WORD_DEPT_STORE,
+ EC_WORD_TELEVISION
+};
+
+static const u16 sQuizLadyQuestion12[] =
+{
+ EC_WORD_WHICH,
+ EC_WORD_MACHINE,
+ EC_WORD_GIVES,
+ EC_WORD_YOU,
+ EC_WORD_INFORMATION,
+ EC_WORD_QUES,
+ EC_WORD_BIKE,
+ EC_WORD_LOCOMOTIVE,
+ EC_WORD_TELEVISION
+};
+
+static const u16 sQuizLadyQuestion13[] =
+{
+ EC_WORD_A,
+ EC_WORD_POKEMON,
+ EC_WORD_WAS,
+ EC_WORD_ONCE,
+ EC_WORD_THIS,
+ EC_WORD_QUES,
+ EC_WORD_PHONE,
+ EC_WORD_PLUSH_DOLL,
+ EC_WORD_LETTER
+};
+
+static const u16 sQuizLadyQuestion14[] =
+{
+ EC_WORD_STEEL,
+ EC_WORD_IS,
+ EC_WORD_STRONG,
+ EC_WORD_VERSUS,
+ EC_WORD_WHICH,
+ EC_WORD_QUES,
+ EC_WORD_ICE,
+ EC_WORD_GROUND,
+ 0xFFFF
+};
+
+static const u16 sQuizLadyQuestion15[] =
+{
+ EC_WORD_DARK,
+ EC_WORD_IS,
+ EC_WORD_WEAK,
+ EC_WORD_VERSUS,
+ EC_WORD_WHICH,
+ EC_WORD_QUES,
+ EC_WORD_PSYCHIC,
+ EC_WORD_FIGHTING,
+ 0xFFFF
+};
+
+static const u16 sQuizLadyQuestion16[] =
+{
+ EC_WORD_GHOST,
+ EC_WORD_IS,
+ EC_WORD_WEAK,
+ EC_WORD_VERSUS,
+ EC_WORD_WHICH,
+ EC_WORD_QUES,
+ EC_WORD_NORMAL,
+ EC_WORD_DARK,
+ 0xFFFF
+};
+
+static const u16 *const sQuizLadyQuizQuestions[] =
+{
+ sQuizLadyQuestion1,
+ sQuizLadyQuestion2,
+ sQuizLadyQuestion3,
+ sQuizLadyQuestion4,
+ sQuizLadyQuestion5,
+ sQuizLadyQuestion6,
+ sQuizLadyQuestion7,
+ sQuizLadyQuestion8,
+ sQuizLadyQuestion9,
+ sQuizLadyQuestion10,
+ sQuizLadyQuestion11,
+ sQuizLadyQuestion12,
+ sQuizLadyQuestion13,
+ sQuizLadyQuestion14,
+ sQuizLadyQuestion15,
+ sQuizLadyQuestion16
+};
+
+static const u16 sQuizLadyQuizAnswers[] =
+{
+ EC_WORD_POKEDEX,
+ EC_WORD_DARK,
+ EC_WORD_LEVEL,
+ EC_WORD_FLOWERS,
+ EC_WORD_EGG,
+ EC_WORD_OWN_TEMPO,
+ EC_WORD_ROCK,
+ EC_WORD_SHADOW_TAG,
+ EC_WORD_IMMUNITY,
+ EC_WORD_POKEMON,
+ EC_WORD_PC,
+ EC_WORD_TELEVISION,
+ EC_WORD_PLUSH_DOLL,
+ EC_WORD_ICE,
+ EC_WORD_FIGHTING,
+ EC_WORD_DARK
+};
+
+static const u16 sQuizLadyPrizes[] =
+{
+ ITEM_GLITTER_MAIL,
+ ITEM_BEAD_MAIL,
+ ITEM_TROPIC_MAIL,
+ ITEM_MAX_ETHER,
+ ITEM_MAX_ETHER,
+ ITEM_MAX_ETHER,
+ ITEM_WATMEL_BERRY,
+ ITEM_BELUE_BERRY,
+ ITEM_DURIN_BERRY,
+ ITEM_LUXURY_BALL,
+ ITEM_TM15_HYPER_BEAM,
+ ITEM_BIG_PEARL,
+ ITEM_STAR_PIECE,
+ ITEM_RARE_CANDY,
+ ITEM_RARE_CANDY,
+ ITEM_PREMIER_BALL
+};
+
+// Favor Lady data
+static const u8 *const sFavorLadyRequests[] =
+{
+ gText_FavorLady_Slippery,
+ gText_FavorLady_Roundish,
+ gText_FavorLady_Whamish,
+ gText_FavorLady_Shiny,
+ gText_FavorLady_Sticky,
+ gText_FavorLady_Pointy
+};
+
+static const u16 sFavorLadyAcceptedItems_Slippery[] =
+{
+ ITEM_REPEL,
+ ITEM_SUPER_REPEL,
+ ITEM_MAX_REPEL,
+ ITEM_ANTIDOTE,
+ ITEM_PARALYZE_HEAL,
+ ITEM_BURN_HEAL,
+ ITEM_BELUE_BERRY,
+ ITEM_AWAKENING,
+ ITEM_ICE_HEAL,
+ ITEM_REVIVE,
+ ITEM_MAX_REVIVE,
+ ITEM_ENERGY_POWDER,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Roundish[] =
+{
+ ITEM_FLUFFY_TAIL,
+ ITEM_PEARL,
+ ITEM_BIG_PEARL,
+ ITEM_HARD_STONE,
+ ITEM_SMOKE_BALL,
+ ITEM_SHOAL_SHELL,
+ ITEM_TINY_MUSHROOM,
+ ITEM_BIG_MUSHROOM,
+ ITEM_PECHA_BERRY,
+ ITEM_ASPEAR_BERRY,
+ ITEM_ORAN_BERRY,
+ ITEM_GREPA_BERRY,
+ ITEM_MAGOST_BERRY,
+ ITEM_WATMEL_BERRY,
+ ITEM_POKE_BALL,
+ ITEM_ULTRA_BALL,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Whamish[] =
+{
+ ITEM_REVIVAL_HERB,
+ ITEM_POTION,
+ ITEM_FRESH_WATER,
+ ITEM_SODA_POP,
+ ITEM_LEMONADE,
+ ITEM_HARD_STONE,
+ ITEM_LIGHT_BALL,
+ ITEM_LAVA_COOKIE,
+ ITEM_CHESTO_BERRY,
+ ITEM_NANAB_BERRY,
+ ITEM_WEPEAR_BERRY,
+ ITEM_KELPSY_BERRY,
+ ITEM_NOMEL_BERRY,
+ ITEM_DURIN_BERRY,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Shiny[] =
+{
+ ITEM_HEAL_POWDER,
+ ITEM_X_SPEED,
+ ITEM_X_ATTACK,
+ ITEM_X_DEFEND,
+ ITEM_BLUE_FLUTE,
+ ITEM_YELLOW_FLUTE,
+ ITEM_RED_FLUTE,
+ ITEM_BLACK_FLUTE,
+ ITEM_WHITE_FLUTE,
+ ITEM_NUGGET,
+ ITEM_SUN_STONE,
+ ITEM_STARDUST,
+ ITEM_STAR_PIECE,
+ ITEM_PEARL,
+ ITEM_BIG_PEARL,
+ ITEM_TWISTED_SPOON,
+ ITEM_SILVER_POWDER,
+ ITEM_BRIGHT_POWDER,
+ ITEM_LUXURY_BALL,
+ ITEM_PREMIER_BALL,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Sticky[] =
+{
+ ITEM_ENERGY_ROOT,
+ ITEM_FULL_RESTORE,
+ ITEM_MAX_POTION,
+ ITEM_DIRE_HIT,
+ ITEM_X_ACCURACY,
+ ITEM_GUARD_SPEC,
+ ITEM_WATMEL_BERRY,
+ ITEM_LEFTOVERS,
+ ITEM_TINY_MUSHROOM,
+ ITEM_HEART_SCALE,
+ ITEM_NONE
+};
+
+static const u16 sFavorLadyAcceptedItems_Pointy[] =
+{
+ ITEM_QUICK_CLAW,
+ ITEM_POISON_BARB,
+ ITEM_SHARP_BEAK,
+ ITEM_DRAGON_FANG,
+ ITEM_TAMATO_BERRY,
+ ITEM_DURIN_BERRY,
+ ITEM_PETAYA_BERRY,
+ ITEM_SALAC_BERRY,
+ ITEM_STARDUST,
+ ITEM_STAR_PIECE,
+ ITEM_NONE
+};
+
+static const u16 *const sFavorLadyAcceptedItemLists[] =
+{
+ sFavorLadyAcceptedItems_Slippery,
+ sFavorLadyAcceptedItems_Roundish,
+ sFavorLadyAcceptedItems_Whamish,
+ sFavorLadyAcceptedItems_Shiny,
+ sFavorLadyAcceptedItems_Sticky,
+ sFavorLadyAcceptedItems_Pointy
+};
+
+static const u16 sFavorLadyPrizes[] =
+{
+ ITEM_LUXURY_BALL,
+ ITEM_NUGGET,
+ ITEM_PROTEIN,
+ ITEM_HEART_SCALE,
+ ITEM_RARE_CANDY,
+ ITEM_PP_MAX
+};
+
+
+static const u8 *const sContestLadyMonNames[] =
+{
+ gText_ContestLady_Handsome,
+ gText_ContestLady_Vinny,
+ gText_ContestLady_Moreme,
+ gText_ContestLady_Ironhard,
+ gText_ContestLady_Muscle
+};
+
+static const u8 *const sContestLadyCategoryNames[] =
+{
+ gText_ContestLady_Coolness,
+ gText_ContestLady_Beauty,
+ gText_ContestLady_Cuteness,
+ gText_ContestLady_Smartness,
+ gText_ContestLady_Toughness
+};
+
+static const u8 *const sContestNames[] =
+{
+ gText_CoolnessContest,
+ gText_BeautyContest,
+ gText_CutenessContest,
+ gText_SmartnessContest,
+ gText_ToughnessContest
+};
+
+static const u16 sContestLadyMonSpecies[] =
+{
+ SPECIES_ZIGZAGOON,
+ SPECIES_SKITTY,
+ SPECIES_POOCHYENA,
+ SPECIES_KECLEON,
+ SPECIES_PIKACHU
+};
diff --git a/src/data/region_map/city_map_entries.h b/src/data/region_map/city_map_entries.h
new file mode 100644
index 000000000..7b8361a7c
--- /dev/null
+++ b/src/data/region_map/city_map_entries.h
@@ -0,0 +1,113 @@
+const struct CityMapEntry gPokenavCityMaps[] =
+{
+ {
+ .mapSecId = 0,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Littleroot_0,
+ },
+ {
+ .mapSecId = 1,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Oldale_0,
+ },
+ {
+ .mapSecId = 2,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Dewford_0,
+ },
+ {
+ .mapSecId = 3,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Lavarige_0,
+ },
+ {
+ .mapSecId = 4,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Fallarbor_0,
+ },
+ {
+ .mapSecId = 5,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Verdanturf_0,
+ },
+ {
+ .mapSecId = 6,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Pacifidlog_0,
+ },
+ {
+ .mapSecId = 7,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Petalburg_0,
+ },
+ {
+ .mapSecId = 8,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Slateport_0,
+ },
+ {
+ .mapSecId = 8,
+ .index = 1,
+ .tilemap = gPokenavCityMap_Slateport_1,
+ },
+ {
+ .mapSecId = 9,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Mauville_0,
+ },
+ {
+ .mapSecId = 9,
+ .index = 1,
+ .tilemap = gPokenavCityMap_Mauville_1,
+ },
+ {
+ .mapSecId = 10,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Rustboro_0,
+ },
+ {
+ .mapSecId = 10,
+ .index = 1,
+ .tilemap = gPokenavCityMap_Rustboro_1,
+ },
+ {
+ .mapSecId = 11,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Fortree_0,
+ },
+ {
+ .mapSecId = 12,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Lilycove_0,
+ },
+ {
+ .mapSecId = 12,
+ .index = 1,
+ .tilemap = gPokenavCityMap_Lilycove_1,
+ },
+ {
+ .mapSecId = 13,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Mossdeep_0,
+ },
+ {
+ .mapSecId = 13,
+ .index = 1,
+ .tilemap = gPokenavCityMap_Mossdeep_1,
+ },
+ {
+ .mapSecId = 14,
+ .index = 0,
+ .tilemap = gPokenavCityMap_Sootopolis_0,
+ },
+ {
+ .mapSecId = 15,
+ .index = 0,
+ .tilemap = gPokenavCityMap_EverGrande_0,
+ },
+ {
+ .mapSecId = 15,
+ .index = 1,
+ .tilemap = gPokenavCityMap_EverGrande_1,
+ },
+};
diff --git a/src/data/region_map/city_map_tilemaps.h b/src/data/region_map/city_map_tilemaps.h
new file mode 100644
index 000000000..8a8a931f9
--- /dev/null
+++ b/src/data/region_map/city_map_tilemaps.h
@@ -0,0 +1,22 @@
+const u32 gPokenavCityMap_Lavarige_0[] = INCBIN_U32("graphics/pokenav/city_maps/lavaridge_0.bin.lz");
+const u32 gPokenavCityMap_Fallarbor_0[] = INCBIN_U32("graphics/pokenav/city_maps/fallarbor_0.bin.lz");
+const u32 gPokenavCityMap_Fortree_0[] = INCBIN_U32("graphics/pokenav/city_maps/fortree_0.bin.lz");
+const u32 gPokenavCityMap_Slateport_0[] = INCBIN_U32("graphics/pokenav/city_maps/slateport_0.bin.lz");
+const u32 gPokenavCityMap_Slateport_1[] = INCBIN_U32("graphics/pokenav/city_maps/slateport_1.bin.lz");
+const u32 gPokenavCityMap_Rustboro_0[] = INCBIN_U32("graphics/pokenav/city_maps/rustboro_0.bin.lz");
+const u32 gPokenavCityMap_Rustboro_1[] = INCBIN_U32("graphics/pokenav/city_maps/rustboro_1.bin.lz");
+const u32 gPokenavCityMap_Pacifidlog_0[] = INCBIN_U32("graphics/pokenav/city_maps/pacifidlog_0.bin.lz");
+const u32 gPokenavCityMap_Mauville_1[] = INCBIN_U32("graphics/pokenav/city_maps/mauville_1.bin.lz");
+const u32 gPokenavCityMap_Mauville_0[] = INCBIN_U32("graphics/pokenav/city_maps/mauville_0.bin.lz");
+const u32 gPokenavCityMap_Oldale_0[] = INCBIN_U32("graphics/pokenav/city_maps/oldale_0.bin.lz");
+const u32 gPokenavCityMap_Lilycove_1[] = INCBIN_U32("graphics/pokenav/city_maps/lilycove_1.bin.lz");
+const u32 gPokenavCityMap_Lilycove_0[] = INCBIN_U32("graphics/pokenav/city_maps/lilycove_0.bin.lz");
+const u32 gPokenavCityMap_Littleroot_0[] = INCBIN_U32("graphics/pokenav/city_maps/littleroot_0.bin.lz");
+const u32 gPokenavCityMap_Dewford_0[] = INCBIN_U32("graphics/pokenav/city_maps/dewford_0.bin.lz");
+const u32 gPokenavCityMap_Sootopolis_0[] = INCBIN_U32("graphics/pokenav/city_maps/sootopolis_0.bin.lz");
+const u32 gPokenavCityMap_EverGrande_0[] = INCBIN_U32("graphics/pokenav/city_maps/ever_grande_0.bin.lz");
+const u32 gPokenavCityMap_EverGrande_1[] = INCBIN_U32("graphics/pokenav/city_maps/ever_grande_1.bin.lz");
+const u32 gPokenavCityMap_Verdanturf_0[] = INCBIN_U32("graphics/pokenav/city_maps/verdanturf_0.bin.lz");
+const u32 gPokenavCityMap_Mossdeep_1[] = INCBIN_U32("graphics/pokenav/city_maps/mossdeep_1.bin.lz");
+const u32 gPokenavCityMap_Mossdeep_0[] = INCBIN_U32("graphics/pokenav/city_maps/mossdeep_0.bin.lz");
+const u32 gPokenavCityMap_Petalburg_0[] = INCBIN_U32("graphics/pokenav/city_maps/petalburg_0.bin.lz");
diff --git a/src/data/text/gift_ribbon_descriptions.h b/src/data/text/gift_ribbon_descriptions.h
new file mode 100644
index 000000000..ea108be18
--- /dev/null
+++ b/src/data/text/gift_ribbon_descriptions.h
@@ -0,0 +1,115 @@
+const u8 gGiftRibbonDescriptionPart1_2003RegionalTourney[] = _("2003 REGIONAL TOURNEY");
+const u8 gGiftRibbonDescriptionPart2_Champion[] = _("CHAMPION RIBBON");
+const u8 gGiftRibbonDescriptionPart1_2003NationalTourney[] = _("2003 NATIONAL TOURNEY");
+const u8 gGiftRibbonDescriptionPart1_2003GlobalCup[] = _("2003 GLOBAL CUP");
+const u8 gGiftRibbonDescriptionPart2_RunnerUp[] = _("Runner-up RIBBON");
+const u8 gGiftRibbonDescriptionPart2_Semifinalist[] = _("Semifinalist RIBBON");
+const u8 gGiftRibbonDescriptionPart1_2004RegionalTourney[] = _("2004 REGIONAL TOURNEY");
+const u8 gGiftRibbonDescriptionPart1_2004NationalTourney[] = _("2004 NATIONAL TOURNEY");
+const u8 gGiftRibbonDescriptionPart1_2004GlobalCup[] = _("2004 GLOBAL CUP");
+const u8 gGiftRibbonDescriptionPart1_2005RegionalTourney[] = _("2005 REGIONAL TOURNEY");
+const u8 gGiftRibbonDescriptionPart1_2005NationalTourney[] = _("2005 NATIONAL TOURNEY");
+const u8 gGiftRibbonDescriptionPart1_2005GlobalCup[] = _("2005 GLOBAL CUP");
+const u8 gGiftRibbonDescriptionPart1_PokemonBattleCup[] = _("POKéMON BATTLE CUP");
+const u8 gGiftRibbonDescriptionPart2_Participation[] = _("Participation RIBBON");
+const u8 gGiftRibbonDescriptionPart1_PokemonLeague[] = _("POKéMON LEAGUE");
+const u8 gGiftRibbonDescriptionPart1_AdvanceCup[] = _("ADVANCE CUP");
+const u8 gGiftRibbonDescriptionPart1_PokemonTournament[] = _("POKéMON Tournament");
+const u8 gGiftRibbonDescriptionPart2_Participation2[] = _("Participation RIBBON");
+const u8 gGiftRibbonDescriptionPart1_PokemonEvent[] = _("POKéMON Event");
+const u8 gGiftRibbonDescriptionPart1_PokemonFestival[] = _("POKéMON Festival");
+const u8 gGiftRibbonDescriptionPart1_DifficultyClearing[] = _("Difficulty-clearing");
+const u8 gGiftRibbonDescriptionPart2_Commemorative[] = _("Commemorative RIBBON");
+const u8 gGiftRibbonDescriptionPart1_ClearingAllChallenges[] = _("RIBBON awarded for");
+const u8 gGiftRibbonDescriptionPart2_ClearingAllChallenges[] = _("clearing all challenges.");
+const u8 gGiftRibbonDescriptionPart1_100StraightWin[] = _("100-straight Win");
+const u8 gGiftRibbonDescriptionPart1_DarknessTower[] = _("DARKNESS TOWER Clear");
+const u8 gGiftRibbonDescriptionPart1_RedTower[] = _("RED TOWER Clear");
+const u8 gGiftRibbonDescriptionPart1_BlackironTower[] = _("BLACKIRON TOWER Clear");
+const u8 gGiftRibbonDescriptionPart1_FinalTower[] = _("FINAL TOWER Clear");
+const u8 gGiftRibbonDescriptionPart1_LegendMaking[] = _("Legend-making");
+const u8 gGiftRibbonDescriptionPart1_PokemonCenterTokyo[] = _("POKéMON CENTER TOKYO");
+const u8 gGiftRibbonDescriptionPart1_PokemonCenterOsaka[] = _("POKéMON CENTER OSAKA");
+const u8 gGiftRibbonDescriptionPart1_PokemonCenterNagoya[] = _("POKéMON CENTER NAGOYA");
+const u8 gGiftRibbonDescriptionPart1_PokemonCenterNY[] = _("POKéMON CENTER NY");
+const u8 gGiftRibbonDescriptionPart1_SummerHolidays[] = _("Summer Holidays RIBBON");
+const u8 gGiftRibbonDescriptionPart2_EmptyString[] = _("");
+const u8 gGiftRibbonDescriptionPart1_WinterHolidays[] = _("Winter Holidays RIBBON");
+const u8 gGiftRibbonDescriptionPart1_SpringHolidays[] = _("Spring Holidays RIBBON");
+const u8 gGiftRibbonDescriptionPart1_Evergreen[] = _("Evergreen RIBBON");
+const u8 gGiftRibbonDescriptionPart1_SpecialHoliday[] = _("Special Holiday RIBBON");
+const u8 gGiftRibbonDescriptionPart1_HardWorker[] = _("Hard Worker RIBBON");
+const u8 gGiftRibbonDescriptionPart1_LotsOfFriends[] = _("Lots of Friends RIBBON");
+const u8 gGiftRibbonDescriptionPart1_FullOfEnergy[] = _("Full of Energy RIBBON");
+const u8 gGiftRibbonDescriptionPart1_LovedPokemon[] = _("A commemorative RIBBON");
+const u8 gGiftRibbonDescriptionPart2_LovedPokemon[] = _("for a loved POKéMON.");
+const u8 gGiftRibbonDescriptionPart1_LoveForPokemon[] = _("RIBBON that shows");
+const u8 gGiftRibbonDescriptionPart2_LoveForPokemon[] = _("love for POKéMON.");
+
+const u8 *const gGiftRibbonDescriptionPointers[][2] =
+{
+ {gGiftRibbonDescriptionPart1_2003RegionalTourney, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2003NationalTourney, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2003GlobalCup, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2003RegionalTourney, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2003NationalTourney, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2003GlobalCup, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2003RegionalTourney, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2003NationalTourney, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2003GlobalCup, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2004RegionalTourney, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2004NationalTourney, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2004GlobalCup, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2004RegionalTourney, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2004NationalTourney, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2004GlobalCup, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2004RegionalTourney, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2004NationalTourney, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2004GlobalCup, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2005RegionalTourney, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2005NationalTourney, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2005GlobalCup, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_2005RegionalTourney, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2005NationalTourney, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2005GlobalCup, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_2005RegionalTourney, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2005NationalTourney, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_2005GlobalCup, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_PokemonBattleCup, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_PokemonBattleCup, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_PokemonBattleCup, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_PokemonBattleCup, gGiftRibbonDescriptionPart2_Participation},
+ {gGiftRibbonDescriptionPart1_PokemonLeague, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_PokemonLeague, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_PokemonLeague, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_PokemonLeague, gGiftRibbonDescriptionPart2_Participation},
+ {gGiftRibbonDescriptionPart1_AdvanceCup, gGiftRibbonDescriptionPart2_Champion},
+ {gGiftRibbonDescriptionPart1_AdvanceCup, gGiftRibbonDescriptionPart2_RunnerUp},
+ {gGiftRibbonDescriptionPart1_AdvanceCup, gGiftRibbonDescriptionPart2_Semifinalist},
+ {gGiftRibbonDescriptionPart1_AdvanceCup, gGiftRibbonDescriptionPart2_Participation},
+ {gGiftRibbonDescriptionPart1_PokemonTournament, gGiftRibbonDescriptionPart2_Participation2},
+ {gGiftRibbonDescriptionPart1_PokemonEvent, gGiftRibbonDescriptionPart2_Participation2},
+ {gGiftRibbonDescriptionPart1_PokemonFestival, gGiftRibbonDescriptionPart2_Participation2},
+ {gGiftRibbonDescriptionPart1_DifficultyClearing, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_ClearingAllChallenges, gGiftRibbonDescriptionPart2_ClearingAllChallenges},
+ {gGiftRibbonDescriptionPart1_100StraightWin, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_DarknessTower, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_RedTower, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_BlackironTower, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_FinalTower, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_LegendMaking, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_PokemonCenterTokyo, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_PokemonCenterOsaka, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_PokemonCenterNagoya, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_PokemonCenterNY, gGiftRibbonDescriptionPart2_Commemorative},
+ {gGiftRibbonDescriptionPart1_SummerHolidays, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_WinterHolidays, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_SpringHolidays, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_Evergreen, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_SpecialHoliday, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_HardWorker, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_LotsOfFriends, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_FullOfEnergy, gGiftRibbonDescriptionPart2_EmptyString},
+ {gGiftRibbonDescriptionPart1_LovedPokemon, gGiftRibbonDescriptionPart2_LovedPokemon},
+ {gGiftRibbonDescriptionPart1_LoveForPokemon, gGiftRibbonDescriptionPart2_LoveForPokemon}
+};
diff --git a/src/data/text/match_call_messages.h b/src/data/text/match_call_messages.h
new file mode 100644
index 000000000..c3015b5a7
--- /dev/null
+++ b/src/data/text/match_call_messages.h
@@ -0,0 +1,476 @@
+#define MCFLAVOR(name) {gMatchCallFlavorText_##name##_Strategy, \
+ gMatchCallFlavorText_##name##_Pokemon, \
+ gMatchCallFlavorText_##name##_Intro1, \
+ gMatchCallFlavorText_##name##_Intro2}
+
+const u8 gMatchCallFlavorText_AromaLady_Rose_Strategy[] = _("Becalm fighting emotions.");
+const u8 gMatchCallFlavorText_AromaLady_Rose_Pokemon[] = _("Fragrant GRASS POKéMON.");
+const u8 gMatchCallFlavorText_AromaLady_Rose_Intro1[] = _("Soothing aromas make the");
+const u8 gMatchCallFlavorText_AromaLady_Rose_Intro2[] = _("body and mind healthy.");
+
+const u8 gMatchCallFlavorText_RuinManiac_Andres_Strategy[] = _("I'm not very good at this.");
+const u8 gMatchCallFlavorText_RuinManiac_Andres_Pokemon[] = _("Ruin-exploration partners.");
+const u8 gMatchCallFlavorText_RuinManiac_Andres_Intro1[] = _("I am searching for undersea");
+const u8 gMatchCallFlavorText_RuinManiac_Andres_Intro2[] = _("ruins and relics.");
+
+const u8 gMatchCallFlavorText_RuinManiac_Dusty_Strategy[] = _("Overwhelm with power!");
+const u8 gMatchCallFlavorText_RuinManiac_Dusty_Pokemon[] = _("Craggy ROCK POKéMON.");
+const u8 gMatchCallFlavorText_RuinManiac_Dusty_Intro1[] = _("In search of ancient lore,");
+const u8 gMatchCallFlavorText_RuinManiac_Dusty_Intro2[] = _("I travel the world.");
+
+const u8 gMatchCallFlavorText_Tuber_Lola_Strategy[] = _("I'm going to try hard!");
+const u8 gMatchCallFlavorText_Tuber_Lola_Pokemon[] = _("Good swimmer POKéMON.");
+const u8 gMatchCallFlavorText_Tuber_Lola_Intro1[] = _("I wish I could swim without");
+const u8 gMatchCallFlavorText_Tuber_Lola_Intro2[] = _("using an inner tube.");
+
+const u8 gMatchCallFlavorText_Tuber_Ricky_Strategy[] = _("I don't know. I'll try hard.");
+const u8 gMatchCallFlavorText_Tuber_Ricky_Pokemon[] = _("WATER POKéMON are buddies.");
+const u8 gMatchCallFlavorText_Tuber_Ricky_Intro1[] = _("It's not like I can't swim.");
+const u8 gMatchCallFlavorText_Tuber_Ricky_Intro2[] = _("I just like my inner tube.");
+
+const u8 gMatchCallFlavorText_SisAndBro_LilaAndRoy_Strategy[] = _("We split our duties.");
+const u8 gMatchCallFlavorText_SisAndBro_LilaAndRoy_Pokemon[] = _("We like friendly POKéMON.");
+const u8 gMatchCallFlavorText_SisAndBro_LilaAndRoy_Intro1[] = _("We enjoy POKéMON together");
+const u8 gMatchCallFlavorText_SisAndBro_LilaAndRoy_Intro2[] = _("as sister and brother.");
+
+const u8 gMatchCallFlavorText_Cooltrainer_Cristin_Strategy[] = _("I finish with power moves!");
+const u8 gMatchCallFlavorText_Cooltrainer_Cristin_Pokemon[] = _("A mix of different types.");
+const u8 gMatchCallFlavorText_Cooltrainer_Cristin_Intro1[] = _("I aim to become the ultimate");
+const u8 gMatchCallFlavorText_Cooltrainer_Cristin_Intro2[] = _("TRAINER!");
+
+const u8 gMatchCallFlavorText_Cooltrainer_Brooke_Strategy[] = _("Exploit the foe's weakness.");
+const u8 gMatchCallFlavorText_Cooltrainer_Brooke_Pokemon[] = _("Balance is crucial.");
+const u8 gMatchCallFlavorText_Cooltrainer_Brooke_Intro1[] = _("My goal is to become the");
+const u8 gMatchCallFlavorText_Cooltrainer_Brooke_Intro2[] = _("POKéMON CHAMPION.");
+
+const u8 gMatchCallFlavorText_Cooltrainer_Wilton_Strategy[] = _("Upset the opponent.");
+const u8 gMatchCallFlavorText_Cooltrainer_Wilton_Pokemon[] = _("Type doesn't matter.");
+const u8 gMatchCallFlavorText_Cooltrainer_Wilton_Intro1[] = _("I'm a top student at the");
+const u8 gMatchCallFlavorText_Cooltrainer_Wilton_Intro2[] = _("TRAINER'S SCHOOL.");
+
+const u8 gMatchCallFlavorText_HexManiac_Valerie_Strategy[] = _("Slow, steady suffering.");
+const u8 gMatchCallFlavorText_HexManiac_Valerie_Pokemon[] = _("Scary to meet at night.");
+const u8 gMatchCallFlavorText_HexManiac_Valerie_Intro1[] = _("I see things that others");
+const u8 gMatchCallFlavorText_HexManiac_Valerie_Intro2[] = _("can't see...");
+
+const u8 gMatchCallFlavorText_Lady_Cindy_Strategy[] = _("Anything to win.");
+const u8 gMatchCallFlavorText_Lady_Cindy_Pokemon[] = _("Gorgeous type!");
+const u8 gMatchCallFlavorText_Lady_Cindy_Intro1[] = _("I have a pool specially for");
+const u8 gMatchCallFlavorText_Lady_Cindy_Intro2[] = _("my POKéMON at home.");
+
+const u8 gMatchCallFlavorText_Beauty_Thalia_Strategy[] = _("You'll fall under my spell!");
+const u8 gMatchCallFlavorText_Beauty_Thalia_Pokemon[] = _("Mature WATER type.");
+const u8 gMatchCallFlavorText_Beauty_Thalia_Intro1[] = _("I dream of cruising around");
+const u8 gMatchCallFlavorText_Beauty_Thalia_Intro2[] = _("the world on a luxury liner.");
+
+const u8 gMatchCallFlavorText_Beauty_Jessica_Strategy[] = _("I'll lead you astray.");
+const u8 gMatchCallFlavorText_Beauty_Jessica_Pokemon[] = _("Cute, of course.");
+const u8 gMatchCallFlavorText_Beauty_Jessica_Intro1[] = _("I love the SAFARI ZONE.");
+const u8 gMatchCallFlavorText_Beauty_Jessica_Intro2[] = _("I seem to end up there.");
+
+const u8 gMatchCallFlavorText_RichBoy_Winston_Strategy[] = _("Strategy? Who needs it?");
+const u8 gMatchCallFlavorText_RichBoy_Winston_Pokemon[] = _("I spent big money on it!");
+const u8 gMatchCallFlavorText_RichBoy_Winston_Intro1[] = _("I, being rich, sleep in a");
+const u8 gMatchCallFlavorText_RichBoy_Winston_Intro2[] = _("custom POKéMON bed.");
+
+const u8 gMatchCallFlavorText_PokeManiac_Steve_Strategy[] = _("Wrestle down with power.");
+const u8 gMatchCallFlavorText_PokeManiac_Steve_Pokemon[] = _("Took all night to catch.");
+const u8 gMatchCallFlavorText_PokeManiac_Steve_Intro1[] = _("Big, burly, and buff");
+const u8 gMatchCallFlavorText_PokeManiac_Steve_Intro2[] = _("POKéMON are the best...");
+
+const u8 gMatchCallFlavorText_Swimmer_Tony_Strategy[] = _("Ram at full speed!");
+const u8 gMatchCallFlavorText_Swimmer_Tony_Pokemon[] = _("Funky WATER type!");
+const u8 gMatchCallFlavorText_Swimmer_Tony_Intro1[] = _("If I can't be out swimming,");
+const u8 gMatchCallFlavorText_Swimmer_Tony_Intro2[] = _("I'll be pumping weights.");
+
+const u8 gMatchCallFlavorText_BlackBelt_Nob_Strategy[] = _("Grand slam pummeling!");
+const u8 gMatchCallFlavorText_BlackBelt_Nob_Pokemon[] = _("FIGHTING type.");
+const u8 gMatchCallFlavorText_BlackBelt_Nob_Intro1[] = _("Not to brag, but I can bust");
+const u8 gMatchCallFlavorText_BlackBelt_Nob_Intro2[] = _("ten roof tiles!");
+
+const u8 gMatchCallFlavorText_BlackBelt_Koji_Strategy[] = _("Witness karate power!");
+const u8 gMatchCallFlavorText_BlackBelt_Koji_Pokemon[] = _("My partners in training!");
+const u8 gMatchCallFlavorText_BlackBelt_Koji_Intro1[] = _("Let us discuss matters of");
+const u8 gMatchCallFlavorText_BlackBelt_Koji_Intro2[] = _("the world with bare fists!");
+
+const u8 gMatchCallFlavorText_Guitarist_Fernando_Strategy[] = _("Rock to stunning sounds!");
+const u8 gMatchCallFlavorText_Guitarist_Fernando_Pokemon[] = _("Electric-and-sound combo!");
+const u8 gMatchCallFlavorText_Guitarist_Fernando_Intro1[] = _("My compositions will shock");
+const u8 gMatchCallFlavorText_Guitarist_Fernando_Intro2[] = _("you and stun you!");
+
+const u8 gMatchCallFlavorText_Guitarist_Dalton_Strategy[] = _("I'll electrify you!");
+const u8 gMatchCallFlavorText_Guitarist_Dalton_Pokemon[] = _("They're ELECTRIC!");
+const u8 gMatchCallFlavorText_Guitarist_Dalton_Intro1[] = _("I want to make people cry");
+const u8 gMatchCallFlavorText_Guitarist_Dalton_Intro2[] = _("with songs from my heart.");
+
+const u8 gMatchCallFlavorText_Kindler_Bernie_Strategy[] = _("Burn it all down!");
+const u8 gMatchCallFlavorText_Kindler_Bernie_Pokemon[] = _("Burn-inducing POKéMON.");
+const u8 gMatchCallFlavorText_Kindler_Bernie_Intro1[] = _("When you light a campfire,");
+const u8 gMatchCallFlavorText_Kindler_Bernie_Intro2[] = _("be sure there's some water.");
+
+const u8 gMatchCallFlavorText_Camper_Ethan_Strategy[] = _("Hang in and be tenacious!");
+const u8 gMatchCallFlavorText_Camper_Ethan_Pokemon[] = _("I'll raise any POKéMON.");
+const u8 gMatchCallFlavorText_Camper_Ethan_Intro1[] = _("POKéMON raised in the wild");
+const u8 gMatchCallFlavorText_Camper_Ethan_Intro2[] = _("grow strong!");
+
+const u8 gMatchCallFlavorText_OldCouple_JohnAndJay_Strategy[] = _("Our love lets us prevail.");
+const u8 gMatchCallFlavorText_OldCouple_JohnAndJay_Pokemon[] = _("We've had them for years.");
+const u8 gMatchCallFlavorText_OldCouple_JohnAndJay_Intro1[] = _("Married 50 years, we've");
+const u8 gMatchCallFlavorText_OldCouple_JohnAndJay_Intro2[] = _("devotedly raised POKéMON.");
+
+const u8 gMatchCallFlavorText_BugManiac_Jeffrey_Strategy[] = _("Attack in waves!");
+const u8 gMatchCallFlavorText_BugManiac_Jeffrey_Pokemon[] = _("BUG POKéMON are cool.");
+const u8 gMatchCallFlavorText_BugManiac_Jeffrey_Intro1[] = _("I go into the forest every");
+const u8 gMatchCallFlavorText_BugManiac_Jeffrey_Intro2[] = _("day to catch BUG POKéMON.");
+
+const u8 gMatchCallFlavorText_Psychic_Cameron_Strategy[] = _("Daze and confuse!");
+const u8 gMatchCallFlavorText_Psychic_Cameron_Pokemon[] = _("Ones with weird powers.");
+const u8 gMatchCallFlavorText_Psychic_Cameron_Intro1[] = _("I can see through exactly");
+const u8 gMatchCallFlavorText_Psychic_Cameron_Intro2[] = _("what you're thinking!");
+
+const u8 gMatchCallFlavorText_Psychic_Jacki_Strategy[] = _("Battle at full power.");
+const u8 gMatchCallFlavorText_Psychic_Jacki_Pokemon[] = _("POKéMON of many mysteries.");
+const u8 gMatchCallFlavorText_Psychic_Jacki_Intro1[] = _("When we spoke, I was really");
+const u8 gMatchCallFlavorText_Psychic_Jacki_Intro2[] = _("using telepathy.");
+
+const u8 gMatchCallFlavorText_Gentleman_Walter_Strategy[] = _("Calm and collected.");
+const u8 gMatchCallFlavorText_Gentleman_Walter_Pokemon[] = _("POKéMON of distinction.");
+const u8 gMatchCallFlavorText_Gentleman_Walter_Intro1[] = _("We enjoy a spot of tea");
+const u8 gMatchCallFlavorText_Gentleman_Walter_Intro2[] = _("every day. It's imported.");
+
+const u8 gMatchCallFlavorText_SchoolKid_Karen_Strategy[] = _("I use my head to battle.");
+const u8 gMatchCallFlavorText_SchoolKid_Karen_Pokemon[] = _("I love any kind of POKéMON!");
+const u8 gMatchCallFlavorText_SchoolKid_Karen_Intro1[] = _("My daddy gives me spending");
+const u8 gMatchCallFlavorText_SchoolKid_Karen_Intro2[] = _("money if I ace a test.");
+
+const u8 gMatchCallFlavorText_SchoolKid_Jerry_Strategy[] = _("My knowledge rules!");
+const u8 gMatchCallFlavorText_SchoolKid_Jerry_Pokemon[] = _("Any smart POKéMON!");
+const u8 gMatchCallFlavorText_SchoolKid_Jerry_Intro1[] = _("I want to be a POKéMON");
+const u8 gMatchCallFlavorText_SchoolKid_Jerry_Intro2[] = _("researcher in the future.");
+
+const u8 gMatchCallFlavorText_SrAndJr_AnnaAndMeg_Strategy[] = _("We talk it over first.");
+const u8 gMatchCallFlavorText_SrAndJr_AnnaAndMeg_Pokemon[] = _("POKéMON that we both like.");
+const u8 gMatchCallFlavorText_SrAndJr_AnnaAndMeg_Intro1[] = _("We're senior and junior");
+const u8 gMatchCallFlavorText_SrAndJr_AnnaAndMeg_Intro2[] = _("students into POKéMON!");
+
+const u8 gMatchCallFlavorText_Pokefan_Isabel_Strategy[] = _("Go for it, my dears!");
+const u8 gMatchCallFlavorText_Pokefan_Isabel_Pokemon[] = _("I have no likes or dislikes.");
+const u8 gMatchCallFlavorText_Pokefan_Isabel_Intro1[] = _("While out shopping for");
+const u8 gMatchCallFlavorText_Pokefan_Isabel_Intro2[] = _("supper, I battle too.");
+
+const u8 gMatchCallFlavorText_Pokefan_Miguel_Strategy[] = _("I battle with love!");
+const u8 gMatchCallFlavorText_Pokefan_Miguel_Pokemon[] = _("A POKéMON raised with love!");
+const u8 gMatchCallFlavorText_Pokefan_Miguel_Intro1[] = _("It's important to build");
+const u8 gMatchCallFlavorText_Pokefan_Miguel_Intro2[] = _("trust with your POKéMON.");
+
+const u8 gMatchCallFlavorText_Expert_Timothy_Strategy[] = _("I see through your moves!");
+const u8 gMatchCallFlavorText_Expert_Timothy_Pokemon[] = _("The essence of FIGHTING.");
+const u8 gMatchCallFlavorText_Expert_Timothy_Intro1[] = _("I'm not ready to give way");
+const u8 gMatchCallFlavorText_Expert_Timothy_Intro2[] = _("to the young yet!");
+
+const u8 gMatchCallFlavorText_Expert_Shelby_Strategy[] = _("Attack while defending.");
+const u8 gMatchCallFlavorText_Expert_Shelby_Pokemon[] = _("The FIGHTING type.");
+const u8 gMatchCallFlavorText_Expert_Shelby_Intro1[] = _("Being old, I have my own");
+const u8 gMatchCallFlavorText_Expert_Shelby_Intro2[] = _("style of battling.");
+
+const u8 gMatchCallFlavorText_Youngster_Calvin_Strategy[] = _("I do what I can.");
+const u8 gMatchCallFlavorText_Youngster_Calvin_Pokemon[] = _("I use different types.");
+const u8 gMatchCallFlavorText_Youngster_Calvin_Intro1[] = _("I'm going to keep working");
+const u8 gMatchCallFlavorText_Youngster_Calvin_Intro2[] = _("until I beat a GYM LEADER.");
+
+const u8 gMatchCallFlavorText_Fisherman_Elliot_Strategy[] = _("I battle patiently.");
+const u8 gMatchCallFlavorText_Fisherman_Elliot_Pokemon[] = _("WATER POKéMON to battle!");
+const u8 gMatchCallFlavorText_Fisherman_Elliot_Intro1[] = _("I'm the world's only guy to");
+const u8 gMatchCallFlavorText_Fisherman_Elliot_Intro2[] = _("catch a huge POKéMON!");
+
+const u8 gMatchCallFlavorText_Triathlete_Isaiah_Strategy[] = _("Exploit the environment!");
+const u8 gMatchCallFlavorText_Triathlete_Isaiah_Pokemon[] = _("All hail the WATER type!");
+const u8 gMatchCallFlavorText_Triathlete_Isaiah_Intro1[] = _("I won't be beaten by some");
+const u8 gMatchCallFlavorText_Triathlete_Isaiah_Intro2[] = _("beach bum SWIMMER!");
+
+const u8 gMatchCallFlavorText_Triathlete_Maria_Strategy[] = _("Speed above all!");
+const u8 gMatchCallFlavorText_Triathlete_Maria_Pokemon[] = _("I use a speedy POKéMON.");
+const u8 gMatchCallFlavorText_Triathlete_Maria_Intro1[] = _("A marathon is a challenge");
+const u8 gMatchCallFlavorText_Triathlete_Maria_Intro2[] = _("against your own self.");
+
+const u8 gMatchCallFlavorText_Triathlete_Abigail_Strategy[] = _("Defense is crucial.");
+const u8 gMatchCallFlavorText_Triathlete_Abigail_Pokemon[] = _("My POKéMON is solid.");
+const u8 gMatchCallFlavorText_Triathlete_Abigail_Intro1[] = _("I started this for dieting,");
+const u8 gMatchCallFlavorText_Triathlete_Abigail_Intro2[] = _("but I got right into it.");
+
+const u8 gMatchCallFlavorText_Triathlete_Dylan_Strategy[] = _("Strike before stricken!");
+const u8 gMatchCallFlavorText_Triathlete_Dylan_Pokemon[] = _("A fast-running POKéMON!");
+const u8 gMatchCallFlavorText_Triathlete_Dylan_Intro1[] = _("If you ran and ran, you'd");
+const u8 gMatchCallFlavorText_Triathlete_Dylan_Intro2[] = _("become one with the wind.");
+
+const u8 gMatchCallFlavorText_Triathlete_Katelyn_Strategy[] = _("All-out offensive!");
+const u8 gMatchCallFlavorText_Triathlete_Katelyn_Pokemon[] = _("WATER POKéMON rule!");
+const u8 gMatchCallFlavorText_Triathlete_Katelyn_Intro1[] = _("I must swim over 6 miles");
+const u8 gMatchCallFlavorText_Triathlete_Katelyn_Intro2[] = _("every day.");
+
+const u8 gMatchCallFlavorText_Triathlete_Benjamin_Strategy[] = _("Push and push again!");
+const u8 gMatchCallFlavorText_Triathlete_Benjamin_Pokemon[] = _("The strength of STEEL.");
+const u8 gMatchCallFlavorText_Triathlete_Benjamin_Intro1[] = _("If you're sweating, get");
+const u8 gMatchCallFlavorText_Triathlete_Benjamin_Intro2[] = _("fluids into you regularly.");
+
+const u8 gMatchCallFlavorText_Triathlete_Pablo_Strategy[] = _("Draw the power of WATER.");
+const u8 gMatchCallFlavorText_Triathlete_Pablo_Pokemon[] = _("Toughened WATER POKéMON.");
+const u8 gMatchCallFlavorText_Triathlete_Pablo_Intro1[] = _("Training POKéMON is good,");
+const u8 gMatchCallFlavorText_Triathlete_Pablo_Intro2[] = _("but don't neglect yourself.");
+
+const u8 gMatchCallFlavorText_DragonTamer_Nicolas_Strategy[] = _("It's about POKéMON power!");
+const u8 gMatchCallFlavorText_DragonTamer_Nicolas_Pokemon[] = _("See the power of DRAGONS!");
+const u8 gMatchCallFlavorText_DragonTamer_Nicolas_Intro1[] = _("I'll become legendary as the");
+const u8 gMatchCallFlavorText_DragonTamer_Nicolas_Intro2[] = _("strongest one day!");
+
+const u8 gMatchCallFlavorText_BirdKeeper_Robert_Strategy[] = _("I'll show you my technique!");
+const u8 gMatchCallFlavorText_BirdKeeper_Robert_Pokemon[] = _("Elegantly wheeling BIRDS.");
+const u8 gMatchCallFlavorText_BirdKeeper_Robert_Intro1[] = _("My BIRD POKéMON, deliver my");
+const u8 gMatchCallFlavorText_BirdKeeper_Robert_Intro2[] = _("love to that girl!");
+
+const u8 gMatchCallFlavorText_NinjaBoy_Lao_Strategy[] = _("You'll suffer from poison!");
+const u8 gMatchCallFlavorText_NinjaBoy_Lao_Pokemon[] = _("Poisonous POKéMON.");
+const u8 gMatchCallFlavorText_NinjaBoy_Lao_Intro1[] = _("I undertake training so");
+const u8 gMatchCallFlavorText_NinjaBoy_Lao_Intro2[] = _("that I may become a ninja.");
+
+const u8 gMatchCallFlavorText_BattleGirl_Cyndy_Strategy[] = _("The first strike wins!");
+const u8 gMatchCallFlavorText_BattleGirl_Cyndy_Pokemon[] = _("Speedy FIGHTING type.");
+const u8 gMatchCallFlavorText_BattleGirl_Cyndy_Intro1[] = _("If my POKéMON lose,");
+const u8 gMatchCallFlavorText_BattleGirl_Cyndy_Intro2[] = _("I'll carry on the fight!");
+
+const u8 gMatchCallFlavorText_ParasolLady_Madeline_Strategy[] = _("Go, go, my POKéMON!");
+const u8 gMatchCallFlavorText_ParasolLady_Madeline_Pokemon[] = _("I'll raise anything.");
+const u8 gMatchCallFlavorText_ParasolLady_Madeline_Intro1[] = _("UV rays are your skin's");
+const u8 gMatchCallFlavorText_ParasolLady_Madeline_Intro2[] = _("enemy. Get protected.");
+
+const u8 gMatchCallFlavorText_Swimmer_Jenny_Strategy[] = _("No mercy!");
+const u8 gMatchCallFlavorText_Swimmer_Jenny_Pokemon[] = _("Cute WATER POKéMON.");
+const u8 gMatchCallFlavorText_Swimmer_Jenny_Intro1[] = _("I have too many fans.");
+const u8 gMatchCallFlavorText_Swimmer_Jenny_Intro2[] = _("I was interviewed on TV.");
+
+const u8 gMatchCallFlavorText_Picnicker_Diana_Strategy[] = _("I think about this & that.");
+const u8 gMatchCallFlavorText_Picnicker_Diana_Pokemon[] = _("I like all POKéMON.");
+const u8 gMatchCallFlavorText_Picnicker_Diana_Intro1[] = _("What lies beyond that");
+const u8 gMatchCallFlavorText_Picnicker_Diana_Intro2[] = _("yonder hill?");
+
+const u8 gMatchCallFlavorText_Twins_AmyAndLiv_Strategy[] = _("We battle together!");
+const u8 gMatchCallFlavorText_Twins_AmyAndLiv_Pokemon[] = _("We train together!");
+const u8 gMatchCallFlavorText_Twins_AmyAndLiv_Intro1[] = _("We like the same POKéMON,");
+const u8 gMatchCallFlavorText_Twins_AmyAndLiv_Intro2[] = _("but different desserts.");
+
+const u8 gMatchCallFlavorText_Sailor_Ernest_Strategy[] = _("I force things with power!");
+const u8 gMatchCallFlavorText_Sailor_Ernest_Pokemon[] = _("WATER and FIGHTING types.");
+const u8 gMatchCallFlavorText_Sailor_Ernest_Intro1[] = _("Seamen are rough spirits!");
+const u8 gMatchCallFlavorText_Sailor_Ernest_Intro2[] = _("Any complaints?");
+
+const u8 gMatchCallFlavorText_Sailor_Cory_Strategy[] = _("Up for a fight anytime!");
+const u8 gMatchCallFlavorText_Sailor_Cory_Pokemon[] = _("WATER POKéMON are my faves!");
+const u8 gMatchCallFlavorText_Sailor_Cory_Intro1[] = _("If you want to shout loud,");
+const u8 gMatchCallFlavorText_Sailor_Cory_Intro2[] = _("suck in air with your belly!");
+
+const u8 gMatchCallFlavorText_Collector_Edwin_Strategy[] = _("Protect POKéMON from harm.");
+const u8 gMatchCallFlavorText_Collector_Edwin_Pokemon[] = _("I love rare POKéMON.");
+const u8 gMatchCallFlavorText_Collector_Edwin_Intro1[] = _("I want to collect all the");
+const u8 gMatchCallFlavorText_Collector_Edwin_Intro2[] = _("world's rare POKéMON.");
+
+const u8 gMatchCallFlavorText_PkmnBreeder_Lydia_Strategy[] = _("I count on power.");
+const u8 gMatchCallFlavorText_PkmnBreeder_Lydia_Pokemon[] = _("POKéMON are my children.");
+const u8 gMatchCallFlavorText_PkmnBreeder_Lydia_Intro1[] = _("It takes knowledge and");
+const u8 gMatchCallFlavorText_PkmnBreeder_Lydia_Intro2[] = _("love to raise POKéMON.");
+
+const u8 gMatchCallFlavorText_PkmnBreeder_Isaac_Strategy[] = _("Full-on attack!");
+const u8 gMatchCallFlavorText_PkmnBreeder_Isaac_Pokemon[] = _("Anything. I'll raise it.");
+const u8 gMatchCallFlavorText_PkmnBreeder_Isaac_Intro1[] = _("I give them {POKEBLOCK}S for");
+const u8 gMatchCallFlavorText_PkmnBreeder_Isaac_Intro2[] = _("going after CONTEST titles.");
+
+const u8 gMatchCallFlavorText_PkmnBreeder_Gabrielle_Strategy[] = _("I raise POKéMON with care.");
+const u8 gMatchCallFlavorText_PkmnBreeder_Gabrielle_Pokemon[] = _("Fun-to-raise POKéMON.");
+const u8 gMatchCallFlavorText_PkmnBreeder_Gabrielle_Intro1[] = _("Treat every POKéMON you");
+const u8 gMatchCallFlavorText_PkmnBreeder_Gabrielle_Intro2[] = _("meet with respect.");
+
+const u8 gMatchCallFlavorText_PkmnRanger_Catherine_Strategy[] = _("I believe in my POKéMON.");
+const u8 gMatchCallFlavorText_PkmnRanger_Catherine_Pokemon[] = _("I like strong POKéMON.");
+const u8 gMatchCallFlavorText_PkmnRanger_Catherine_Intro1[] = _("I'm training for rescue");
+const u8 gMatchCallFlavorText_PkmnRanger_Catherine_Intro2[] = _("work with my POKéMON.");
+
+const u8 gMatchCallFlavorText_PkmnRanger_Jackson_Strategy[] = _("Attack in waves!");
+const u8 gMatchCallFlavorText_PkmnRanger_Jackson_Pokemon[] = _("I use different types.");
+const u8 gMatchCallFlavorText_PkmnRanger_Jackson_Intro1[] = _("Those who destroy nature");
+const u8 gMatchCallFlavorText_PkmnRanger_Jackson_Intro2[] = _("must never be forgiven!");
+
+const u8 gMatchCallFlavorText_Lass_Haley_Strategy[] = _("I'll show you some guts!");
+const u8 gMatchCallFlavorText_Lass_Haley_Pokemon[] = _("Cute POKéMON are my faves!");
+const u8 gMatchCallFlavorText_Lass_Haley_Intro1[] = _("After a battle, I always");
+const u8 gMatchCallFlavorText_Lass_Haley_Intro2[] = _("bathe with my POKéMON.");
+
+const u8 gMatchCallFlavorText_BugCatcher_James_Strategy[] = _("Lightning-fast attack!");
+const u8 gMatchCallFlavorText_BugCatcher_James_Pokemon[] = _("BUG POKéMON are number 1!");
+const u8 gMatchCallFlavorText_BugCatcher_James_Intro1[] = _("If you want to catch BUG");
+const u8 gMatchCallFlavorText_BugCatcher_James_Intro2[] = _("POKéMON, wake up early.");
+
+const u8 gMatchCallFlavorText_Hiker_Trent_Strategy[] = _("I battle with power.");
+const u8 gMatchCallFlavorText_Hiker_Trent_Pokemon[] = _("Hard-bodied POKéMON.");
+const u8 gMatchCallFlavorText_Hiker_Trent_Intro1[] = _("I've been planning a month");
+const u8 gMatchCallFlavorText_Hiker_Trent_Intro2[] = _("for today's hike.");
+
+const u8 gMatchCallFlavorText_Hiker_Sawyer_Strategy[] = _("I like it hot!");
+const u8 gMatchCallFlavorText_Hiker_Sawyer_Pokemon[] = _("Hot POKéMON!");
+const u8 gMatchCallFlavorText_Hiker_Sawyer_Intro1[] = _("As much as I love POKéMON,");
+const u8 gMatchCallFlavorText_Hiker_Sawyer_Intro2[] = _("I surely like hiking!");
+
+const u8 gMatchCallFlavorText_YoungCouple_LoisAndHal_Strategy[] = _("Lovey-dovey strategy!");
+const u8 gMatchCallFlavorText_YoungCouple_LoisAndHal_Pokemon[] = _("Lovey-dovey POKéMON!");
+const u8 gMatchCallFlavorText_YoungCouple_LoisAndHal_Intro1[] = _("We're lovey-dovey!");
+const u8 gMatchCallFlavorText_YoungCouple_LoisAndHal_Intro2[] = _("Forever lovey-dovey!");
+
+const u8 gMatchCallFlavorText_PkmnTrainer_Wally_Strategy[] = _("We let it all hang out.");
+const u8 gMatchCallFlavorText_PkmnTrainer_Wally_Pokemon[] = _("The 1st POKéMON I caught.");
+const u8 gMatchCallFlavorText_PkmnTrainer_Wally_Intro1[] = _("POKéMON and I have grown");
+const u8 gMatchCallFlavorText_PkmnTrainer_Wally_Intro2[] = _("stronger together.");
+
+const u8 gMatchCallFlavorText_RockinWhiz_Roxanne_Strategy[] = _("ROCK-type power attack.");
+const u8 gMatchCallFlavorText_RockinWhiz_Roxanne_Pokemon[] = _("I prefer rock-hard POKéMON.");
+const u8 gMatchCallFlavorText_RockinWhiz_Roxanne_Intro1[] = _("A LEADER of a big GYM bears");
+const u8 gMatchCallFlavorText_RockinWhiz_Roxanne_Intro2[] = _("a lot of responsibility.");
+
+const u8 gMatchCallFlavorText_TheBigHit_Brawly_Strategy[] = _("Direct physical action!");
+const u8 gMatchCallFlavorText_TheBigHit_Brawly_Pokemon[] = _("FIGHTING POKéMON rule!");
+const u8 gMatchCallFlavorText_TheBigHit_Brawly_Intro1[] = _("The world awaits me as the");
+const u8 gMatchCallFlavorText_TheBigHit_Brawly_Intro2[] = _("next big wave!");
+
+const u8 gMatchCallFlavorText_SwellShock_Wattson_Strategy[] = _("I choose to electrify.");
+const u8 gMatchCallFlavorText_SwellShock_Wattson_Pokemon[] = _("Get shocked by electricity!");
+const u8 gMatchCallFlavorText_SwellShock_Wattson_Intro1[] = _("One must never throw a");
+const u8 gMatchCallFlavorText_SwellShock_Wattson_Intro2[] = _("match. Even I must not.");
+
+const u8 gMatchCallFlavorText_PassionBurn_Flannery_Strategy[] = _("Battle aggressively.");
+const u8 gMatchCallFlavorText_PassionBurn_Flannery_Pokemon[] = _("Burn with passion!");
+const u8 gMatchCallFlavorText_PassionBurn_Flannery_Intro1[] = _("Completely wash away daily");
+const u8 gMatchCallFlavorText_PassionBurn_Flannery_Intro2[] = _("fatigue in hot springs!");
+
+const u8 gMatchCallFlavorText_ReliableOne_Dad_Strategy[] = _("I flexibly adapt my style.");
+const u8 gMatchCallFlavorText_ReliableOne_Dad_Pokemon[] = _("Grown in a balanced manner.");
+const u8 gMatchCallFlavorText_ReliableOne_Dad_Intro1[] = _("I walk the 30 minutes from");
+const u8 gMatchCallFlavorText_ReliableOne_Dad_Intro2[] = _("home to here every day.");
+
+const u8 gMatchCallFlavorText_SkyTamer_Winona_Strategy[] = _("I take advantage of speed.");
+const u8 gMatchCallFlavorText_SkyTamer_Winona_Pokemon[] = _("Graceful sky dancers.");
+const u8 gMatchCallFlavorText_SkyTamer_Winona_Intro1[] = _("The ultimate would be to");
+const u8 gMatchCallFlavorText_SkyTamer_Winona_Intro2[] = _("live as one with nature.");
+
+const u8 gMatchCallFlavorText_MysticDuo_TateAndLiza_Strategy[] = _("We battle in cooperation.");
+const u8 gMatchCallFlavorText_MysticDuo_TateAndLiza_Pokemon[] = _("Always friendly POKéMON.");
+const u8 gMatchCallFlavorText_MysticDuo_TateAndLiza_Intro1[] = _("Papa has trouble telling");
+const u8 gMatchCallFlavorText_MysticDuo_TateAndLiza_Intro2[] = _("the two of us apart!");
+
+const u8 gMatchCallFlavorText_DandyCharm_Juan_Strategy[] = _("I use splendid waterpower.");
+const u8 gMatchCallFlavorText_DandyCharm_Juan_Pokemon[] = _("POKéMON of elegance!");
+const u8 gMatchCallFlavorText_DandyCharm_Juan_Intro1[] = _("The adulation of beautiful");
+const u8 gMatchCallFlavorText_DandyCharm_Juan_Intro2[] = _("ladies fills me with energy!");
+
+const u8 gMatchCallFlavorText_EliteFour_Sidney_Strategy[] = _("Offense over defense!");
+const u8 gMatchCallFlavorText_EliteFour_Sidney_Pokemon[] = _("The DARK side's beauties.");
+const u8 gMatchCallFlavorText_EliteFour_Sidney_Intro1[] = _("They said I was a punk, but");
+const u8 gMatchCallFlavorText_EliteFour_Sidney_Intro2[] = _("I'm one of the ELITE FOUR!");
+
+const u8 gMatchCallFlavorText_EliteFour_Phoebe_Strategy[] = _("Confuse and confound.");
+const u8 gMatchCallFlavorText_EliteFour_Phoebe_Pokemon[] = _("There's nothing definite.");
+const u8 gMatchCallFlavorText_EliteFour_Phoebe_Intro1[] = _("I wonder how my grandma at");
+const u8 gMatchCallFlavorText_EliteFour_Phoebe_Intro2[] = _("MT. PYRE is doing?");
+
+const u8 gMatchCallFlavorText_EliteFour_Glacia_Strategy[] = _("I use items for help.");
+const u8 gMatchCallFlavorText_EliteFour_Glacia_Pokemon[] = _("Flaming passion in icy cold!");
+const u8 gMatchCallFlavorText_EliteFour_Glacia_Intro1[] = _("The ICE type can be better");
+const u8 gMatchCallFlavorText_EliteFour_Glacia_Intro2[] = _("trained in this hot land.");
+
+const u8 gMatchCallFlavorText_EliteFour_Drake_Strategy[] = _("Harness strong abilities.");
+const u8 gMatchCallFlavorText_EliteFour_Drake_Pokemon[] = _("The raw power of DRAGONS!");
+const u8 gMatchCallFlavorText_EliteFour_Drake_Intro1[] = _("I dedicate myself to the");
+const u8 gMatchCallFlavorText_EliteFour_Drake_Intro2[] = _("POKéMON that saved me.");
+
+const u8 gMatchCallFlavorText_Champion_Wallace_Strategy[] = _("Dignity and respect.");
+const u8 gMatchCallFlavorText_Champion_Wallace_Pokemon[] = _("I prefer POKéMON of grace.");
+const u8 gMatchCallFlavorText_Champion_Wallace_Intro1[] = _("I represent beauty as");
+const u8 gMatchCallFlavorText_Champion_Wallace_Intro2[] = _("well as intelligence.");
+
+const u8 *const gMatchCallMessages[][4] =
+{
+ [REMATCH_ROSE] = MCFLAVOR(AromaLady_Rose),
+ [REMATCH_ANDRES] = MCFLAVOR(RuinManiac_Andres),
+ [REMATCH_DUSTY] = MCFLAVOR(RuinManiac_Dusty),
+ [REMATCH_LOLA] = MCFLAVOR(Tuber_Lola),
+ [REMATCH_RICKY] = MCFLAVOR(Tuber_Ricky),
+ [REMATCH_LILA_AND_ROY] = MCFLAVOR(SisAndBro_LilaAndRoy),
+ [REMATCH_CRISTIN] = MCFLAVOR(Cooltrainer_Cristin),
+ [REMATCH_BROOKE] = MCFLAVOR(Cooltrainer_Brooke),
+ [REMATCH_WILTON] = MCFLAVOR(Cooltrainer_Wilton),
+ [REMATCH_VALERIE] = MCFLAVOR(HexManiac_Valerie),
+ [REMATCH_CINDY] = MCFLAVOR(Lady_Cindy),
+ [REMATCH_THALIA] = MCFLAVOR(Beauty_Thalia),
+ [REMATCH_JESSICA] = MCFLAVOR(Beauty_Jessica),
+ [REMATCH_WINSTON] = MCFLAVOR(RichBoy_Winston),
+ [REMATCH_STEVE] = MCFLAVOR(PokeManiac_Steve),
+ [REMATCH_TONY] = MCFLAVOR(Swimmer_Tony),
+ [REMATCH_NOB] = MCFLAVOR(BlackBelt_Nob),
+ [REMATCH_KOJI] = MCFLAVOR(BlackBelt_Koji),
+ [REMATCH_FERNANDO] = MCFLAVOR(Guitarist_Fernando),
+ [REMATCH_DALTON] = MCFLAVOR(Guitarist_Dalton),
+ [REMATCH_BERNIE] = MCFLAVOR(Kindler_Bernie),
+ [REMATCH_ETHAN] = MCFLAVOR(Camper_Ethan),
+ [REMATCH_JOHN_AND_JAY] = MCFLAVOR(OldCouple_JohnAndJay),
+ [REMATCH_JEFFREY] = MCFLAVOR(BugManiac_Jeffrey),
+ [REMATCH_CAMERON] = MCFLAVOR(Psychic_Cameron),
+ [REMATCH_JACKI] = MCFLAVOR(Psychic_Jacki),
+ [REMATCH_WALTER] = MCFLAVOR(Gentleman_Walter),
+ [REMATCH_KAREN] = MCFLAVOR(SchoolKid_Karen),
+ [REMATCH_JERRY] = MCFLAVOR(SchoolKid_Jerry),
+ [REMATCH_ANNA_AND_MEG] = MCFLAVOR(SrAndJr_AnnaAndMeg),
+ [REMATCH_ISABEL] = MCFLAVOR(Pokefan_Isabel),
+ [REMATCH_MIGUEL] = MCFLAVOR(Pokefan_Miguel),
+ [REMATCH_TIMOTHY] = MCFLAVOR(Expert_Timothy),
+ [REMATCH_SHELBY] = MCFLAVOR(Expert_Shelby),
+ [REMATCH_CALVIN] = MCFLAVOR(Youngster_Calvin),
+ [REMATCH_ELLIOT] = MCFLAVOR(Fisherman_Elliot),
+ [REMATCH_ISAIAH] = MCFLAVOR(Triathlete_Isaiah),
+ [REMATCH_MARIA] = MCFLAVOR(Triathlete_Maria),
+ [REMATCH_ABIGAIL] = MCFLAVOR(Triathlete_Abigail),
+ [REMATCH_DYLAN] = MCFLAVOR(Triathlete_Dylan),
+ [REMATCH_KATELYN] = MCFLAVOR(Triathlete_Katelyn),
+ [REMATCH_BENJAMIN] = MCFLAVOR(Triathlete_Benjamin),
+ [REMATCH_PABLO] = MCFLAVOR(Triathlete_Pablo),
+ [REMATCH_NICOLAS] = MCFLAVOR(DragonTamer_Nicolas),
+ [REMATCH_ROBERT] = MCFLAVOR(BirdKeeper_Robert),
+ [REMATCH_LAO] = MCFLAVOR(NinjaBoy_Lao),
+ [REMATCH_CYNDY] = MCFLAVOR(BattleGirl_Cyndy),
+ [REMATCH_MADELINE] = MCFLAVOR(ParasolLady_Madeline),
+ [REMATCH_JENNY] = MCFLAVOR(Swimmer_Jenny),
+ [REMATCH_DIANA] = MCFLAVOR(Picnicker_Diana),
+ [REMATCH_AMY_AND_LIV] = MCFLAVOR(Twins_AmyAndLiv),
+ [REMATCH_ERNEST] = MCFLAVOR(Sailor_Ernest),
+ [REMATCH_CORY] = MCFLAVOR(Sailor_Cory),
+ [REMATCH_EDWIN] = MCFLAVOR(Collector_Edwin),
+ [REMATCH_LYDIA] = MCFLAVOR(PkmnBreeder_Lydia),
+ [REMATCH_ISAAC] = MCFLAVOR(PkmnBreeder_Isaac),
+ [REMATCH_GABRIELLE] = MCFLAVOR(PkmnBreeder_Gabrielle),
+ [REMATCH_CATHERINE] = MCFLAVOR(PkmnRanger_Catherine),
+ [REMATCH_JACKSON] = MCFLAVOR(PkmnRanger_Jackson),
+ [REMATCH_HALEY] = MCFLAVOR(Lass_Haley),
+ [REMATCH_JAMES] = MCFLAVOR(BugCatcher_James),
+ [REMATCH_TRENT] = MCFLAVOR(Hiker_Trent),
+ [REMATCH_SAWYER] = MCFLAVOR(Hiker_Sawyer),
+ [REMATCH_KIRA_AND_DAN] = MCFLAVOR(YoungCouple_LoisAndHal),
+ [REMATCH_WALLY_3] = MCFLAVOR(PkmnTrainer_Wally),
+ [REMATCH_ROXANNE] = MCFLAVOR(RockinWhiz_Roxanne),
+ [REMATCH_BRAWLY] = MCFLAVOR(TheBigHit_Brawly),
+ [REMATCH_WATTSON] = MCFLAVOR(SwellShock_Wattson),
+ [REMATCH_FLANNERY] = MCFLAVOR(PassionBurn_Flannery),
+ [REMATCH_NORMAN] = MCFLAVOR(ReliableOne_Dad),
+ [REMATCH_WINONA] = MCFLAVOR(SkyTamer_Winona),
+ [REMATCH_TATE_AND_LIZA] = MCFLAVOR(MysticDuo_TateAndLiza),
+ [REMATCH_JUAN] = MCFLAVOR(DandyCharm_Juan),
+ [REMATCH_SIDNEY] = MCFLAVOR(EliteFour_Sidney),
+ [REMATCH_PHOEBE] = MCFLAVOR(EliteFour_Phoebe),
+ [REMATCH_GLACIA] = MCFLAVOR(EliteFour_Glacia),
+ [REMATCH_DRAKE] = MCFLAVOR(EliteFour_Drake),
+ [REMATCH_WALLACE] = MCFLAVOR(Champion_Wallace),
+};
diff --git a/src/data/text/ribbon_descriptions.h b/src/data/text/ribbon_descriptions.h
new file mode 100644
index 000000000..f455a7771
--- /dev/null
+++ b/src/data/text/ribbon_descriptions.h
@@ -0,0 +1,48 @@
+const u8 gRibbonDescriptionPart1_Champion[] = _("CHAMPION-beating, HALL");
+const u8 gRibbonDescriptionPart2_Champion[] = _("OF FAME Member RIBBON");
+const u8 gRibbonDescriptionPart1_CoolContest[] = _("COOL CONTEST");
+const u8 gRibbonDescriptionPart1_BeautyContest[] = _("BEAUTY CONTEST");
+const u8 gRibbonDescriptionPart1_CuteContest[] = _("CUTE CONTEST");
+const u8 gRibbonDescriptionPart1_SmartContest[] = _("SMART CONTEST");
+const u8 gRibbonDescriptionPart1_ToughContest[] = _("TOUGH CONTEST");
+const u8 gRibbonDescriptionPart2_NormalRank[] = _("Normal Rank winner!");
+const u8 gRibbonDescriptionPart2_SuperRank[] = _("Super Rank winner!");
+const u8 gRibbonDescriptionPart2_HyperRank[] = _("Hyper Rank winner!");
+const u8 gRibbonDescriptionPart2_MasterRank[] = _("Master Rank winner!");
+const u8 gRibbonDescriptionPart1_Winning[] = _("For clearing LV50");
+const u8 gRibbonDescriptionPart2_Winning[] = _("at the BATTLE TOWER.");
+const u8 gRibbonDescriptionPart1_Victory[] = _("For clearing Open Level");
+const u8 gRibbonDescriptionPart2_Victory[] = _("at the BATTLE TOWER.");
+const u8 gRibbonDescriptionPart1_Artist[] = _("RIBBON for being chosen");
+const u8 gRibbonDescriptionPart2_Artist[] = _("as a super sketch model.");
+const u8 gRibbonDescriptionPart1_Effort[] = _("RIBBON awarded for");
+const u8 gRibbonDescriptionPart2_Effort[] = _("being a hard worker.");
+
+const u8 *const gRibbonDescriptionPointers[][2] =
+{
+ {gRibbonDescriptionPart1_Champion, gRibbonDescriptionPart2_Champion},
+ {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_NormalRank},
+ {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_SuperRank},
+ {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_HyperRank},
+ {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_MasterRank},
+ {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_NormalRank},
+ {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_SuperRank},
+ {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_HyperRank},
+ {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_MasterRank},
+ {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_NormalRank},
+ {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_SuperRank},
+ {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_HyperRank},
+ {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_MasterRank},
+ {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_NormalRank},
+ {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_SuperRank},
+ {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_HyperRank},
+ {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_MasterRank},
+ {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_NormalRank},
+ {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_SuperRank},
+ {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_HyperRank},
+ {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_MasterRank},
+ {gRibbonDescriptionPart1_Winning, gRibbonDescriptionPart2_Winning},
+ {gRibbonDescriptionPart1_Victory, gRibbonDescriptionPart2_Victory},
+ {gRibbonDescriptionPart1_Artist, gRibbonDescriptionPart2_Artist},
+ {gRibbonDescriptionPart1_Effort, gRibbonDescriptionPart2_Effort},
+};
diff --git a/src/daycare.c b/src/daycare.c
index 885ac31a1..2d05035d7 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -835,7 +835,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation)
u8 metLocation;
u8 isEgg;
- CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, FALSE, 0);
+ CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0);
metLevel = 0;
ball = ITEM_POKE_BALL;
language = LANGUAGE_JAPANESE;
@@ -862,7 +862,7 @@ static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *
u8 language;
personality = daycare->offspringPersonality;
- CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, FALSE, 0);
+ CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, OT_ID_PLAYER_ID, 0);
metLevel = 0;
ball = ITEM_POKE_BALL;
language = LANGUAGE_JAPANESE;
diff --git a/src/diploma.c b/src/diploma.c
index 92c7df703..8e0901fa8 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -127,7 +127,7 @@ static void Task_DiplomaFadeOut(u8 taskId)
static void DisplayDiplomaText(void)
{
- if (sub_80C0944())
+ if (HasAllMons())
{
SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_BG0_ON);
StringCopy(gStringVar1, gText_DexNational);
diff --git a/src/dma3_manager.c b/src/dma3_manager.c
index 51fa7072d..43744883f 100644
--- a/src/dma3_manager.c
+++ b/src/dma3_manager.c
@@ -8,7 +8,7 @@
#define DMA_REQUEST_COPY16 3
#define DMA_REQUEST_FILL16 4
-IWRAM_DATA struct
+BSS_DATA struct
{
const u8 *src;
u8 *dest;
@@ -17,7 +17,7 @@ IWRAM_DATA struct
u32 value;
} gDma3Requests[MAX_DMA_REQUESTS];
-static bool8 gDma3ManagerLocked;
+static volatile bool8 gDma3ManagerLocked;
static u8 gDma3RequestCursor;
void ClearDma3Requests(void)
diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c
index 966dccfcf..714b10ef6 100644
--- a/src/dodrio_berry_picking.c
+++ b/src/dodrio_berry_picking.c
@@ -1,249 +1,456 @@
#include "global.h"
#include "alloc.h"
-#include "palette.h"
-#include "window.h"
#include "bg.h"
+#include "dodrio_berry_picking.h"
+#include "dynamic_placeholder_text_util.h"
+#include "event_data.h"
#include "gpu_regs.h"
-#include "random.h"
+#include "international_string_util.h"
+#include "item.h"
#include "link.h"
#include "link_rfu.h"
-#include "task.h"
-#include "main.h"
-#include "constants/songs.h"
-#include "sound.h"
#include "m4a.h"
+#include "main.h"
+#include "palette.h"
#include "pokemon_jump.h"
+#include "random.h"
+#include "save.h"
+#include "script.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text_window.h"
+#include "window.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "constants/species.h"
-struct DodrioBerryPickingSubstruct_0160
+struct DodrioSubstruct_0160
{
- /*0x0000 : 0x0160*/ u8 filler_000[12];
- /*0x000C : 0x016C*/ u8 unk_00C;
- /*0x000D : 0x016D*/ u8 filler_00D[0x3000 - 0xd];
- /*0x3000 : 0x3160*/ u32 unk_3000;
- /*0x3004 : 0x3164*/ u8 filler_3004[16];
- /*0x3014 : 0x3174*/ u8 unk_3014;
- /*0x3015 : 0x3175*/ u8 filler_3015[0x318C - 0x3175];
+ /*0x0000 : 0x3000*/ u16 ALIGNED(4) tilemapBuffers[3][BG_SCREEN_SIZE];
+ /*0x3000 : 0x3160*/ bool32 finished;
+ /*0x3004 : 0x3164*/ u8 ALIGNED(4) unk3004;
+ /*0x3008 : 0x3168*/ u8 ALIGNED(4) unk3008[10];
+ /*0x3014 : 0x3174*/ u8 ALIGNED(4) state;
+ /*0x3018 : 0x3178*/ u8 ALIGNED(4) unk3018;
+ /*0x301C : 0x317C*/ u16 ALIGNED(4) unk301C;
+ /*0x3020 : 0x3180*/ u8 ALIGNED(4) unk3020;
+ /*0x3024 : 0x3184*/ u8 ALIGNED(4) unk3024;
+ /*0x3024 : 0x3184*/ void (*unk3028)(void);
}; // size = 0x302C
-struct DodrioBerryPickingStruct_2022CF4
+struct DodrioStruct_2022CF4
{
- u8 filler_00[0x40];
+ u8 filler_00[0xc];
+ u8 unkC[10];
+ s16 unk16[10];
+ u16 unk2A[10];
+ u16 unk3E;
}; // size = 0x40
-struct DodrioBerryPickingSubstruct_31A0_14
+struct DodrioSubstruct_31A0_14
{
- u8 unk_0[11];
- u8 unk_B[11];
+ u8 unk0[11];
+ u8 unkB[11];
};
-struct DodrioBerryPickingSubstruct_31A0
-{
- u8 unk_00[0x10];
- u32 unk_10;
- struct DodrioBerryPickingSubstruct_31A0_14 unk_14;
- u8 unk_2C;
- u8 filler_2D[3];
- u8 unk_30;
- u8 filler_31[3];
- u8 unk_34;
- u8 filler_35[7];
+struct DodrioSubstruct_31A0_2C
+{
+ u8 unk0;
+ u8 ALIGNED(4) unk4;
+ u8 ALIGNED(4) unk8;
+};
+
+struct DodrioSubstruct_31A0
+{
+ u8 name[0x10];
+ u32 unk10;
+ struct DodrioSubstruct_31A0_14 unk14;
+ struct DodrioSubstruct_31A0_2C unk2C;
+ u8 filler_35[4];
}; // size = 0x3C
-struct DodrioBerryPickingSubstruct_318C
+struct DodrioSubstruct_318C
{
bool8 isShiny;
};
-struct DodrioBerryPickingStruct
+struct DodrioSubstruct_3308
+{
+ u8 unk0;
+ u32 unk4;
+};
+
+struct DodrioStruct
{
/*0x0000*/ void (*savedCallback)(void);
- /*0x0004*/ u8 unk_0004;
- /*0x0005*/ u8 filler_0005[3];
- /*0x0008*/ u8 unk_0008;
- /*0x0009*/ u8 filler_0009[3];
- /*0x000C*/ u8 unk_000C;
- /*0x000D*/ u8 filler_000D[3];
- /*0x0010*/ u8 unk_0010;
- /*0x0011*/ u8 filler_0011[3];
- /*0x0014*/ u8 unk_0014;
- /*0x0015*/ u8 filler_0015[3];
- /*0x0018*/ u8 unk_0018;
- /*0x0019*/ u8 filler_0019[3];
- /*0x001C*/ u8 unk_001C;
- /*0x001D*/ u8 filler_001D[3];
- /*0x0020*/ u8 unk_0020;
- /*0x0021*/ u8 filler_0021[3];
- /*0x0024*/ u8 unk_0024;
- /*0x0025*/ u8 filler_0025[3];
- /*0x0028*/ u8 multiplayerId;
+ /*0x0004*/ u8 ALIGNED(4) unk04;
+ /*0x0008*/ u8 ALIGNED(4) unk08;
+ /*0x000C*/ u8 ALIGNED(4) unk0C;
+ /*0x0010*/ u8 ALIGNED(4) unk10;
+ /*0x0014*/ u8 ALIGNED(4) unk14;
+ /*0x0018*/ u8 ALIGNED(4) unk18;
+ /*0x001C*/ u8 ALIGNED(4) unk1C;
+ /*0x0020*/ u8 ALIGNED(4) unk20;
+ /*0x0024*/ u8 ALIGNED(4) unk24;
+ /*0x0028*/ u8 ALIGNED(4) multiplayerId;
/*0x0029*/ u8 filler_0029[7];
- /*0x0030*/ u8 unk_0030;
- /*0x0031*/ u8 filler_0031[3];
- /*0x0034*/ u8 unk_0034[5];
- /*0x0039*/ u8 filler_0039[3];
- /*0x003C*/ u8 unk_003C;
- /*0x003D*/ u8 filler_003D[3];
- /*0x0040*/ u8 unk_0040;
- /*0x0041*/ u8 filler_0041[3];
- /*0x0044*/ u8 unk_0044;
- /*0x0045*/ u8 filler_0045[3];
- /*0x0048*/ u8 unk_0048;
- // align 1
- /*0x004A*/ u16 unk_004A[5][6];
- /*0x0086*/ u16 unk_0086[5];
- /*0x0090*/ u8 unk_0090[5];
- /*0x0095*/ u8 filler_0095[3];
- /*0x0098*/ u8 unk_0098[4];
- /*0x009C*/ u8 unk_009C[12];
- /*0x00A8*/ u8 unk_00A8[5];
- /*0x00AD*/ u8 filler_00AD[3];
- /*0x00B0*/ u8 unk_00B0[5];
- /*0x00B5*/ u8 filler_00B5[3];
- /*0x00B8*/ u8 unk_00B8[5];
- /*0x00BD*/ u8 filler_00BD[7];
- /*0x00C4*/ u8 unk_00C4[11];
- /*0x00CF*/ u8 filler_00CF[1];
- /*0x00D0*/ u8 unk_00D0[11];
- /*0x00DB*/ u8 filler_00DB[1];
- /*0x00DC*/ u8 unk_00DC[11];
- /*0x00E7*/ u8 filler_0xE7[1];
- /*0x00E8*/ u8 unk_00E8[5];
- /*0x00ED*/ u8 filler_00ED[7];
- /*0x00F4*/ u8 unk_00F4[11][2];
- /*0x010A*/ u8 filler_010A[2];
- /*0x010C*/ u8 unk_010C[5];
- /*0x0111*/ u8 filler_0111[3];
- /*0x0114*/ u16 unk_0114;
- // align 2
- /*0x0118*/ u32 unk_0118;
- /*0x011C*/ u32 unk_011C;
- /*0x0120*/ u32 unk_0120;
- /*0x0124*/ u8 unk_0124;
- /*0x0125*/ u8 filler_0125[3];
- /*0x0128*/ u8 unk_0128;
- // align 2
- /*0x012C*/ u32 unk_012C;
- /*0x0130*/ u32 unk_0130[5];
- /*0x0144*/ u8 unk_0144;
- /*0x0145*/ u8 filler_0145[3];
- /*0x0148*/ u8 unk_0148[11];
- /*0x0153*/ u8 filler_0153[1];
- /*0x0154*/ u8 unk_0154;
- /*0x0155*/ u8 filler_0155[11];
- /*0x0160*/ struct DodrioBerryPickingSubstruct_0160 unk_0160;
- /*0x318C*/ struct DodrioBerryPickingSubstruct_318C unk_318C[5];
- /*0x31A0*/ struct DodrioBerryPickingSubstruct_31A0 unk_31A0[5];
- /*0x32CC*/ struct DodrioBerryPickingSubstruct_31A0 unk_32CC;
- /*0x3308*/ u8 unk_3308[0x3330 - 0x3308];
+ /*0x0030*/ u8 ALIGNED(4) unk30;
+ /*0x0034*/ u8 ALIGNED(4) unk34[5];
+ /*0x003C*/ u8 ALIGNED(4) unk3C;
+ /*0x0040*/ u8 ALIGNED(4) unk40;
+ /*0x0044*/ u8 ALIGNED(4) unk44;
+ /*0x0048*/ u8 ALIGNED(4) unk48;
+ /*0x004A*/ u16 unk4A[5][6];
+ /*0x0086*/ u16 unk86[5];
+ /*0x0090*/ u8 ALIGNED(4) unk90[5];
+ /*0x0098*/ u8 ALIGNED(4) unk98[4];
+ /*0x009C*/ u8 ALIGNED(4) unk9C[11];
+ /*0x00A8*/ u8 ALIGNED(4) unkA8[5];
+ /*0x00B0*/ u8 ALIGNED(4) unkB0[5];
+ /*0x00B8*/ u8 ALIGNED(4) unkB8[11];
+ /*0x00C4*/ u8 ALIGNED(4) unkC4[11];
+ /*0x00D0*/ u8 ALIGNED(4) unkD0[11];
+ /*0x00DC*/ u8 ALIGNED(4) unkDC[11];
+ /*0x00E8*/ u8 ALIGNED(4) unkE8[11];
+ /*0x00F4*/ u8 ALIGNED(4) unkF4[11][2];
+ /*0x010C*/ u8 ALIGNED(4) unk10C[5];
+ /*0x0112*/ u16 unk112;
+ /*0x0114*/ u16 unk114;
+ /*0x0118*/ u32 unk118;
+ /*0x011C*/ u32 unk11C;
+ /*0x0120*/ u32 unk120;
+ /*0x0124*/ u8 ALIGNED(4) unk124;
+ /*0x0128*/ u8 ALIGNED(4) unk128;
+ /*0x012C*/ u32 unk12C;
+ /*0x0130*/ u32 unk130[5];
+ /*0x0144*/ u8 ALIGNED(4) unk144;
+ /*0x0148*/ u8 ALIGNED(4) unk148[11];
+ /*0x0154*/ u8 ALIGNED(4) unk154;
+ /*0x0158*/ u8 ALIGNED(4) unk158[5];
+ /*0x0160*/ struct DodrioSubstruct_0160 unk160;
+ /*0x318C*/ struct DodrioSubstruct_318C unk318C[5];
+ /*0x31A0*/ struct DodrioSubstruct_31A0 unk31A0[5];
+ /*0x32CC*/ struct DodrioSubstruct_31A0 unk32CC;
+ /*0x3308*/ struct DodrioSubstruct_3308 unk3308[5];
}; // size = 0x3330
-EWRAM_DATA struct DodrioBerryPickingStruct * gUnknown_02022C98 = NULL;
-EWRAM_DATA u16 * gUnknown_02022C9C[5] = {NULL};
-EWRAM_DATA u16 * gUnknown_02022CB0[2] = {NULL};
-EWRAM_DATA u16 * gUnknown_02022CB8[11] = {NULL};
-EWRAM_DATA u16 * gUnknown_02022CE4[4] = {NULL};
-EWRAM_DATA struct DodrioBerryPickingStruct_2022CF4 * gUnknown_02022CF4 = NULL;
-EWRAM_DATA struct DodrioBerryPickingSubstruct_0160 * gUnknown_02022CF8 = NULL;
-
-IWRAM_DATA bool32 gUnknown_03000DB0;
-
-void sub_8024A1C(void);
-void sub_8024A30(struct DodrioBerryPickingStruct *);
-void sub_8024BC8(u8 taskId);
-void sub_8024DBC(void);
-void sub_8024E00(void);
-void sub_8024E38(void);
-void sub_8024F10(void);
-void sub_8024F38(void);
-void sub_8024FFC(void);
-void sub_80250D4(void);
-void sub_8025158(void);
-void sub_8025198(void);
-void sub_8025230(void);
-void sub_8025324(void);
-void sub_8025470(void);
-void sub_8025644(void);
-void sub_80256AC(void);
-void sub_8025758(void);
-void sub_802589C(u8 taskId);
-void sub_8025910(u8 taskId);
-void sub_8025D04(void);
-void sub_8025D50(void);
-void sub_8025E0C(void);
-void sub_8025ED8(void);
-void sub_8025F48(void);
-void sub_8026044(void);
-void sub_80261CC(void);
-void sub_80261E4(void);
-void sub_80261F8(struct DodrioBerryPickingSubstruct_318C *, struct Pokemon *);
-void sub_802620C(TaskFunc, u8);
-void sub_802621C(TaskFunc);
-void sub_8026240(u8);
-bool32 sub_8026264(void);
-void sub_80262C0(void);
-u32 sub_8026634(u8, u8, u8);
-void sub_802671C(void);
-void sub_8026AF4(void);
-void sub_8026B28(void);
-void sub_8026B5C(u8, u8*, u8*);
-u32 sub_8026BB8(void);
-void sub_8026C28(void);
-bool32 sub_8026C50(void);
-bool32 sub_8026C90(void);
-void sub_8026D1C(u8);
-u8 sub_8026D8C(u8);
-u8 sub_8026DB0(u8, u8);
-void sub_8026F1C(u8, u8, u8);
-void sub_8027234(u8);
-void sub_80272A4(void);
-void sub_80272E8(void);
-void sub_80273F0(void);
-void sub_802749C(void);
-u8 sub_8027518(u8);
-void sub_8027554(void);
-void sub_8027608(void);
-u32 sub_8027748(void);
-void sub_8027DD0(u8);
-u32 sub_8027E30(struct DodrioBerryPickingSubstruct_31A0 *, u8 *, u8 *, u8 *, u8 *, u8 *, u8, u32, u32);
-u32 sub_8028164(u32 unused, struct DodrioBerryPickingSubstruct_31A0 *, u8 *, u8 *, u8 *, u8 *, u8 *, u8 *, u32 *, u32 *);
-void sub_80282EC(u8);
-u32 sub_8028318(u8, u8 *);
-void sub_8028350(u8);
-bool32 sub_8028374(u8);
-void sub_80283A8(void);
-void sub_8028408(struct DodrioBerryPickingSubstruct_318C *, u8, u8, u8);
-void sub_80284CC(u8);
-void sub_8028504(u8);
-void sub_8028614(u8);
-void sub_802868C(u8, u8);
-void sub_8028734(void);
-void sub_80287E4(void);
-void sub_80289E8(u8);
-void sub_80286E4(void);
-bool32 sub_8028828(void);
-void sub_8028A34(void);
-void sub_8028A88(void);
-void sub_8028B80(void);
-void sub_8028D44(void);
-void sub_8028DFC(void);
-void sub_8028E4C(void);
-void sub_8028E84(void);
-void sub_8028EC8(u8);
-void sub_8028FCC(void);
-void sub_802903C(void);
-void sub_8029274(struct DodrioBerryPickingSubstruct_0160 *);
-void sub_80292E0(u8);
-bool32 sub_802A770(void);
-u8 sub_802A794(void);
-
-extern const u8 gUnknown_082F7A88[][3];
-extern const u8 gUnknown_082F449C[];
-extern const u8 gUknnown_082F45AF[];
-extern const u8 gUnknown_082F7A94[];
-extern void (*const gUnknown_082F7AC4[])(void);
-extern void (*const gUnknown_082F7AF4[])(void);
-
-void sub_802493C(u16 a0, void (*a1)(void))
+EWRAM_DATA static struct DodrioStruct * gUnknown_02022C98 = NULL;
+EWRAM_DATA static u16 *gUnknown_02022C9C[5] = {NULL};
+EWRAM_DATA static u16 *gUnknown_02022CB0[2] = {NULL};
+EWRAM_DATA static u16 *gUnknown_02022CB8[11] = {NULL};
+EWRAM_DATA static u16 *gUnknown_02022CE4[4] = {NULL};
+EWRAM_DATA static struct DodrioStruct_2022CF4 *gUnknown_02022CF4 = NULL;
+EWRAM_DATA static struct DodrioSubstruct_0160 *gUnknown_02022CF8 = NULL;
+
+static bool32 gUnknown_03000DB0;
+
+static void sub_8024A1C(void);
+static void sub_8024A30(struct DodrioStruct *);
+static void sub_8024BC8(u8 taskId);
+static void sub_8024DBC(void);
+static void sub_8024E00(void);
+static void sub_8024E38(void);
+static void sub_8024F10(void);
+static void sub_8024F38(void);
+static void sub_8024FFC(void);
+static void sub_80250D4(void);
+static void sub_8025158(void);
+static void sub_8025198(void);
+static void sub_8025230(void);
+static void sub_8025324(void);
+static void sub_8025470(void);
+static void sub_8025644(void);
+static void sub_80256AC(void);
+static void sub_8025758(void);
+static void sub_802589C(u8 taskId);
+static void sub_8025910(u8 taskId);
+static void sub_8025D04(void);
+static void sub_8025D50(void);
+static void sub_8025E0C(void);
+static void sub_8025ED8(void);
+static void sub_8025F48(void);
+static void sub_8026044(void);
+static void sub_80261CC(void);
+static void sub_80261E4(void);
+static void sub_80261F8(struct DodrioSubstruct_318C *, struct Pokemon *);
+static void sub_802620C(TaskFunc, u8);
+static void sub_802621C(TaskFunc);
+static void sub_8026240(u8);
+static bool32 sub_8026264(void);
+static void sub_80262C0(void);
+static bool32 sub_8026634(u8, u8, u8);
+static void sub_802671C(void);
+static void sub_8026AF4(void);
+static void sub_8026B28(void);
+static void sub_8026B5C(u8, u8*, u8*);
+static bool32 sub_8026BB8(void);
+static void sub_8026C28(void);
+static bool32 sub_8026C50(void);
+static bool32 sub_8026C90(void);
+static void sub_8026D1C(u8);
+static u8 sub_8026D8C(u8);
+static u8 sub_8026DB0(u8, u8);
+static void sub_8026F1C(u8, u8, u8);
+static void sub_8027234(bool32 arg0);
+static void sub_80272A4(void);
+static void sub_80272E8(void);
+static void sub_80273F0(void);
+static void sub_802749C(void);
+static u8 sub_8027518(u8);
+static void sub_8027554(void);
+static void sub_8027608(void);
+static u32 sub_8027748(void);
+static void sub_8027DD0(u32 arg0);
+static void sub_8027E30(struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 arg6, u32 arg7, u32 arg8);
+static u32 sub_8028164(u32 unused, struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 *arg6, u32 *arg7, u32 *arg8);
+static void sub_80282EC(u8);
+static u32 sub_8028318(u32 arg0, u8 *arg1);
+static void sub_8028350(u32 arg0);
+static u32 sub_8028374(u32 arg0);
+static void sub_80283A8(void);
+static void sub_8028408(struct DodrioSubstruct_318C *arg0, u8 arg1, u8 id, u8 arg3);
+static void sub_80284CC(u8);
+static void sub_8028504(u8);
+static void sub_8028614(u8 count);
+static void sub_802868C(bool8 invisible, u8 count);
+static void sub_8028734(void);
+static void sub_80287E4(void);
+static void sub_80289E8(bool8 invisible);
+static void sub_80286E4(void);
+static bool32 sub_8028828(void);
+static void sub_8028A34(void);
+static void sub_8028A88(void);
+static void sub_8028B80(void);
+static void sub_8028D44(void);
+static void sub_8028DFC(void);
+static void sub_8028E4C(void);
+static void sub_8028E84(void);
+static void sub_8028EC8(bool8 invisible);
+static void sub_8028FCC(void);
+static void sub_802903C(void);
+static void sub_8029274(struct DodrioSubstruct_0160 *PTR);
+static void sub_80292E0(u8);
+static bool32 sub_802A770(void);
+static u8 sub_802A794(void);
+static void sub_8028BF8(u8 id, bool8 invisible);
+static void sub_8028C30(bool8 invisible);
+static void sub_8028CA4(u16 id, u8 frameNum);
+static void sub_8028C7C(u8 id, u8 y);
+static void sub_80286B4(u8 id, u8 frameNum);
+static u8 sub_8026E70(u8 arg0, u8 arg1);
+static void sub_80288D4(u8 arg0);
+static u32 sub_8027DFC(u32 arg0);
+static u32 IncrementWithLimit(u32 arg0, u32 arg1);
+static u32 Min(u32 arg0, u32 arg1);
+static u32 sub_80276C0(u8 arg0);
+static void sub_8027ACC(u8 taskId);
+static void sub_8029314(u8 taskId);
+static void sub_8027BEC(u8 windowId, s32 width);
+static void nullsub_15(struct Sprite *sprite);
+static void sub_80284A8(struct Sprite *sprite);
+static u32 sub_802853C(struct Sprite *sprite);
+static u32 sub_80285AC(struct Sprite *sprite);
+static s16 sub_8028F14(u8 arg0, u8 arg1);
+static void sub_8028654(bool8 invisible, u8 id);
+static void sub_8029338(void);
+static bool32 sub_802A8E8(void);
+static void sub_802A7A8(void);
+static void sub_802A72C(void (*func)(void));
+static void (*sub_802A75C(void))(void);
+static void sub_8029338(void);
+static void sub_8029440(void);
+static void sub_802988C(void);
+static void sub_802A010(void);
+static void sub_802A380(void);
+static void sub_802A454(void);
+static void sub_802A534(void);
+static void sub_802A588(void);
+static void sub_802A6FC(void);
+static void nullsub_16(void);
+
+// const rom data
+static const u8 gUnknown_082F449C[5][5][11] =
+{
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0},
+ {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0},
+ {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0},
+ {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0},
+ {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0},
+ {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0},
+ {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0},
+ },
+ {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
+ {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2},
+ {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4},
+ {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6},
+ {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8},
+ },
+};
+
+static const u8 gUknnown_082F45AF[5][5][3] =
+{
+ {
+ {4, 5, 6},
+ },
+ {
+ {3, 4, 5},
+ {5, 6, 3},
+ },
+ {
+ {4, 5, 6},
+ {6, 7, 2},
+ {2, 3, 4},
+ },
+ {
+ {3, 4, 5},
+ {5, 6, 7},
+ {7, 8, 1},
+ {1, 2, 3},
+ },
+ {
+ {4, 5, 6},
+ {6, 7, 8},
+ {8, 9, 0},
+ {0, 1, 2},
+ {2, 3, 4},
+ },
+};
+
+static const u8 gUnknown_082F45FA[5][5][3] =
+{
+ {
+ {1, 0, 1},
+ },
+ {
+ {1, 0, 1},
+ {0, 1, 0},
+ },
+ {
+ {2, 0, 1},
+ {0, 1, 2},
+ {1, 2, 0},
+ },
+ {
+ {3, 0, 1},
+ {0, 1, 2},
+ {1, 2, 3},
+ {2, 3, 0},
+ },
+ {
+ {4, 0, 1},
+ {0, 1, 2},
+ {1, 2, 3},
+ {2, 3, 4},
+ {3, 4, 0},
+ },
+};
+
+ALIGNED(4)
+static const u8 gUnknown_082F4648[5][11] =
+{
+ {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9},
+ {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9},
+ {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9},
+ {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9},
+ {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3},
+};
+
+static const u8 gUnknown_082F467F[5][5] =
+{
+ {5},
+ {4, 6},
+ {3, 5, 7},
+ {2, 4, 6, 8},
+ {1, 3, 5, 6, 9},
+};
+
+// Duplicate and unused gfx. Feel free to remove.
+static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.gbapal",
+ "graphics/link_games/dodrioberry_bg2.gbapal",
+ "graphics/link_games/dodrioberry_pkmn.gbapal",
+ "graphics/link_games/dodrioberry_shiny.gbapal",
+ "graphics/link_games/dodrioberry_status.gbapal",
+ "graphics/link_games/dodrioberry_berrysprites.gbapal",
+ "graphics/link_games/dodrioberry_berrysprites.4bpp.lz",
+ "graphics/link_games/dodrioberry_platform.gbapal",
+ "graphics/link_games/dodrioberry_bg1.4bpp.lz",
+ "graphics/link_games/dodrioberry_bg2.4bpp.lz",
+ "graphics/link_games/dodrioberry_status.4bpp.lz",
+ "graphics/link_games/dodrioberry_platform.4bpp.lz",
+ "graphics/link_games/dodrioberry_pkmn.4bpp.lz",
+ "graphics/link_games/dodrioberry_bg1.bin.lz",
+ "graphics/link_games/dodrioberry_bg2right.bin.lz",
+ "graphics/link_games/dodrioberry_bg2left.bin.lz");
+
+
+static const u8 gUnknown_082F7A88[][3] =
+{
+ {40, 24, 13},
+ {32, 19, 10},
+ {22, 13, 7},
+};
+
+ALIGNED(4)
+static const u8 gUnknown_082F7A94[] = {8, 5, 8, 11, 15};
+
+ALIGNED(4)
+static const u8 gUnknown_082F7A9C[] = {5, 10, 20, 30, 50, 70, 100};
+
+ALIGNED(4)
+static const u8 gUnknown_082F7AA4[][10] =
+{
+ {15, 16, 17, 18, 19, 19, 18, 17, 16, 15},
+ {20, 21, 22, 23, 24, 25, 26, 27, 28, 29},
+ {30, 31, 32, 33, 34, 34, 33, 32, 31, 30},
+};
+
+static void (*const gUnknown_082F7AC4[])(void) =
+{
+ sub_8024DBC,
+ sub_8024E00,
+ sub_8024E38,
+ sub_8024F10,
+ sub_8024F38,
+ sub_8025198,
+ sub_8025324,
+ sub_8025470,
+ sub_8025644,
+ sub_80256AC,
+ sub_8025758,
+ sub_80250D4
+};
+
+static void (*const gUnknown_082F7AF4[])(void) =
+{
+ sub_8024DBC,
+ sub_8024E00,
+ sub_8024E38,
+ sub_8024F10,
+ sub_8024FFC,
+ sub_8025230,
+ sub_8025324,
+ sub_8025470,
+ sub_8025644,
+ sub_80256AC,
+ sub_8025758,
+ sub_8025158
+};
+
+// code
+void sub_802493C(u16 a0, void (*callback)(void))
{
gUnknown_03000DB0 = FALSE;
@@ -251,108 +458,108 @@ void sub_802493C(u16 a0, void (*a1)(void))
{
sub_8024A1C();
sub_8024A30(gUnknown_02022C98);
- gUnknown_02022C98->savedCallback = a1;
+ gUnknown_02022C98->savedCallback = callback;
gUnknown_02022C98->multiplayerId = GetMultiplayerId();
- gUnknown_02022C98->unk_32CC = gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId];
- sub_80261F8(&gUnknown_02022C98->unk_318C[gUnknown_02022C98->multiplayerId], &gPlayerParty[a0]);
+ gUnknown_02022C98->unk32CC = gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId];
+ sub_80261F8(&gUnknown_02022C98->unk318C[gUnknown_02022C98->multiplayerId], &gPlayerParty[a0]);
CreateTask(sub_8024BC8, 1);
SetMainCallback2(sub_80261CC);
sub_80273F0();
- sub_8026B5C(gUnknown_02022C98->unk_0024, &gUnknown_02022C98->unk_0044, &gUnknown_02022C98->unk_0048);
+ sub_8026B5C(gUnknown_02022C98->unk24, &gUnknown_02022C98->unk44, &gUnknown_02022C98->unk48);
StopMapMusic();
PlayNewMapMusic(MUS_RG_KINOMIKUI);
}
else
{
- SetMainCallback2(a1);
+ SetMainCallback2(callback);
return;
}
}
-void sub_8024A1C(void)
+static void sub_8024A1C(void)
{
ResetTasks();
ResetSpriteData();
FreeAllSpritePalettes();
}
-void sub_8024A30(struct DodrioBerryPickingStruct * data)
+static void sub_8024A30(struct DodrioStruct * data)
{
u8 i;
- data->unk_000C = 0;
- data->unk_0010 = 0;
- data->unk_0014 = 0;
- data->unk_0018 = 0;
- data->unk_001C = 0;
- data->unk_011C = 0;
- data->unk_0120 = 0;
- data->unk_0030 = 0;
- data->unk_0040 = 0;
- data->unk_003C = 0;
- data->unk_012C = 0;
+ data->unk0C = 0;
+ data->unk10 = 0;
+ data->unk14 = 0;
+ data->unk18 = 0;
+ data->unk1C = 0;
+ data->unk11C = 0;
+ data->unk120 = 0;
+ data->unk30 = 0;
+ data->unk40 = 0;
+ data->unk3C = 0;
+ data->unk12C = 0;
for (i = 0; i < 4; i++)
{
- data->unk_0098[i] = 0;
+ data->unk98[i] = 0;
}
for (i = 0; i < 5; i++)
{
- data->unk_00A8[i] = 0;
- data->unk_00B0[i] = 0;
- data->unk_004A[i][0] = 0;
- data->unk_004A[i][1] = 0;
- data->unk_004A[i][2] = 0;
- data->unk_004A[i][3] = 0;
- data->unk_004A[i][5] = 0;
- data->unk_010C[i] = 0;
- data->unk_0130[i] = 0;
+ data->unkA8[i] = 0;
+ data->unkB0[i] = 0;
+ data->unk4A[i][0] = 0;
+ data->unk4A[i][1] = 0;
+ data->unk4A[i][2] = 0;
+ data->unk4A[i][3] = 0;
+ data->unk4A[i][5] = 0;
+ data->unk10C[i] = 0;
+ data->unk130[i] = 0;
}
for (i = 0; i < 11; i++)
{
- data->unk_00D0[i] = 0;
- data->unk_00DC[i] = 0;
- data->unk_00C4[i] = 0;
- data->unk_00F4[i][0] = 0xFF;
- data->unk_00F4[i][1] = 0xFF;
+ data->unkD0[i] = 0;
+ data->unkDC[i] = 0;
+ data->unkC4[i] = 0;
+ data->unkF4[i][0] = 0xFF;
+ data->unkF4[i][1] = 0xFF;
}
- data->unk_0020 = GetMultiplayerId() == 0 ? 1 : 0;
- data->unk_0024 = GetLinkPlayerCount();
- data->unk_0034[0] = GetMultiplayerId();
- for (i = 1; i < data->unk_0024; i++)
+ data->unk20 = GetMultiplayerId() == 0 ? 1 : 0;
+ data->unk24 = GetLinkPlayerCount();
+ data->unk34[0] = GetMultiplayerId();
+ for (i = 1; i < data->unk24; i++)
{
- data->unk_0034[i] = data->unk_0034[i - 1] + 1;
- if (data->unk_0034[i] > data->unk_0024 - 1)
- data->unk_0034[i] %= data->unk_0024;
+ data->unk34[i] = data->unk34[i - 1] + 1;
+ if (data->unk34[i] > data->unk24 - 1)
+ data->unk34[i] %= data->unk24;
}
}
-void sub_8024BC8(u8 taskId)
+static void sub_8024BC8(u8 taskId)
{
u8 r4, r5;
- switch (gUnknown_02022C98->unk_000C)
+ switch (gUnknown_02022C98->unk0C)
{
case 0:
SetVBlankCallback(NULL);
sub_802620C(sub_8025910, 4);
- gUnknown_02022C98->unk_000C++;
+ gUnknown_02022C98->unk0C++;
break;
case 1:
if (!FuncIsActiveTask(sub_8025910))
{
- sub_8029274(&gUnknown_02022C98->unk_0160);
- gUnknown_02022C98->unk_000C++;
+ sub_8029274(&gUnknown_02022C98->unk160);
+ gUnknown_02022C98->unk0C++;
}
break;
case 2:
if (!sub_802A770())
{
sub_8010434();
- gUnknown_02022C98->unk_000C++;
+ gUnknown_02022C98->unk0C++;
}
break;
case 3:
@@ -363,37 +570,37 @@ void sub_8024BC8(u8 taskId)
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(0, 0);
}
- gUnknown_02022C98->unk_000C++;
+ gUnknown_02022C98->unk0C++;
}
break;
case 4:
- r5 = gUnknown_02022C98->unk_0024;
+ r5 = gUnknown_02022C98->unk24;
sub_80283A8();
for (r4 = 0; r4 < r5; r4++)
{
- sub_8028408(&gUnknown_02022C98->unk_318C[gUnknown_02022C98->unk_0034[r4]], r4, gUnknown_02022C98->unk_0034[r4], gUnknown_02022C98->unk_0024);
+ sub_8028408(&gUnknown_02022C98->unk318C[gUnknown_02022C98->unk34[r4]], r4, gUnknown_02022C98->unk34[r4], gUnknown_02022C98->unk24);
}
- sub_802868C(0, gUnknown_02022C98->unk_0024);
- gUnknown_02022C98->unk_000C++;
+ sub_802868C(FALSE, gUnknown_02022C98->unk24);
+ gUnknown_02022C98->unk0C++;
break;
case 5:
sub_8028A34();
sub_8028A88();
sub_8028D44();
sub_8028734();
- gUnknown_02022C98->unk_000C++;
+ gUnknown_02022C98->unk0C++;
break;
case 6:
BlendPalettes(0xFFFFFFFF, 0x10, 0x00);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
SetVBlankCallback(sub_80261E4);
- gUnknown_02022C98->unk_000C++;
+ gUnknown_02022C98->unk0C++;
break;
case 7:
UpdatePaletteFade();
if (!gPaletteFade.active)
{
- gUnknown_02022C98->unk_000C++;
+ gUnknown_02022C98->unk0C++;
}
break;
default:
@@ -403,36 +610,36 @@ void sub_8024BC8(u8 taskId)
}
}
-void sub_8024D4C(u8 taskId)
+static void sub_8024D4C(u8 taskId)
{
sub_8025D04();
- gUnknown_082F7AC4[gUnknown_02022C98->unk_0018]();
- if (gUnknown_03000DB0 == FALSE)
+ gUnknown_082F7AC4[gUnknown_02022C98->unk18]();
+ if (!gUnknown_03000DB0)
{
sub_8026AF4();
}
sub_8025D50();
}
-void sub_8024D84(u8 taskId)
+static void sub_8024D84(u8 taskId)
{
sub_8025E0C();
- gUnknown_082F7AF4[gUnknown_02022C98->unk_0018]();
- if (gUnknown_03000DB0 == FALSE)
+ gUnknown_082F7AF4[gUnknown_02022C98->unk18]();
+ if (!gUnknown_03000DB0)
{
sub_8026B28();
}
sub_8025ED8();
}
-void sub_8024DBC(void)
+static void sub_8024DBC(void)
{
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
sub_8028504(1);
sub_80292E0(1);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 1:
if (!sub_802A770())
@@ -441,50 +648,50 @@ void sub_8024DBC(void)
}
}
-void sub_8024E00(void)
+static void sub_8024E00(void)
{
- if (gUnknown_02022C98->unk_0010 == 0)
+ if (gUnknown_02022C98->unk10 == 0)
{
sub_80262C0();
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
else
{
- gUnknown_02022C98->unk_0118 = 1;
+ gUnknown_02022C98->unk118 = 1;
sub_8026240(2);
}
}
-void sub_8024E38(void)
+static void sub_8024E38(void)
{
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
sub_802EB24(7, 8, 120, 80, 0);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 1:
sub_8010434();
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 2:
if (IsLinkTaskFinished())
{
- gUnknown_02022C98->unk_0010++;
- gUnknown_02022C98->unk_0030 = 0;
+ gUnknown_02022C98->unk10++;
+ gUnknown_02022C98->unk30 = 0;
}
break;
case 3:
if (!sub_802EB84())
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 4:
- if (++gUnknown_02022C98->unk_0030 > 5)
+ if (++gUnknown_02022C98->unk30 > 5)
{
sub_8010434();
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 5:
@@ -496,52 +703,52 @@ void sub_8024E38(void)
}
}
-void sub_8024F10(void)
+static void sub_8024F10(void)
{
- if (gUnknown_02022C98->unk_0010 == 0)
+ if (gUnknown_02022C98->unk10 == 0)
{
- if (gUnknown_02022C98->unk_011C != 0)
+ if (gUnknown_02022C98->unk11C != 0)
{
sub_8026240(4);
}
}
}
-void sub_8024F38(void)
+static void sub_8024F38(void)
{
- if (gUnknown_02022C98->unk_0010 == 0)
+ if (gUnknown_02022C98->unk10 == 0)
{
- if (gUnknown_02022C98->unk_0040 < 10)
+ if (gUnknown_02022C98->unk40 < 10)
{
- if (gUnknown_02022C98->unk_00A8[0] == 0)
+ if (gUnknown_02022C98->unkA8[0] == 0)
{
if (JOY_NEW(DPAD_UP))
{
- if (gUnknown_02022C98->unk_31A0[0].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[0].unk2C.unk0 == 0)
{
- gUnknown_02022C98->unk_31A0[0].unk_30 = 0;
- gUnknown_02022C98->unk_31A0[0].unk_2C = sub_8027518(2);
+ gUnknown_02022C98->unk31A0[0].unk2C.unk4 = 0;
+ gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(2);
}
}
else if (JOY_NEW(DPAD_RIGHT))
{
- if (gUnknown_02022C98->unk_31A0[0].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[0].unk2C.unk0 == 0)
{
- gUnknown_02022C98->unk_31A0[0].unk_30 = 0;
- gUnknown_02022C98->unk_31A0[0].unk_2C = sub_8027518(1);
+ gUnknown_02022C98->unk31A0[0].unk2C.unk4 = 0;
+ gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(1);
}
}
else if (JOY_NEW(DPAD_LEFT))
{
- if (gUnknown_02022C98->unk_31A0[0].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[0].unk2C.unk0 == 0)
{
- gUnknown_02022C98->unk_31A0[0].unk_30 = 0;
- gUnknown_02022C98->unk_31A0[0].unk_2C = sub_8027518(3);
+ gUnknown_02022C98->unk31A0[0].unk2C.unk4 = 0;
+ gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(3);
}
}
else
{
- gUnknown_02022C98->unk_31A0[0].unk_2C = sub_8027518(0);
+ gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(0);
}
}
}
@@ -554,34 +761,34 @@ void sub_8024F38(void)
}
}
-void sub_8024FFC(void)
+static void sub_8024FFC(void)
{
- if (gUnknown_02022C98->unk_0040 < 10)
+ if (gUnknown_02022C98->unk40 < 10)
{
if (JOY_NEW(DPAD_UP))
{
- if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0)
{
- gUnknown_02022C98->unk_32CC.unk_2C = 2;
+ gUnknown_02022C98->unk32CC.unk2C.unk0 = 2;
}
}
else if (JOY_NEW(DPAD_RIGHT))
{
- if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0)
{
- gUnknown_02022C98->unk_32CC.unk_2C = 1;
+ gUnknown_02022C98->unk32CC.unk2C.unk0 = 1;
}
}
else if (JOY_NEW(DPAD_LEFT))
{
- if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0)
{
- gUnknown_02022C98->unk_32CC.unk_2C = 3;
+ gUnknown_02022C98->unk32CC.unk2C.unk0 = 3;
}
}
else
{
- gUnknown_02022C98->unk_32CC.unk_2C = 0;
+ gUnknown_02022C98->unk32CC.unk2C.unk0 = 0;
}
}
else
@@ -591,7 +798,7 @@ void sub_8024FFC(void)
sub_8026044();
}
-void sub_80250D4(void)
+static void sub_80250D4(void)
{
u8 i;
@@ -604,26 +811,26 @@ void sub_80250D4(void)
}
else
{
- gUnknown_02022C98->unk_012C = 1;
- for (i = 1; i < gUnknown_02022C98->unk_0024; i++)
+ gUnknown_02022C98->unk12C = 1;
+ for (i = 1; i < gUnknown_02022C98->unk24; i++)
{
- if (gUnknown_02022C98->unk_0130[i] != 1)
+ if (gUnknown_02022C98->unk130[i] != 1)
{
- gUnknown_02022C98->unk_012C = 0;
+ gUnknown_02022C98->unk12C = 0;
break;
}
}
}
}
-void sub_8025158(void)
+static void sub_8025158(void)
{
sub_8026044();
if (sub_8026C90() == 1)
sub_8026240(5);
}
-bool32 sub_8025170(void)
+static bool32 sub_8025170(void)
{
u8 r4 = GetBlockReceivedStatus();
u8 r0 = sub_800A9D8();
@@ -638,32 +845,32 @@ bool32 sub_8025170(void)
}
}
-void sub_8025198(void)
+static void sub_8025198(void)
{
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
- if (SendBlock(0, gUnknown_02022C98->unk_004A, sizeof(gUnknown_02022C98->unk_004A)))
+ if (SendBlock(0, gUnknown_02022C98->unk4A, sizeof(gUnknown_02022C98->unk4A)))
{
- gUnknown_02022C98->unk_0008 = 0;
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk08 = 0;
+ gUnknown_02022C98->unk10++;
}
break;
case 1:
if (IsLinkTaskFinished())
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 2:
if (sub_8025170())
{
- gUnknown_02022C98->unk_0008 = gUnknown_02022C98->unk_0024;
+ gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24;
}
- if (gUnknown_02022C98->unk_0008 >= gUnknown_02022C98->unk_0024)
+ if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24)
{
- gUnknown_02022C98->unk_0014++;
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk14++;
+ gUnknown_02022C98->unk10++;
}
break;
default:
@@ -676,38 +883,38 @@ void sub_8025198(void)
}
}
-void sub_8025230(void)
+static void sub_8025230(void)
{
u8 i;
- switch (gUnknown_02022C98->unk_0010) {
+ switch (gUnknown_02022C98->unk10) {
case 0:
- if (SendBlock(0, gUnknown_02022C98->unk_004A[gUnknown_02022C98->unk_0014],
- sizeof(gUnknown_02022C98->unk_004A))) {
- gUnknown_02022C98->unk_0008 = 0;
- gUnknown_02022C98->unk_0010++;
+ if (SendBlock(0, gUnknown_02022C98->unk4A[gUnknown_02022C98->unk14],
+ sizeof(gUnknown_02022C98->unk4A))) {
+ gUnknown_02022C98->unk08 = 0;
+ gUnknown_02022C98->unk10++;
}
break;
case 1:
if (IsLinkTaskFinished()) {
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 2:
if (sub_8025170()) {
- for (i = 0; i < gUnknown_02022C98->unk_0024; i++) {
- memcpy(gUnknown_02022C98->unk_004A, gBlockRecvBuffer, sizeof(gUnknown_02022C98->unk_004A));
- gUnknown_02022C98->unk_0008 = gUnknown_02022C98->unk_0024;
+ for (i = 0; i < gUnknown_02022C98->unk24; i++) {
+ memcpy(gUnknown_02022C98->unk4A, gBlockRecvBuffer, sizeof(gUnknown_02022C98->unk4A));
+ gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24;
}
}
- if (gUnknown_02022C98->unk_0008 >= gUnknown_02022C98->unk_0024) {
- gUnknown_02022C98->unk_0014++;
- gUnknown_02022C98->unk_0010++;
+ if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) {
+ gUnknown_02022C98->unk14++;
+ gUnknown_02022C98->unk10++;
}
break;
default:
if (WaitFanfare(TRUE)) {
- gUnknown_02022C98->unk_0114 = gUnknown_02022C98->unk_004A[gUnknown_02022C98->multiplayerId][5];
+ gUnknown_02022C98->unk114 = gUnknown_02022C98->unk4A[gUnknown_02022C98->multiplayerId][5];
sub_8026240(6);
FadeOutAndPlayNewMapMusic(MUS_RG_WIN_YASEI, 4);
}
@@ -715,56 +922,56 @@ void sub_8025230(void)
}
}
-void sub_8025324(void)
+static void sub_8025324(void)
{
u8 sp00 = 1;
u8 i;
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
sub_802749C();
- sub_80289E8(1);
+ sub_80289E8(TRUE);
sub_8028DFC();
- sub_8028EC8(1);
+ sub_8028EC8(TRUE);
sub_80292E0(2);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 1:
if (!sub_802A770())
{
sub_80292E0(5);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 2:
sp00 = sub_802A794();
if (SendBlock(0, &sp00, sizeof(sp00)))
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 3:
if (IsLinkTaskFinished())
{
- gUnknown_02022C98->unk_0010++;
- gUnknown_02022C98->unk_0008 = 0;
+ gUnknown_02022C98->unk10++;
+ gUnknown_02022C98->unk08 = 0;
}
break;
case 4:
if (sub_8025170())
{
- for (i = 0; i < gUnknown_02022C98->unk_0024; i++)
+ for (i = 0; i < gUnknown_02022C98->unk24; i++)
{
- *(gUnknown_02022C98->unk_010C + i) = *(u8 *)gBlockRecvBuffer[i];
- gUnknown_02022C98->unk_0008 = gUnknown_02022C98->unk_0024;
+ *(gUnknown_02022C98->unk10C + i) = *(u8 *)gBlockRecvBuffer[i];
+ gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24;
}
}
- if (gUnknown_02022C98->unk_0008 >= gUnknown_02022C98->unk_0024) {
- if (++gUnknown_02022C98->unk_0014 >= 120)
+ if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) {
+ if (++gUnknown_02022C98->unk14 >= 120)
{
sub_80292E0(6);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
}
break;
@@ -777,74 +984,74 @@ void sub_8025324(void)
}
}
-void sub_8025470(void)
+static void sub_8025470(void)
{
u8 sp0;
u8 i;
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
if (sub_8027748() >= 3000)
{
sub_80292E0(4);
}
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 1:
if (!sub_802A770())
{
sub_80292E0(3);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 2:
sub_8028FCC();
sub_80272E8();
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 3:
if ((sp0 = sub_802A794()) != 0)
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 4:
if (!sub_802A770())
{
sub_80292E0(5);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 5:
sp0 = sub_802A794();
if (SendBlock(0, &sp0, sizeof(sp0)))
{
- gUnknown_02022C98->unk_0008 = 0;
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk08 = 0;
+ gUnknown_02022C98->unk10++;
}
break;
case 6:
if (IsLinkTaskFinished())
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 7:
if (sub_8025170())
{
- for (i = 0; i < gUnknown_02022C98->unk_0024; i++)
+ for (i = 0; i < gUnknown_02022C98->unk24; i++)
{
- *(gUnknown_02022C98->unk_010C + i) = *(u8 *)gBlockRecvBuffer[i];
- gUnknown_02022C98->unk_0008 = gUnknown_02022C98->unk_0024;
+ *(gUnknown_02022C98->unk10C + i) = *(u8 *)gBlockRecvBuffer[i];
+ gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24;
}
}
- if (gUnknown_02022C98->unk_0008 >= gUnknown_02022C98->unk_0024) {
- if (++gUnknown_02022C98->unk_0014 >= 120)
+ if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) {
+ if (++gUnknown_02022C98->unk14 >= 120)
{
sub_8027608();
sub_80292E0(6);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
}
else
@@ -855,9 +1062,9 @@ void sub_8025470(void)
default:
if (!sub_802A770())
{
- for (i = 0; i < gUnknown_02022C98->unk_0024; i++)
+ for (i = 0; i < gUnknown_02022C98->unk24; i++)
{
- if (gUnknown_02022C98->unk_010C[i] == 2)
+ if (gUnknown_02022C98->unk10C[i] == 2)
{
sub_8026240(8);
return;
@@ -869,25 +1076,25 @@ void sub_8025470(void)
}
}
-void sub_8025644(void)
+static void sub_8025644(void)
{
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
sub_800AC34();
sub_80292E0(7);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 1:
if (!sub_802A770())
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 2:
if (sub_802A794() == 5)
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
default:
@@ -899,35 +1106,35 @@ void sub_8025644(void)
}
}
-void sub_80256AC(void)
+static void sub_80256AC(void)
{
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 1:
UpdatePaletteFade();
if (!gPaletteFade.active)
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 2:
sub_8028B80();
sub_80287E4();
- sub_8028614(gUnknown_02022C98->unk_0024);
+ sub_8028614(gUnknown_02022C98->unk24);
sub_8028E84();
gUnknown_03000DB0 = TRUE;
sub_80292E0(8);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
default:
if (!sub_802A770())
{
SetMainCallback2(gUnknown_02022C98->savedCallback);
- DestroyTask(gUnknown_02022C98->unk_0004);
+ DestroyTask(gUnknown_02022C98->unk04);
Free(gUnknown_02022C98);
FreeAllWindowBuffers();
}
@@ -935,20 +1142,20 @@ void sub_80256AC(void)
}
}
-void sub_8025758(void)
+static void sub_8025758(void)
{
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
sub_80292E0(9);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 1:
UpdatePaletteFade();
if (!gPaletteFade.active)
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 2:
@@ -960,66 +1167,66 @@ void sub_8025758(void)
ChangeBgY(2, 0, 0);
ChangeBgX(3, 0, 0);
ChangeBgY(3, 0, 0);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 3:
StopMapMusic();
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 4:
PlayNewMapMusic(MUS_RG_KINOMIKUI);
sub_8028E4C();
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 5:
BlendPalettes(0xFFFFFFFF, 16, 0);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 6:
UpdatePaletteFade();
if (!gPaletteFade.active)
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
default:
- DestroyTask(gUnknown_02022C98->unk_0004);
+ DestroyTask(gUnknown_02022C98->unk04);
sub_802621C(sub_802589C);
sub_802903C();
sub_8024A30(gUnknown_02022C98);
if (gReceivedRemoteLinkPlayers == 0)
{
- gUnknown_02022C98->unk_0024 = 1;
+ gUnknown_02022C98->unk24 = 1;
}
sub_80273F0();
- sub_8028EC8(0);
+ sub_8028EC8(FALSE);
break;
}
}
-void sub_802589C(u8 taskId)
+static void sub_802589C(u8 taskId)
{
- switch (gUnknown_02022C98->unk_0010)
+ switch (gUnknown_02022C98->unk10)
{
case 0:
if (sub_8026264() == 1)
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
case 1:
sub_80286E4();
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
break;
case 2:
- if (sub_8028828() == 1)
+ if (sub_8028828() == TRUE)
{
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
default:
- if (gUnknown_02022C98->unk_0020 != 0)
+ if (gUnknown_02022C98->unk20 != 0)
{
sub_802621C(sub_8024D4C);
}
@@ -1032,7 +1239,7 @@ void sub_802589C(u8 taskId)
}
}
-void sub_8025910(u8 taskId)
+static void sub_8025910(u8 taskId)
{
s16 * data = gTasks[taskId].data;
u8 i;
@@ -1040,9 +1247,9 @@ void sub_8025910(u8 taskId)
switch (data[0])
{
case 0:
- if (SendBlock(0, &gUnknown_02022C98->unk_318C[gUnknown_02022C98->multiplayerId].isShiny, sizeof(gUnknown_02022C98->unk_318C[gUnknown_02022C98->multiplayerId].isShiny)))
+ if (SendBlock(0, &gUnknown_02022C98->unk318C[gUnknown_02022C98->multiplayerId].isShiny, sizeof(gUnknown_02022C98->unk318C[gUnknown_02022C98->multiplayerId].isShiny)))
{
- gUnknown_02022C98->unk_0008 = 0;
+ gUnknown_02022C98->unk08 = 0;
data[0]++;
}
break;
@@ -1055,129 +1262,129 @@ void sub_8025910(u8 taskId)
case 2:
if (sub_8025170())
{
- for (i = 0; i < gUnknown_02022C98->unk_0024; i++)
+ for (i = 0; i < gUnknown_02022C98->unk24; i++)
{
- *(u8 *)&gUnknown_02022C98->unk_318C[i] = *(u8 *)gBlockRecvBuffer[i];
- gUnknown_02022C98->unk_0008 = gUnknown_02022C98->unk_0024;
+ *(u8 *)&gUnknown_02022C98->unk318C[i] = *(u8 *)gBlockRecvBuffer[i];
+ gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24;
}
}
- if (gUnknown_02022C98->unk_0008 >= gUnknown_02022C98->unk_0024)
+ if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24)
{
DestroyTask(taskId);
sub_80292E0(6);
- gUnknown_02022C98->unk_0010++;
+ gUnknown_02022C98->unk10++;
}
break;
}
}
-void sub_80259FC(void)
+static void sub_80259FC(void)
{
u8 i;
- u8 r7 = gUnknown_02022C98->unk_0024;
+ u8 r7 = gUnknown_02022C98->unk24;
- gUnknown_02022C98->unk_31A0[0].unk_10 = sub_8028164(0, &gUnknown_02022C98->unk_31A0[0], &gUnknown_02022C98->unk_31A0[0].unk_2C, &gUnknown_02022C98->unk_31A0[1].unk_2C, &gUnknown_02022C98->unk_31A0[2].unk_2C, &gUnknown_02022C98->unk_31A0[3].unk_2C, &gUnknown_02022C98->unk_31A0[4].unk_2C, &gUnknown_02022C98->unk_0040, &gUnknown_02022C98->unk_0120, &gUnknown_02022C98->unk_012C);
- gUnknown_02022C98->unk_0128 = 1;
+ gUnknown_02022C98->unk31A0[0].unk10 = sub_8028164(0, &gUnknown_02022C98->unk31A0[0], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C);
+ gUnknown_02022C98->unk128 = 1;
for (i = 1; i < r7; i++)
{
- if ( gUnknown_02022C98->unk_00A8[i] == 0
- && sub_8028318(i, &gUnknown_02022C98->unk_31A0[i].unk_2C) == 0)
+ if ( gUnknown_02022C98->unkA8[i] == 0
+ && sub_8028318(i, &gUnknown_02022C98->unk31A0[i].unk2C.unk0) == 0)
{
- gUnknown_02022C98->unk_31A0[i].unk_2C = 0;
- gUnknown_02022C98->unk_0128 = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_02022C98->unk128 = 0;
}
}
- if (++gUnknown_02022C98->unk_0124 >= 60)
+ if (++gUnknown_02022C98->unk124 >= 60)
{
- if (gUnknown_02022C98->unk_0128 != 0)
+ if (gUnknown_02022C98->unk128 != 0)
{
sub_8011AC8();
- gUnknown_02022C98->unk_0124 = 0;
+ gUnknown_02022C98->unk124 = 0;
}
- else if (gUnknown_02022C98->unk_0124 > 70)
+ else if (gUnknown_02022C98->unk124 > 70)
{
sub_8011AC8();
- gUnknown_02022C98->unk_0124 = 0;
+ gUnknown_02022C98->unk124 = 0;
}
}
for (i = 0; i < r7; i++)
{
- if ( gUnknown_02022C98->unk_31A0[i].unk_2C != 0
- && gUnknown_02022C98->unk_00A8[i] == 0)
+ if ( gUnknown_02022C98->unk31A0[i].unk2C.unk0 != 0
+ && gUnknown_02022C98->unkA8[i] == 0)
{
- gUnknown_02022C98->unk_00A8[i] = 1;
+ gUnknown_02022C98->unkA8[i] = 1;
}
- switch (gUnknown_02022C98->unk_00A8[i])
+ switch (gUnknown_02022C98->unkA8[i])
{
case 0:
default:
break;
case 1 ... 3:
- if (++gUnknown_02022C98->unk_00B0[i] >= 6)
+ if (++gUnknown_02022C98->unkB0[i] >= 6)
{
- gUnknown_02022C98->unk_00B0[i] = 0;
- gUnknown_02022C98->unk_00A8[i] = 0;
- gUnknown_02022C98->unk_31A0[i].unk_2C = 0;
- gUnknown_02022C98->unk_31A0[i].unk_30 = 0;
- gUnknown_02022C98->unk_31A0[i].unk_34 = 0;
+ gUnknown_02022C98->unkB0[i] = 0;
+ gUnknown_02022C98->unkA8[i] = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk4 = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk8 = 0;
}
break;
case 4:
- if (++gUnknown_02022C98->unk_00B0[i] >= 40)
+ if (++gUnknown_02022C98->unkB0[i] >= 40)
{
- gUnknown_02022C98->unk_00B0[i] = 0;
- gUnknown_02022C98->unk_00A8[i] = 0;
- gUnknown_02022C98->unk_31A0[i].unk_2C = 0;
- gUnknown_02022C98->unk_31A0[i].unk_30 = 0;
- gUnknown_02022C98->unk_31A0[i].unk_34 = 0;
+ gUnknown_02022C98->unkB0[i] = 0;
+ gUnknown_02022C98->unkA8[i] = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk4 = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk8 = 0;
}
break;
}
}
}
-void sub_8025C0C(void)
+static void sub_8025C0C(void)
{
u8 i;
- u8 r6 = gUnknown_02022C98->unk_0024;
+ u8 r6 = gUnknown_02022C98->unk24;
- gUnknown_02022C98->unk_31A0[0].unk_10 = sub_8028164(0, &gUnknown_02022C98->unk_31A0[0], &gUnknown_02022C98->unk_31A0[0].unk_2C, &gUnknown_02022C98->unk_31A0[1].unk_2C, &gUnknown_02022C98->unk_31A0[2].unk_2C, &gUnknown_02022C98->unk_31A0[3].unk_2C, &gUnknown_02022C98->unk_31A0[4].unk_2C, &gUnknown_02022C98->unk_0040, &gUnknown_02022C98->unk_0120, &gUnknown_02022C98->unk_012C);
- gUnknown_02022C98->unk_0128 = 1;
+ gUnknown_02022C98->unk31A0[0].unk10 = sub_8028164(0, &gUnknown_02022C98->unk31A0[0], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C);
+ gUnknown_02022C98->unk128 = 1;
for (i = 1; i < r6; i++)
{
if (sub_8028374(i) != 0)
{
- gUnknown_02022C98->unk_0130[i] = 1;
- gUnknown_02022C98->unk_0128 = 0;
+ gUnknown_02022C98->unk130[i] = 1;
+ gUnknown_02022C98->unk128 = 0;
}
}
- if (++gUnknown_02022C98->unk_0124 >= 60)
+ if (++gUnknown_02022C98->unk124 >= 60)
{
- if (gUnknown_02022C98->unk_0128 != 0)
+ if (gUnknown_02022C98->unk128 != 0)
{
sub_8011AC8();
- gUnknown_02022C98->unk_0124 = 0;
+ gUnknown_02022C98->unk124 = 0;
}
- else if (gUnknown_02022C98->unk_0124 > 70)
+ else if (gUnknown_02022C98->unk124 > 70)
{
sub_8011AC8();
- gUnknown_02022C98->unk_0124 = 0;
+ gUnknown_02022C98->unk124 = 0;
}
}
}
-void sub_8025D04(void)
+static void sub_8025D04(void)
{
- switch (gUnknown_02022C98->unk_0018)
+ switch (gUnknown_02022C98->unk18)
{
case 3:
- if (sub_8026BB8() == 1)
+ if (sub_8026BB8() == TRUE)
{
sub_8026C28();
- gUnknown_02022C98->unk_011C = 1;
+ gUnknown_02022C98->unk11C = 1;
}
break;
case 4:
@@ -1189,48 +1396,48 @@ void sub_8025D04(void)
}
}
-void sub_8025D50(void)
+static void sub_8025D50(void)
{
- switch (gUnknown_02022C98->unk_0018)
+ switch (gUnknown_02022C98->unk18)
{
case 4:
- sub_8027E30(&gUnknown_02022C98->unk_32CC, &gUnknown_02022C98->unk_31A0[0].unk_2C, &gUnknown_02022C98->unk_31A0[1].unk_2C, &gUnknown_02022C98->unk_31A0[2].unk_2C, &gUnknown_02022C98->unk_31A0[3].unk_2C, &gUnknown_02022C98->unk_31A0[4].unk_2C, gUnknown_02022C98->unk_0040, gUnknown_02022C98->unk_0120, gUnknown_02022C98->unk_012C);
+ sub_8027E30(&gUnknown_02022C98->unk32CC, &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, gUnknown_02022C98->unk40, gUnknown_02022C98->unk120, gUnknown_02022C98->unk12C);
break;
case 11:
- sub_8027E30(&gUnknown_02022C98->unk_32CC, &gUnknown_02022C98->unk_31A0[0].unk_2C, &gUnknown_02022C98->unk_31A0[1].unk_2C, &gUnknown_02022C98->unk_31A0[2].unk_2C, &gUnknown_02022C98->unk_31A0[3].unk_2C, &gUnknown_02022C98->unk_31A0[4].unk_2C, gUnknown_02022C98->unk_0040, gUnknown_02022C98->unk_0120, gUnknown_02022C98->unk_012C);
+ sub_8027E30(&gUnknown_02022C98->unk32CC, &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, gUnknown_02022C98->unk40, gUnknown_02022C98->unk120, gUnknown_02022C98->unk12C);
break;
}
}
-void sub_8025E0C(void)
+static void sub_8025E0C(void)
{
- switch (gUnknown_02022C98->unk_0018)
+ switch (gUnknown_02022C98->unk18)
{
case 4:
- sub_8028164(gUnknown_02022C98->multiplayerId, &gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId], &gUnknown_02022C98->unk_31A0[0].unk_2C, &gUnknown_02022C98->unk_31A0[1].unk_2C, &gUnknown_02022C98->unk_31A0[2].unk_2C, &gUnknown_02022C98->unk_31A0[3].unk_2C, &gUnknown_02022C98->unk_31A0[4].unk_2C, &gUnknown_02022C98->unk_0040, &gUnknown_02022C98->unk_0120, &gUnknown_02022C98->unk_012C);
+ sub_8028164(gUnknown_02022C98->multiplayerId, &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C);
break;
case 11:
- sub_8028164(gUnknown_02022C98->multiplayerId, &gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId], &gUnknown_02022C98->unk_31A0[0].unk_2C, &gUnknown_02022C98->unk_31A0[1].unk_2C, &gUnknown_02022C98->unk_31A0[2].unk_2C, &gUnknown_02022C98->unk_31A0[3].unk_2C, &gUnknown_02022C98->unk_31A0[4].unk_2C, &gUnknown_02022C98->unk_0040, &gUnknown_02022C98->unk_0120, &gUnknown_02022C98->unk_012C);
+ sub_8028164(gUnknown_02022C98->multiplayerId, &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C);
break;
}
}
-void sub_8025ED8(void)
+static void sub_8025ED8(void)
{
- switch (gUnknown_02022C98->unk_0018)
+ switch (gUnknown_02022C98->unk18)
{
case 3:
sub_8027DD0(1);
- gUnknown_02022C98->unk_011C = 1;
+ gUnknown_02022C98->unk11C = 1;
break;
case 4:
- if (gUnknown_02022C98->unk_32CC.unk_2C != 0)
+ if (gUnknown_02022C98->unk32CC.unk2C.unk0 != 0)
{
- sub_80282EC(gUnknown_02022C98->unk_32CC.unk_2C);
+ sub_80282EC(gUnknown_02022C98->unk32CC.unk2C.unk0);
}
break;
case 11:
- if (gUnknown_02022C98->unk_0120 == 0 && gUnknown_02022C98->unk_012C == 0)
+ if (gUnknown_02022C98->unk120 == 0 && gUnknown_02022C98->unk12C == 0)
{
sub_8028350(1);
}
@@ -1238,105 +1445,105 @@ void sub_8025ED8(void)
}
}
-void sub_8025F48(void)
+static void sub_8025F48(void)
{
- if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0)
{
if (!IsSEPlaying())
{
- gUnknown_02022C98->unk_0144 = 0;
+ gUnknown_02022C98->unk144 = 0;
}
}
- else if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_30 == 1)
+ else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk4 == 1)
{
- if (gUnknown_02022C98->unk_0144 == 0)
+ if (gUnknown_02022C98->unk144 == 0)
{
m4aSongNumStop(SE_SEIKAI);
PlaySE(SE_SEIKAI);
- gUnknown_02022C98->unk_0144 = 1;
+ gUnknown_02022C98->unk144 = 1;
}
}
- else if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_34 == 1)
+ else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk8 == 1)
{
- if (gUnknown_02022C98->unk_0144 == 0 && !IsSEPlaying())
+ if (gUnknown_02022C98->unk144 == 0 && !IsSEPlaying())
{
PlaySE(SE_BOO);
sub_80284CC(1);
- gUnknown_02022C98->unk_0144 = 1;
+ gUnknown_02022C98->unk144 = 1;
}
}
- if (gUnknown_02022C98->unk_0154 == 0 && gUnknown_02022C98->unk_0040 >= 10)
+ if (gUnknown_02022C98->unk154 == 0 && gUnknown_02022C98->unk40 >= 10)
{
StopMapMusic();
- gUnknown_02022C98->unk_0154 = 1;
+ gUnknown_02022C98->unk154 = 1;
}
- else if (gUnknown_02022C98->unk_0154 == 1)
+ else if (gUnknown_02022C98->unk154 == 1)
{
PlayFanfareByFanfareNum(11); // MUS_ME_ZANNEN
- gUnknown_02022C98->unk_0154 = 2;
+ gUnknown_02022C98->unk154 = 2;
}
}
-void sub_8026044(void)
+static void sub_8026044(void)
{
- u8 r8 = gUnknown_02022C98->unk_0044;
- u8 r7 = gUnknown_02022C98->unk_0048;
+ u8 r8 = gUnknown_02022C98->unk44;
+ u8 r7 = gUnknown_02022C98->unk48;
u8 r4;
- if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_2C == 0)
+ if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0)
{
- if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_30 != 1 && gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_34 != 1)
+ if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk4 != 1 && gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk8 != 1)
{
- gUnknown_02022C98->unk_0144 = 0;
+ gUnknown_02022C98->unk144 = 0;
}
}
- else if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_30 == 1)
+ else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk4 == 1)
{
- if (gUnknown_02022C98->unk_0144 == 0)
+ if (gUnknown_02022C98->unk144 == 0)
{
m4aSongNumStop(SE_SEIKAI);
PlaySE(SE_SEIKAI);
- gUnknown_02022C98->unk_0144 = 1;
+ gUnknown_02022C98->unk144 = 1;
}
}
- else if (gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_34 == 1)
+ else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk8 == 1)
{
- if (gUnknown_02022C98->unk_0144 == 0 && !IsSEPlaying())
+ if (gUnknown_02022C98->unk144 == 0 && !IsSEPlaying())
{
PlaySE(SE_BOO);
sub_80284CC(1);
- gUnknown_02022C98->unk_0144 = 1;
+ gUnknown_02022C98->unk144 = 1;
}
}
for (r4 = r8; r4 < r7; r4++)
{
- struct DodrioBerryPickingSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk_31A0[gUnknown_02022C98->multiplayerId].unk_14;
- if (ptr->unk_B[r4] >= 10)
+ struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk14;
+ if (ptr->unkB[r4] >= 10)
{
- if (gUnknown_02022C98->unk_0148[r4] == 0)
+ if (gUnknown_02022C98->unk148[r4] == 0)
{
- PlaySE(SE_FUUSEN1 + ptr->unk_0[r4]);
- gUnknown_02022C98->unk_0148[r4] = 1;
+ PlaySE(SE_FUUSEN1 + ptr->unk0[r4]);
+ gUnknown_02022C98->unk148[r4] = 1;
}
}
else
{
- gUnknown_02022C98->unk_0148[r4] = 0;
+ gUnknown_02022C98->unk148[r4] = 0;
}
}
- if (gUnknown_02022C98->unk_0154 == 0 && gUnknown_02022C98->unk_0040 >= 10)
+ if (gUnknown_02022C98->unk154 == 0 && gUnknown_02022C98->unk40 >= 10)
{
StopMapMusic();
- gUnknown_02022C98->unk_0154 = 1;
+ gUnknown_02022C98->unk154 = 1;
}
- else if (gUnknown_02022C98->unk_0154 == 1)
+ else if (gUnknown_02022C98->unk154 == 1)
{
PlayFanfareByFanfareNum(11); // MUS_ME_ZANNEN
- gUnknown_02022C98->unk_0154 = 2;
+ gUnknown_02022C98->unk154 = 2;
}
}
-void sub_80261CC(void)
+static void sub_80261CC(void)
{
RunTasks();
AnimateSprites();
@@ -1344,46 +1551,46 @@ void sub_80261CC(void)
UpdatePaletteFade();
}
-void sub_80261E4(void)
+static void sub_80261E4(void)
{
TransferPlttBuffer();
LoadOam();
ProcessSpriteCopyRequests();
}
-void sub_80261F8(struct DodrioBerryPickingSubstruct_318C * a0, struct Pokemon * a1)
+static void sub_80261F8(struct DodrioSubstruct_318C * a0, struct Pokemon * a1)
{
a0->isShiny = IsMonShiny(a1);
}
-void sub_802620C(TaskFunc func, u8 priority)
+static void sub_802620C(TaskFunc func, u8 priority)
{
CreateTask(func, priority);
}
-void sub_802621C(TaskFunc func)
+static void sub_802621C(TaskFunc func)
{
- gUnknown_02022C98->unk_0004 = CreateTask(func, 1);
- gUnknown_02022C98->unk_0010 = 0;
- gUnknown_02022C98->unk_000C = 0;
- gUnknown_02022C98->unk_0014 = 0;
+ gUnknown_02022C98->unk04 = CreateTask(func, 1);
+ gUnknown_02022C98->unk10 = 0;
+ gUnknown_02022C98->unk0C = 0;
+ gUnknown_02022C98->unk14 = 0;
}
-void sub_8026240(u8 a0)
+static void sub_8026240(u8 a0)
{
- gUnknown_02022C98->unk_001C = gUnknown_02022C98->unk_0018;
- gUnknown_02022C98->unk_0018 = a0;
- gUnknown_02022C98->unk_0010 = 0;
- gUnknown_02022C98->unk_0014 = 0;
+ gUnknown_02022C98->unk1C = gUnknown_02022C98->unk18;
+ gUnknown_02022C98->unk18 = a0;
+ gUnknown_02022C98->unk10 = 0;
+ gUnknown_02022C98->unk14 = 0;
}
-bool32 sub_8026264(void)
+static bool32 sub_8026264(void)
{
- u8 r2 = gUnknown_02022C98->unk_0014 / 4;
- gUnknown_02022C98->unk_0014++;
- if (r2 != 0 && gUnknown_02022C98->unk_0014 % 4 == 0)
+ u8 r2 = gUnknown_02022C98->unk14 / 4;
+ gUnknown_02022C98->unk14++;
+ if (r2 != 0 && gUnknown_02022C98->unk14 % 4 == 0)
{
- if (r2 < gUnknown_082F7A94[gUnknown_02022C98->unk_0024 - 1])
+ if (r2 < gUnknown_082F7A94[gUnknown_02022C98->unk24 - 1])
{
SetGpuReg(REG_OFFSET_BG1HOFS, (r2 * 8));
SetGpuReg(REG_OFFSET_BG2HOFS, -(r2 * 8));
@@ -1400,530 +1607,125 @@ bool32 sub_8026264(void)
}
}
-void sub_80262C0(void)
+static void sub_80262C0(void)
{
u8 i;
- u8 start = gUnknown_02022C98->unk_0044;
- u8 finish = gUnknown_02022C98->unk_0048;
+ u8 start = gUnknown_02022C98->unk44;
+ u8 finish = gUnknown_02022C98->unk48;
for (i = start; i < finish; i++)
{
- struct DodrioBerryPickingSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk_32CC.unk_14;
- ptr->unk_B[i] = (i % 2 == 0) ? 1 : 0;
- ptr->unk_0[i] = 0;
+ struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk32CC.unk14;
+ ptr->unkB[i] = (i % 2 == 0) ? 1 : 0;
+ ptr->unk0[i] = 0;
}
}
-#ifdef NONMATCHING
-void sub_8026324(void)
+static void sub_8026324(void)
{
- u8 sp0 = gUnknown_02022C98->unk_0044;
- u8 sp4 = gUnknown_02022C98->unk_0048;
- u8 sp8 = gUnknown_02022C98->unk_0024;
- u8 r6;
- u8 r10;
- u8 r2;
- u8 r5;
- u8 r3;
- s32 r2_2;
- u8 r4;
- u8 r7, r7_2;
+ u8 sp0 = gUnknown_02022C98->unk44;
+ u8 sp4 = gUnknown_02022C98->unk48;
+ u8 sp8 = gUnknown_02022C98->unk24;
+ u8 i, j, k, r5;
+
+ if (gUnknown_02022C98->unk40 >= 10)
+ return;
- if (gUnknown_02022C98->unk_0040 < 10)
+ for (i = 0; i < sp8; i++)
{
- for (r6 = 0; r6 < sp8; r6++)
+ u8 *ptr = &gUnknown_02022C98->unk31A0[i].unk2C.unk0;
+ if (*ptr != 0 && gUnknown_02022C98->unkA8[i] == 1)
{
- if ( gUnknown_02022C98->unk_31A0[r6].unk_2C != 0
- && gUnknown_02022C98->unk_00A8[r6] == 1)
+ for (j = sp0; j < sp4; j++)
{
- for (r10 = sp0; r10 < sp4; r10++)
+ r5 = gUnknown_082F449C[0][0][j];
+ if (gUnknown_02022C98->unkF4[r5][0] == i || gUnknown_02022C98->unkF4[r5][1] == i)
+ break;
+ if (sub_8026634(i, *ptr, r5) == TRUE)
{
- r5 = gUnknown_082F449C[r10];
- if (gUnknown_02022C98->unk_00F4[r5][0] == r6)
- {
- break;
- }
- if (gUnknown_02022C98->unk_00F4[r5][1] == r6)
- {
- break;
- }
- if (sub_8026634(gUnknown_02022C98->unk_31A0[r6].unk_2C, r6, gUnknown_082F449C[r10]) == 1)
+ for (k = 0; k < 2; k++)
{
- for (r2 = 0; r2 < 2; r2++)
+ if (gUnknown_02022C98->unkF4[r5][k] == 0xFF)
{
- if (gUnknown_02022C98->unk_00F4[r5][r2] == 0xFF)
- {
- gUnknown_02022C98->unk_00F4[r5][r2] = r6;
- gUnknown_02022C98->unk_00A8[r6] = 2;
- gUnknown_02022C98->unk_00C4[r5] = 1;
- break;
- }
+ gUnknown_02022C98->unkF4[r5][k] = i;
+ gUnknown_02022C98->unkA8[i] = 2;
+ gUnknown_02022C98->unkC4[r5] = 1;
+ break;
}
- break;
- }
- if (gUnknown_02022C98->unk_31A0[r6].unk_34 == 1)
- {
- break;
}
+ break;
}
+ if (gUnknown_02022C98->unk31A0[i].unk2C.unk8 == 1)
+ break;
}
}
- for (r10 = sp0; r10 < sp4; r10++)
+ }
+
+ for (j = sp0; j < sp4; j++)
+ {
+ u8 id = 0xFF;
+ r5 = gUnknown_082F449C[0][0][j];
+ if (gUnknown_02022C98->unkC4[r5] == 1)
{
- r6 = 0xFF;
- r5 = gUnknown_082F449C[r10];
- if (gUnknown_02022C98->unk_00C4[r5] == 1)
+ s32 r2;
+ u8 r4, r3 = gUnknown_02022C98->unk90[sub_8026D8C(r5)] / 7;
+ if (r3 >= ARRAY_COUNT(gUnknown_082F7A88) - 1)
+ r3 = ARRAY_COUNT(gUnknown_082F7A88) - 1;
+
+ r2 = gUnknown_082F7A88[r3][gUnknown_02022C98->unk31A0[0].unk14.unk0[r5]] - gUnknown_02022C98->unkD0[r5];
+ if (r2 < 6)
+ gUnknown_02022C98->unk9C[r5] += r2;
+
+ if (++gUnknown_02022C98->unk9C[r5] >= 6)
{
- r3 = gUnknown_02022C98->unk_0090[sub_8026D8C(r5)] / 7;
- if (r3 < 2)
+ gUnknown_02022C98->unk9C[r5] = 0;
+ if (gUnknown_02022C98->unkF4[r5][0] == 0xFF && gUnknown_02022C98->unkF4[r5][1] == 0xFF)
{
- r3 = 2;
+ continue;
}
- r2 = gUnknown_082F7A88[r3][gUnknown_02022C98->unk_31A0[0].unk_14.unk_0[r5]] - gUnknown_02022C98->unk_00D0[r5];
- if (r2 < 6)
+ else if (gUnknown_02022C98->unkF4[r5][0] != 0xFF && gUnknown_02022C98->unkF4[r5][1] == 0xFF)
{
- gUnknown_02022C98->unk_009C[r5] += r2;
+ r4 = gUnknown_02022C98->unkF4[r5][0];
}
- if (++gUnknown_02022C98->unk_009C[r5] < 6)
+ else
{
- gUnknown_02022C98->unk_009C[r5] = 0;
- if (gUnknown_02022C98->unk_00F4[r5][0] != 0xFF && gUnknown_02022C98->unk_00F4[r5][1] == 0xFF)
+ u8 unk0 = gUnknown_02022C98->unkF4[r5][0];
+ i = gUnknown_02022C98->unkF4[r5][1]; // Have to re-use the variable to match.
+ if (!(Random() & 1))
{
- r4 = gUnknown_02022C98->unk_00F4[r5][0];
- }
- else if (gUnknown_02022C98->unk_00F4[r5][0] == 0xFF && gUnknown_02022C98->unk_00F4[r5][1] == 0xFF)
- {
- continue;
+ r4 = unk0;
+ id = i;
}
else
{
- r7 = gUnknown_02022C98->unk_00F4[r5][0];
- r7_2 = gUnknown_02022C98->unk_00F4[r5][1];
- if ((Random() & 1))
- {
- r4 = r7_2;
- r6 = r7;
- }
- else
- {
- r4 = r7;
- r6 = r7_2;
- }
+ r4 = i;
+ id = unk0;
}
- gUnknown_02022C98->unk_32CC.unk_1F[r5] = 7;
- gUnknown_02022C98->unk_00C4[r5] = 2;
- gUnknown_02022C98->unk_00A8[r4] = 3;
- gUnknown_02022C98->unk_00B8[r5] = r4;
- gUnknown_02022C98->unk_31A0[r4].unk_30 = 1;
- gUnknown_02022C98->unk_31A0[r6].unk_34 = 1;
- gUnknown_02022C98->unk_0086[r4]++;
- sub_8026F1C(0, r5, r4);
- sub_8027234(1);
- sub_8026D1C(r4);
- gUnknown_02022C98->unk_00E8[r5] = gUnknown_02022C98->unk_32CC.unk_14.unk_0[r5];
- gUnknown_02022C98->unk_32CC.unk_14.unk_0[r5] = 3;
- gUnknown_02022C98->unk_00F4[r5][0] = 0xFF;
- gUnknown_02022C98->unk_00F4[r5][1] = 0xFF;
}
+ gUnknown_02022C98->unk32CC.unk14.unkB[r5] = 7;
+ gUnknown_02022C98->unkC4[r5] = 2;
+ gUnknown_02022C98->unkA8[r4] = 3;
+ gUnknown_02022C98->unkB8[r5] = r4;
+ gUnknown_02022C98->unk31A0[r4].unk2C.unk4 = 1;
+ gUnknown_02022C98->unk31A0[id].unk2C.unk8 = 1;
+ gUnknown_02022C98->unk86[r4]++;
+ sub_8026F1C(0, r5, r4);
+ sub_8027234(TRUE);
+ sub_8026D1C(r4);
+ gUnknown_02022C98->unkE8[r5] = gUnknown_02022C98->unk32CC.unk14.unk0[r5];
+ gUnknown_02022C98->unk32CC.unk14.unk0[r5] = 3;
+ gUnknown_02022C98->unkF4[r5][0] = 0xFF;
+ gUnknown_02022C98->unkF4[r5][1] = 0xFF;
}
}
}
}
-#else
-NAKED
-void sub_8026324(void)
-{
- 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, 0x10\n"
- "\tldr r0, =gUnknown_02022C98\n"
- "\tldr r1, [r0]\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0x44\n"
- "\tldrb r0, [r0]\n"
- "\tstr r0, [sp]\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0x48\n"
- "\tldrb r0, [r0]\n"
- "\tstr r0, [sp, 0x4]\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0x24\n"
- "\tldrb r0, [r0]\n"
- "\tstr r0, [sp, 0x8]\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0x40\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x9\n"
- "\tbls _08026358\n"
- "\tb _08026614\n"
- "_08026358:\n"
- "\tmovs r6, 0\n"
- "\tldr r0, [sp, 0x8]\n"
- "\tcmp r6, r0\n"
- "\tbcs _08026440\n"
- "_08026360:\n"
- "\tldr r3, =gUnknown_02022C98\n"
- "\tlsls r0, r6, 4\n"
- "\tsubs r1, r0, r6\n"
- "\tlsls r1, 2\n"
- "\tldr r2, [r3]\n"
- "\tadds r1, r2\n"
- "\tldr r4, =0x000031cc\n"
- "\tadds r4, r1\n"
- "\tmov r8, r4\n"
- "\tldrb r1, [r4]\n"
- "\tmov r9, r0\n"
- "\tadds r0, r6, 0x1\n"
- "\tstr r0, [sp, 0xC]\n"
- "\tcmp r1, 0\n"
- "\tbeq _08026434\n"
- "\tadds r0, r2, 0\n"
- "\tadds r0, 0xA8\n"
- "\tadds r0, r6\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbne _08026434\n"
- "\tldr r1, [sp]\n"
- "\tmov r10, r1\n"
- "\tldr r2, [sp, 0x4]\n"
- "\tcmp r10, r2\n"
- "\tbcs _08026434\n"
- "\tadds r7, r3, 0\n"
- "_08026396:\n"
- "\tldr r0, =gUnknown_082F449C\n"
- "\tadd r0, r10\n"
- "\tldrb r5, [r0]\n"
- "\tldr r1, [r7]\n"
- "\tlsls r4, r5, 1\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0xF4\n"
- "\tadds r0, r4\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, r6\n"
- "\tbeq _08026434\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0xF5\n"
- "\tadds r0, r4\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, r6\n"
- "\tbeq _08026434\n"
- "\tmov r0, r8\n"
- "\tldrb r1, [r0]\n"
- "\tadds r0, r6, 0\n"
- "\tadds r2, r5, 0\n"
- "\tbl sub_8026634\n"
- "\tcmp r0, 0x1\n"
- "\tbne _08026410\n"
- "\tmovs r2, 0\n"
- "\tldr r3, =gUnknown_02022C98\n"
- "\tmov r8, r4\n"
- "_080263CE:\n"
- "\tldr r0, [r3]\n"
- "\tmov r4, r8\n"
- "\tadds r1, r2, r4\n"
- "\tadds r0, 0xF4\n"
- "\tadds r1, r0, r1\n"
- "\tldrb r0, [r1]\n"
- "\tcmp r0, 0xFF\n"
- "\tbne _08026404\n"
- "\tstrb r6, [r1]\n"
- "\tldr r0, [r3]\n"
- "\tadds r0, 0xA8\n"
- "\tadds r0, r6\n"
- "\tmovs r1, 0x2\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r3]\n"
- "\tadds r0, 0xC4\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x1\n"
- "\tstrb r1, [r0]\n"
- "\tb _08026434\n"
- "\t.pool\n"
- "_08026404:\n"
- "\tadds r0, r2, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r2, r0, 24\n"
- "\tcmp r2, 0x1\n"
- "\tbls _080263CE\n"
- "\tb _08026434\n"
- "_08026410:\n"
- "\tldr r0, [r7]\n"
- "\tmov r2, r9\n"
- "\tsubs r1, r2, r6\n"
- "\tlsls r1, 2\n"
- "\tadds r0, r1\n"
- "\tldr r4, =0x000031d4\n"
- "\tadds r0, r4\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbeq _08026434\n"
- "\tmov r0, r10\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tmov r10, r0\n"
- "\tldr r0, [sp, 0x4]\n"
- "\tcmp r10, r0\n"
- "\tbcc _08026396\n"
- "_08026434:\n"
- "\tldr r1, [sp, 0xC]\n"
- "\tlsls r0, r1, 24\n"
- "\tlsrs r6, r0, 24\n"
- "\tldr r2, [sp, 0x8]\n"
- "\tcmp r6, r2\n"
- "\tbcc _08026360\n"
- "_08026440:\n"
- "\tldr r4, [sp]\n"
- "\tmov r10, r4\n"
- "\tldr r0, [sp, 0x4]\n"
- "\tcmp r10, r0\n"
- "\tbcc _0802644C\n"
- "\tb _08026614\n"
- "_0802644C:\n"
- "\tldr r1, =gUnknown_02022C98\n"
- "\tmov r9, r1\n"
- "_08026450:\n"
- "\tmovs r6, 0xFF\n"
- "\tldr r0, =gUnknown_082F449C\n"
- "\tadd r0, r10\n"
- "\tldrb r5, [r0]\n"
- "\tmov r2, r9\n"
- "\tldr r0, [r2]\n"
- "\tadds r0, 0xC4\n"
- "\tadds r0, r5\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbeq _08026468\n"
- "\tb _08026602\n"
- "_08026468:\n"
- "\tadds r0, r5, 0\n"
- "\tbl sub_8026D8C\n"
- "\tmov r1, r9\n"
- "\tldr r4, [r1]\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tadds r1, r4, 0\n"
- "\tadds r1, 0x90\n"
- "\tadds r1, r0\n"
- "\tldrb r0, [r1]\n"
- "\tmovs r1, 0x7\n"
- "\tbl __udivsi3\n"
- "\tlsls r0, 24\n"
- "\tlsrs r3, r0, 24\n"
- "\tcmp r3, 0x1\n"
- "\tbls _0802648E\n"
- "\tmovs r3, 0x2\n"
- "_0802648E:\n"
- "\tldr r2, =gUnknown_082F7A88\n"
- "\tldr r0, =0x000031b4\n"
- "\tadds r1, r4, r0\n"
- "\tadds r1, r5\n"
- "\tlsls r0, r3, 1\n"
- "\tadds r0, r3\n"
- "\tldrb r1, [r1]\n"
- "\tadds r0, r1\n"
- "\tadds r0, r2\n"
- "\tldrb r1, [r0]\n"
- "\tadds r0, r4, 0\n"
- "\tadds r0, 0xD0\n"
- "\tadds r0, r5\n"
- "\tldrb r0, [r0]\n"
- "\tsubs r2, r1, r0\n"
- "\tcmp r2, 0x5\n"
- "\tbgt _080264BC\n"
- "\tadds r1, r4, 0\n"
- "\tadds r1, 0x9C\n"
- "\tadds r1, r5\n"
- "\tldrb r0, [r1]\n"
- "\tadds r0, r2\n"
- "\tstrb r0, [r1]\n"
- "_080264BC:\n"
- "\tmov r2, r9\n"
- "\tldr r1, [r2]\n"
- "\tadds r1, 0x9C\n"
- "\tadds r1, r5\n"
- "\tldrb r0, [r1]\n"
- "\tadds r0, 0x1\n"
- "\tmovs r2, 0\n"
- "\tstrb r0, [r1]\n"
- "\tmovs r4, 0xFF\n"
- "\tands r0, r4\n"
- "\tcmp r0, 0x5\n"
- "\tbhi _080264D6\n"
- "\tb _08026602\n"
- "_080264D6:\n"
- "\tmov r1, r9\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0x9C\n"
- "\tadds r0, r5\n"
- "\tstrb r2, [r0]\n"
- "\tldr r3, [r1]\n"
- "\tlsls r1, r5, 1\n"
- "\tadds r0, r3, 0\n"
- "\tadds r0, 0xF4\n"
- "\tadds r2, r0, r1\n"
- "\tldrb r0, [r2]\n"
- "\tmov r8, r1\n"
- "\tcmp r0, 0xFF\n"
- "\tbne _08026518\n"
- "\tadds r0, r3, 0\n"
- "\tadds r0, 0xF5\n"
- "\tadd r0, r8\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0xFF\n"
- "\tbne _08026500\n"
- "\tb _08026602\n"
- "_08026500:\n"
- "\tb _08026528\n"
- "\t.pool\n"
- "_08026518:\n"
- "\tadds r0, r3, 0\n"
- "\tadds r0, 0xF5\n"
- "\tadd r0, r8\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0xFF\n"
- "\tbne _08026528\n"
- "\tldrb r4, [r2]\n"
- "\tb _0802654E\n"
- "_08026528:\n"
- "\tmov r2, r9\n"
- "\tldr r1, [r2]\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0xF4\n"
- "\tadd r0, r8\n"
- "\tldrb r7, [r0]\n"
- "\tadds r1, 0xF5\n"
- "\tadd r1, r8\n"
- "\tldrb r6, [r1]\n"
- "\tbl Random\n"
- "\tmovs r1, 0x1\n"
- "\tands r1, r0\n"
- "\tcmp r1, 0\n"
- "\tbne _0802654A\n"
- "\tadds r4, r7, 0\n"
- "\tb _0802654E\n"
- "_0802654A:\n"
- "\tadds r4, r6, 0\n"
- "\tadds r6, r7, 0\n"
- "_0802654E:\n"
- "\tmov r1, r9\n"
- "\tldr r0, [r1]\n"
- "\tldr r2, =0x000032eb\n"
- "\tadds r0, r2\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x7\n"
- "\tstrb r1, [r0]\n"
- "\tmov r1, r9\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0xC4\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x2\n"
- "\tstrb r1, [r0]\n"
- "\tmov r2, r9\n"
- "\tldr r0, [r2]\n"
- "\tadds r0, 0xA8\n"
- "\tadds r0, r4\n"
- "\tmovs r1, 0x3\n"
- "\tstrb r1, [r0]\n"
- "\tldr r0, [r2]\n"
- "\tadds r0, 0xB8\n"
- "\tadds r0, r5\n"
- "\tstrb r4, [r0]\n"
- "\tldr r1, [r2]\n"
- "\tlsls r0, r4, 4\n"
- "\tsubs r0, r4\n"
- "\tlsls r0, 2\n"
- "\tadds r1, r0\n"
- "\tldr r2, =0x000031d0\n"
- "\tadds r1, r2\n"
- "\tmovs r0, 0x1\n"
- "\tstrb r0, [r1]\n"
- "\tmov r2, r9\n"
- "\tldr r1, [r2]\n"
- "\tlsls r0, r6, 4\n"
- "\tsubs r0, r6\n"
- "\tlsls r0, 2\n"
- "\tadds r1, r0\n"
- "\tldr r0, =0x000031d4\n"
- "\tadds r1, r0\n"
- "\tmovs r2, 0x1\n"
- "\tstrb r2, [r1]\n"
- "\tmov r0, r9\n"
- "\tldr r1, [r0]\n"
- "\tlsls r0, r4, 1\n"
- "\tadds r1, 0x86\n"
- "\tadds r1, r0\n"
- "\tldrh r0, [r1]\n"
- "\tadds r0, 0x1\n"
- "\tstrh r0, [r1]\n"
- "\tmovs r0, 0\n"
- "\tadds r1, r5, 0\n"
- "\tadds r2, r4, 0\n"
- "\tbl sub_8026F1C\n"
- "\tmovs r0, 0x1\n"
- "\tbl sub_8027234\n"
- "\tadds r0, r4, 0\n"
- "\tbl sub_8026D1C\n"
- "\tmov r1, r9\n"
- "\tldr r0, [r1]\n"
- "\tadds r1, r0, 0\n"
- "\tadds r1, 0xE8\n"
- "\tadds r1, r5\n"
- "\tldr r2, =0x000032e0\n"
- "\tadds r0, r2\n"
- "\tadds r0, r5\n"
- "\tldrb r0, [r0]\n"
- "\tstrb r0, [r1]\n"
- "\tmov r4, r9\n"
- "\tldr r0, [r4]\n"
- "\tadds r0, r2\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x3\n"
- "\tstrb r1, [r0]\n"
- "\tldr r1, [r4]\n"
- "\tadds r1, 0xF4\n"
- "\tadd r1, r8\n"
- "\tldrb r0, [r1]\n"
- "\tmovs r2, 0xFF\n"
- "\torrs r0, r2\n"
- "\tstrb r0, [r1]\n"
- "\tldr r1, [r4]\n"
- "\tadds r1, 0xF5\n"
- "\tadd r1, r8\n"
- "\tldrb r0, [r1]\n"
- "\torrs r0, r2\n"
- "\tstrb r0, [r1]\n"
- "_08026602:\n"
- "\tmov r0, r10\n"
- "\tadds r0, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tmov r10, r0\n"
- "\tldr r4, [sp, 0x4]\n"
- "\tcmp r10, r4\n"
- "\tbcs _08026614\n"
- "\tb _08026450\n"
- "_08026614:\n"
- "\tadd sp, 0x10\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
-u32 sub_8026634(u8 a0, u8 a1, u8 a2)
+static bool32 sub_8026634(u8 a0, u8 a1, u8 a2)
{
s32 r7 = 0;
- u8 r5 = gUnknown_02022C98->unk_0024 - 1;
- struct DodrioBerryPickingSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk_32CC.unk_14;
+ u8 r5 = gUnknown_02022C98->unk24 - 1;
+ struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk32CC.unk14;
switch (a1)
{
@@ -1938,13 +1740,13 @@ u32 sub_8026634(u8 a0, u8 a1, u8 a2)
r7 = 2;
break;
}
- if (ptr->unk_B[a2] == 6 || ptr->unk_B[a2] == 7)
+ if (ptr->unkB[a2] == 6 || ptr->unkB[a2] == 7)
{
- if (a2 == gUknnown_082F45AF[r7 + a0 * 3 + 15 * r5])
+ if (a2 == gUknnown_082F45AF[r5][a0][r7])
{
- if (gUnknown_02022C98->unk_00C4[a2] == 1 || gUnknown_02022C98->unk_00C4[a2] == 2)
+ if (gUnknown_02022C98->unkC4[a2] == 1 || gUnknown_02022C98->unkC4[a2] == 2)
{
- gUnknown_02022C98->unk_31A0[a0].unk_34 = 1;
+ gUnknown_02022C98->unk31A0[a0].unk2C.unk8 = 1;
return FALSE;
}
else
@@ -1955,401 +1757,3330 @@ u32 sub_8026634(u8 a0, u8 a1, u8 a2)
}
else
{
- if (a2 == gUknnown_082F45AF[r7 + a0 * 3 + 15 * r5])
+ if (a2 == gUknnown_082F45AF[r5][a0][r7])
{
- gUnknown_02022C98->unk_00A8[a0] = 4;
- gUnknown_02022C98->unk_31A0[a0].unk_34 = 1;
+ gUnknown_02022C98->unkA8[a0] = 4;
+ gUnknown_02022C98->unk31A0[a0].unk2C.unk8 = 1;
}
}
return FALSE;
}
-#ifdef NONMATCHING
-void sub_802671C(void)
+static void sub_802671C(void)
{
- u8 r1 = gUnknown_02022C98->unk_0044;
- u8 r9 = gUnknown_02022C98->unk_0048;
+ u8 r1 = gUnknown_02022C98->unk44;
+ u8 r9 = gUnknown_02022C98->unk48;
+ u8 r3 = 0;
u8 r10 = 0;
u8 i;
- u8 r3;
u8 r2;
- struct DodrioBerryPickingSubstruct_31A0_14 * ptr;
+ struct DodrioStruct *ptr;
- gUnknown_02022C98->unk_0120 = 0;
+ gUnknown_02022C98->unk120 = 0;
for (i = r1; i < r9 - 1; i++)
{
- ptr = &gUnknown_02022C98->unk_32CC.unk_14;
+ ptr = gUnknown_02022C98;
- if (gUnknown_02022C98->unk_00C4[i] == 0 || gUnknown_02022C98->unk_00C4[i] == 1)
+ if (gUnknown_02022C98->unkC4[i] == 0 || gUnknown_02022C98->unkC4[i] == 1)
{
- gUnknown_02022C98->unk_0120 = 1;
- if (ptr->unk_B[i] >= 10)
+ gUnknown_02022C98->unk120 = 1;
+ if (ptr->unk32CC.unk14.unkB[i] >= 10)
{
- ptr->unk_B[i] = 10;
- gUnknown_02022C98->unk_00C4[i] = 3;
- if (gUnknown_02022C98->unk_0148[i] == 0)
+ ptr->unk32CC.unk14.unkB[i] = 10;
+ gUnknown_02022C98->unkC4[i] = 3;
+ if (gUnknown_02022C98->unk148[i] == 0)
{
- gUnknown_02022C98->unk_0148[i] = 1;
- PlaySE(SE_FUUSEN1 + ptr->unk_0[i]);
+ gUnknown_02022C98->unk148[i] = 1;
+ PlaySE(SE_FUUSEN1 + ptr->unk32CC.unk14.unk0[i]);
}
- if (gUnknown_02022C98->unk_0040 < 10 || r10 == 1)
+ if (gUnknown_02022C98->unk40 < 10 || r10 == 1)
{
r10 = 1;
- gUnknown_02022C98->unk_0148[i] = 0;
- if (gUnknown_02022C98->unk_0040 < 10)
+ gUnknown_02022C98->unk148[i] = 0;
+ if (gUnknown_02022C98->unk40 < 10)
{
- gUnknown_02022C98->unk_0040++;
+ gUnknown_02022C98->unk40++;
}
sub_8026F1C(3, i, 0);
- sub_8027234(0);
+ sub_8027234(FALSE);
}
}
else
{
- r3 = gUnknown_02022C98->unk_0090[sub_8026D8C(i)] / 7;
- if (r3 < 2)
+ r3 = gUnknown_02022C98->unk90[sub_8026D8C(i)] / 7;
+ if (r3 >= 2)
{
r3 = 2;
}
- r2 = gUnknown_082F7A88[r3][ptr->unk_0[i]];
- if (++gUnknown_02022C98->unk_00D0[i] >= r2)
+ r2 = gUnknown_082F7A88[r3][ptr->unk32CC.unk14.unk0[i]];
+ if (++gUnknown_02022C98->unkD0[i] >= r2)
{
- ptr->unk_B[i]++;
- gUnknown_02022C98->unk_00D0[i] = 0;
+ ptr->unk32CC.unk14.unkB[i]++;
+ gUnknown_02022C98->unkD0[i] = 0;
}
sub_8026324();
}
}
- else if (gUnknown_02022C98->unk_00C4[i] == 2)
+ else if (gUnknown_02022C98->unkC4[i] == 2)
{
- gUnknown_02022C98->unk_0120 = 1;
- if (++gUnknown_02022C98->unk_00DC[i] >= 20)
+ gUnknown_02022C98->unk120 = 1;
+ if (++gUnknown_02022C98->unkDC[i] >= 20)
{
- gUnknown_02022C98->unk_31A0[gUnknown_02022C98->unk_00B8[i]].unk_30 = 0;
- gUnknown_02022C98->unk_00DC[i] = 0;
- gUnknown_02022C98->unk_00D0[i] = 0;
- gUnknown_02022C98->unk_00C4[i] = 0;
- ptr->unk_B[i] = 1;
- ptr->unk_0[i] = sub_8026DB0(sub_8026D8C(i), i);
+ gUnknown_02022C98->unk31A0[gUnknown_02022C98->unkB8[i]].unk2C.unk4 = 0;
+ gUnknown_02022C98->unkDC[i] = 0;
+ gUnknown_02022C98->unkD0[i] = 0;
+ gUnknown_02022C98->unkC4[i] = 0;
+ ptr->unk32CC.unk14.unkB[i] = 1;
+ ptr->unk32CC.unk14.unk0[i] = sub_8026DB0(sub_8026D8C(i), i);
}
}
- else if (gUnknown_02022C98->unk_00C4[i] == 3)
+ else if (gUnknown_02022C98->unkC4[i] == 3)
{
- if (++gUnknown_02022C98->unk_00DC[i] >= 20)
+ if (++gUnknown_02022C98->unkDC[i] >= 20)
{
- if (gUnknown_02022C98->unk_0040 < 10)
+ if (gUnknown_02022C98->unk40 < 10)
{
- gUnknown_02022C98->unk_00DC[i] = 0;
- gUnknown_02022C98->unk_00D0[i] = 0;
- gUnknown_02022C98->unk_00C4[i] = 0;
- ptr->unk_B[i] = 1;
- gUnknown_02022C98->unk_00E8[i] = ptr->unk_0[i];
- ptr->unk_0[i] = sub_8026DB0(sub_8026D8C(i), i);
+ gUnknown_02022C98->unkDC[i] = 0;
+ gUnknown_02022C98->unkD0[i] = 0;
+ gUnknown_02022C98->unkC4[i] = 0;
+ ptr->unk32CC.unk14.unkB[i] = 1;
+ gUnknown_02022C98->unkE8[i] = ptr->unk32CC.unk14.unk0[i];
+ ptr->unk32CC.unk14.unk0[i] = sub_8026DB0(sub_8026D8C(i), i);
}
}
}
}
}
+
+static void sub_8026988(void)
+{
+ u8 i, first, count;
+
+ first = gUnknown_02022C98->unk44;
+ count = gUnknown_02022C98->unk48;
+ for (i = first; i < count; i++)
+ {
+ struct DodrioSubstruct_31A0 *ptr = &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId];
+ u8 var = gUnknown_082F449C[gUnknown_02022C98->unk24 - 1][gUnknown_02022C98->multiplayerId][i];
+
+ if (ptr->unk14.unkB[var] != 0)
+ sub_8028BF8(i, FALSE);
+ else
+ sub_8028BF8(i, TRUE);
+
+ if (ptr->unk14.unkB[var] > 9)
+ {
+ sub_8028CA4(i, ptr->unk14.unk0[var] + 3);
+ sub_8028C7C(i, ptr->unk14.unkB[var] * 2 - 1);
+ }
+ else if (ptr->unk14.unk0[var] == 3)
+ {
+ ptr->unk14.unkB[var] = 7;
+ sub_8028CA4(i, 6);
+ sub_8028C7C(i, ptr->unk14.unkB[var] * 2 - 1);
+ }
+ else
+ {
+ sub_8028CA4(i, ptr->unk14.unk0[var]);
+ sub_8028C7C(i, ptr->unk14.unkB[var] * 2);
+ }
+ }
+}
+
+static void sub_8026A88(void)
+{
+ u8 i, count;
+
+ count = gUnknown_02022C98->unk24;
+ for (i = 0; i < count; i++)
+ {
+ struct DodrioSubstruct_31A0 *ptr = &gUnknown_02022C98->unk31A0[i];
+ sub_80286B4(i, ptr->unk2C.unk0);
+ }
+}
+
+static void sub_8026AC8(void)
+{
+ u8 i, count;
+
+ count = gUnknown_02022C98->unk24;
+ for (i = 0; i < count; i++)
+ sub_80286B4(i, 4);
+}
+
+static void sub_8026AF4(void)
+{
+ sub_8026988();
+ if (gUnknown_02022C98->unk40 > 9)
+ sub_8026AC8();
+ else
+ sub_8026A88();
+
+ sub_80288D4(gUnknown_02022C98->unk40);
+}
+
+// This function is literally the same as the one above...Why?
+static void sub_8026B28(void)
+{
+ sub_8026988();
+ if (gUnknown_02022C98->unk40 > 9)
+ sub_8026AC8();
+ else
+ sub_8026A88();
+
+ sub_80288D4(gUnknown_02022C98->unk40);
+}
+
+static void sub_8026B5C(u8 arg0, u8 *arg1, u8 *arg2)
+{
+ switch (arg0)
+ {
+ case 1:
+ *arg1 = 4, *arg2 = 7;
+ break;
+ case 2:
+ *arg1 = 3, *arg2 = 8;
+ break;
+ case 3:
+ *arg1 = 2, *arg2 = 9;
+ break;
+ case 4:
+ *arg1 = 1, *arg2 = 10;
+ break;
+ case 5:
+ *arg1 = 0, *arg2 = 11;
+ break;
+ }
+}
+
+static bool32 sub_8026BB8(void)
+{
+ u8 i, count;
+
+ count = gUnknown_02022C98->unk24;
+ for (i = 1; i < count; i++)
+ {
+ if (gUnknown_02022C98->unk158[i] == 0)
+ gUnknown_02022C98->unk158[i] = sub_8027DFC(i);
+ }
+
+ // This loop won't ever run, the seemingly poitnless assingment below is to make the compiler
+ // generate code for it.
+ count = count;
+ for (; i < count; i++)
+ {
+ if (gUnknown_02022C98->unk158[i] == 0)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_8026C28(void)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i++)
+ gUnknown_02022C98->unk158[i] = 0;
+}
+
+static bool32 sub_8026C50(void)
+{
+ if (gUnknown_02022C98->unk40 > 9 && gUnknown_02022C98->unk120 == 0)
+ {
+ gUnknown_02022C98->unk40 = 10;
+ if (gUnknown_02022C98->unk12C != 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static bool32 sub_8026C90(void)
+{
+ u8 i, first, count;
+
+ if (gUnknown_02022C98->unk40 > 9)
+ {
+ first = gUnknown_02022C98->unk44;
+ count = gUnknown_02022C98->unk48;
+ gUnknown_02022C98->unk40 = 10;
+ if (gUnknown_02022C98->unk12C != 0)
+ {
+ for (i = first; i < count; i++)
+ {
+ struct DodrioSubstruct_31A0 *ptr = &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId];
+ u8 var = gUnknown_082F449C[gUnknown_02022C98->unk24 - 1][gUnknown_02022C98->multiplayerId][i];
+
+ if (ptr->unk14.unkB[var] != 10)
+ return FALSE;
+ }
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_8026D1C(u8 arg0)
+{
+ u8 var = gUnknown_082F7A9C[gUnknown_02022C98->unk90[arg0] % 7] + (gUnknown_02022C98->unk90[arg0] / 7) * 100;
+ if (gUnknown_02022C98->unk86[arg0] >= var)
+ gUnknown_02022C98->unk90[arg0]++;
+}
+
+static u8 sub_8026D8C(u8 arg0)
+{
+ return gUnknown_082F4648[gUnknown_02022C98->unk24 - 1][arg0];
+}
+
+static u8 sub_8026DB0(u8 arg0, u8 arg1)
+{
+ u8 i, var3;
+ u8 count = gUnknown_02022C98->unk24 - 1;
+ u8 var0 = gUnknown_082F45FA[count][arg0][0];
+ u8 var1 = gUnknown_082F45FA[count][arg0][1];
+ u8 var2 = gUnknown_082F45FA[count][arg0][2];
+
+ for (i = 0; gUnknown_082F467F[count][i] != 0; i++)
+ {
+ if (arg1 == gUnknown_082F467F[count][i])
+ return sub_8026E70(gUnknown_02022C98->unk90[var1], arg1);
+ }
+
+ // Gets the highest of the three.
+ if (gUnknown_02022C98->unk90[var0] > gUnknown_02022C98->unk90[var1])
+ var3 = gUnknown_02022C98->unk90[var0];
+ else
+ var3 = gUnknown_02022C98->unk90[var1];
+
+ if (gUnknown_02022C98->unk90[var2] > var3)
+ var3 = gUnknown_02022C98->unk90[var2];
+
+ return sub_8026E70(var3, arg1);
+}
+
+static u8 sub_8026E70(u8 arg0, u8 arg1)
+{
+ u8 var = gUnknown_02022C98->unkE8[arg1];
+ switch (arg0 % 7)
+ {
+ default: return 0;
+ case 0: return 0;
+ case 1: return 1;
+ case 2: return 2;
+ case 3:
+ if (var == 0)
+ return 1;
+ else
+ return 0;
+ case 4:
+ if (var == 0)
+ return 2;
+ else
+ return 0;
+ case 5:
+ if (var == 2)
+ return 1;
+ else
+ return 2;
+ case 6:
+ if (var == 0)
+ return 1;
+ else if (var == 1)
+ return 2;
+ else
+ return 0;
+ }
+}
+
+static bool32 sub_8026EEC(u16 arg0[5][6])
+{
+ int sum, i;
+ for (sum = 0, i = 0; i < GetLinkPlayerCount(); sum += arg0[i][3], i++)
+ ;
+
+ if (sum >= 11)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void sub_8026F1C(u8 arg0, u8 arg1, u8 arg2)
+{
+ u8 var;
+ u8 count = gUnknown_02022C98->unk24;
+ switch (arg0)
+ {
+ case 0:
+ case 1:
+ case 2:
+ var = gUnknown_02022C98->unk31A0[0].unk14.unk0[arg1];
+ gUnknown_02022C98->unk4A[arg2][var] = IncrementWithLimit(gUnknown_02022C98->unk4A[arg2][var], 20000);
+ break;
+ case 3:
+ if (sub_8026EEC(gUnknown_02022C98->unk4A))
+ break;
+ switch (count)
+ {
+ case 5:
+ switch (arg1)
+ {
+ case 0:
+ gUnknown_02022C98->unk4A[2][3]++;
+ gUnknown_02022C98->unk4A[3][3]++;
+ break;
+ case 1:
+ gUnknown_02022C98->unk4A[3][3]++;
+ break;
+ case 2:
+ gUnknown_02022C98->unk4A[3][3]++;
+ gUnknown_02022C98->unk4A[4][3]++;
+ break;
+ case 3:
+ gUnknown_02022C98->unk4A[4][3]++;
+ break;
+ case 4:
+ gUnknown_02022C98->unk4A[4][3]++;
+ gUnknown_02022C98->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_02022C98->unk4A[0][3]++;
+ break;
+ case 6:
+ gUnknown_02022C98->unk4A[0][3]++;
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ case 7:
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ case 8:
+ gUnknown_02022C98->unk4A[1][3]++;
+ gUnknown_02022C98->unk4A[2][3]++;
+ break;
+ case 9:
+ gUnknown_02022C98->unk4A[2][3]++;
+ break;
+ }
+ break;
+ case 4:
+ switch (arg1)
+ {
+ case 1:
+ gUnknown_02022C98->unk4A[2][3]++;
+ gUnknown_02022C98->unk4A[3][3]++;
+ break;
+ case 2:
+ gUnknown_02022C98->unk4A[3][3]++;
+ break;
+ case 3:
+ gUnknown_02022C98->unk4A[3][3]++;
+ gUnknown_02022C98->unk4A[0][3]++;
+ break;
+ case 4:
+ gUnknown_02022C98->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_02022C98->unk4A[0][3]++;
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ case 6:
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ case 7:
+ gUnknown_02022C98->unk4A[1][3]++;
+ gUnknown_02022C98->unk4A[2][3]++;
+ break;
+ case 8:
+ gUnknown_02022C98->unk4A[2][3]++;
+ break;
+ }
+ break;
+ case 3:
+ switch (arg1)
+ {
+ case 2:
+ gUnknown_02022C98->unk4A[1][3]++;
+ gUnknown_02022C98->unk4A[2][3]++;
+ break;
+ case 3:
+ gUnknown_02022C98->unk4A[2][3]++;
+ break;
+ case 4:
+ gUnknown_02022C98->unk4A[2][3]++;
+ gUnknown_02022C98->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_02022C98->unk4A[0][3]++;
+ break;
+ case 6:
+ gUnknown_02022C98->unk4A[0][3]++;
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ case 7:
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ }
+ break;
+ case 2:
+ switch (arg1)
+ {
+ case 3:
+ gUnknown_02022C98->unk4A[0][3]++;
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ case 4:
+ gUnknown_02022C98->unk4A[0][3]++;
+ break;
+ case 5:
+ gUnknown_02022C98->unk4A[0][3]++;
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ case 6:
+ gUnknown_02022C98->unk4A[1][3]++;
+ break;
+ }
+ break;
+ }
+ break;
+ }
+}
+
+static void sub_8027234(bool32 arg0)
+{
+ if (gUnknown_02022C98->unk24 != 5)
+ return;
+
+ if (arg0 == TRUE)
+ {
+ if (++gUnknown_02022C98->unk112 > gUnknown_02022C98->unk114)
+ gUnknown_02022C98->unk114 = gUnknown_02022C98->unk112;
+ if (gUnknown_02022C98->unk112 > 9999)
+ gUnknown_02022C98->unk112 = 9999;
+ }
+ else
+ {
+ if (gUnknown_02022C98->unk112 > gUnknown_02022C98->unk114)
+ gUnknown_02022C98->unk114 = gUnknown_02022C98->unk112;
+ gUnknown_02022C98->unk112 = 0;
+ }
+}
+
+static void sub_80272A4(void)
+{
+ u8 i;
+ for (i = 0; i < gUnknown_02022C98->unk24; i++)
+ gUnknown_02022C98->unk4A[i][5] = gUnknown_02022C98->unk114;
+}
+
+static void sub_80272E8(void)
+{
+ u8 i, j;
+
+ for (i = 0; i < 5; i++)
+ {
+ for (j = 0; j < 11; j++)
+ gUnknown_02022C98->unk31A0[i].unk14.unkB[j] = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0;
+ gUnknown_02022C98->unk31A0[i].unk2C.unk4 = 0;
+ gUnknown_02022C98->unk90[i] = 0;
+ gUnknown_02022C98->unk86[i] = 0;
+ gUnknown_02022C98->unk3308[i].unk0 = 0;
+ gUnknown_02022C98->unk3308[i].unk4 = 0;
+ gUnknown_02022C98->unk4A[i][0] = 0;
+ gUnknown_02022C98->unk4A[i][1] = 0;
+ gUnknown_02022C98->unk4A[i][2] = 0;
+ gUnknown_02022C98->unk4A[i][3] = 0;
+ gUnknown_02022C98->unk4A[i][4] = 0;
+ gUnknown_02022C98->unk4A[i][5] = 0;
+ }
+ gUnknown_02022C98->unk154 = 0;
+ gUnknown_02022C98->unk112 = 0;
+ gUnknown_02022C98->unk40 = 0;
+ sub_8026A88();
+ sub_8026988();
+}
+
+static const s16 gUnknown_082F7B24[] = {10, 30, 50, 50};
+
+static void sub_80273F0(void)
+{
+ u8 i, var = 0, var2 = 0;
+
+ switch (gUnknown_02022C98->unk24)
+ {
+ case 4: var = 1; break;
+ case 5: var = 2; break;
+ }
+
+ var2 = Random() % 10;
+ for (i = 0; i < 5; i++)
+ gUnknown_02022C98->unk4A[i][4] = gUnknown_082F7AA4[var][var2];
+}
+
+static u32 sub_802745C(u8 arg0)
+{
+ u32 sum = gUnknown_02022C98->unk4A[arg0][0]
+ + gUnknown_02022C98->unk4A[arg0][1]
+ + gUnknown_02022C98->unk4A[arg0][2];
+ return min(sum, 9999);
+}
+
+static void sub_802749C(void)
+{
+ u32 berriesPicked = Min(sub_802745C(gUnknown_02022C98->multiplayerId), 9999);
+ u32 score = Min(sub_80276C0(gUnknown_02022C98->multiplayerId), 999990);
+
+ if (gSaveBlock2Ptr->berryPick.bestScore < score)
+ gSaveBlock2Ptr->berryPick.bestScore = score;
+ if (gSaveBlock2Ptr->berryPick.berriesPicked < berriesPicked)
+ gSaveBlock2Ptr->berryPick.berriesPicked = berriesPicked;
+ if (gSaveBlock2Ptr->berryPick.berriesPickedInRow < gUnknown_02022C98->unk114)
+ gSaveBlock2Ptr->berryPick.berriesPickedInRow = gUnknown_02022C98->unk114;
+}
+
+static u8 sub_8027518(u8 arg0)
+{
+ u8 i, saved;
+
+ saved = gUnknown_02022C98->unk98[3];
+ for (i = 3; i != 0; i--)
+ gUnknown_02022C98->unk98[i] = gUnknown_02022C98->unk98[i - 1];
+ gUnknown_02022C98->unk98[0] = arg0;
+ return saved;
+}
+
+static void sub_8027554(void)
+{
+ if (gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] == 0)
+ {
+ if (gMain.newKeys & DPAD_UP)
+ {
+ gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 2;
+ gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] = 6;
+ PlaySE(SE_W204);
+ }
+ else if (gMain.newKeys & DPAD_LEFT)
+ {
+ gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 3;
+ gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] = 6;
+ PlaySE(SE_W204);
+ }
+ else if (gMain.newKeys & DPAD_RIGHT)
+ {
+ gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 1;
+ gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] = 6;
+ PlaySE(SE_W204);
+ }
+ else
+ {
+ gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 0;
+ }
+ }
+ else
+ {
+ gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId]--;
+ }
+}
+
+static void sub_8027608(void)
+{
+ gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 0;
+}
+
+static u16 sub_802762C(void)
+{
+ return gUnknown_02022C98->unk4A[gUnknown_02022C98->multiplayerId][4] + FIRST_BERRY_INDEX;
+}
+
+static u8 sub_8027650(void)
+{
+ return gUnknown_02022C98->unk24;
+}
+
+static u8 *sub_8027660(u8 id)
+{
+ if (gReceivedRemoteLinkPlayers)
+ return gLinkPlayers[id].name;
+ else
+ return gUnknown_02022C98->unk31A0[id].name;
+}
+
+static u16 sub_80276A0(u8 arg0, u8 arg1)
+{
+ return gUnknown_02022C98->unk4A[arg0][arg1];
+}
+
+static u32 sub_80276C0(u8 arg0)
+{
+ u8 i;
+ u32 var, sum = 0;
+
+ for (i = 0; i < 3; i++)
+ sum += gUnknown_02022C98->unk4A[arg0][i] * gUnknown_082F7B24[i];
+
+ var = gUnknown_02022C98->unk4A[arg0][3] * gUnknown_082F7B24[3];
+ if (sum <= var)
+ return 0;
+ else
+ return sum - var;
+}
+
+static u32 sub_8027748(void)
+{
+ u8 i, count = gUnknown_02022C98->unk24;
+ u32 maxVar = sub_80276C0(0);
+
+ for (i = 1; i < count; i++)
+ {
+ u32 var = sub_80276C0(i);
+ if (var > maxVar)
+ maxVar = var;
+ }
+ return Min(maxVar, 999990);
+}
+
+static u32 sub_802778C(u8 arg0)
+{
+ u8 i, count = gUnknown_02022C98->unk24;
+ u16 maxVar = gUnknown_02022C98->unk4A[0][arg0];
+
+ for (i = 0; i < count; i++)
+ {
+ u16 var = gUnknown_02022C98->unk4A[i][arg0];
+ if (var > maxVar)
+ maxVar = var;
+ }
+ return maxVar;
+}
+
+static u32 sub_80277D0(u8 arg0)
+{
+ u32 vals[5], temp;
+ s16 r6 = TRUE;
+ u8 i, count = gUnknown_02022C98->unk24;
+
+ for (i = 0; i < count; i++)
+ vals[i] = temp = sub_80276C0(i);
+
+ while (r6)
+ {
+ r6 = FALSE;
+ for (i = 0; i < count - 1; i++)
+ {
+ if (vals[i] < vals[i + 1])
+ {
+ SWAP(vals[i], vals[i + 1], temp);
+ r6 = TRUE;
+ }
+ }
+ }
+
+ return vals[arg0];
+}
+
+static u32 sub_802784C(void)
+{
+ u8 i, r10 = 0, r8 = 0, r9 = 0, count = gUnknown_02022C98->unk24;
+
+ // Function called two times for some reason.
+ sub_8027748();
+ if (sub_8027748() == 0)
+ {
+ for (i = 0; i < count; i++)
+ {
+ gUnknown_02022C98->unk3308[i].unk0 = 4;
+ gUnknown_02022C98->unk3308[i].unk4 = 0;
+ }
+ }
+
+ for (i = 0; i < count; i++)
+ gUnknown_02022C98->unk3308[i].unk4 = Min(sub_80276C0(i), 999990);
+
+ do
+ {
+ u32 r6 = sub_80277D0(r10);
+ u8 r3 = r8;
+ for (i = 0; i < count; i++)
+ {
+ if (r6 == gUnknown_02022C98->unk3308[i].unk4)
+ {
+ gUnknown_02022C98->unk3308[i].unk0 = r3;
+ r8++;
+ r9++;
+ }
+ }
+ r10 = r8;
+ } while (r9 < count);
+
+ return 0;
+}
+
+static void sub_802793C(struct DodrioSubstruct_3308 *dst, u8 id)
+{
+ *dst = gUnknown_02022C98->unk3308[id];
+}
+
+// Unused function
+static u8 sub_802795C(u8 arg0)
+{
+ u8 i, ret = 0, count = gUnknown_02022C98->unk24;
+ u32 var, vars[5] = {0};
+
+ for (i = 0; i < count; i++)
+ vars[i] = sub_80276C0(i);
+
+ var = vars[arg0];
+ for (i = 0; i < 5; i++)
+ {
+ if (i != arg0 && var < vars[i])
+ ret++;
+ }
+
+ return ret;
+}
+
+static u8 sub_80279C8(void)
+{
+ u8 multiplayerId = gUnknown_02022C98->multiplayerId;
+ u16 itemId = sub_802762C();
+
+ if (sub_80276C0(multiplayerId) != sub_8027748())
+ return 3;
+ if (!CheckBagHasSpace(itemId, 1))
+ return 2;
+
+ AddBagItem(itemId, 1);
+ if (!CheckBagHasSpace(itemId, 1))
+ return 1;
+ return 0;
+}
+
+// Really? What next, u32 Add(u32 a)return a+1;?
+static u32 IncrementWithLimit(u32 a, u32 max)
+{
+ if (a < max)
+ return a + 1;
+ else
+ return max;
+}
+
+// Gamefreak pls, min(a, b) ((a) < (b) ? (a) : (b)) is a well-known macro
+static u32 Min(u32 a, u32 b)
+{
+ if (a < b)
+ return a;
+ else
+ return b;
+}
+
+static u8 sub_8027A48(u8 id)
+{
+ return gUnknown_02022C98->unk34[id];
+}
+
+void sub_8027A5C(void)
+{
+ int i;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)
+ && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_DODRIO)
+ {
+ gSpecialVar_Result = 1;
+ return;
+ }
+ }
+
+ gSpecialVar_Result = 0;
+}
+
+void sub_8027AAC(void)
+{
+ u8 taskId = CreateTask(sub_8027ACC, 0);
+ sub_8027ACC(taskId);
+}
+
+// Data related to printing saved results.
+static const struct WindowTemplate gUnknown_082F7B2C =
+{
+ .bg = 0,
+ .tilemapLeft = 5,
+ .tilemapTop = 1,
+ .width = 20,
+ .height = 11,
+ .paletteNum = 15,
+ .baseBlock = 0x1,
+};
+
+static const u8 *const gUnknown_082F7B34[3] = {gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers};
+static const u8 gUnknown_082F7B40[] = {4, 7, 4};
+
+ALIGNED(4)
+static const u8 gUnknown_082F7B44[][2] = {{25}, {41}, {57}};
+static const u8 gUnknown_082F7B4A[][2] = {{25}, {41}, {73}};
+
+static void sub_8027ACC(u8 taskId)
+{
+ struct WindowTemplate window;
+ s32 i, width, widthCurr;
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ window = gUnknown_082F7B2C;
+ width = GetStringWidth(1, gText_BerryPickingRecords, 0);
+ for (i = 0; i < ARRAY_COUNT(gUnknown_082F7B34); i++)
+ {
+ widthCurr = GetStringWidth(1, gUnknown_082F7B34[i], 0) + 50;
+ if (widthCurr > width)
+ width = widthCurr;
+ }
+ width = (width + 7) / 8;
+ if (width & 1)
+ width++;
+ window.tilemapLeft = (30 - width) / 2;
+ window.width = width;
+ data[1] = AddWindow(&window);
+ sub_8027BEC(data[1], width);
+ CopyWindowToVram(data[1], 3);
+ data[0]++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ data[0]++;
+ break;
+ case 2:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ rbox_fill_rectangle(data[1]);
+ CopyWindowToVram(data[1], 1);
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ RemoveWindow(data[1]);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+ break;
+ }
+}
+
+static void sub_8027BEC(u8 windowId, s32 width)
+{
+ s32 i, x, numWidth;
+ s32 results[3];
+ results[0] = gSaveBlock2Ptr->berryPick.berriesPicked;
+ results[1] = gSaveBlock2Ptr->berryPick.bestScore;
+ results[2] = gSaveBlock2Ptr->berryPick.berriesPickedInRow;
+
+ LoadUserWindowBorderGfx_(windowId, 0x21D, 0xD0);
+ DrawTextBorderOuter(windowId, 0x21D, 0xD);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ AddTextPrinterParameterized(windowId, 1, gText_BerryPickingRecords, GetStringCenterAlignXOffset(1, gText_BerryPickingRecords, width * 8), 1, TEXT_SPEED_FF, NULL);
+ for (i = 0; i < 3; i++)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, results[i], STR_CONV_MODE_LEFT_ALIGN, gUnknown_082F7B40[i]);
+ numWidth = GetStringWidth(1, gStringVar1, -1);
+ AddTextPrinterParameterized(windowId, 1, gUnknown_082F7B34[i], 0, gUnknown_082F7B44[i][0], TEXT_SPEED_FF, NULL);
+ x = (width * 8) - numWidth;
+ AddTextPrinterParameterized(windowId, 1, gStringVar1, x, gUnknown_082F7B4A[i][0], TEXT_SPEED_FF, NULL);
+ }
+ PutWindowTilemap(windowId);
+}
+
+// Debug functions?
+static const u16 gUnknown_082F7B50[][4] =
+{
+ {9999, 0, 90, 9999},
+ {9999, 9999, 70, 9999},
+ {9999, 0, 9999, 0},
+ {9999, 9999, 60, 0},
+ {9999, 9999, 9999, 0},
+};
+
+static const u8 gUnknown_082F7B78[] = _("あいうえおかき");
+static const u8 gUnknown_082F7B80[] = _("ABCDEFG");
+static const u8 gUnknown_082F7B88[] = _("0123456");
+
+static const u8 *const gUnknown_082F7B90[] =
+{
+ gUnknown_082F7B78,
+ gUnknown_082F7B78,
+ gUnknown_082F7B78,
+ gUnknown_082F7B80,
+ gUnknown_082F7B88
+};
+
+static void sub_8027D20(void)
+{
+ gUnknown_02022C98->unk24 = GetLinkPlayerCount();
+}
+
+static void sub_8027D38(void)
+{
+ u8 i, playerId;
+
+ for (playerId = gUnknown_02022C98->unk24; playerId < 5; playerId++)
+ StringCopy(gLinkPlayers[playerId].name, gUnknown_082F7B90[playerId]);
+
+ gUnknown_02022C98->unk24 = 5;
+ for (i = 0; i < 4; i++)
+ {
+ for (playerId = 0; playerId < gUnknown_02022C98->unk24; playerId++)
+ gUnknown_02022C98->unk4A[playerId][i] = gUnknown_082F7B50[playerId][i];
+ }
+}
+
+struct UnkPacket1
+{
+ u8 id;
+ u8 ALIGNED(4) unk4;
+};
+
+static void sub_8027DD0(u32 arg0)
+{
+ struct UnkPacket1 packet;
+ packet.id = 1;
+ packet.unk4 = arg0;
+ sub_800FE50(&packet);
+}
+
+static u32 sub_8027DFC(u32 arg0)
+{
+ struct UnkPacket1 *packet;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+
+ packet = (void *)&gRecvCmds[arg0][1];
+ if (packet->id == 1)
+ return packet->unk4;
+
+ return 0;
+}
+
+struct UnkPacket2
+{
+ u8 id;
+ u8 unk1_0:4;
+ u8 unk1_1:4;
+ u8 unk2_0:4;
+ u8 unk2_1:4;
+ u8 unk3_0:4;
+ u8 unk3_1:4;
+ u8 unk4_0:4;
+ u8 unk4_1:4;
+ u8 unk5_0:4;
+ u8 unk5_1:4;
+ u8 unk6_0:2;
+ u8 unk6_1:2;
+ u8 unk6_2:2;
+ u8 unk6_3:2;
+ u8 unk7_0:2;
+ u8 unk7_1:2;
+ u8 unk7_2:2;
+ u8 unk7_3:2;
+ u8 unk8_0:2;
+ u8 unk8_1:2;
+ u8 unk8_2:2;
+ u8 unk8_3:2;
+ u8 unk9_0:2;
+ u8 unk9_1:2;
+ u8 unk9_2:2;
+ u8 unk9_3:1;
+ u8 unk9_4:1;
+ u8 unkA_0:1;
+ u8 unkA_1:1;
+ u8 unkA_2:1;
+ u8 unkA_3:5;
+ u8 unkB_0:1;
+ u8 unkB_1:1;
+ u8 unkB_2:1;
+ u8 unkB_3:1;
+ u8 unkB_4:1;
+ u8 unkB_5:1;
+ u8 unkB_6:1;
+};
+
+#ifdef NONMATCHING
+static void sub_8027E30(struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 arg6, u32 arg7, u32 arg8)
+{
+ struct UnkPacket2 packet;
+ struct DodrioSubstruct_31A0_14 *ptr = &arg0->unk14;
+
+ packet.id = 2;
+ packet.unk1_0 = ptr->unkB[0];
+ packet.unk1_1 = ptr->unkB[1];
+ packet.unk2_0 = ptr->unkB[2];
+ packet.unk2_1 = ptr->unkB[3];
+ packet.unk3_0 = ptr->unkB[4];
+ packet.unk3_1 = ptr->unkB[5];
+ packet.unk4_0 = ptr->unkB[6];
+ packet.unk4_1 = ptr->unkB[7];
+ packet.unk5_0 = ptr->unkB[8];
+ packet.unk5_1 = ptr->unkB[9];
+
+ packet.unk6_0 = ptr->unk0[0];
+ packet.unk6_1 = ptr->unk0[1];
+ packet.unk6_2 = ptr->unk0[2];
+ packet.unk6_3 = ptr->unk0[3];
+ packet.unk7_0 = ptr->unk0[4];
+ packet.unk7_1 = ptr->unk0[5];
+ packet.unk7_2 = ptr->unk0[6];
+ packet.unk7_3 = ptr->unk0[7];
+ packet.unk8_0 = ptr->unk0[8];
+ packet.unk8_1 = ptr->unk0[9];
+
+ packet.unk8_2 = arg1->unk0;
+ packet.unk8_3 = arg2->unk0;
+ packet.unk9_0 = arg3->unk0;
+ packet.unk9_1 = arg4->unk0;
+ packet.unk9_2 = arg5->unk0;
+
+ packet.unk9_3 = arg1->unk4;
+ packet.unk9_4 = arg2->unk4;
+ packet.unkA_0 = arg3->unk4;
+ packet.unkA_1 = arg4->unk4;
+ packet.unkA_2 = arg5->unk4;
+
+ packet.unkB_2 = arg1->unk8;
+ packet.unkB_3 = arg2->unk8;
+ packet.unkB_4 = arg3->unk8;
+ packet.unkB_5 = arg4->unk8;
+ packet.unkB_6 = arg5->unk8;
+
+ packet.unkA_3 = arg6;
+ packet.unkB_1 = arg7;
+ packet.unkB_0 = arg8;
+ sub_800FE50(&packet);
+}
#else
NAKED
-void sub_802671C(void)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r10\n"
- "\tmov r6, r9\n"
- "\tmov r5, r8\n"
- "\tpush {r5-r7}\n"
- "\tldr r2, =gUnknown_02022C98\n"
- "\tldr r4, [r2]\n"
- "\tadds r0, r4, 0\n"
- "\tadds r0, 0x44\n"
- "\tldrb r1, [r0]\n"
- "\tadds r0, 0x4\n"
- "\tldrb r0, [r0]\n"
- "\tmov r9, r0\n"
- "\tmovs r3, 0\n"
- "\tmov r10, r3\n"
- "\tmovs r5, 0x90\n"
- "\tlsls r5, 1\n"
- "\tadds r0, r4, r5\n"
- "\tstr r3, [r0]\n"
- "\tadds r5, r1, 0\n"
- "\tmov r0, r9\n"
- "\tsubs r0, 0x1\n"
- "\tcmp r5, r0\n"
- "\tblt _0802674E\n"
- "\tb _08026974\n"
- "_0802674E:\n"
- "\tmov r8, r2\n"
- "_08026750:\n"
- "\tmov r0, r8\n"
- "\tldr r4, [r0]\n"
- "\tadds r0, r4, 0\n"
- "\tadds r0, 0xC4\n"
- "\tadds r0, r5\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x1\n"
- "\tbls _08026762\n"
- "\tb _0802686C\n"
- "_08026762:\n"
- "\tmovs r1, 0x90\n"
- "\tlsls r1, 1\n"
- "\tadds r0, r4, r1\n"
- "\tmovs r2, 0x1\n"
- "\tstr r2, [r0]\n"
- "\tldr r1, =0x000032eb\n"
- "\tadds r0, r4, r1\n"
- "\tadds r6, r0, r5\n"
- "\tldrb r0, [r6]\n"
- "\tcmp r0, 0x9\n"
- "\tbls _080267FC\n"
- "\tmovs r7, 0\n"
- "\tmovs r0, 0xA\n"
- "\tstrb r0, [r6]\n"
- "\tmov r1, r8\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0xC4\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x3\n"
- "\tstrb r1, [r0]\n"
- "\tmov r1, r8\n"
- "\tldr r0, [r1]\n"
- "\tmovs r6, 0xA4\n"
- "\tlsls r6, 1\n"
- "\tadds r0, r6\n"
- "\tadds r1, r0, r5\n"
- "\tldrb r0, [r1]\n"
- "\tcmp r0, 0\n"
- "\tbne _080267AC\n"
- "\tstrb r2, [r1]\n"
- "\tldr r2, =0x000032e0\n"
- "\tadds r0, r4, r2\n"
- "\tadds r0, r5\n"
- "\tldrb r0, [r0]\n"
- "\tadds r0, 0x4A\n"
- "\tbl PlaySE\n"
- "_080267AC:\n"
- "\tmov r0, r8\n"
- "\tldr r1, [r0]\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0x40\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x9\n"
- "\tbls _080267C2\n"
- "\tmov r2, r10\n"
- "\tcmp r2, 0x1\n"
- "\tbeq _080267C2\n"
- "\tb _08026964\n"
- "_080267C2:\n"
- "\tmovs r0, 0x1\n"
- "\tmov r10, r0\n"
- "\tadds r0, r1, r6\n"
- "\tadds r0, r5\n"
- "\tstrb r7, [r0]\n"
- "\tmov r1, r8\n"
- "\tldr r0, [r1]\n"
- "\tadds r1, r0, 0\n"
- "\tadds r1, 0x40\n"
- "\tldrb r0, [r1]\n"
- "\tcmp r0, 0x9\n"
- "\tbhi _080267DE\n"
- "\tadds r0, 0x1\n"
- "\tstrb r0, [r1]\n"
- "_080267DE:\n"
- "\tmovs r0, 0x3\n"
- "\tadds r1, r5, 0\n"
- "\tmovs r2, 0\n"
- "\tbl sub_8026F1C\n"
- "\tmovs r0, 0\n"
- "\tbl sub_8027234\n"
- "\tb _08026964\n"
- "\t.pool\n"
- "_080267FC:\n"
- "\tadds r0, r5, 0\n"
- "\tbl sub_8026D8C\n"
- "\tmov r2, r8\n"
- "\tldr r7, [r2]\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tadds r1, r7, 0\n"
- "\tadds r1, 0x90\n"
- "\tadds r1, r0\n"
- "\tldrb r0, [r1]\n"
- "\tmovs r1, 0x7\n"
- "\tbl __udivsi3\n"
- "\tlsls r0, 24\n"
- "\tlsrs r3, r0, 24\n"
- "\tcmp r3, 0x1\n"
- "\tbls _08026822\n"
- "\tmovs r3, 0x2\n"
- "_08026822:\n"
- "\tldr r2, =gUnknown_082F7A88\n"
- "\tldr r0, =0x000032e0\n"
- "\tadds r1, r4, r0\n"
- "\tadds r1, r5\n"
- "\tlsls r0, r3, 1\n"
- "\tadds r0, r3\n"
- "\tldrb r1, [r1]\n"
- "\tadds r0, r1\n"
- "\tadds r0, r2\n"
- "\tldrb r2, [r0]\n"
- "\tadds r1, r7, 0\n"
- "\tadds r1, 0xD0\n"
- "\tadds r1, r5\n"
- "\tldrb r0, [r1]\n"
- "\tadds r0, 0x1\n"
- "\tmovs r3, 0\n"
- "\tstrb r0, [r1]\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r0, r2\n"
- "\tbcc _0802685C\n"
- "\tldrb r0, [r6]\n"
- "\tadds r0, 0x1\n"
- "\tstrb r0, [r6]\n"
- "\tmov r1, r8\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0xD0\n"
- "\tadds r0, r5\n"
- "\tstrb r3, [r0]\n"
- "_0802685C:\n"
- "\tbl sub_8026324\n"
- "\tb _08026964\n"
- "\t.pool\n"
- "_0802686C:\n"
- "\tcmp r0, 0x2\n"
- "\tbne _080268F4\n"
- "\tmovs r2, 0x90\n"
- "\tlsls r2, 1\n"
- "\tadds r0, r4, r2\n"
- "\tmovs r6, 0x1\n"
- "\tstr r6, [r0]\n"
- "\tadds r1, r4, 0\n"
- "\tadds r1, 0xDC\n"
- "\tadds r1, r5\n"
- "\tldrb r0, [r1]\n"
- "\tadds r0, 0x1\n"
- "\tmovs r3, 0\n"
- "\tstrb r0, [r1]\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r0, 0x13\n"
- "\tbls _08026964\n"
- "\tmov r0, r8\n"
- "\tldr r2, [r0]\n"
- "\tadds r0, r2, 0\n"
- "\tadds r0, 0xB8\n"
- "\tadds r0, r5\n"
- "\tldrb r1, [r0]\n"
- "\tlsls r0, r1, 4\n"
- "\tsubs r0, r1\n"
- "\tlsls r0, 2\n"
- "\tadds r2, r0\n"
- "\tldr r1, =0x000031d0\n"
- "\tadds r2, r1\n"
- "\tstrb r3, [r2]\n"
- "\tmov r2, r8\n"
- "\tldr r0, [r2]\n"
- "\tadds r0, 0xDC\n"
- "\tadds r0, r5\n"
- "\tstrb r3, [r0]\n"
- "\tldr r0, [r2]\n"
- "\tadds r0, 0xD0\n"
- "\tadds r0, r5\n"
- "\tstrb r3, [r0]\n"
- "\tldr r0, [r2]\n"
- "\tadds r0, 0xC4\n"
- "\tadds r0, r5\n"
- "\tstrb r3, [r0]\n"
- "\tldr r1, =0x000032eb\n"
- "\tadds r0, r4, r1\n"
- "\tadds r0, r5\n"
- "\tstrb r6, [r0]\n"
- "\tadds r0, r5, 0\n"
- "\tbl sub_8026D8C\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tadds r1, r5, 0\n"
- "\tbl sub_8026DB0\n"
- "\tldr r2, =0x000032e0\n"
- "\tadds r1, r4, r2\n"
- "\tadds r1, r5\n"
- "\tstrb r0, [r1]\n"
- "\tb _08026964\n"
- "\t.pool\n"
- "_080268F4:\n"
- "\tcmp r0, 0x3\n"
- "\tbne _08026964\n"
- "\tadds r1, r4, 0\n"
- "\tadds r1, 0xDC\n"
- "\tadds r1, r5\n"
- "\tldrb r0, [r1]\n"
- "\tadds r0, 0x1\n"
- "\tmovs r2, 0\n"
- "\tstrb r0, [r1]\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tcmp r0, 0x13\n"
- "\tbls _08026964\n"
- "\tmov r0, r8\n"
- "\tldr r1, [r0]\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0x40\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0x9\n"
- "\tbhi _08026964\n"
- "\tadds r0, r1, 0\n"
- "\tadds r0, 0xDC\n"
- "\tadds r0, r5\n"
- "\tstrb r2, [r0]\n"
- "\tmov r1, r8\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0xD0\n"
- "\tadds r0, r5\n"
- "\tstrb r2, [r0]\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, 0xC4\n"
- "\tadds r0, r5\n"
- "\tstrb r2, [r0]\n"
- "\tldr r2, =0x000032eb\n"
- "\tadds r0, r4, r2\n"
- "\tadds r0, r5\n"
- "\tmovs r1, 0x1\n"
- "\tstrb r1, [r0]\n"
- "\tmov r0, r8\n"
- "\tldr r1, [r0]\n"
- "\tadds r1, 0xE8\n"
- "\tadds r1, r5\n"
- "\tsubs r2, 0xB\n"
- "\tadds r4, r2\n"
- "\tadds r4, r5\n"
- "\tldrb r0, [r4]\n"
- "\tstrb r0, [r1]\n"
- "\tadds r0, r5, 0\n"
- "\tbl sub_8026D8C\n"
- "\tlsls r0, 24\n"
- "\tlsrs r0, 24\n"
- "\tadds r1, r5, 0\n"
- "\tbl sub_8026DB0\n"
- "\tstrb r0, [r4]\n"
- "_08026964:\n"
- "\tadds r0, r5, 0x1\n"
- "\tlsls r0, 24\n"
- "\tlsrs r5, r0, 24\n"
- "\tmov r0, r9\n"
- "\tsubs r0, 0x1\n"
- "\tcmp r5, r0\n"
- "\tbge _08026974\n"
- "\tb _08026750\n"
- "_08026974:\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");
+static void sub_8027E30(struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 arg6, u32 arg7, u32 arg8)
+{
+ 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, 0x20\n\
+ ldr r4, [sp, 0x48]\n\
+ lsls r4, 24\n\
+ str r4, [sp, 0x1C]\n\
+ movs r4, 0x14\n\
+ adds r4, r0\n\
+ mov r9, r4\n\
+ mov r5, sp\n\
+ movs r4, 0x2\n\
+ strb r4, [r5]\n\
+ mov r10, sp\n\
+ mov r5, r9\n\
+ ldrb r4, [r5, 0xB]\n\
+ movs r7, 0xF\n\
+ adds r5, r7, 0\n\
+ ands r5, r4\n\
+ mov r6, r10\n\
+ ldrb r6, [r6, 0x1]\n\
+ mov r8, r6\n\
+ movs r4, 0x10\n\
+ negs r4, r4\n\
+ mov r6, r8\n\
+ ands r4, r6\n\
+ orrs r4, r5\n\
+ mov r5, r10\n\
+ strb r4, [r5, 0x1]\n\
+ mov r8, sp\n\
+ mov r6, r9\n\
+ ldrb r5, [r6, 0xC]\n\
+ lsls r5, 4\n\
+ ands r4, r7\n\
+ orrs r4, r5\n\
+ mov r5, r8\n\
+ strb r4, [r5, 0x1]\n\
+ ldrb r5, [r6, 0xD]\n\
+ movs r6, 0xF\n\
+ ands r5, r6\n\
+ mov r4, r10\n\
+ ldrb r4, [r4, 0x2]\n\
+ mov r8, r4\n\
+ movs r4, 0x10\n\
+ negs r4, r4\n\
+ mov r6, r8\n\
+ ands r4, r6\n\
+ orrs r4, r5\n\
+ mov r5, r10\n\
+ strb r4, [r5, 0x2]\n\
+ mov r8, sp\n\
+ mov r6, r9\n\
+ ldrb r5, [r6, 0xE]\n\
+ lsls r5, 4\n\
+ ands r4, r7\n\
+ orrs r4, r5\n\
+ mov r5, r8\n\
+ strb r4, [r5, 0x2]\n\
+ ldrb r5, [r6, 0xF]\n\
+ movs r6, 0xF\n\
+ ands r5, r6\n\
+ mov r4, r10\n\
+ ldrb r4, [r4, 0x3]\n\
+ mov r8, r4\n\
+ movs r4, 0x10\n\
+ negs r4, r4\n\
+ mov r6, r8\n\
+ ands r4, r6\n\
+ orrs r4, r5\n\
+ mov r5, r10\n\
+ strb r4, [r5, 0x3]\n\
+ mov r8, sp\n\
+ mov r6, r9\n\
+ ldrb r5, [r6, 0x10]\n\
+ lsls r5, 4\n\
+ ands r4, r7\n\
+ orrs r4, r5\n\
+ mov r5, r8\n\
+ strb r4, [r5, 0x3]\n\
+ ldrb r5, [r6, 0x11]\n\
+ movs r6, 0xF\n\
+ ands r5, r6\n\
+ mov r4, r10\n\
+ ldrb r4, [r4, 0x4]\n\
+ mov r8, r4\n\
+ movs r4, 0x10\n\
+ negs r4, r4\n\
+ mov r6, r8\n\
+ ands r4, r6\n\
+ orrs r4, r5\n\
+ mov r5, r10\n\
+ strb r4, [r5, 0x4]\n\
+ mov r8, sp\n\
+ mov r6, r9\n\
+ ldrb r5, [r6, 0x12]\n\
+ lsls r5, 4\n\
+ ands r4, r7\n\
+ orrs r4, r5\n\
+ mov r5, r8\n\
+ strb r4, [r5, 0x4]\n\
+ ldrb r4, [r6, 0x13]\n\
+ movs r6, 0xF\n\
+ ands r4, r6\n\
+ mov r6, r8\n\
+ ldrb r5, [r6, 0x5]\n\
+ movs r6, 0x10\n\
+ negs r6, r6\n\
+ ands r6, r5\n\
+ orrs r6, r4\n\
+ str r6, [sp, 0xC]\n\
+ mov r4, r8\n\
+ strb r6, [r4, 0x5]\n\
+ mov r5, sp\n\
+ mov r6, r9\n\
+ ldrb r4, [r6, 0x14]\n\
+ lsls r4, 4\n\
+ ldr r6, [sp, 0xC]\n\
+ ands r6, r7\n\
+ orrs r6, r4\n\
+ strb r6, [r5, 0x5]\n\
+ mov r7, sp\n\
+ movs r4, 0x3\n\
+ mov r8, r4\n\
+ ldrb r0, [r0, 0x14]\n\
+ mov r5, r8\n\
+ ands r0, r5\n\
+ ldrb r5, [r7, 0x6]\n\
+ movs r6, 0x4\n\
+ negs r6, r6\n\
+ mov r10, r6\n\
+ mov r4, r10\n\
+ ands r4, r5\n\
+ orrs r4, r0\n\
+ strb r4, [r7, 0x6]\n\
+ mov r5, r9\n\
+ ldrb r0, [r5, 0x1]\n\
+ mov r6, r8\n\
+ ands r0, r6\n\
+ lsls r0, 2\n\
+ movs r5, 0xD\n\
+ negs r5, r5\n\
+ ands r5, r4\n\
+ orrs r5, r0\n\
+ strb r5, [r7, 0x6]\n\
+ mov r0, r9\n\
+ ldrb r4, [r0, 0x2]\n\
+ ands r4, r6\n\
+ lsls r4, 4\n\
+ movs r0, 0x31\n\
+ negs r0, r0\n\
+ ands r0, r5\n\
+ orrs r0, r4\n\
+ strb r0, [r7, 0x6]\n\
+ mov r5, sp\n\
+ mov r6, r9\n\
+ ldrb r4, [r6, 0x3]\n\
+ lsls r4, 6\n\
+ movs r6, 0x3F\n\
+ ands r0, r6\n\
+ orrs r0, r4\n\
+ strb r0, [r5, 0x6]\n\
+ mov r4, r9\n\
+ ldrb r0, [r4, 0x4]\n\
+ mov r5, r8\n\
+ ands r0, r5\n\
+ ldrb r5, [r7, 0x7]\n\
+ mov r4, r10\n\
+ ands r4, r5\n\
+ orrs r4, r0\n\
+ strb r4, [r7, 0x7]\n\
+ mov r6, r9\n\
+ ldrb r0, [r6, 0x5]\n\
+ mov r5, r8\n\
+ ands r0, r5\n\
+ lsls r0, 2\n\
+ movs r5, 0xD\n\
+ negs r5, r5\n\
+ ands r5, r4\n\
+ orrs r5, r0\n\
+ strb r5, [r7, 0x7]\n\
+ ldrb r4, [r6, 0x6]\n\
+ mov r6, r8\n\
+ ands r4, r6\n\
+ lsls r4, 4\n\
+ movs r0, 0x31\n\
+ negs r0, r0\n\
+ ands r0, r5\n\
+ orrs r0, r4\n\
+ strb r0, [r7, 0x7]\n\
+ mov r5, sp\n\
+ mov r6, r9\n\
+ ldrb r4, [r6, 0x7]\n\
+ lsls r4, 6\n\
+ movs r6, 0x3F\n\
+ ands r0, r6\n\
+ orrs r0, r4\n\
+ strb r0, [r5, 0x7]\n\
+ mov r8, sp\n\
+ mov r0, r9\n\
+ ldrb r4, [r0, 0x8]\n\
+ movs r7, 0x3\n\
+ adds r0, r7, 0\n\
+ ands r0, r4\n\
+ mov r4, r8\n\
+ ldrb r5, [r4, 0x8]\n\
+ mov r4, r10\n\
+ ands r4, r5\n\
+ orrs r4, r0\n\
+ mov r5, r8\n\
+ strb r4, [r5, 0x8]\n\
+ mov r6, r9\n\
+ ldrb r5, [r6, 0x9]\n\
+ adds r0, r7, 0\n\
+ ands r0, r5\n\
+ lsls r0, 2\n\
+ movs r5, 0xD\n\
+ negs r5, r5\n\
+ ands r5, r4\n\
+ orrs r5, r0\n\
+ mov r0, r8\n\
+ strb r5, [r0, 0x8]\n\
+ ldrb r0, [r1]\n\
+ adds r4, r7, 0\n\
+ ands r4, r0\n\
+ lsls r4, 4\n\
+ movs r0, 0x31\n\
+ negs r0, r0\n\
+ ands r0, r5\n\
+ orrs r0, r4\n\
+ mov r4, r8\n\
+ strb r0, [r4, 0x8]\n\
+ mov r5, sp\n\
+ ldrb r4, [r2]\n\
+ lsls r4, 6\n\
+ movs r6, 0x3F\n\
+ ands r0, r6\n\
+ orrs r0, r4\n\
+ strb r0, [r5, 0x8]\n\
+ ldrb r4, [r3]\n\
+ adds r0, r7, 0\n\
+ ands r0, r4\n\
+ ldrb r4, [r5, 0x9]\n\
+ mov r6, r10\n\
+ ands r6, r4\n\
+ orrs r6, r0\n\
+ mov r10, r6\n\
+ strb r6, [r5, 0x9]\n\
+ ldr r0, [sp, 0x40]\n\
+ ldrb r4, [r0]\n\
+ adds r0, r7, 0\n\
+ ands r0, r4\n\
+ lsls r0, 2\n\
+ movs r4, 0xD\n\
+ negs r4, r4\n\
+ ands r6, r4\n\
+ orrs r6, r0\n\
+ str r6, [sp, 0x10]\n\
+ strb r6, [r5, 0x9]\n\
+ mov r4, sp\n\
+ ldr r5, [sp, 0x44]\n\
+ ldrb r0, [r5]\n\
+ adds r6, r7, 0\n\
+ ands r6, r0\n\
+ lsls r0, r6, 4\n\
+ subs r7, 0x34\n\
+ ldr r5, [sp, 0x10]\n\
+ ands r7, r5\n\
+ orrs r7, r0\n\
+ strb r7, [r4, 0x9]\n\
+ mov r5, sp\n\
+ ldrb r0, [r1, 0x4]\n\
+ movs r6, 0x1\n\
+ mov r12, r6\n\
+ mov r4, r12\n\
+ ands r4, r0\n\
+ lsls r4, 6\n\
+ movs r0, 0x41\n\
+ negs r0, r0\n\
+ mov r10, r0\n\
+ ands r0, r7\n\
+ orrs r0, r4\n\
+ strb r0, [r5, 0x9]\n\
+ ldrb r4, [r2, 0x4]\n\
+ lsls r4, 7\n\
+ movs r5, 0x7F\n\
+ ands r0, r5\n\
+ orrs r0, r4\n\
+ mov r4, r8\n\
+ strb r0, [r4, 0x9]\n\
+ ldrb r4, [r3, 0x4]\n\
+ mov r0, r12\n\
+ ands r0, r4\n\
+ mov r5, r8\n\
+ ldrb r4, [r5, 0xA]\n\
+ movs r7, 0x2\n\
+ negs r7, r7\n\
+ adds r5, r7, 0\n\
+ ands r5, r4\n\
+ orrs r5, r0\n\
+ mov r6, r8\n\
+ strb r5, [r6, 0xA]\n\
+ mov r9, sp\n\
+ ldr r4, [sp, 0x40]\n\
+ ldrb r0, [r4, 0x4]\n\
+ mov r4, r12\n\
+ ands r4, r0\n\
+ lsls r4, 1\n\
+ movs r6, 0x3\n\
+ negs r6, r6\n\
+ mov r8, r6\n\
+ mov r0, r8\n\
+ ands r0, r5\n\
+ orrs r0, r4\n\
+ mov r4, r9\n\
+ strb r0, [r4, 0xA]\n\
+ ldr r6, [sp, 0x44]\n\
+ ldrb r5, [r6, 0x4]\n\
+ mov r4, r12\n\
+ ands r4, r5\n\
+ lsls r4, 2\n\
+ movs r5, 0x5\n\
+ negs r5, r5\n\
+ ands r0, r5\n\
+ orrs r0, r4\n\
+ mov r4, r9\n\
+ strb r0, [r4, 0xA]\n\
+ mov r4, sp\n\
+ ldrb r1, [r1, 0x8]\n\
+ mov r0, r12\n\
+ ands r0, r1\n\
+ lsls r0, 2\n\
+ ldrb r1, [r4, 0xB]\n\
+ ands r5, r1\n\
+ orrs r5, r0\n\
+ strb r5, [r4, 0xB]\n\
+ ldrb r1, [r2, 0x8]\n\
+ mov r0, r12\n\
+ ands r0, r1\n\
+ lsls r0, 3\n\
+ movs r1, 0x9\n\
+ negs r1, r1\n\
+ ands r1, r5\n\
+ orrs r1, r0\n\
+ strb r1, [r4, 0xB]\n\
+ ldrb r2, [r3, 0x8]\n\
+ mov r0, r12\n\
+ ands r0, r2\n\
+ lsls r0, 4\n\
+ movs r2, 0x11\n\
+ negs r2, r2\n\
+ ands r2, r1\n\
+ orrs r2, r0\n\
+ strb r2, [r4, 0xB]\n\
+ mov r3, sp\n\
+ ldr r5, [sp, 0x40]\n\
+ ldrb r0, [r5, 0x8]\n\
+ mov r1, r12\n\
+ ands r1, r0\n\
+ lsls r1, 5\n\
+ movs r0, 0x21\n\
+ negs r0, r0\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strb r0, [r3, 0xB]\n\
+ mov r2, sp\n\
+ ldrb r1, [r6, 0x8]\n\
+ mov r6, r12\n\
+ ands r6, r1\n\
+ lsls r1, r6, 6\n\
+ mov r3, r10\n\
+ ands r0, r3\n\
+ orrs r0, r1\n\
+ strb r0, [r2, 0xB]\n\
+ ldr r4, [sp, 0x1C]\n\
+ lsrs r3, r4, 21\n\
+ ldrb r1, [r2, 0xA]\n\
+ movs r0, 0x7\n\
+ ands r0, r1\n\
+ orrs r0, r3\n\
+ strb r0, [r2, 0xA]\n\
+ mov r1, sp\n\
+ ldr r5, [sp, 0x4C]\n\
+ movs r6, 0x1\n\
+ ands r5, r6\n\
+ lsls r2, r5, 1\n\
+ ldrb r0, [r1, 0xB]\n\
+ mov r3, r8\n\
+ ands r3, r0\n\
+ orrs r3, r2\n\
+ mov r8, r3\n\
+ strb r3, [r1, 0xB]\n\
+ mov r0, sp\n\
+ ldr r4, [sp, 0x50]\n\
+ ands r4, r6\n\
+ mov r5, r8\n\
+ ands r5, r7\n\
+ orrs r5, r4\n\
+ strb r5, [r0, 0xB]\n\
+ bl sub_800FE50\n\
+ add sp, 0x20\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\
+");
}
+#endif
+
+static u32 sub_8028164(u32 unused, struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 *arg6, u32 *arg7, u32 *arg8)
+{
+ struct UnkPacket2 *packet;
+ struct DodrioSubstruct_31A0_14 *ptr = &arg0->unk14;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+
+ packet = (void *)&gRecvCmds[0][1];
+ if (packet->id == 2)
+ {
+ ptr->unkB[0] = packet->unk1_0;
+ ptr->unkB[1] = packet->unk1_1;
+ ptr->unkB[2] = packet->unk2_0;
+ ptr->unkB[3] = packet->unk2_1;
+ ptr->unkB[4] = packet->unk3_0;
+ ptr->unkB[5] = packet->unk3_1;
+ ptr->unkB[6] = packet->unk4_0;
+ ptr->unkB[7] = packet->unk4_1;
+ ptr->unkB[8] = packet->unk5_0;
+ ptr->unkB[9] = packet->unk5_1;
+ ptr->unkB[10] = packet->unk1_0;
+
+ ptr->unk0[0] = packet->unk6_0;
+ ptr->unk0[1] = packet->unk6_1;
+ ptr->unk0[2] = packet->unk6_2;
+ ptr->unk0[3] = packet->unk6_3;
+ ptr->unk0[4] = packet->unk7_0;
+ ptr->unk0[5] = packet->unk7_1;
+ ptr->unk0[6] = packet->unk7_2;
+ ptr->unk0[7] = packet->unk7_3;
+ ptr->unk0[8] = packet->unk8_0;
+ ptr->unk0[9] = packet->unk8_1;
+ ptr->unk0[10] = packet->unk6_0;
+
+ arg1->unk0 = packet->unk8_2;
+ arg1->unk4 = packet->unk9_3;
+ arg1->unk8 = packet->unkB_2;
+
+ arg2->unk0 = packet->unk8_3;
+ arg2->unk4 = packet->unk9_4;
+ arg2->unk8 = packet->unkB_3;
+
+ arg3->unk0 = packet->unk9_0;
+ arg3->unk4 = packet->unkA_0;
+ arg3->unk8 = packet->unkB_4;
+
+ arg4->unk0 = packet->unk9_1;
+ arg4->unk4 = packet->unkA_1;
+ arg4->unk8 = packet->unkB_5;
+
+ arg5->unk0 = packet->unk9_2;
+ arg5->unk4 = packet->unkA_2;
+ arg5->unk8 = packet->unkB_6;
+
+ *arg6 = packet->unkA_3;
+ *arg7 = packet->unkB_1;
+ *arg8 = packet->unkB_0;
+ return 1;
+ }
+
+ return 0;
+}
+
+struct UnkPacket3
+{
+ u8 id;
+ u8 ALIGNED(4) unk4;
+};
+
+static void sub_80282EC(u8 arg0)
+{
+ struct UnkPacket3 packet;
+ packet.id = 3;
+ packet.unk4 = arg0;
+ sub_800FE50(&packet);
+}
+
+static u32 sub_8028318(u32 arg0, u8 *arg1)
+{
+ struct UnkPacket3 *packet;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+
+ packet = (void *)&gRecvCmds[arg0][1];
+ if (packet->id == 3)
+ {
+ *arg1 = packet->unk4;
+ return 1;
+ }
+
+ return 0;
+}
+
+struct UnkPacket4
+{
+ u8 id;
+ u32 unk4;
+};
+
+static void sub_8028350(u32 arg0)
+{
+ struct UnkPacket4 packet;
+ packet.id = 4;
+ packet.unk4 = arg0;
+ sub_800FE50(&packet);
+}
+
+static u32 sub_8028374(u32 arg0)
+{
+ struct UnkPacket4 *packet;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return 0;
+
+ packet = (void *)&gRecvCmds[arg0][1];
+ if (packet->id == 4)
+ return packet->unk4;
+
+ return 0;
+}
+
+// Large chunk of data
+static const struct BgTemplate gUnknown_082F7BA4[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 12,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 14,
+ .screenSize = 1,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+};
+
+// Unknown unreferenced data, feel free to remove.
+static const u32 sUnused[] = {255, 0};
+
+static const struct WindowTemplate gUnknown_082F7BBC[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 28,
+ .height = 2,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 5,
+ .width = 28,
+ .height = 14,
+ .paletteNum = 13,
+ .baseBlock = 0x4B,
+ }
+};
+static const struct WindowTemplate gUnknown_082F7BCC =
+{
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 5,
+ .width = 28,
+ .height = 7,
+ .paletteNum = 13,
+ .baseBlock = 0x4B,
+};
+static const struct WindowTemplate gUnknown_082F7BD4[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 8,
+ .width = 19,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 22,
+ .tilemapTop = 7,
+ .width = 6,
+ .height = 4,
+ .paletteNum = 13,
+ .baseBlock = 0x4C,
+ }
+};
+static const struct WindowTemplate gUnknown_082F7BE4 =
+{
+ .bg = 0,
+ .tilemapLeft = 4,
+ .tilemapTop = 6,
+ .width = 22,
+ .height = 5,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+};
+static const struct WindowTemplate gUnknown_082F7BEC =
+{
+ .bg = 0,
+ .tilemapLeft = 5,
+ .tilemapTop = 8,
+ .width = 19,
+ .height = 3,
+ .paletteNum = 13,
+ .baseBlock = 0x13,
+};
+
+// This is an unused copy of the tables from the top of the file. Feel free to remove.
+static const u8 sDuplicateArray[] =
+{
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0, 0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 2, 9,
+ 0, 0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0, 0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0, 0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0, 0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0, 0, 7,
+ 8, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0,
+ 1, 2, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 4, 5, 6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 5, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 6, 7, 2, 2, 3, 4, 0, 0, 0, 0, 0, 0,
+ 3, 4, 5, 5, 6, 7, 7, 8, 1, 1, 2, 3, 0, 0, 0, 4, 5, 6, 6, 7, 8, 8, 9, 0, 0, 1, 2, 2, 3, 4, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 1,
+ 2, 1, 2, 3, 2, 3, 0, 0, 0, 0, 4, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 0, 0, 0, 0, 9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9, 9,
+ 9, 9, 0, 0, 1, 1, 0, 9, 9, 9, 9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9, 9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9, 3, 3, 4, 4, 0, 0, 1, 1,
+ 2, 2, 3, 5, 0, 0, 0, 0, 4, 6, 0, 0, 0, 3, 5, 7, 0, 0, 2, 4, 6, 8, 0, 1, 3, 5, 6, 9
+};
+
+static const u16 gDodrioBerryBgPal1[] = INCBIN_U16("graphics/link_games/dodrioberry_bg1.gbapal",
+ "graphics/link_games/dodrioberry_bg2.gbapal");
+static const u16 gDodrioBerryPkmnPal[] = INCBIN_U16("graphics/link_games/dodrioberry_pkmn.gbapal");
+static const u16 gDodrioBerryShinyPal[] = INCBIN_U16("graphics/link_games/dodrioberry_shiny.gbapal");
+static const u16 gDodrioBerryStatusPal[] = INCBIN_U16("graphics/link_games/dodrioberry_status.gbapal");
+static const u16 gDodrioBerrySpritesPal[] = INCBIN_U16("graphics/link_games/dodrioberry_berrysprites.gbapal");
+static const u32 gDodrioBerrySpritesGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_berrysprites.4bpp.lz");
+static const u16 gDodrioBerryPlatformPal[] = INCBIN_U16("graphics/link_games/dodrioberry_platform.gbapal");
+static const u32 gDodrioBerryBgGfx1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.4bpp.lz");
+static const u32 gDodrioBerryBgGfx2[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2.4bpp.lz");
+static const u32 gDodrioBerryStatusGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_status.4bpp.lz");
+static const u32 gDodrioBerryPlatformGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_platform.4bpp.lz");
+static const u32 gDodrioBerryPkmnGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_pkmn.4bpp.lz");
+static const u32 gDodrioBerryBgTilemap1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.bin.lz");
+static const u32 gDodrioBerryBgTilemap2Right[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2right.bin.lz");
+static const u32 gDodrioBerryBgTilemap2Left[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2left.bin.lz");
+
+static const struct OamData sOamData_82FB1E0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_82FB1E8 =
+{
+ .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 OamData sOamData_82FB1F0 =
+{
+ .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 struct OamData sOamData_82FB1F8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_82FB200[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB208[] =
+{
+ ANIMCMD_FRAME(64, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB210[] =
+{
+ ANIMCMD_FRAME(128, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB218[] =
+{
+ ANIMCMD_FRAME(192, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB220[] =
+{
+ ANIMCMD_FRAME(256, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FB228[] =
+{
+ sSpriteAnim_82FB200,
+ sSpriteAnim_82FB208,
+ sSpriteAnim_82FB210,
+ sSpriteAnim_82FB218,
+ sSpriteAnim_82FB220
+};
+
+static const union AnimCmd sSpriteAnim_82FB23C[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB244[] =
+{
+ ANIMCMD_FRAME(4, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB24C[] =
+{
+ ANIMCMD_FRAME(8, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FB254[] =
+{
+ sSpriteAnim_82FB23C,
+ sSpriteAnim_82FB244,
+ sSpriteAnim_82FB24C
+};
+
+static const union AnimCmd sSpriteAnim_82FB260[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB268[] =
+{
+ ANIMCMD_FRAME(4, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB270[] =
+{
+ ANIMCMD_FRAME(8, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB278[] =
+{
+ ANIMCMD_FRAME(12, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB280[] =
+{
+ ANIMCMD_FRAME(16, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB288[] =
+{
+ ANIMCMD_FRAME(20, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB290[] =
+{
+ ANIMCMD_FRAME(24, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB298[] =
+{
+ ANIMCMD_FRAME(28, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sSpriteAnim_82FB2A0[] =
+{
+ ANIMCMD_FRAME(32, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FB2A8[] =
+{
+ sSpriteAnim_82FB260,
+ sSpriteAnim_82FB268,
+ sSpriteAnim_82FB270,
+ sSpriteAnim_82FB278,
+ sSpriteAnim_82FB280,
+ sSpriteAnim_82FB288,
+ sSpriteAnim_82FB290,
+ sSpriteAnim_82FB298,
+ sSpriteAnim_82FB2A0
+};
+
+static const union AnimCmd sSpriteAnim_82FB2CC[] =
+{
+ ANIMCMD_FRAME(0, 20),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FB2D4[] =
+{
+ sSpriteAnim_82FB2CC
+};
+
+static void sub_80283A8(void)
+{
+ void *ptr = AllocZeroed(0x3000);
+ struct SpritePalette pal1 = {gDodrioBerryPkmnPal, 0};
+ struct SpritePalette pal2 = {gDodrioBerryShinyPal, 1};
+
+ LZ77UnCompWram(gDodrioBerryPkmnGfx, ptr);
+ // This check should be one line up.
+ if (ptr != NULL)
+ {
+ struct SpriteSheet sheet = {ptr, 0x3000, 0};
+ LoadSpriteSheet(&sheet);
+ Free(ptr);
+ }
+ LoadSpritePalette(&pal1);
+ LoadSpritePalette(&pal2);
+}
+
+static void sub_8028408(struct DodrioSubstruct_318C *arg0, u8 arg1, u8 id, u8 arg3)
+{
+ struct SpriteTemplate sprTemplate =
+ {
+ .tileTag = 0,
+ .paletteTag = arg0->isShiny,
+ .oam = &sOamData_82FB1E0,
+ .anims = sSpriteAnimTable_82FB228,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80284A8,
+ };
+
+ gUnknown_02022C9C[id] = AllocZeroed(4);
+ *gUnknown_02022C9C[id] = CreateSprite(&sprTemplate, sub_8028F14(arg1, arg3), 136, 3);
+ sub_8028654(TRUE, id);
+}
+
+static void sub_80284A8(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ break;
+ case 1:
+ sub_802853C(sprite);
+ break;
+ case 2:
+ sub_80285AC(sprite);
+ break;
+ }
+}
+
+static void sub_80284CC(u8 unused)
+{
+ struct Sprite *sprite = &gSprites[*gUnknown_02022C9C[GetMultiplayerId()]];
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+}
+
+static void sub_8028504(u8 unused)
+{
+ struct Sprite *sprite = &gSprites[*gUnknown_02022C9C[GetMultiplayerId()]];
+ sprite->data[0] = 2;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+}
+
+static u32 sub_802853C(struct Sprite *sprite)
+{
+ s8 var;
+ u8 mod = (++sprite->data[1] / 2) % 4;
+
+ if (sprite->data[1] >= 3)
+ {
+ switch (mod)
+ {
+ default:
+ var = 1;
+ break;
+ case 1:
+ case 2:
+ var = -1;
+ break;
+ }
+
+ sprite->pos1.x += var;
+ if (++sprite->data[1] >= 40)
+ {
+ sprite->data[0] = 0;
+ sprite->pos1.x = sub_8028F14(0, sub_8027650());
+ }
+ }
+
+ return 0;
+}
+
+static u32 sub_80285AC(struct Sprite *sprite)
+{
+ u8 mod = (++sprite->data[1] / 13) % 4;
+
+ if (sprite->data[1] % 13 == 0 && mod != 0)
+ PlaySE(SE_W204);
+ if (sprite->data[1] >= 104)
+ {
+ sprite->data[0] = 0;
+ mod = 0;
+ }
+ sub_80286B4(GetMultiplayerId(), mod);
+ return 0;
+}
+
+static void sub_8028614(u8 count)
+{
+ u8 i;
+ for (i = 0; i < count; i++)
+ {
+ struct Sprite *sprite = &gSprites[*gUnknown_02022C9C[i]];
+ if (sprite != NULL)
+ DestroySpriteAndFreeResources(sprite);
+ // Memory should be freed here but is not.
+ }
+}
+
+static void sub_8028654(bool8 invisible, u8 id)
+{
+ gSprites[*gUnknown_02022C9C[id]].invisible = invisible;
+}
+
+static void sub_802868C(bool8 invisible, u8 count)
+{
+ u8 i;
+ for (i = 0; i < count; i++)
+ sub_8028654(invisible, i);
+}
+
+static void sub_80286B4(u8 id, u8 frameNum)
+{
+ StartSpriteAnim(&gSprites[*gUnknown_02022C9C[id]], frameNum);
+}
+
+static void nullsub_15(struct Sprite *sprite)
+{
+
+}
+
+static void sub_80286E4(void)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ {
+ struct Sprite *sprite = &gSprites[gUnknown_02022CF4->unk2A[i]];
+ sprite->pos1.x = (i * 16) + 48;
+ sprite->pos1.y = -8 - (i * 8);
+ gUnknown_02022CF4->unkC[i] = 0;
+ }
+}
+
+static void sub_8028734(void)
+{
+ u8 i;
+ void *ptr = AllocZeroed(0x180);
+ struct SpritePalette spPal = {gDodrioBerryStatusPal, 2};
+
+ LZ77UnCompWram(gDodrioBerryStatusGfx, ptr);
+ // This check should be one line up.
+ if (ptr != NULL)
+ {
+ struct SpriteSheet spSheet = {ptr, 0x180, 1};
+ struct SpriteTemplate spTemplate =
+ {
+ .tileTag = 1,
+ .paletteTag = 2,
+ .oam = &sOamData_82FB1E8,
+ .anims = sSpriteAnimTable_82FB254,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = nullsub_15,
+ };
+
+ gUnknown_02022CF4 = AllocZeroed(sizeof(*gUnknown_02022CF4));
+ LoadSpriteSheet(&spSheet);
+ LoadSpritePalette(&spPal);
+ for (i = 0; i < 10; i++)
+ gUnknown_02022CF4->unk2A[i] = CreateSprite(&spTemplate, (i * 16) + 48, -8 - (i * 8), 0);
+ }
+
+ Free(ptr);
+}
+
+static void sub_80287E4(void)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ {
+ struct Sprite *sprite = &gSprites[gUnknown_02022CF4->unk2A[i]];
+ if (sprite != NULL)
+ DestroySpriteAndFreeResources(sprite);
+ }
+ FREE_AND_SET_NULL(gUnknown_02022CF4);
+}
+
+static bool32 sub_8028828(void)
+{
+ u8 i;
+ bool32 r3 = FALSE;
+ for (i = 0; i < 10; i++)
+ {
+ struct Sprite *sprite = &gSprites[gUnknown_02022CF4->unk2A[i]];
+ gUnknown_02022CF4->unk16[i] = 2;
+ if (gUnknown_02022CF4->unkC[i] != 0 && sprite->pos1.y == 8)
+ continue;
+ r3 = TRUE;
+ if (sprite->pos1.y == 8)
+ {
+ if (gUnknown_02022CF4->unkC[i] != 0)
+ continue;
+ gUnknown_02022CF4->unkC[i] = 1;
+ gUnknown_02022CF4->unk16[i] = -16;
+ PlaySE(SE_TK_KASYA);
+ }
+ sprite->pos1.y += gUnknown_02022CF4->unk16[i];
+ }
+
+ if (r3)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static void sub_80288D4(u8 arg0)
+{
+ u8 i;
+
+ if (arg0 > 10)
+ {
+ for (i = 0; i < 10; i++)
+ StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 1);
+ }
+ else
+ {
+ for (i = 0; i < 10 - arg0; i++)
+ {
+ if (arg0 > 6)
+ {
+ gUnknown_02022CF4->unk3E += arg0 - 6;
+ if (gUnknown_02022CF4->unk3E > 30)
+ gUnknown_02022CF4->unk3E = 0;
+ else if (gUnknown_02022CF4->unk3E > 10)
+ StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 2);
+ else
+ StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 0);
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 0);
+ }
+ }
+ for (; i < 10; i++)
+ StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 1);
+ }
+}
+
+static void sub_80289E8(bool8 invisible)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ gSprites[gUnknown_02022CF4->unk2A[i]].invisible = invisible;
+}
+
+// Unknown unused data, feel free to remove.
+static const u8 sUnused2[] = {0xD4, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0xFB, 0x0, 0x0};
+
+static void sub_8028A34(void)
+{
+ void *ptr = AllocZeroed(0x480);
+ struct SpritePalette sprPal = {gDodrioBerrySpritesPal, 3};
+
+ LZ77UnCompWram(gDodrioBerrySpritesGfx, ptr);
+ if (ptr != NULL)
+ {
+ struct SpriteSheet sprSheet = {ptr, 0x480, 2};
+ LoadSpriteSheet(&sprSheet);
+ }
+
+ LoadSpritePalette(&sprPal);
+ Free(ptr);
+}
+
+static const s16 gUnknown_082FB31C[] = {88, 128, 168, 208};
+
+static void sub_8028A88(void)
+{
+ u8 i;
+ s16 x;
+
+ struct SpriteTemplate sprTemplate1 =
+ {
+ .tileTag = 2,
+ .paletteTag = 3,
+ .oam = &sOamData_82FB1F0,
+ .anims = sSpriteAnimTable_82FB2A8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ };
+ struct SpriteTemplate sprTemplate2 =
+ {
+ .tileTag = 2,
+ .paletteTag = 3,
+ .oam = &sOamData_82FB1E8,
+ .anims = sSpriteAnimTable_82FB2A8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ };
+
+ for (i = 0; i < 11; i++)
+ {
+ gUnknown_02022CB8[i] = AllocZeroed(4);
+ x = i * 16;
+ *gUnknown_02022CB8[i] = CreateSprite(&sprTemplate1, x + (i * 8), 8, 1);
+ sub_8028BF8(i, TRUE);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_02022CE4[i] = AllocZeroed(4);
+ if (i == 3)
+ *gUnknown_02022CE4[i] = CreateSprite(&sprTemplate2, gUnknown_082FB31C[i], 49, 0);
+ else
+ *gUnknown_02022CE4[i] = CreateSprite(&sprTemplate2, gUnknown_082FB31C[i], 52, 0);
+ StartSpriteAnim(&gSprites[*gUnknown_02022CE4[i]], i);
+ }
+
+ sub_8028C30(TRUE);
+}
+
+static void sub_8028B80(void)
+{
+ struct Sprite *sprite;
+ u8 i;
+
+ for (i = 0; i < 11; i++)
+ {
+ sprite = &gSprites[*gUnknown_02022CB8[i]];
+ if (sprite != NULL)
+ DestroySprite(sprite);
+ FREE_AND_SET_NULL(gUnknown_02022CB8[i]);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ sprite = &gSprites[*gUnknown_02022CE4[i]];
+ if (sprite != NULL)
+ DestroySprite(sprite);
+ FREE_AND_SET_NULL(gUnknown_02022CE4[i]);
+ }
+}
+
+static void sub_8028BF8(u8 id, bool8 invisible)
+{
+ gSprites[*gUnknown_02022CB8[id]].invisible = invisible;
+}
+
+static void sub_8028C30(bool8 invisible)
+{
+ u8 i;
+ for (i = 0; i < 4; i++)
+ gSprites[*gUnknown_02022CE4[i]].invisible = invisible;
+}
+
+static void sub_8028C7C(u8 id, u8 y)
+{
+ gSprites[*gUnknown_02022CB8[id]].pos1.y = y * 8;
+}
+
+static void sub_8028CA4(u16 id, u8 frameNum)
+{
+ StartSpriteAnim(&gSprites[*gUnknown_02022CB8[id]], frameNum);
+}
+
+// Unused
+static void sub_8028CD0(u8 spriteId)
+{
+ gSprites[spriteId].pos1.x = 20 * spriteId + 50;
+ gSprites[spriteId].pos1.y = 50;
+}
+
+// Gamefreak made a mistake there and goes out of bounds for the data array as it holds 8 elements
+// in turn overwriting sprite's subpriority and subsprites fields.
+#if defined(NONMATCHING) || MODERN
+ #define sKeepPosX data[1]
+#else
+ #define sKeepPosX data[10]
#endif // NONMATCHING
+
+static void sub_8028CF4(struct Sprite *sprite)
+{
+ u8 i;
+ static const u8 array[] = {30, 20};
+
+ if (sprite->sKeepPosX != TRUE)
+ {
+ for (i = 0; i < 2; i++)
+ {
+ if (++gUnknown_02022CB0[i][1] > array[i])
+ {
+ sprite->pos1.x--;
+ gUnknown_02022CB0[i][1] = 0;
+ }
+ }
+ }
+}
+
+static const s16 gUnknown_082FB356[][2] = {{230, 55}, {30, 74}};
+
+static void sub_8028D44(void)
+{
+ u8 i;
+ void *ptr = AllocZeroed(0x400);
+ struct SpritePalette sprPal = {gDodrioBerryPlatformPal, 6};
+
+ LZ77UnCompWram(gDodrioBerryPlatformGfx, ptr);
+ if (ptr != NULL)
+ {
+ struct SpriteSheet sprSheet = {ptr, 0x400, 5};
+ struct SpriteTemplate sprTemplate =
+ {
+ .tileTag = 5,
+ .paletteTag = 6,
+ .oam = &sOamData_82FB1F8,
+ .anims = sSpriteAnimTable_82FB2D4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8028CF4,
+ };
+
+ LoadSpriteSheet(&sprSheet);
+ LoadSpritePalette(&sprPal);
+ for (i = 0; i < 2; i++)
+ {
+ gUnknown_02022CB0[i] = AllocZeroed(4);
+ *gUnknown_02022CB0[i] = CreateSprite(&sprTemplate, gUnknown_082FB356[i][0], gUnknown_082FB356[i][1], 4);
+ }
+ }
+
+ Free(ptr);
+}
+
+static void sub_8028DFC(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ struct Sprite *sprite = &gSprites[*gUnknown_02022CB0[i]];
+ sprite->sKeepPosX = TRUE;
+ sprite->pos1.x = gUnknown_082FB356[i][0];
+ sprite->pos1.y = gUnknown_082FB356[i][1];
+ }
+}
+
+static void sub_8028E4C(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ struct Sprite *sprite = &gSprites[*gUnknown_02022CB0[i]];
+ sprite->sKeepPosX = FALSE;
+ }
+}
+
+static void sub_8028E84(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ struct Sprite *sprite = &gSprites[*gUnknown_02022CB0[i]];
+ if (sprite)
+ DestroySprite(sprite);
+ FREE_AND_SET_NULL(gUnknown_02022CB0[i]);
+ }
+}
+
+static void sub_8028EC8(bool8 invisible)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ gSprites[*gUnknown_02022CB0[i]].invisible = invisible;
+}
+
+#undef sKeepPosX
+
+static s16 sub_8028F14(u8 arg0, u8 arg1)
+{
+ s16 x = 0;
+ switch (arg1)
+ {
+ case 1:
+ x = 15;
+ break;
+ case 2:
+ switch (arg0)
+ {
+ case 0: x = 12; break;
+ case 1: x = 18; break;
+ }
+ break;
+ case 3:
+ switch (arg0)
+ {
+ case 0: x = 15; break;
+ case 1: x = 21; break;
+ case 2: x = 9; break;
+ }
+ break;
+ case 4:
+ switch (arg0)
+ {
+ case 0: x = 12; break;
+ case 1: x = 18; break;
+ case 2: x = 24; break;
+ case 3: x = 6; break;
+ }
+ break;
+ case 5:
+ switch (arg0)
+ {
+ case 0: x = 15; break;
+ case 1: x = 21; break;
+ case 2: x = 27; break;
+ case 3: x = 3; break;
+ case 4: x = 9; break;
+ }
+ break;
+ }
+
+ return x * 8;
+}
+
+static void sub_8028FCC(void)
+{
+ u8 i;
+ for (i = 0; i < 11; i++)
+ {
+ sub_8028BF8(i, TRUE);
+ sub_8028C7C(i, 1);
+ }
+ sub_80289E8(FALSE);
+}
+
+static void sub_8028FF8(u8 frameId)
+{
+ LoadBgTiles(0, GetWindowFrameTilesPal(frameId)->tiles, 0x120, 1);
+ LoadPalette(GetWindowFrameTilesPal(frameId)->pal, 0xA0, 0x20);
+}
+
+static void sub_802902C(void)
+{
+ LoadUserWindowBorderGfx_(0, 0xA, 0xB0);
+}
+
+static void sub_802903C(void)
+{
+ gUnknown_02022CF8->finished = FALSE;
+ gUnknown_02022CF8->state = 0;
+ gUnknown_02022CF8->unk3018 = 0;
+ gUnknown_02022CF8->unk3020 = 0;
+ gUnknown_02022CF8->unk3024 = 0;
+}
+
+static void sub_8029074(const struct WindowTemplate *winTempl)
+{
+ u8 pal = 0xA;
+
+ FillBgTilemapBufferRect(0, 1, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 2, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 3, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 4, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 6, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 7, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 8, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 9, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+}
+
+static void sub_8029174(const struct WindowTemplate *winTempl)
+{
+ u8 pal = 0xB;
+
+ FillBgTilemapBufferRect(0, 10, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 11, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 12, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 13, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 15, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal);
+ FillBgTilemapBufferRect(0, 16, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+ FillBgTilemapBufferRect(0, 17, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal);
+ FillBgTilemapBufferRect(0, 18, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal);
+}
+
+static void sub_8029274(struct DodrioSubstruct_0160 *ptr)
+{
+ gUnknown_02022CF8 = ptr;
+ gUnknown_02022CF8->finished = FALSE;
+ gUnknown_02022CF8->state = 0;
+ gUnknown_02022CF8->unk3018 = 0;
+ gUnknown_02022CF8->unk3020 = 0;
+ gUnknown_02022CF8->unk3024 = 0;
+ gUnknown_02022CF8->unk3004 = CreateTask(sub_8029314, 3);
+ sub_802A72C(sub_8029338);
+}
+
+static void sub_80292D4(void)
+{
+ FreeAllWindowBuffers();
+}
+
+// Data used by functions below.
+struct WinCoords
+{
+ u8 left;
+ u8 top;
+};
+
+static const u8 gUnknown_082FB380[][3] =
+{
+ {1, 2, 3},
+ {1, 4, 5},
+ {1, 8, 9},
+ {1, 6, 7},
+};
+
+static const struct WinCoords gUnknown_082FB38C[] = {{12, 6}};
+static const struct WinCoords gUnknown_082FB390[] = {{9, 10}, {15, 6}};
+static const struct WinCoords gUnknown_082FB398[] = {{12, 6}, {18, 10}, {6, 10}};
+static const struct WinCoords gUnknown_082FB3A4[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}};
+static const struct WinCoords gUnknown_082FB3B4[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}};
+
+static const struct WinCoords *const gUnknown_082FB3C8[] =
+{
+ gUnknown_082FB38C,
+ gUnknown_082FB390,
+ gUnknown_082FB398,
+ gUnknown_082FB3A4,
+ gUnknown_082FB3B4,
+};
+
+static const u8 *const gUnknown_082FB3DC[] =
+{
+ gText_1Colon,
+ gText_2Colon,
+ gText_3Colon,
+ gText_4Colon,
+ gText_5Colon,
+};
+
+static const u16 gUnknown_082FB3F0[] = {92, 132, 172, 212};
+static const u16 gUnknown_082FB3F8[] = {33, 49, 65, 81, 97};
+static const u16 gUnknown_082FB402[] = {17, 33, 49, 65, 81};
+
+struct
+{
+ u8 id;
+ void (*func)(void);
+} const gUnknown_082FB40C[] =
+{
+ {0, sub_8029338},
+ {1, sub_8029440},
+ {2, sub_802988C},
+ {3, sub_802A010},
+ {4, sub_802A380},
+ {5, sub_802A454},
+ {6, sub_802A534},
+ {7, sub_802A588},
+ {8, sub_802A6FC},
+ {9, nullsub_16},
+};
+
+static void sub_80292E0(u8 arg0)
+{
+ u8 i;
+ for (i = 0; i < 10; i++)
+ {
+ if (gUnknown_082FB40C[i].id == arg0)
+ sub_802A72C(gUnknown_082FB40C[i].func);
+ }
+}
+
+static void sub_8029314(u8 taskId)
+{
+ if (!gUnknown_02022CF8->finished)
+ sub_802A75C()();
+}
+
+static void sub_8029338(void)
+{
+ switch (gUnknown_02022CF8->state)
+ {
+ case 0:
+ sub_802A7A8();
+ gUnknown_02022CF8->state++;
+ break;
+ case 1:
+ if (sub_802A8E8() == TRUE)
+ gUnknown_02022CF8->state++;
+ break;
+ case 2:
+ CopyToBgTilemapBuffer(3, gDodrioBerryBgTilemap1, 0, 0);
+ CopyToBgTilemapBuffer(1, gDodrioBerryBgTilemap2Left, 0, 0);
+ CopyToBgTilemapBuffer(2, gDodrioBerryBgTilemap2Right, 0, 0);
+ CopyBgTilemapBufferToVram(3);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 3:
+ ShowBg(0);
+ ShowBg(3);
+ ShowBg(1);
+ ShowBg(2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 4:
+ sub_8028FF8(gSaveBlock2Ptr->optionsWindowFrameType);
+ sub_802902C();
+ gUnknown_02022CF8->state++;
+ break;
+ default:
+ gUnknown_02022CF8->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_8029440(void)
+{
+ u8 i, playersCount, id, colorsId, *name;
+ u32 left;
+ struct WindowTemplate window;
+ const struct WinCoords *ptr;
+
+ switch (gUnknown_02022CF8->state)
+ {
+ case 0:
+ playersCount = sub_8027650();
+ ptr = gUnknown_082FB3C8[playersCount - 1];
+ window.bg = 0;
+ window.width = 7;
+ window.height = 2;
+ window.paletteNum = 0xD;
+ window.baseBlock = 0x13;
+ for (i = 0; i < playersCount; ptr++, i++)
+ {
+ colorsId = 0;
+ id = sub_8027A48(i);
+ left = (56 - GetStringWidth(1, sub_8027660(id), -1)) / 2u;
+ window.tilemapLeft = ptr->left;
+ window.tilemapTop = ptr->top;
+ gUnknown_02022CF8->unk3008[i] = AddWindow(&window);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[i]);
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[i], PIXEL_FILL(1));
+ if (id == GetMultiplayerId())
+ colorsId = 2;
+ name = sub_8027660(id);
+ AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[i], 1, left, 1, gUnknown_082FB380[colorsId], -1, name);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[i], 2);
+ window.baseBlock += 0xE;
+ sub_8029174(&window);
+ }
+ gUnknown_02022CF8->state++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ playersCount = sub_8027650();
+ for (i = 0; i < playersCount; i++)
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[i]);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->state++;
+ }
+ break;
+ default:
+ if (++gUnknown_02022CF8->state > 180)
+ {
+ playersCount = sub_8027650();
+ for (i = 0; i < playersCount; i++)
+ {
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[i]);
+ RemoveWindow(gUnknown_02022CF8->unk3008[i]);
+ }
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->finished = TRUE;
+ }
+ break;
+ }
+}
+
+static void sub_80296A8(u8 playersCount_)
+{
+ u8 i, r8 = 0, r6 = 0;
+ u8 playersCount = playersCount_; // Pointless variable, I know, but it's needed to match.
+ u8 *name;
+ u32 x, numWidth;
+ u8 numString[32];
+ u8 array[5] = {0, 1, 2, 3, 4};
+ struct DodrioSubstruct_3308 temp, structArray[5];
+
+ for (i = 0; i < playersCount; i++)
+ {
+ array[i] = i;
+ sub_802793C(&temp, i);
+ structArray[i] = temp;
+ }
+
+ if (sub_8027748() != 0)
+ {
+ do
+ {
+ for (i = 0; i < playersCount; i++)
+ {
+ if (structArray[i].unk0 == r8)
+ {
+ array[r6] = i;
+ r6++;
+ }
+ }
+ r8 = r6;
+ } while (r6 < playersCount);
+ }
+
+ for (i = 0; i < playersCount; i++)
+ {
+ if (structArray[i].unk4 == 0)
+ structArray[i].unk0 = playersCount - 1;
+ }
+
+ x = 216 - GetStringWidth(1, gText_SpacePoints, 0);
+ for (i = 0; i < playersCount; i++)
+ {
+ u8 colorsId = 0;
+ u8 id = array[i];
+ u32 points = structArray[id].unk4;
+
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gUnknown_082FB3DC[structArray[id].unk0], 8, gUnknown_082FB402[i], -1, NULL);
+ if (id == GetMultiplayerId())
+ colorsId = 2;
+ name = sub_8027660(id);
+ AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[1], 1, 28, gUnknown_082FB402[i], gUnknown_082FB380[colorsId], -1, name);
+ ConvertIntToDecimalStringN(numString, points, STR_CONV_MODE_LEFT_ALIGN, 7);
+ numWidth = GetStringWidth(1, numString, -1);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, numString, x - numWidth, gUnknown_082FB402[i], -1, NULL);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_SpacePoints, x, gUnknown_082FB402[i], -1, NULL);
+ }
+}
+
+static void sub_802988C(void)
+{
+ u8 i, j, itemGiveRet, playersCount = sub_8027650();
+ u8 *name;
+ u32 strWidth, x;
+
+ switch (gUnknown_02022CF8->state)
+ {
+ case 0:
+ sub_802784C();
+ gUnknown_02022CF8->unk301C = 0;
+ gUnknown_02022CF8->state++;
+ break;
+ case 1:
+ gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BBC[0]);
+ gUnknown_02022CF8->unk3008[1] = AddWindow(&gUnknown_082F7BBC[1]);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ sub_8029174(&gUnknown_082F7BBC[0]);
+ sub_8029174(&gUnknown_082F7BBC[1]);
+ gUnknown_02022CF8->state++;
+ break;
+ case 2:
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1));
+ strWidth = GetStringWidth(1, gText_BerryPickingResults, -1);
+ x = (224 - strWidth) / 2;
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_BerryPickingResults, x, 1, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_10P30P50P50P, 68, 17, -1, NULL);
+ for (i = 0; i < playersCount; i++)
+ {
+ u8 colorsId = 0;
+ if (i == GetMultiplayerId())
+ colorsId = 2;
+
+ name = sub_8027660(i);
+ AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[1], 1, 0, gUnknown_082FB3F8[i], gUnknown_082FB380[colorsId], -1, name);
+ for (j = 0; j < 4; j++)
+ {
+ u32 width;
+ u16 result1 = Min(sub_80276A0(i, j), 9999);
+ u16 result2 = Min(sub_802778C(j), 9999);
+
+ ConvertIntToDecimalStringN(gStringVar4, result1, STR_CONV_MODE_LEFT_ALIGN, 4);
+ width = GetStringWidth(1, gStringVar4, -1);
+ if (result2 == result1 && result2 != 0)
+ AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[1], 1, gUnknown_082FB3F0[j] - width, gUnknown_082FB3F8[i], gUnknown_082FB380[1], -1, gStringVar4);
+ else
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gStringVar4, gUnknown_082FB3F0[j] - width, gUnknown_082FB3F8[i], -1, NULL);
+ }
+ }
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ sub_8028C30(FALSE);
+ gUnknown_02022CF8->state++;
+ break;
+ case 4:
+ if (++gUnknown_02022CF8->unk301C >= 30 && gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_02022CF8->unk301C = 0;
+ PlaySE(SE_SELECT);
+ sub_8028C30(TRUE);
+ gUnknown_02022CF8->state++;
+ }
+ break;
+ case 5:
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1));
+ strWidth = GetStringWidth(1, gText_AnnouncingRankings, -1);
+ x = (224 - strWidth) / 2;
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_AnnouncingRankings, x, 1, -1, NULL);
+ gUnknown_02022CF8->state++;
+ break;
+ case 6:
+ sub_80296A8(playersCount);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 7:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->state++;
+ break;
+ case 8:
+ if (++gUnknown_02022CF8->unk301C >= 30 && gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_02022CF8->unk301C = 0;
+ PlaySE(SE_SELECT);
+ if (sub_8027748() < 3000)
+ {
+ gUnknown_02022CF8->state = 127;
+ }
+ else
+ {
+ StopMapMusic();
+ gUnknown_02022CF8->state++;
+ }
+
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 5, 30, 15);
+ RemoveWindow(gUnknown_02022CF8->unk3008[1]);
+ gUnknown_02022CF8->unk3008[1] = AddWindow(&gUnknown_082F7BCC);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ sub_8029174(&gUnknown_082F7BCC);
+ }
+ break;
+ case 9:
+ PlayNewMapMusic(MUS_FANFA1);
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1));
+ strWidth = GetStringWidth(1, gText_AnnouncingPrizes, -1);
+ x = (224 - strWidth) / 2;
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_AnnouncingPrizes, x, 1, -1, NULL);
+ DynamicPlaceholderTextUtil_Reset();
+ CopyItemName(sub_802762C(), gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_FirstPlacePrize);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gStringVar4, 0, 1, -1, NULL);
+ itemGiveRet = sub_80279C8();
+ if (itemGiveRet != 0 && itemGiveRet != 3)
+ {
+ DynamicPlaceholderTextUtil_Reset();
+ CopyItemName(sub_802762C(), gStringVar1);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ if (itemGiveRet == 2)
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_CantHoldAnyMore);
+ else if (itemGiveRet == 1)
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_FilledStorageSpace);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gStringVar4, 0, 41, -1, NULL);
+ }
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 10:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ FadeOutAndFadeInNewMapMusic(MUS_RG_WIN_YASEI, 20, 10);
+ gUnknown_02022CF8->state++;
+ break;
+ case 11:
+ if (++gUnknown_02022CF8->unk301C >= 30 && gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_02022CF8->unk301C = 0;
+ PlaySE(SE_SELECT);
+ gUnknown_02022CF8->state++;
+ }
+ break;
+ default:
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ RemoveWindow(gUnknown_02022CF8->unk3008[0]);
+ RemoveWindow(gUnknown_02022CF8->unk3008[1]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_802A010(void)
+{
+ u8 y;
+
+ switch (gUnknown_02022CF8->state)
+ {
+ case 0:
+ gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BD4[0]);
+ gUnknown_02022CF8->unk3008[1] = AddWindow(&gUnknown_082F7BD4[1]);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ sub_8029174(&gUnknown_082F7BD4[0]);
+ sub_8029074(&gUnknown_082F7BD4[1]);
+ gUnknown_02022CF8->state++;
+ gUnknown_02022CF8->unk3020 = 0;
+ gUnknown_02022CF8->unk3024 = 0;
+ break;
+ case 1:
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1));
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_WantToPlayAgain, 0, 5, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_Yes, 8, 1, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_No, 8, 17, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_SelectorArrow2, 0, 1, -1, NULL);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ }
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->state++;
+ break;
+ case 3:
+ y = gUnknown_02022CF8->unk3020;
+ if (y == 0)
+ y = 1;
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_Yes, 8, 1, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_No, 8, 17, -1, NULL);
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_SelectorArrow2, 0, ((y - 1) * 16) + 1, -1, NULL);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 3);
+ // Increment state only if A or B button have been pressed.
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (gUnknown_02022CF8->unk3020 == 0)
+ gUnknown_02022CF8->unk3020 = 1;
+ gUnknown_02022CF8->state++;
+ }
+ else if (gMain.newKeys & (DPAD_UP | DPAD_DOWN))
+ {
+ PlaySE(SE_SELECT);
+ switch (gUnknown_02022CF8->unk3020)
+ {
+ case 0:
+ gUnknown_02022CF8->unk3020 = 2;
+ break;
+ case 1:
+ gUnknown_02022CF8->unk3020 = 2;
+ break;
+ case 2:
+ gUnknown_02022CF8->unk3020 = 1;
+ break;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_02022CF8->unk3020 = 2;
+ gUnknown_02022CF8->state++;
+ }
+ break;
+ default:
+ gUnknown_02022CF8->unk3024 = gUnknown_02022CF8->unk3020;
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]);
+ RemoveWindow(gUnknown_02022CF8->unk3008[0]);
+ RemoveWindow(gUnknown_02022CF8->unk3008[1]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_802A380(void)
+{
+ switch (gUnknown_02022CF8->state)
+ {
+ case 0:
+ DrawDialogueFrame(0, FALSE);
+ AddTextPrinterParameterized2(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3);
+ gUnknown_02022CF8->state++;
+ break;
+ case 1:
+ CopyWindowToVram(0, 3);
+ gUnknown_02022CF8->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ CreateTask(sub_8153688, 0);
+ gUnknown_02022CF8->state++;
+ }
+ break;
+ case 3:
+ if (!FuncIsActiveTask(sub_8153688))
+ gUnknown_02022CF8->state++;
+ break;
+ default:
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_802A454(void)
+{
+ switch (gUnknown_02022CF8->state)
+ {
+ case 0:
+ gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BEC);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ sub_8029174(&gUnknown_082F7BEC);
+ gUnknown_02022CF8->state++;
+ break;
+ case 1:
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_CommunicationStandby3, 0, 5, -1, NULL);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->state++;
+ break;
+ default:
+ gUnknown_02022CF8->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_802A534(void)
+{
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ RemoveWindow(gUnknown_02022CF8->unk3008[0]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->finished = TRUE;
+}
+
+static void sub_802A588(void)
+{
+ switch (gUnknown_02022CF8->state)
+ {
+ case 0:
+ gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BE4);
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ sub_8029174(&gUnknown_082F7BE4);
+ gUnknown_02022CF8->state++;
+ gUnknown_02022CF8->unk301C = 0;
+ gUnknown_02022CF8->unk3020 = 0;
+ gUnknown_02022CF8->unk3024 = 0;
+ break;
+ case 1:
+ FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1));
+ AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_SomeoneDroppedOut, 0, 5, -1, NULL);
+ CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2);
+ gUnknown_02022CF8->state++;
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ PutWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->state++;
+ break;
+ case 3:
+ if (++gUnknown_02022CF8->unk301C >= 120)
+ gUnknown_02022CF8->state++;
+ break;
+ default:
+ gUnknown_02022CF8->unk3024 = 5;
+ ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]);
+ RemoveWindow(gUnknown_02022CF8->unk3008[0]);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022CF8->finished = TRUE;
+ break;
+ }
+}
+
+static void sub_802A6FC(void)
+{
+ DestroyTask(gUnknown_02022CF8->unk3004);
+ gUnknown_02022CF8->finished = TRUE;
+}
+
+static void nullsub_16(void)
+{
+
+}
+
+static void sub_802A72C(void (*func)(void))
+{
+ gUnknown_02022CF8->state = 0;
+ gUnknown_02022CF8->finished = FALSE;
+ gUnknown_02022CF8->unk3028 = func;
+}
+
+static void (*sub_802A75C(void))(void)
+{
+ return gUnknown_02022CF8->unk3028;
+}
+
+static bool32 sub_802A770(void)
+{
+ if (gUnknown_02022CF8->finished == TRUE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static u8 sub_802A794(void)
+{
+ return gUnknown_02022CF8->unk3024;
+}
+
+static void sub_802A7A8(void)
+{
+ DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+ DmaClear32(3,(void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_082F7BA4, ARRAY_COUNT(gUnknown_082F7BA4));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ InitStandardTextBoxWindows();
+ sub_8197200();
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
+ SetBgTilemapBuffer(3, gUnknown_02022CF8->tilemapBuffers[0]);
+ SetBgTilemapBuffer(1, gUnknown_02022CF8->tilemapBuffers[1]);
+ SetBgTilemapBuffer(2, gUnknown_02022CF8->tilemapBuffers[2]);
+}
+
+static bool32 sub_802A8E8(void)
+{
+ switch (gUnknown_02022CF8->unk3018)
+ {
+ case 0:
+ LoadPalette(gDodrioBerryBgPal1, 0, sizeof(gDodrioBerryBgPal1));
+ break;
+ case 1:
+ reset_temp_tile_data_buffers();
+ break;
+ case 2:
+ decompress_and_copy_tile_data_to_vram(3, gDodrioBerryBgGfx1, 0, 0, 0);
+ break;
+ case 3:
+ decompress_and_copy_tile_data_to_vram(1, gDodrioBerryBgGfx2, 0, 0, 0);
+ break;
+ case 4:
+ if (free_temp_tile_data_buffers_if_possible() == TRUE)
+ return FALSE;
+ break;
+ case 5:
+ LoadPalette(stdpal_get(3), 0xD0, 0x20);
+ break;
+ default:
+ gUnknown_02022CF8->unk3018 = 0;
+ return TRUE;
+ }
+
+ gUnknown_02022CF8->unk3018++;
+ return FALSE;
+}
diff --git a/src/easy_chat.c b/src/easy_chat.c
index 93456631a..ba54de783 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -30,6 +30,7 @@
#include "constants/easy_chat.h"
#include "constants/event_objects.h"
#include "constants/flags.h"
+#include "constants/lilycove_lady.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/rgb.h"
@@ -240,6 +241,7 @@ struct Unk8597530
MainCallback callback;
};
+// Lilycove Quiz Lady
static const struct Unk8597530 sUnknown_08597530[] = {
{
.word = 26,
@@ -1305,15 +1307,15 @@ void ShowEasyChatScreen(void)
displayedPersonType = EASY_CHAT_PERSON_BOY;
break;
case EASY_CHAT_TYPE_QUIZ_ANSWER:
- words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016;
+ words = &gSaveBlock1Ptr->lilycoveLady.quiz.playerAnswer;
break;
case EASY_CHAT_TYPE_QUIZ_QUESTION:
return;
case EASY_CHAT_TYPE_QUIZ_SET_QUESTION:
- words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_002;
+ words = gSaveBlock1Ptr->lilycoveLady.quiz.question;
break;
case EASY_CHAT_TYPE_QUIZ_SET_ANSWER:
- words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014;
+ words = &gSaveBlock1Ptr->lilycoveLady.quiz.correctAnswer;
break;
case EASY_CHAT_TYPE_APPRENTICE:
words = gSaveBlock2Ptr->apprentices[0].easyChatWords;
@@ -1329,7 +1331,7 @@ void ShowEasyChatScreen(void)
DoEasyChatScreen(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript, displayedPersonType);
}
-static void sub_811A7E4(void)
+static void CB2_QuizLadyQuestion(void)
{
LilycoveLady *lilycoveLady;
@@ -1343,7 +1345,7 @@ static void sub_811A7E4(void)
if (!gPaletteFade.active)
{
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
- lilycoveLady->quiz.unk_016 = -1;
+ lilycoveLady->quiz.playerAnswer = -1;
CleanupOverworldWindowsAndTilemaps();
DoQuizQuestionEasyChatScreen();
}
@@ -1352,9 +1354,9 @@ static void sub_811A7E4(void)
gMain.state ++;
}
-void sub_811A858(void)
+void QuizLadyShowQuizQuestion(void)
{
- SetMainCallback2(sub_811A7E4);
+ SetMainCallback2(CB2_QuizLadyQuestion);
}
static int sub_811A868(u16 word)
@@ -1387,7 +1389,7 @@ static void DoQuizAnswerEasyChatScreen(void)
{
DoEasyChatScreen(
EASY_CHAT_TYPE_QUIZ_ANSWER,
- &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016,
+ &gSaveBlock1Ptr->lilycoveLady.quiz.playerAnswer,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -1395,7 +1397,7 @@ static void DoQuizAnswerEasyChatScreen(void)
static void DoQuizQuestionEasyChatScreen(void)
{
DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_QUESTION,
- gSaveBlock1Ptr->lilycoveLady.quiz.unk_002,
+ gSaveBlock1Ptr->lilycoveLady.quiz.question,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -1403,7 +1405,7 @@ static void DoQuizQuestionEasyChatScreen(void)
static void DoQuizSetAnswerEasyChatScreen(void)
{
DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_SET_ANSWER,
- &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014,
+ &gSaveBlock1Ptr->lilycoveLady.quiz.correctAnswer,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -1411,7 +1413,7 @@ static void DoQuizSetAnswerEasyChatScreen(void)
static void DoQuizSetQuestionEasyChatScreen(void)
{
DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_SET_QUESTION,
- gSaveBlock1Ptr->lilycoveLady.quiz.unk_002,
+ gSaveBlock1Ptr->lilycoveLady.quiz.question,
CB2_ReturnToFieldContinueScript,
EASY_CHAT_PERSON_DISPLAY_NONE);
}
@@ -2660,9 +2662,9 @@ static int sub_811BD64(void)
return sub_811BCF4();
saveBlock1 = gSaveBlock1Ptr;
- for (i = 0; i < 9; i++)
+ for (i = 0; i < QUIZ_QUESTION_LEN; i++)
{
- if (saveBlock1->lilycoveLady.quiz.unk_002[i] != 0xFFFF)
+ if (saveBlock1->lilycoveLady.quiz.question[i] != 0xFFFF)
return 0;
}
@@ -2676,7 +2678,7 @@ static int sub_811BDB0(void)
return sub_811BCF4();
quiz = &gSaveBlock1Ptr->lilycoveLady.quiz;
- return quiz->unk_014 == 0xFFFF ? 1 : 0;
+ return quiz->correctAnswer == 0xFFFF ? 1 : 0;
}
static void sub_811BDF0(u8 *arg0)
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index 605cd0366..5e16f1479 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -73,7 +73,7 @@ static void CreateRandomEggShardSprite(void);
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex);
// IWRAM bss
-static IWRAM_DATA struct EggHatchData *sEggHatchData;
+static struct EggHatchData *sEggHatchData;
// rom data
static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/egg/normal.gbapal");
@@ -322,7 +322,7 @@ static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
pokerus = GetMonData(egg, MON_DATA_POKERUS);
obedience = GetMonData(egg, MON_DATA_OBEDIENCE);
- CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, 0, 0);
+ CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, OT_ID_PLAYER_ID, 0);
for (i = 0; i < 4; i++)
{
diff --git a/src/electric.c b/src/electric.c
index 5e7729842..4b93119dc 100644
--- a/src/electric.c
+++ b/src/electric.c
@@ -667,9 +667,9 @@ static void sub_810A75C(struct Sprite *sprite)
sprite->oam.tileNum += gBattleAnimArgs[3] * 4;
if (gBattleAnimArgs[3] == 1)
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
else if (gBattleAnimArgs[3] == 2)
- sprite->oam.matrixNum = 16;
+ sprite->oam.matrixNum = ST_OAM_VFLIP;
sprite->data[0] = gBattleAnimArgs[2];
sprite->callback = WaitAnimForDuration;
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c
index cd64afe0e..11aaaafe7 100755
--- a/src/ereader_helpers.c
+++ b/src/ereader_helpers.c
@@ -26,17 +26,17 @@ static void sub_81D414C(void);
static void sub_81D3F1C(u32, u32*, u32*);
static void sub_81D3F68(void);
-IWRAM_DATA struct Unknown030012C8 gUnknown_030012C8;
-IWRAM_DATA u16 gUnknown_030012E0;
-IWRAM_DATA u16 gUnknown_030012E2;
-IWRAM_DATA u16 gUnknown_030012E4;
-IWRAM_DATA u16 gUnknown_030012E6;
-IWRAM_DATA u32 gUnknown_030012E8;
-IWRAM_DATA u16 gUnknown_030012EC;
-IWRAM_DATA u16 gUnknown_030012EE;
-IWRAM_DATA u16 gUnknown_030012F0;
-IWRAM_DATA u16 gUnknown_030012F2;
-IWRAM_DATA u16 gUnknown_030012F4;
+static struct Unknown030012C8 gUnknown_030012C8;
+static u16 gUnknown_030012E0;
+static u16 gUnknown_030012E2;
+static u16 gUnknown_030012E4;
+static u16 gUnknown_030012E6;
+static u32 gUnknown_030012E8;
+static u16 gUnknown_030012EC;
+static u16 gUnknown_030012EE;
+static u16 gUnknown_030012F0;
+static u16 gUnknown_030012F2;
+static u16 gUnknown_030012F4;
extern const u8 gUnknown_08625B6C[][0x148];
diff --git a/src/ereader_screen.c b/src/ereader_screen.c
index f74efa32b..98f0d9b8c 100755
--- a/src/ereader_screen.c
+++ b/src/ereader_screen.c
@@ -38,7 +38,7 @@ struct Unk03006370
static void sub_81D5084(u8);
-extern struct Unk03006370 gUnknown_03006370;
+struct Unk03006370 gUnknown_03006370;
extern const u8 gUnknown_089A3470[];
extern const u8 gMultiBootProgram_BerryGlitchFix_Start[];
diff --git a/src/field_camera.c b/src/field_camera.c
index b976cf2ff..7f294afdb 100644
--- a/src/field_camera.c
+++ b/src/field_camera.c
@@ -36,11 +36,11 @@ static void DrawMetatile(s32 a, u16 *b, u16 c);
static void CameraPanningCB_PanAhead(void);
// IWRAM bss vars
-static IWRAM_DATA struct FieldCameraOffset sFieldCameraOffset;
-static IWRAM_DATA s16 sHorizontalCameraPan;
-static IWRAM_DATA s16 sVerticalCameraPan;
-static IWRAM_DATA u8 gUnknown_03000E2C;
-static IWRAM_DATA void (*sFieldCameraPanningCallback)(void);
+static struct FieldCameraOffset sFieldCameraOffset;
+static s16 sHorizontalCameraPan;
+static s16 sVerticalCameraPan;
+static u8 gUnknown_03000E2C;
+static void (*sFieldCameraPanningCallback)(void);
struct CameraObject gFieldCamera;
u16 gTotalCameraPixelOffsetY;
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index 455c38deb..8a41087f5 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -304,7 +304,7 @@ static const u8 *GetInteractedEventObjectScript(struct MapPosition *position, u8
gSpecialVar_Facing = direction;
if (InTrainerHill() == TRUE)
- script = sub_81D62AC();
+ script = GetTrainerHillTrainerScript();
else
script = GetEventObjectScriptPointerByEventObjectId(eventObjectId);
diff --git a/src/field_effect.c b/src/field_effect.c
index 22bf44f28..7569bdc75 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -232,7 +232,7 @@ static void Fldeff_MoveDeoxysRock_Step(u8 taskId);
// Static RAM declarations
-static IWRAM_DATA u8 sActiveList[32];
+static u8 sActiveList[32];
// External declarations
extern struct CompressedSpritePalette gMonPaletteTable[]; // GF made a mistake and did not extern it as const.
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index b322fc1c7..6d62cdc4a 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -336,14 +336,9 @@ void player_step(u8 direction, u16 newKeys, u16 heldKeys)
static bool8 TryInterruptEventObjectSpecialAnim(struct EventObject *playerEventObj, u8 direction)
{
- #ifdef NONMATCHING
- u8 r5 = direction;
- u8 r6 = direction;
- #else
- u8 r5 = direction;
- register u8 r6 asm("r6") = direction;
- #endif
- //a very bad HACK
+ u8 r5 = direction;
+ u8 r6 = direction;
+ r6++; r6--;
if (EventObjectIsMovementOverridden(playerEventObj)
&& !EventObjectClearHeldMovementIfFinished(playerEventObj))
diff --git a/src/field_specials.c b/src/field_specials.c
index efe77bd70..99e8e93a9 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -1442,7 +1442,7 @@ void SetShoalItemFlag(u16 v0)
void PutZigzagoonInPlayerParty(void)
{
u16 monData;
- CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0);
+ CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0);
monData = TRUE;
SetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM, &monData);
monData = MOVE_TACKLE;
diff --git a/src/field_weather.c b/src/field_weather.c
index 814e85ef4..024b6631f 100644
--- a/src/field_weather.c
+++ b/src/field_weather.c
@@ -68,7 +68,7 @@ static u8 None_Finish(void);
EWRAM_DATA struct Weather gWeather = {0};
EWRAM_DATA static u8 sFieldEffectPaletteGammaTypes[32] = {0};
-IWRAM_DATA static const u8 *sPaletteGammaTypes;
+static const u8 *sPaletteGammaTypes;
// The drought weather effect uses a precalculated color lookup table. Presumably this
// is because the underlying color shift calculation is slow.
diff --git a/src/fight.c b/src/fight.c
index c924effae..5230c2f39 100644
--- a/src/fight.c
+++ b/src/fight.c
@@ -912,9 +912,9 @@ void sub_810D874(struct Sprite *sprite)
}
if (IsContest())
- sprite->oam.matrixNum |= 0x8;
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
else if (GetBattlerSide(battler) == B_SIDE_PLAYER)
- sprite->oam.matrixNum |= 0x18;
+ sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP);
sprite->data[0] = 16;
sprite->data[1] = sprite->pos1.x;
diff --git a/src/fire.c b/src/fire.c
index d428dc13b..2998d46ca 100644
--- a/src/fire.c
+++ b/src/fire.c
@@ -891,6 +891,7 @@ static void sub_81094D0(u8 taskId) // animate Move_ERUPTION?
break;
default:
+ break;
}
}
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
index 68c50cae7..3115ff231 100644
--- a/src/fldeff_cut.c
+++ b/src/fldeff_cut.c
@@ -59,11 +59,11 @@ static void CutGrassSpriteCallbackEnd(struct Sprite *);
static void HandleLongGrassOnHyper(u8, s16, s16);
// IWRAM variables
-static IWRAM_DATA u8 sCutSquareSide;
-static IWRAM_DATA u8 sTileCountFromPlayer_X;
-static IWRAM_DATA u8 sTileCountFromPlayer_Y;
-static IWRAM_DATA u32 sUnused;
-static IWRAM_DATA bool8 sHyperCutTiles[CUT_HYPER_AREA];
+static u8 sCutSquareSide;
+static u8 sTileCountFromPlayer_X;
+static u8 sTileCountFromPlayer_Y;
+static u32 sUnused;
+static bool8 sHyperCutTiles[CUT_HYPER_AREA];
// EWRAM variables
static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL;
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
index c002f700f..a2457307b 100644
--- a/src/fldeff_flash.c
+++ b/src/fldeff_flash.c
@@ -219,8 +219,8 @@ static void sub_8137404(u8 taskId)
static void sub_8137420(u8 taskId)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
- LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
+ LZ77UnCompVram(gCaveTransitionTiles, (void *)(VRAM + 0xC000));
+ LZ77UnCompVram(gCaveTransitionTilemap, (void *)(VRAM + 0xF800));
LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
LoadPalette(gUnknown_085B28A0, 0xE0, 0x10);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
@@ -304,8 +304,8 @@ static void sub_81375BC(u8 taskId)
static void sub_81375D8(u8 taskId)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
- LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
- LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
+ LZ77UnCompVram(gCaveTransitionTiles, (void *)(VRAM + 0xC000));
+ LZ77UnCompVram(gCaveTransitionTilemap, (void *)(VRAM + 0xF800));
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
diff --git a/src/flying.c b/src/flying.c
index a157582e9..3d04a543c 100644
--- a/src/flying.c
+++ b/src/flying.c
@@ -1800,7 +1800,7 @@ void sub_810EEF8(struct Sprite *sprite)
sprite->data[2] = gBattleAnimArgs[0];
if (sprite->data[2])
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
if (gBattleAnimArgs[1] == 0)
{
diff --git a/src/frontier_util.c b/src/frontier_util.c
index 4dd8159cb..536e23e30 100644
--- a/src/frontier_util.c
+++ b/src/frontier_util.c
@@ -2503,7 +2503,7 @@ void CreateFrontierBrainPokemon(void)
monLevel,
sFrontierBrainsMons[facility][symbol][i].fixedIV,
TRUE, j,
- TRUE, FRONTIER_BRAIN_OTID);
+ OT_ID_PRESET, FRONTIER_BRAIN_OTID);
SetMonData(&gEnemyParty[monPartyId], MON_DATA_HELD_ITEM, &sFrontierBrainsMons[facility][symbol][i].heldItem);
for (j = 0; j < NUM_STATS; j++)
SetMonData(&gEnemyParty[monPartyId], MON_DATA_HP_EV + j, &sFrontierBrainsMons[facility][symbol][i].evs[j]);
diff --git a/src/ghost.c b/src/ghost.c
index 97b86aa76..41621ff54 100644
--- a/src/ghost.c
+++ b/src/ghost.c
@@ -1039,7 +1039,7 @@ static void sub_81129F0(struct Sprite *sprite)
{
xDelta = 24;
xDelta2 = -2;
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
}
else
{
@@ -1148,7 +1148,8 @@ static void sub_8112B78(struct Sprite *sprite)
if (++coeffB > 16)
coeffB = 16;
- if (--(s16)coeffA < 0)
+ --coeffA;
+ if ((s16)coeffA < 0)
coeffA = 0;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(coeffA, coeffB));
diff --git a/src/gpu_regs.c b/src/gpu_regs.c
index e5ff4fe8f..3bcc4fd93 100644
--- a/src/gpu_regs.c
+++ b/src/gpu_regs.c
@@ -10,9 +10,9 @@
static u8 sGpuRegBuffer[GPU_REG_BUF_SIZE];
static u8 sGpuRegWaitingList[GPU_REG_BUF_SIZE];
-static bool8 sGpuRegBufferLocked;
-static bool8 sShouldSyncRegIE;
-static u16 sRegIE;
+static volatile bool8 sGpuRegBufferLocked;
+static volatile bool8 sShouldSyncRegIE;
+static vu16 sRegIE;
static void CopyBufferedValueToGpuReg(u8 regOffset);
static void SyncRegIE(void);
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index fdf2020ff..ac37b2ece 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -755,7 +755,7 @@ static void Task_Hof_HandleExit(u8 taskId)
static void SetCallback2AfterHallOfFameDisplay(void)
{
- SetMainCallback2(sub_8175620);
+ SetMainCallback2(CB2_StartCreditsSequence);
}
#undef tDontSaveData
diff --git a/src/item.c b/src/item.c
index fe8e8eadd..5e505724c 100644
--- a/src/item.c
+++ b/src/item.c
@@ -18,6 +18,9 @@
extern u16 gUnknown_0203CF30[];
// this file's functions
+#if !defined(NONMATCHING) && MODERN
+#define static
+#endif
static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count);
static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count);
diff --git a/src/item_menu.c b/src/item_menu.c
index a8d1d4445..12f03b328 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -81,7 +81,7 @@ void TaskCloseBagMenu_2(u8);
u8 AddItemMessageWindow(u8);
void bag_menu_RemoveBagItem_message_window(u8);
void set_callback3_to_bag(u8);
-void sub_81ABC54(u8, s16);
+void PrintItemDepositAmount(u8, s16);
u8 BagMenu_AddWindow(u8);
u8 GetSwitchBagPocketDirection(void);
void SwitchBagPocket(u8, s16, u16);
@@ -118,16 +118,16 @@ void sub_81AD9C0(u8);
void sub_81ADB14(u8);
void sub_81ADA7C(u8);
void sub_81ADC0C(u8);
-void bag_menu_leave_maybe_3(void);
-void bag_menu_leave_maybe_2(void);
void bag_menu_leave_maybe(void);
+void CB2_FavorLadyExitBagMenu(void);
+void CB2_QuizLadyExitBagMenu(void);
void sub_81ABA6C(void);
static void SetPocketListPositions(void);
void sub_81ABAE0(void);
u8 sub_81AB1F0(u8);
void sub_81AC23C(u8);
void BagMenu_MoveCursorCallback(s32 a, bool8 b, struct ListMenu*);
-void PrintItemQuantityPlusGFX(u8 rboxId, int item_index_in_pocket, u8 a);
+void PrintItemQuantityPlusGFX(u8 rboxId, s32 item_index_in_pocket, u8 a);
void ItemMenu_UseOutOfBattle(u8 taskId);
void ItemMenu_Toss(u8 taskId);
void ItemMenu_Register(u8 taskId);
@@ -493,20 +493,20 @@ void sub_81AAC14(void)
void sub_81AAC28(void)
{
- GoToBagMenu(RETURN_LOCATION_FIELD_6, POCKETS_COUNT, bag_menu_leave_maybe_3);
+ GoToBagMenu(RETURN_LOCATION_FIELD_6, POCKETS_COUNT, bag_menu_leave_maybe);
gSpecialVar_0x8005 = 0;
gSpecialVar_Result = 0;
}
-void sub_81AAC50(void)
+void FavorLadyOpenBagMenu(void)
{
- GoToBagMenu(RETURN_LOCATION_FIELD_4, POCKETS_COUNT, bag_menu_leave_maybe_2);
+ GoToBagMenu(RETURN_LOCATION_FIELD_4, POCKETS_COUNT, CB2_FavorLadyExitBagMenu);
gSpecialVar_Result = 0;
}
-void sub_81AAC70(void)
+void QuizLadyOpenBagMenu(void)
{
- GoToBagMenu(RETURN_LOCATION_FIELD_5, POCKETS_COUNT, bag_menu_leave_maybe);
+ GoToBagMenu(RETURN_LOCATION_FIELD_5, POCKETS_COUNT, CB2_QuizLadyExitBagMenu);
gSpecialVar_Result = 0;
}
@@ -830,7 +830,7 @@ void BagMenu_MoveCursorCallback(s32 a, bool8 b, struct ListMenu *unused)
}
}
-void PrintItemQuantityPlusGFX(u8 rboxId, int item_index_in_pocket, u8 a)
+void PrintItemQuantityPlusGFX(u8 rboxId, s32 item_index_in_pocket, u8 a)
{
u16 itemId;
u16 itemQuantity;
@@ -1050,10 +1050,10 @@ void BagMenu_InitListsMenu(u8 taskId)
void sub_81ABC3C(u8 a)
{
- sub_81ABC54(BagMenu_AddWindow(a), 1);
+ PrintItemDepositAmount(BagMenu_AddWindow(a), 1);
}
-void sub_81ABC54(u8 a, s16 b)
+void PrintItemDepositAmount(u8 a, s16 b)
{
u8 r3 = (gBagPositionStruct.pocket == BERRIES_POCKET) ? 3 : 2;
ConvertIntToDecimalStringN(gStringVar1, b, 2, r3);
@@ -1704,7 +1704,7 @@ void Task_ChooseHowManyToToss(u8 taskId)
if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
{
- sub_81ABC54(gBagMenu->unk817, data[8]);
+ PrintItemDepositAmount(gBagMenu->unk817, data[8]);
}
else if (gMain.newKeys & A_BUTTON)
{
@@ -2056,7 +2056,7 @@ void sub_81ADA7C(u8 taskId)
if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
{
- sub_81ABC54(gBagMenu->unk817, data[8]);
+ PrintItemDepositAmount(gBagMenu->unk817, data[8]);
}
else if (gMain.newKeys & A_BUTTON)
{
@@ -2202,7 +2202,7 @@ void unknown_ItemMenu_Show(u8 taskId)
unknown_ItemMenu_Confirm(taskId);
}
-void bag_menu_leave_maybe_3(void)
+void bag_menu_leave_maybe(void)
{
gFieldCallback = Apprentice_EnableBothScriptContexts;
SetMainCallback2(CB2_ReturnToField);
@@ -2216,9 +2216,9 @@ void unknown_ItemMenu_Give2(u8 taskId)
unknown_ItemMenu_Confirm(taskId);
}
-void bag_menu_leave_maybe_2(void)
+void CB2_FavorLadyExitBagMenu(void)
{
- gFieldCallback = sub_818DEF4;
+ gFieldCallback = FieldCallback_FavorLadyEnableScriptContexts;
SetMainCallback2(CB2_ReturnToField);
}
@@ -2229,9 +2229,9 @@ void unknown_ItemMenu_Confirm2(u8 taskId)
unknown_ItemMenu_Confirm(taskId);
}
-void bag_menu_leave_maybe(void)
+void CB2_QuizLadyExitBagMenu(void)
{
- gFieldCallback = sub_818E564;
+ gFieldCallback = FieldCallback_QuizLadyEnableScriptContexts;
SetMainCallback2(CB2_ReturnToField);
}
diff --git a/src/libagbsyscall.s b/src/libagbsyscall.s
new file mode 100644
index 000000000..d5639f689
--- /dev/null
+++ b/src/libagbsyscall.s
@@ -0,0 +1,116 @@
+ .include "constants/gba_constants.inc"
+ .include "asm/macros.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start ArcTan2
+ArcTan2: @ 82E7078
+ swi 0xA
+ bx lr
+ thumb_func_end ArcTan2
+
+ thumb_func_start BgAffineSet
+@ void BgAffineSet(BgAffineSet_src_data *src, BgAffineSet_dest_data *dest, int entry_count)
+BgAffineSet: @ 82E707C
+ swi 0xE
+ bx lr
+ thumb_func_end BgAffineSet
+
+ thumb_func_start CpuFastSet
+@ void CpuFastSet(void *src, void *dest, unsigned int mode)
+CpuFastSet: @ 82E7080
+ swi 0xC
+ bx lr
+ thumb_func_end CpuFastSet
+
+ thumb_func_start CpuSet
+@ void CpuSet(void *src, void *dest, unsigned int mode)
+CpuSet: @ 82E7084
+ swi 0xB
+ bx lr
+ thumb_func_end CpuSet
+
+ thumb_func_start Div
+Div: @ 82E7088
+ swi 0x6
+ bx lr
+ thumb_func_end Div
+
+ thumb_func_start LZ77UnCompVram
+@ void LZ77UnCompVram(void *src, void *dest)
+LZ77UnCompVram: @ 82E708C
+ swi 0x12
+ bx lr
+ thumb_func_end LZ77UnCompVram
+
+ thumb_func_start LZ77UnCompWram
+@ void LZ77UnCompWram(void *src, void *dest)
+LZ77UnCompWram: @ 82E7090
+ swi 0x11
+ bx lr
+ thumb_func_end LZ77UnCompWram
+
+ thumb_func_start MultiBoot
+@ s32 MultiBoot(struct MultiBootParam *mp)
+MultiBoot: @ 82E7094
+ movs r1, 0x1
+ swi 0x25
+ bx lr
+ thumb_func_end MultiBoot
+
+ thumb_func_start ObjAffineSet
+ObjAffineSet: @ 82E709C
+ swi 0xF
+ bx lr
+ thumb_func_end ObjAffineSet
+
+ thumb_func_start RLUnCompVram
+RLUnCompVram: @ 82E70A0
+ swi 0x15
+ bx lr
+ thumb_func_end RLUnCompVram
+
+ thumb_func_start RLUnCompWram
+RLUnCompWram: @ 82E70A4
+ swi 0x14
+ bx lr
+ thumb_func_end RLUnCompWram
+
+ thumb_func_start RegisterRamReset
+@ void RegisterRamReset(int ResetFlags)
+RegisterRamReset: @ 82E70A8
+ swi 0x1
+ bx lr
+ thumb_func_end RegisterRamReset
+
+ thumb_func_start SoftReset
+@ void SoftReset()
+SoftReset: @ 82E70AC
+ ldr r3, =REG_IME
+ movs r2, 0
+ strb r2, [r3]
+ ldr r1, =0x3007F00
+ mov sp, r1
+ swi 0x1
+ swi 0
+ .pool
+ thumb_func_end SoftReset
+
+ thumb_func_start Sqrt
+@ s16 Sqrt(int)
+Sqrt: @ 82E70C4
+ swi 0x8
+ bx lr
+ thumb_func_end Sqrt
+
+ thumb_func_start VBlankIntrWait
+@ void VBlankIntrWait()
+VBlankIntrWait: @ 82E70C8
+ movs r2, 0
+ swi 0x5
+ bx lr
+ thumb_func_end VBlankIntrWait
+
+ .align 2, 0 @ Don't pad with nop.
diff --git a/src/libgcnmultiboot.s b/src/libgcnmultiboot.s
new file mode 100644
index 000000000..0e418e51f
--- /dev/null
+++ b/src/libgcnmultiboot.s
@@ -0,0 +1,550 @@
+@ This library can be used to download and execute a multi-boot image from
+@ a GameCube using the JOY Bus protocol over the link cable.
+
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .equiv GCMB_STRUCT_BASE_DEST_PTR, 0x20
+ .equiv GCMB_STRUCT_CUR_DEST_PTR, 0x24
+ .equiv GCMB_STRUCT_SERIAL_INTR_HANDLER, 0x28
+
+ .equiv ROM_HEADER_NINTENDO_LOGO_OFFSET, 0x4
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start GameCubeMultiBoot_Hash
+GameCubeMultiBoot_Hash: @ 82DED70
+ push {r4,lr}
+ ldr r4, pool_HashVal
+ eors r3, r1
+ movs r2, 0x20
+
+GameCubeMultiBoot_Hash_Loop:
+ lsrs r3, 1
+ bcc GameCubeMultiBoot_Hash_SkipEor
+
+ eors r3, r4
+
+GameCubeMultiBoot_Hash_SkipEor:
+ subs r2, 0x1
+ bne GameCubeMultiBoot_Hash_Loop
+
+ pop {r4,pc}
+ thumb_func_end GameCubeMultiBoot_Hash
+
+ thumb_func_start GameCubeMultiBoot_Main
+@ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb);
+GameCubeMultiBoot_Main: @ 82DED84
+ ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
+ cmp r1, 0
+ beq _082DEDAA
+ ldrb r1, [r0, 0x1]
+ adds r1, 0x1
+ strb r1, [r0, 0x1]
+ ldrb r1, [r0, 0x2]
+ cmp r1, 0x2
+ beq _082DEDF4
+ ldr r3, pool_InterruptRegs
+ ldrh r2, [r3, OFFSET_REG_IME - 0x200]
+ movs r1, 0
+ strh r1, [r3, OFFSET_REG_IME - 0x200]
+ ldrb r1, [r0]
+ cmp r1, 0xA
+ bgt _082DEDA8
+ adds r1, 0x1
+ strb r1, [r0]
+_082DEDA8:
+ strh r2, [r3, OFFSET_REG_IME - 0x200]
+_082DEDAA:
+ bcs GameCubeMultiBoot_Init
+ ldrb r1, [r0, 0x2]
+ cmp r1, 0
+ bne _082DEDF6
+ ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ subs r1, r2
+ beq _082DEE76
+ cmp r1, 0xA0
+ bcc _082DEE76
+ push {r4-r6}
+ movs r1, 0x98
+ adds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET
+ ldr r4, pool_NintendoLogo
+_082DEDC6:
+ ldm r2!, {r5}
+ ldm r4!, {r6}
+ cmp r5, r6
+ bne _082DEDDC
+ subs r1, 0x4
+ bne _082DEDC6
+ ldm r2!, {r5}
+ ldm r4!, {r6}
+ eors r5, r6
+ lsrs r5, 8
+ str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+_082DEDDC:
+ pop {r4-r6}
+ bne GameCubeMultiBoot_Init
+ movs r1, 0x1
+ strb r1, [r0, 0x2]
+ ldr r1, [r0, 0x4]
+ ldr r2, [r0, 0x8]
+ eors r1, r2
+ str r1, [r0, 0x18]
+ ldr r2, pool_Kawa
+ muls r1, r2
+ adds r1, 0x1
+ str r1, [r0, 0x14]
+_082DEDF4:
+ bx lr
+_082DEDF6:
+ ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ mov r12, r1
+ ldr r3, [r0, 0x18]
+ push {r4-r7}
+ ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ ldr r5, pool_Kawa
+ ldr r6, [r0, 0x14]
+ ldr r7, pool_HashVal
+_082DEE06:
+ cmp r4, r12
+ bcs _082DEE26
+ ldr r1, [r4]
+ eors r1, r6
+ adds r1, r3
+ stm r4!, {r1}
+ eors r3, r1
+ movs r2, 0x20
+_082DEE16:
+ lsrs r3, 1
+ bcc _082DEE1C
+ eors r3, r7
+_082DEE1C:
+ subs r2, 0x1
+ bne _082DEE16
+ muls r6, r5
+ adds r6, 0x1
+ b _082DEE06
+_082DEE26:
+ str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ str r6, [r0, 0x14]
+ pop {r4-r7}
+ str r3, [r0, 0x18]
+ ldrh r1, [r0, 0x12]
+ cmp r1, 0
+ bne _082DEE76
+ ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ cmp r1, r2
+ bne _082DEE76
+ ldr r1, [r0, 0xC]
+ cmp r1, 0
+ beq _082DEE60
+ ldrh r1, [r0, 0x10]
+ cmp r1, 0
+ beq _082DEDF4
+ mov r12, lr
+ movs r1, 0xBB
+ ldr r3, [r0, 0xC]
+ bl GameCubeMultiBoot_Hash
+ ldrh r1, [r0, 0x10]
+ mov lr, r12
+ subs r1, r3
+ bne GameCubeMultiBoot_Init
+ movs r1, 0x2
+ strb r1, [r0, 0x2]
+ bx lr
+_082DEE60:
+ mov r12, lr
+ ldrb r1, [r0, 0x3]
+ lsls r1, 24
+ subs r1, 0x1
+ str r1, [r0, 0xC]
+ bl GameCubeMultiBoot_Hash
+ lsls r3, 8
+ adds r3, 0xFF
+ str r3, [r0, 0x1C]
+ bx r12
+_082DEE76:
+ bx lr
+ thumb_func_end GameCubeMultiBoot_Main
+
+ .align 2, 0
+
+pool_HashVal: .4byte 0xa1c1
+
+pool_Kawa: .ascii "Kawa" @ name of BIOS developer
+
+pool_NintendoLogo: .4byte RomHeaderNintendoLogo
+
+ thumb_func_start GameCubeMultiBoot_ExecuteProgram
+@ void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb);
+GameCubeMultiBoot_ExecuteProgram: @ 82DEE84
+ ldrb r1, [r0, 0x2]
+ cmp r1, 0x2
+ bne GameCubeMultiBoot_ExecuteProgram_Fail
+ ldr r3, pool_InterruptRegs
+ movs r1, 0
+ strh r1, [r3, OFFSET_REG_IME - 0x200]
+ ldr r1, pool_MultiBootLoadAddr
+ adds r1, 0xC0
+ bx r1
+GameCubeMultiBoot_ExecuteProgram_Fail:
+ bx lr
+ thumb_func_end GameCubeMultiBoot_ExecuteProgram
+
+ thumb_func_start GameCubeMultiBoot_Init
+@ void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb);
+GameCubeMultiBoot_Init: @ 82DEE98
+ ldr r3, pool_InterruptRegs
+
+@ Save IME register.
+ ldrh r2, [r3, OFFSET_REG_IME - 0x200]
+
+@ Disable interrupts.
+ movs r1, 0
+ strh r1, [r3, OFFSET_REG_IME - 0x200]
+
+@ Set the handler to the "Stop" routine.
+@ Unless the first command that is received is a device reset command, the
+@ "Stop" routine will be executed and no further commands will be processed.
+ adr r3, GcMbIntrHandler_Stop
+ str r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
+
+ ldrb r3, [r0, 0x3]
+ push {r3}
+ ldrb r3, [r0, 0x1]
+ push {r0,r3}
+
+ adds r3, r0, 0
+ adds r3, GCMB_STRUCT_BASE_DEST_PTR
+
+@ clear all but the last 3 fields of the struct
+GameCubeMultiBoot_Init_ClearStructLoop:
+ stm r0!, {r1}
+ cmp r0, r3
+ blo GameCubeMultiBoot_Init_ClearStructLoop
+
+ pop {r0,r3}
+ lsrs r3, 1
+ strb r3, [r0, 0x3]
+ pop {r3}
+ strb r3, [r0, 0x1]
+
+ ldr r3, pool_SerialRegs
+
+@ Turn off JOY Bus mode.
+ lsls r0, r3, 10
+ strh r0, [r3, OFFSET_REG_RCNT - 0x120]
+
+@ Turn on JOY Bus mode.
+ movs r0, 0xC0
+ lsls r0, 8
+ strh r0, [r3, OFFSET_REG_RCNT - 0x120]
+
+@ Init JOY Bus registers.
+ movs r0, 0x47
+ strh r0, [r3, OFFSET_REG_JOYCNT - 0x120]
+ strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
+
+ ldr r3, pool_InterruptRegs
+
+@ Acknowledge serial interrupt.
+ movs r0, INTR_FLAG_SERIAL
+ strh r0, [r3, OFFSET_REG_IF - 0x200]
+
+@ Enable serial interrupt.
+ ldrh r1, [r3, OFFSET_REG_IE - 0x200]
+ orrs r1, r0
+ strh r1, [r3, OFFSET_REG_IE - 0x200]
+
+@ Restore IME register.
+ strh r2, [r3, OFFSET_REG_IME - 0x200]
+
+ bx lr
+ thumb_func_end GameCubeMultiBoot_Init
+
+ non_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt
+@ void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb);
+GameCubeMultiBoot_HandleSerialInterrupt: @ 82DEEE2
+ ldr r3, pool_SerialRegs
+
+@ Acknowledge reset/receive/send flags.
+ ldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120]
+ strh r1, [r3, OFFSET_REG_JOYCNT - 0x120]
+
+ movs r2, 0
+ strb r2, [r0]
+
+ ldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
+ cmp r2, 0
+ beq GameCubeMultiBoot_HandleSerialInterruptDone
+
+ lsrs r1, 1 @ was a device reset command received?
+ bcs GameCubeMultiBoot_BeginHandshake @ branch if so
+
+ mov pc, r2
+
+ .align 2, 0
+
+@ Zero the status and the interrupt handler pointer.
+@ Commands from the GameCube will not be processed after this is executed
+@ unless GameCubeMultiBoot_Init() is called again.
+GcMbIntrHandler_Stop:
+ movs r2, 0
+ strh r2, [r3, OFFSET_REG_JOYSTAT - 0x120]
+
+GameCubeMultiBoot_SetInterruptHandler:
+ str r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
+
+GameCubeMultiBoot_ReadVCount:
+ ldr r3, pool_RegDispstat
+ ldrh r1, [r3, OFFSET_REG_VCOUNT - OFFSET_REG_DISPSTAT]
+ strb r1, [r0, 0x3]
+
+GameCubeMultiBoot_HandleSerialInterruptDone:
+ bx lr
+
+GameCubeMultiBoot_BeginHandshake:
+ ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
+ ldr r1, pool_RubyUSAGameCode
+ str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
+ movs r1, 0x10
+ strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
+ ldrb r1, [r0, 0x3]
+ strb r1, [r0, 0x9]
+ ldrb r1, [r0, 0x2]
+ cmp r1, 0
+ bne GcMbIntrHandler_Stop
+ ldr r1, pool_MultiBootLoadAddr
+ str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ adr r2, GcMbIntrHandler_CheckGameCodeSent
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_CheckGameCodeSent: @ 82DEF24
+ lsls r1, 31
+ bcc GcMbIntrHandler_Stop @ stop if send failed
+ bmi GameCubeMultiBoot_CheckHandshakeResponse @ branch if receive is complete
+
+@ If the response hasn't been fully received yet,
+@ check again upon the next interrupt.
+ adr r2, GcMbIntrHandler_CheckHandshakeResponse
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_CheckHandshakeResponse: @ 82DEF30
+ lsrs r1, 1 @ is receive complete?
+ bcc GcMbIntrHandler_Stop @ stop if not
+
+GameCubeMultiBoot_CheckHandshakeResponse:
+ ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
+ ldr r2, pool_RubyUSAGameCode
+ cmp r1, r2
+ bne GcMbIntrHandler_Stop @ stop if the GameCube didn't reply with the same game code
+ ldrb r1, [r0, 0x3]
+ strb r1, [r0, 0xB]
+ adr r2, GcMbIntrHandler_82DEF44
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_82DEF44: @ 82DEF44
+ lsrs r1, 1 @ is receive complete?
+ bcc GcMbIntrHandler_Stop @ branch if not
+ ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
+ lsrs r2, r1, 24
+ cmp r2, 0xDD
+ bne GcMbIntrHandler_Stop
+ str r1, [r0, 0x4]
+ ldrb r1, [r0, 0x1]
+ strb r1, [r0, 0xA]
+ movs r2, 0
+ movs r3, 0
+ ldr r1, [r0, 0x8]
+ lsrs r1, 8
+_082DEF5E:
+ lsrs r1, 1
+ adcs r2, r3
+ cmp r1, 0
+ bne _082DEF5E
+ cmp r2, 0xE
+ bgt _082DEF70
+ cmp r2, 0x7
+ bge _082DEF72
+ movs r1, 0xFF
+_082DEF70:
+ strb r1, [r0, 0xA]
+_082DEF72:
+ ldr r1, [r0, 0x8]
+ adds r1, 0xEE
+ ldr r3, pool_SerialRegs
+ str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
+ movs r1, 0x30
+ strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
+ adr r2, GcMbIntrHandler_82DEF84
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_82DEF84: @ 82DEF84
+ lsls r1, 31
+ bcc GcMbIntrHandler_Stop @ stop if send failed
+ bmi _082DEF94 @ branch if receive is complete
+ adr r2, GcMbIntrHandler_82DEF90
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_82DEF90: @ 82DEF90
+ lsrs r1, 1 @ is receive complete?
+ bcc GcMbIntrHandler_Stop @ branch if not
+_082DEF94:
+ ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
+ ldr r2, _082DF034
+ cmp r1, r2
+ bhs GcMbIntrHandler_Stop
+ adds r1, 0x1
+ adds r1, r1
+ strh r1, [r0, 0x12]
+ ldrb r1, [r0, 0x2]
+ cmp r1, 0
+_082DEFA6:
+ bne GcMbIntrHandler_Stop
+ ldr r1, pool_MultiBootLoadAddr
+ str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR]
+ str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ adr r2, GcMbIntrHandler_82DEFB4
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_82DEFB4: @ 82DEFB4
+ lsrs r1, 1 @ is receive complete?
+ bcc GcMbIntrHandler_Stop @ branch if not
+ ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ movs r1, 0x4
+ ands r1, r2
+ adds r1, 0x8
+ lsls r1, 2
+ strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120]
+ ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
+ stm r2!, {r1}
+ str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]
+ ldrh r1, [r0, 0x12]
+ subs r1, 0x1
+ strh r1, [r0, 0x12]
+ bne GameCubeMultiBoot_ReadVCount
+
+_082DEFD2:
+ ldrb r1, [r0, 0x1]
+ lsls r1, 8
+ adds r1, 0xCC
+ str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
+ adr r2, _082DEFE0
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+_082DEFE0:
+ lsls r1, 31
+
+_082DEFE2:
+ bcc GcMbIntrHandler_Stop
+ ldr r1, [r0, 0x1C]
+ cmp r1, 0
+ beq _082DEFD2
+ str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120]
+ adr r2, GcMbIntrHandler_82DEFF0
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_82DEFF0: @ 82DEFF0
+ lsls r1, 31
+ bcc _082DEFE2 @ branch if send failed
+ bmi _082DF000 @ branch if receive is complete
+ adr r2, GcMbIntrHandler_82DEFFC
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_82DEFFC: @ 82DEFFC
+ lsrs r1, 1 @ is receive complete?
+ bcc _082DEFE2 @ branch if not
+
+_082DF000:
+ ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
+ lsrs r2, r1, 24
+ cmp r2, 0xBB
+ bne _082DEFA6
+ strh r1, [r0, 0x10]
+ adr r2, GcMbIntrHandler_82DF010
+ b GameCubeMultiBoot_SetInterruptHandler
+
+ .align 2, 0
+
+GcMbIntrHandler_82DF010: @ 82DF010
+ b GcMbIntrHandler_Stop
+
+ thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt
+
+ non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit
+@ void GameCubeMultiBoot_Quit();
+GameCubeMultiBoot_Quit: @ 82DF012
+ ldr r3, pool_InterruptRegs
+
+@ Save IME register.
+ ldrh r2, [r3, OFFSET_REG_IME - 0x200]
+
+@ Disable interrupts.
+ movs r1, 0
+ strh r1, [r3, OFFSET_REG_IME - 0x200]
+
+ ldr r3, pool_SerialRegs
+
+@ Acknowledge all JOYCNT flags.
+ movs r0, 0x7
+ strh r0, [r3, OFFSET_REG_JOYCNT - 0x120]
+
+@ Turn off JOY Bus mode.
+ lsls r0, r3, 10
+ strh r0, [r3, OFFSET_REG_RCNT - 0x120] @ store 0x8000
+
+ ldr r3, pool_InterruptRegs
+
+@ Acknowledge serial interrupt.
+ movs r0, INTR_FLAG_SERIAL
+ strh r0, [r3, OFFSET_REG_IF - 0x200]
+
+@ Disable serial interrupt.
+ ldrh r1, [r3, OFFSET_REG_IE - 0x200]
+ bics r1, r0
+ strh r1, [r3, OFFSET_REG_IE - 0x200]
+
+@ Restore IME register.
+ strh r2, [r3, OFFSET_REG_IME - 0x200]
+
+ bx lr
+ thumb_func_end GameCubeMultiBoot_Quit
+
+ .align 2, 0
+
+_082DF034: .4byte 0x4000
+
+pool_InterruptRegs: .4byte REG_BASE + 0x200
+
+pool_SerialRegs: .4byte REG_BASE + 0x120
+
+pool_RegDispstat: .4byte REG_DISPSTAT
+
+pool_RubyUSAGameCode: .ascii "AXVE"
+
+pool_MultiBootLoadAddr: .4byte EWRAM_START
+
+ .align 2, 0 @ Don't pad with nop.
diff --git a/src/librfu.c b/src/librfu.c
new file mode 100644
index 000000000..cdf14b693
--- /dev/null
+++ b/src/librfu.c
@@ -0,0 +1,9 @@
+#include "global.h"
+#include "librfu.h"
+
+struct RfuUnk1* gUnknown_03007870[4];
+struct RfuUnk2* gUnknown_03007880[4];
+struct RfuUnk5 *gUnknown_03007890;
+u32 *gUnknown_03007894;
+struct RfuUnk3* gUnknown_03007898;
+u8 gUnknown_030078A0[12];
diff --git a/src/librfu_intr.c b/src/librfu_intr.c
index bdf8b072a..c6db9a50c 100644
--- a/src/librfu_intr.c
+++ b/src/librfu_intr.c
@@ -1,4 +1,5 @@
#include "global.h"
#include "main.h"
+#include "librfu.h"
//TODO: decompile asm/librfu_intr.s to here
diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c
index 556b79bf8..670692118 100644
--- a/src/librfu_stwi.c
+++ b/src/librfu_stwi.c
@@ -1,6 +1,8 @@
#include "global.h"
#include "librfu.h"
+struct RfuStruct *gRfuState;
+
extern IntrFunc IntrSIO32(void);
extern void STWI_stop_timer(void);
diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c
index dc38d8848..011d9fdfd 100644
--- a/src/lilycove_lady.c
+++ b/src/lilycove_lady.c
@@ -1,7 +1,3 @@
-//
-// Created by Scott Norton on 9/19/17.
-//
-
#include "global.h"
#include "main.h"
#include "overworld.h"
@@ -18,215 +14,25 @@
#include "text.h"
#include "easy_chat.h"
#include "lilycove_lady.h"
-
-static void SetLilycoveQuizLady(void);
-static void SetLilycoveFavourLady(void);
-static void SetLilycoveContestLady(void);
-static void sub_818E004(void);
-static void sub_818DBC4(void);
-static void sub_818E674(void);
-static u8 sub_818E13C(void);
-static bool8 sub_818E1F4(void);
-static u8 sub_818E258(const u8 *);
-
-extern const u8 gText_Lady2[];
-
-static const u16 sUnknown_0860B074[] = {
- 0x62, 0xcb, 0xdc, 0xcc, 0xd1
-};
-static const u16 sUnknown_0860B07E[] = {
- 0x1a, 0x14, 0x0a
-};
-
-static const u16 Unknown_0860B084[] = {
- 0x101b, 0x1623, 0x1812, 0x102c, 0x020e, 0x0c03, 0x1a0b, 0x0210, 0x020d
-};
-
-static const u16 Unknown_0860B096[] = {
- 0x101b, 0x1013, 0x1020, 0x1a0f, 0x020c, 0x0c03, 0x0211, 0x0203, 0x0400
-};
-
-static const u16 Unknown_0860B0A8[] = {
- 0x0e0f, 0x1018, 0x020e, 0x0204, 0x0c03, 0xffff, 0x0212, 0x0451, 0x0463
-};
-
-static const u16 Unknown_0860B0BA[] = {
- 0x101b, 0x100b, 0x0e0d, 0x141a, 0x181d, 0x0c03, 0x141e, 0x1a26, 0x1823
-};
-
-static const u16 Unknown_0860B0CC[] = {
- 0x101b, 0x181d, 0x1018, 0x0a02, 0x2014, 0x0c03, 0x0208, 0x1824, 0x181c
-};
-
-static const u16 Unknown_0860B0DE[] = {
- 0x101b, 0x1000, 0x1c19, 0x265d, 0x0c03, 0xffff, 0x0447, 0x045d, 0x042c
-};
-
-static const u16 Unknown_0860B0F0[] = {
- 0x101b, 0x1034, 0x1e11, 0x100b, 0x1a08, 0x0c03, 0x044b, 0x0446, 0x040a
-};
-
-static const u16 Unknown_0860B102[] = {
- 0x101b, 0x1000, 0x274f, 0x0626, 0x0c03, 0xffff, 0x0442, 0x0411, 0x0450
-};
-
-static const u16 Unknown_0860B114[] = {
- 0x101b, 0x1000, 0x1c19, 0x043c, 0x0c03, 0xffff, 0x0421, 0x0464, 0x0435
-};
-
-static const u16 Unknown_0860B126[] = {
- 0x101b, 0x1203, 0x1030, 0x0207, 0x0c03, 0xffff, 0x0210, 0x020e, 0x020d
-};
-
-static const u16 Unknown_0860B138[] = {
- 0x101b, 0x1623, 0x0a05, 0x020e, 0x0c03, 0xffff, 0x1a25, 0x181a, 0x181b
-};
-
-static const u16 Unknown_0860B14A[] = {
- 0x101b, 0x1823, 0x1603, 0x0a02, 0x1812, 0x0c03, 0x1a15, 0x1a23, 0x181b
-};
-
-static const u16 Unknown_0860B15C[] = {
- 0x1020, 0x020e, 0x1010, 0x1043, 0x1e0f, 0x0c03, 0x181c, 0x1a24, 0x1816
-};
-
-static const u16 Unknown_0860B16E[] = {
- 0x0446, 0x100b, 0x0620, 0x061c, 0x101b, 0x0c03, 0x0420, 0x0426, 0xffff
-};
-
-static const u16 Unknown_0860B180[] = {
- 0x0400, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x040e, 0x0410, 0xffff
-};
-
-static const u16 Unknown_0860B192[] = {
- 0x041f, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x0445, 0x0400, 0xffff
-};
-
-static const u16 *const gUnknown_0860B1A4[] = {
- Unknown_0860B084,
- Unknown_0860B096,
- Unknown_0860B0A8,
- Unknown_0860B0BA,
- Unknown_0860B0CC,
- Unknown_0860B0DE,
- Unknown_0860B0F0,
- Unknown_0860B102,
- Unknown_0860B114,
- Unknown_0860B126,
- Unknown_0860B138,
- Unknown_0860B14A,
- Unknown_0860B15C,
- Unknown_0860B16E,
- Unknown_0860B180,
- Unknown_0860B192
-};
-
-static const u16 sUnknown_0860B1E4[] = {
- 0x0210, 0x0400, 0x0212, 0x1a26, 0x0208, 0x045d, 0x040a, 0x0411, 0x0464, 0x020e, 0x1a25, 0x181b, 0x1a24, 0x0420, 0x0410, 0x0400
-};
-
-static const u16 sUnknown_0860B204[] = {
- 0x007b, 0x007f, 0x0081, 0x0023, 0x0023, 0x0023, 0x00a5, 0x00a7, 0x00a6, 0x000b, 0x012f, 0x006b, 0x006d, 0x0044, 0x0044, 0x000c
-};
-
-extern const u8 gUnknown_085EEB83[];
-extern const u8 gUnknown_085EEB8C[];
-extern const u8 gUnknown_085EEB95[];
-extern const u8 gUnknown_085EEB9E[];
-extern const u8 gUnknown_085EEBA4[];
-extern const u8 gUnknown_085EEBAB[];
-
-static const u8 *const gUnknown_0860B224[] = {
- gUnknown_085EEB83,
- gUnknown_085EEB8C,
- gUnknown_085EEB95,
- gUnknown_085EEB9E,
- gUnknown_085EEBA4,
- gUnknown_085EEBAB
-};
-
-static const u16 Unknown_0860B23C[] = {
- 0x0056, 0x0053, 0x0054, 0x000e, 0x0012, 0x000f, 0x00a7, 0x0011, 0x0010, 0x0018, 0x0019, 0x001e, 0x0000
-};
-
-static const u16 Unknown_0860B256[] = {
- 0x0051, 0x006a, 0x006b, 0x00cc, 0x00c2, 0x002f, 0x0067, 0x0068, 0x0087, 0x0089, 0x008b, 0x009d, 0x00a0, 0x00a5, 0x0004, 0x0002, 0x0000
-};
-
-static const u16 Unknown_0860B278[] = {
- 0x0021, 0x000d, 0x001a, 0x001b, 0x001c, 0x00cc, 0x00ca, 0x0026, 0x0086, 0x0096, 0x0097, 0x009a, 0x00a2, 0x00a6, 0x0000
-};
-
-static const u16 Unknown_0860B296[] = {
- 0x0020, 0x004d, 0x004b, 0x004c, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x006e, 0x005d, 0x006c, 0x006d, 0x006a, 0x006b, 0x00d6, 0x00bc, 0x00b3, 0x000b, 0x000c, 0x0000
-};
-
-static const u16 Unknown_0860B2C0[] = {
- 0x001f, 0x0013, 0x0014, 0x004a, 0x004e, 0x0049, 0x00a5, 0x00c8, 0x0067, 0x006f, 0x0000
-};
-
-static const u16 Unknown_0860B2D6[] = {
- 0x00b7, 0x00d3, 0x00d2, 0x00d8, 0x009e, 0x00a6, 0x00ab, 0x00aa, 0x006c, 0x006d, 0x0000
-};
-
-static const u16 *const gUnknown_0860B2EC[] = {
- Unknown_0860B23C,
- Unknown_0860B256,
- Unknown_0860B278,
- Unknown_0860B296,
- Unknown_0860B2C0,
- Unknown_0860B2D6
-};
-
-static const u16 sUnknown_0860B304[] = {
- 0x0b, 0x6e, 0x40, 0x6f, 0x44, 0x47
-};
-
-extern const u8 gUnknown_085EEB2B[];
-extern const u8 gUnknown_085EEB34[];
-extern const u8 gUnknown_085EEB3A[];
-extern const u8 gUnknown_085EEB41[];
-extern const u8 gUnknown_085EEB4A[];
-extern const u8 gUnknown_085EEB51[];
-extern const u8 gUnknown_085EEB5A[];
-extern const u8 gUnknown_085EEB61[];
-extern const u8 gUnknown_085EEB6A[];
-extern const u8 gUnknown_085EEB74[];
-extern const u8 gUnknown_085EADA4[];
-extern const u8 gUnknown_085EADB5[];
-extern const u8 gUnknown_085EADC4[];
-extern const u8 gUnknown_085EADD5[];
-extern const u8 gUnknown_085EADE7[];
-
-static const u8 *const gUnknown_0860B310[] = {
- gUnknown_085EEB2B,
- gUnknown_085EEB34,
- gUnknown_085EEB3A,
- gUnknown_085EEB41,
- gUnknown_085EEB4A
-};
-static const u8 *const gUnknown_0860B324[] = {
- gUnknown_085EEB51,
- gUnknown_085EEB5A,
- gUnknown_085EEB61,
- gUnknown_085EEB6A,
- gUnknown_085EEB74
-};
-static const u8 *const gUnknown_0860B338[] = {
- gUnknown_085EADA4,
- gUnknown_085EADB5,
- gUnknown_085EADC4,
- gUnknown_085EADD5,
- gUnknown_085EADE7
-};
-
-static const u16 sUnknown_0860B34C[] = {
- 0x0120, 0x013b, 0x011e, 0x013d, 0x0019
-};
-
-static EWRAM_DATA struct LilycoveLadyFavour *gUnknown_0203CD64 = NULL;
-static EWRAM_DATA struct LilycoveLadyQuiz *gUnknown_0203CD68 = NULL;
-static EWRAM_DATA struct LilycoveLadyContest *gUnknown_0203CD6C = NULL;
+#include "contest.h"
+#include "strings.h"
+#include "constants/lilycove_lady.h"
+
+#include "data/lilycove_lady.h"
+
+static void InitLilycoveQuizLady(void);
+static void InitLilycoveFavorLady(void);
+static void InitLilycoveContestLady(void);
+static void ResetQuizLadyForRecordMix(void);
+static void ResetFavorLadyForRecordMix(void);
+static void ResetContestLadyForRecordMix(void);
+static u8 BufferQuizAuthorName(void);
+static bool8 IsQuizTrainerIdNotPlayer(void);
+static u8 GetPlayerNameLength(const u8 *);
+
+static EWRAM_DATA struct LilycoveLadyFavor *sFavorLadyPtr = NULL;
+static EWRAM_DATA struct LilycoveLadyQuiz *sQuizLadyPtr = NULL;
+static EWRAM_DATA struct LilycoveLadyContest *sContestLadyPtr = NULL;
extern EWRAM_DATA u16 gSpecialVar_ItemId;
@@ -235,15 +41,15 @@ u8 GetLilycoveLadyId(void)
return gSaveBlock1Ptr->lilycoveLady.id;
}
-void sub_818D9C0(void)
+void SetLilycoveLadyGfx(void)
{
LilycoveLady *lilycoveLady;
- VarSet(VAR_OBJ_GFX_ID_0, sUnknown_0860B07E[GetLilycoveLadyId()]);
+ VarSet(VAR_OBJ_GFX_ID_0, sLilycoveLadyGfxId[GetLilycoveLadyId()]);
if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST)
{
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
- VarSet(VAR_OBJ_GFX_ID_1, sUnknown_0860B074[lilycoveLady->contest.category]);
+ VarSet(VAR_OBJ_GFX_ID_1, sContestLadyMonGfxId[lilycoveLady->contest.category]);
gSpecialVar_Result = TRUE;
}
else
@@ -252,718 +58,722 @@ void sub_818D9C0(void)
}
}
-void SetLilycoveLady(void)
+void InitLilycoveLady(void)
{
- u16 id;
-
- id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]);
+ u16 id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]);
id %= 6;
id >>= 1;
switch (id)
{
case LILYCOVE_LADY_QUIZ:
- SetLilycoveQuizLady();
+ InitLilycoveQuizLady();
break;
- case LILYCOVE_LADY_FAVOUR:
- SetLilycoveFavourLady();
+ case LILYCOVE_LADY_FAVOR:
+ InitLilycoveFavorLady();
break;
case LILYCOVE_LADY_CONTEST:
- SetLilycoveContestLady();
+ InitLilycoveContestLady();
break;
}
}
-void sub_818DA78(void)
+void ResetLilycoveLadyForRecordMix(void)
{
switch (GetLilycoveLadyId())
{
case LILYCOVE_LADY_QUIZ:
- sub_818E004();
+ ResetQuizLadyForRecordMix();
break;
- case LILYCOVE_LADY_FAVOUR:
- sub_818DBC4();
+ case LILYCOVE_LADY_FAVOR:
+ ResetFavorLadyForRecordMix();
break;
case LILYCOVE_LADY_CONTEST:
- sub_818E674();
+ ResetContestLadyForRecordMix();
break;
}
}
-void SetLilycoveLadyRandomly(void)
+// Unused
+void InitLilycoveLadyRandomly(void)
{
- u8 id;
+ u8 lady = Random() % LILYCOVE_LADY_COUNT;
- id = Random() % 3;
- switch (id)
+ switch (lady)
{
case LILYCOVE_LADY_QUIZ:
- SetLilycoveQuizLady();
+ InitLilycoveQuizLady();
break;
- case LILYCOVE_LADY_FAVOUR:
- SetLilycoveFavourLady();
+ case LILYCOVE_LADY_FAVOR:
+ InitLilycoveFavorLady();
break;
case LILYCOVE_LADY_CONTEST:
- SetLilycoveContestLady();
+ InitLilycoveContestLady();
break;
}
}
-void sub_818DAEC(void)
+void Script_GetLilycoveLadyId(void)
{
gSpecialVar_Result = GetLilycoveLadyId();
}
-static u8 sub_818DB04(const u16 *data)
+static u8 GetNumAcceptedItems(const u16 *itemsArray)
{
- u8 len;
+ u8 items;
- for (len = 0; *data != 0; len ++, data ++);
- return len;
+ for (items = 0; *itemsArray != ITEM_NONE; items ++, itemsArray ++);
+ return items;
}
-static void sub_818DB20(void)
+static void FavorLadyPickFavorAndBestItem(void)
{
- u8 size;
- u8 idx;
+ u8 numItems;
+ u8 bestItem;
- gUnknown_0203CD64->unk_00c = Random() % 6;
- size = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]);
- idx = Random() % size;
- gUnknown_0203CD64->unk_010 = gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][idx];
+ sFavorLadyPtr->favorId = Random() % ARRAY_COUNT(sFavorLadyRequests);
+ numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]);
+ bestItem = Random() % numItems;
+ sFavorLadyPtr->bestItem = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][bestItem];
}
-static void SetLilycoveFavourLady(void)
+static void InitLilycoveFavorLady(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR;
- gUnknown_0203CD64->phase = 0;
- gUnknown_0203CD64->playerName[0] = EOS;
- gUnknown_0203CD64->unk_002 = 0;
- gUnknown_0203CD64->unk_003= 0;
- gUnknown_0203CD64->itemId = ITEM_NONE;
- gUnknown_0203CD64->language = gGameLanguage;
- sub_818DB20();
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR;
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_READY;
+ sFavorLadyPtr->playerName[0] = EOS;
+ sFavorLadyPtr->likedItem = FALSE;
+ sFavorLadyPtr->numItemsGiven = 0;
+ sFavorLadyPtr->itemId = ITEM_NONE;
+ sFavorLadyPtr->language = gGameLanguage;
+ FavorLadyPickFavorAndBestItem();
}
-static void sub_818DBC4(void)
+static void ResetFavorLadyForRecordMix(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR;
- gUnknown_0203CD64->phase = 0;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR;
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_READY;
}
-u8 sub_818DBE8(void)
+u8 GetFavorLadyState(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- if (gUnknown_0203CD64->phase == 2)
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ if (sFavorLadyPtr->state == LILYCOVE_LADY_STATE_PRIZE)
{
- return 2;
+ return LILYCOVE_LADY_STATE_PRIZE;
}
- else if (gUnknown_0203CD64->phase == 1)
+ else if (sFavorLadyPtr->state == LILYCOVE_LADY_STATE_COMPLETED)
{
- return 1;
+ return LILYCOVE_LADY_STATE_COMPLETED;
}
else
{
- return 0;
+ return LILYCOVE_LADY_STATE_READY;
}
}
-static const u8 *sub_818DC1C(u8 idx)
+static const u8 *GetFavorLadyRequest(u8 idx)
{
- return gUnknown_0860B224[idx];
+ return sFavorLadyRequests[idx];
}
-void sub_818DC2C(void)
+void BufferFavorLadyRequest(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- StringCopy(gStringVar1, sub_818DC1C(gUnknown_0203CD64->unk_00c));
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ StringCopy(gStringVar1, GetFavorLadyRequest(sFavorLadyPtr->favorId));
}
-bool8 sub_818DC60(void)
+bool8 HasAnotherPlayerGivenFavorLadyItem(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- if (gUnknown_0203CD64->playerName[0] != EOS)
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ if (sFavorLadyPtr->playerName[0] != EOS)
{
- StringCopy7(gStringVar3, gUnknown_0203CD64->playerName);
- ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language);
+ StringCopy7(gStringVar3, sFavorLadyPtr->playerName);
+ ConvertInternationalString(gStringVar3, sFavorLadyPtr->language);
return TRUE;
}
return FALSE;
}
-static void sub_818DCAC(u8 *dest, u16 itemId)
+static void BufferItemName(u8 *dest, u16 itemId)
{
StringCopy(dest, ItemId_GetName(itemId));
}
-void sub_818DCC8(void)
+void BufferFavorLadyItemName(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- sub_818DCAC(gStringVar2, gUnknown_0203CD64->itemId);
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ BufferItemName(gStringVar2, sFavorLadyPtr->itemId);
}
-static void sub_818DCF4(const u8 *src, u8 *dest)
+static void SetFavorLadyPlayerName(const u8 *src, u8 *dest)
{
memset(dest, 0xFF, 8);
StringCopy7(dest, src);
}
-void sub_818DD14(void)
+void BufferFavorLadyPlayerName(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- sub_818DCF4(gUnknown_0203CD64->playerName, gStringVar3);
- ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language);
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ SetFavorLadyPlayerName(sFavorLadyPtr->playerName, gStringVar3);
+ ConvertInternationalString(gStringVar3, sFavorLadyPtr->language);
}
-bool8 sub_818DD54(void)
+// Only used to determine if a record-mixed player had given her an item she liked
+bool8 DidFavorLadyLikeItem(void)
{
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- return gUnknown_0203CD64->unk_002 ? TRUE : FALSE;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ return sFavorLadyPtr->likedItem ? TRUE : FALSE;
}
-void sub_818DD78(void)
+void Script_FavorLadyOpenBagMenu(void)
{
- sub_81AAC50();
+ FavorLadyOpenBagMenu();
}
-static bool8 sub_818DD84(u16 itemId)
+static bool8 DoesFavorLadyLikeItem(u16 itemId)
{
- u8 len;
+ u8 numItems;
u8 i;
- bool8 response;
-
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- len = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]);
- gUnknown_0203CD64->phase = 1;
- sub_818DCAC(gStringVar2, itemId);
- gUnknown_0203CD64->itemId = itemId;
- sub_818DCF4(gSaveBlock2Ptr->playerName, gUnknown_0203CD64->playerName);
- gUnknown_0203CD64->language = gGameLanguage;
- response = FALSE;
- for (i = 0; i < len; i ++)
- {
- if (gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][i] == itemId)
+ bool8 likedItem;
+
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]);
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED;
+ BufferItemName(gStringVar2, itemId);
+ sFavorLadyPtr->itemId = itemId;
+ SetFavorLadyPlayerName(gSaveBlock2Ptr->playerName, sFavorLadyPtr->playerName);
+ sFavorLadyPtr->language = gGameLanguage;
+ likedItem = FALSE;
+ for (i = 0; i < numItems; i ++)
+ {
+ if (sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][i] == itemId)
{
- response = TRUE;
- gUnknown_0203CD64->unk_003 ++;
- gUnknown_0203CD64->unk_002 = 1;
- if (gUnknown_0203CD64->unk_010 == itemId)
+ likedItem = TRUE;
+ sFavorLadyPtr->numItemsGiven++;
+ sFavorLadyPtr->likedItem = TRUE;
+ if (sFavorLadyPtr->bestItem == itemId)
{
- gUnknown_0203CD64->unk_003 = 5;
+ sFavorLadyPtr->numItemsGiven = LILYCOVE_LADY_GIFT_THRESHOLD;
}
break;
}
- gUnknown_0203CD64->unk_002 = 0;
+ sFavorLadyPtr->likedItem = FALSE;
}
- return response;
+ return likedItem;
}
-bool8 sub_818DE44(void)
+bool8 Script_DoesFavorLadyLikeItem(void)
{
- return sub_818DD84(gSpecialVar_ItemId);
+ return DoesFavorLadyLikeItem(gSpecialVar_ItemId);
}
-bool8 sub_818DE5C(void)
+bool8 IsFavorLadyThresholdMet(void)
{
- u8 checkval;
+ u8 numItemsGiven;
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- checkval = gUnknown_0203CD64->unk_003;
- return checkval < 5 ? FALSE : TRUE;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ numItemsGiven = sFavorLadyPtr->numItemsGiven;
+ return numItemsGiven < LILYCOVE_LADY_GIFT_THRESHOLD ? FALSE : TRUE;
}
-static void sub_818DE88(u16 itemId)
+static void FavorLadyBufferPrizeName(u16 prize)
{
- sub_818DCAC(gStringVar2, itemId);
+ BufferItemName(gStringVar2, prize);
}
-u16 sub_818DEA0(void)
+u16 FavorLadyGetPrize(void)
{
- u16 itemId;
+ u16 prize;
- gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
- itemId = sUnknown_0860B304[gUnknown_0203CD64->unk_00c];
- sub_818DE88(itemId);
- gUnknown_0203CD64->phase = 2;
- return itemId;
+ sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor;
+ prize = sFavorLadyPrizes[sFavorLadyPtr->favorId];
+ FavorLadyBufferPrizeName(prize);
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE;
+ return prize;
}
-void sub_818DEDC(void)
+void SetFavorLadyState_Complete(void)
{
- SetLilycoveFavourLady();
- gUnknown_0203CD64->phase = 1;
+ InitLilycoveFavorLady();
+ sFavorLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED;
}
-void sub_818DEF4(void)
+void FieldCallback_FavorLadyEnableScriptContexts(void)
{
EnableBothScriptContexts();
}
-static void sub_818DF00(void)
+static void QuizLadyPickQuestion(void)
{
- u8 v0;
+ u8 questionId;
u8 i;
- v0 = Random() % 16;
- for (i = 0; i < 9; i ++)
+ questionId = Random() % ARRAY_COUNT(sQuizLadyQuizQuestions);
+ for (i = 0; i < QUIZ_QUESTION_LEN; i ++)
{
- gUnknown_0203CD68->unk_002[i] = gUnknown_0860B1A4[v0][i];
+ sQuizLadyPtr->question[i] = sQuizLadyQuizQuestions[questionId][i];
}
- gUnknown_0203CD68->unk_014 = sUnknown_0860B1E4[v0];
- gUnknown_0203CD68->itemId = sUnknown_0860B204[v0];
- gUnknown_0203CD68->unk_02b = v0;
- gUnknown_0203CD68->playerName[0] = EOS;
+ sQuizLadyPtr->correctAnswer = sQuizLadyQuizAnswers[questionId];
+ sQuizLadyPtr->prize = sQuizLadyPrizes[questionId];
+ sQuizLadyPtr->questionId = questionId;
+ sQuizLadyPtr->playerName[0] = EOS;
}
-static void SetLilycoveQuizLady(void)
+static void InitLilycoveQuizLady(void)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ;
- gUnknown_0203CD68->phase = 0;
- for (i = 0; i < 9; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_READY;
+ for (i = 0; i < QUIZ_QUESTION_LEN; i ++)
{
- gUnknown_0203CD68->unk_002[i] = -1;
+ sQuizLadyPtr->question[i] = -1;
}
- gUnknown_0203CD68->unk_014 = -1;
- gUnknown_0203CD68->unk_016 = -1;
- for (i = 0; i < 4; i ++)
+ sQuizLadyPtr->correctAnswer = -1;
+ sQuizLadyPtr->playerAnswer = -1;
+ for (i = 0; i < TRAINER_ID_LENGTH; i ++)
{
- gUnknown_0203CD68->playerTrainerId[i] = 0;
+ sQuizLadyPtr->playerTrainerId[i] = 0;
}
- gUnknown_0203CD68->itemId = ITEM_NONE;
- gUnknown_0203CD68->unk_02a = 0;
- gUnknown_0203CD68->unk_02c = 0x10;
- gUnknown_0203CD68->language = gGameLanguage;
- sub_818DF00();
+ sQuizLadyPtr->prize = ITEM_NONE;
+ sQuizLadyPtr->waitingForChallenger = FALSE;
+ sQuizLadyPtr->prevQuestionId = ARRAY_COUNT(sQuizLadyQuizQuestions);
+ sQuizLadyPtr->language = gGameLanguage;
+ QuizLadyPickQuestion();
}
-static void sub_818E004(void)
+static void ResetQuizLadyForRecordMix(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ;
- gUnknown_0203CD68->phase = 0;
- gUnknown_0203CD68->unk_02a = 0;
- gUnknown_0203CD68->unk_016 = -1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_READY;
+ sQuizLadyPtr->waitingForChallenger = FALSE;
+ sQuizLadyPtr->playerAnswer = -1;
}
-u8 sub_818E038(void)
+u8 GetQuizLadyState(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (gUnknown_0203CD68->phase == 2)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (sQuizLadyPtr->state == LILYCOVE_LADY_STATE_PRIZE)
{
- return 2;
+ return LILYCOVE_LADY_STATE_PRIZE;
}
- else if (gUnknown_0203CD68->phase == 1)
+ else if (sQuizLadyPtr->state == LILYCOVE_LADY_STATE_COMPLETED)
{
- return 1;
+ return LILYCOVE_LADY_STATE_COMPLETED;
}
else
{
- return 0;
+ return LILYCOVE_LADY_STATE_READY;
}
}
-u8 sub_818E06C(void)
+u8 GetQuizAuthor(void)
{
int i;
int j;
- u8 rv;
+ u8 authorNameId;
struct LilycoveLadyQuiz *quiz;
quiz = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (sub_811F8D8(quiz->unk_014) == 0)
- {
- i = quiz->unk_02b;
+ if (sub_811F8D8(quiz->correctAnswer) == 0)
+ {
+ i = quiz->questionId;
do
{
- if (++ i >= 16)
+ if (++ i >= (int)(ARRAY_COUNT(sQuizLadyQuizQuestions)))
{
i = 0;
}
- } while (sub_811F8D8(sUnknown_0860B1E4[i]) == 0);
- for (j = 0; j < 9; j ++)
+ } while (sub_811F8D8(sQuizLadyQuizAnswers[i]) == 0);
+ for (j = 0; j < QUIZ_QUESTION_LEN; j ++)
{
- quiz->unk_002[j] = gUnknown_0860B1A4[i][j];
+ quiz->question[j] = sQuizLadyQuizQuestions[i][j];
}
- quiz->unk_014 = sUnknown_0860B1E4[i];
- quiz->itemId = sUnknown_0860B204[i];
- quiz->unk_02b = i;
+ quiz->correctAnswer = sQuizLadyQuizAnswers[i];
+ quiz->prize = sQuizLadyPrizes[i];
+ quiz->questionId = i;
quiz->playerName[0] = EOS;
}
- rv = sub_818E13C();
- if (rv == 0)
+ authorNameId = BufferQuizAuthorName();
+ if (authorNameId == QUIZ_AUTHOR_NAME_LADY)
{
- return 2;
+ return QUIZ_AUTHOR_LADY;
}
- else if (rv == 2 || sub_818E1F4())
+ else if (authorNameId == QUIZ_AUTHOR_NAME_OTHER_PLAYER || IsQuizTrainerIdNotPlayer())
{
- return 1;
+ return QUIZ_AUTHOR_OTHER_PLAYER;
}
else
{
- return 0;
+ return QUIZ_AUTHOR_PLAYER;
}
}
-static u8 sub_818E13C(void)
+static u8 BufferQuizAuthorName(void)
{
- u8 retval;
- u8 len;
+ u8 authorNameId;
+ u8 nameLen;
u8 i;
- retval = 1;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (gUnknown_0203CD68->playerName[0] == EOS)
+ authorNameId = QUIZ_AUTHOR_NAME_PLAYER;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (sQuizLadyPtr->playerName[0] == EOS)
{
- StringCopy7(gStringVar1, gText_Lady2);
- retval = 0;
+ StringCopy7(gStringVar1, gText_QuizLady_Lady);
+ authorNameId = QUIZ_AUTHOR_NAME_LADY;
}
else
{
- StringCopy7(gStringVar1, gUnknown_0203CD68->playerName);
- ConvertInternationalString(gStringVar1, gUnknown_0203CD68->language);
- len = sub_818E258(gUnknown_0203CD68->playerName);
- if (len == sub_818E258(gSaveBlock2Ptr->playerName))
+ StringCopy7(gStringVar1, sQuizLadyPtr->playerName);
+ ConvertInternationalString(gStringVar1, sQuizLadyPtr->language);
+ nameLen = GetPlayerNameLength(sQuizLadyPtr->playerName);
+ if (nameLen == GetPlayerNameLength(gSaveBlock2Ptr->playerName))
{
- u8 *name = gUnknown_0203CD68->playerName;
- for (i = 0; i < len; i ++)
+ u8 *name = sQuizLadyPtr->playerName;
+ for (i = 0; i < nameLen; i ++)
{
- name = gUnknown_0203CD68->playerName;
+ name = sQuizLadyPtr->playerName;
if (name[i] != gSaveBlock2Ptr->playerName[i])
{
- retval = 2;
+ authorNameId = QUIZ_AUTHOR_NAME_OTHER_PLAYER;
break;
}
}
}
}
- return retval;
+ return authorNameId;
}
-static u8 sub_818E1F4(void)
+static bool8 IsQuizTrainerIdNotPlayer(void)
{
- bool8 response;
+ bool8 notPlayer;
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- response = FALSE;
- for (i = 0; i < 4; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ notPlayer = FALSE;
+ for (i = 0; i < TRAINER_ID_LENGTH; i ++)
{
- if (gUnknown_0203CD68->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i])
+ if (sQuizLadyPtr->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i])
{
- response = TRUE;
+ notPlayer = TRUE;
break;
}
}
- return response;
+ return notPlayer;
}
-static u8 sub_818E258(const u8 *str)
+static u8 GetPlayerNameLength(const u8 *playerName)
{
u8 len;
const u8 *ptr;
- for (len = 0, ptr = str; *ptr != EOS; len ++, ptr ++);
+ for (len = 0, ptr = playerName; *ptr != EOS; len ++, ptr ++);
return len;
}
-void sub_818E274(void)
+void BufferQuizPrizeName(void)
{
- StringCopy(gStringVar1, ItemId_GetName(gUnknown_0203CD68->itemId));
+ StringCopy(gStringVar1, ItemId_GetName(sQuizLadyPtr->prize));
}
-bool8 sub_818E298(void)
+bool8 BufferQuizAuthorNameAndCheckIfLady(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (!sub_818E13C())
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (BufferQuizAuthorName() == QUIZ_AUTHOR_NAME_LADY)
{
- gUnknown_0203CD68->language = gGameLanguage;
+ sQuizLadyPtr->language = gGameLanguage;
return TRUE;
}
return FALSE;
}
-u8 sub_818E2D8(void)
+bool8 IsQuizLadyWaitingForChallenger(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- return gUnknown_0203CD68->unk_02a;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ return sQuizLadyPtr->waitingForChallenger;
}
-void sub_818E2FC(void)
+void QuizLadyGetPlayerAnswer(void)
{
ShowEasyChatScreen();
}
-bool8 sub_818E308(void)
+bool8 IsQuizAnswerCorrect(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- CopyEasyChatWord(gStringVar1, gUnknown_0203CD68->unk_014);
- CopyEasyChatWord(gStringVar2, gUnknown_0203CD68->unk_016);
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ CopyEasyChatWord(gStringVar1, sQuizLadyPtr->correctAnswer);
+ CopyEasyChatWord(gStringVar2, sQuizLadyPtr->playerAnswer);
return StringCompare(gStringVar1, gStringVar2) ? FALSE : TRUE;
}
-void sub_818E358(void)
+void BufferQuizPrizeItem(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gSpecialVar_0x8005 = gUnknown_0203CD68->itemId;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ gSpecialVar_0x8005 = sQuizLadyPtr->prize;
}
-void sub_818E37C(void)
+void SetQuizLadyState_Complete(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->phase = 1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED;
}
-void sub_818E39C(void)
+void SetQuizLadyState_GivePrize(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->phase = 2;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE;
}
-void sub_818E3BC(void)
+void ClearQuizLadyPlayerAnswer(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->unk_016 = -1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->playerAnswer = -1;
}
-void sub_818E3E0(void)
+void Script_QuizLadyOpenBagMenu(void)
{
- sub_81AAC70();
+ QuizLadyOpenBagMenu();
}
-void sub_818E3EC(void)
+void QuizLadyPickNewQuestion(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (sub_818E298())
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (BufferQuizAuthorNameAndCheckIfLady())
{
- gUnknown_0203CD68->unk_02c = gUnknown_0203CD68->unk_02b;
+ sQuizLadyPtr->prevQuestionId = sQuizLadyPtr->questionId;
}
else
{
- gUnknown_0203CD68->unk_02c = 0x10;
+ sQuizLadyPtr->prevQuestionId = ARRAY_COUNT(sQuizLadyQuizQuestions);
}
- sub_818DF00();
+ QuizLadyPickQuestion();
}
-void sub_818E430(void)
+void ClearQuizLadyQuestionAndAnswer(void)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- for (i = 0; i < 9; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ for (i = 0; i < QUIZ_QUESTION_LEN; i ++)
{
- gUnknown_0203CD68->unk_002[i] = -1;
+ sQuizLadyPtr->question[i] = -1;
}
- gUnknown_0203CD68->unk_014 = -1;
+ sQuizLadyPtr->correctAnswer = -1;
}
-void sub_818E47C(void)
+void QuizLadySetCustomQuestion(void)
{
gSpecialVar_0x8004 = EASY_CHAT_TYPE_QUIZ_SET_QUESTION;
ShowEasyChatScreen();
}
-void sub_818E490(void)
+void QuizLadyTakePrizeForCustomQuiz(void)
{
RemoveBagItem(gSpecialVar_ItemId, 1);
}
-void sub_818E4A4(void)
+void QuizLadyRecordCustomQuizData(void)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->itemId = gSpecialVar_ItemId;
- for (i = 0; i < 4; i ++)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->prize = gSpecialVar_ItemId;
+ for (i = 0; i < TRAINER_ID_LENGTH; i ++)
{
- gUnknown_0203CD68->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+ sQuizLadyPtr->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
}
- StringCopy7(gUnknown_0203CD68->playerName, gSaveBlock2Ptr->playerName);
- gUnknown_0203CD68->language = gGameLanguage;
+ StringCopy7(sQuizLadyPtr->playerName, gSaveBlock2Ptr->playerName);
+ sQuizLadyPtr->language = gGameLanguage;
}
-void sub_818E510(void)
+void QuizLadySetWaitingForChallenger(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- gUnknown_0203CD68->unk_02a = 1;
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ sQuizLadyPtr->waitingForChallenger = TRUE;
}
-void sub_818E538(void)
+void BufferQuizCorrectAnswer(void)
{
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- CopyEasyChatWord(gStringVar3, gUnknown_0203CD68->unk_014);
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ CopyEasyChatWord(gStringVar3, sQuizLadyPtr->correctAnswer);
}
-void sub_818E564(void)
+
+void FieldCallback_QuizLadyEnableScriptContexts(void)
{
EnableBothScriptContexts();
}
-void sub_818E570(const LilycoveLady *lilycoveLady)
+void QuizLadyClearQuestionForRecordMix(const LilycoveLady *lilycoveLady)
{
u8 i;
- gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
- if (lilycoveLady->quiz.unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ)
+ sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz;
+ if (lilycoveLady->quiz.prevQuestionId < ARRAY_COUNT(sQuizLadyQuizQuestions)
+ && sQuizLadyPtr->id == LILYCOVE_LADY_QUIZ)
{
for (i = 0; i < 4; i ++)
{
- if (lilycoveLady->quiz.unk_02c != gUnknown_0203CD68->unk_02b)
+ if (lilycoveLady->quiz.prevQuestionId != sQuizLadyPtr->questionId)
{
break;
}
- gUnknown_0203CD68->unk_02b = Random() % 16;
+ sQuizLadyPtr->questionId = Random() % ARRAY_COUNT(sQuizLadyQuizQuestions);
}
- if (lilycoveLady->quiz.unk_02c == gUnknown_0203CD68->unk_02b)
+ if (lilycoveLady->quiz.prevQuestionId == sQuizLadyPtr->questionId)
{
- gUnknown_0203CD68->unk_02b = (gUnknown_0203CD68->unk_02b + 1) % 16;
+ sQuizLadyPtr->questionId = (sQuizLadyPtr->questionId + 1) % (int)(ARRAY_COUNT(sQuizLadyQuizQuestions));
}
- gUnknown_0203CD68->unk_02c = lilycoveLady->quiz.unk_02c;
+ sQuizLadyPtr->prevQuestionId = lilycoveLady->quiz.prevQuestionId;
}
}
-static void sub_818E604(void)
+static void ResetContestLadyContestData(void)
{
- gUnknown_0203CD6C->playerName[0] = EOS;
- gUnknown_0203CD6C->fave_pkblk = 0;
- gUnknown_0203CD6C->other_pkblk = 0;
- gUnknown_0203CD6C->max_sheen = 0;
- gUnknown_0203CD6C->category = Random() % 5;
+ sContestLadyPtr->playerName[0] = EOS;
+ sContestLadyPtr->numGoodPokeblocksGiven = 0;
+ sContestLadyPtr->numOtherPokeblocksGiven = 0;
+ sContestLadyPtr->maxSheen = 0;
+ sContestLadyPtr->category = Random() % CONTEST_CATEGORIES_COUNT;
}
-static void SetLilycoveContestLady(void)
+static void InitLilycoveContestLady(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST;
- gUnknown_0203CD6C->phase = 0;
- sub_818E604();
- gUnknown_0203CD6C->language = gGameLanguage;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ sContestLadyPtr->id = LILYCOVE_LADY_CONTEST;
+ sContestLadyPtr->givenPokeblock = FALSE;
+ ResetContestLadyContestData();
+ sContestLadyPtr->language = gGameLanguage;
}
-static void sub_818E674(void)
+static void ResetContestLadyForRecordMix(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST;
- gUnknown_0203CD6C->phase = 0;
- if (gUnknown_0203CD6C->fave_pkblk == 5 || gUnknown_0203CD6C->other_pkblk == 5)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ sContestLadyPtr->id = LILYCOVE_LADY_CONTEST;
+ sContestLadyPtr->givenPokeblock = FALSE;
+ if (sContestLadyPtr->numGoodPokeblocksGiven == LILYCOVE_LADY_GIFT_THRESHOLD
+ || sContestLadyPtr->numOtherPokeblocksGiven == LILYCOVE_LADY_GIFT_THRESHOLD)
{
- sub_818E604();
+ ResetContestLadyContestData();
}
}
-static void sub_818E6B0(u8 sheen)
+static void ContestLadySavePlayerNameIfHighSheen(u8 sheen)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->max_sheen <= sheen)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->maxSheen <= sheen)
{
- gUnknown_0203CD6C->max_sheen = sheen;
- memset(gUnknown_0203CD6C->playerName, EOS, sizeof(gUnknown_0203CD6C->playerName));
- memcpy(gUnknown_0203CD6C->playerName, gSaveBlock2Ptr->playerName, sizeof(gUnknown_0203CD6C->playerName));
- gUnknown_0203CD6C->language = gGameLanguage;
+ sContestLadyPtr->maxSheen = sheen;
+ memset(sContestLadyPtr->playerName, EOS, sizeof(sContestLadyPtr->playerName));
+ memcpy(sContestLadyPtr->playerName, gSaveBlock2Ptr->playerName, sizeof(sContestLadyPtr->playerName));
+ sContestLadyPtr->language = gGameLanguage;
}
}
bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock)
{
- u8 sheen;
- bool8 response;
+ u8 sheen = 0;
+ bool8 correctFlavor = FALSE;
- sheen = 0;
- response = FALSE;
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- switch (gUnknown_0203CD6C->category)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ switch (sContestLadyPtr->category)
{
- case 0:
+ case CONTEST_CATEGORY_COOL:
if (pokeblock->spicy != 0)
{
sheen = pokeblock->spicy;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 1:
+ case CONTEST_CATEGORY_BEAUTY:
if (pokeblock->dry != 0)
{
sheen = pokeblock->dry;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 2:
+ case CONTEST_CATEGORY_CUTE:
if (pokeblock->sweet != 0)
{
sheen = pokeblock->sweet;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 3:
+ case CONTEST_CATEGORY_SMART:
if (pokeblock->bitter != 0)
{
sheen = pokeblock->bitter;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
- case 4:
+ case CONTEST_CATEGORY_TOUGH:
if (pokeblock->sour != 0)
{
sheen = pokeblock->sour;
- response = TRUE;
+ correctFlavor = TRUE;
}
break;
}
- if (response == TRUE)
+ if (correctFlavor == TRUE)
{
- sub_818E6B0(sheen);
- gUnknown_0203CD6C->fave_pkblk ++;
+ ContestLadySavePlayerNameIfHighSheen(sheen);
+ sContestLadyPtr->numGoodPokeblocksGiven++;
}
else
{
- gUnknown_0203CD6C->other_pkblk ++;
+ sContestLadyPtr->numOtherPokeblocksGiven++;
}
- return response;
+ return correctFlavor;
}
-static void sub_818E794(u8 *dest1, u8 *dest2)
+static void BufferContestLadyCategoryAndMonName(u8 *dest1, u8 *dest2)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- StringCopy(dest1, gUnknown_0860B324[gUnknown_0203CD6C->category]);
- StringCopy10(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]);
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ StringCopy(dest1, sContestLadyCategoryNames[sContestLadyPtr->category]);
+ StringCopy10(dest2, sContestLadyMonNames[sContestLadyPtr->category]);
}
-void sub_818E7E0(u8 *dest1, u8 *dest2)
+void BufferContestLadyMonName(u8 *dest1, u8 *dest2)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- *dest1 = gUnknown_0203CD6C->category;
- StringCopy(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]);
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ *dest1 = sContestLadyPtr->category;
+ StringCopy(dest2, sContestLadyMonNames[sContestLadyPtr->category]);
}
-void sub_818E81C(u8 *dest)
+void BufferContestLadyPlayerName(u8 *dest)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- StringCopy(dest, gUnknown_0203CD6C->playerName);
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ StringCopy(dest, sContestLadyPtr->playerName);
}
-void sub_818E848(u8 *dest)
+void BufferContestLadyLanguage(u8 *dest)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- *dest = gUnknown_0203CD6C->language;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ *dest = sContestLadyPtr->language;
}
-void sub_818E868(u8 *dest, u8 category)
+void BufferContestName(u8 *dest, u8 category)
{
- StringCopy(dest, gUnknown_0860B338[category]);
+ StringCopy(dest, sContestNames[category]);
}
+// used in tv.c to determine sTVShowState for Contest Lady show
+// if return val is 1, sTVShowState is 1
+// if return val is 2, sTVShowState is 3
+// if return val is 0, sTVShowState is 2
u8 sub_818E880(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->fave_pkblk >= 5)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->numGoodPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD)
{
return 1;
}
- else if (gUnknown_0203CD6C->fave_pkblk == 0)
+ else if (sContestLadyPtr->numGoodPokeblocksGiven == 0)
{
return 2;
}
@@ -973,53 +783,54 @@ u8 sub_818E880(void)
}
}
-bool8 sub_818E8B4(void)
+
+bool8 HasPlayerGivenContestLadyPokeblock(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->phase == 1)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->givenPokeblock == TRUE)
{
return TRUE;
}
return FALSE;
}
-bool8 sub_818E8E0(void)
+bool8 ShouldContestLadyShowGoOnAir(void)
{
- bool8 response;
+ bool8 putOnAir = FALSE;
- response = FALSE;
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- if (gUnknown_0203CD6C->fave_pkblk >= 5 || gUnknown_0203CD6C->other_pkblk >= 5)
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ if (sContestLadyPtr->numGoodPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD
+ || sContestLadyPtr->numOtherPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD)
{
- response = TRUE;
+ putOnAir = TRUE;
}
- return response;
+ return putOnAir;
}
-void sub_818E914(void)
+void Script_BufferContestLadyCategoryAndMonName(void)
{
- sub_818E794(gStringVar2, gStringVar1);
+ BufferContestLadyCategoryAndMonName(gStringVar2, gStringVar1);
}
-void sub_818E92C(void)
+void OpenPokeblockCaseForContestLady(void)
{
OpenPokeblockCase(3, CB2_ReturnToField);
}
-void sub_818E940(void)
+void SetContestLadyGivenPokeblock(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gUnknown_0203CD6C->phase = 1;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ sContestLadyPtr->givenPokeblock = TRUE;
}
-void sub_818E960(void)
+void GetContestLadyMonSpecies(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- gSpecialVar_0x8005 = sUnknown_0860B34C[gUnknown_0203CD6C->category];
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ gSpecialVar_0x8005 = sContestLadyMonSpecies[sContestLadyPtr->category];
}
-u8 sub_818E990(void)
+u8 GetContestLadyCategory(void)
{
- gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
- return gUnknown_0203CD6C->category;
+ sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest;
+ return sContestLadyPtr->category;
}
diff --git a/src/link.c b/src/link.c
index bcdcb52a4..9928b48da 100644
--- a/src/link.c
+++ b/src/link.c
@@ -52,22 +52,21 @@ struct LinkTestBGInfo
// Static RAM declarations
-IWRAM_DATA struct BlockTransfer sBlockSend;
-IWRAM_DATA u32 link_c_unused_03000d1c;
-IWRAM_DATA struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS];
-IWRAM_DATA u32 sBlockSendDelayCounter;
-IWRAM_DATA u32 gUnknown_03000D54;
-IWRAM_DATA u8 gUnknown_03000D58;
-IWRAM_DATA u32 sPlayerDataExchangeStatus;
-IWRAM_DATA u32 gUnknown_03000D60;
-IWRAM_DATA u8 sLinkTestLastBlockSendPos;
-ALIGNED() IWRAM_DATA u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS];
-IWRAM_DATA u8 sNumVBlanksWithoutSerialIntr;
-IWRAM_DATA bool8 sSendBufferEmpty;
-IWRAM_DATA u16 sSendNonzeroCheck;
-IWRAM_DATA u16 sRecvNonzeroCheck;
-IWRAM_DATA u8 sChecksumAvailable;
-IWRAM_DATA u8 sHandshakePlayerCount;
+static struct BlockTransfer sBlockSend;
+static struct BlockTransfer sBlockRecv[MAX_LINK_PLAYERS];
+static u32 sBlockSendDelayCounter;
+static u32 gUnknown_03000D54;
+static u8 gUnknown_03000D58;
+static u32 sPlayerDataExchangeStatus;
+static u32 gUnknown_03000D60;
+static u8 sLinkTestLastBlockSendPos;
+static u8 sLinkTestLastBlockRecvPos[MAX_LINK_PLAYERS];
+static u8 sNumVBlanksWithoutSerialIntr;
+static bool8 sSendBufferEmpty;
+static u16 sSendNonzeroCheck;
+static u16 sRecvNonzeroCheck;
+static u8 sChecksumAvailable;
+static u8 sHandshakePlayerCount;
u16 gLinkPartnersHeldKeys[6];
u32 gLinkDebugSeed;
diff --git a/src/link_rfu.c b/src/link_rfu.c
index 9732e9889..4b0b0a2a5 100644
--- a/src/link_rfu.c
+++ b/src/link_rfu.c
@@ -24,10 +24,10 @@ extern u16 gHeldKeyCodeToSend;
struct UnkRfuStruct_1 gUnknown_03004140;
struct UnkRfuStruct_2 gUnknown_03005000;
-IWRAM_DATA u8 gUnknown_03000D74;
-ALIGNED(4) IWRAM_DATA u8 gUnknown_03000D78[8];
-IWRAM_DATA u8 gUnknown_03000D80[16];
-IWRAM_DATA u16 gUnknown_03000D90[8];
+BSS_DATA u8 gUnknown_03000D74;
+ALIGNED(4) BSS_DATA u8 gUnknown_03000D78[8];
+BSS_DATA u8 gUnknown_03000D80[16];
+BSS_DATA u16 gUnknown_03000D90[8];
EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0;
EWRAM_DATA ALIGNED(4) struct UnkLinkRfuStruct_02022B14 gUnknown_02022B14 = {};
@@ -2021,6 +2021,8 @@ void sub_800DBF8(u8 *q1, u8 mode)
}
}
+// File boundary here maybe?
+
void PkmnStrToASCII(u8 *q1, const u8 *q2)
{
s32 i;
@@ -2413,7 +2415,7 @@ void RecordMixTrainerNames(void)
}
}
}
-
+
// Save the connected trainers first, at the top of the list.
nextSpace = 0;
for (i = 0; i < GetLinkPlayerCount(); i++)
@@ -2444,7 +2446,7 @@ void RecordMixTrainerNames(void)
}
}
}
-
+
// Finalize the new list, and clean up.
memcpy(gSaveBlock1Ptr->trainerNameRecords, newRecords, 20 * sizeof(struct TrainerNameRecord));
free(newRecords);
@@ -2480,7 +2482,7 @@ void WipeTrainerNameRecords(void)
}
}
-void nullsub_5(const char *unused_0, u8 unused_1, u8 unused_2)
+void nullsub_5(const void *unused_0, u8 unused_1, u8 unused_2)
{
// debug?
}
@@ -2510,7 +2512,7 @@ void sub_800E604(void)
sub_800D724(&gUnknown_03005000.unk_9e8);
CpuFill16(0, gSendCmd, sizeof gSendCmd);
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
- CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers)
+ CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers);
}
void sub_800E6D0(void)
@@ -2914,70 +2916,21 @@ void sub_800EF88(u8 a0)
}
}
-#ifdef NONMATCHING
-// FIXME: gUnknown_03005000.unk_c87 should be in r5
-// FIXME: gRecvCmds should be in r6 and r7
void sub_800EFB0(void)
{
s32 i, j;
+
for (i = 0; i < 5; i++)
{
+ struct UnkRfuStruct_2 *ptr = &gUnknown_03005000;
for (j = 0; j < 7; j++)
{
- gUnknown_03005000.unk_c87[i][j][1] = gRecvCmds[i][j] >> 8;
- gUnknown_03005000.unk_c87[i][j][0] = gRecvCmds[i][j];
+ ptr->unk_c87[i][j][1] = gRecvCmds[i][j] >> 8;
+ ptr->unk_c87[i][j][0] = gRecvCmds[i][j];
}
}
CpuFill16(0, gRecvCmds, sizeof gRecvCmds);
}
-#else
-NAKED void sub_800EFB0(void)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tsub sp, 0x4\n"
- "\tmovs r2, 0\n"
- "\tldr r7, =gRecvCmds\n"
- "\tldr r0, =gUnknown_03005000\n"
- "\tadds r6, r7, 0\n"
- "\tldr r1, =0x00000c87\n"
- "\tadds r5, r0, r1\n"
- "_0800EFC0:\n"
- "\tmovs r3, 0\n"
- "\tlsls r0, r2, 3\n"
- "\tlsls r1, r2, 4\n"
- "\tadds r4, r2, 0x1\n"
- "\tsubs r0, r2\n"
- "\tlsls r0, 1\n"
- "\tadds r2, r0, r5\n"
- "\tadds r1, r6\n"
- "_0800EFD0:\n"
- "\tldrh r0, [r1]\n"
- "\tlsrs r0, 8\n"
- "\tstrb r0, [r2, 0x1]\n"
- "\tldrh r0, [r1]\n"
- "\tstrb r0, [r2]\n"
- "\tadds r2, 0x2\n"
- "\tadds r1, 0x2\n"
- "\tadds r3, 0x1\n"
- "\tcmp r3, 0x6\n"
- "\tble _0800EFD0\n"
- "\tadds r2, r4, 0\n"
- "\tcmp r2, 0x4\n"
- "\tble _0800EFC0\n"
- "\tmovs r0, 0\n"
- "\tmov r1, sp\n"
- "\tstrh r0, [r1]\n"
- "\tldr r2, =0x01000028\n"
- "\tmov r0, sp\n"
- "\tadds r1, r7, 0\n"
- "\tbl CpuSet\n"
- "\tadd sp, 0x4\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.pool");
-}
-#endif
void sub_800F014(void)
{
@@ -3542,7 +3495,7 @@ void sub_800FD14(u16 command)
}
}
-void sub_800FE50(u16 *a0)
+void sub_800FE50(void *a0)
{
if (gSendCmd[0] == 0 && !sub_8011A80())
{
@@ -5191,4 +5144,3 @@ u32 GetRfuRecvQueueLength(void)
{
return gUnknown_03005000.unk_124.unk_8c2;
}
-
diff --git a/src/load_save.c b/src/load_save.c
index 150c557c6..5857f2b46 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -42,10 +42,10 @@ EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0};
EWRAM_DATA u32 gLastEncryptionKey = 0;
// IWRAM common
-IWRAM_DATA bool32 gFlashMemoryPresent;
-IWRAM_DATA struct SaveBlock1 *gSaveBlock1Ptr;
-IWRAM_DATA struct SaveBlock2 *gSaveBlock2Ptr;
-IWRAM_DATA struct PokemonStorage *gPokemonStoragePtr;
+bool32 gFlashMemoryPresent;
+struct SaveBlock1 *gSaveBlock1Ptr;
+struct SaveBlock2 *gSaveBlock2Ptr;
+struct PokemonStorage *gPokemonStoragePtr;
// code
void CheckForFlashMemory(void)
diff --git a/src/m4a.c b/src/m4a.c
index 7b4441ca4..267a72657 100644
--- a/src/m4a.c
+++ b/src/m4a.c
@@ -1,3 +1,4 @@
+#include <string.h>
#include "gba/m4a_internal.h"
extern const u8 gCgb3Vol[];
diff --git a/src/m4a_1.s b/src/m4a_1.s
new file mode 100644
index 000000000..cab4ed174
--- /dev/null
+++ b/src/m4a_1.s
@@ -0,0 +1,1934 @@
+ .include "asm/macros.inc"
+ .include "constants/gba_constants.inc"
+ .include "constants/m4a_constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start umul3232H32
+umul3232H32:
+ adr r2, __umul3232H32
+ bx r2
+ .arm
+__umul3232H32:
+ umull r2, r3, r0, r1
+ add r0, r3, 0
+ bx lr
+ thumb_func_end umul3232H32
+
+ thumb_func_start SoundMain
+SoundMain:
+ ldr r0, lt_SOUND_INFO_PTR
+ ldr r0, [r0]
+ ldr r2, lt_ID_NUMBER
+ ldr r3, [r0, o_SoundInfo_ident]
+ cmp r2, r3
+ beq SoundMain_1
+ bx lr @ Exit the function if ident doesn't match ID_NUMBER.
+SoundMain_1:
+ adds r3, 1
+ str r3, [r0, o_SoundInfo_ident]
+ push {r4-r7,lr}
+ mov r1, r8
+ mov r2, r9
+ mov r3, r10
+ mov r4, r11
+ push {r0-r4}
+ sub sp, 0x18
+ ldrb r1, [r0, o_SoundInfo_maxLines]
+ cmp r1, 0 @ if maxLines is 0, there is no maximum
+ beq SoundMain_3
+ ldr r2, lt_REG_VCOUNT
+ ldrb r2, [r2]
+ cmp r2, VCOUNT_VBLANK
+ bhs SoundMain_2
+ adds r2, TOTAL_SCANLINES
+SoundMain_2:
+ adds r1, r2
+SoundMain_3:
+ str r1, [sp, 0x14]
+ ldr r3, [r0, o_SoundInfo_func]
+ cmp r3, 0
+ beq SoundMain_4
+ ldr r0, [r0, o_SoundInfo_intp]
+ bl _081DD25E
+ ldr r0, [sp, 0x18]
+SoundMain_4:
+ ldr r3, [r0, o_SoundInfo_CgbSound]
+ bl _081DD25E
+ ldr r0, [sp, 0x18]
+ ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank]
+ mov r8, r3
+ ldr r5, lt_o_SoundInfo_pcmBuffer
+ adds r5, r0
+ ldrb r4, [r0, o_SoundInfo_pcmDmaCounter]
+ subs r7, r4, 1
+ bls SoundMain_5
+ ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod]
+ subs r1, r7
+ mov r2, r8
+ muls r2, r1
+ adds r5, r2
+SoundMain_5:
+ str r5, [sp, 0x8]
+ ldr r6, lt_PCM_DMA_BUF_SIZE
+ ldr r3, lt_SoundMainRAM_Buffer
+ bx r3
+
+ .align 2, 0
+lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR
+lt_ID_NUMBER: .word ID_NUMBER
+lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1
+lt_REG_VCOUNT: .word REG_VCOUNT
+lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer
+lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE
+ thumb_func_end SoundMain
+
+ thumb_func_start SoundMainRAM
+SoundMainRAM:
+ ldrb r3, [r0, o_SoundInfo_reverb]
+ cmp r3, 0
+ beq SoundMainRAM_NoReverb
+ adr r1, SoundMainRAM_Reverb
+ bx r1
+ .arm
+SoundMainRAM_Reverb:
+ cmp r4, 0x2
+ addeq r7, r0, o_SoundInfo_pcmBuffer
+ addne r7, r5, r8
+ mov r4, r8
+_081DCEC4:
+ ldrsb r0, [r5, r6]
+ ldrsb r1, [r5]
+ add r0, r0, r1
+ ldrsb r1, [r7, r6]
+ add r0, r0, r1
+ ldrsb r1, [r7], 0x1
+ add r0, r0, r1
+ mul r1, r0, r3
+ mov r0, r1, asr 9
+ tst r0, 0x80
+ addne r0, r0, 0x1
+ strb r0, [r5, r6]
+ strb r0, [r5], 0x1
+ subs r4, r4, 0x1
+ bgt _081DCEC4
+ adr r0, _081DCF36 + 1 @ plus 1 because THUMB
+ bx r0
+ .thumb
+SoundMainRAM_NoReverb:
+ movs r0, 0
+ mov r1, r8
+ adds r6, r5
+ lsrs r1, 3
+ bcc SoundMainRAM_NoReverb_Ok
+ stm r5!, {r0}
+ stm r6!, {r0}
+SoundMainRAM_NoReverb_Ok:
+ lsrs r1, 1
+ bcc SoundMainRAM_NoReverb_Loop
+ stm r5!, {r0}
+ stm r6!, {r0}
+ stm r5!, {r0}
+ stm r6!, {r0}
+SoundMainRAM_NoReverb_Loop:
+ stm r5!, {r0}
+ stm r6!, {r0}
+ stm r5!, {r0}
+ stm r6!, {r0}
+ stm r5!, {r0}
+ stm r6!, {r0}
+ stm r5!, {r0}
+ stm r6!, {r0}
+ subs r1, 1
+ bgt SoundMainRAM_NoReverb_Loop
+_081DCF36:
+ ldr r4, [sp, 0x18]
+ ldr r0, [r4, o_SoundInfo_divFreq]
+ mov r12, r0
+ ldrb r0, [r4, o_SoundInfo_maxChans]
+ adds r4, o_SoundInfo_chans
+
+SoundMainRAM_ChanLoop:
+ str r0, [sp, 0x4]
+ ldr r3, [r4, o_SoundChannel_wav]
+ ldr r0, [sp, 0x14]
+ cmp r0, 0
+ beq _081DCF60
+ ldr r1, =REG_VCOUNT
+ ldrb r1, [r1]
+ cmp r1, VCOUNT_VBLANK
+ bhs _081DCF54
+ adds r1, TOTAL_SCANLINES
+_081DCF54:
+ cmp r1, r0
+ blo _081DCF60
+ b _081DD24A
+
+ .pool
+
+_081DCF60:
+ ldrb r6, [r4, o_SoundChannel_status]
+ movs r0, 0xC7
+ tst r0, r6
+ bne _081DCF6A
+ b _081DD240
+_081DCF6A:
+ movs r0, 0x80
+ tst r0, r6
+ beq _081DCFA0
+ movs r0, 0x40
+ tst r0, r6
+ bne _081DCFB0
+ movs r6, 0x3
+ strb r6, [r4, o_SoundChannel_status]
+ adds r0, r3, 0
+ adds r0, 0x10
+ ldr r1, [r4, o_SoundChannel_ct]
+ adds r0, r1
+ str r0, [r4, o_SoundChannel_cp]
+ ldr r0, [r3, 0xC]
+ subs r0, r1
+ str r0, [r4, o_SoundChannel_ct]
+ movs r5, 0
+ strb r5, [r4, o_SoundChannel_ev]
+ str r5, [r4, o_SoundChannel_fw]
+ ldrb r2, [r3, 0x3]
+ movs r0, 0xC0
+ tst r0, r2
+ beq _081DCFF8
+ movs r0, 0x10
+ orrs r6, r0
+ strb r6, [r4, o_SoundChannel_status]
+ b _081DCFF8
+_081DCFA0:
+ ldrb r5, [r4, o_SoundChannel_ev]
+ movs r0, 0x4
+ tst r0, r6
+ beq _081DCFB6
+ ldrb r0, [r4, o_SoundChannel_iel]
+ subs r0, 1
+ strb r0, [r4, o_SoundChannel_iel]
+ bhi _081DD006
+_081DCFB0:
+ movs r0, 0
+ strb r0, [r4, o_SoundChannel_status]
+ b _081DD240
+_081DCFB6:
+ movs r0, 0x40
+ tst r0, r6
+ beq _081DCFD6
+ ldrb r0, [r4, o_SoundChannel_release]
+ muls r5, r0
+ lsrs r5, 8
+ ldrb r0, [r4, o_SoundChannel_iev]
+ cmp r5, r0
+ bhi _081DD006
+_081DCFC8:
+ ldrb r5, [r4, o_SoundChannel_iev]
+ cmp r5, 0
+ beq _081DCFB0
+ movs r0, 0x4
+ orrs r6, r0
+ strb r6, [r4, o_SoundChannel_status]
+ b _081DD006
+_081DCFD6:
+ movs r2, 0x3
+ ands r2, r6
+ cmp r2, 0x2
+ bne _081DCFF4
+ ldrb r0, [r4, o_SoundChannel_decay]
+ muls r5, r0
+ lsrs r5, 8
+ ldrb r0, [r4, o_SoundChannel_sustain]
+ cmp r5, r0
+ bhi _081DD006
+ adds r5, r0, 0
+ beq _081DCFC8
+ subs r6, 0x1
+ strb r6, [r4, o_SoundChannel_status]
+ b _081DD006
+_081DCFF4:
+ cmp r2, 0x3
+ bne _081DD006
+_081DCFF8:
+ ldrb r0, [r4, o_SoundChannel_attack]
+ adds r5, r0
+ cmp r5, 0xFF
+ bcc _081DD006
+ movs r5, 0xFF
+ subs r6, 0x1
+ strb r6, [r4, o_SoundChannel_status]
+_081DD006:
+ strb r5, [r4, o_SoundChannel_ev]
+ ldr r0, [sp, 0x18]
+ ldrb r0, [r0, o_SoundChannel_release]
+ adds r0, 0x1
+ muls r0, r5
+ lsrs r5, r0, 4
+ ldrb r0, [r4, o_SoundChannel_rightVolume]
+ muls r0, r5
+ lsrs r0, 8
+ strb r0, [r4, o_SoundChannel_er]
+ ldrb r0, [r4, o_SoundChannel_leftVolume]
+ muls r0, r5
+ lsrs r0, 8
+ strb r0, [r4, o_SoundChannel_el]
+ movs r0, 0x10
+ ands r0, r6
+ str r0, [sp, 0x10]
+ beq _081DD03A
+ adds r0, r3, 0
+ adds r0, 0x10
+ ldr r1, [r3, 0x8]
+ adds r0, r1
+ str r0, [sp, 0xC]
+ ldr r0, [r3, 0xC]
+ subs r0, r1
+ str r0, [sp, 0x10]
+_081DD03A:
+ ldr r5, [sp, 0x8]
+ ldr r2, [r4, o_SoundChannel_ct]
+ ldr r3, [r4, o_SoundChannel_cp]
+ adr r0, _081DD044
+ bx r0
+ .arm
+_081DD044:
+ str r8, [sp]
+ ldr r9, [r4, o_SoundChannel_fw]
+ ldrb r10, [r4, o_SoundChannel_er]
+ ldrb r11, [r4, o_SoundChannel_el]
+ ldrb r0, [r4, o_SoundChannel_type]
+ tst r0, 0x30
+ beq _081DD068
+ bl sub_82DF49C
+ b _081DD228
+_081DD068:
+ mov r10, r10, lsl 16
+ mov r11, r11, lsl 16
+ ldrb r0, [r4, o_SoundChannel_type]
+ tst r0, 0x8
+ beq _081DD19C
+_081DD07C:
+ cmp r2, 0x4
+ ble _081DD0EC
+ subs r2, r2, r8
+ movgt r9, 0
+ bgt _081DD0A8
+ mov r9, r8
+ add r2, r2, r8
+ sub r8, r2, 0x4
+ sub r9, r9, r8
+ ands r2, r2, 0x3
+ moveq r2, 0x4
+_081DD0A8:
+ ldr r6, [r5]
+ ldr r7, [r5, 0x630]
+_081DD0B0:
+ ldrsb r0, [r3], 0x1
+ mul r1, r10, r0
+ bic r1, r1, 0xFF0000
+ add r6, r1, r6, ror 8
+ mul r1, r11, r0
+ bic r1, r1, 0xFF0000
+ add r7, r1, r7, ror 8
+ adds r5, r5, 0x40000000
+ bcc _081DD0B0
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ subs r8, r8, 0x4
+ bgt _081DD0A8
+ adds r8, r8, r9
+ beq _081DD22C
+_081DD0EC:
+ ldr r6, [r5]
+ ldr r7, [r5, 0x630]
+_081DD0F4:
+ ldrsb r0, [r3], 0x1
+ mul r1, r10, r0
+ bic r1, r1, 0xFF0000
+ add r6, r1, r6, ror 8
+ mul r1, r11, r0
+ bic r1, r1, 0xFF0000
+ add r7, r1, r7, ror 8
+ subs r2, r2, 0x1
+ beq _081DD164
+_081DD118:
+ adds r5, r5, 0x40000000
+ bcc _081DD0F4
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ subs r8, r8, 0x4
+ bgt _081DD07C
+ b _081DD22C
+_081DD134:
+ ldr r0, [sp, 0x18]
+ cmp r0, 0
+ beq _081DD158
+ ldr r3, [sp, 0x14]
+ rsb lr, r2, 0
+_081DD148:
+ adds r2, r0, r2
+ bgt _081DD1FC
+ sub lr, lr, r0
+ b _081DD148
+_081DD158:
+ pop {r4,r12}
+ mov r2, 0
+ b _081DD174
+_081DD164:
+ ldr r2, [sp, 0x10]
+ cmp r2, 0
+ ldrne r3, [sp, 0xC]
+ bne _081DD118
+_081DD174:
+ strb r2, [r4, o_SoundChannel_status]
+ mov r0, r5, lsr 30
+ bic r5, r5, 0xC0000000
+ rsb r0, r0, 0x3
+ mov r0, r0, lsl 3
+ mov r6, r6, ror r0
+ mov r7, r7, ror r0
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ b _081DD234
+_081DD19C:
+ push {r4,r12}
+ ldr r1, [r4, o_SoundChannel_freq]
+ mul r4, r12, r1
+ ldrsb r0, [r3]
+ ldrsb r1, [r3, 0x1]!
+ sub r1, r1, r0
+_081DD1B4:
+ ldr r6, [r5]
+ ldr r7, [r5, 0x630]
+_081DD1BC:
+ mul lr, r9, r1
+ add lr, r0, lr, asr 23
+ mul r12, r10, lr
+ bic r12, r12, 0xFF0000
+ add r6, r12, r6, ror 8
+ mul r12, r11, lr
+ bic r12, r12, 0xFF0000
+ add r7, r12, r7, ror 8
+ add r9, r9, r4
+ movs lr, r9, lsr 23
+ beq _081DD208
+ bic r9, r9, 0x3F800000
+ subs r2, r2, lr
+ ble _081DD134
+ subs lr, lr, 0x1
+ addeq r0, r0, r1
+_081DD1FC:
+ ldrsbne r0, [r3, lr]!
+ ldrsb r1, [r3, 0x1]!
+ sub r1, r1, r0
+_081DD208:
+ adds r5, r5, 0x40000000
+ bcc _081DD1BC
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ subs r8, r8, 0x4
+ bgt _081DD1B4
+ sub r3, r3, 0x1
+ pop {r4,r12}
+_081DD228:
+ str r9, [r4, o_SoundChannel_fw]
+_081DD22C:
+ str r2, [r4, o_SoundChannel_ct]
+ str r3, [r4, o_SoundChannel_cp]
+_081DD234:
+ ldr r8, [sp]
+ add r0, pc, 0x1
+ bx r0
+ .thumb
+_081DD240:
+ ldr r0, [sp, 0x4]
+ subs r0, 1
+ ble _081DD24A
+ adds r4, SoundChannel_size
+ b SoundMainRAM_ChanLoop
+_081DD24A:
+ ldr r0, [sp, 0x18]
+ ldr r3, =ID_NUMBER
+ str r3, [r0]
+ add sp, 0x1C
+ pop {r0-r7}
+ mov r8, r0
+ mov r9, r1
+ mov r10, r2
+ mov r11, r3
+ pop {r3}
+_081DD25E:
+ bx r3
+ .pool
+ thumb_func_end SoundMainRAM
+
+ arm_func_start sub_82DF49C
+sub_82DF49C:
+ ldr r6, [r4, o_SoundChannel_wav]
+ ldrb r0, [r4, o_SoundChannel_status]
+ tst r0, 0x20
+ bne _081DD2B4
+ orr r0, r0, 0x20
+ strb r0, [r4, o_SoundChannel_status]
+ ldrb r0, [r4, o_SoundChannel_type]
+ tst r0, 0x10
+ beq _081DD29C
+ ldr r1, [r6, 0xC]
+ add r1, r1, r6, lsl 1
+ add r1, r1, 0x20
+ sub r3, r1, r3
+ str r3, [r4, o_SoundChannel_cp]
+_081DD29C:
+ ldrh r0, [r6]
+ cmp r0, 0
+ beq _081DD2B4
+ sub r3, r3, r6
+ sub r3, r3, 0x10
+ str r3, [r4, o_SoundChannel_cp]
+_081DD2B4:
+ push {r8,r12,lr}
+ mov r10, r10, lsl 16
+ mov r11, r11, lsl 16
+ ldr r1, [r4, o_SoundChannel_freq]
+ ldrb r0, [r4, o_SoundChannel_type]
+ tst r0, 0x8
+ movne r8, 0x800000
+ muleq r8, r12, r1
+ ldrh r0, [r6]
+ cmp r0, 0
+ beq _081DD468
+ mov r0, 0xFF000000
+ str r0, [r4, o_SoundChannel_xpi]
+ ldrb r0, [r4, o_SoundChannel_type]
+ tst r0, 0x10
+ bne _081DD3C0
+ bl sub_82DF758
+ mov r0, r1
+ add r3, r3, 0x1
+ bl sub_82DF758
+ sub r1, r1, r0
+_081DD308:
+ ldr r6, [r5]
+ ldr r7, [r5, 0x630]
+_081DD310:
+ mul lr, r9, r1
+ add lr, r0, lr, asr 23
+ mul r12, r10, lr
+ bic r12, r12, 0xFF0000
+ add r6, r12, r6, ror 8
+ mul r12, r11, lr
+ bic r12, r12, 0xFF0000
+ add r7, r12, r7, ror 8
+ add r9, r9, r8
+ movs lr, r9, lsr 23
+ beq _081DD370
+ bic r9, r9, 0x3F800000
+ subs r2, r2, lr
+ ble _081DD398
+ subs lr, lr, 0x1
+ bne _081DD358
+ add r0, r0, r1
+ b _081DD364
+_081DD358:
+ add r3, r3, lr
+ bl sub_82DF758
+ mov r0, r1
+_081DD364:
+ add r3, r3, 0x1
+ bl sub_82DF758
+ sub r1, r1, r0
+_081DD370:
+ adds r5, r5, 0x40000000
+ bcc _081DD310
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ ldr r6, [sp]
+ subs r6, r6, 0x4
+ str r6, [sp]
+ bgt _081DD308
+ sub r3, r3, 0x1
+ b _081DD4F0
+_081DD398:
+ ldr r0, [sp, 0x1C]
+ cmp r0, 0
+ beq _081DD4F4
+ ldr r3, [r4, o_SoundChannel_wav]
+ ldr r3, [r3, 0x8]
+ rsb lr, r2, 0
+_081DD3B0:
+ adds r2, r2, r0
+ bgt _081DD358
+ sub lr, lr, r0
+ b _081DD3B0
+_081DD3C0:
+ sub r3, r3, 0x1
+ bl sub_82DF758
+ mov r0, r1
+ sub r3, r3, 0x1
+ bl sub_82DF758
+ sub r1, r1, r0
+_081DD3D8:
+ ldr r6, [r5]
+ ldr r7, [r5, 0x630]
+_081DD3E0:
+ mul lr, r9, r1
+ add lr, r0, lr, asr 23
+ mul r12, r10, lr
+ bic r12, r12, 0xFF0000
+ add r6, r12, r6, ror 8
+ mul r12, r11, lr
+ bic r12, r12, 0xFF0000
+ add r7, r12, r7, ror 8
+ add r9, r9, r8
+ movs lr, r9, lsr 23
+ beq _081DD440
+ bic r9, r9, 0x3F800000
+ subs r2, r2, lr
+ ble _081DD4F4
+ subs lr, lr, 0x1
+ bne _081DD428
+ add r0, r0, r1
+ b _081DD434
+_081DD428:
+ sub r3, r3, lr
+ bl sub_82DF758
+ mov r0, r1
+_081DD434:
+ sub r3, r3, 0x1
+ bl sub_82DF758
+ sub r1, r1, r0
+_081DD440:
+ adds r5, r5, 0x40000000
+ bcc _081DD3E0
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ ldr r6, [sp]
+ subs r6, r6, 0x4
+ str r6, [sp]
+ bgt _081DD3D8
+ add r3, r3, 0x2
+ b _081DD4F0
+_081DD468:
+ ldrb r0, [r4, o_SoundChannel_type]
+ tst r0, 0x10
+ beq _081DD4F0
+ ldrsb r0, [r3, -0x1]!
+ ldrsb r1, [r3, -0x1]
+ sub r1, r1, r0
+_081DD480:
+ ldr r6, [r5]
+ ldr r7, [r5, 0x630]
+_081DD488:
+ mul lr, r9, r1
+ add lr, r0, lr, asr 23
+ mul r12, r10, lr
+ bic r12, r12, 0xFF0000
+ add r6, r12, r6, ror 8
+ mul r12, r11, lr
+ bic r12, r12, 0xFF0000
+ add r7, r12, r7, ror 8
+ add r9, r9, r8
+ movs lr, r9, lsr 23
+ beq _081DD4CC
+ bic r9, r9, 0x3F800000
+ subs r2, r2, lr
+ ble _081DD4F4
+ ldrsb r0, [r3, -lr]!
+ ldrsb r1, [r3, -0x1]
+ sub r1, r1, r0
+_081DD4CC:
+ adds r5, r5, 0x40000000
+ bcc _081DD488
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ ldr r6, [sp]
+ subs r6, r6, 0x4
+ str r6, [sp]
+ bgt _081DD480
+ add r3, r3, 0x1
+_081DD4F0:
+ pop {r8,r12,pc}
+_081DD4F4:
+ mov r2, 0
+ strb r2, [r4, o_SoundChannel_status]
+ mov r0, r5, lsr 30
+ bic r5, r5, 0xC0000000
+ rsb r0, r0, 0x3
+ mov r0, r0, lsl 3
+ mov r6, r6, ror r0
+ mov r7, r7, ror r0
+ str r7, [r5, 0x630]
+ str r6, [r5], 0x4
+ pop {r8,r12,pc}
+ arm_func_end sub_82DF49C
+
+ arm_func_start sub_82DF758
+sub_82DF758:
+ push {r0,r2,r5-r7,lr}
+ mov r0, r3, lsr 6
+ ldr r1, [r4, o_SoundChannel_xpi]
+ cmp r0, r1
+ beq _081DD594
+ str r0, [r4, o_SoundChannel_xpi]
+ mov r1, 0x21
+ mul r2, r1, r0
+ ldr r1, [r4, o_SoundChannel_wav]
+ add r2, r2, r1
+ add r2, r2, 0x10
+ ldr r5, =gUnknown_03001300
+ ldr r6, =gDeltaEncodingTable
+ mov r7, 0x40
+ ldrb lr, [r2], 1
+ strb lr, [r5], 1
+ ldrb r1, [r2], 1
+ b _081DD57C
+_081DD568:
+ ldrb r1, [r2], 1
+ mov r0, r1, lsr 4
+ ldrsb r0, [r6, r0]
+ add lr, lr, r0
+ strb lr, [r5], 1
+_081DD57C:
+ and r0, r1, 0xF
+ ldrsb r0, [r6, r0]
+ add lr, lr, r0
+ strb lr, [r5], 1
+ subs r7, r7, 2
+ bgt _081DD568
+_081DD594:
+ ldr r5, =gUnknown_03001300
+ and r0, r3, 0x3F
+ ldrsb r1, [r5, r0]
+ pop {r0,r2,r5-r7,pc}
+ .pool
+ arm_func_end sub_82DF758
+
+ thumb_func_start SoundMainBTM
+SoundMainBTM:
+ mov r12, r4
+ movs r1, 0
+ movs r2, 0
+ movs r3, 0
+ movs r4, 0
+ stm r0!, {r1-r4}
+ stm r0!, {r1-r4}
+ stm r0!, {r1-r4}
+ stm r0!, {r1-r4}
+ mov r4, r12
+ bx lr
+ thumb_func_end SoundMainBTM
+
+ thumb_func_start RealClearChain
+RealClearChain:
+ ldr r3, [r0, 0x2C]
+ cmp r3, 0
+ beq _081DD5E2
+ ldr r1, [r0, 0x34]
+ ldr r2, [r0, 0x30]
+ cmp r2, 0
+ beq _081DD5D6
+ str r1, [r2, 0x34]
+ b _081DD5D8
+_081DD5D6:
+ str r1, [r3, 0x20]
+_081DD5D8:
+ cmp r1, 0
+ beq _081DD5DE
+ str r2, [r1, 0x30]
+_081DD5DE:
+ movs r1, 0
+ str r1, [r0, 0x2C]
+_081DD5E2:
+ bx lr
+ thumb_func_end RealClearChain
+
+ thumb_func_start ply_fine
+ply_fine:
+ push {r4,r5,lr}
+ adds r5, r1, 0
+ ldr r4, [r5, o_MusicPlayerTrack_chan]
+ cmp r4, 0
+ beq ply_fine_done
+ply_fine_loop:
+ ldrb r1, [r4]
+ movs r0, 0xC7
+ tst r0, r1
+ beq ply_fine_ok
+ movs r0, 0x40
+ orrs r1, r0
+ strb r1, [r4]
+ply_fine_ok:
+ adds r0, r4, 0
+ bl RealClearChain
+ ldr r4, [r4, 0x34]
+ cmp r4, 0
+ bne ply_fine_loop
+ply_fine_done:
+ movs r0, 0
+ strb r0, [r5]
+ pop {r4,r5}
+ pop {r0}
+ bx r0
+ thumb_func_end ply_fine
+
+ thumb_func_start MPlayJumpTableCopy
+MPlayJumpTableCopy:
+ mov r12, lr
+ movs r1, 0x24
+ ldr r2, lt_MPlayJumpTableTemplate
+MPlayJumpTableCopy_Loop:
+ ldr r3, [r2]
+ bl chk_adr_r2
+ stm r0!, {r3}
+ adds r2, 0x4
+ subs r1, 0x1
+ bgt MPlayJumpTableCopy_Loop
+ bx r12
+ thumb_func_end MPlayJumpTableCopy
+
+ .align 2, 0
+ .thumb_func
+ldrb_r3_r2:
+ ldrb r3, [r2]
+
+@ This attempts to protect against reading anything from the BIOS ROM
+@ besides the jump table template.
+@ It assumes that the jump table template is located at the end of the ROM.
+ .thumb_func
+chk_adr_r2:
+ push {r0}
+ lsrs r0, r2, 25
+ bne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it
+ ldr r0, lt_MPlayJumpTableTemplate
+ cmp r2, r0
+ blo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it
+ lsrs r0, r2, 14
+ beq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it
+chk_adr_r2_reject:
+ movs r3, 0
+chk_adr_r2_done:
+ pop {r0}
+ bx lr
+
+ .align 2, 0
+lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate
+
+ thumb_func_start ld_r3_tp_adr_i
+ld_r3_tp_adr_i:
+ ldr r2, [r1, 0x40]
+_081DD64A:
+ adds r3, r2, 0x1
+ str r3, [r1, 0x40]
+ ldrb r3, [r2]
+ b chk_adr_r2
+ thumb_func_end ld_r3_tp_adr_i
+
+ thumb_func_start ply_goto
+ply_goto:
+ push {lr}
+ply_goto_1:
+ ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ ldrb r0, [r2, 0x3]
+ lsls r0, 8
+ ldrb r3, [r2, 0x2]
+ orrs r0, r3
+ lsls r0, 8
+ ldrb r3, [r2, 0x1]
+ orrs r0, r3
+ lsls r0, 8
+ bl ldrb_r3_r2
+ orrs r0, r3
+ str r0, [r1, o_MusicPlayerTrack_cmdPtr]
+ pop {r0}
+ bx r0
+ thumb_func_end ply_goto
+
+ thumb_func_start ply_patt
+ply_patt:
+ ldrb r2, [r1, o_MusicPlayerTrack_patternLevel]
+ cmp r2, 3
+ bhs ply_patt_done
+ lsls r2, 2
+ adds r3, r1, r2
+ ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ adds r2, 0x4
+ str r2, [r3, o_MusicPlayerTrack_patternStack]
+ ldrb r2, [r1, o_MusicPlayerTrack_patternLevel]
+ adds r2, 1
+ strb r2, [r1, o_MusicPlayerTrack_patternLevel]
+ b ply_goto
+ply_patt_done:
+ b ply_fine
+ thumb_func_end ply_patt
+
+ thumb_func_start ply_pend
+ply_pend:
+ ldrb r2, [r1, o_MusicPlayerTrack_patternLevel]
+ cmp r2, 0
+ beq ply_pend_done
+ subs r2, 1
+ strb r2, [r1, o_MusicPlayerTrack_patternLevel]
+ lsls r2, 2
+ adds r3, r1, r2
+ ldr r2, [r3, o_MusicPlayerTrack_patternStack]
+ str r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ply_pend_done:
+ bx lr
+ thumb_func_end ply_pend
+
+ thumb_func_start ply_rept
+ply_rept:
+ push {lr}
+ ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ ldrb r3, [r2]
+ cmp r3, 0
+ bne ply_rept_1
+ adds r2, 1
+ str r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ b ply_goto_1
+ply_rept_1:
+ ldrb r3, [r1, o_MusicPlayerTrack_repN]
+ adds r3, 1
+ strb r3, [r1, o_MusicPlayerTrack_repN]
+ mov r12, r3
+ bl ld_r3_tp_adr_i
+ cmp r12, r3
+ bhs ply_rept_2
+ b ply_goto_1
+ply_rept_2:
+ movs r3, 0
+ strb r3, [r1, o_MusicPlayerTrack_repN]
+ adds r2, 5
+ str r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ pop {r0}
+ bx r0
+ thumb_func_end ply_rept
+
+ thumb_func_start ply_prio
+ply_prio:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ strb r3, [r1, o_MusicPlayerTrack_priority]
+ bx r12
+ thumb_func_end ply_prio
+
+ thumb_func_start ply_tempo
+ply_tempo:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ lsls r3, 1
+ strh r3, [r0, o_MusicPlayerInfo_tempoD]
+ ldrh r2, [r0, o_MusicPlayerInfo_tempoU]
+ muls r3, r2
+ lsrs r3, 8
+ strh r3, [r0, o_MusicPlayerInfo_tempoI]
+ bx r12
+ thumb_func_end ply_tempo
+
+ thumb_func_start ply_keysh
+ply_keysh:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ strb r3, [r1, o_MusicPlayerTrack_keyShift]
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ movs r2, 0xC
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+ bx r12
+ thumb_func_end ply_keysh
+
+ thumb_func_start ply_voice
+ply_voice:
+ mov r12, lr
+ ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ ldrb r3, [r2]
+ adds r2, 1
+ str r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ lsls r2, r3, 1
+ adds r2, r3
+ lsls r2, 2
+ ldr r3, [r0, o_MusicPlayerInfo_tone]
+ adds r2, r3
+ ldr r3, [r2]
+ bl chk_adr_r2
+ str r3, [r1, o_MusicPlayerTrack_ToneData_type]
+ ldr r3, [r2, 0x4]
+ bl chk_adr_r2
+ str r3, [r1, o_MusicPlayerTrack_ToneData_wav]
+ ldr r3, [r2, 0x8]
+ bl chk_adr_r2
+ str r3, [r1, o_MusicPlayerTrack_ToneData_attack]
+ bx r12
+ thumb_func_end ply_voice
+
+ thumb_func_start ply_vol
+ply_vol:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ strb r3, [r1, o_MusicPlayerTrack_vol]
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ movs r2, 0x3
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+ bx r12
+ thumb_func_end ply_vol
+
+ thumb_func_start ply_pan
+ply_pan:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ subs r3, 0x40
+ strb r3, [r1, o_MusicPlayerTrack_pan]
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ movs r2, 0x3
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+ bx r12
+ thumb_func_end ply_pan
+
+ thumb_func_start ply_bend
+ply_bend:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ subs r3, 0x40
+ strb r3, [r1, o_MusicPlayerTrack_bend]
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ movs r2, 0xC
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+ bx r12
+ thumb_func_end ply_bend
+
+ thumb_func_start ply_bendr
+ply_bendr:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ strb r3, [r1, o_MusicPlayerTrack_bendRange]
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ movs r2, 0xC
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+ bx r12
+ thumb_func_end ply_bendr
+
+ thumb_func_start ply_lfodl
+ply_lfodl:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ strb r3, [r1, o_MusicPlayerTrack_lfoDelay]
+ bx r12
+ thumb_func_end ply_lfodl
+
+ thumb_func_start ply_modt
+ply_modt:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ ldrb r0, [r1, o_MusicPlayerTrack_modT]
+ cmp r0, r3
+ beq _081DD7AA
+ strb r3, [r1, o_MusicPlayerTrack_modT]
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ movs r2, 0xF
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+_081DD7AA:
+ bx r12
+ thumb_func_end ply_modt
+
+ thumb_func_start ply_tune
+ply_tune:
+ mov r12, lr
+ bl ld_r3_tp_adr_i
+ subs r3, 0x40
+ strb r3, [r1, o_MusicPlayerTrack_tune]
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ movs r2, 0xC
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+ bx r12
+ thumb_func_end ply_tune
+
+ thumb_func_start ply_port
+ply_port:
+ mov r12, lr
+ ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ ldrb r3, [r2]
+ adds r2, 1
+ ldr r0, =REG_SOUND1CNT_L @ sound register base address
+ adds r0, r3
+ bl _081DD64A
+ strb r3, [r0]
+ bx r12
+ .pool
+ thumb_func_end ply_port
+
+ thumb_func_start m4aSoundVSync
+m4aSoundVSync:
+ ldr r0, lt2_SOUND_INFO_PTR
+ ldr r0, [r0]
+
+ @ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1.
+ ldr r2, lt2_ID_NUMBER
+ ldr r3, [r0, o_SoundInfo_ident]
+ subs r3, r2
+ cmp r3, 1
+ bhi m4aSoundVSync_Done
+
+ @ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA.
+ ldrb r1, [r0, o_SoundInfo_pcmDmaCounter]
+ subs r1, 1
+ strb r1, [r0, o_SoundInfo_pcmDmaCounter]
+ bgt m4aSoundVSync_Done
+
+ @ Reload the PCM DMA counter.
+ ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod]
+ strb r1, [r0, o_SoundInfo_pcmDmaCounter]
+
+ ldr r2, =REG_DMA1
+
+ ldr r1, [r2, 0x8] @ DMA1CNT
+ lsls r1, 7
+ bcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set
+
+ ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4
+ str r1, [r2, 0x8] @ DMA1CNT
+
+m4aSoundVSync_SkipDMA1:
+ ldr r1, [r2, 0xC + 0x8] @ DMA2CNT
+ lsls r1, 7
+ bcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set
+
+ ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4
+ str r1, [r2, 0xC + 0x8] @ DMA2CNT
+
+m4aSoundVSync_SkipDMA2:
+
+ @ turn off DMA1/DMA2
+ movs r1, DMA_32BIT >> 8
+ lsls r1, 8
+ strh r1, [r2, 0xA] @ DMA1CNT_H
+ strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H
+
+ @ turn on DMA1/DMA2 direct-sound FIFO mode
+ movs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8
+ lsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode)
+ strh r1, [r2, 0xA] @ DMA1CNT_H
+ strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H
+
+m4aSoundVSync_Done:
+ bx lr
+
+ .pool
+ thumb_func_end m4aSoundVSync
+
+ thumb_func_start MPlayMain
+MPlayMain:
+ ldr r2, lt2_ID_NUMBER
+ ldr r3, [r0, o_MusicPlayerInfo_ident]
+ cmp r2, r3
+ beq _081DD82E
+ bx lr
+_081DD82E:
+ adds r3, 0x1
+ str r3, [r0, o_MusicPlayerInfo_ident]
+ push {r0,lr}
+ ldr r3, [r0, o_MusicPlayerInfo_func]
+ cmp r3, 0
+ beq _081DD840
+ ldr r0, [r0, o_MusicPlayerInfo_intp]
+ bl call_r3
+_081DD840:
+ pop {r0}
+ push {r4-r7}
+ mov r4, r8
+ mov r5, r9
+ mov r6, r10
+ mov r7, r11
+ push {r4-r7}
+ adds r7, r0, 0
+ ldr r0, [r7, o_MusicPlayerInfo_status]
+ cmp r0, 0
+ bge _081DD858
+ b _081DDA6C
+_081DD858:
+ ldr r0, lt2_SOUND_INFO_PTR
+ ldr r0, [r0]
+ mov r8, r0
+ adds r0, r7, 0
+ bl FadeOutBody
+ ldr r0, [r7, o_MusicPlayerInfo_status]
+ cmp r0, 0
+ bge _081DD86C
+ b _081DDA6C
+_081DD86C:
+ ldrh r0, [r7, o_MusicPlayerInfo_tempoC]
+ ldrh r1, [r7, o_MusicPlayerInfo_tempoI]
+ adds r0, r1
+ b _081DD9BC
+_081DD874:
+ ldrb r6, [r7, o_MusicPlayerInfo_trackCount]
+ ldr r5, [r7, o_MusicPlayerInfo_tracks]
+ movs r3, 0x1
+ movs r4, 0
+_081DD87C:
+ ldrb r0, [r5]
+ movs r1, 0x80
+ tst r1, r0
+ bne _081DD886
+ b _081DD998
+_081DD886:
+ mov r10, r3
+ orrs r4, r3
+ mov r11, r4
+ ldr r4, [r5, o_MusicPlayerTrack_chan]
+ cmp r4, 0
+ beq _081DD8BA
+_081DD892:
+ ldrb r1, [r4]
+ movs r0, 0xC7
+ tst r0, r1
+ beq _081DD8AE
+ ldrb r0, [r4, 0x10]
+ cmp r0, 0
+ beq _081DD8B4
+ subs r0, 0x1
+ strb r0, [r4, 0x10]
+ bne _081DD8B4
+ movs r0, 0x40
+ orrs r1, r0
+ strb r1, [r4]
+ b _081DD8B4
+_081DD8AE:
+ adds r0, r4, 0
+ bl ClearChain
+_081DD8B4:
+ ldr r4, [r4, 0x34]
+ cmp r4, 0
+ bne _081DD892
+_081DD8BA:
+ ldrb r3, [r5, o_MusicPlayerTrack_flags]
+ movs r0, 0x40
+ tst r0, r3
+ beq _081DD938
+ adds r0, r5, 0
+ bl Clear64byte
+ movs r0, 0x80
+ strb r0, [r5]
+ movs r0, 0x2
+ strb r0, [r5, o_MusicPlayerTrack_bendRange]
+ movs r0, 0x40
+ strb r0, [r5, o_MusicPlayerTrack_volX]
+ movs r0, 0x16
+ strb r0, [r5, o_MusicPlayerTrack_lfoSpeed]
+ movs r0, 0x1
+ adds r1, r5, 0x6
+ strb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6]
+ b _081DD938
+_081DD8E0:
+ ldr r2, [r5, o_MusicPlayerTrack_cmdPtr]
+ ldrb r1, [r2]
+ cmp r1, 0x80
+ bhs _081DD8EC
+ ldrb r1, [r5, o_MusicPlayerTrack_runningStatus]
+ b _081DD8F6
+_081DD8EC:
+ adds r2, 0x1
+ str r2, [r5, o_MusicPlayerTrack_cmdPtr]
+ cmp r1, 0xBD
+ bcc _081DD8F6
+ strb r1, [r5, o_MusicPlayerTrack_runningStatus]
+_081DD8F6:
+ cmp r1, 0xCF
+ bcc _081DD90C
+ mov r0, r8
+ ldr r3, [r0, o_SoundInfo_plynote]
+ adds r0, r1, 0
+ subs r0, 0xCF
+ adds r1, r7, 0
+ adds r2, r5, 0
+ bl call_r3
+ b _081DD938
+_081DD90C:
+ cmp r1, 0xB0
+ bls _081DD92E
+ adds r0, r1, 0
+ subs r0, 0xB1
+ strb r0, [r7, o_MusicPlayerInfo_cmd]
+ mov r3, r8
+ ldr r3, [r3, o_SoundInfo_MPlayJumpTable]
+ lsls r0, 2
+ ldr r3, [r3, r0]
+ adds r0, r7, 0
+ adds r1, r5, 0
+ bl call_r3
+ ldrb r0, [r5, o_MusicPlayerTrack_flags]
+ cmp r0, 0
+ beq _081DD994
+ b _081DD938
+_081DD92E:
+ ldr r0, lt_gClockTable
+ subs r1, 0x80
+ adds r1, r0
+ ldrb r0, [r1]
+ strb r0, [r5, o_MusicPlayerTrack_wait]
+_081DD938:
+ ldrb r0, [r5, o_MusicPlayerTrack_wait]
+ cmp r0, 0
+ beq _081DD8E0
+ subs r0, 0x1
+ strb r0, [r5, o_MusicPlayerTrack_wait]
+ ldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed]
+ cmp r1, 0
+ beq _081DD994
+ ldrb r0, [r5, o_MusicPlayerTrack_mod]
+ cmp r0, 0
+ beq _081DD994
+ ldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC]
+ cmp r0, 0
+ beq _081DD95A
+ subs r0, 0x1
+ strb r0, [r5, o_MusicPlayerTrack_lfoDelayC]
+ b _081DD994
+_081DD95A:
+ ldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC]
+ adds r0, r1
+ strb r0, [r5, o_MusicPlayerTrack_lfoSpeedC]
+ adds r1, r0, 0
+ subs r0, 0x40
+ lsls r0, 24
+ bpl _081DD96E
+ lsls r2, r1, 24
+ asrs r2, 24
+ b _081DD972
+_081DD96E:
+ movs r0, 0x80
+ subs r2, r0, r1
+_081DD972:
+ ldrb r0, [r5, o_MusicPlayerTrack_mod]
+ muls r0, r2
+ asrs r2, r0, 6
+ ldrb r0, [r5, o_MusicPlayerTrack_modM]
+ eors r0, r2
+ lsls r0, 24
+ beq _081DD994
+ strb r2, [r5, o_MusicPlayerTrack_modM]
+ ldrb r0, [r5]
+ ldrb r1, [r5, o_MusicPlayerTrack_modT]
+ cmp r1, 0
+ bne _081DD98E
+ movs r1, 0xC
+ b _081DD990
+_081DD98E:
+ movs r1, 0x3
+_081DD990:
+ orrs r0, r1
+ strb r0, [r5, o_MusicPlayerTrack_flags]
+_081DD994:
+ mov r3, r10
+ mov r4, r11
+_081DD998:
+ subs r6, 0x1
+ ble _081DD9A4
+ movs r0, 0x50
+ adds r5, r0
+ lsls r3, 1
+ b _081DD87C
+_081DD9A4:
+ ldr r0, [r7, o_MusicPlayerInfo_clock]
+ adds r0, 0x1
+ str r0, [r7, o_MusicPlayerInfo_clock]
+ cmp r4, 0
+ bne _081DD9B6
+ movs r0, 0x80
+ lsls r0, 24
+ str r0, [r7, o_MusicPlayerInfo_status]
+ b _081DDA6C
+_081DD9B6:
+ str r4, [r7, o_MusicPlayerInfo_status]
+ ldrh r0, [r7, o_MusicPlayerInfo_tempoC]
+ subs r0, 0x96
+_081DD9BC:
+ strh r0, [r7, o_MusicPlayerInfo_tempoC]
+ cmp r0, 0x96
+ bcc _081DD9C4
+ b _081DD874
+_081DD9C4:
+ ldrb r2, [r7, o_MusicPlayerInfo_trackCount]
+ ldr r5, [r7, o_MusicPlayerInfo_tracks]
+_081DD9C8:
+ ldrb r0, [r5, o_MusicPlayerTrack_flags]
+ movs r1, 0x80
+ tst r1, r0
+ beq _081DDA62
+ movs r1, 0xF
+ tst r1, r0
+ beq _081DDA62
+ mov r9, r2
+ adds r0, r7, 0
+ adds r1, r5, 0
+ bl TrkVolPitSet
+ ldr r4, [r5, o_MusicPlayerTrack_chan]
+ cmp r4, 0
+ beq _081DDA58
+_081DD9E6:
+ ldrb r1, [r4, o_SoundChannel_status]
+ movs r0, 0xC7
+ tst r0, r1
+ bne _081DD9F6
+ adds r0, r4, 0
+ bl ClearChain
+ b _081DDA52
+_081DD9F6:
+ ldrb r0, [r4, o_SoundChannel_type]
+ movs r6, 0x7
+ ands r6, r0
+ ldrb r3, [r5, o_MusicPlayerTrack_flags]
+ movs r0, 0x3
+ tst r0, r3
+ beq _081DDA14
+ bl ChnVolSetAsm
+ cmp r6, 0
+ beq _081DDA14
+ ldrb r0, [r4, o_CgbChannel_mo]
+ movs r1, 0x1
+ orrs r0, r1
+ strb r0, [r4, o_CgbChannel_mo]
+_081DDA14:
+ ldrb r3, [r5, o_MusicPlayerTrack_flags]
+ movs r0, 0xC
+ tst r0, r3
+ beq _081DDA52
+ ldrb r1, [r4, o_SoundChannel_ky]
+ movs r0, 0x8
+ ldrsb r0, [r5, r0]
+ adds r2, r1, r0
+ bpl _081DDA28
+ movs r2, 0
+_081DDA28:
+ cmp r6, 0
+ beq _081DDA46
+ mov r0, r8
+ ldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq]
+ adds r1, r2, 0
+ ldrb r2, [r5, o_MusicPlayerTrack_pitM]
+ adds r0, r6, 0
+ bl call_r3
+ str r0, [r4, o_CgbChannel_fr]
+ ldrb r0, [r4, o_CgbChannel_mo]
+ movs r1, 0x2
+ orrs r0, r1
+ strb r0, [r4, o_CgbChannel_mo]
+ b _081DDA52
+_081DDA46:
+ adds r1, r2, 0
+ ldrb r2, [r5, o_MusicPlayerTrack_pitM]
+ ldr r0, [r4, o_SoundChannel_wav]
+ bl MidiKeyToFreq
+ str r0, [r4, o_SoundChannel_freq]
+_081DDA52:
+ ldr r4, [r4, o_SoundChannel_np]
+ cmp r4, 0
+ bne _081DD9E6
+_081DDA58:
+ ldrb r0, [r5, o_MusicPlayerTrack_flags]
+ movs r1, 0xF0
+ ands r0, r1
+ strb r0, [r5, o_MusicPlayerTrack_flags]
+ mov r2, r9
+_081DDA62:
+ subs r2, 0x1
+ ble _081DDA6C
+ movs r0, 0x50
+ adds r5, r0
+ bgt _081DD9C8
+_081DDA6C:
+ ldr r0, lt2_ID_NUMBER
+ str r0, [r7, o_MusicPlayerInfo_ident]
+ pop {r0-r7}
+ mov r8, r0
+ mov r9, r1
+ mov r10, r2
+ mov r11, r3
+ pop {r3}
+
+call_r3:
+ bx r3
+
+ .align 2, 0
+lt_gClockTable: .word gClockTable
+lt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR
+lt2_ID_NUMBER: .word ID_NUMBER
+ thumb_func_end MPlayMain
+
+ thumb_func_start TrackStop
+TrackStop:
+ push {r4-r6,lr}
+ adds r5, r1, 0
+ ldrb r1, [r5, o_MusicPlayerTrack_flags]
+ movs r0, 0x80
+ tst r0, r1
+ beq TrackStop_Done
+ ldr r4, [r5, o_MusicPlayerTrack_chan]
+ cmp r4, 0
+ beq TrackStop_3
+ movs r6, 0
+TrackStop_Loop:
+ ldrb r0, [r4, o_SoundChannel_status]
+ cmp r0, 0
+ beq TrackStop_2
+ ldrb r0, [r4, o_SoundChannel_type]
+ movs r3, 0x7
+ ands r0, r3
+ beq TrackStop_1
+ ldr r3, =SOUND_INFO_PTR
+ ldr r3, [r3]
+ ldr r3, [r3, o_SoundInfo_CgbOscOff]
+ bl call_r3
+TrackStop_1:
+ strb r6, [r4, o_SoundChannel_status]
+TrackStop_2:
+ str r6, [r4, o_SoundChannel_track]
+ ldr r4, [r4, o_SoundChannel_np]
+ cmp r4, 0
+ bne TrackStop_Loop
+TrackStop_3:
+ str r4, [r5, o_MusicPlayerTrack_chan]
+TrackStop_Done:
+ pop {r4-r6}
+ pop {r0}
+ bx r0
+ .pool
+ thumb_func_end TrackStop
+
+ thumb_func_start ChnVolSetAsm
+ChnVolSetAsm:
+ ldrb r1, [r4, 0x12]
+ movs r0, 0x14
+ ldrsb r2, [r4, r0]
+ movs r3, 0x80
+ adds r3, r2
+ muls r3, r1
+ ldrb r0, [r5, 0x10]
+ muls r0, r3
+ asrs r0, 14
+ cmp r0, 0xFF
+ bls _081DDAE8
+ movs r0, 0xFF
+_081DDAE8:
+ strb r0, [r4, 0x2]
+ movs r3, 0x7F
+ subs r3, r2
+ muls r3, r1
+ ldrb r0, [r5, 0x11]
+ muls r0, r3
+ asrs r0, 14
+ cmp r0, 0xFF
+ bls _081DDAFC
+ movs r0, 0xFF
+_081DDAFC:
+ strb r0, [r4, 0x3]
+ bx lr
+ thumb_func_end ChnVolSetAsm
+
+ thumb_func_start ply_note
+ply_note:
+ push {r4-r7,lr}
+ mov r4, r8
+ mov r5, r9
+ mov r6, r10
+ mov r7, r11
+ push {r4-r7}
+ sub sp, 0x18
+ str r1, [sp]
+ adds r5, r2, 0
+ ldr r1, =SOUND_INFO_PTR
+ ldr r1, [r1]
+ str r1, [sp, 0x4]
+ ldr r1, =gClockTable
+ adds r0, r1
+ ldrb r0, [r0]
+ strb r0, [r5, o_MusicPlayerTrack_gateTime]
+ ldr r3, [r5, o_MusicPlayerTrack_cmdPtr]
+ ldrb r0, [r3]
+ cmp r0, 0x80
+ bhs _081DDB46
+ strb r0, [r5, o_MusicPlayerTrack_key]
+ adds r3, 0x1
+ ldrb r0, [r3]
+ cmp r0, 0x80
+ bhs _081DDB44
+ strb r0, [r5, o_MusicPlayerTrack_velocity]
+ adds r3, 0x1
+ ldrb r0, [r3]
+ cmp r0, 0x80
+ bhs _081DDB44
+ ldrb r1, [r5, o_MusicPlayerTrack_gateTime]
+ adds r1, r0
+ strb r1, [r5, o_MusicPlayerTrack_gateTime]
+ adds r3, 0x1
+_081DDB44:
+ str r3, [r5, o_MusicPlayerTrack_cmdPtr]
+_081DDB46:
+ movs r0, 0
+ str r0, [sp, 0x14]
+ adds r4, r5, 0
+ adds r4, o_MusicPlayerTrack_ToneData_type
+ ldrb r2, [r4]
+ movs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL
+ tst r0, r2
+ beq _081DDB98
+ ldrb r3, [r5, o_MusicPlayerTrack_key]
+ movs r0, TONEDATA_TYPE_SPL
+ tst r0, r2
+ beq _081DDB66
+ ldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable]
+ adds r1, r3
+ ldrb r0, [r1]
+ b _081DDB68
+_081DDB66:
+ adds r0, r3, 0
+_081DDB68:
+ lsls r1, r0, 1
+ adds r1, r0
+ lsls r1, 2
+ ldr r0, [r5, o_MusicPlayerTrack_ToneData_wav]
+ adds r1, r0
+ mov r9, r1
+ mov r6, r9
+ ldrb r1, [r6]
+ movs r0, 0xC0
+ tst r0, r1
+ beq _081DDB80
+ b _081DDCEA
+_081DDB80:
+ movs r0, 0x80
+ tst r0, r2
+ beq _081DDB9C
+ ldrb r1, [r6, 0x3]
+ movs r0, 0x80
+ tst r0, r1
+ beq _081DDB94
+ subs r1, 0xC0
+ lsls r1, 1
+ str r1, [sp, 0x14]
+_081DDB94:
+ ldrb r3, [r6, 0x1]
+ b _081DDB9C
+_081DDB98:
+ mov r9, r4
+ ldrb r3, [r5, 0x5]
+_081DDB9C:
+ str r3, [sp, 0x8]
+ ldr r6, [sp]
+ ldrb r1, [r6, 0x9]
+ ldrb r0, [r5, 0x1D]
+ adds r0, r1
+ cmp r0, 0xFF
+ bls _081DDBAC
+ movs r0, 0xFF
+_081DDBAC:
+ str r0, [sp, 0x10]
+ mov r6, r9
+ ldrb r0, [r6]
+ movs r6, 0x7
+ ands r6, r0
+ str r6, [sp, 0xC]
+ beq _081DDBEC
+ ldr r0, [sp, 0x4]
+ ldr r4, [r0, 0x1C]
+ cmp r4, 0
+ bne _081DDBC4
+ b _081DDCEA
+_081DDBC4:
+ subs r6, 0x1
+ lsls r0, r6, 6
+ adds r4, r0
+ ldrb r1, [r4]
+ movs r0, 0xC7
+ tst r0, r1
+ beq _081DDC40
+ movs r0, 0x40
+ tst r0, r1
+ bne _081DDC40
+ ldrb r1, [r4, 0x13]
+ ldr r0, [sp, 0x10]
+ cmp r1, r0
+ bcc _081DDC40
+ beq _081DDBE4
+ b _081DDCEA
+_081DDBE4:
+ ldr r0, [r4, 0x2C]
+ cmp r0, r5
+ bcs _081DDC40
+ b _081DDCEA
+_081DDBEC:
+ ldr r6, [sp, 0x10]
+ adds r7, r5, 0
+ movs r2, 0
+ mov r8, r2
+ ldr r4, [sp, 0x4]
+ ldrb r3, [r4, 0x6]
+ adds r4, 0x50
+_081DDBFA:
+ ldrb r1, [r4]
+ movs r0, 0xC7
+ tst r0, r1
+ beq _081DDC40
+ movs r0, 0x40
+ tst r0, r1
+ beq _081DDC14
+ cmp r2, 0
+ bne _081DDC18
+ adds r2, 0x1
+ ldrb r6, [r4, 0x13]
+ ldr r7, [r4, 0x2C]
+ b _081DDC32
+_081DDC14:
+ cmp r2, 0
+ bne _081DDC34
+_081DDC18:
+ ldrb r0, [r4, 0x13]
+ cmp r0, r6
+ bcs _081DDC24
+ adds r6, r0, 0
+ ldr r7, [r4, 0x2C]
+ b _081DDC32
+_081DDC24:
+ bhi _081DDC34
+ ldr r0, [r4, 0x2C]
+ cmp r0, r7
+ bls _081DDC30
+ adds r7, r0, 0
+ b _081DDC32
+_081DDC30:
+ bcc _081DDC34
+_081DDC32:
+ mov r8, r4
+_081DDC34:
+ adds r4, 0x40
+ subs r3, 0x1
+ bgt _081DDBFA
+ mov r4, r8
+ cmp r4, 0
+ beq _081DDCEA
+_081DDC40:
+ adds r0, r4, 0
+ bl ClearChain
+ movs r1, 0
+ str r1, [r4, 0x30]
+ ldr r3, [r5, 0x20]
+ str r3, [r4, 0x34]
+ cmp r3, 0
+ beq _081DDC54
+ str r4, [r3, 0x30]
+_081DDC54:
+ str r4, [r5, 0x20]
+ str r5, [r4, 0x2C]
+ ldrb r0, [r5, 0x1B]
+ strb r0, [r5, 0x1C]
+ cmp r0, r1
+ beq _081DDC66
+ adds r1, r5, 0
+ bl clear_modM
+_081DDC66:
+ ldr r0, [sp]
+ adds r1, r5, 0
+ bl TrkVolPitSet
+ ldr r0, [r5, 0x4]
+ str r0, [r4, 0x10]
+ ldr r0, [sp, 0x10]
+ strb r0, [r4, 0x13]
+ ldr r0, [sp, 0x8]
+ strb r0, [r4, 0x8]
+ ldr r0, [sp, 0x14]
+ strb r0, [r4, 0x14]
+ mov r6, r9
+ ldrb r0, [r6]
+ strb r0, [r4, 0x1]
+ ldr r7, [r6, 0x4]
+ str r7, [r4, 0x24]
+ ldr r0, [r6, 0x8]
+ str r0, [r4, 0x4]
+ ldrh r0, [r5, 0x1E]
+ strh r0, [r4, 0xC]
+ bl ChnVolSetAsm
+ ldrb r1, [r4, 0x8]
+ movs r0, 0x8
+ ldrsb r0, [r5, r0]
+ adds r3, r1, r0
+ bpl _081DDCA0
+ movs r3, 0
+_081DDCA0:
+ ldr r6, [sp, 0xC]
+ cmp r6, 0
+ beq _081DDCCE
+ mov r6, r9
+ ldrb r0, [r6, 0x2]
+ strb r0, [r4, 0x1E]
+ ldrb r1, [r6, 0x3]
+ movs r0, 0x80
+ tst r0, r1
+ bne _081DDCBA
+ movs r0, 0x70
+ tst r0, r1
+ bne _081DDCBC
+_081DDCBA:
+ movs r1, 0x8
+_081DDCBC:
+ strb r1, [r4, 0x1F]
+ ldrb r2, [r5, 0x9]
+ adds r1, r3, 0
+ ldr r0, [sp, 0xC]
+ ldr r3, [sp, 0x4]
+ ldr r3, [r3, 0x30]
+ bl call_r3
+ b _081DDCDC
+_081DDCCE:
+ ldr r0, [r5, o_MusicPlayerTrack_unk_3C]
+ str r0, [r4, 0x18]
+ ldrb r2, [r5, 0x9]
+ adds r1, r3, 0
+ adds r0, r7, 0
+ bl MidiKeyToFreq
+_081DDCDC:
+ str r0, [r4, 0x20]
+ movs r0, 0x80
+ strb r0, [r4]
+ ldrb r1, [r5]
+ movs r0, 0xF0
+ ands r0, r1
+ strb r0, [r5]
+_081DDCEA:
+ add sp, 0x18
+ pop {r0-r7}
+ mov r8, r0
+ mov r9, r1
+ mov r10, r2
+ mov r11, r3
+ pop {r0}
+ bx r0
+ .pool
+ thumb_func_end ply_note
+
+ thumb_func_start ply_endtie
+ply_endtie:
+ push {r4,r5}
+ ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ ldrb r3, [r2]
+ cmp r3, 0x80
+ bhs _081DDD16
+ strb r3, [r1, o_MusicPlayerTrack_key]
+ adds r2, 0x1
+ str r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ b _081DDD18
+_081DDD16:
+ ldrb r3, [r1, o_MusicPlayerTrack_key]
+_081DDD18:
+ ldr r1, [r1, o_MusicPlayerTrack_chan]
+ cmp r1, 0
+ beq _081DDD40
+ movs r4, 0x83
+ movs r5, 0x40
+_081DDD22:
+ ldrb r2, [r1, o_SoundChannel_status]
+ tst r2, r4
+ beq _081DDD3A
+ tst r2, r5
+ bne _081DDD3A
+ ldrb r0, [r1, o_SoundChannel_mk]
+ cmp r0, r3
+ bne _081DDD3A
+ movs r0, 0x40
+ orrs r2, r0
+ strb r2, [r1, o_SoundChannel_status]
+ b _081DDD40
+_081DDD3A:
+ ldr r1, [r1, o_SoundChannel_np]
+ cmp r1, 0
+ bne _081DDD22
+_081DDD40:
+ pop {r4,r5}
+ bx lr
+ thumb_func_end ply_endtie
+
+ thumb_func_start clear_modM
+clear_modM:
+ movs r2, 0
+ strb r2, [r1, o_MusicPlayerTrack_modM]
+ strb r2, [r1, o_MusicPlayerTrack_lfoSpeedC]
+ ldrb r2, [r1, o_MusicPlayerTrack_modT]
+ cmp r2, 0
+ bne _081DDD54
+ movs r2, 0xC
+ b _081DDD56
+_081DDD54:
+ movs r2, 0x3
+_081DDD56:
+ ldrb r3, [r1, o_MusicPlayerTrack_flags]
+ orrs r3, r2
+ strb r3, [r1, o_MusicPlayerTrack_flags]
+ bx lr
+ thumb_func_end clear_modM
+
+ thumb_func_start ld_r3_tp_adr_i
+ld_r3_tp_adr_i_unchecked:
+ ldr r2, [r1, o_MusicPlayerTrack_cmdPtr]
+ adds r3, r2, 1
+ str r3, [r1, o_MusicPlayerTrack_cmdPtr]
+ ldrb r3, [r2]
+ bx lr
+ thumb_func_end ld_r3_tp_adr_i
+
+ thumb_func_start ply_lfos
+ply_lfos:
+ mov r12, lr
+ bl ld_r3_tp_adr_i_unchecked
+ strb r3, [r1, o_MusicPlayerTrack_lfoSpeed]
+ cmp r3, 0
+ bne _081DDD7C
+ bl clear_modM
+_081DDD7C:
+ bx r12
+ thumb_func_end ply_lfos
+
+ thumb_func_start ply_mod
+ply_mod:
+ mov r12, lr
+ bl ld_r3_tp_adr_i_unchecked
+ strb r3, [r1, o_MusicPlayerTrack_mod]
+ cmp r3, 0
+ bne _081DDD90
+ bl clear_modM
+_081DDD90:
+ bx r12
+ thumb_func_end ply_mod
+
+ .align 2, 0 @ Don't pad with nop.
+
+ .bss
+gUnknown_03001300:
+ .space 0x40
+ .size gUnknown_03001300, .-gUnknown_03001300
+
+ .global gMPlayTrack_BGM
+gMPlayTrack_BGM:
+ .space 0x320
+ .size gMPlayTrack_BGM, .-gMPlayTrack_BGM
+
+ .global gMPlayTrack_SE1
+gMPlayTrack_SE1:
+ .space 0xF0
+ .size gMPlayTrack_SE1, .-gMPlayTrack_SE1
+
+ .global gMPlayTrack_SE2
+gMPlayTrack_SE2:
+ .space 0x2D0
+ .size gMPlayTrack_SE2, .-gMPlayTrack_SE2
+
+ .global gMPlayTrack_SE3
+gMPlayTrack_SE3:
+ .space 0x50
+ .size gMPlayTrack_SE3, .-gMPlayTrack_SE3
diff --git a/src/main.c b/src/main.c
index 40381bb68..06425e661 100644
--- a/src/main.c
+++ b/src/main.c
@@ -85,7 +85,27 @@ void EnableVCountIntrAtLine150(void);
void AgbMain()
{
+#if MODERN
+ // Modern compilers are liberal with the stack on entry to this function,
+ // so RegisterRamReset may crash if it resets IWRAM.
+ RegisterRamReset(RESET_ALL & ~RESET_IWRAM);
+ asm("mov\tr1, #0xC0\n"
+ "\tlsl\tr1, r1, #0x12\n"
+ "\tmov r2, #0xFC\n"
+ "\tlsl r2, r2, #0x7\n"
+ "\tadd\tr2, r1, r2\n"
+ "\tmov\tr0, #0\n"
+ "\tmov\tr3, r0\n"
+ "\tmov\tr4, r0\n"
+ "\tmov\tr5, r0\n"
+ ".LCU0:\n"
+ "\tstmia r1!, {r0, r3, r4, r5}\n"
+ "\tcmp\tr1, r2\n"
+ "\tbcc\t.LCU0\n"
+ );
+#else
RegisterRamReset(RESET_ALL);
+#endif //MODERN
*(vu16 *)BG_PLTT = 0x7FFF;
InitGpuRegManager();
REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3;
diff --git a/src/main_menu.c b/src/main_menu.c
index bc509c70d..6a0bd9e2d 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -176,7 +176,7 @@
static EWRAM_DATA u8 gUnknown_02022D04 = 0;
static EWRAM_DATA u16 sCurrItemAndOptionMenuCheck = 0;
-static IWRAM_DATA u8 sBirchSpeechMainTaskId;
+static u8 sBirchSpeechMainTaskId;
// Static ROM declarations
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
index 8bb9cb6e4..64f04f3bc 100644
--- a/src/mauville_old_man.c
+++ b/src/mauville_old_man.c
@@ -33,7 +33,7 @@ static void Task_BardSong(u8 taskId);
static void StorytellerSetup(void);
static void Storyteller_ResetFlag(void);
-IWRAM_DATA u8 sSelectedStory;
+static u8 sSelectedStory;
struct BardSong gBardSong;
diff --git a/src/menu.c b/src/menu.c
index 354346d27..8d50d4dcc 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "alloc.h"
#include "bg.h"
+#include "blit.h"
#include "dma3.h"
#include "event_data.h"
#include "graphics.h"
@@ -2013,337 +2014,82 @@ void PrintPlayerNameOnWindow(u8 windowId, const u8 *src, u16 x, u16 y)
AddTextPrinterParameterized(windowId, 1, gStringVar4, x, y, 0xFF, 0);
}
-//Screw this function, it's long and unreferenced and ugh
+// Unused. Similar to BlitBitmapRect4Bit.
+void sub_819A080(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)
+{
+ int loopSrcY, loopDstY, loopSrcX, loopDstX, xEnd, yEnd, multiplierSrcY, multiplierDstY;
+ const u8 *pixelsSrc;
+ u16 *pixelsDst;
+ u16 toOrr;
-struct UnkStruct_819A080 {
- u8 *unk00;
- u16 unk04;
- u16 unk06;
-};
+ if (dst->width - dstX < width)
+ xEnd = dst->width - dstX + srcX;
+ else
+ xEnd = width + srcX;
+
+ if (dst->height - dstY < height)
+ yEnd = srcY + dst->height - dstY;
+ else
+ yEnd = srcY + height;
-#ifdef NONMATCHING
-void sub_819A080(struct UnkStruct_819A080 *a0, struct UnkStruct_819A080 *a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
-{
- // r3 = a3
- // r4 = a5
- // r1 = a6
- // r5 = a7
- // sp+00 = a0
- // sp+04 = a1
- // sp+08 = a2
- // sp+0c = a4
- int sp10 = a1->unk04 - a4 < a6 ? a1->unk04 - a4 + a2 : a6 + a2;
- int sp14 = a0->unk06 - a5 < a7 ? a3 + a0->unk06 - a5 : a3 + a7;
- int sp18 = (a0->unk04 + (a0->unk04 & 0x7)) / 8;
- int sp1c = (a1->unk04 + (a1->unk04 & 0x7)) / 8;
- int r12; // sp+20
- int r8; // sp+24
- int r5;
- int r6;
- u16 r2;
-
- for (r12 = a3, r8 = a5; r12 < sp14; r12++, r8++)
- {
- for (r5 = a2, r6 = a4; a5 < sp10; a5++, a6++)
+ multiplierSrcY = (src->width + (src->width & 7)) >> 3;
+ multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
+
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
{
- u8 *r3 = a0->unk00 + ((r5 >> 1) & 0x3) + ((r5 >> 3) << 5) + (((r12 >> 3) * sp18) << 5) + ((r12 & 0x7) << 2);
- u8 *r4 = a1->unk00 + ((r6 >> 1) & 0x3) + ((r6 >> 3) << 5) + (((r8 >> 3) * sp1c) << 5) + ((r8 & 0x7) << 2);
- if (((uintptr_t)r4) & 0x1)
+ pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
+ pixelsDst = (void*) dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + ((( loopDstY >> 3) * multiplierDstY) << 5) + ((u32)( loopDstY << 0x1d) >> 0x1B);
+
+ if ((uintptr_t )pixelsDst & 0x1)
{
- u16 *r4_2 = (u16 *)(r4 - 1);
- if (r6 & 0x1)
+ pixelsDst = (void*)(pixelsDst) - 1;
+ if (loopDstX & 0x1)
{
- r2 = *r4_2 & 0x0fff;
- if (r5 & 0x1)
- *r4_2 = r2 | ((*r3 & 0xf0) << 8);
+ toOrr = *pixelsDst & 0x0fff;
+ if (loopSrcX & 0x1)
+ *pixelsDst = toOrr | ((*pixelsSrc & 0xf0) << 8);
else
- *r4_2 = r2 | ((*r3 & 0x0f) << 12);
+ *pixelsDst = toOrr | ((*pixelsSrc & 0x0f) << 12);
}
else
{
- r2 = *r4_2 * 0xf0ff;
- if (r5 & 0x1)
- *r4_2 = r2 | ((*r3 & 0xf0) << 4);
+ toOrr = *pixelsDst & 0xf0ff;
+ if (loopSrcX & 0x1)
+ *pixelsDst = toOrr | ((*pixelsSrc & 0xf0) << 4);
else
- *r4_2 = r2 | ((*r3 & 0x0f) << 8);
+ *pixelsDst = toOrr | ((*pixelsSrc & 0x0f) << 8);
}
}
else
{
- u16 *r4_2 = (u16 *)r4;
- if (r6 & 1)
+ if (loopDstX & 1)
{
- r2 = *r4_2 & 0xff0f;
- if (r5 & 1)
- *r4_2 = r2 | ((*r3 & 0xf0) << 0);
+ toOrr = *pixelsDst & 0xff0f;
+ if (loopSrcX & 1)
+ *pixelsDst = toOrr | ((*pixelsSrc & 0xf0) << 0);
else
- *r4_2 = r2 | ((*r3 & 0x0f) << 4);
+ *pixelsDst = toOrr | ((*pixelsSrc & 0x0f) << 4);
}
else
{
- r2 = *r4_2 & 0xfff0;
- if (r5 & 1)
- *r4_2 = r2 | ((*r3 & 0xf0) >> 4);
+ toOrr = *pixelsDst & 0xfff0;
+ if (loopSrcX & 1)
+ *pixelsDst = toOrr | ((*pixelsSrc & 0xf0) >> 4);
else
- *r4_2 = r2 | ((*r3 & 0x0f) >> 0);
+ *pixelsDst = toOrr | ((*pixelsSrc & 0x0f) >> 0);
}
}
+
+ // Needed to match, urgh.
+ #ifndef NONMATCHING
+ asm("":::"r4");
+ pixelsDst++;pixelsDst--;
+ #endif // NONMATCHING
}
}
}
-#else
-NAKED
-void sub_819A080(struct UnkStruct_819A080 *a0, struct UnkStruct_819A080 *a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7)
-{
- asm("push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, #0x28\n\
- str r0, [sp]\n\
- str r1, [sp, #0x4]\n\
- ldr r0, [sp, #0x48]\n\
- ldr r4, [sp, #0x4C]\n\
- ldr r1, [sp, #0x50]\n\
- ldr r5, [sp, #0x54]\n\
- lsl r2, #16\n\
- lsr r2, #16\n\
- str r2, [sp, #0x8]\n\
- lsl r3, #16\n\
- lsr r3, #16\n\
- lsl r0, #16\n\
- lsr r0, #16\n\
- str r0, [sp, #0xC]\n\
- lsl r4, #16\n\
- lsr r4, #16\n\
- lsl r1, #16\n\
- lsr r1, #16\n\
- lsl r5, #16\n\
- lsr r5, #16\n\
- ldr r2, [sp, #0x4]\n\
- ldrh r0, [r2, #0x4]\n\
- ldr r2, [sp, #0xC]\n\
- sub r0, r2\n\
- ldr r2, [sp, #0x8]\n\
- add r2, r1, r2\n\
- str r2, [sp, #0x10]\n\
- cmp r0, r1\n\
- bge _0819A0CC\n\
- ldr r1, [sp, #0x8]\n\
- add r0, r1\n\
- str r0, [sp, #0x10]\n\
-_0819A0CC:\n\
- ldr r2, [sp, #0x4]\n\
- ldrh r1, [r2, #0x6]\n\
- sub r0, r1, r4\n\
- cmp r0, r5\n\
- bge _0819A0DE\n\
- add r0, r3, r1\n\
- sub r0, r4\n\
- str r0, [sp, #0x14]\n\
- b _0819A0E2\n\
-_0819A0DE:\n\
- add r5, r3, r5\n\
- str r5, [sp, #0x14]\n\
-_0819A0E2:\n\
- ldr r0, [sp]\n\
- ldrh r1, [r0, #0x4]\n\
- mov r2, #0x7\n\
- add r0, r1, #0\n\
- and r0, r2\n\
- add r1, r0\n\
- asr r1, #3\n\
- str r1, [sp, #0x18]\n\
- ldr r0, [sp, #0x4]\n\
- ldrh r1, [r0, #0x4]\n\
- add r0, r1, #0\n\
- and r0, r2\n\
- add r1, r0\n\
- asr r1, #3\n\
- str r1, [sp, #0x1C]\n\
- mov r12, r3\n\
- mov r8, r4\n\
- ldr r1, [sp, #0x14]\n\
- cmp r12, r1\n\
- blt _0819A10C\n\
- b _0819A24A\n\
-_0819A10C:\n\
- ldr r5, [sp, #0x8]\n\
- ldr r6, [sp, #0xC]\n\
- mov r2, r12\n\
- add r2, #0x1\n\
- str r2, [sp, #0x20]\n\
- mov r0, r8\n\
- add r0, #0x1\n\
- str r0, [sp, #0x24]\n\
- ldr r1, [sp, #0x10]\n\
- cmp r5, r1\n\
- blt _0819A124\n\
- b _0819A23A\n\
-_0819A124:\n\
- mov r7, #0x1\n\
- mov r2, #0xF0\n\
- mov r10, r2\n\
- mov r0, #0xF\n\
- mov r9, r0\n\
-_0819A12E:\n\
- asr r0, r5, #1\n\
- mov r1, #0x3\n\
- and r0, r1\n\
- ldr r2, [sp]\n\
- ldr r1, [r2]\n\
- add r1, r0\n\
- asr r0, r5, #3\n\
- lsl r0, #5\n\
- add r1, r0\n\
- mov r2, r12\n\
- asr r0, r2, #3\n\
- ldr r2, [sp, #0x18]\n\
- mul r0, r2\n\
- lsl r0, #5\n\
- add r1, r0\n\
- mov r2, r12\n\
- lsl r0, r2, #29\n\
- lsr r0, #27\n\
- add r3, r1, r0\n\
- asr r0, r6, #1\n\
- mov r1, #0x3\n\
- and r0, r1\n\
- ldr r2, [sp, #0x4]\n\
- ldr r1, [r2]\n\
- add r1, r0\n\
- asr r0, r6, #3\n\
- lsl r0, #5\n\
- add r1, r0\n\
- mov r2, r8\n\
- asr r0, r2, #3\n\
- ldr r2, [sp, #0x1C]\n\
- mul r0, r2\n\
- lsl r0, #5\n\
- add r1, r0\n\
- mov r2, r8\n\
- lsl r0, r2, #29\n\
- lsr r0, #27\n\
- add r4, r1, r0\n\
- add r0, r4, #0\n\
- and r0, r7\n\
- cmp r0, #0\n\
- beq _0819A1DA\n\
- sub r4, #0x1\n\
- add r0, r6, #0\n\
- and r0, r7\n\
- cmp r0, #0\n\
- beq _0819A1B2\n\
- ldrh r0, [r4]\n\
- ldr r2, =0x00000fff\n\
- and r2, r0\n\
- add r0, r5, #0\n\
- and r0, r7\n\
- cmp r0, #0\n\
- beq _0819A1A8\n\
- ldrb r1, [r3]\n\
- mov r0, r10\n\
- and r0, r1\n\
- lsl r0, #8\n\
- b _0819A22A\n\
- .pool\n\
-_0819A1A8:\n\
- ldrb r1, [r3]\n\
- mov r0, r9\n\
- and r0, r1\n\
- lsl r0, #12\n\
- b _0819A22A\n\
-_0819A1B2:\n\
- ldrh r0, [r4]\n\
- ldr r2, =0x0000f0ff\n\
- and r2, r0\n\
- add r0, r5, #0\n\
- and r0, r7\n\
- cmp r0, #0\n\
- beq _0819A1D0\n\
- ldrb r1, [r3]\n\
- mov r0, r10\n\
- and r0, r1\n\
- lsl r0, #4\n\
- b _0819A22A\n\
- .pool\n\
-_0819A1D0:\n\
- ldrb r1, [r3]\n\
- mov r0, r9\n\
- and r0, r1\n\
- lsl r0, #8\n\
- b _0819A22A\n\
-_0819A1DA:\n\
- add r0, r6, #0\n\
- and r0, r7\n\
- cmp r0, #0\n\
- beq _0819A206\n\
- ldrh r0, [r4]\n\
- ldr r2, =0x0000ff0f\n\
- and r2, r0\n\
- add r0, r5, #0\n\
- and r0, r7\n\
- cmp r0, #0\n\
- beq _0819A1FC\n\
- ldrb r1, [r3]\n\
- mov r0, r10\n\
- b _0819A228\n\
- .pool\n\
-_0819A1FC:\n\
- ldrb r1, [r3]\n\
- mov r0, r9\n\
- and r0, r1\n\
- lsl r0, #4\n\
- b _0819A22A\n\
-_0819A206:\n\
- ldrh r0, [r4]\n\
- ldr r2, =0x0000fff0\n\
- and r2, r0\n\
- add r0, r5, #0\n\
- and r0, r7\n\
- cmp r0, #0\n\
- beq _0819A224\n\
- ldrb r1, [r3]\n\
- mov r0, r10\n\
- and r0, r1\n\
- lsr r0, #4\n\
- b _0819A22A\n\
- .pool\n\
-_0819A224:\n\
- ldrb r1, [r3]\n\
- mov r0, r9\n\
-_0819A228:\n\
- and r0, r1\n\
-_0819A22A:\n\
- orr r2, r0\n\
- strh r2, [r4]\n\
- add r5, #0x1\n\
- add r6, #0x1\n\
- ldr r0, [sp, #0x10]\n\
- cmp r5, r0\n\
- bge _0819A23A\n\
- b _0819A12E\n\
-_0819A23A:\n\
- ldr r1, [sp, #0x20]\n\
- mov r12, r1\n\
- ldr r2, [sp, #0x24]\n\
- mov r8, r2\n\
- ldr r0, [sp, #0x14]\n\
- cmp r12, r0\n\
- bge _0819A24A\n\
- b _0819A10C\n\
-_0819A24A:\n\
- add sp, #0x28\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");
-}
-#endif
void sub_819A25C(u8 palOffset, u16 speciesId)
{
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
index 801e2546b..cb0d621c6 100644
--- a/src/menu_helpers.c
+++ b/src/menu_helpers.c
@@ -27,7 +27,7 @@ EWRAM_DATA static struct YesNoFuncTable gUnknown_0203A138 = {0};
EWRAM_DATA static u8 gUnknown_0203A140 = 0;
// IWRAM bss vars
-IWRAM_DATA static TaskFunc gUnknown_0300117C;
+static TaskFunc gUnknown_0300117C;
// const rom data
static const struct OamData sOamData_859F4E8 =
diff --git a/src/menu_specialized.c b/src/menu_specialized.c
index 34dd1fe2b..1536cf413 100644
--- a/src/menu_specialized.c
+++ b/src/menu_specialized.c
@@ -458,338 +458,106 @@ void sub_81D2230(struct UnknownStruct_81D1ED4 *arg0)
arg0->unk354 = 1;
}
-/* TODO
-static void sub_81D2278(struct UnknownStruct_81D1ED4 *arg0, u16 arg1[66][2], struct UnknownSubStruct_81D1ED4 *arg2, struct UnknownSubStruct_81D1ED4 *arg3, u8 arg4, u16 arg5[66][2])
+static void sub_81D2278(struct UnknownStruct_81D1ED4 *arg0, u16 *arg1, struct UnknownSubStruct_81D1ED4 *arg2, struct UnknownSubStruct_81D1ED4 *arg3, u8 arg4, u16 *arg5)
{
- s32 var_2C = 0;
- u16 r8;
- s32 r10, r4, r2, r0, r1, var_30;
+ u16 i, r8, r10, r0, var_30;
+ u16 *ptr;
+ s32 r4, var_2C;
+ var_2C = 0;
if (arg2->unk2 < arg3->unk2)
{
- r2 = arg2->unk2;
r10 = arg2->unk2;
r0 = arg3->unk2;
- r1 = arg2->unk0;
- r4 = r1 << 10;
+ r4 = arg2->unk0 << 10;
var_30 = arg3->unk0;
+ r8 = r0 - r10;
+ if (r8 != 0)
+ var_2C = ((var_30 - arg2->unk0) << 10) / r8;
}
else
{
- r0 = arg2->unk0;
+ r0 = arg2->unk2;
r10 = arg3->unk2;
- r1 = arg3->unk0;
- r4 = r1 << 10;
+ r4 = arg3->unk0 << 10;
var_30 = arg2->unk0;
- r2 = arg3->unk2;
+ r8 = r0 - r10;
+ if (r8 != 0)
+ var_2C = ((var_30 - arg3->unk0) << 10) / r8;
}
- r8 = r0 - r2;
- if (r8 != 0)
- var_2C = ((var_30 - r1) << 10) / r8;
r8++;
if (arg5 == NULL)
{
+ arg1 += (r10 - 56) * 2;
+ for (i = 0; i < r8; i++)
+ {
+ arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
+ r4 += var_2C;
+ arg1 += 2;
+ }
+ ptr = arg1 - 2;
}
-}
-*/
-NAKED
-static void sub_81D2278(struct UnknownStruct_81D1ED4 *arg0, u16 arg1[66][2], struct UnknownSubStruct_81D1ED4 *arg2, struct UnknownSubStruct_81D1ED4 *arg3, u8 arg4, u16 arg5[66][2])
-{
- 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, 0x18\n\
- str r0, [sp]\n\
- adds r6, r1, 0\n\
- adds r5, r2, 0\n\
- str r3, [sp, 0x4]\n\
- ldr r0, [sp, 0x38]\n\
- ldr r7, [sp, 0x3C]\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- movs r0, 0\n\
- str r0, [sp, 0xC]\n\
- ldrh r0, [r5, 0x2]\n\
- ldrh r1, [r3, 0x2]\n\
- cmp r0, r1\n\
- bcs _081D22B2\n\
- adds r2, r0, 0\n\
- mov r10, r2\n\
- ldrh r0, [r3, 0x2]\n\
- ldrh r1, [r5]\n\
- lsls r4, r1, 10\n\
- ldrh r3, [r3]\n\
- str r3, [sp, 0x8]\n\
- b _081D22C6\n\
- _081D22B2:\n\
- ldrh r0, [r5, 0x2]\n\
- ldr r1, [sp, 0x4]\n\
- ldrh r1, [r1, 0x2]\n\
- mov r10, r1\n\
- ldr r2, [sp, 0x4]\n\
- ldrh r1, [r2]\n\
- lsls r4, r1, 10\n\
- ldrh r3, [r5]\n\
- str r3, [sp, 0x8]\n\
- mov r2, r10\n\
- _081D22C6:\n\
- subs r0, r2\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- cmp r0, 0\n\
- beq _081D22DE\n\
- subs r0, r3, r1\n\
- lsls r0, 10\n\
- mov r1, r8\n\
- bl __divsi3\n\
- str r0, [sp, 0xC]\n\
- _081D22DE:\n\
- mov r0, r8\n\
- adds r0, 0x1\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- cmp r7, 0\n\
- bne _081D2328\n\
- mov r0, r10\n\
- subs r0, 0x38\n\
- lsls r0, 2\n\
- adds r6, r0\n\
- movs r5, 0\n\
- mov r3, r9\n\
- lsls r3, 1\n\
- mov r12, r3\n\
- ldr r0, [sp, 0x8]\n\
- add r0, r9\n\
- str r0, [sp, 0x10]\n\
- cmp r7, r8\n\
- bcs _081D23B6\n\
- movs r7, 0x1\n\
- _081D2308:\n\
- adds r2, r3, r6\n\
- asrs r1, r4, 10\n\
- asrs r0, r4, 9\n\
- ands r0, r7\n\
- adds r1, r0\n\
- add r1, r9\n\
- strh r1, [r2]\n\
- ldr r1, [sp, 0xC]\n\
- adds r4, r1\n\
- adds r6, 0x4\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- cmp r5, r8\n\
- bcc _081D2308\n\
- b _081D23B6\n\
- _081D2328:\n\
- ldr r2, [sp, 0xC]\n\
- cmp r2, 0\n\
- ble _081D23C0\n\
- mov r0, r10\n\
- subs r0, 0x38\n\
- lsls r0, 2\n\
- adds r7, r0\n\
- movs r5, 0\n\
- mov r3, r9\n\
- lsls r3, 1\n\
- mov r12, r3\n\
- ldr r0, [sp, 0x8]\n\
- add r0, r9\n\
- str r0, [sp, 0x10]\n\
- cmp r5, r8\n\
- bcs _081D237A\n\
- ldr r0, =0x00026bff\n\
- cmp r4, r0\n\
- bgt _081D237A\n\
- mov r1, r12\n\
- str r1, [sp, 0x14]\n\
- _081D2352:\n\
- ldr r3, [sp, 0x14]\n\
- adds r2, r3, r7\n\
- asrs r1, r4, 10\n\
- asrs r0, r4, 9\n\
- movs r3, 0x1\n\
- ands r0, r3\n\
- adds r1, r0\n\
- add r1, r9\n\
- strh r1, [r2]\n\
- ldr r0, [sp, 0xC]\n\
- adds r4, r0\n\
- adds r7, 0x4\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- cmp r5, r8\n\
- bcs _081D237A\n\
- ldr r1, =0x00026bff\n\
- cmp r4, r1\n\
- ble _081D2352\n\
- _081D237A:\n\
- mov r2, r10\n\
- adds r1, r2, r5\n\
- ldr r3, [sp]\n\
- movs r2, 0xD4\n\
- lsls r2, 2\n\
- adds r0, r3, r2\n\
- strh r1, [r0]\n\
- ldrh r0, [r0]\n\
- subs r0, 0x38\n\
- lsls r0, 2\n\
- adds r6, r0\n\
- cmp r5, r8\n\
- bcs _081D23B6\n\
- mov r3, r12\n\
- movs r7, 0x1\n\
- _081D2398:\n\
- adds r2, r3, r6\n\
- asrs r1, r4, 10\n\
- asrs r0, r4, 9\n\
- ands r0, r7\n\
- adds r1, r0\n\
- add r1, r9\n\
- strh r1, [r2]\n\
- ldr r0, [sp, 0xC]\n\
- adds r4, r0\n\
- adds r6, 0x4\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- cmp r5, r8\n\
- bcc _081D2398\n\
- _081D23B6:\n\
- subs r0, r6, 0x4\n\
- b _081D248C\n\
- .pool\n\
- _081D23C0:\n\
- ldr r1, [sp, 0xC]\n\
- cmp r1, 0\n\
- bge _081D2464\n\
- mov r0, r10\n\
- subs r0, 0x38\n\
- lsls r0, 2\n\
- adds r6, r0\n\
- movs r5, 0\n\
- mov r2, r9\n\
- lsls r2, 1\n\
- mov r12, r2\n\
- ldr r3, [sp, 0x8]\n\
- add r3, r9\n\
- str r3, [sp, 0x10]\n\
- cmp r5, r8\n\
- bcs _081D241E\n\
- adds r3, r2, r6\n\
- asrs r1, r4, 10\n\
- asrs r0, r4, 9\n\
- movs r2, 0x1\n\
- ands r0, r2\n\
- adds r1, r0\n\
- add r1, r9\n\
- strh r1, [r3]\n\
- b _081D2414\n\
- _081D23F2:\n\
- ldr r0, [sp, 0xC]\n\
- adds r4, r0\n\
- adds r6, 0x4\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- cmp r5, r8\n\
- bcs _081D241E\n\
- mov r1, r12\n\
- adds r3, r1, r6\n\
- asrs r2, r4, 10\n\
- asrs r0, r4, 9\n\
- movs r1, 0x1\n\
- ands r0, r1\n\
- adds r2, r0\n\
- add r2, r9\n\
- strh r2, [r3]\n\
- _081D2414:\n\
- ldr r0, =0x00026bff\n\
- cmp r4, r0\n\
- bgt _081D23F2\n\
- movs r0, 0x9B\n\
- strh r0, [r3]\n\
- _081D241E:\n\
- mov r2, r10\n\
- adds r1, r2, r5\n\
- ldr r3, [sp]\n\
- movs r2, 0xD4\n\
- lsls r2, 2\n\
- adds r0, r3, r2\n\
- strh r1, [r0]\n\
- ldrh r0, [r0]\n\
- subs r0, 0x38\n\
- lsls r0, 2\n\
- adds r7, r0\n\
- cmp r5, r8\n\
- bcs _081D245A\n\
- mov r3, r12\n\
- movs r6, 0x1\n\
- _081D243C:\n\
- adds r2, r3, r7\n\
- asrs r1, r4, 10\n\
- asrs r0, r4, 9\n\
- ands r0, r6\n\
- adds r1, r0\n\
- add r1, r9\n\
- strh r1, [r2]\n\
- ldr r0, [sp, 0xC]\n\
- adds r4, r0\n\
- adds r7, 0x4\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- cmp r5, r8\n\
- bcc _081D243C\n\
- _081D245A:\n\
- subs r0, r7, 0x4\n\
- b _081D248C\n\
- .pool\n\
- _081D2464:\n\
- ldr r1, [sp]\n\
- movs r2, 0xD4\n\
- lsls r2, 2\n\
- adds r0, r1, r2\n\
- mov r3, r10\n\
- strh r3, [r0]\n\
- mov r0, r10\n\
- subs r0, 0x38\n\
- lsls r0, 2\n\
- adds r6, r0\n\
- adds r7, r0\n\
- ldrh r0, [r5]\n\
- adds r0, 0x1\n\
- strh r0, [r6, 0x2]\n\
- ldr r1, [sp, 0x4]\n\
- ldrh r0, [r1]\n\
- strh r0, [r7]\n\
- movs r0, 0x9B\n\
- strh r0, [r7, 0x2]\n\
- b _081D2494\n\
- _081D248C:\n\
- add r0, r12\n\
- mov r2, sp\n\
- ldrh r2, [r2, 0x10]\n\
- strh r2, [r0]\n\
- _081D2494:\n\
- add sp, 0x18\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\
- ");
+ else if (var_2C > 0)
+ {
+ arg5 += (r10 - 56) * 2;
+ // Less readable than the other loops, but it has to be written this way to match.
+ for (i = 0; i < r8; arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4, r4 += var_2C, arg5 += 2, i++)
+ {
+ if (r4 >= (155 << 10))
+ break;
+ }
+
+ arg0->unk350 = r10 + i;
+ arg1 += (arg0->unk350 - 56) * 2;
+ for (; i < r8; i++)
+ {
+ arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
+ r4 += var_2C;
+ arg1 += 2;
+ }
+
+ ptr = arg1 - 2;
+ }
+ else if (var_2C < 0)
+ {
+ arg1 += (r10 - 56) * 2;
+ for (i = 0; i < r8; i++)
+ {
+ arg1[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
+ if (r4 < (155 << 10))
+ {
+ arg1[arg4] = 155;
+ break;
+ }
+ r4 += var_2C;
+ arg1 += 2;
+ }
+
+ arg0->unk350 = r10 + i;
+ arg5 += (arg0->unk350 - 56) * 2;
+ for (; i < r8; i++)
+ {
+ arg5[arg4] = (r4 >> 10) + ((r4 >> 9) & 1) + arg4;
+ r4 += var_2C;
+ arg5 += 2;
+ }
+
+ ptr = arg5 - 2;
+ }
+ else
+ {
+ arg0->unk350 = r10;
+ arg1 += (r10 - 56) * 2;
+ arg5 += (r10 - 56) * 2;
+ arg1[1] = arg2->unk0 + 1;
+ arg5[0] = arg3->unk0;
+ arg5[1] = 155;
+ return;
+ }
+
+ ptr[arg4] = arg4 + var_30;
}
static void sub_81D24A4(struct UnknownStruct_81D1ED4 *arg0)
@@ -799,18 +567,18 @@ static void sub_81D24A4(struct UnknownStruct_81D1ED4 *arg0)
if (arg0->unk12C[0].unk2 < arg0->unk12C[1].unk2)
{
r6 = arg0->unk12C[0].unk2;
- sub_81D2278(arg0, arg0->unk140, &arg0->unk12C[0], &arg0->unk12C[1], 1, NULL);
+ sub_81D2278(arg0, arg0->unk140[0], &arg0->unk12C[0], &arg0->unk12C[1], 1, NULL);
}
else
{
r6 = arg0->unk12C[1].unk2;
- sub_81D2278(arg0, arg0->unk140, &arg0->unk12C[1], &arg0->unk12C[0], 0, NULL);
+ sub_81D2278(arg0, arg0->unk140[0], &arg0->unk12C[1], &arg0->unk12C[0], 0, NULL);
}
- sub_81D2278(arg0, arg0->unk140, &arg0->unk12C[1], &arg0->unk12C[2], 1, NULL);
+ sub_81D2278(arg0, arg0->unk140[0], &arg0->unk12C[1], &arg0->unk12C[2], 1, NULL);
i = (arg0->unk12C[2].unk2 <= arg0->unk12C[3].unk2);
- sub_81D2278(arg0, arg0->unk140, &arg0->unk12C[2], &arg0->unk12C[3], i, arg0->unk248);
+ sub_81D2278(arg0, arg0->unk140[0], &arg0->unk12C[2], &arg0->unk12C[3], i, arg0->unk248[0]);
for (i = 56; i < r6; i++)
{
arg0->unk140[i - 56][0] = 0;
@@ -841,15 +609,15 @@ static void sub_81D2634(struct UnknownStruct_81D1ED4 *arg0)
if (arg0->unk12C[0].unk2 < arg0->unk12C[4].unk2)
{
r6 = arg0->unk12C[0].unk2;
- sub_81D2278(arg0, arg0->unk248, &arg0->unk12C[0], &arg0->unk12C[4], 0, NULL);
+ sub_81D2278(arg0, arg0->unk248[0], &arg0->unk12C[0], &arg0->unk12C[4], 0, NULL);
}
else
{
r6 = arg0->unk12C[4].unk2;
- sub_81D2278(arg0, arg0->unk248, &arg0->unk12C[4], &arg0->unk12C[0], 1, NULL);
+ sub_81D2278(arg0, arg0->unk248[0], &arg0->unk12C[4], &arg0->unk12C[0], 1, NULL);
}
- sub_81D2278(arg0, arg0->unk248, &arg0->unk12C[4], &arg0->unk12C[3], 0, NULL);
+ sub_81D2278(arg0, arg0->unk248[0], &arg0->unk12C[4], &arg0->unk12C[3], 0, NULL);
for (i = 56; i < r6; i++)
{
@@ -1290,7 +1058,7 @@ void sub_81D3094(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 arg5, u
u32 personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL);
LoadSpecialPokePic(&gMonFrontPicTable[species], tilesDst, species, personality, TRUE);
- LZ77UnCompWram(GetFrontSpritePalFromSpeciesAndPersonality(species, trainerId, personality), palDst);
+ LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), palDst);
}
}
diff --git a/src/mirage_tower.c b/src/mirage_tower.c
index 269f8ea1b..bb9c6e958 100644
--- a/src/mirage_tower.c
+++ b/src/mirage_tower.c
@@ -258,7 +258,7 @@ 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];
+static u16 gUnknown_030012A8[8];
bool8 IsMirageTowerVisible(void)
{
@@ -318,7 +318,7 @@ void SetMirageTowerVisibility(void)
u16 rand;
bool8 visible;
- if (VarGet(VAR_ROUTE_111_STATE))
+ if (VarGet(VAR_MIRAGE_TOWER_STATE))
{
FlagClear(FLAG_MIRAGE_TOWER_VISIBLE);
return;
diff --git a/src/multiboot.c b/src/multiboot.c
index da90a55c0..c7e14392e 100644
--- a/src/multiboot.c
+++ b/src/multiboot.c
@@ -1,7 +1,7 @@
#include "gba/gba.h"
#include "multiboot.h"
-IWRAM_DATA static u16 MultiBoot_required_data[MULTIBOOT_NCHILD];
+static u16 MultiBoot_required_data[MULTIBOOT_NCHILD];
static int MultiBootSend(struct MultiBootParam *mp, u16 data);
static int MultiBootHandShake(struct MultiBootParam *mp);
@@ -435,7 +435,7 @@ static int MultiBootHandShake(struct MultiBootParam *mp)
#undef must_data
}
-static void MultiBootWaitCycles(u32 cycles)
+static NOINLINE void MultiBootWaitCycles(u32 cycles)
{
asm("mov r2, pc");
asm("lsr r2, #24");
diff --git a/src/new_game.c b/src/new_game.c
index 7a0c668a4..b4d9ba9b3 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -37,6 +37,7 @@
#include "contest.h"
#include "item_menu.h"
#include "pokemon_storage_system.h"
+#include "pokemon_jump.h"
#include "decoration_inventory.h"
#include "secret_base.h"
#include "player_pc.h"
@@ -45,8 +46,6 @@
#include "mevent.h"
#include "union_room_chat.h"
-extern void ResetPokeJumpResults(void);
-
extern const u8 EventScript_ResetAllMapFlags[];
// this file's functions
@@ -199,7 +198,7 @@ void NewGameInitData(void)
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
ResetMiniGamesResults();
copy_strings_to_sav1();
- SetLilycoveLady();
+ InitLilycoveLady();
ResetAllApprenticeData();
ClearRankingHallRecords();
InitMatchCallCounters();
diff --git a/src/overworld.c b/src/overworld.c
index 4356752c1..cefbd8159 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -186,15 +186,15 @@ static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStr
static u16 GetCenterScreenMetatileBehavior(void);
// IWRAM bss vars
-IWRAM_DATA static void *sUnusedOverworldCallback;
-IWRAM_DATA static u8 sPlayerTradingStates[4];
+static void *sUnusedOverworldCallback;
+static u8 sPlayerTradingStates[4];
// This callback is called with a player's key code. It then returns an
// adjusted key code, effectively intercepting the input before anything
// can process it.
-IWRAM_DATA static u16 (*sPlayerKeyInterceptCallback)(u32);
-IWRAM_DATA static bool8 sUnknown_03000E18;
-IWRAM_DATA static u8 sRfuKeepAliveTimer;
-IWRAM_DATA static u32 sUnusedVar;
+static u16 (*sPlayerKeyInterceptCallback)(u32);
+static bool8 sUnknown_03000E18;
+static u8 sRfuKeepAliveTimer;
+static u32 sUnusedVar;
// IWRAM common
u16 *gBGTilemapBuffers1;
@@ -1040,7 +1040,7 @@ static bool16 ShouldLegendaryMusicPlayAtLocation(struct WarpData *warp)
case MAP_NUM(ROUTE128):
return TRUE;
default:
- if (VarGet(VAR_RAYQUAZA_STATE) < 4)
+ if (VarGet(VAR_SOOTOPOLIS_CITY_STATE) < 4)
return FALSE;
switch (warp->mapNum)
{
@@ -1081,9 +1081,9 @@ static bool16 IsInfiltratedWeatherInstitute(struct WarpData *warp)
static bool16 IsInflitratedSpaceCenter(struct WarpData *warp)
{
- if (VarGet(VAR_MOSSDEEP_STATE) == 0)
+ if (VarGet(VAR_MOSSDEEP_CITY_STATE) == 0)
return FALSE;
- else if (VarGet(VAR_MOSSDEEP_STATE) > 2)
+ else if (VarGet(VAR_MOSSDEEP_CITY_STATE) > 2)
return FALSE;
else if (warp->mapGroup != MAP_GROUP(MOSSDEEP_CITY_SPACE_CENTER_1F))
return FALSE;
diff --git a/src/palette.c b/src/palette.c
index 5d1d6635c..eb49ce4c6 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -54,8 +54,10 @@ static void UpdateBlendRegisters(void);
static bool8 IsSoftwarePaletteFadeFinishing(void);
static void sub_80A2D54(u8 taskId);
-EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0};
-EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0};
+// palette buffers require alignment with agbcc because
+// unaligned word reads are issued in BlendPalette otherwise
+ALIGNED(4) EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0};
+ALIGNED(4) EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0};
EWRAM_DATA struct PaletteStruct sPaletteStructs[0x10] = {0};
EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0};
static EWRAM_DATA u32 gFiller_2037FE0 = 0;
diff --git a/src/party_menu.c b/src/party_menu.c
index f20bdff51..f4b749bde 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -1596,8 +1596,8 @@ static void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 messageId, TaskFunc task, M
gUnknown_0203CEC4->task = task;
gUnknown_0203CEC4->exitCallback = NULL;
gUnknown_0203CEC4->unk8_1 = 0;
- gUnknown_0203CEC4->unk8_2 = 0xFF;
- gUnknown_0203CEC4->unk9_0 = 0xFF;
+ gUnknown_0203CEC4->unk8_2 = 0x7F;
+ gUnknown_0203CEC4->unk9_0 = 0x7F;
if (a == 4)
gUnknown_0203CEC4->unk8_0 = TRUE;
@@ -1820,7 +1820,7 @@ static bool8 AllocPartyMenuBg(void)
static bool8 AllocPartyMiscGfx(void)
{
- int sizeout;
+ u32 sizeout;
switch (gUnknown_0203CEC4->data[0])
{
@@ -3650,7 +3650,7 @@ static u8 sub_81B31B0(u8 a)
for (i = 0; i < gUnknown_0203CEC4->listSize; i++)
{
- u8 unk = (gUnknown_0203CEC4->actions[i] > 18) ? 4 : 3;
+ u8 unk = (gUnknown_0203CEC4->actions[i] >= MENU_FIELD_MOVES) ? 4 : 3;
AddTextPrinterParameterized4(gUnknown_0203CEC4->windowId[0], 1, cursorDimension, (i * 16) + 1, fontAttribute, 0, sFontColorTable[unk], 0, sCursorOptions[gUnknown_0203CEC4->actions[i]].text);
}
diff --git a/src/pokedex.c b/src/pokedex.c
index 2588e2b73..c1787ef6a 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -1319,7 +1319,7 @@ void CB2_Pokedex(void)
default:
SetVBlankCallback(NULL);
sub_80C09B0(0);
- DmaFillLarge16(3, 0, (u8 *)VRAM, VRAM_SIZE, 0x1000)
+ DmaFillLarge16(3, 0, (u8 *)VRAM, VRAM_SIZE, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
gMain.state = 1;
@@ -3855,7 +3855,7 @@ void blockset_load_palette_to_gpu(u8 taskId)
otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12];
personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14];
paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum;
- lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
+ lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality);
LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32);
DestroyTask(taskId);
}
@@ -4249,12 +4249,12 @@ u16 GetPokedexHeightWeight(u16 dexNum, u8 data)
{
switch (data)
{
- case 0: // height
- return gPokedexEntries[dexNum].height;
- case 1: // weight
- return gPokedexEntries[dexNum].weight;
- default:
- return 1;
+ case 0: // height
+ return gPokedexEntries[dexNum].height;
+ case 1: // weight
+ return gPokedexEntries[dexNum].weight;
+ default:
+ return 1;
}
}
@@ -4360,23 +4360,23 @@ u16 GetHoennPokedexCount(u8 caseID)
return count;
}
-u16 sub_80C089C(u8 caseID)
+u16 GetKantoPokedexCount(u8 caseID)
{
u16 count = 0;
u16 i;
- for (i = 0; i < 151; i++)
+ for (i = 0; i < KANTO_DEX_COUNT; i++)
{
switch (caseID)
{
- case FLAG_GET_SEEN:
- if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
- count++;
- break;
- case FLAG_GET_CAUGHT:
- if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- count++;
- break;
+ case FLAG_GET_SEEN:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN))
+ count++;
+ break;
+ case FLAG_GET_CAUGHT:
+ if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
+ count++;
+ break;
}
}
return count;
@@ -4386,7 +4386,7 @@ bool16 HasAllHoennMons(void)
{
u16 i;
- for (i = 0; i < 200; i++)
+ for (i = 0; i < HOENN_DEX_COUNT - 2; i++)
{
if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT))
return FALSE;
@@ -4394,11 +4394,11 @@ bool16 HasAllHoennMons(void)
return TRUE;
}
-bool8 sub_80C0918(void)
+bool8 HasAllKantoMons(void)
{
u16 i;
- for (i = 0; i < 150; i++)
+ for (i = 0; i < KANTO_DEX_COUNT - 1; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
return FALSE;
@@ -4406,26 +4406,26 @@ bool8 sub_80C0918(void)
return TRUE;
}
-u16 sub_80C0944(void)
+bool16 HasAllMons(void)
{
u16 i;
- for (i = 0; i < 150; i++)
+ for (i = 0; i < NATIONAL_DEX_MEWTWO; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- return 0;
+ return FALSE;
}
- for (i = 151; i < 248; i++)
+ for (i = NATIONAL_DEX_MEW; i < NATIONAL_DEX_TYRANITAR; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- return 0;
+ return FALSE;
}
- for (i = 251; i < 384; i++)
+ for (i = NATIONAL_DEX_CELEBI; i < NATIONAL_DEX_RAYQUAZA; i++)
{
if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT))
- return 0;
+ return FALSE;
}
- return 1;
+ return TRUE;
}
void sub_80C09B0(u16 a)
diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c
index 1eb8c0953..dc69b5d54 100755
--- a/src/pokedex_area_screen.c
+++ b/src/pokedex_area_screen.c
@@ -763,11 +763,11 @@ static void sub_813D6B4(void)
static void CreateAreaMarkerSprites(void)
{
u8 spriteId;
- static IWRAM_DATA s16 x;
- static IWRAM_DATA s16 y;
- static IWRAM_DATA s16 i;
- static IWRAM_DATA s16 mapSecId;
- static IWRAM_DATA s16 numSprites;
+ static s16 x;
+ static s16 y;
+ static s16 i;
+ static s16 mapSecId;
+ static s16 numSprites;
LoadSpriteSheet(&sAreaMarkerSpriteSheet);
LoadSpritePalette(&sAreaMarkerSpritePalette);
diff --git a/src/pokemon.c b/src/pokemon.c
index c54e8ad2c..f5e79243e 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -2183,7 +2183,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
{
value = Random32();
shinyValue = HIHALF(value) ^ LOHALF(value) ^ HIHALF(personality) ^ LOHALF(personality);
- } while (shinyValue < 8);
+ } while (shinyValue < SHINY_ODDS);
}
else if (otIdType == OT_ID_PRESET) //Pokemon has a preset OT ID
{
@@ -2341,7 +2341,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI
u16 evAmount;
u8 evsBits;
- CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0);
+ CreateMon(mon, species, level, fixedIV, 0, 0, OT_ID_PLAYER_ID, 0);
evsBits = evSpread;
@@ -2373,7 +2373,7 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src)
u8 language;
u8 value;
- CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId);
+ CreateMon(mon, src->species, src->level, 0, 1, src->personality, OT_ID_PRESET, src->otId);
for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(mon, src->moves[i], i);
@@ -2435,7 +2435,7 @@ void CreateBattleTowerMon2(struct Pokemon *mon, struct BattleTowerPokemon *src,
else
level = src->level;
- CreateMon(mon, src->species, level, 0, 1, src->personality, 1, src->otId);
+ CreateMon(mon, src->species, level, 0, 1, src->personality, OT_ID_PRESET, src->otId);
for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(mon, src->moves[i], i);
@@ -2497,7 +2497,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m
0x1F,
TRUE,
personality,
- TRUE,
+ OT_ID_PRESET,
otId);
SetMonData(mon, MON_DATA_HELD_ITEM, &src->party[monId].item);
@@ -2527,7 +2527,7 @@ void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level,
i = Random32();
} while (nature != GetNatureFromPersonality(i));
- CreateMon(mon, species, level, fixedIV, TRUE, i, TRUE, otId);
+ CreateMon(mon, species, level, fixedIV, TRUE, i, OT_ID_PRESET, otId);
evsBits = evSpread;
for (i = 0; i < NUM_STATS; i++)
{
@@ -2649,25 +2649,20 @@ bool8 sub_80688F8(u8 caseId, u8 battlerId)
return TRUE;
}
-static s32 GetDeoxysStat(struct Pokemon *mon, s32 statId)
+static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId)
{
s32 ivVal, evVal;
- s32 statValue;
- u8 nature, statId_;
+ u16 statValue = 0;
+ u8 nature;
- if (gBattleTypeFlags & BATTLE_TYPE_20)
- return 0;
- if (GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
+ if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS)
return 0;
ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL);
evVal = GetMonData(mon, MON_DATA_HP_EV + statId, NULL);
- statValue = (u16)(((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5);
-
+ statValue = ((sDeoxysBaseStats[statId] * 2 + ivVal + evVal / 4) * mon->level) / 100 + 5;
nature = GetNature(mon);
- statId_ = statId; // needed to match
- statValue = ModifyStatByNature(nature, statValue, statId_);
-
+ statValue = ModifyStatByNature(nature, statValue, (u8)statId);
return statValue;
}
@@ -3584,27 +3579,27 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
ret = mon->maxHP;
break;
case MON_DATA_ATK:
- ret = (u16)GetDeoxysStat(mon, STAT_ATK);
+ ret = GetDeoxysStat(mon, STAT_ATK);
if (!ret)
ret = mon->attack;
break;
case MON_DATA_DEF:
- ret = (u16)GetDeoxysStat(mon, STAT_DEF);
+ ret = GetDeoxysStat(mon, STAT_DEF);
if (!ret)
ret = mon->defense;
break;
case MON_DATA_SPEED:
- ret = (u16)GetDeoxysStat(mon, STAT_SPEED);
+ ret = GetDeoxysStat(mon, STAT_SPEED);
if (!ret)
ret = mon->speed;
break;
case MON_DATA_SPATK:
- ret = (u16)GetDeoxysStat(mon, STAT_SPATK);
+ ret = GetDeoxysStat(mon, STAT_SPATK);
if (!ret)
ret = mon->spAttack;
break;
case MON_DATA_SPDEF:
- ret = (u16)GetDeoxysStat(mon, STAT_SPDEF);
+ ret = GetDeoxysStat(mon, STAT_SPDEF);
if (!ret)
ret = mon->spDefense;
break;
@@ -4429,7 +4424,7 @@ u8 GetMonsStateToDoubles_2(void)
return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
}
-u8 GetAbilityBySpecies(u16 species, bool8 abilityNum)
+u8 GetAbilityBySpecies(u16 species, u8 abilityNum)
{
if (abilityNum)
gLastUsedAbility = gBaseStats[species].abilities[1];
@@ -4463,7 +4458,7 @@ void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord)
15,
1,
gBattleResources->secretBase->party.personality[i],
- 2,
+ OT_ID_RANDOM_NO_SHINY,
0);
SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]);
@@ -6321,10 +6316,10 @@ const u32 *GetMonFrontSpritePal(struct Pokemon *mon)
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
- return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
+ return GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality);
}
-const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
+const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
{
u32 shinyValue;
@@ -6332,7 +6327,7 @@ const u32 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32
return gMonPaletteTable[0].data;
shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
- if (shinyValue < 8)
+ if (shinyValue < SHINY_ODDS)
return gMonShinyPaletteTable[species].data;
else
return gMonPaletteTable[species].data;
@@ -6351,7 +6346,7 @@ const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u
u32 shinyValue;
shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
- if (shinyValue < 8)
+ if (shinyValue < SHINY_ODDS)
return &gMonShinyPaletteTable[species];
else
return &gMonPaletteTable[species];
@@ -6525,7 +6520,7 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
{
bool8 retVal = FALSE;
u32 shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
- if (shinyValue < 8)
+ if (shinyValue < SHINY_ODDS)
retVal = TRUE;
return retVal;
}
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
index 52fa6db51..340327475 100644
--- a/src/pokemon_animation.c
+++ b/src/pokemon_animation.c
@@ -177,9 +177,9 @@ static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite);
#define STRUCT_COUNT 4
// IWRAM bss
-static IWRAM_DATA struct UnkAnimStruct sUnknown_03001240[STRUCT_COUNT];
-static IWRAM_DATA u8 sUnknown_03001270;
-static IWRAM_DATA bool32 sUnknown_03001274;
+static struct UnkAnimStruct sUnknown_03001240[STRUCT_COUNT];
+static u8 sUnknown_03001270;
+static bool32 sUnknown_03001274;
// const rom data
static const u8 sSpeciesToBackAnimSet[] =
@@ -861,16 +861,27 @@ u8 GetSpeciesBackAnimSet(u16 species)
}
#define tState data[0]
-#define tPtrLO data[1]
-#define tPtrHI data[2]
+#define tPtrHi data[1]
+#define tPtrLo data[2]
#define tAnimId data[3]
#define tSaved0 data[4]
#define tSaved2 data[5]
+// BUG: In vanilla, tPtrLo is read as an s16, so if bit 15 of the
+// address were to be set it would cause the pointer to be read
+// as 0xFFFFXXXX instead of the desired 0x02YYXXXX.
+// By dumb luck, this is not an issue in vanilla. However,
+// changing the link order revealed this bug.
+#if MODERN
+#define ANIM_SPRITE(taskId) ((struct Sprite *)((gTasks[taskId].tPtrHi << 16) | ((u16)gTasks[taskId].tPtrLo)))
+#else
+#define ANIM_SPRITE(taskId) ((struct Sprite *)((gTasks[taskId].tPtrHi << 16) | (gTasks[taskId].tPtrLo)))
+#endif //MODERN
+
static void Task_HandleMonAnimation(u8 taskId)
{
u32 i;
- struct Sprite *sprite = (struct Sprite*)(u32)((gTasks[taskId].tPtrLO << 0x10) | (gTasks[taskId].tPtrHI));
+ struct Sprite *sprite = ANIM_SPRITE(taskId);
if (gTasks[taskId].tState == 0)
{
@@ -900,8 +911,8 @@ static void Task_HandleMonAnimation(u8 taskId)
void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId)
{
u8 taskId = CreateTask(Task_HandleMonAnimation, 128);
- gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
- gTasks[taskId].tPtrHI = (u32)(sprite);
+ gTasks[taskId].tPtrHi = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrLo = (u32)(sprite);
gTasks[taskId].tAnimId = frontAnimId;
}
@@ -916,8 +927,8 @@ void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet)
u8 nature, taskId, animId, battlerId;
taskId = CreateTask(Task_HandleMonAnimation, 128);
- gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
- gTasks[taskId].tPtrHI = (u32)(sprite);
+ gTasks[taskId].tPtrHi = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrLo = (u32)(sprite);
battlerId = sprite->data[0];
nature = GetNature(&gPlayerParty[gBattlerPartyIndexes[battlerId]]);
@@ -927,8 +938,8 @@ void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet)
}
#undef tState
-#undef tPtrLO
-#undef tPtrHI
+#undef tPtrHi
+#undef tPtrLo
#undef tAnimId
#undef tSaved0
#undef tSaved2
diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c
index 4a457adc4..8f16e1ce2 100755
--- a/src/pokemon_jump.c
+++ b/src/pokemon_jump.c
@@ -1,8 +1,12 @@
#include "global.h"
#include "alloc.h"
+#include "battle_anim.h"
+#include "bg.h"
#include "data.h"
#include "decompress.h"
+#include "dynamic_placeholder_text_util.h"
#include "event_data.h"
+#include "international_string_util.h"
#include "item.h"
#include "link.h"
#include "link_rfu.h"
@@ -10,11 +14,15 @@
#include "menu.h"
#include "palette.h"
#include "random.h"
+#include "rom_8034C54.h"
#include "save.h"
+#include "script.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
+#include "text_window.h"
#include "trig.h"
#include "pokemon.h"
#include "pokemon_jump.h"
@@ -43,6 +51,42 @@ struct PokemonJump1_82E4
u8 unk1C[11];
};
+struct PokemonJump2
+{
+ int unk0;
+ u16 unk4;
+ u8 unk6;
+ u8 filler7[0xa - 0x7];
+ u8 unkA;
+ u8 unkB;
+ u8 unkC;
+ u8 unkD;
+ u8 unkE;
+ u8 unkF;
+ u16 filler10;
+ u16 unk12;
+ u16 unk14;
+ u32 unk18;
+ u16 unk1C[5];
+ u8 txtBuff[2][0x40];
+ u8 strBuff[0x100];
+ u16 tilemapBuffer[(0x81a8 - 0x1a6) / 2]; // 0x1A6
+ struct Sprite *unk81A8[MAX_RFU_PLAYERS];
+ struct Sprite *unk81BC[MAX_RFU_PLAYERS];
+ struct Sprite *unk81D0[8];
+ u8 filler81F0[0xC];
+ u8 unk81FC[MAX_RFU_PLAYERS];
+};
+
+struct PokemonJump1Sub
+{
+ u8 unk0;
+ u8 unk1;
+ u16 unk2;
+ u16 unk4;
+ u32 unk8;
+};
+
struct PokemonJump1
{
MainCallback returnCallback;
@@ -91,19 +135,14 @@ struct PokemonJump1
int unk64;
int unk68;
int unk6C;
- u8 unk70;
- u8 unk71;
- u16 unk72;
- u16 unk74;
- u32 unk78;
+ struct PokemonJump1Sub unk70;
u8 unk7C[MAX_RFU_PLAYERS];
u8 unk81[MAX_RFU_PLAYERS];
u8 unk86[MAX_RFU_PLAYERS];
u8 unk8B[MAX_RFU_PLAYERS];
u16 unk90[MAX_RFU_PLAYERS];
u16 unk9A[MAX_RFU_PLAYERS];
- void **unkA4;
- u8 fillerA8[0x8200];
+ struct PokemonJump2 unkA4;
struct PokemonJump1_MonInfo unk82A8[MAX_RFU_PLAYERS];
struct PokemonJump1_82E4 unk82E4[MAX_RFU_PLAYERS];
struct PokemonJump1_82E4 *unk83AC;
@@ -115,33 +154,9 @@ struct PokemonJumpMons
u16 unk2;
};
-struct Unk802B078
-{
- u8 unk0;
- u8 unk1;
- u16 unk2;
- u16 unk4;
- u16 unk6;
- int unk8;
-};
-
-
-struct PokemonJump2
-{
- u8 filler0[0xE];
- u8 unkE;
- u8 unkF;
- u8 filler10[0x8198];
- struct Sprite *unk81A8[MAX_RFU_PLAYERS];
- struct Sprite *unk81BC[MAX_RFU_PLAYERS];
- struct Sprite *unk81D0[8];
- u8 filler81F0[0xC];
- u8 unk81FC[MAX_RFU_PLAYERS];
-};
-
static void sub_802AA60(struct PokemonJump1 *);
-void sub_802AA94(struct PokemonJump1 *);
-void sub_802AB20(void);
+static void sub_802AA94(struct PokemonJump1 *);
+static void sub_802AB20(void);
static void sub_802AB98(void);
static s16 sub_802AC00(u16 species);
static void sub_802AC2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon);
@@ -215,45 +230,85 @@ static void sub_802CB7C(struct Sprite *sprite);
static void sub_802CC40(struct Sprite *sprite);
static void sub_802CD08(struct Sprite *sprite);
static void sub_802CDD4(struct Sprite *sprite);
-void sub_802DC9C(u32);
-void sub_802D074(void *);
-void sub_802D0AC(void);
-void sub_802D0C8(int);
-int sub_802D0F0(void);
-void sub_802D764(void);
-bool32 sub_802D788(void);
-void sub_802D7E8(u16, u16);
-void sub_802D884(u16);
-void sub_802D8FC(u16);
-bool32 sub_802D974(void);
-void sub_802DA14(void);
-void sub_802DC80(int, s8);
-void sub_802DD88(u8);
-bool32 sub_802DA44(void);
-void sub_802DD64(int);
-s8 sub_802DA8C(void);
-int sub_802DCCC(u8);
-void sub_802DD74(u16);
-void sub_802DDA0(u8);
-int sub_802DDB8(int);
-void sub_802DDCC(void);
-void sub_802DDE0(void);
-void sub_802DDF4(int);
-int sub_802DE08(void);
-void sub_802E0AC(struct PokemonJump1_MonInfo *);
-bool32 sub_802E0D0(int, struct PokemonJump1_MonInfo *);
-void sub_802E138(struct PokemonJump1_82E4 *, u8 *);
-bool32 sub_802E1BC(struct PokemonJump1_82E4 *, struct Unk802B078 *);
-void sub_802E234(struct PokemonJump1_82E4 *, u8 , u16);
-bool32 sub_802E264(struct PokemonJump1_82E4 *, int, u8 *, u16 *);
-bool32 sub_802E2D0(struct PokemonJump1_82E4 *, int);
-int sub_802E354(int, u16, u16);
-void sub_802E3A8(void);
-
-extern struct PokemonJump1 *gUnknown_02022CFC;
-extern struct PokemonJump2 *gUnknown_02022D00;
-
-const struct PokemonJumpMons gPkmnJumpSpecies[] =
+static void sub_802DC9C(int id);
+static void sub_802D074(struct PokemonJump2 *);
+static void sub_802D0BC(struct PokemonJump2 *);
+static void sub_802D0AC(void);
+static void sub_802D0C8(int);
+static bool32 sub_802D0F0(void);
+static void sub_802D764(void);
+static bool32 sub_802D788(void);
+static void sub_802D7E8(u16 itemId, u16 quantity);
+static void sub_802D884(u16 itemId);
+static void sub_802D8FC(u16 itemId);
+static bool32 sub_802D974(void);
+static void sub_802DA14(void);
+static void sub_802DC80(u32 id, s16 y);
+static void sub_802DD88(u8 multiplayerId);
+static bool32 sub_802DA44(void);
+static void sub_802DD64(int);
+static s8 sub_802DA8C(void);
+static int sub_802DCCC(u8 flags);
+static void sub_802DD74(u16);
+static void sub_802DDA0(u8 multiplayerId);
+static int sub_802DDB8(int multiplayerId);
+static void sub_802DDCC(void);
+static void sub_802DDE0(void);
+static void sub_802DDF4(int);
+static int sub_802DE08(void);
+static void sub_802E0AC(struct PokemonJump1_MonInfo *arg0);
+static bool32 sub_802E0D0(int multiplayerId, struct PokemonJump1_MonInfo *arg0);
+static void sub_802E138(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1);
+static bool32 sub_802E1BC(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1);
+static void sub_802E234(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2);
+static bool32 sub_802E264(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3);
+static bool32 sub_802E2D0(struct PokemonJump1_82E4 *arg0, int multiplayerId);
+static bool32 sub_802E354(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow);
+static void sub_802E3A8(void);
+static void sub_802D12C(u8 taskId);
+static void sub_802E00C(u8 arg0);
+static void sub_802E090(u8 taskId);
+static void sub_802D150(void);
+static void sub_802DD08(void);
+static void sub_802DB8C(void);
+static void sub_802DBF8(void);
+static void sub_802DE1C(void);
+static void sub_802DFD4(void);
+static void sub_802D108(void (*func)(void));
+static void sub_802DF70(bool32 arg0);
+static u32 sub_802DA9C(u32 left, u32 top, u32 width, u32 height);
+static void sub_802DB18(u16 left, u16 top, u8 cursorPos);
+static void sub_802D150(void);
+static void sub_802D2E4(void);
+static void sub_802D350(void);
+static void sub_802D3BC(void);
+static void sub_802D448(void);
+static void sub_802D4F4(void);
+static void sub_802D598(void);
+static void sub_802D5E4(void);
+static void sub_802D72C(void);
+static void sub_802D688(void);
+static void sub_802E3E4(u8 taskId);
+static void sub_802E6D0(u8 taskId);
+static void sub_802EB98(u8 taskId);
+static void sub_802E500(u16 windowId, int width);
+static void TruncateToFirstWordOnly(u8 *str);
+static void sub_802EF50(u16 tileTag, u16 palTag);
+static u8 sub_802EFA8(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority);
+static void sub_802EFFC(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 *spriteId1, s16 *spriteId2);
+static bool32 sub_802EC98(u8 spriteId);
+static bool32 sub_802EE30(u8 spriteId);
+static void sub_802EDCC(u8 spriteId1, u8 spriteId2, u8 spriteId3);
+static void sub_802EE5C(struct Sprite *sprite);
+static void sub_802E83C(u8 taskId);
+static void sub_802E8C8(u8 taskId);
+static void sub_802EA50(u8 taskId);
+static void sub_802EAB0(u8 taskId);
+
+EWRAM_DATA static struct PokemonJump1 *gUnknown_02022CFC = NULL;
+EWRAM_DATA static struct PokemonJump2 *gUnknown_02022D00 = NULL;
+
+static const struct PokemonJumpMons gPkmnJumpSpecies[] =
{
{ .species = SPECIES_BULBASAUR, .unk2 = 2, },
{ .species = SPECIES_CHARMANDER, .unk2 = 1, },
@@ -357,47 +412,6 @@ const struct PokemonJumpMons gPkmnJumpSpecies[] =
{ .species = SPECIES_BAGON, .unk2 = 1, },
};
-bool32 (* const gUnknown_082FB5F4[])(void) =
-{
- sub_802B248,
- sub_802B2D4,
- sub_802B368,
- sub_802B3D4,
- sub_802B4CC,
- sub_802B5C8,
- sub_802B664,
- sub_802B6B8,
- sub_802B720,
-};
-
-bool32 (* const gUnknown_082FB618[])(void) =
-{
- sub_802B29C,
- sub_802B31C,
- sub_802B3B4,
- sub_802B470,
- sub_802B568,
- sub_802B628,
- sub_802B664,
- sub_802B704,
- sub_802B720,
-};
-
-extern const u16 gUnknown_082FB63C[];
-extern const u16 gUnknown_082FB64C[4];
-extern const u16 gUnknown_082FB654[];
-extern const s8 gUnknown_082FB65C[][48];
-extern const int gUnknown_082FB6EC[];
-extern const int gUnknown_082FB714[];
-extern const u16 gUnknown_082FB704[8];
-extern const struct CompressedSpriteSheet gUnknown_082FBE08[5];
-extern const struct SpritePalette gUnknown_082FBE30[2];
-extern const struct SpriteTemplate gUnknown_082FBE40;
-extern const struct SpriteTemplate gUnknown_082FC00C;
-extern const s16 gUnknown_082FBE58[];
-extern const s16 gUnknown_082FBEA8[8];
-extern const struct SpriteTemplate gUnknown_082FBEB8[4];
-
void sub_802A9A8(u16 partyIndex, MainCallback callback)
{
u8 taskId;
@@ -433,15 +447,15 @@ static void sub_802AA48(void)
static void sub_802AA60(struct PokemonJump1 *arg0)
{
arg0->unk5 = GetLinkPlayerCount();
- arg0->unk70 = 5;
- arg0->unk72 = 0;
+ arg0->unk70.unk0 = 5;
+ arg0->unk70.unk2 = 0;
sub_802AB20();
sub_802AA94(arg0);
if (arg0->unk5 == MAX_RFU_PLAYERS)
sub_802E3A8();
}
-void sub_802AA94(struct PokemonJump1 *arg0)
+static void sub_802AA94(struct PokemonJump1 *arg0)
{
int i;
@@ -462,9 +476,9 @@ void sub_802AA94(struct PokemonJump1 *arg0)
arg0->unk46 = 0;
arg0->unk49 = 0;
arg0->unk48 = 1;
- arg0->unk78 = 0;
- arg0->unk71 = 0;
- arg0->unk74 = 0;
+ arg0->unk70.unk8 = 0;
+ arg0->unk70.unk1 = 0;
+ arg0->unk70.unk4 = 0;
arg0->unk60 = 1;
arg0->unk4D = 0;
arg0->unk68 = 0;
@@ -481,7 +495,7 @@ void sub_802AA94(struct PokemonJump1 *arg0)
}
}
-void sub_802AB20(void)
+static void sub_802AB20(void)
{
int i, index;
@@ -629,7 +643,7 @@ static void sub_802AE50(u8 arg0)
{
int i;
- gUnknown_02022CFC->unk70 = arg0;
+ gUnknown_02022CFC->unk70.unk0 = arg0;
gUnknown_02022CFC->unk8 = 0;
gUnknown_02022CFC->unkA = 0;
gUnknown_02022CFC->unk48 = 1;
@@ -656,7 +670,7 @@ static void sub_802AEA4(void)
gUnknown_02022CFC->unk82E4[i].unk12 = var0;
}
- if (gUnknown_02022CFC->unk82E4[i].unk18 && gUnknown_02022CFC->unk8B[i] == gUnknown_02022CFC->unk70)
+ if (gUnknown_02022CFC->unk82E4[i].unk18 && gUnknown_02022CFC->unk8B[i] == gUnknown_02022CFC->unk70.unk0)
count++;
}
@@ -664,6 +678,19 @@ static void sub_802AEA4(void)
gUnknown_02022CFC->unk49 = 1;
}
+static bool32 (* const gUnknown_082FB5F4[])(void) =
+{
+ sub_802B248,
+ sub_802B2D4,
+ sub_802B368,
+ sub_802B3D4,
+ sub_802B4CC,
+ sub_802B5C8,
+ sub_802B664,
+ sub_802B6B8,
+ sub_802B720,
+};
+
static void sub_802AF80(u8 taskId)
{
sub_802AEA4();
@@ -676,7 +703,7 @@ static void sub_802AF80(u8 taskId)
if (gUnknown_02022CFC->unk48 == 1)
{
- if (!gUnknown_082FB5F4[gUnknown_02022CFC->unk70]())
+ if (!gUnknown_082FB5F4[gUnknown_02022CFC->unk70.unk0]())
{
gUnknown_02022CFC->unk48 = 0;
gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk18 = 1;
@@ -701,7 +728,7 @@ static void sub_802B008(void)
static void sub_802B044(u8 arg0)
{
- gUnknown_02022CFC->unk70 = arg0;
+ gUnknown_02022CFC->unk70.unk0 = arg0;
gUnknown_02022CFC->unk8 = 0;
gUnknown_02022CFC->unkA = 0;
gUnknown_02022CFC->unk48 = 1;
@@ -712,30 +739,30 @@ static void sub_802B078(void)
{
int i;
u16 var0;
- struct Unk802B078 sp0;
+ struct PokemonJump1Sub sp0;
var0 = gUnknown_02022CFC->unk82E4[0].unk10;
if (sub_802E1BC(gUnknown_02022CFC->unk82E4, &sp0))
{
if (gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk18 == 1
- && sp0.unk0 != gUnknown_02022CFC->unk70)
+ && sp0.unk0 != gUnknown_02022CFC->unk70.unk0)
{
sub_802B044(sp0.unk0);
}
- if (gUnknown_02022CFC->unk78 != sp0.unk8)
+ if (gUnknown_02022CFC->unk70.unk8 != sp0.unk8)
{
- gUnknown_02022CFC->unk78 = sp0.unk8;
+ gUnknown_02022CFC->unk70.unk8 = sp0.unk8;
gUnknown_02022CFC->unk5C = 1;
- gUnknown_02022CFC->unk71 = sp0.unk1;
- if (gUnknown_02022CFC->unk71)
+ gUnknown_02022CFC->unk70.unk1 = sp0.unk1;
+ if (gUnknown_02022CFC->unk70.unk1)
gUnknown_02022CFC->unk4D = 1;
else
gUnknown_02022CFC->unk4D = 0;
}
- gUnknown_02022CFC->unk72 = sp0.unk2;
- gUnknown_02022CFC->unk74 = sp0.unk4;
+ gUnknown_02022CFC->unk70.unk2 = sp0.unk2;
+ gUnknown_02022CFC->unk70.unk4 = sp0.unk4;
gUnknown_02022CFC->unk82E4[0].unk12 = var0;
}
@@ -750,12 +777,25 @@ static void sub_802B078(void)
}
}
+static bool32 (* const gUnknown_082FB618[])(void) =
+{
+ sub_802B29C,
+ sub_802B31C,
+ sub_802B3B4,
+ sub_802B470,
+ sub_802B568,
+ sub_802B628,
+ sub_802B664,
+ sub_802B704,
+ sub_802B720,
+};
+
static void sub_802B194(u8 taskId)
{
sub_802B078();
if (gUnknown_02022CFC->unk48)
{
- if (!gUnknown_082FB618[gUnknown_02022CFC->unk70]())
+ if (!gUnknown_082FB618[gUnknown_02022CFC->unk70.unk0]())
{
gUnknown_02022CFC->unk48 = 0;
gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk18 = 1;
@@ -770,7 +810,7 @@ static void sub_802B194(u8 taskId)
static void sub_802B1FC(void)
{
if (!gUnknown_02022CFC->unk2C)
- sub_802E234(&gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6], gUnknown_02022CFC->unk70, gUnknown_02022CFC->unk42);
+ sub_802E234(&gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6], gUnknown_02022CFC->unk70.unk0, gUnknown_02022CFC->unk42);
if (gUnknown_02022CFC->unk30 != 0x1111)
{
@@ -790,7 +830,7 @@ static bool32 sub_802B248(void)
case 1:
if (!sub_802B7E0())
{
- gUnknown_02022CFC->unk72 = gUnknown_02022CFC->unk4A;
+ gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unk4A;
gUnknown_02022CFC->unk4C = 1;
return FALSE;
}
@@ -806,7 +846,7 @@ static bool32 sub_802B29C(void)
{
case 0:
sub_802AE14(0);
- gUnknown_02022CFC->unk24 = gUnknown_02022CFC->unk72;
+ gUnknown_02022CFC->unk24 = gUnknown_02022CFC->unk70.unk2;
gUnknown_02022CFC->unk8++;
// fall through
case 1:
@@ -844,7 +884,7 @@ static bool32 sub_802B31C(void)
case 0:
sub_802C0E8();
sub_802AE14(0);
- gUnknown_02022CFC->unk4A = gUnknown_02022CFC->unk72;
+ gUnknown_02022CFC->unk4A = gUnknown_02022CFC->unk70.unk2;
gUnknown_02022CFC->unk8++;
// fall through
case 1:
@@ -860,7 +900,7 @@ static bool32 sub_802B368(void)
{
if (!sub_802B8CC())
{
- gUnknown_02022CFC->unk72 = gUnknown_02022CFC->unk4A;
+ gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unk4A;
gUnknown_02022CFC->unk4C = 1;
}
else if (sub_802C538())
@@ -902,17 +942,17 @@ static bool32 sub_802B3D4(void)
{
if (sub_802C7BC())
{
- gUnknown_02022CFC->unk72 = sub_802C7E0();
+ gUnknown_02022CFC->unk70.unk2 = sub_802C7E0();
gUnknown_02022CFC->unk4C = 7;
}
- else if (gUnknown_02022CFC->unk74 >= 200)
+ else if (gUnknown_02022CFC->unk70.unk4 >= 200)
{
- gUnknown_02022CFC->unk72 = gUnknown_02022CFC->unkE;
+ gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unkE;
gUnknown_02022CFC->unk4C = 8;
}
else
{
- gUnknown_02022CFC->unk72 = gUnknown_02022CFC->unkE;
+ gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unkE;
gUnknown_02022CFC->unk4C = 4;
}
@@ -962,7 +1002,7 @@ static bool32 sub_802B4CC(void)
case 1:
if (!sub_802BB84())
{
- sub_802E354(gUnknown_02022CFC->unk78, gUnknown_02022CFC->unk74, gUnknown_02022CFC->unk72);
+ sub_802E354(gUnknown_02022CFC->unk70.unk8, gUnknown_02022CFC->unk70.unk4, gUnknown_02022CFC->unk70.unk2);
gUnknown_02022CFC->unk8++;
}
break;
@@ -996,7 +1036,7 @@ static bool32 sub_802B568(void)
case 1:
if (!sub_802BB84())
{
- sub_802E354(gUnknown_02022CFC->unk78, gUnknown_02022CFC->unk74, gUnknown_02022CFC->unk72);
+ sub_802E354(gUnknown_02022CFC->unk70.unk8, gUnknown_02022CFC->unk70.unk4, gUnknown_02022CFC->unk70.unk2);
gUnknown_02022CFC->unk42 = gUnknown_02022CFC->unk45;
return FALSE;
}
@@ -1019,7 +1059,7 @@ static bool32 sub_802B5C8(void)
{
sub_802AA94(gUnknown_02022CFC);
gUnknown_02022CFC->unk24 = Random();
- gUnknown_02022CFC->unk72 = gUnknown_02022CFC->unk24;
+ gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unk24;
gUnknown_02022CFC->unk4C = 0;
return FALSE;
}
@@ -1082,7 +1122,7 @@ static bool32 sub_802B6B8(void)
case 1:
if (!sub_802BA58())
{
- gUnknown_02022CFC->unk72 = gUnknown_02022CFC->unkE;
+ gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unkE;
gUnknown_02022CFC->unk4C = 8;
return FALSE;
}
@@ -1106,7 +1146,7 @@ static bool32 sub_802B720(void)
switch (gUnknown_02022CFC->unk8)
{
case 0:
- sub_802E354(gUnknown_02022CFC->unk78, gUnknown_02022CFC->unk74, gUnknown_02022CFC->unk72);
+ sub_802E354(gUnknown_02022CFC->unk70.unk8, gUnknown_02022CFC->unk70.unk4, gUnknown_02022CFC->unk70.unk2);
sub_802D0C8(5);
gUnknown_02022CFC->unk8++;
break;
@@ -1145,8 +1185,6 @@ static bool32 sub_802B720(void)
static bool32 sub_802B7E0(void)
{
- int var0;
-
switch (gUnknown_02022CFC->unkA)
{
case 0:
@@ -1155,8 +1193,7 @@ static bool32 sub_802B7E0(void)
gUnknown_02022CFC->unkA++;
break;
case 1:
- var0 = sub_802D0F0();
- if (!var0)
+ if (!sub_802D0F0())
{
sub_802DDF4(gUnknown_02022CFC->unk6);
gUnknown_02022CFC->unk3C = 0;
@@ -1278,7 +1315,7 @@ static bool32 sub_802B964(void)
if (!sub_802D0F0())
{
sub_802DDCC();
- gUnknown_02022CFC->unk71 = 0;
+ gUnknown_02022CFC->unk70.unk1 = 0;
sub_802C114();
gUnknown_02022CFC->unkA++;
return FALSE;
@@ -1296,7 +1333,7 @@ static bool32 sub_802BA58(void)
switch (gUnknown_02022CFC->unkA)
{
case 0:
- sub_802C808(gUnknown_02022CFC->unk72, &gUnknown_02022CFC->unk3E, &gUnknown_02022CFC->unk40);
+ sub_802C808(gUnknown_02022CFC->unk70.unk2, &gUnknown_02022CFC->unk3E, &gUnknown_02022CFC->unk40);
sub_802D7E8(gUnknown_02022CFC->unk3E, gUnknown_02022CFC->unk40);
gUnknown_02022CFC->unkA++;
break;
@@ -1576,6 +1613,9 @@ static int sub_802BF48(void)
return result;
}
+static const u16 gUnknown_082FB63C[] = {0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, 0x38, 0x3d};
+static const u16 gUnknown_082FB64C[] = {0, 1, 1, 2};
+
static void sub_802BF7C(void)
{
int var0;
@@ -1694,21 +1734,23 @@ static void sub_802C1BC(void)
gUnknown_02022CFC->unk83AC->unk10 = 0;
}
+static const u16 gUnknown_082FB654[] = {SE_REGI, SE_REAPOKE, SE_W234, SE_RG_EXCELLENT};
+
static void sub_802C1DC(void)
{
if (gUnknown_02022CFC->unk5C)
{
- sub_802DD64(gUnknown_02022CFC->unk78);
+ sub_802DD64(gUnknown_02022CFC->unk70.unk8);
gUnknown_02022CFC->unk5C = 0;
if (gUnknown_02022CFC->unk4D)
{
- int index = sub_802DCCC(gUnknown_02022CFC->unk71);
+ int index = sub_802DCCC(gUnknown_02022CFC->unk70.unk1);
PlaySE(gUnknown_082FB654[index - 2]);
gUnknown_02022CFC->unk4D = 0;
}
}
- sub_802DD74(gUnknown_02022CFC->unk74);
+ sub_802DD74(gUnknown_02022CFC->unk70.unk4);
sub_802C280();
sub_802C240();
}
@@ -1774,6 +1816,19 @@ static void sub_802C280(void)
PlaySE(SE_DANSA);
}
+static const s8 gUnknown_082FB65C[][48] =
+{
+ {-3, -6, -8, -10, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -28, -27,
+ -26, -25, -23, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -1},
+
+ {-3, -6, -9, -11, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -30, -28, -26, -24, -22,
+ -20, -18, -16, -14, -11, -9, -6, -4, -1},
+
+ {-3, -6, -9, -11, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -30, -29,
+ -29, -28, -28, -27, -27, -26, -25, -24, -22, -20, -18, -16, -14,
+ -12, -11, -9, -6, -4, -1},
+};
+
static void sub_802C398(int multiplayerId)
{
int var0;
@@ -1813,7 +1868,7 @@ static void sub_802C398(int multiplayerId)
sub_802DC80(multiplayerId, var1);
if (!var1 && multiplayerId == gUnknown_02022CFC->unk6)
sub_802C1BC();
-
+
player->unk0 = var1;
}
@@ -1826,7 +1881,7 @@ static void sub_802C43C(void)
sub_802C780();
gUnknown_02022CFC->unk54 = 0;
gUnknown_02022CFC->unk58 = 1;
- gUnknown_02022CFC->unk71 = 0;
+ gUnknown_02022CFC->unk70.unk1 = 0;
}
else
{
@@ -1849,9 +1904,9 @@ static void sub_802C43C(void)
sub_802C780();
gUnknown_02022CFC->unk54 = 0;
gUnknown_02022CFC->unk58 = 1;
- gUnknown_02022CFC->unk71 = 0;
- if (gUnknown_02022CFC->unk74 < 9999)
- gUnknown_02022CFC->unk74++;
+ gUnknown_02022CFC->unk70.unk1 = 0;
+ if (gUnknown_02022CFC->unk70.unk4 < 9999)
+ gUnknown_02022CFC->unk70.unk4++;
sub_802C688(10);
sub_802AE14(3);
@@ -1955,10 +2010,10 @@ static bool32 sub_802C650(void)
static void sub_802C688(int arg0)
{
- gUnknown_02022CFC->unk78 += arg0;
+ gUnknown_02022CFC->unk70.unk8 += arg0;
gUnknown_02022CFC->unk5C = 1;
- if (gUnknown_02022CFC->unk78 >= 99990)
- gUnknown_02022CFC->unk78 = 99990;
+ if (gUnknown_02022CFC->unk70.unk8 >= 99990)
+ gUnknown_02022CFC->unk70.unk8 = 99990;
}
static int sub_802C6B0(void)
@@ -2003,7 +2058,7 @@ static int sub_802C73C(u8 *arg0)
}
}
- gUnknown_02022CFC->unk71 = flags;
+ gUnknown_02022CFC->unk70.unk1 = flags;
if (flags)
gUnknown_02022CFC->unk4D = 1;
@@ -2015,6 +2070,8 @@ static void sub_802C780(void)
gUnknown_02022CFC->unk44 = 0;
}
+static const int gUnknown_082FB6EC[] = {0, 0, 0x32, 0x64, 0xc8, 0x1f4};
+
static int sub_802C790(int arg0)
{
return gUnknown_082FB6EC[arg0];
@@ -2026,9 +2083,19 @@ static void sub_802C7A0(u16 arg0)
gUnknown_02022CFC->unkE = arg0;
}
+static const u16 gUnknown_082FB704[] = {0x8a, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93};
+static const u32 gUnknown_082FB714[][2] =
+{
+ {0x1388, 1},
+ {0x1f40, 2},
+ {0x2ee0, 3},
+ {0x3e80, 4},
+ {0x4e20, 5},
+};
+
static bool32 sub_802C7BC(void)
{
- if (gUnknown_02022CFC->unk78 >= gUnknown_082FB714[0])
+ if (gUnknown_02022CFC->unk70.unk8 >= gUnknown_082FB714[0][0])
return TRUE;
else
return FALSE;
@@ -2053,6 +2120,22 @@ static u16 sub_802C818(void)
return gUnknown_082FB704[index];
}
+#ifdef NONMATCHING
+// Impossible to match.
+static u16 sub_802C838(void)
+{
+ u32 val, i;
+
+ val = 0;
+ for (i = 0; i < 5; val = gUnknown_082FB714[i][1], i++)
+ {
+ if (gUnknown_02022CFC->unk70.unk8 < gUnknown_082FB714[i][0])
+ break;
+ }
+
+ return val;
+}
+#else
NAKED
static u16 sub_802C838(void)
{
@@ -2091,31 +2174,32 @@ _0802C874:\n\
pop {r1}\n\
bx r1");
}
+#endif
static u16 sub_802C880(u16 item, u16 quantity)
{
while (quantity && !CheckBagHasSpace(item, quantity))
quantity--;
-
+
return quantity;
}
-u16 sub_802C8AC(void)
+static u16 sub_802C8AC(void)
{
return GetLinkPlayerCount();
}
-u16 sub_802C8BC(void)
+static u16 sub_802C8BC(void)
{
return gUnknown_02022CFC->unk6;
}
-struct PokemonJump1_MonInfo *sub_802C8C8(u8 multiplayerId)
+static struct PokemonJump1_MonInfo *sub_802C8C8(u8 multiplayerId)
{
return &gUnknown_02022CFC->unk82A8[multiplayerId];
}
-u8 *sub_802C8E8(u8 multiplayerId)
+static u8 *sub_802C8E8(u8 multiplayerId)
{
return gUnknown_02022CFC->unk82E4[multiplayerId].unk1C;
}
@@ -2145,13 +2229,331 @@ void sub_802C920(void)
gSpecialVar_Result = 0;
}
-void sub_802C974(struct PokemonJump2 *arg0)
+// Large group of data.
+static const u16 gPkmnJumpPal1[] = INCBIN_U16("graphics/link_games/pkmnjump_pal1.gbapal");
+static const u16 gPkmnJumpPal2[] = INCBIN_U16("graphics/link_games/pkmnjump_pal2.gbapal");
+
+static const u32 gPkmnJumpRopeGfx1[] = INCBIN_U32("graphics/link_games/pkmnjump_rope1.4bpp.lz");
+static const u32 gPkmnJumpRopeGfx2[] = INCBIN_U32("graphics/link_games/pkmnjump_rope2.4bpp.lz");
+static const u32 gPkmnJumpRopeGfx3[] = INCBIN_U32("graphics/link_games/pkmnjump_rope3.4bpp.lz");
+static const u32 gPkmnJumpRopeGfx4[] = INCBIN_U32("graphics/link_games/pkmnjump_rope4.4bpp.lz");
+
+static const u32 gPkmnJumpStarGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_star.4bpp.lz");
+
+static const struct CompressedSpriteSheet gUnknown_082FBE08[] =
+{
+ {gPkmnJumpRopeGfx1, 0x600, 5},
+ {gPkmnJumpRopeGfx2, 0x0c00, 6},
+ {gPkmnJumpRopeGfx3, 0x0600, 7},
+ {gPkmnJumpRopeGfx4, 0x0600, 8},
+ {gPkmnJumpStarGfx, 0x0200, 10},
+};
+
+static const struct SpritePalette gUnknown_082FBE30[] =
+{
+ {gPkmnJumpPal1, 5},
+ {gPkmnJumpPal2, 6},
+};
+
+// Forward declarations.
+static const struct OamData sOamData_82FBEC8;
+static const struct SpriteTemplate gUnknown_082FBF78;
+static const struct SpriteTemplate gUnknown_082FBF90;
+static const struct SpriteTemplate gUnknown_082FBFA8;
+static const struct SpriteTemplate gUnknown_082FBFC0;
+
+static const struct SpriteTemplate gUnknown_082FBE40 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_82FBEC8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const s16 gUnknown_082FBE58[][10] =
+{
+ {0x60, 0x60, 0x60, 0x72, 0x78, 0x78, 0x78, 0x72, 0x60, 0x60},
+ {0x46, 0x50, 0x60, 0x72, 0x78, 0x80, 0x78, 0x72, 0x60, 0x50},
+ {0x32, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48},
+ {0x2a, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48},
+};
+
+static const s16 gUnknown_082FBEA8[] = {0x10, 0x28, 0x48, 0x68, 0x88, 0xa8, 0xc8, 0xe0};
+
+static const struct SpriteTemplate *const gUnknown_082FBEB8[] =
+{
+ &gUnknown_082FBF78,
+ &gUnknown_082FBF90,
+ &gUnknown_082FBFA8,
+ &gUnknown_082FBFC0,
+};
+
+static const struct OamData sOamData_82FBEC8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_82FBED0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_82FBED8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_82FBEE0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_82FBEE8[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBEF0[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBEF8[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF00[] =
+{
+ ANIMCMD_FRAME(24, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF08[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF10[] =
+{
+ ANIMCMD_FRAME(40, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF18[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF20[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF28[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF30[] =
+{
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF38[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBF40[] =
+{
+ ANIMCMD_FRAME(80, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FBF48[] =
+{
+ sSpriteAnim_82FBEE8,
+ sSpriteAnim_82FBEF0,
+ sSpriteAnim_82FBEF8,
+ sSpriteAnim_82FBF00,
+ sSpriteAnim_82FBF08,
+ sSpriteAnim_82FBF10
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FBF60[] =
+{
+ sSpriteAnim_82FBF18,
+ sSpriteAnim_82FBF20,
+ sSpriteAnim_82FBF28,
+ sSpriteAnim_82FBF30,
+ sSpriteAnim_82FBF38,
+ sSpriteAnim_82FBF40
+};
+
+static const struct SpriteTemplate gUnknown_082FBF78 =
+{
+ .tileTag = 5,
+ .paletteTag = 5,
+ .oam = &sOamData_82FBED0,
+ .anims = sSpriteAnimTable_82FBF48,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate gUnknown_082FBF90 =
+{
+ .tileTag = 6,
+ .paletteTag = 5,
+ .oam = &sOamData_82FBED8,
+ .anims = sSpriteAnimTable_82FBF60,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate gUnknown_082FBFA8 =
+{
+ .tileTag = 7,
+ .paletteTag = 5,
+ .oam = &sOamData_82FBEE0,
+ .anims = sSpriteAnimTable_82FBF48,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate gUnknown_082FBFC0 =
+{
+ .tileTag = 8,
+ .paletteTag = 5,
+ .oam = &sOamData_82FBEE0,
+ .anims = sSpriteAnimTable_82FBF48,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_82FBFD8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_82FBFE0[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FBFE8[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(12, 4),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FC004[] =
+{
+ sSpriteAnim_82FBFE0,
+ sSpriteAnim_82FBFE8
+};
+
+static const struct SpriteTemplate gUnknown_082FC00C =
+{
+ .tileTag = 10,
+ .paletteTag = 5,
+ .oam = &sOamData_82FBFD8,
+ .anims = sSpriteAnimTable_82FC004,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+// Back to code
+static void sub_802C974(struct PokemonJump2 *arg0)
{
int i;
for (i = 0; i < ARRAY_COUNT(gUnknown_082FBE08); i++)
LoadCompressedSpriteSheet(&gUnknown_082FBE08[i]);
-
+
for (i = 0; i < ARRAY_COUNT(gUnknown_082FBE30); i++)
LoadSpritePalette(&gUnknown_082FBE30[i]);
@@ -2166,7 +2568,7 @@ static void sub_802C9BC(struct Sprite *sprite)
sprite->data[i] = 0;
}
-void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon, u16 x, u16 y, u8 multiplayerId)
+static void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon, s16 x, s16 y, u8 multiplayerId)
{
struct SpriteTemplate spriteTemplate;
struct SpriteSheet spriteSheet;
@@ -2197,7 +2599,7 @@ void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon
spriteSheet.size = 0x800;
LoadSpriteSheet(&spriteSheet);
- spritePalette.data = GetFrontSpritePalFromSpeciesAndPersonality(jumpMon->species, jumpMon->otId, jumpMon->personality);
+ spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(jumpMon->species, jumpMon->otId, jumpMon->personality);
spritePalette.tag = multiplayerId;
LoadCompressedSpritePalette(&spritePalette);
@@ -2218,7 +2620,7 @@ void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon
arg0->unk81A8[multiplayerId] = NULL;
}
-void sub_802CB14(struct PokemonJump2 *arg0, int multiplayerId)
+static void sub_802CB14(struct PokemonJump2 *arg0, int multiplayerId)
{
sub_802C9BC(arg0->unk81BC[multiplayerId]);
arg0->unk81BC[multiplayerId]->data[7] = arg0->unk81A8[multiplayerId] - gSprites;
@@ -2258,14 +2660,14 @@ static void sub_802CB7C(struct Sprite *sprite)
}
}
-void sub_802CBF0(struct PokemonJump2 *arg0, int multiplayerId)
+static void sub_802CBF0(struct PokemonJump2 *arg0, int multiplayerId)
{
arg0->unk81A8[multiplayerId]->callback = sub_802CC40;
arg0->unk81A8[multiplayerId]->pos2.y = 0;
sub_802C9BC(arg0->unk81A8[multiplayerId]);
}
-bool32 sub_802CC18(struct PokemonJump2 *arg0, int multiplayerId)
+static bool32 sub_802CC18(struct PokemonJump2 *arg0, int multiplayerId)
{
return arg0->unk81A8[multiplayerId]->callback == sub_802CC40;
}
@@ -2289,13 +2691,13 @@ static void sub_802CC40(struct Sprite *sprite)
}
}
-void sub_802CC88(struct PokemonJump2 *arg0, int multiplayerId)
+static void sub_802CC88(struct PokemonJump2 *arg0, int multiplayerId)
{
sub_802C9BC(arg0->unk81A8[multiplayerId]);
arg0->unk81A8[multiplayerId]->callback = sub_802CD08;
}
-void sub_802CCB0(struct PokemonJump2 *arg0)
+static void sub_802CCB0(struct PokemonJump2 *arg0)
{
int i;
u16 numPlayers = sub_802C8AC();
@@ -2319,7 +2721,7 @@ static void sub_802CD08(struct Sprite *sprite)
}
}
-void sub_802CD3C(struct PokemonJump2 *arg0)
+static void sub_802CD3C(struct PokemonJump2 *arg0)
{
int i;
u16 numPlayers = sub_802C8AC();
@@ -2327,13 +2729,13 @@ void sub_802CD3C(struct PokemonJump2 *arg0)
arg0->unk81A8[i]->subpriority = arg0->unk81FC[i];
}
-void sub_802CD70(struct PokemonJump2 *arg0, int multiplayerId)
+static void sub_802CD70(struct PokemonJump2 *arg0, int multiplayerId)
{
sub_802C9BC(arg0->unk81A8[multiplayerId]);
arg0->unk81A8[multiplayerId]->callback = sub_802CDD4;
}
-bool32 sub_802CD98(struct PokemonJump2 *arg0)
+static bool32 sub_802CD98(struct PokemonJump2 *arg0)
{
int i;
u16 numPlayers = sub_802C8AC();
@@ -2372,7 +2774,7 @@ static void sub_802CDD4(struct Sprite *sprite)
}
}
-void sub_802CE48(struct PokemonJump2 *arg0, s16 x, s16 y, u8 multiplayerId)
+static void sub_802CE48(struct PokemonJump2 *arg0, s16 x, s16 y, u8 multiplayerId)
{
u8 spriteId = CreateSprite(&gUnknown_082FC00C, x, y, 1);
if (spriteId != MAX_SPRITES)
@@ -2382,25 +2784,1853 @@ void sub_802CE48(struct PokemonJump2 *arg0, s16 x, s16 y, u8 multiplayerId)
}
}
-// void sub_802CE9C(struct PokemonJump2 *arg0)
-// {
-// int i;
-// int count;
-// u8 spriteId;
-
-// count = 0;
-// for (i = 0; i < 4; i++)
-// {
-// spriteId = CreateSprite(&gUnknown_082FBEB8[i], gUnknown_082FBEA8[count], gUnknown_082FBE58[i * 10], 2);
-// arg0->unk81D0[count] = &gSprites[spriteId];
-// count++;
-// }
-
-// for (i = 0; i < 4; i++)
-// {
-// spriteId = CreateSprite(&gUnknown_082FBEB8[i], gUnknown_082FBEA8[count], gUnknown_082FBE58[i * 10], 2);
-// arg0->unk81D0[count] = &gSprites[spriteId];
-// arg0->unk81D0[count]->hFlip = 1;
-// count++;
-// }
-// }
+static void sub_802CE9C(struct PokemonJump2 *arg0)
+{
+ int i;
+ int count;
+ u8 spriteId;
+
+ count = 0;
+ for (i = 0; i < 4; i++)
+ {
+ spriteId = CreateSprite(gUnknown_082FBEB8[i], gUnknown_082FBEA8[count], gUnknown_082FBE58[i][0], 2);
+ arg0->unk81D0[count] = &gSprites[spriteId];
+ count++;
+ }
+
+ for (i = 3; i >= 0; i--)
+ {
+ spriteId = CreateSprite(gUnknown_082FBEB8[i], gUnknown_082FBEA8[count], gUnknown_082FBE58[i][0], 2);
+ arg0->unk81D0[count] = &gSprites[spriteId];
+ arg0->unk81D0[count]->hFlip = 1;
+ count++;
+ }
+}
+
+static void sub_802CF50(struct PokemonJump2 *arg0, int arg1)
+{
+ int i, count, palNum;
+ int priority;
+
+ if (arg1 > 5)
+ {
+ arg1 = 10 - arg1;
+ priority = 3;
+ palNum = arg0->unkF;
+ }
+ else
+ {
+ priority = 2;
+ palNum = arg0->unkE;
+ }
+
+ count = 0;
+ for (i = 0; i < 4; i++)
+ {
+ arg0->unk81D0[count]->pos1.y = gUnknown_082FBE58[i][arg1];
+ arg0->unk81D0[count]->oam.priority = priority;
+ arg0->unk81D0[count]->oam.paletteNum = palNum;
+ StartSpriteAnim(arg0->unk81D0[count], arg1);
+ count++;
+ }
+
+ for (i = 3; i >= 0; i--)
+ {
+ arg0->unk81D0[count]->pos1.y = gUnknown_082FBE58[i][arg1];
+ arg0->unk81D0[count]->oam.priority = priority;
+ arg0->unk81D0[count]->oam.paletteNum = palNum;
+ StartSpriteAnim(arg0->unk81D0[count], arg1);
+ count++;
+ }
+}
+
+static void sub_802D044(struct PokemonJump2 *arg0)
+{
+ sub_802EB24(9, 7, 120, 80, 0);
+ sub_802CD3C(arg0);
+}
+
+static bool32 sub_802D068(void)
+{
+ return sub_802EB84();
+}
+
+static void sub_802D074(struct PokemonJump2 *arg0)
+{
+ u8 taskId;
+
+ gUnknown_02022D00 = arg0;
+ sub_802D0BC(gUnknown_02022D00);
+ taskId = CreateTask(sub_802D12C, 3);
+ gUnknown_02022D00->unk6 = taskId;
+ SetWordTaskArg(gUnknown_02022D00->unk6, 2, (u32) gUnknown_02022D00);
+ sub_802D108(sub_802D150);
+}
+
+static void sub_802D0AC(void)
+{
+ FreeAllWindowBuffers();
+ sub_8034CC8();
+}
+
+static void sub_802D0BC(struct PokemonJump2 *arg0)
+{
+ arg0->unk4 = 0;
+ arg0->unk0 = 0;
+ arg0->unk12 = 0xFF;
+}
+
+// Gfx
+static const u16 gPkmnJumpPal3[] = INCBIN_U16("graphics/link_games/pkmnjump_pal3.gbapal");
+
+static const u16 gPkmnJumpBgPal[] = INCBIN_U16("graphics/link_games/pkmnjump_bg.gbapal");
+static const u32 gPkmnJumpBgGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.4bpp.lz");
+static const u32 gPkmnJumpBgTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.bin.lz");
+
+static const u16 gPkmnJumpVenusaurPal[] = INCBIN_U16("graphics/link_games/pkmnjump_venusaur.gbapal");
+static const u32 gPkmnJumpVenusaurGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.4bpp.lz");
+static const u32 gPkmnJumpVenusaurTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.bin.lz");
+
+static const u16 gPkmnJumpResultsPal[] = INCBIN_U16("graphics/link_games/pkmnjump_results.gbapal");
+static const u32 gPkmnJumpResultsGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_results.4bpp.lz");
+static const u32 gPkmnJumpResultsTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_results.bin.lz");
+
+static const struct BgTemplate gUnknown_082FE164[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 27,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 2,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 12,
+ .screenSize = 3,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+};
+
+static const struct WindowTemplate gUnknown_082FE174[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 19,
+ .tilemapTop = 0,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 2,
+ .baseBlock = 0x13,
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 8,
+ .tilemapTop = 0,
+ .width = 6,
+ .height = 2,
+ .paletteNum = 2,
+ .baseBlock = 0x1F,
+ },
+ DUMMY_WIN_TEMPLATE,
+};
+
+struct
+{
+ int id;
+ void (*func)(void);
+} static const gUnknown_082FE18C[] =
+{
+ {0x00, sub_802D150},
+ {0x01, sub_802D2E4},
+ {0x02, sub_802D350},
+ {0x03, sub_802D3BC},
+ {0x04, sub_802D448},
+ {0x05, sub_802D4F4},
+ {0x06, sub_802D598},
+ {0x07, sub_802D5E4},
+ {0x09, sub_802D72C},
+ {0x08, sub_802D688},
+};
+
+static void sub_802D0C8(int arg0)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_COUNT(gUnknown_082FE18C); i++)
+ {
+ if (gUnknown_082FE18C[i].id == arg0)
+ sub_802D108(gUnknown_082FE18C[i].func);
+ }
+}
+
+static bool32 sub_802D0F0(void)
+{
+ return (gUnknown_02022D00->unk0 != 1);
+}
+
+static void sub_802D108(void (*func)(void))
+{
+ SetWordTaskArg(gUnknown_02022D00->unk6, 0, (u32) func);
+ gUnknown_02022D00->unk4 = 0;
+ gUnknown_02022D00->unk0 = 0;
+}
+
+static void sub_802D12C(u8 taskId)
+{
+ if (!gUnknown_02022D00->unk0)
+ {
+ void (*func)(void) = (void *)(GetWordTaskArg(taskId, 0));
+
+ func();
+ }
+}
+
+static void sub_802D150(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_082FE164, ARRAY_COUNT(gUnknown_082FE164));
+ InitWindows(gUnknown_082FE174);
+ reset_temp_tile_data_buffers();
+ sub_802C974(gUnknown_02022D00);
+ sub_802DD08();
+ LoadPalette(gPkmnJumpBgPal, 0, 0x20);
+ decompress_and_copy_tile_data_to_vram(3, gPkmnJumpBgGfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(3, gPkmnJumpBgTilemap, 0, 0, 1);
+ LoadPalette(gPkmnJumpVenusaurPal, 0x30, 0x20);
+ decompress_and_copy_tile_data_to_vram(2, gPkmnJumpVenusaurGfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(2, gPkmnJumpVenusaurTilemap, 0, 0, 1);
+ LoadPalette(gPkmnJumpResultsPal, 0x10, 0x20);
+ decompress_and_copy_tile_data_to_vram(1, gPkmnJumpResultsGfx, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(1, gPkmnJumpResultsTilemap, 0, 0, 1);
+ LoadPalette(gPkmnJumpPal3, 0x20, 0x20);
+ SetBgTilemapBuffer(0, gUnknown_02022D00->tilemapBuffer);
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
+ sub_802DB8C();
+ sub_802DD64(0);
+ sub_8098C6C(0, 1, 0xE0);
+ CopyBgTilemapBufferToVram(0);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(1);
+ ResetBgPositions();
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!free_temp_tile_data_buffers_if_possible())
+ {
+ sub_802DBF8();
+ sub_802CE9C(gUnknown_02022D00);
+ sub_802CF50(gUnknown_02022D00, 6);
+ ShowBg(3);
+ ShowBg(0);
+ ShowBg(2);
+ HideBg(1);
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 2:
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D2E4(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ sub_802DE1C();
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_802DF70(FALSE);
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_802DFD4();
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D350(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ sub_802DE1C();
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_802DF70(TRUE);
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_802DFD4();
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D3BC(void)
+{
+ int i, numPlayers;
+
+ numPlayers = sub_802C8AC();
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ for (i = 0; i < numPlayers; i++)
+ ClearWindowTilemap(gUnknown_02022D00->unk1C[i]);
+
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ for (i = 0; i < numPlayers; i++)
+ RemoveWindow(gUnknown_02022D00->unk1C[i]);
+
+ gUnknown_02022D00->unk0 = 1;
+ }
+ break;
+ }
+}
+
+static void sub_802D448(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ gUnknown_02022D00->unk12 = sub_802DA9C(1, 8, 20, 2);
+ AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_WantToPlayAgain2, 0, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 2);
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022D00->unk12);
+ DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14);
+ sub_802DB18(23, 7, 0);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D4F4(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ gUnknown_02022D00->unk12 = sub_802DA9C(2, 7, 26, 4);
+ AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_SavingDontTurnOffPower, 0, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 2);
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022D00->unk12);
+ DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D598(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ sub_802DA14();
+ sub_8198C78();
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!sub_802DA44() && !IsDma3ManagerBusyWithBgCopy())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D5E4(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ gUnknown_02022D00->unk12 = sub_802DA9C(2, 8, 22, 4);
+ AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_SomeoneDroppedOut2, 0, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 2);
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022D00->unk12);
+ DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D688(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ gUnknown_02022D00->unk12 = sub_802DA9C(7, 10, 16, 2);
+ AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_CommunicationStandby4, 0, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 2);
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022D00->unk12);
+ DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022D00->unk4++;
+ }
+ break;
+ case 2:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D72C(void)
+{
+ switch (gUnknown_02022D00->unk4)
+ {
+ case 0:
+ sub_802D044(gUnknown_02022D00);
+ gUnknown_02022D00->unk4++;
+ break;
+ case 1:
+ if (!sub_802D068())
+ gUnknown_02022D00->unk0 = 1;
+ break;
+ }
+}
+
+static void sub_802D764(void)
+{
+ gUnknown_02022D00->unkA = 0;
+ gUnknown_02022D00->unkB = 0;
+ gUnknown_02022D00->unkC = 6;
+ sub_802DC9C(gUnknown_02022D00->unkC);
+}
+
+static bool32 sub_802D788(void)
+{
+ switch (gUnknown_02022D00->unkA)
+ {
+ case 0:
+ gUnknown_02022D00->unkB++;
+ if (gUnknown_02022D00->unkB > 10)
+ {
+ gUnknown_02022D00->unkB = 0;
+ gUnknown_02022D00->unkC++;
+ if (gUnknown_02022D00->unkC >= 10)
+ {
+ gUnknown_02022D00->unkC = 0;
+ gUnknown_02022D00->unkA++;
+ }
+ }
+ sub_802DC9C(gUnknown_02022D00->unkC);
+ if (gUnknown_02022D00->unkC != 7)
+ break;
+ case 1:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_802D7E8(u16 itemId, u16 quantity)
+{
+ CopyItemNameHandlePlural(itemId, gUnknown_02022D00->txtBuff[0], quantity);
+ ConvertIntToDecimalStringN(gUnknown_02022D00->txtBuff[1], quantity, STR_CONV_MODE_LEFT_ALIGN, 1);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_02022D00->txtBuff[0]);
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_02022D00->txtBuff[1]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_02022D00->strBuff, gText_AwesomeWonF701F700);
+ gUnknown_02022D00->unk12 = sub_802DA9C(4, 8, 22, 4);
+ AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gUnknown_02022D00->strBuff, 0, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 2);
+ gUnknown_02022D00->unk14 = MUS_FANFA1;
+ gUnknown_02022D00->unkD = 0;
+}
+
+static void sub_802D884(u16 itemId)
+{
+ CopyItemName(itemId, gUnknown_02022D00->txtBuff[0]);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_02022D00->txtBuff[0]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_02022D00->strBuff, gText_FilledStorageSpace2);
+ gUnknown_02022D00->unk12 = sub_802DA9C(4, 8, 22, 4);
+ AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gUnknown_02022D00->strBuff, 0, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 2);
+ gUnknown_02022D00->unk14 = 0;
+ gUnknown_02022D00->unkD = 0;
+}
+
+static void sub_802D8FC(u16 itemId)
+{
+ CopyItemName(itemId, gUnknown_02022D00->txtBuff[0]);
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_02022D00->txtBuff[0]);
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_02022D00->strBuff, gText_CantHoldMore);
+ gUnknown_02022D00->unk12 = sub_802DA9C(4, 9, 22, 2);
+ AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gUnknown_02022D00->strBuff, 0, 1, TEXT_SPEED_FF, NULL);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 2);
+ gUnknown_02022D00->unk14 = 0;
+ gUnknown_02022D00->unkD = 0;
+}
+
+static bool32 sub_802D974(void)
+{
+ switch (gUnknown_02022D00->unkD)
+ {
+ case 0:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ PutWindowTilemap(gUnknown_02022D00->unk12);
+ DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_02022D00->unkD++;
+ }
+ break;
+ case 1:
+ if (IsDma3ManagerBusyWithBgCopy())
+ break;
+ if (gUnknown_02022D00->unk14 == 0)
+ {
+ gUnknown_02022D00->unkD += 2;
+ return FALSE;
+ }
+ PlayFanfare(gUnknown_02022D00->unk14);
+ gUnknown_02022D00->unkD++;
+ case 2:
+ if (!IsFanfareTaskInactive())
+ break;
+ gUnknown_02022D00->unkD++;
+ case 3:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_802DA14(void)
+{
+ if (gUnknown_02022D00->unk12 != 0xFF)
+ {
+ rbox_fill_rectangle(gUnknown_02022D00->unk12);
+ CopyWindowToVram(gUnknown_02022D00->unk12, 1);
+ gUnknown_02022D00->unkD = 0;
+ }
+}
+
+// Can't match this without the ugly GOTO, oh well.
+static bool32 sub_802DA44(void)
+{
+ if (gUnknown_02022D00->unk12 == 0xFF)
+ {
+ RET_FALSE:
+ return FALSE;
+ }
+
+ if (gUnknown_02022D00->unkD == 0)
+ {
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ RemoveWindow(gUnknown_02022D00->unk12);
+ gUnknown_02022D00->unk12 = 0xFF;
+ gUnknown_02022D00->unkD++;
+ goto RET_FALSE;
+ }
+ }
+ else if (gUnknown_02022D00->unkD == 1)
+ goto RET_FALSE;
+
+ return TRUE;
+}
+
+static s8 sub_802DA8C(void)
+{
+ return Menu_ProcessInputNoWrapClearOnChoose();
+}
+
+static u32 sub_802DA9C(u32 left, u32 top, u32 width, u32 height)
+{
+ u32 windowId;
+ struct WindowTemplate window;
+
+ window.bg = 0;
+ window.tilemapLeft = left;
+ window.tilemapTop = top;
+ window.width = width;
+ window.height = height;
+ window.paletteNum = 0xF;
+ window.baseBlock = 0x43;
+
+ windowId = AddWindow(&window);
+ FillWindowPixelBuffer(windowId, 0x11);
+ return windowId;
+}
+
+static void sub_802DB18(u16 left, u16 top, u8 cursorPos)
+{
+ struct WindowTemplate window;
+ u8 a = cursorPos;
+
+ window.bg = 0;
+ window.tilemapLeft = left;
+ window.tilemapTop = top;
+ window.width = 6;
+ window.height = 4;
+ window.paletteNum = 2;
+ window.baseBlock = 0x2B;
+
+ CreateYesNoMenu(&window, 1, 0xD, a);
+}
+
+static void sub_802DB8C(void)
+{
+ u8 color[] = {0, 2, 3};
+
+ PutWindowTilemap(0);
+ PutWindowTilemap(1);
+ FillWindowPixelBuffer(0, 0);
+ FillWindowPixelBuffer(1, 0);
+ AddTextPrinterParameterized3(0, 0, 0, 1, color, 0, gText_SpacePoints2);
+ AddTextPrinterParameterized3(1, 0, 0, 1, color, 0, gText_SpaceTimes3);
+}
+
+static const u8 gUnknown_082FE1DF[] = {2, 2, 0, 0, 1, 1, 1, 0, 0, 2, 0, 0, 0};
+
+static const struct CompressedSpriteSheet gUnknown_082FE1EC = {gUnknown_082FF1F8, 0, 0x320};
+static const struct SpritePalette gUnknown_082FE1F4 = {gUnknown_082FF1D8, 0x320};
+
+static const u16 gUnknown_082FE1FC[] = {0x06, 0x08, 0x10, 0x08};
+static const u16 gUnknown_082FE204[] = {0x06, 0x08, 0x0b, 0x06, 0x10, 0x08};
+static const u16 gUnknown_082FE210[] = {0x02, 0x06, 0x06, 0x08, 0x10, 0x08, 0x14, 0x06};
+static const u16 gUnknown_082FE220[] = {0x02, 0x06, 0x06, 0x08, 0x0b, 0x06, 0x10, 0x08, 0x14, 0x06};
+
+static const u16 *const gUnknown_082FE234[] =
+{
+ gUnknown_082FE1FC,
+ gUnknown_082FE204,
+ gUnknown_082FE210,
+ gUnknown_082FE220,
+};
+
+static const s16 gUnknown_082FE244[] = {0x0058, 0x0098};
+static const s16 gUnknown_082FE248[] = {0x0058, 0x0078, 0x0098};
+static const s16 gUnknown_082FE24E[] = {0x0038, 0x0058, 0x0098, 0x00b8};
+static const s16 gUnknown_082FE256[] = {0x0038, 0x0058, 0x0078, 0x0098, 0x00b8};
+
+static const s16 *const gUnknown_082FE260[] =
+{
+ gUnknown_082FE244,
+ gUnknown_082FE248,
+ gUnknown_082FE24E,
+ gUnknown_082FE256,
+};
+
+static void sub_802DBF8(void)
+{
+ int i, y, playersCount = sub_802C8AC();
+ const s16 *xCoords = gUnknown_082FE260[playersCount - 2];
+
+ for (i = 0; i < playersCount; i++)
+ {
+ struct PokemonJump1_MonInfo *info = sub_802C8C8(i);
+
+ y = gMonFrontPicCoords[info->species].y_offset;
+ sub_802C9D4(gUnknown_02022D00, info, *xCoords, y + 112, i);
+ sub_802CE48(gUnknown_02022D00, *xCoords, 112, i);
+ xCoords++;
+ }
+}
+
+static void sub_802DC80(u32 id, s16 y)
+{
+ gUnknown_02022D00->unk81A8[id]->pos2.y = y;
+}
+
+static void sub_802DC9C(int id)
+{
+ sub_802CF50(gUnknown_02022D00, id);
+ ChangeBgY(2, (gUnknown_082FE1DF[id] * 5) << 0xD, 0);
+}
+
+static int sub_802DCCC(u8 flags)
+{
+ int i, count;
+
+ for (i = 0, count = 0; i < 5; i++)
+ {
+ if (flags & 1)
+ {
+ sub_802CB14(gUnknown_02022D00, i);
+ count++;
+ }
+ flags >>= 1;
+ }
+
+ sub_802E00C(count - 2);
+ return count;
+}
+
+static void sub_802DD08(void)
+{
+ struct UnkStruct3 unkStruct;
+ struct UnkStruct3 *ptr = &unkStruct; // This temp variable is needed to match, don't ask me why.
+
+ ptr->shape = 0;
+ ptr->size = 0;
+ ptr->field_0_0 = 0;
+ ptr->priority = 1;
+ ptr->field_1 = 5;
+ ptr->xDelta = 8;
+ ptr->x = 108;
+ ptr->y = 6;
+ ptr->spriteSheet = (void*) &gUnknown_082FE1EC;
+ ptr->spritePal = &gUnknown_082FE1F4;
+
+ sub_8034C54(2);
+ sub_8034D14(0, 0, ptr);
+
+ unkStruct.field_1 = 4;
+ unkStruct.x = 30;
+ unkStruct.y = 6;
+ sub_8034D14(1, 0, &unkStruct);
+}
+
+static void sub_802DD64(int arg0)
+{
+ sub_8035044(0, arg0);
+}
+
+static void sub_802DD74(u16 arg0)
+{
+ sub_8035044(1, arg0);
+}
+
+static void sub_802DD88(u8 multiplayerId)
+{
+ sub_802CBF0(gUnknown_02022D00, multiplayerId);
+}
+
+static void sub_802DDA0(u8 multiplayerId)
+{
+ sub_802CC88(gUnknown_02022D00, multiplayerId);
+}
+
+static int sub_802DDB8(int multiplayerId)
+{
+ return sub_802CC18(gUnknown_02022D00, multiplayerId);
+}
+
+static void sub_802DDCC(void)
+{
+ sub_802CCB0(gUnknown_02022D00);
+}
+
+static void sub_802DDE0(void)
+{
+ sub_802CD3C(gUnknown_02022D00);
+}
+
+static void sub_802DDF4(int multiplayerId)
+{
+ sub_802CD70(gUnknown_02022D00, multiplayerId);
+}
+
+static int sub_802DE08(void)
+{
+ return sub_802CD98(gUnknown_02022D00);
+}
+
+static void sub_802DE1C(void)
+{
+ struct WindowTemplate window;
+ int i, playersCount = sub_802C8AC();
+ const u16 *winCoords = gUnknown_082FE234[playersCount - 2];
+
+ window.bg = 0;
+ window.width = 8;
+ window.height = 2;
+ window.paletteNum = 2;
+ window.baseBlock = 0x2B;
+
+ for (i = 0; i < playersCount; i++)
+ {
+ window.tilemapLeft = winCoords[0];
+ window.tilemapTop = winCoords[1];
+ gUnknown_02022D00->unk1C[i] = AddWindow(&window);
+ ClearWindowTilemap(gUnknown_02022D00->unk1C[i]);
+ window.baseBlock += 0x10;
+ winCoords += 2;
+ }
+
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_802DED8(int multiplayerId, u8 clr1, u8 clr2, u8 clr3)
+{
+ u32 x;
+ u8 colors[3] = {clr1, clr2, clr3};
+
+ FillWindowPixelBuffer(gUnknown_02022D00->unk1C[multiplayerId], 0);
+ x = 64 - GetStringWidth(1, sub_802C8E8(multiplayerId), -1);
+ x /= 2;
+ AddTextPrinterParameterized3(gUnknown_02022D00->unk1C[multiplayerId], 1, x, 1, colors, -1, sub_802C8E8(multiplayerId));
+ CopyWindowToVram(gUnknown_02022D00->unk1C[multiplayerId], 2);
+}
+
+static void sub_802DF70(bool32 arg0)
+{
+ int i, var, playersCount = sub_802C8AC();
+
+ if (!arg0)
+ {
+ for (i = 0; i < playersCount; i++)
+ sub_802DED8(i, 0, 2, 3);
+ }
+ else
+ {
+ var = sub_802C8BC();
+ for (i = 0; i < playersCount; i++)
+ {
+ if (var != i)
+ sub_802DED8(i, 0, 2, 3);
+ else
+ sub_802DED8(i, 0, 4, 5);
+ }
+ }
+}
+
+static void sub_802DFD4(void)
+{
+ int i, playersCount = sub_802C8AC();
+
+ for (i = 0; i < playersCount; i++)
+ PutWindowTilemap(gUnknown_02022D00->unk1C[i]);
+ CopyBgTilemapBufferToVram(0);
+}
+
+static void sub_802E00C(u8 arg0)
+{
+ gUnknown_02022D00->unk18 = 0;
+ ChangeBgX(1, (arg0 / 2) << 16, 0);
+ ChangeBgY(1, (((arg0 % 2) << 8) - 40) << 8, 0);
+ ShowBg(1);
+ CreateTask(sub_802E090, 4);
+}
+
+static bool32 sub_802E058(void)
+{
+ if (gUnknown_02022D00->unk18 >= 32)
+ {
+ return FALSE;
+ }
+ else
+ {
+ ChangeBgY(1, 128, 1);
+ if (++gUnknown_02022D00->unk18 >= 32)
+ HideBg(1);
+ return TRUE;
+ }
+}
+
+static void sub_802E090(u8 taskId)
+{
+ if (!sub_802E058())
+ DestroyTask(taskId);
+}
+
+struct MonInfoPacket
+{
+ u8 id; // packet id
+ u16 species;
+ u32 personality;
+ u32 otId;
+};
+
+static void sub_802E0AC(struct PokemonJump1_MonInfo *arg0)
+{
+ struct MonInfoPacket packet;
+ packet.id = 1,
+ packet.species = arg0->species,
+ packet.otId = arg0->otId,
+ packet.personality = arg0->personality,
+ sub_800FE50(&packet);
+}
+
+static bool32 sub_802E0D0(int multiplayerId, struct PokemonJump1_MonInfo *arg0)
+{
+ struct MonInfoPacket packet;
+
+ if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
+ if (packet.id == 1)
+ {
+ arg0->species = packet.species;
+ arg0->otId = packet.otId;
+ arg0->personality = packet.personality;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+struct UnkPacket2
+{
+ u8 id; // packet id
+ u32 unk4;
+ u32 unk8;
+};
+
+static void sub_802E120(u32 arg0)
+{
+ struct UnkPacket2 packet;
+ packet.id = 2;
+ packet.unk4 = arg0;
+ sub_800FE50(&packet);
+}
+
+struct UnkPacket3
+{
+ u8 id; // packet id
+ u8 unk1;
+ u8 unk2;
+ u8 unk3_0:5;
+ u8 unk3_1:3;
+ u16 unk4;
+ u16 unk6;
+ u32 unk8_0:15;
+ u32 unk8_1:17;
+};
+
+static void sub_802E138(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1)
+{
+ struct UnkPacket3 packet;
+ packet.id = 3;
+ packet.unk8_1 = arg1->unk8;
+ packet.unk3_0 = arg1->unk1;
+ packet.unk1 = arg1->unk0;
+ packet.unk6 = arg1->unk2;
+ packet.unk8_0 = arg1->unk4;
+ packet.unk2 = arg0->unk10;
+ packet.unk3_1 = arg0->unk14;
+ packet.unk4 = arg0->unkE;
+ sub_800FE50(&packet);
+}
+
+static bool32 sub_802E1BC(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1)
+{
+ struct UnkPacket3 packet;
+
+ if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[0][1], sizeof(packet));
+ if (packet.id != 3)
+ return FALSE;
+
+ arg1->unk8 = packet.unk8_1;
+ arg1->unk1 = packet.unk3_0;
+ arg1->unk0 = packet.unk1;
+ arg1->unk2 = packet.unk6;
+ arg1->unk4 = packet.unk8_0;
+ arg0->unk10 = packet.unk2;
+ arg0->unk14 = packet.unk3_1;
+ arg0->unkE = packet.unk4;
+ return TRUE;
+}
+
+struct UnkPacket4
+{
+ u8 id; // packet id
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u16 unk4;
+ u8 unk6;
+ u16 unk8;
+};
+
+static void sub_802E234(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2)
+{
+ struct UnkPacket4 packet;
+ packet.id = 4;
+ packet.unk1 = arg0->unk10;
+ packet.unk2 = arg0->unk14;
+ packet.unk3 = arg0->unk18;
+ packet.unk4 = arg0->unkE;
+ packet.unk6 = arg1;
+ packet.unk8 = arg2;
+ sub_800FE50(&packet);
+}
+
+static bool32 sub_802E264(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3)
+{
+ struct UnkPacket4 packet;
+
+ if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
+ if (packet.id != 4)
+ return FALSE;
+
+ arg0->unk10 = packet.unk1;
+ arg0->unk14 = packet.unk2;
+ arg0->unk18 = packet.unk3;
+ arg0->unkE = packet.unk4;
+ *arg2 = packet.unk6;
+ *arg3 = packet.unk8;
+ return TRUE;
+}
+
+static bool32 sub_802E2D0(struct PokemonJump1_82E4 *arg0, int multiplayerId)
+{
+ struct UnkPacket4 packet;
+
+ if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00)
+ return FALSE;
+
+ memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet));
+ if (packet.id != 4)
+ return FALSE;
+
+ arg0->unk10 = packet.unk1;
+ arg0->unk14 = packet.unk2;
+ arg0->unk18 = packet.unk3;
+ arg0->unkE = packet.unk4;
+ return TRUE;
+}
+
+static struct PokemonJumpResults *sub_802E32C(void)
+{
+ return &gSaveBlock2Ptr->pokeJump;
+}
+
+void ResetPokeJumpResults(void)
+{
+ struct PokemonJumpResults *pokeJump = sub_802E32C();
+ pokeJump->jumpsInRow = 0;
+ pokeJump->bestJumpScore = 0;
+ pokeJump->excellentsInRow = 0;
+ pokeJump->field6 = 0;
+ pokeJump->field8 = 0;
+ pokeJump->field2 = 0;
+}
+
+static bool32 sub_802E354(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow)
+{
+ struct PokemonJumpResults *pokeJump = sub_802E32C();
+ bool32 ret = FALSE;
+
+ if (pokeJump->bestJumpScore < jumpScore && jumpScore <= 99990)
+ pokeJump->bestJumpScore = jumpScore, ret = TRUE;
+ if (pokeJump->jumpsInRow < jumpsInRow && jumpsInRow <= 9999)
+ pokeJump->jumpsInRow = jumpsInRow, ret = TRUE;
+ if (pokeJump->excellentsInRow < excellentsInRow && excellentsInRow <= 9999)
+ pokeJump->excellentsInRow = excellentsInRow, ret = TRUE;
+
+ return ret;
+}
+
+static void sub_802E3A8(void)
+{
+ struct PokemonJumpResults *pokeJump = sub_802E32C();
+ if (pokeJump->field6 < 9999)
+ pokeJump->field6++;
+}
+
+void sub_802E3C4(void)
+{
+ u8 taskId = CreateTask(sub_802E3E4, 0);
+ sub_802E3E4(taskId);
+}
+
+static const struct WindowTemplate gUnknown_082FE270 =
+{
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 28,
+ .height = 9,
+ .paletteNum = 15,
+ .baseBlock = 0x1,
+};
+
+static const u8 *const gUnknown_082FE278[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow};
+
+static void sub_802E3E4(u8 taskId)
+{
+ struct WindowTemplate window;
+ int i, width, widthCurr;
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ window = gUnknown_082FE270;
+ width = GetStringWidth(1, gText_PkmnJumpRecords, 0);
+ for (i = 0; i < ARRAY_COUNT(gUnknown_082FE278); i++)
+ {
+ widthCurr = GetStringWidth(1, gUnknown_082FE278[i], 0) + 38;
+ if (widthCurr > width)
+ width = widthCurr;
+ }
+ width = (width + 7) / 8;
+ if (width & 1)
+ width++;
+ window.tilemapLeft = (30 - width) / 2;
+ window.width = width;
+ data[1] = AddWindow(&window);
+ sub_802E500(data[1], width);
+ CopyWindowToVram(data[1], 3);
+ data[0]++;
+ break;
+ case 1:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ data[0]++;
+ break;
+ case 2:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ rbox_fill_rectangle(data[1]);
+ CopyWindowToVram(data[1], 1);
+ data[0]++;
+ }
+ break;
+ case 3:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ RemoveWindow(data[1]);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+ break;
+ }
+}
+
+static void sub_802E500(u16 windowId, int width)
+{
+ int i, x;
+ int results[3];
+ struct PokemonJumpResults *pokeJump = sub_802E32C();
+ results[0] = pokeJump->jumpsInRow;
+ results[1] = pokeJump->bestJumpScore;
+ results[2] = pokeJump->excellentsInRow;
+
+ LoadUserWindowBorderGfx_(windowId, 0x21D, 0xD0);
+ DrawTextBorderOuter(windowId, 0x21D, 0xD);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
+ AddTextPrinterParameterized(windowId, 1, gText_PkmnJumpRecords, GetStringCenterAlignXOffset(1, gText_PkmnJumpRecords, width * 8), 1, TEXT_SPEED_FF, NULL);
+ for (i = 0; i < ARRAY_COUNT(gUnknown_082FE278); i++)
+ {
+ AddTextPrinterParameterized(windowId, 1, gUnknown_082FE278[i], 0, 25 + (i * 16), TEXT_SPEED_FF, NULL);
+ ConvertIntToDecimalStringN(gStringVar1, results[i], STR_CONV_MODE_LEFT_ALIGN, 5);
+ TruncateToFirstWordOnly(gStringVar1);
+ x = (width * 8) - GetStringWidth(1, gStringVar1, 0);
+ AddTextPrinterParameterized(windowId, 1, gStringVar1, x, 25 + (i * 16), TEXT_SPEED_FF, NULL);
+ }
+ PutWindowTilemap(windowId);
+}
+
+static void TruncateToFirstWordOnly(u8 *str)
+{
+ for (;*str != EOS; str++)
+ {
+ if (*str == CHAR_SPACE)
+ {
+ *str = EOS;
+ break;
+ }
+ }
+}
+
+static const u16 gPkmnJump321StartPal1[] = INCBIN_U16("graphics/link_games/pkmnjump_321start1.gbapal");
+static const u32 gPkmnJump321StartGfx1[] = INCBIN_U32("graphics/link_games/pkmnjump_321start1.4bpp.lz");
+
+static const struct CompressedSpriteSheet gUnknown_082FE6C8[] =
+{
+ {gPkmnJump321StartGfx1, 0xC00, 0x2000},
+ {},
+};
+
+static const struct SpritePalette gUnknown_082FE6D8[] =
+{
+ {gPkmnJump321StartPal1, 0x2000},
+ {},
+};
+
+static const union AnimCmd sSpriteAnim_82FE6E8[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FE6F0[] =
+{
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FE6F8[] =
+{
+ ANIMCMD_FRAME(32, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FE700[] =
+{
+ ANIMCMD_FRAME(64, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FE708[] =
+{
+ ANIMCMD_FRAME(48, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FE710[] =
+{
+ ANIMCMD_FRAME(80, 0),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FE718[] =
+{
+ sSpriteAnim_82FE6E8,
+ sSpriteAnim_82FE6F0,
+ sSpriteAnim_82FE6F8,
+ sSpriteAnim_82FE700,
+ sSpriteAnim_82FE708,
+ sSpriteAnim_82FE710
+};
+
+static const struct SpriteTemplate gUnknown_082FE730[] =
+{
+ {
+ .tileTag = 0x2000,
+ .paletteTag = 0x2000,
+ .oam = &gUnknown_08524914,
+ .anims = sSpriteAnimTable_82FE718,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+};
+
+static const TaskFunc gUnknown_082FE748[][4] =
+{
+ {
+ sub_802E83C,
+ sub_802E8C8,
+ sub_802EA50,
+ sub_802EAB0
+ },
+};
+
+// There's only set of task functions.
+static u32 sub_802E63C(u8 funcSetId, u8 taskPriority)
+{
+ u8 taskId = CreateTask(sub_802E6D0, taskPriority);
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0] = 1;
+ task->data[1] = funcSetId;
+ gUnknown_082FE748[funcSetId][0](taskId);
+ return taskId;
+}
+
+static bool32 sub_802E688(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_802E6D0);
+ if (taskId == 0xFF)
+ return FALSE;
+
+ gTasks[taskId].data[0] = 2;
+ return TRUE;
+}
+
+static bool32 sub_802E6BC(void)
+{
+ return FuncIsActiveTask(sub_802E6D0);
+}
+
+static void sub_802E6D0(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 2:
+ gUnknown_082FE748[data[1]][2](taskId);
+ data[0] = 3;
+ break;
+ case 3:
+ gUnknown_082FE748[data[1]][3](taskId);
+ break;
+ case 4:
+ gUnknown_082FE748[data[1]][1](taskId);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_802E75C(u8 taskId, s16 *data)
+{
+ u8 i;
+ struct Sprite *sprite;
+
+ LoadCompressedSpriteSheet(&gUnknown_082FE6C8[data[3]]);
+ LoadSpritePalette(&gUnknown_082FE6D8[data[4]]);
+ for (i = 0; i < data[8]; i++)
+ data[13 + i] = CreateSprite(&gUnknown_082FE730[data[2]], data[9], data[10], data[7]);
+ for (i = 0; i < data[8]; i++)
+ {
+ sprite = &gSprites[data[13 + i]];
+ sprite->oam.priority = data[6];
+ sprite->invisible = TRUE;
+ sprite->data[1] = data[5];
+ sprite->data[3] = taskId;
+ sprite->data[4] = i;
+ sprite->data[5] = data[13];
+ }
+}
+
+static void sub_802E83C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ data[2] = 0;
+ data[3] = 0;
+ data[4] = 0;
+ data[5] = 60;
+ data[6] = 0;
+ data[7] = 0;
+ data[8] = 3;
+ data[9] = 120;
+ data[10] = 88;
+ sub_802E75C(taskId, data);
+
+ StartSpriteAnim(&gSprites[data[14]], 4);
+ gSprites[data[14]].pos2.x = -32;
+
+ StartSpriteAnim(&gSprites[data[15]], 5);
+ gSprites[data[15]].pos2.x = 32;
+}
+
+static void sub_802E8C8(u8 taskId)
+{
+ u8 i = 0;
+ s16 *data = gTasks[taskId].data;
+
+ for (i = 0; i < data[8]; i++)
+ DestroySprite(&gSprites[data[13 + i]]);
+ FreeSpriteTilesByTag(gUnknown_082FE6C8[data[3]].tag);
+ FreeSpritePaletteByTag(gUnknown_082FE6D8[data[4]].tag);
+}
+
+static void sub_802E938(struct Sprite *sprite)
+{
+ s16 *data = gTasks[sprite->data[3]].data;
+
+ if (data[11] % data[5] != 0)
+ return;
+ if (data[11] == data[10])
+ return;
+
+ data[10] = data[11];
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->invisible = FALSE;
+ case 1:
+ case 2:
+ PlaySE(SE_KON);
+ StartSpriteAnim(sprite, sprite->data[2]);
+ break;
+ case 3:
+ PlaySE(SE_PIN);
+ StartSpriteAnim(sprite, sprite->data[2]);
+ gSprites[data[14]].invisible = FALSE;
+ gSprites[data[15]].invisible = FALSE;
+ break;
+ case 4:
+ sprite->invisible = TRUE;
+ gSprites[data[14]].invisible = TRUE;
+ gSprites[data[15]].invisible = TRUE;
+ data[0] = 4;
+ return;
+ }
+ sprite->data[2]++;
+}
+
+static void sub_802EA50(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ PlaySE(SE_KON);
+ gSprites[data[13]].callback = sub_802E938;
+ gSprites[data[13]].invisible = FALSE;
+ gTasks[taskId].data[0] = 3;
+}
+
+static void sub_802EAB0(u8 taskId)
+{
+ u16 packet[6];
+ s16 *data = gTasks[taskId].data;
+
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (gRecvCmds[0][1] == 0x7FFF)
+ data[11] = gRecvCmds[0][2];
+ if (GetMultiplayerId() == 0)
+ {
+ data[12]++;
+ memset(packet, 0, sizeof(packet));
+ packet[0] = 0x7FFF;
+ packet[1] = data[12];
+ sub_800FE50(packet);
+ }
+ }
+ else
+ {
+ data[11]++;
+ }
+}
+
+void sub_802EB24(s16 tileTag, s16 palTag, s16 x, s16 y, u8 subpriority)
+{
+ u8 taskId = CreateTask(sub_802EB98, 0x50);
+ gTasks[taskId].data[2] = tileTag;
+ gTasks[taskId].data[3] = palTag;
+ gTasks[taskId].data[4] = x;
+ gTasks[taskId].data[5] = y;
+ gTasks[taskId].data[6] = subpriority;
+}
+
+bool32 sub_802EB84(void)
+{
+ return FuncIsActiveTask(sub_802EB98);
+}
+
+static void sub_802EB98(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ sub_802EF50(data[2], data[3]);
+ data[7] = sub_802EFA8(data[2], data[3], data[4], data[5], data[6]);
+ sub_802EFFC(data[2], data[3], data[4], data[5], data[6], &data[8], &data[9]);
+ data[0]++;
+ break;
+ case 1:
+ if (!sub_802EC98(data[7]))
+ {
+ sub_802EDCC(data[7], data[8], data[9]);
+ FreeSpriteOamMatrix(&gSprites[data[7]]);
+ DestroySprite(&gSprites[data[7]]);
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (!sub_802EE30(data[8]))
+ {
+ DestroySprite(&gSprites[data[8]]);
+ DestroySprite(&gSprites[data[9]]);
+ FreeSpriteTilesByTag(data[2]);
+ FreeSpritePaletteByTag(data[3]);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static bool32 sub_802EC98(u8 spriteId)
+{
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sub_8007E18(sprite, 0x800, 0x1A);
+ sprite->data[0]++;
+ case 1:
+ if (sprite->data[2] == 0)
+ PlaySE(SE_KON2);
+ if (++sprite->data[2] >= 20)
+ {
+ sprite->data[2] = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->affineAnimEnded)
+ sprite->data[0]++;
+ break;
+ case 3:
+ if (++sprite->data[2] >= 4)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ StartSpriteAffineAnim(sprite, 2);
+ }
+ break;
+ case 4:
+ sprite->pos1.y -= 4;
+ if (++sprite->data[2] >= 8)
+ {
+ if (sprite->data[4] <= 1)
+ {
+ StartSpriteAnim(sprite, sprite->data[4] + 1);
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[0] = 7;
+ return FALSE;
+ }
+ }
+ break;
+ case 5:
+ sprite->pos1.y += 4;
+ if (++sprite->data[2] >= 8)
+ {
+ sprite->data[2] = 0;
+ StartSpriteAffineAnim(sprite, 3);
+ sprite->data[0]++;
+ }
+ break;
+ case 6:
+ if (sprite->affineAnimEnded)
+ {
+ sprite->data[4]++;
+ sprite->data[0] = 1;
+ }
+ break;
+ case 7:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+// First argument is unused.
+static void sub_802EDCC(u8 spriteId1, u8 spriteId2, u8 spriteId3)
+{
+ gSprites[spriteId2].pos2.y = -40;
+ gSprites[spriteId3].pos2.y = -40;
+ gSprites[spriteId2].invisible = FALSE;
+ gSprites[spriteId3].invisible = FALSE;
+ gSprites[spriteId2].callback = sub_802EE5C;
+ gSprites[spriteId3].callback = sub_802EE5C;
+}
+
+static bool32 sub_802EE30(u8 spriteId)
+{
+ return (gSprites[spriteId].callback == sub_802EE5C);
+}
+
+static void sub_802EE5C(struct Sprite *sprite)
+{
+ int y;
+ s16 *data = sprite->data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[4] = 64;
+ data[5] = sprite->pos2.y << 4;
+ data[0]++;
+ case 1:
+ data[5] += data[4];
+ data[4]++;
+ sprite->pos2.y = data[5] >> 4;
+ if (sprite->pos2.y >= 0)
+ {
+ PlaySE(SE_KON2);
+ sprite->pos2.y = 0;
+ data[0]++;
+ }
+ break;
+ case 2:
+ data[1] += 12;
+ if (data[1] >= 128)
+ {
+ PlaySE(SE_KON2);
+ data[1] = 0;
+ data[0]++;
+ }
+ y = gSineTable[data[1]];
+ sprite->pos2.y = -(y >> 4);
+ break;
+ case 3:
+ data[1] += 16;
+ if (data[1] >= 128)
+ {
+ PlaySE(SE_KON2);
+ data[1] = 0;
+ data[0]++;
+ }
+ sprite->pos2.y = -(gSineTable[data[1]] >> 5);
+ break;
+ case 4:
+ if (++data[1] > 40)
+ sprite->callback = SpriteCallbackDummy;
+ break;
+ }
+}
+
+static const u16 gPkmnJump321StartPal2[] = INCBIN_U16("graphics/link_games/pkmnjump_321start2.gbapal");
+static const u32 gPkmnJump321StartGfx2[] = INCBIN_U32("graphics/link_games/pkmnjump_321start2.4bpp.lz");
+
+static void sub_802EF50(u16 tileTag, u16 palTag)
+{
+ struct CompressedSpriteSheet sprSheet = {gPkmnJump321StartGfx2, 0xE00, 0};
+ struct SpritePalette sprPal = {gPkmnJump321StartPal2, 0};
+
+ sprSheet.tag = tileTag;
+ sprPal.tag = palTag;
+
+ LoadCompressedSpriteSheet(&sprSheet);
+ LoadSpritePalette(&sprPal);
+}
+
+static const struct OamData sOamData_82FEBDC =
+{
+ .y = 0,
+ .affineMode = 3,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sOamData_82FEBE4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpriteAnim_82FEBEC[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FEBF4[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FEBFC[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FEC04[] =
+{
+ sSpriteAnim_82FEBEC,
+ sSpriteAnim_82FEBF4,
+ sSpriteAnim_82FEBFC
+};
+
+static const union AnimCmd sSpriteAnim_82FEC10[] =
+{
+ ANIMCMD_FRAME(48, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd sSpriteAnim_82FEC18[] =
+{
+ ANIMCMD_FRAME(80, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_82FEC20[] =
+{
+ sSpriteAnim_82FEC10,
+ sSpriteAnim_82FEC18
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_82FEC28[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_82FEC38[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(16, -16, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_82FEC50[] =
+{
+ AFFINEANIMCMD_FRAME(-18, 18, 0, 8),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_82FEC60[] =
+{
+ AFFINEANIMCMD_FRAME(6, -6, 0, 8),
+ AFFINEANIMCMD_FRAME(-4, 4, 0, 8),
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_82FEC80[] =
+{
+ sSpriteAffineAnim_82FEC28,
+ sSpriteAffineAnim_82FEC38,
+ sSpriteAffineAnim_82FEC50,
+ sSpriteAffineAnim_82FEC60
+};
+
+static u8 sub_802EFA8(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority)
+{
+ u8 spriteId;
+ struct SpriteTemplate sprTemplate =
+ {
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_82FEBDC,
+ .anims = sSpriteAnimTable_82FEC04,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_82FEC80,
+ .callback = SpriteCallbackDummy,
+ };
+
+ sprTemplate.tileTag = tileTag;
+ sprTemplate.paletteTag = palTag;
+ spriteId = CreateSprite(&sprTemplate, x, y, subpriority);
+ return spriteId;
+}
+
+static void sub_802EFFC(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 *spriteId1, s16 *spriteId2)
+{
+ struct SpriteTemplate sprTemplate =
+ {
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sOamData_82FEBE4,
+ .anims = sSpriteAnimTable_82FEC20,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ };
+
+ sprTemplate.tileTag = tileTag;
+ sprTemplate.paletteTag = palTag;
+ *spriteId1 = CreateSprite(&sprTemplate, x - 32, y, subpriority);
+ *spriteId2 = CreateSprite(&sprTemplate, x + 32, y, subpriority);
+
+ gSprites[*spriteId1].invisible = TRUE;
+ gSprites[*spriteId2].invisible = TRUE;
+ StartSpriteAnim(&gSprites[*spriteId2], 1);
+}
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index 0ddad55a6..4cd1a4772 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -443,7 +443,7 @@ enum
#define TAG_TILE_1 0x1
// IWRAM bss
-IWRAM_DATA static u32 gUnknown_03000F78[98];
+static u32 gUnknown_03000F78[98];
// EWRAM DATA
EWRAM_DATA static u8 sPreviousBoxOption = 0;
@@ -6824,7 +6824,7 @@ static void SetCursorMonData(void *pokemon, u8 mode)
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);
+ sPSSData->cursorMonPalette = GetMonSpritePalFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, otId, sPSSData->cursorMonPersonality);
gender = GetGenderFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality);
sPSSData->cursorMonItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM);
}
diff --git a/src/pokenav.c b/src/pokenav.c
index be3826bed..a5bb51789 100644
--- a/src/pokenav.c
+++ b/src/pokenav.c
@@ -31,72 +31,30 @@ struct UnknownPokenavCallbackStruct
bool32 (*unk0)(void);
u32 (*unk4)(void);
bool32 (*unk8)(void);
- void (*unkC)(int);
+ void (*unkC)(s32);
u32 (*unk10)(void);
void (*unk14)(void);
void (*unk18)(void);
};
-extern bool32 sub_81C9924(void);
-extern u32 sub_81C99C0(void);
-extern void sub_81C9990(int);
-extern bool32 sub_81C9940(void);
-extern u32 sub_81CCFD8(void);
-extern u32 sub_81CD070(void);
-extern bool32 sub_81CDDD4(void);
-extern void sub_81CDE2C(int);
-extern u32 sub_81CDE64(void);
-extern void sub_81CD1C0(void);
-extern void sub_81CECA0(void);
-extern u32 sub_81CEF3C(void);
-extern u32 sub_81CEFDC(void);
-extern bool32 sub_81CF330(void);
-extern void sub_81CF3A0(int);
-extern u32 sub_81CF3D0(void);
-extern void sub_81CEFF0(void);
-extern void sub_81CF3F8(void);
-extern u32 sub_81CD024(void);
-extern u32 sub_81CEF98(void);
-extern bool32 sub_81CF368(void);
-extern u32 sub_81CF9BC(void);
-extern u32 sub_81CFA34(void);
-extern bool32 sub_81CFDD0(void);
-extern void sub_81CFE40(int);
-extern u32 sub_81CFE70(void);
-extern void sub_81CFA48(void);
-extern void sub_81CFE98(void);
-extern u32 sub_81D0450(void);
-extern u32 sub_81D04A0(void);
-extern bool32 sub_81D0978(void);
-extern void sub_81D09B0(int);
-extern u32 sub_81D09E0(void);
-extern void sub_81D04B8(void);
-extern void sub_81D09F4(void);
-extern u32 sub_81CFA04(void);
-extern bool32 sub_81CFE08(void);
-
+static u32 sub_81C75E0(void);
+static u32 sub_81C75D4(void);
static bool32 SetActivePokenavMenu(u32 menuId);
static bool32 AnyMonHasRibbon(void);
-u32 sub_81C75E0(void);
-u32 sub_81C75D4(void);
-u32 PokenavMainMenuLoopedTaskIsActive(void);
-bool32 WaitForPokenavShutdownFade(void);
-void sub_81C7834(void *func1, void *func2);
static void InitPokenavResources(struct PokenavResources *a0);
-void Task_RunLoopedTask_LinkMode(u8 a0);
-void Task_RunLoopedTask(u8 taskId);
-void sub_81C742C(u8 taskId);
-void ShutdownPokenav(void);
static void InitKeys_(void);
static void FreePokenavResources(void);
static void VBlankCB_Pokenav(void);
static void CB2_Pokenav(void);
-void sub_81C72BC(void);
+static void Task_RunLoopedTask_LinkMode(u8 a0);
+static void Task_RunLoopedTask(u8 taskId);
+static void sub_81C742C(u8 taskId);
+static void sub_81C72BC(void);
const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
{
{
- .unk0 = sub_81C9298,
+ .unk0 = PokenavCallback_Init_0,
.unk4 = sub_81C941C,
.unk8 = sub_81C9924,
.unkC = sub_81C9990,
@@ -105,7 +63,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81C99D4,
},
{
- .unk0 = sub_81C9298,
+ .unk0 = PokenavCallback_Init_0,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
@@ -114,7 +72,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81C99D4,
},
{
- .unk0 = sub_81C9338,
+ .unk0 = PokenavCallback_Init_2,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
@@ -123,7 +81,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81C99D4,
},
{
- .unk0 = sub_81C9368,
+ .unk0 = PokenavCallback_Init_3,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
@@ -132,16 +90,16 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81C99D4,
},
{
- .unk0 = sub_81C92CC,
+ .unk0 = PokenavCallback_Init_4,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
- .unk10 =sub_81C99C0,
+ .unk10 = sub_81C99C0,
.unk14 = sub_81C9430,
.unk18 = sub_81C99D4,
},
{
- .unk0 = sub_81C9304,
+ .unk0 = PokenavCallback_Init_5,
.unk4 = sub_81C941C,
.unk8 = sub_81C9940,
.unkC = sub_81C9990,
@@ -150,7 +108,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81C99D4,
},
{
- .unk0 = sub_81CC4D4,
+ .unk0 = PokenavCallback_Init_6,
.unk4 = sub_81CC554,
.unk8 = sub_81CC5F4,
.unkC = sub_81CC62C,
@@ -159,7 +117,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81CC670,
},
{
- .unk0 = sub_81CCFD8,
+ .unk0 = PokenavCallback_Init_7,
.unk4 = sub_81CD070,
.unk8 = sub_81CDDD4,
.unkC = sub_81CDE2C,
@@ -168,7 +126,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81CECA0,
},
{
- .unk0 = sub_81CEF3C,
+ .unk0 = PokenavCallback_Init_8,
.unk4 = sub_81CEFDC,
.unk8 = sub_81CF330,
.unkC = sub_81CF3A0,
@@ -177,7 +135,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81CF3F8,
},
{
- .unk0 = sub_81CD024,
+ .unk0 = PokenavCallback_Init_9,
.unk4 = sub_81CD070,
.unk8 = sub_81CDDD4,
.unkC = sub_81CDE2C,
@@ -186,7 +144,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81CECA0,
},
{
- .unk0 = sub_81CEF98,
+ .unk0 = PokenavCallback_Init_10,
.unk4 = sub_81CEFDC,
.unk8 = sub_81CF368,
.unkC = sub_81CF3A0,
@@ -195,7 +153,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81CF3F8,
},
{
- .unk0 = sub_81CAAE8,
+ .unk0 = PokenavCallback_Init_11,
.unk4 = sub_81CAB24,
.unk8 = sub_81CB260,
.unkC = sub_81CB29C,
@@ -204,7 +162,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81CB2E0,
},
{
- .unk0 = sub_81CF9BC,
+ .unk0 = PokenavCallback_Init_12,
.unk4 = sub_81CFA34,
.unk8 = sub_81CFDD0,
.unkC = sub_81CFE40,
@@ -213,7 +171,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81CFE98,
},
{
- .unk0 = sub_81D0450,
+ .unk0 = PokenavCallback_Init_13,
.unk4 = sub_81D04A0,
.unk8 = sub_81D0978,
.unkC = sub_81D09B0,
@@ -222,7 +180,7 @@ const struct UnknownPokenavCallbackStruct PokenavMenuCallbacks[15] =
.unk18 = sub_81D09F4,
},
{
- .unk0 = sub_81CFA04,
+ .unk0 = PokenavCallback_Init_14,
.unk4 = sub_81CFA34,
.unk8 = sub_81CFE08,
.unkC = sub_81CFE40,
@@ -277,7 +235,7 @@ bool32 FuncIsActiveLoopedTask(LoopedTask func)
return FALSE;
}
-void Task_RunLoopedTask(u8 taskId)
+static void Task_RunLoopedTask(u8 taskId)
{
LoopedTask loopedTask = (LoopedTask)GetWordTaskArg(taskId, 1);
s16 *state = &gTasks[taskId].data[0];
@@ -310,7 +268,7 @@ void Task_RunLoopedTask(u8 taskId)
}
// Every "Continue" action pauses instead.
-void Task_RunLoopedTask_LinkMode(u8 taskId)
+static void Task_RunLoopedTask_LinkMode(u8 taskId)
{
LoopedTask task;
s16 *state;
@@ -318,7 +276,7 @@ void Task_RunLoopedTask_LinkMode(u8 taskId)
if (sub_8087598())
return;
-
+
task = (LoopedTask)GetWordTaskArg(taskId, 1);
state = &gTasks[taskId].data[0];
action = task(*state);
@@ -365,7 +323,7 @@ void sub_81C72A4(void)
FadeScreen(1, 0);
}
-void sub_81C72BC(void)
+static void sub_81C72BC(void)
{
UpdatePaletteFade();
if (gPaletteFade.active)
@@ -458,7 +416,7 @@ static void VBlankCB_Pokenav(void)
ProcessSpriteCopyRequests();
}
-void sub_81C742C(u8 taskId)
+static void sub_81C742C(u8 taskId)
{
u32 v1;
s16 *data = gTasks[taskId].data;
@@ -544,12 +502,12 @@ static bool32 SetActivePokenavMenu(u32 menuId)
return TRUE;
}
-u32 sub_81C75D4(void)
+static u32 sub_81C75D4(void)
{
return sub_81C786C();
}
-u32 sub_81C75E0(void)
+static u32 sub_81C75E0(void)
{
return gPokenavResources->currentMenuCb1();
}
@@ -605,7 +563,7 @@ void sub_81C7694(u32 a0)
gPokenavResources->fieldA = value;
}
-u16 sub_81C76AC(void)
+u32 sub_81C76AC(void)
{
return gPokenavResources->fieldA;
}
diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c
index 94dab60bb..4422a70e3 100644
--- a/src/pokenav_main_menu.c
+++ b/src/pokenav_main_menu.c
@@ -64,16 +64,16 @@ static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide);
static void HideLeftHeaderSprites(bool32 isOnRightSide);
static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide);
static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide);
-static void MoveLeftHeader(struct Sprite *sprite, int startX, int endX, int duration);
+static void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration);
static void SpriteCB_MoveLeftHeader(struct Sprite *sprite);
static void InitPokenavMainMenuResources(void);
static void InitHoennMapHeaderSprites(void);
static void sub_81C7B74(void);
-static u32 LoopedTask_ScrollMenuHeaderDown(int a0);
-static u32 LoopedTask_ScrollMenuHeaderUp(int a0);
+static u32 LoopedTask_ScrollMenuHeaderDown(s32 a0);
+static u32 LoopedTask_ScrollMenuHeaderUp(s32 a0);
static void sub_81C7BF8(u32 a0);
static void SpriteCB_SpinningPokenav(struct Sprite* sprite);
-static u32 LoopedTask_InitPokenavMenu(int a0);
+static u32 LoopedTask_InitPokenavMenu(s32 a0);
const u16 gSpinningPokenavPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal");
const u32 gSpinningPokenavGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz");
@@ -360,7 +360,7 @@ bool32 WaitForPokenavShutdownFade(void)
return TRUE;
}
-static u32 LoopedTask_InitPokenavMenu(int a0)
+static u32 LoopedTask_InitPokenavMenu(s32 a0)
{
struct PokenavMainMenuResources *structPtr;
@@ -440,7 +440,7 @@ bool32 MainMenuLoopedTaskIsBusy(void)
return IsLoopedTaskActive(structPtr->currentTaskId);
}
-static u32 LoopedTask_ScrollMenuHeaderDown(int a0)
+static u32 LoopedTask_ScrollMenuHeaderDown(s32 a0)
{
switch (a0)
{
@@ -461,7 +461,7 @@ static u32 LoopedTask_ScrollMenuHeaderDown(int a0)
}
}
-static u32 LoopedTask_ScrollMenuHeaderUp(int a0)
+static u32 LoopedTask_ScrollMenuHeaderUp(s32 a0)
{
if (ChangeBgY(0, 384, 2) <= 0)
{
@@ -637,7 +637,7 @@ _081C7AAE:\n\
.syntax divided");
}
-void sub_81C7AC0(int a0)
+void sub_81C7AC0(s32 a0)
{
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
@@ -708,7 +708,7 @@ static void sub_81C7BF8(u32 windowId)
static void InitPokenavMainMenuResources(void)
{
- int i;
+ s32 i;
u8 spriteId;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
@@ -758,13 +758,13 @@ void ResumeSpinningPokenavSprite(void)
static void InitHoennMapHeaderSprites(void)
{
- int i, spriteId;
+ s32 i, spriteId;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
LoadCompressedSpriteSheet(&sPokenavHoennMapLeftHeaderSpriteSheet);
AllocSpritePalette(1);
AllocSpritePalette(2);
- for (i = 0; i < (int)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
spriteId = CreateSprite(&sPokenavLeftHeaderHoennMapSpriteTemplate, 0, 0, 1);
structPtr->leftHeaderSprites[i] = &gSprites[spriteId];
@@ -859,10 +859,10 @@ void sub_81C7FC4(u32 arg0, bool32 arg1)
void sub_81C7FDC(void)
{
- int i;
+ s32 i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- for (i = 0; i < (int)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
structPtr->leftHeaderSprites[i]->invisible = TRUE;
structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE;
@@ -881,7 +881,7 @@ bool32 sub_81C8010(void)
static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide)
{
- int start, end, i;
+ s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
if (!isOnRightSide)
@@ -889,7 +889,7 @@ static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide)
else
start = 256, end = 160;
- for (i = 0; i < (int)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
structPtr->leftHeaderSprites[i]->pos1.y = startY;
MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12);
@@ -898,7 +898,7 @@ static void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide)
static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide)
{
- int start, end, i;
+ s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
if (!isOnRightSide)
@@ -906,7 +906,7 @@ static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide)
else
start = 256, end = 192;
- for (i = 0; i < (int)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
{
structPtr->submenuLeftHeaderSprites[i]->pos1.y = startY;
MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12);
@@ -915,7 +915,7 @@ static void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide)
static void HideLeftHeaderSprites(bool32 isOnRightSide)
{
- int start, end, i;
+ s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
if (!isOnRightSide)
@@ -923,7 +923,7 @@ static void HideLeftHeaderSprites(bool32 isOnRightSide)
else
start = 192, end = 256;
- for (i = 0; i < (int)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12);
}
@@ -931,7 +931,7 @@ static void HideLeftHeaderSprites(bool32 isOnRightSide)
static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide)
{
- int start, end, i;
+ s32 start, end, i;
struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
if (!isOnRightSide)
@@ -939,13 +939,13 @@ static void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide)
else
start = 192, end = 256;
- for (i = 0; i < (int)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
{
MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12);
}
}
-static void MoveLeftHeader(struct Sprite *sprite, int startX, int endX, int duration)
+static void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration)
{
sprite->pos1.x = startX;
sprite->data[0] = startX * 16;
diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c
index 70fa42541..5379ee88e 100644
--- a/src/pokenav_match_call_data.c
+++ b/src/pokenav_match_call_data.c
@@ -6,6 +6,9 @@
#include "battle.h"
#include "gym_leader_rematch.h"
#include "match_call.h"
+#include "pokenav.h"
+#include "constants/region_map_sections.h"
+#include "constants/trainers.h"
// Static type declarations
@@ -17,13 +20,13 @@ typedef struct MatchCallTextDataStruct {
struct MatchCallStructCommon {
u8 type;
- u8 v1;
+ u8 mapSec;
u16 flag;
};
struct MatchCallStruct0 {
u8 type;
- u8 v1;
+ u8 mapSec;
u16 flag;
const u8 *desc;
const u8 *name;
@@ -32,7 +35,7 @@ struct MatchCallStruct0 {
struct MatchCallStruct1 {
u8 type;
- u8 v1;
+ u8 mapSec;
u16 flag;
u16 rematchTableIdx;
const u8 *desc;
@@ -42,12 +45,12 @@ struct MatchCallStruct1 {
struct MatchCallSubstruct2 {
u16 flag;
- u8 v2;
+ u8 mapSec;
};
struct MatchCallStruct2 {
u8 type;
- u8 v1;
+ u8 mapSec;
u16 flag;
u16 rematchTableIdx;
const u8 *desc;
@@ -57,7 +60,7 @@ struct MatchCallStruct2 {
struct MatchCallStruct3 {
u8 type;
- u8 v1;
+ u8 mapSec;
u16 flag;
const u8 *desc;
const u8 *name;
@@ -75,7 +78,7 @@ struct MatchCallStruct4 {
// Note: Type1 and Type5 have identical struct layouts.
struct MatchCallStruct5 {
u8 type;
- u8 v1;
+ u8 mapSec;
u16 flag;
u16 rematchTableIdx;
const u8 *desc;
@@ -93,11 +96,11 @@ typedef union {
const struct MatchCallStruct5 *type5;
} match_call_t;
-struct UnkStruct_08625388 {
+struct MatchCallOverride {
u16 idx;
- u16 v2;
- u16 v4;
- const u8 *v8[4];
+ u16 facilityClass;
+ u32 flag;
+ const u8 *flavorTexts[4];
};
// Static RAM declarations
@@ -110,11 +113,11 @@ static bool32 MatchCallGetFlag_Type2(match_call_t);
static bool32 MatchCallGetFlag_Type3(match_call_t);
static bool32 MatchCallGetFlag_Type4(match_call_t);
-static u8 sub_81D1714(match_call_t);
-static u8 sub_81D1718(match_call_t);
-static u8 sub_81D171C(match_call_t);
-static u8 sub_81D1750(match_call_t);
-static u8 sub_81D1754(match_call_t);
+static u8 MatchCallGetMapSec_Type0(match_call_t);
+static u8 MatchCallGetMapSec_Type1(match_call_t);
+static u8 MatchCallGetMapSec_Type2(match_call_t);
+static u8 MatchCallGetMapSec_Type3(match_call_t);
+static u8 MatchCallGetMapSec_Type4(match_call_t);
static bool32 MatchCall_IsRematchable_Type0(match_call_t);
static bool32 MatchCall_IsRematchable_Type1(match_call_t);
@@ -122,11 +125,11 @@ static bool32 MatchCall_IsRematchable_Type2(match_call_t);
static bool32 MatchCall_IsRematchable_Type3(match_call_t);
static bool32 MatchCall_IsRematchable_Type4(match_call_t);
-static bool32 sub_81D1840(match_call_t);
-static bool32 sub_81D1844(match_call_t);
-static bool32 sub_81D1848(match_call_t);
-static bool32 sub_81D184C(match_call_t);
-static bool32 sub_81D1850(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type0(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type1(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type2(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type3(match_call_t);
+static bool32 MatchCall_HasCheckPage_Type4(match_call_t);
static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t);
static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t);
@@ -325,7 +328,7 @@ static const match_call_text_data_t sMrStoneTextScripts[] = {
static const struct MatchCallStruct0 sMrStoneMatchCallHeader =
{
.type = 0,
- .v1 = 10,
+ .mapSec = MAPSEC_RUSTBORO_CITY,
.flag = 0xFFFF,
.desc = gMrStoneMatchCallDesc,
.name = gMrStoneMatchCallName,
@@ -348,7 +351,7 @@ static const match_call_text_data_t sNormanTextScripts[] = {
static const struct MatchCallStruct5 sNormanMatchCallHeader =
{
.type = 5,
- .v1 = 7,
+ .mapSec = MAPSEC_PETALBURG_CITY,
.flag = FLAG_ENABLE_NORMAN_MATCH_CALL,
.rematchTableIdx = REMATCH_NORMAN,
.desc = gNormanMatchCallDesc,
@@ -359,7 +362,7 @@ static const struct MatchCallStruct5 sNormanMatchCallHeader =
static const struct MatchCallStruct3 sProfBirchMatchCallHeader =
{
.type = 3,
- .v1 = 0,
+ .mapSec = 0,
.flag = FLAG_ENABLE_PROF_BIRCH_MATCH_CALL,
.desc = gProfBirchMatchCallDesc,
.name = gProfBirchMatchCallName
@@ -375,7 +378,7 @@ static const match_call_text_data_t sMomTextScripts[] = {
static const struct MatchCallStruct0 sMomMatchCallHeader =
{
.type = 0,
- .v1 = 0,
+ .mapSec = MAPSEC_LITTLEROOT_TOWN,
.flag = FLAG_ENABLE_MOM_MATCH_CALL,
.desc = gMomMatchCallDesc,
.name = gMomMatchCallName,
@@ -396,7 +399,7 @@ static const match_call_text_data_t sStevenTextScripts[] = {
static const struct MatchCallStruct0 sStevenMatchCallHeader =
{
.type = 0,
- .v1 = 0xD5,
+ .mapSec = MAPSEC_NONE,
.flag = FLAG_REGISTERED_STEVEN_POKENAV,
.desc = gStevenMatchCallDesc,
.name = gStevenMatchCallName,
@@ -422,10 +425,10 @@ static const match_call_text_data_t sMayTextScripts[] = {
{ NULL, 0xFFFF, 0xFFFF }
};
-static const struct MatchCallStruct4 sBrendanMatchCallHeader =
+static const struct MatchCallStruct4 sMayMatchCallHeader =
{
.type = 4,
- .gender = MALE,
+ .gender = MALE, //Gender of player
.flag = FLAG_ENABLE_RIVAL_MATCH_CALL,
.desc = gMayBrendanMatchCallDesc,
.name = gExpandedPlaceholder_May,
@@ -451,10 +454,10 @@ static const match_call_text_data_t sBrendanTextScripts[] = {
{ NULL, 0xFFFF, 0xFFFF }
};
-static const struct MatchCallStruct4 sMayMatchCallHeader =
+static const struct MatchCallStruct4 sBrendanMatchCallHeader =
{
.type = 4,
- .gender = FEMALE,
+ .gender = FEMALE, //Gender of player
.flag = FLAG_ENABLE_RIVAL_MATCH_CALL,
.desc = gMayBrendanMatchCallDesc,
.name = gExpandedPlaceholder_Brendan,
@@ -473,16 +476,16 @@ static const match_call_text_data_t sWallyTextScripts[] = {
};
const struct MatchCallSubstruct2 sWallyAdditionalData[] = {
- { FLAG_HIDE_MAUVILLE_CITY_WALLY, 0x05 },
- { FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, 0xD5 },
- { FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY, 0x46 },
- { 0xFFFF, 0xD5 }
+ { FLAG_HIDE_MAUVILLE_CITY_WALLY, MAPSEC_VERDANTURF_TOWN },
+ { FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT, MAPSEC_NONE },
+ { FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY, MAPSEC_VICTORY_ROAD },
+ { 0xFFFF, MAPSEC_NONE }
};
static const struct MatchCallStruct2 sWallyMatchCallHeader =
{
.type = 2,
- .v1 = 0,
+ .mapSec = 0,
.flag = FLAG_ENABLE_WALLY_MATCH_CALL,
.rematchTableIdx = REMATCH_WALLY_3,
.desc = gWallyMatchCallDesc,
@@ -505,7 +508,7 @@ static const match_call_text_data_t sScottTextScripts[] = {
static const struct MatchCallStruct0 sScottMatchCallHeader =
{
.type = 0,
- .v1 = 0xD5,
+ .mapSec = MAPSEC_NONE,
.flag = FLAG_ENABLE_SCOTT_MATCH_CALL,
.desc = gScottMatchCallDesc,
.name = gScottMatchCallName,
@@ -523,7 +526,7 @@ static const match_call_text_data_t sRoxanneTextScripts[] = {
static const struct MatchCallStruct5 sRoxanneMatchCallHeader =
{
.type = 5,
- .v1 = 10,
+ .mapSec = MAPSEC_RUSTBORO_CITY,
.flag = FLAG_ENABLE_ROXANNE_MATCH_CALL,
.rematchTableIdx = REMATCH_ROXANNE,
.desc = gRoxanneMatchCallDesc,
@@ -542,7 +545,7 @@ static const match_call_text_data_t sBrawlyTextScripts[] = {
static const struct MatchCallStruct5 sBrawlyMatchCallHeader =
{
.type = 5,
- .v1 = 2,
+ .mapSec = MAPSEC_DEWFORD_TOWN,
.flag = FLAG_ENABLE_BRAWLY_MATCH_CALL,
.rematchTableIdx = REMATCH_BRAWLY,
.desc = gBrawlyMatchCallDesc,
@@ -561,7 +564,7 @@ static const match_call_text_data_t sWattsonTextScripts[] = {
static const struct MatchCallStruct5 sWattsonMatchCallHeader =
{
.type = 5,
- .v1 = 9,
+ .mapSec = MAPSEC_MAUVILLE_CITY,
.flag = FLAG_ENABLE_WATTSON_MATCH_CALL,
.rematchTableIdx = REMATCH_WATTSON,
.desc = gWattsonMatchCallDesc,
@@ -580,7 +583,7 @@ static const match_call_text_data_t sFlanneryTextScripts[] = {
static const struct MatchCallStruct5 sFlanneryMatchCallHeader =
{
.type = 5,
- .v1 = 3,
+ .mapSec = MAPSEC_LAVARIDGE_TOWN,
.flag = FLAG_ENABLE_FLANNERY_MATCH_CALL,
.rematchTableIdx = REMATCH_FLANNERY,
.desc = gFlanneryMatchCallDesc,
@@ -599,7 +602,7 @@ static const match_call_text_data_t sWinonaTextScripts[] = {
static const struct MatchCallStruct5 sWinonaMatchCallHeader =
{
.type = 5,
- .v1 = 11,
+ .mapSec = MAPSEC_FORTREE_CITY,
.flag = FLAG_ENABLE_WINONA_MATCH_CALL,
.rematchTableIdx = REMATCH_WINONA,
.desc = gWinonaMatchCallDesc,
@@ -618,7 +621,7 @@ static const match_call_text_data_t sTateLizaTextScripts[] = {
static const struct MatchCallStruct5 sTateLizaMatchCallHeader =
{
.type = 5,
- .v1 = 13,
+ .mapSec = MAPSEC_MOSSDEEP_CITY,
.flag = FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL,
.rematchTableIdx = REMATCH_TATE_AND_LIZA,
.desc = gTateLizaMatchCallDesc,
@@ -637,7 +640,7 @@ static const match_call_text_data_t sJuanTextScripts[] = {
static const struct MatchCallStruct5 sJuanMatchCallHeader =
{
.type = 5,
- .v1 = 14,
+ .mapSec = MAPSEC_SOOTOPOLIS_CITY,
.flag = FLAG_ENABLE_JUAN_MATCH_CALL,
.rematchTableIdx = REMATCH_JUAN,
.desc = gJuanMatchCallDesc,
@@ -653,7 +656,7 @@ static const match_call_text_data_t sSidneyTextScripts[] = {
static const struct MatchCallStruct5 sSidneyMatchCallHeader =
{
.type = 5,
- .v1 = 15,
+ .mapSec = MAPSEC_EVER_GRANDE_CITY,
.flag = FLAG_REMATCH_SIDNEY,
.rematchTableIdx = REMATCH_SIDNEY,
.desc = gEliteFourMatchCallDesc,
@@ -669,7 +672,7 @@ static const match_call_text_data_t sPhoebeTextScripts[] = {
static const struct MatchCallStruct5 sPhoebeMatchCallHeader =
{
.type = 5,
- .v1 = 15,
+ .mapSec = MAPSEC_EVER_GRANDE_CITY,
.flag = FLAG_REMATCH_PHOEBE,
.rematchTableIdx = REMATCH_PHOEBE,
.desc = gEliteFourMatchCallDesc,
@@ -685,7 +688,7 @@ static const match_call_text_data_t sGlaciaTextScripts[] = {
static const struct MatchCallStruct5 sGlaciaMatchCallHeader =
{
.type = 5,
- .v1 = 15,
+ .mapSec = MAPSEC_EVER_GRANDE_CITY,
.flag = FLAG_REMATCH_GLACIA,
.rematchTableIdx = REMATCH_GLACIA,
.desc = gEliteFourMatchCallDesc,
@@ -701,7 +704,7 @@ static const match_call_text_data_t sDrakeTextScripts[] = {
static const struct MatchCallStruct5 sDrakeMatchCallHeader =
{
.type = 5,
- .v1 = 15,
+ .mapSec = MAPSEC_EVER_GRANDE_CITY,
.flag = FLAG_REMATCH_DRAKE,
.rematchTableIdx = REMATCH_DRAKE,
.desc = gEliteFourMatchCallDesc,
@@ -717,7 +720,7 @@ static const match_call_text_data_t sWallaceTextScripts[] = {
static const struct MatchCallStruct5 sWallaceMatchCallHeader =
{
.type = 5,
- .v1 = 15,
+ .mapSec = MAPSEC_EVER_GRANDE_CITY,
.flag = FLAG_REMATCH_WALLACE,
.rematchTableIdx = REMATCH_WALLACE,
.desc = gChampionMatchCallDesc,
@@ -726,90 +729,90 @@ static const struct MatchCallStruct5 sWallaceMatchCallHeader =
};
static const match_call_t sMatchCallHeaders[] = {
- {.type0 = &sMrStoneMatchCallHeader},
- {.type3 = &sProfBirchMatchCallHeader},
- {.type4 = &sMayMatchCallHeader},
- {.type4 = &sBrendanMatchCallHeader},
- {.type2 = &sWallyMatchCallHeader},
- {.type5 = &sNormanMatchCallHeader},
- {.type0 = &sMomMatchCallHeader},
- {.type0 = &sStevenMatchCallHeader},
- {.type0 = &sScottMatchCallHeader},
- {.type5 = &sRoxanneMatchCallHeader},
- {.type5 = &sBrawlyMatchCallHeader},
- {.type5 = &sWattsonMatchCallHeader},
- {.type5 = &sFlanneryMatchCallHeader},
- {.type5 = &sWinonaMatchCallHeader},
- {.type5 = &sTateLizaMatchCallHeader},
- {.type5 = &sJuanMatchCallHeader},
- {.type5 = &sSidneyMatchCallHeader},
- {.type5 = &sPhoebeMatchCallHeader},
- {.type5 = &sGlaciaMatchCallHeader},
- {.type5 = &sDrakeMatchCallHeader},
- {.type5 = &sWallaceMatchCallHeader}
+ [MC_HEADER_MR_STONE] = {.type0 = &sMrStoneMatchCallHeader},
+ [MC_HEADER_PROF_BIRCH] = {.type3 = &sProfBirchMatchCallHeader},
+ [MC_HEADER_BRENDAN] = {.type4 = &sBrendanMatchCallHeader},
+ [MC_HEADER_MAY] = {.type4 = &sMayMatchCallHeader},
+ [MC_HEADER_WALLY] = {.type2 = &sWallyMatchCallHeader},
+ [MC_HEADER_NORMAN] = {.type5 = &sNormanMatchCallHeader},
+ [MC_HEADER_MOM] = {.type0 = &sMomMatchCallHeader},
+ [MC_HEADER_STEVEN] = {.type0 = &sStevenMatchCallHeader},
+ [MC_HEADER_SCOTT] = {.type0 = &sScottMatchCallHeader},
+ [MC_HEADER_ROXANNE] = {.type5 = &sRoxanneMatchCallHeader},
+ [MC_HEADER_BRAWLY] = {.type5 = &sBrawlyMatchCallHeader},
+ [MC_HEADER_WATTSON] = {.type5 = &sWattsonMatchCallHeader},
+ [MC_HEADER_FLANNERY] = {.type5 = &sFlanneryMatchCallHeader},
+ [MC_HEADER_WINONA] = {.type5 = &sWinonaMatchCallHeader},
+ [MC_HEADER_TATE_LIZA] = {.type5 = &sTateLizaMatchCallHeader},
+ [MC_HEADER_JUAN] = {.type5 = &sJuanMatchCallHeader},
+ [MC_HEADER_SIDNEY] = {.type5 = &sSidneyMatchCallHeader},
+ [MC_HEADER_PHOEBE] = {.type5 = &sPhoebeMatchCallHeader},
+ [MC_HEADER_GLACIA] = {.type5 = &sGlaciaMatchCallHeader},
+ [MC_HEADER_DRAKE] = {.type5 = &sDrakeMatchCallHeader},
+ [MC_HEADER_WALLACE] = {.type5 = &sWallaceMatchCallHeader}
};
static bool32 (*const sMatchCallGetFlagFuncs[])(match_call_t) = {
MatchCallGetFlag_Type0,
MatchCallGetFlag_Type1,
MatchCallGetFlag_Type2,
- MatchCallGetFlag_Type3,
- MatchCallGetFlag_Type4
+ MatchCallGetFlag_Type4,
+ MatchCallGetFlag_Type3
};
-static u8 (*const gUnknown_08625310[])(match_call_t) = {
- sub_81D1714,
- sub_81D1718,
- sub_81D171C,
- sub_81D1750,
- sub_81D1754
+static u8 (*const sMatchCallGetMapSecFuncs[])(match_call_t) = {
+ MatchCallGetMapSec_Type0,
+ MatchCallGetMapSec_Type1,
+ MatchCallGetMapSec_Type2,
+ MatchCallGetMapSec_Type4,
+ MatchCallGetMapSec_Type3
};
static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = {
MatchCall_IsRematchable_Type0,
MatchCall_IsRematchable_Type1,
MatchCall_IsRematchable_Type2,
- MatchCall_IsRematchable_Type3,
- MatchCall_IsRematchable_Type4
+ MatchCall_IsRematchable_Type4,
+ MatchCall_IsRematchable_Type3
};
-static bool32 (*const gUnknown_08625338[])(match_call_t) = {
- sub_81D1840,
- sub_81D1844,
- sub_81D1848,
- sub_81D184C,
- sub_81D1850
+static bool32 (*const sMatchCall_HasCheckPageFunctions[])(match_call_t) = {
+ MatchCall_HasCheckPage_Type0,
+ MatchCall_HasCheckPage_Type1,
+ MatchCall_HasCheckPage_Type2,
+ MatchCall_HasCheckPage_Type4,
+ MatchCall_HasCheckPage_Type3
};
static u32 (*const sMatchCall_GetRematchTableIdxFunctions[])(match_call_t) = {
MatchCall_GetRematchTableIdx_Type0,
MatchCall_GetRematchTableIdx_Type1,
MatchCall_GetRematchTableIdx_Type2,
- MatchCall_GetRematchTableIdx_Type3,
- MatchCall_GetRematchTableIdx_Type4
+ MatchCall_GetRematchTableIdx_Type4,
+ MatchCall_GetRematchTableIdx_Type3
};
static void (*const sMatchCall_GetMessageFunctions[])(match_call_t, u8 *) = {
MatchCall_GetMessage_Type0,
MatchCall_GetMessage_Type1,
MatchCall_GetMessage_Type2,
- MatchCall_GetMessage_Type3,
- MatchCall_GetMessage_Type4
+ MatchCall_GetMessage_Type4,
+ MatchCall_GetMessage_Type3
};
static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8 **, const u8 **) = {
MatchCall_GetNameAndDesc_Type0,
MatchCall_GetNameAndDesc_Type1,
MatchCall_GetNameAndDesc_Type2,
- MatchCall_GetNameAndDesc_Type3,
- MatchCall_GetNameAndDesc_Type4
+ MatchCall_GetNameAndDesc_Type4,
+ MatchCall_GetNameAndDesc_Type3
};
-static const struct UnkStruct_08625388 sMatchCallCheckPageOverrides[] = {
- { 7, 0x4B, 0xffff, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN
- { 7, 0x4B, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN
- { 2, 0x3c, 0xffff, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan
- { 3, 0x3f, 0xffff, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May
+static const struct MatchCallOverride sMatchCallCheckPageOverrides[] = {
+ { MC_HEADER_STEVEN, FACILITY_CLASS_STEVEN, 0xFFFF, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN
+ { MC_HEADER_STEVEN, FACILITY_CLASS_STEVEN, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN
+ { MC_HEADER_BRENDAN, FACILITY_CLASS_BRENDAN, 0xFFFF, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan
+ { MC_HEADER_MAY, FACILITY_CLASS_MAY, 0xFFFF, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May
};
// .text
@@ -883,7 +886,7 @@ static bool32 MatchCallGetFlag_Type2(match_call_t matchCall)
return FlagGet(matchCall.type2->flag);
}
-static bool32 MatchCallGetFlag_Type3(match_call_t matchCall)
+static bool32 MatchCallGetFlag_Type4(match_call_t matchCall)
{
if (matchCall.type4->gender != gSaveBlock2Ptr->playerGender)
return FALSE;
@@ -892,12 +895,12 @@ static bool32 MatchCallGetFlag_Type3(match_call_t matchCall)
return FlagGet(matchCall.type4->flag);
}
-static bool32 MatchCallGetFlag_Type4(match_call_t matchCall)
+static bool32 MatchCallGetFlag_Type3(match_call_t matchCall)
{
return FlagGet(matchCall.type3->flag);
}
-u8 sub_81D16DC(u32 idx)
+u8 MatchCallMapSecGetByIndex(u32 idx)
{
match_call_t matchCall;
u32 i;
@@ -906,20 +909,20 @@ u8 sub_81D16DC(u32 idx)
return 0;
matchCall = sMatchCallHeaders[idx];
i = MatchCallGetFunctionIndex(matchCall);
- return gUnknown_08625310[i](matchCall);
+ return sMatchCallGetMapSecFuncs[i](matchCall);
}
-static u8 sub_81D1714(match_call_t matchCall)
+static u8 MatchCallGetMapSec_Type0(match_call_t matchCall)
{
- return matchCall.type0->v1;
+ return matchCall.type0->mapSec;
}
-static u8 sub_81D1718(match_call_t matchCall)
+static u8 MatchCallGetMapSec_Type1(match_call_t matchCall)
{
- return matchCall.type1->v1;
+ return matchCall.type1->mapSec;
}
-static u8 sub_81D171C(match_call_t matchCall)
+static u8 MatchCallGetMapSec_Type2(match_call_t matchCall)
{
s32 i;
@@ -928,17 +931,17 @@ static u8 sub_81D171C(match_call_t matchCall)
if (!FlagGet(matchCall.type2->v10[i].flag))
break;
}
- return matchCall.type2->v10[i].v2;
+ return matchCall.type2->v10[i].mapSec;
}
-static u8 sub_81D1750(match_call_t matchCall)
+static u8 MatchCallGetMapSec_Type4(match_call_t matchCall)
{
- return 0xd5;
+ return MAPSEC_NONE;
}
-static u8 sub_81D1754(match_call_t matchCall)
+static u8 MatchCallGetMapSec_Type3(match_call_t matchCall)
{
- return 0xd5;
+ return MAPSEC_NONE;
}
bool32 MatchCall_IsRematchable(u32 idx)
@@ -970,17 +973,17 @@ static bool32 MatchCall_IsRematchable_Type2(match_call_t matchCall)
return gSaveBlock1Ptr->trainerRematches[matchCall.type2->rematchTableIdx] ? TRUE : FALSE;
}
-static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall)
+static bool32 MatchCall_IsRematchable_Type4(match_call_t matchCall)
{
return FALSE;
}
-static bool32 MatchCall_IsRematchable_Type4(match_call_t matchCall)
+static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall)
{
return FALSE;
}
-bool32 sub_81D17E8(u32 idx)
+bool32 MatchCall_HasCheckPage(u32 idx)
{
match_call_t matchCall;
u32 i;
@@ -989,7 +992,7 @@ bool32 sub_81D17E8(u32 idx)
return FALSE;
matchCall = sMatchCallHeaders[idx];
i = MatchCallGetFunctionIndex(matchCall);
- if (gUnknown_08625338[i](matchCall))
+ if (sMatchCall_HasCheckPageFunctions[i](matchCall))
return TRUE;
for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++)
{
@@ -999,27 +1002,27 @@ bool32 sub_81D17E8(u32 idx)
return FALSE;
}
-static bool32 sub_81D1840(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type0(match_call_t matchCall)
{
return FALSE;
}
-static bool32 sub_81D1844(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type1(match_call_t matchCall)
{
return TRUE;
}
-static bool32 sub_81D1848(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type2(match_call_t matchCall)
{
return TRUE;
}
-static bool32 sub_81D184C(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type4(match_call_t matchCall)
{
return FALSE;
}
-static bool32 sub_81D1850(match_call_t matchCall)
+static bool32 MatchCall_HasCheckPage_Type3(match_call_t matchCall)
{
return FALSE;
}
@@ -1051,12 +1054,12 @@ static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t matchCall)
return matchCall.type2->rematchTableIdx;
}
-static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t matchCall)
+static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t matchCall)
{
return REMATCH_TABLE_ENTRIES;
}
-static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t matchCall)
+static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t matchCall)
{
return REMATCH_TABLE_ENTRIES;
}
@@ -1091,12 +1094,12 @@ static void MatchCall_GetMessage_Type2(match_call_t matchCall, u8 *dest)
sub_81D1920(matchCall.type2->textData, dest);
}
-static void MatchCall_GetMessage_Type3(match_call_t matchCall, u8 *dest)
+static void MatchCall_GetMessage_Type4(match_call_t matchCall, u8 *dest)
{
sub_81D1920(matchCall.type4->textData, dest);
}
-static void MatchCall_GetMessage_Type4(match_call_t matchCall, u8 *dest)
+static void MatchCall_GetMessage_Type3(match_call_t matchCall, u8 *dest)
{
sub_8197080(dest);
}
@@ -1190,13 +1193,13 @@ static void MatchCall_GetNameAndDesc_Type2(match_call_t matchCall, const u8 **de
*desc = matchCall.type2->desc;
}
-static void MatchCall_GetNameAndDesc_Type3(match_call_t matchCall, const u8 **desc, const u8 **name)
+static void MatchCall_GetNameAndDesc_Type4(match_call_t matchCall, const u8 **desc, const u8 **name)
{
*desc = matchCall.type4->desc;
*name = matchCall.type4->name;
}
-static void MatchCall_GetNameAndDesc_Type4(match_call_t matchCall, const u8 **desc, const u8 **name)
+static void MatchCall_GetNameAndDesc_Type3(match_call_t matchCall, const u8 **desc, const u8 **name)
{
*desc = matchCall.type3->desc;
*name = matchCall.type3->name;
@@ -1209,8 +1212,7 @@ static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const
*name = trainer->trainerName;
}
-#ifdef NONMATCHING
-const u8 *sub_81D1B40(u32 idx, u32 offset)
+const u8 *MatchCall_GetOverrideFlavorText(u32 idx, u32 offset)
{
u32 i;
@@ -1218,104 +1220,30 @@ const u8 *sub_81D1B40(u32 idx, u32 offset)
{
if (sMatchCallCheckPageOverrides[i].idx == idx)
{
- for (; i + 1 < ARRAY_COUNT(sMatchCallCheckPageOverrides) && sMatchCallCheckPageOverrides[i + 1].idx == idx; i++)
+ while (1)
{
- if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4))
+ if (i + 1 >= ARRAY_COUNT(sMatchCallCheckPageOverrides))
break;
+ if (sMatchCallCheckPageOverrides[i + 1].idx != idx)
+ break;
+ if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].flag))
+ break;
+ i++;
}
- return sMatchCallCheckPageOverrides[i].v8[offset];
+ return sMatchCallCheckPageOverrides[i].flavorTexts[offset];
}
}
return NULL;
}
-#else
-NAKED const u8 *sub_81D1B40(u32 idx, u32 offset)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r9\n"
- "\tmov r6, r8\n"
- "\tpush {r6,r7}\n"
- "\tadds r6, r0, 0\n"
- "\tmovs r5, 0\n"
- "\tldr r2, =sMatchCallCheckPageOverrides\n"
- "\tmovs r0, 0x8\n"
- "\tadds r0, r2\n"
- "\tmov r9, r0\n"
- "_081D1B54:\n"
- "\tlsls r0, r5, 1\n"
- "\tadds r0, r5\n"
- "\tlsls r0, 3\n"
- "\tadds r0, r2\n"
- "\tldrh r0, [r0]\n"
- "\tcmp r0, r6\n"
- "\tbne _081D1BBC\n"
- "\tadds r4, r5, 0x1\n"
- "\tlsls r1, 2\n"
- "\tmov r8, r1\n"
- "\tcmp r4, 0x3\n"
- "\tbhi _081D1BA8\n"
- "\tlsls r0, r4, 1\n"
- "\tadds r0, r4\n"
- "\tlsls r0, 3\n"
- "\tadds r0, r2\n"
- "\tldrh r0, [r0]\n"
- "\tcmp r0, r6\n"
- "\tbne _081D1BA8\n"
- "\tldr r7, =sMatchCallCheckPageOverrides\n"
- "_081D1B7C:\n"
- "\tlsls r0, r4, 1\n"
- "\tadds r0, r4\n"
- "\tlsls r0, 3\n"
- "\tadds r1, r7, 0x4\n"
- "\tadds r0, r1\n"
- "\tldrh r0, [r0]\n"
- "\tbl FlagGet\n"
- "\tlsls r0, 24\n"
- "\tcmp r0, 0\n"
- "\tbeq _081D1BA8\n"
- "\tadds r5, r4, 0\n"
- "\tadds r4, r5, 0x1\n"
- "\tcmp r4, 0x3\n"
- "\tbhi _081D1BA8\n"
- "\tlsls r0, r4, 1\n"
- "\tadds r0, r4\n"
- "\tlsls r0, 3\n"
- "\tadds r0, r7\n"
- "\tldrh r0, [r0]\n"
- "\tcmp r0, r6\n"
- "\tbeq _081D1B7C\n"
- "_081D1BA8:\n"
- "\tlsls r0, r5, 1\n"
- "\tadds r0, r5\n"
- "\tlsls r0, 3\n"
- "\tadd r0, r8\n"
- "\tadd r0, r9\n"
- "\tldr r0, [r0]\n"
- "\tb _081D1BC4\n"
- "\t.pool\n"
- "_081D1BBC:\n"
- "\tadds r5, 0x1\n"
- "\tcmp r5, 0x3\n"
- "\tbls _081D1B54\n"
- "\tmovs r0, 0\n"
- "_081D1BC4:\n"
- "\tpop {r3,r4}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tpop {r4-r7}\n"
- "\tpop {r1}\n"
- "\tbx r1");
-}
-#endif
-int sub_81D1BD0(u32 idx)
+int MatchCall_GetOverrideFacilityClass(u32 idx)
{
u32 i;
for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++)
{
if (sMatchCallCheckPageOverrides[i].idx == idx)
- return sMatchCallCheckPageOverrides[i].v2;
+ return sMatchCallCheckPageOverrides[i].facilityClass;
}
return -1;
}
diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c
index bae3a8d7a..275a4063e 100644
--- a/src/pokenav_match_call_ui.c
+++ b/src/pokenav_match_call_ui.c
@@ -31,22 +31,22 @@ struct MatchCallWindowState {
u16 visibleEntries;
u16 unkA;
u32 unkC;
- u32 unk10;
+ void * unk10;
};
-struct UnknownInnerStruct_81C81D4
+struct PokenavSub17Substruct
{
struct UnknownSubSubStruct_0203CF40 unk0;
u32 unk10;
u32 unk14;
u32 unk18;
- u32 unk1C;
+ void * unk1C;
s32 unk20;
s32 unk24;
u32 unk28;
s32 unk2C;
u32 unk30;
- void (*unk34)(u32, u8*);
+ void (*unk34)(struct PokenavMonList *, u8*);
void (*unk38)(u16, u32, u32);
struct Sprite *rightArrow;
struct Sprite *upArrow;
@@ -55,155 +55,59 @@ struct UnknownInnerStruct_81C81D4
};
// Generally at index 0x11 (17)
-struct UnknownSubStruct_81C81D4
+struct PokenavSub17
{
- struct UnknownInnerStruct_81C81D4 unk0;
+ struct PokenavSub17Substruct unk0;
u8 tilemapBuffer[0x800];
struct MatchCallWindowState unk888;
- u32 unk89C;
+ s32 unk89C;
u32 unk8A0;
};
extern void sub_81DB620(u32 windowId, u32 a1, u32 a2, u32 a3, u32 a4);
-void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0);
-u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3);
+void sub_81C82E4(struct PokenavSub17 *a0);
+bool32 sub_81C91AC(struct PokenavSub17Substruct *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3);
void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1);
void SpriteCB_MatchCallUpArrow(struct Sprite *sprite);
void SpriteCB_MatchCallDownArrow(struct Sprite *sprite);
void SpriteCB_MatchCallRightArrow(struct Sprite *sprite);
-void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, u32 a1);
-void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0);
-void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
+void ToggleMatchCallArrows(struct PokenavSub17Substruct *a0, u32 a1);
+void sub_81C8FE0(struct PokenavSub17Substruct *a0);
+void sub_81C8EF8(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
void sub_81C8ED0(void);
-void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2);
-void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 a1);
-void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
-void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
-void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2);
-void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1);
-void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5);
-void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
+void sub_81C8E54(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1, u32 a2);
+void PrintMatchCallFieldNames(struct PokenavSub17Substruct *a0, u32 a1);
+void sub_81C8D4C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
+void sub_81C8CB4(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
+void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, s32 a1, s32 a2);
+void sub_81C8568(s32 a0, struct PokenavSub17Substruct *a1);
+void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *a5);
+void sub_81C837C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1);
void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0);
-u32 LoopedTask_sub_81C8254(s32 a0);
+u32 LoopedTask_sub_81C8254(s32 state);
bool32 sub_81C83E0(void);
-u32 LoopedTask_sub_81C83F0(s32 a0);
-u32 LoopedTask_sub_81C85A0(s32 a0);
-u32 LoopedTask_sub_81C8870(s32 a0);
-u32 LoopedTask_sub_81C8A28(s32 a0);
-u32 LoopedTask_sub_81C8958(s32 a0);
+u32 LoopedTask_sub_81C83F0(s32 state);
+u32 LoopedTask_sub_81C85A0(s32 state);
+u32 LoopedTask_sub_81C8870(s32 state);
+u32 LoopedTask_sub_81C8A28(s32 state);
+u32 LoopedTask_sub_81C8958(s32 state);
static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal");
static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz");
-static const u8 sPokenavColors_0861FBE4[] =
-{
- 0, 2, 5
-};
-
-static const u8 *const sMatchCallFieldNames[] =
-{
- gText_PokenavMatchCall_Strategy,
- gText_PokenavMatchCall_TrainerPokemon,
- gText_PokenavMatchCall_SelfIntroduction
-};
-
-static const u8 sMatchCallFieldColors[] =
-{
- 1, 4, 5
-};
-
-static const u8 sUnknown_0861FBF7[] =
-{
- 2, 4, 6, 7, 0
-};
-
-static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheets[] =
-{
- {
- .data = sMatchcallArrowSpriteSheetData,
- .size = 192,
- .tag = 0xA
- }
-};
-
-static const struct SpritePalette sMatchcallArrowPalettes[] =
-{
- {
- .data = sMatchcallArrowPaletteData,
- .tag = 0x14
- },
- {}
-};
-
-static const struct OamData sMatchCallRightArrowSpriteOam =
-{
- .y = 0,
- .affineMode = ST_OAM_AFFINE_OFF,
- .objMode = ST_OAM_OBJ_NORMAL,
- .bpp = ST_OAM_4BPP,
- .shape = SPRITE_SHAPE(8x16),
- .x = 0,
- .size = SPRITE_SIZE(8x16),
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0
-};
-
-static const struct SpriteTemplate sMatchCallRightArrowSprite =
-{
- .tileTag = 0xA,
- .paletteTag = 0x14,
- .oam = &sMatchCallRightArrowSpriteOam,
- .anims = gDummySpriteAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCB_MatchCallRightArrow
-};
-
-static const struct OamData sMatchCallUpDownArrowSpriteOam =
-{
- .y = 0,
- .affineMode = ST_OAM_AFFINE_OFF,
- .objMode = ST_OAM_OBJ_NORMAL,
- .bpp = ST_OAM_4BPP,
- .shape = SPRITE_SHAPE(16x8),
- .x = 0,
- .size = SPRITE_SIZE(16x8),
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0
-};
-
-static const struct SpriteTemplate sMatchCallUpDownArrowSprite =
-{
- .tileTag = 0xA,
- .paletteTag = 0x14,
- .oam = &sMatchCallUpDownArrowSpriteOam,
- .anims = gDummySpriteAnimTable,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = SpriteCallbackDummy
-};
-
EWRAM_DATA u32 gUnknown_0203CF44 = 0;
bool32 sub_81C81D4(const struct BgTemplate *arg0, struct MatchCallListTemplate *arg1, s32 arg2)
{
- u32 v1;
- struct UnknownSubStruct_81C81D4 *structPtr;
-
- structPtr = AllocSubstruct(0x11, sizeof(struct UnknownSubStruct_81C81D4));
-
+ struct PokenavSub17 *structPtr = AllocSubstruct(17, sizeof(struct PokenavSub17));
if (structPtr == NULL)
return FALSE;
-
- sub_81C9160(&structPtr->unk888, arg1);
- v1 = sub_81C91AC(&structPtr->unk0, arg0, arg1, arg2);
- if (v1 == 0)
+ sub_81C9160(&structPtr->unk888, arg1);
+ if (!sub_81C91AC(&structPtr->unk0, arg0, arg1, arg2))
return FALSE;
-
+
CreateLoopedTask(LoopedTask_sub_81C8254, 6);
return TRUE;
}
@@ -215,59 +119,59 @@ bool32 sub_81C8224(void)
void sub_81C8234(void)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
+ struct PokenavSub17 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ structPtr = GetSubstructPtr(17);
sub_81C8FE0(&structPtr->unk0);
RemoveWindow(structPtr->unk0.unk0.windowId);
- FreePokenavSubstruct(0x11);
+ FreePokenavSubstruct(17);
}
-u32 LoopedTask_sub_81C8254(s32 a0)
+u32 LoopedTask_sub_81C8254(s32 state)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
+ struct PokenavSub17 *structPtr;
if (IsDma3ManagerBusyWithBgCopy())
return 2;
-
- structPtr = GetSubstructPtr(0x11);
- switch (a0)
+ structPtr = GetSubstructPtr(17);
+
+ switch (state)
{
- case 0:
- sub_81C82E4(structPtr);
- return 0;
- case 1:
- sub_81C835C(&structPtr->unk0.unk0);
- return 0;
- case 2:
- sub_81C837C(&structPtr->unk888, &structPtr->unk0);
- return 0;
- case 3:
- if (sub_81C83E0())
- {
- return 2;
- }
- else
- {
- sub_81C8ED0();
- return 1;
- }
- case 4:
- sub_81C8EF8(&structPtr->unk888, &structPtr->unk0);
- return 4;
- default:
- return 4;
+ case 0:
+ sub_81C82E4(structPtr);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ sub_81C835C(&structPtr->unk0.unk0);
+ return LT_INC_AND_PAUSE;
+ case 2:
+ sub_81C837C(&structPtr->unk888, &structPtr->unk0);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (sub_81C83E0())
+ {
+ return LT_PAUSE;
+ }
+ else
+ {
+ sub_81C8ED0();
+ return LT_INC_AND_CONTINUE;
+ }
+ case 4:
+ sub_81C8EF8(&structPtr->unk888, &structPtr->unk0);
+ return LT_FINISH;
+ default:
+ return LT_FINISH;
}
}
-void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0)
+void sub_81C82E4(struct PokenavSub17 *a0)
{
- u16 v1 = (a0->unk0.unk0.unk1 << 12) | a0->unk0.unk0.unk6;
+ u16 tileNum = (a0->unk0.unk0.unk1 << 12) | a0->unk0.unk0.unk6;
sub_8199DF0(a0->unk0.unk0.bg, PIXEL_FILL(1), a0->unk0.unk0.unk6, 1);
sub_8199DF0(a0->unk0.unk0.bg, PIXEL_FILL(4), a0->unk0.unk0.unk6 + 1, 1);
SetBgTilemapBuffer(a0->unk0.unk0.bg, a0->tilemapBuffer);
- FillBgTilemapBufferRect_Palette0(a0->unk0.unk0.bg, v1, 0, 0, 32, 32);
+ FillBgTilemapBufferRect_Palette0(a0->unk0.unk0.bg, tileNum, 0, 0, 32, 32);
ChangeBgY(a0->unk0.unk0.bg, 0, 0);
ChangeBgX(a0->unk0.unk0.bg, 0, 0);
ChangeBgY(a0->unk0.unk0.bg, a0->unk0.unk0.unk3 << 11, 2);
@@ -281,20 +185,16 @@ void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0)
CopyWindowToVram(a0->windowId, 1);
}
-void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+void sub_81C837C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1)
{
- s32 v1;
- s32 v2;
-
- // TODO: Clean this up.
- v1 = a0->listLength - a0->windowTopIndex;
- v2 = a0->visibleEntries;
- if (v1 > a0->visibleEntries)
- v1 = v2;
- sub_81C83AC(a0->unk10, a0->windowTopIndex, v1, a0->unkC, 0, a1);
+ s32 arg2 = a0->listLength - a0->windowTopIndex;
+ if (arg2 > a0->visibleEntries)
+ arg2 = a0->visibleEntries;
+
+ sub_81C83AC(a0->unk10, a0->windowTopIndex, arg2, a0->unkC, 0, a1);
}
-void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5)
+void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *a5)
{
if (a2 == 0)
return;
@@ -313,108 +213,83 @@ bool32 sub_81C83E0(void)
return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0);
}
-u32 LoopedTask_sub_81C83F0(s32 a0)
+u32 LoopedTask_sub_81C83F0(s32 state)
{
- struct UnknownInnerStruct_81C81D4 *structPtr;
u32 v1;
+ struct PokenavSub17Substruct *structPtr = GetSubstructPtr(17);
- structPtr = &((struct UnknownSubStruct_81C81D4*)GetSubstructPtr(0x11))->unk0;
- switch (a0)
+ switch (state)
{
case 0:
v1 = (structPtr->unk0.unkA + structPtr->unk0.unkC + structPtr->unk10) & 0xF;
structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer);
if (structPtr->unk38 != NULL)
- // Accessing unk0.windowId as if it were a u16...?
- // It's accessed as a u8 again in the very next line...
- structPtr->unk38(*(u16*)(&structPtr->unk0.windowId), structPtr->unk14, v1);
-
+ structPtr->unk38(structPtr->unk0.windowId, structPtr->unk14, v1);
+
AddTextPrinterParameterized(structPtr->unk0.windowId, structPtr->unk0.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL);
-
if (++structPtr->unk0.unkC >= structPtr->unk0.unkE)
{
if (structPtr->unk38 != NULL)
CopyWindowToVram(structPtr->unk0.windowId, 3);
else
CopyWindowToVram(structPtr->unk0.windowId, 2);
- return 0;
+ return LT_INC_AND_PAUSE;
}
else
{
structPtr->unk1C += structPtr->unk18;
structPtr->unk14++;
- return 3;
+ return LT_CONTINUE;
}
case 1:
if (IsDma3ManagerBusyWithBgCopy())
- return 2;
- else
- return 4;
- default:
- return 4;
+ return LT_PAUSE;
+ return LT_FINISH;
}
+ return LT_FINISH;
}
bool32 ShouldShowUpArrow(void)
{
- u16 v1;
- s32 v2;
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
- return structPtr->unk888.windowTopIndex != 0;
+ return (structPtr->unk888.windowTopIndex != 0);
}
bool32 ShouldShowDownArrow(void)
{
- struct MatchCallWindowState *subPtr;
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
- subPtr = &structPtr->unk888;
-
- return subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength;
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
+ struct MatchCallWindowState *subPtr = &structPtr->unk888;
+
+ return (subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength);
}
-void MatchCall_MoveWindow(s32 a0, bool32 a1_)
+void MatchCall_MoveWindow(s32 a0, bool32 a1)
{
- register bool32 a1 asm("r4")= a1_;
- s32 v1;
- struct UnknownSubStruct_81C81D4 *structPtr = GetSubstructPtr(0x11);
- register struct MatchCallWindowState *subPtr asm("r5") = &structPtr->unk888;
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
+ struct MatchCallWindowState *subPtr = &structPtr->unk888;
if (a0 < 0)
{
- u16 temp = subPtr->windowTopIndex;
- if (temp + a0 < 0)
- v1 = -1 * temp;
- else
- v1 = a0;
+ if (subPtr->windowTopIndex + a0 < 0)
+ a0 = -1 * subPtr->windowTopIndex;
if (a1)
- sub_81C83AC(subPtr->unk10, temp + v1, v1 * -1, subPtr->unkC, v1, &structPtr->unk0);
+ sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + a0, a0 * -1, subPtr->unkC, a0, &structPtr->unk0);
}
else if (a1)
{
s32 temp = gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries;
- s32 listLength;
- if (temp + a0 >= (listLength = subPtr->listLength))
- v1 = listLength - temp;
- else
- v1 = a0;
-
- sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, v1, subPtr->unkC, subPtr->visibleEntries, &structPtr->unk0);
- // Needed to prevent GCC from combining the two sub_81C83AC calls.
- asm("");
- }
- else
- {
- v1 = a0;
+ if (temp + a0 >= subPtr->listLength)
+ a0 = subPtr->listLength - temp;
+
+ sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, a0, subPtr->unkC, subPtr->visibleEntries, &structPtr->unk0);
}
-
- sub_81C8568(v1, &structPtr->unk0);
- subPtr->windowTopIndex += v1;
+
+ sub_81C8568(a0, &structPtr->unk0);
+ subPtr->windowTopIndex += a0;
}
-void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1)
+void sub_81C8568(s32 a0, struct PokenavSub17Substruct *a1)
{
a1->unk20 = GetBgY(a1->unk0.bg);
a1->unk24 = a1->unk20 + (a0 << 12);
@@ -426,123 +301,98 @@ void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1)
a1->unk28 = CreateLoopedTask(LoopedTask_sub_81C85A0, 6);
}
-u32 LoopedTask_sub_81C85A0(s32 a0)
+u32 LoopedTask_sub_81C85A0(s32 state)
{
- s32 y;
- s32 v1;
+ s32 y, v1;
bool32 flag;
- struct UnknownInnerStruct_81C81D4 *structPtr;
- structPtr = &((struct UnknownSubStruct_81C81D4 *)GetSubstructPtr(0x11))->unk0;
-
- switch (a0)
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
+ struct PokenavSub17Substruct *subPtr = &structPtr->unk0;
+
+ switch (state)
{
case 0:
- if (sub_81C83E0() == FALSE)
- return 1;
- else
- return 2;
+ if (!sub_81C83E0())
+ return LT_INC_AND_CONTINUE;
+ return LT_PAUSE;
case 1:
flag = FALSE;
- y = GetBgY(structPtr->unk0.bg);
- v1 = ChangeBgY(structPtr->unk0.bg, 0x1000, structPtr->unk30);
- if (structPtr->unk30 == 2)
+ y = GetBgY(subPtr->unk0.bg);
+ v1 = ChangeBgY(subPtr->unk0.bg, 0x1000, subPtr->unk30);
+ if (subPtr->unk30 == 2)
{
- if ((y > structPtr->unk24 || y <= structPtr->unk20) && v1 <= structPtr->unk24)
- {
+ if ((y > subPtr->unk24 || y <= subPtr->unk20) && v1 <= subPtr->unk24)
flag = TRUE;
- }
}
else
{
- if ((y < structPtr->unk24 || y >= structPtr->unk20) && v1 >= structPtr->unk24)
- {
+ if ((y < subPtr->unk24 || y >= subPtr->unk20) && v1 >= subPtr->unk24)
flag = TRUE;
- }
}
+
if (flag)
{
- structPtr->unk0.unkA = (structPtr->unk0.unkA + structPtr->unk2C) & 0xF;
- ChangeBgY(structPtr->unk0.bg, structPtr->unk24, 0);
- return 4;
- }
- else
- {
- return 2;
+ subPtr->unk0.unkA = (subPtr->unk0.unkA + subPtr->unk2C) & 0xF;
+ ChangeBgY(subPtr->unk0.bg, subPtr->unk24, 0);
+ return LT_FINISH;
}
- default:
- return 4;
+ return LT_PAUSE;
}
+ return LT_FINISH;
}
bool32 sub_81C8630(void)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
return IsLoopedTaskActive(structPtr->unk0.unk28);
}
struct MatchCallWindowState *GetMatchCallWindowStruct(void)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
return &structPtr->unk888;
}
int MatchCall_MoveCursorUp(void)
{
- struct MatchCallWindowState *structPtr;
- structPtr = GetMatchCallWindowStruct();
+ struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
if (structPtr->selectedIndexOffset != 0)
{
structPtr->selectedIndexOffset--;
return 1;
}
- else
+ if (ShouldShowUpArrow())
{
- if (ShouldShowUpArrow())
- {
- MatchCall_MoveWindow(-1, TRUE);
- return 2;
- }
- else
- {
- return 0;
- }
+ MatchCall_MoveWindow(-1, TRUE);
+ return 2;
}
+ return 0;
}
int MatchCall_MoveCursorDown(void)
{
- struct MatchCallWindowState *structPtr;
- structPtr = GetMatchCallWindowStruct();
+ struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
- if (structPtr->windowTopIndex + structPtr->selectedIndexOffset < structPtr->listLength - 1)
+ if (structPtr->windowTopIndex + structPtr->selectedIndexOffset >= structPtr->listLength - 1)
+ return 0;
+ if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1)
{
- if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1)
- {
- structPtr->selectedIndexOffset++;
- return 1;
- }
- else if (!ShouldShowDownArrow())
- {
- return 0;
- }
+ structPtr->selectedIndexOffset++;
+ return 1;
}
- else
+ if (ShouldShowDownArrow())
{
- return 0;
+ MatchCall_MoveWindow(1, TRUE);
+ return 2;
}
- MatchCall_MoveWindow(1, TRUE);
- return 2;
+ return 0;
}
int MatchCall_PageUp(void)
{
- struct MatchCallWindowState *structPtr;
s32 scroll;
-
- structPtr = GetMatchCallWindowStruct();
+ struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
+
if (ShouldShowUpArrow())
{
if (structPtr->windowTopIndex >= structPtr->visibleEntries)
@@ -557,24 +407,18 @@ int MatchCall_PageUp(void)
structPtr->selectedIndexOffset = 0;
return 1;
}
- else
- {
- return 0;
- }
+ return 0;
}
int MatchCall_PageDown(void)
{
- struct MatchCallWindowState *structPtr;
- structPtr = GetMatchCallWindowStruct();
+ struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
if (ShouldShowDownArrow())
{
- s32 scroll;
- s32 windowBottomIndex;
- s32 v3;
- windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries;
- scroll = structPtr->unk4 - structPtr->windowTopIndex;
+ s32 windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries;
+ s32 scroll = structPtr->unk4 - structPtr->windowTopIndex;
+
if (windowBottomIndex <= structPtr->unk4)
scroll = structPtr->visibleEntries;
MatchCall_MoveWindow(scroll, TRUE);
@@ -582,8 +426,7 @@ int MatchCall_PageDown(void)
}
else
{
- s32 cursor;
- s32 lastVisibleIndex;
+ s32 cursor, lastVisibleIndex;
if (structPtr->listLength >= structPtr->visibleEntries)
{
cursor = structPtr->selectedIndexOffset;
@@ -596,89 +439,68 @@ int MatchCall_PageDown(void)
}
lastVisibleIndex -= 1;
if (cursor >= lastVisibleIndex)
- {
return 0;
- }
- else
- {
- structPtr->selectedIndexOffset = lastVisibleIndex;
- return 1;
- }
+
+ structPtr->selectedIndexOffset = lastVisibleIndex;
+ return 1;
}
}
u32 GetSelectedMatchCall(void)
{
- struct MatchCallWindowState *structPtr;
- structPtr = GetMatchCallWindowStruct();
+ struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
return structPtr->windowTopIndex + structPtr->selectedIndexOffset;
}
u32 GetMatchCallListTopIndex(void)
{
- struct MatchCallWindowState *structPtr;
- structPtr = GetMatchCallWindowStruct();
-
+ struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct();
+
return structPtr->windowTopIndex;
}
void sub_81C877C(void)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
structPtr->unk89C = 0;
structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8870, 6);
}
void sub_81C87AC(s16 a0)
{
- u16 temp;
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
- temp = structPtr->unk888.windowTopIndex;
- temp += a0;
- structPtr->unk888.windowTopIndex = temp;
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
+ structPtr->unk888.windowTopIndex += a0;
structPtr->unk89C = 0;
structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8958, 6);
}
void sub_81C87F0(void)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
structPtr->unk89C = 0;
structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8A28, 6);
}
bool32 sub_81C8820(void)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
return IsLoopedTaskActive(structPtr->unk8A0);
}
void sub_81C8838(void)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- struct MatchCallWindowState *subStr;
- structPtr = GetSubstructPtr(0x11);
- subStr = &structPtr->unk888;
- structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subStr->windowTopIndex + subStr->selectedIndexOffset, (structPtr->unk0.unk0.unkA + subStr->selectedIndexOffset) & 0xF);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
+ struct MatchCallWindowState *subPtr = &structPtr->unk888;
+ structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subPtr->windowTopIndex + subPtr->selectedIndexOffset, (structPtr->unk0.unk0.unkA + subPtr->selectedIndexOffset) & 0xF);
CopyWindowToVram(structPtr->unk0.unk0.windowId, 1);
}
-u32 LoopedTask_sub_81C8870(s32 a0)
+u32 LoopedTask_sub_81C8870(s32 state)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- u16 v1;
- u32 v2;
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
- // Needed to fix a register renaming issue.
- register u16* temp asm("r1");
- structPtr = GetSubstructPtr(0x11);
-
- switch (a0)
+ switch (state)
{
case 0:
ToggleMatchCallArrows(&structPtr->unk0, 1);
@@ -686,50 +508,48 @@ u32 LoopedTask_sub_81C8870(s32 a0)
case 1:
if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset)
sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, 1);
-
+
structPtr->unk89C++;
- return 0;
+ return LT_INC_AND_PAUSE;
case 2:
- if (IsDma3ManagerBusyWithBgCopy())
- return 2;
-
- if (structPtr->unk89C != structPtr->unk888.visibleEntries)
- return 6;
-
- if (structPtr->unk888.selectedIndexOffset != 0)
- sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.selectedIndexOffset);
-
- return 0;
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ if (structPtr->unk89C != structPtr->unk888.visibleEntries)
+ return 6;
+ if (structPtr->unk888.selectedIndexOffset != 0)
+ sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.selectedIndexOffset);
+
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
case 3:
- if (IsDma3ManagerBusyWithBgCopy())
- return 2;
- temp = &structPtr->unk888.selectedIndexOffset;
- v1 = *temp;
- if (v1 == 0)
- return 4;
-
- MatchCall_MoveWindow(v1, FALSE);
- return 0;
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ if (structPtr->unk888.selectedIndexOffset != 0)
+ {
+ MatchCall_MoveWindow(structPtr->unk888.selectedIndexOffset, FALSE);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_FINISH;
+ }
+ return LT_PAUSE;
case 4:
- v2 = sub_81C8630();
- if (v2)
- return 2;
+ if (sub_81C8630())
+ return LT_PAUSE;
- structPtr->unk888.selectedIndexOffset = v2;
- return 4;
- default:
- return 4;
+ structPtr->unk888.selectedIndexOffset = 0;
+ return LT_FINISH;
}
+ return LT_FINISH;
}
-u32 LoopedTask_sub_81C8958(s32 a0)
+u32 LoopedTask_sub_81C8958(s32 state)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
if (IsDma3ManagerBusyWithBgCopy())
- return 2;
-
- switch (a0)
+ return LT_PAUSE;
+
+ switch (state)
{
case 0:
sub_81C8CB4(&structPtr->unk888, &structPtr->unk0);
@@ -756,173 +576,136 @@ u32 LoopedTask_sub_81C8958(s32 a0)
sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 3);
break;
default:
- return 4;
+ return LT_FINISH;
}
- return 0;
+ return LT_INC_AND_PAUSE;
}
-u32 LoopedTask_sub_81C8A28(s32 a0)
+u32 LoopedTask_sub_81C8A28(s32 state)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
+ struct PokenavSub17 *structPtr;
struct MatchCallWindowState *subPtr888;
- register struct UnknownInnerStruct_81C81D4 *subPtr0 asm("r2");
- s32 v4;
+ struct PokenavSub17Substruct *subPtr0;
+ s32 r5, *ptr;
if (IsDma3ManagerBusyWithBgCopy())
- {
- return 2;
- }
-
- structPtr = GetSubstructPtr(0x11);
+ return LT_PAUSE;
+
+ structPtr = GetSubstructPtr(17);
subPtr888 = &structPtr->unk888;
subPtr0 = &structPtr->unk0;
- switch (a0)
+ switch (state)
{
- default:
- return 4;
case 0:
sub_81C8D4C(subPtr888, subPtr0);
- return 0;
+ return LT_INC_AND_PAUSE;
case 1:
- {
- s32 v1;
- s32 v2;
- u32 *v3;
- register s32 v4 asm("r5");
-
- v3 = &structPtr->unk89C;
- v1 = *v3 + 1;
- *v3 = v1;
- if (v1 < structPtr->unk888.visibleEntries)
+ ptr = &structPtr->unk89C;
+ if (++(*ptr) < structPtr->unk888.visibleEntries)
{
- sub_81C8B70(&subPtr0->unk0, v1, 1);
- return 2;
+ sub_81C8B70(&subPtr0->unk0, *ptr, 1);
+ return LT_PAUSE;
}
- *v3 = 0;
+ *ptr = 0;
if (subPtr888->listLength <= subPtr888->visibleEntries)
{
- register u32 temp asm("r0");
- temp = subPtr888->windowTopIndex;
- if (temp == 0)
- return 9;
- v2 = temp;
+ if (subPtr888->windowTopIndex != 0)
+ {
+ s32 r4 = subPtr888->windowTopIndex;
+ r5 = -r4;
+ sub_81C8B70(&subPtr0->unk0, r5, r4);
+ subPtr888->selectedIndexOffset = r4;
+ *ptr = r5;
+ return LT_INC_AND_PAUSE;
+ }
}
else
{
- register s32 temp asm("r1");
- v2 = subPtr888->windowTopIndex + subPtr888->visibleEntries;
- temp = (s32)subPtr888->listLength;
- if (v2 <= temp)
- return 9;
- v2 -= temp;
+ if (subPtr888->windowTopIndex + subPtr888->visibleEntries > subPtr888->listLength)
+ {
+ s32 r4 = subPtr888->windowTopIndex + subPtr888->visibleEntries - subPtr888->listLength;
+ r5 = -r4;
+ sub_81C8B70(&subPtr0->unk0, r5, r4);
+ subPtr888->selectedIndexOffset = r4;
+ *ptr = r5;
+ return LT_INC_AND_PAUSE;
+ }
}
- v4 = v2 * -1;
- sub_81C8B70(&subPtr0->unk0, v4, v2);
- subPtr888->selectedIndexOffset = v2;
- *v3 = v4;
- return 0;
- }
+ return 9;
case 2:
MatchCall_MoveWindow(structPtr->unk89C, FALSE);
- return 0;
+ return LT_INC_AND_PAUSE;
case 3:
- if (sub_81C8630())
- return 2;
-
- structPtr->unk89C = 0;
- return 1;
+ if (!sub_81C8630())
+ {
+ structPtr->unk89C = 0;
+ return 1;
+ }
+ return 2;
case 4:
sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->unk0);
- return 0;
+ return LT_INC_AND_PAUSE;
case 5:
if (sub_81C83E0())
- return 2;
-
- v4 = ++structPtr->unk89C;
- if (v4 >= subPtr888->listLength || v4 >= subPtr888->visibleEntries)
- return 1;
+ return LT_PAUSE;
+ if (++structPtr->unk89C >= subPtr888->listLength || structPtr->unk89C >= subPtr888->visibleEntries)
+ return LT_INC_AND_CONTINUE;
return 9;
case 6:
ToggleMatchCallArrows(subPtr0, 0);
- return 4;
+ return LT_FINISH;
}
+
+ return LT_FINISH;
}
-void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2)
+void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, s32 a1, s32 a2)
{
- u8 *v1;
- u32 v2;
-
- v1 = (u8*)GetWindowAttribute(a0->windowId, WINDOW_TILE_DATA);
- v2 = a0->unk4 * 64;
+ u8 *v1 = (u8*)GetWindowAttribute(a0->windowId, WINDOW_TILE_DATA);
+ u32 v2 = a0->unk4 * 64;
a1 = (a0->unkA + a1) & 0xF;
- if ((s32)(a1 + a2) <= 16)
+ if (a1 + a2 <= 16)
{
CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2);
CopyWindowToVram(a0->windowId, 2);
}
else
{
- u32 v3;
- u32 v4;
-
- v3 = 16 - a1;
- v4 = a2 - v3;
+ u32 v3 = 16 - a1;
+ u32 v4 = a2 - v3;
CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2);
CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2);
CopyWindowToVram(a0->windowId, 2);
}
- a2 -= 1;
- for (a2; a2 != -1; a1 = (a1 + 1) & 0xF, a2--)
- {
+ for (a2--; a2 != -1; a1 = (a1 + 1) & 0xF, a2--)
sub_81CBD48(a0->windowId, a1);
- }
CopyWindowToVram(a0->windowId, 1);
}
void sub_81C8C64(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1)
{
- u16 *v1;
- register u32 v2 asm("r0");
- u32 v3;
-
- v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(a0->windowId, WINDOW_BG));
-
- v1 = &v1[(a0->unkA << 6) + a0->unk2 - 1];
+ u16 var;
+ u16 *v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(a0->windowId, WINDOW_BG));
+ v1 += ((a0->unkA << 6) + a0->unk2) - 1;
if (a1 != 0)
- {
- v2 = a0->unk1 << 12;
- v3 = a0->unk6 + 1;
- }
+ var = (a0->unk1 << 12) | (a0->unk6 + 1);
else
- {
- v2 = a0->unk1 << 12;
- v3 = a0->unk6;
- }
- {
- register u16 v5 asm("r1");
- register u32 v6 asm("r0");
- v6 = (v3 | v2);
- v6 = v6 << 16;
- v5 = v6 >> 16;
- v1[0] = v5;
- v1[0x20] = v5;
- }
+ var = (a0->unk1 << 12) | (a0->unk6);
+
+ v1[0] = var;
+ v1[0x20] = var;
}
-void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+void sub_81C8CB4(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1)
{
- u8 colors[3];
-
-
- memcpy(colors, sPokenavColors_0861FBE4, ARRAY_COUNT(sPokenavColors_0861FBE4));
+ u8 colors[3] = {0, 2, 5};
a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer);
a1->unk38(a1->unk0.windowId, a0->windowTopIndex, a1->unk0.unkA);
@@ -932,7 +715,7 @@ void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C8
CopyWindowRectToVram(a1->unk0.windowId, 3, 0, a1->unk0.unkA * 2, a1->unk0.unk4, 2);
}
-void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+void sub_81C8D4C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1)
{
a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer);
FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(1), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16);
@@ -941,80 +724,131 @@ void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C8
CopyWindowToVram(a1->unk0.windowId, 3);
}
-void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 fieldId)
+void PrintMatchCallFieldNames(struct PokenavSub17Substruct *a0, u32 fieldId)
{
- const u8 *fieldNames[3];
- u8 colors[3];
- u32 r4;
- u32 r5;
- u32 tmp;
- u32 one;
-
- memcpy(fieldNames, sMatchCallFieldNames, sizeof(sMatchCallFieldNames));
- memcpy(colors, sMatchCallFieldColors, sizeof(sMatchCallFieldColors));
-
- r4 = a0->unk0.unkA;
- tmp = fieldId * 2 + 1;
- r4 += tmp;
- r4 &= 0xF;
- FillWindowPixelRect(a0->unk0.windowId, PIXEL_FILL(1), 0, r4 << 4, a0->unk0.unk4, 16);
-
- // This is a fake match. It should be this:
- // AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, r4 << 4 + 1, colors, TEXT_SPEED_FF, fieldNames[fieldId]);
- // But the original GCC does some clever reuse of the `1` constant that the current GCC doesn't.
- one = 1;
- AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, (r4 << 4) + one, colors, one - 2, fieldNames[fieldId]);
- CopyWindowRectToVram(a0->unk0.windowId, 2, 0, r4 << 1, a0->unk0.unk4, 2);
+ const u8 *fieldNames[] = {gText_PokenavMatchCall_Strategy, gText_PokenavMatchCall_TrainerPokemon, gText_PokenavMatchCall_SelfIntroduction};
+ u8 colors[3] = {1, 4, 5};
+ u32 top = (a0->unk0.unkA + 1 + (fieldId * 2)) & 0xF;
+
+ FillWindowPixelRect(a0->unk0.windowId, PIXEL_FILL(1), 0, top << 4, a0->unk0.unk4, 16);
+ AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, (top << 4) + 1, colors, -1, fieldNames[fieldId]);
+ CopyWindowRectToVram(a0->unk0.windowId, 2, 0, top << 1, a0->unk0.unk4, 2);
}
-void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2)
+void sub_81C8E54(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1, u32 a2)
{
- const u8 *str;
- u32 r6;
+ static const u8 array[] = {2, 4, 6, 7};
+ u32 r6 = (a1->unk0.unkA + array[a2]) & 0xF;
+ const u8 *str = sub_81CAFD8(a0->windowTopIndex, a2);
- r6 = (a1->unk0.unkA + sUnknown_0861FBF7[a2]) & 0xF;
-
- str = sub_81CAFD8(a0->windowTopIndex, a2);
- if (str != NULL) {
+ if (str != NULL)
+ {
sub_81DB620(a1->unk0.windowId, 1, r6 * 2, a1->unk0.unk4 - 1, 2);
AddTextPrinterParameterized(a1->unk0.windowId, 7, str, 2, (r6 << 4) + 1, TEXT_SPEED_FF, NULL);
CopyWindowRectToVram(a1->unk0.windowId, 2, 0, r6 * 2, a1->unk0.unk4, 2);
}
}
+static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheets[] =
+{
+ {
+ .data = sMatchcallArrowSpriteSheetData,
+ .size = 192,
+ .tag = 0xA
+ }
+};
+
+static const struct SpritePalette sMatchcallArrowPalettes[] =
+{
+ {
+ .data = sMatchcallArrowPaletteData,
+ .tag = 0x14
+ },
+ {}
+};
+
+static const struct OamData sMatchCallRightArrowSpriteOam =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0
+};
+
+static const struct SpriteTemplate sMatchCallRightArrowSprite =
+{
+ .tileTag = 0xA,
+ .paletteTag = 0x14,
+ .oam = &sMatchCallRightArrowSpriteOam,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_MatchCallRightArrow
+};
+
+static const struct OamData sMatchCallUpDownArrowSpriteOam =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0
+};
+
+static const struct SpriteTemplate sMatchCallUpDownArrowSprite =
+{
+ .tileTag = 0xA,
+ .paletteTag = 0x14,
+ .oam = &sMatchCallUpDownArrowSpriteOam,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
void sub_81C8ED0(void)
{
u32 i;
const struct CompressedSpriteSheet *ptr;
-
+
for (i = 0, ptr = sMatchcallArrowSpriteSheets; i < ARRAY_COUNT(sMatchcallArrowSpriteSheets); ptr++, i++)
- {
LoadCompressedSpriteSheet(ptr);
- }
+
Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalettes);
}
-void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+void sub_81C8EF8(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1)
{
- register u32 spriteId asm("r3");
- s16 temp;
+ u32 spriteId;
+ s16 x;
- spriteId = (u8)CreateSprite(&sMatchCallRightArrowSprite, a1->unk0.unk2 * 8 + 3, (a1->unk0.unk3 + 1) * 8, 7);
+ spriteId = CreateSprite(&sMatchCallRightArrowSprite, a1->unk0.unk2 * 8 + 3, (a1->unk0.unk3 + 1) * 8, 7);
a1->rightArrow = &gSprites[spriteId];
- temp = a1->unk0.unk2 * 8 + (a1->unk0.unk4 - 1) * 4;
- spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8 + a0->visibleEntries * 16, 7);
+ x = a1->unk0.unk2 * 8 + (a1->unk0.unk4 - 1) * 4;
+ spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, a1->unk0.unk3 * 8 + a0->visibleEntries * 16, 7);
a1->downArrow = &gSprites[spriteId];
a1->downArrow->oam.tileNum += 2;
a1->downArrow->callback = SpriteCB_MatchCallDownArrow;
- spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8, 7);
+ spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, a1->unk0.unk3 * 8, 7);
a1->upArrow = &gSprites[spriteId];
a1->upArrow->oam.tileNum += 4;
a1->upArrow->callback = SpriteCB_MatchCallUpArrow;
}
-void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0)
+void sub_81C8FE0(struct PokenavSub17Substruct *a0)
{
DestroySprite(a0->rightArrow);
DestroySprite(a0->upArrow);
@@ -1023,7 +857,7 @@ void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0)
FreeSpritePaletteByTag(0x14);
}
-void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, bool32 shouldHide)
+void ToggleMatchCallArrows(struct PokenavSub17Substruct *a0, bool32 shouldHide)
{
if (shouldHide)
{
@@ -1044,8 +878,7 @@ void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, bool32 shouldH
void SpriteCB_MatchCallRightArrow(struct Sprite *sprite)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
sprite->pos2.y = structPtr->unk888.selectedIndexOffset << 4;
}
@@ -1055,7 +888,7 @@ void SpriteCB_MatchCallDownArrow(struct Sprite *sprite)
sprite->invisible = FALSE;
else
sprite->invisible = TRUE;
-
+
if (++sprite->data[0] > 3)
{
s16 offset;
@@ -1073,7 +906,7 @@ void SpriteCB_MatchCallUpArrow(struct Sprite *sprite)
sprite->invisible = FALSE;
else
sprite->invisible = TRUE;
-
+
if (++sprite->data[0] > 3)
{
s16 offset;
@@ -1087,36 +920,31 @@ void SpriteCB_MatchCallUpArrow(struct Sprite *sprite)
void ToggleMatchCallVerticalArrows(bool32 shouldHide)
{
- struct UnknownSubStruct_81C81D4 *structPtr;
- structPtr = GetSubstructPtr(0x11);
+ struct PokenavSub17 *structPtr = GetSubstructPtr(17);
structPtr->unk0.upArrow->data[7] = shouldHide;
structPtr->unk0.downArrow->data[7] = shouldHide;
}
void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1)
{
- u32 unused1 = a0->unk10 = a1->unk0;
- u32 v0 = a1->unk6;
- u32 zero = 0;
- u32 unused2 = a0->windowTopIndex = v0;
- u32 v1 = a0->listLength = a1->unk4;
-
+ a0->unk10 = a1->unk0;
+ a0->windowTopIndex = a1->unk6;
+ a0->listLength = a1->unk4;
a0->unkC = a1->unk8;
a0->visibleEntries = a1->unkC;
- if (a0->visibleEntries >= (u16)v1)
+ if (a0->visibleEntries >= a0->listLength)
{
a0->windowTopIndex = 0;
a0->unk4 = 0;
- a0->selectedIndexOffset = v0;
+ a0->selectedIndexOffset = a1->unk6;
}
else
{
- s32 v2;
a0->unk4 = a0->listLength - a0->visibleEntries;
- v2 = a0->windowTopIndex + a0->visibleEntries;
- if (v2 > a0->listLength) {
- a0->selectedIndexOffset = v2 - a0->listLength;
- a0->windowTopIndex = v0 - a0->selectedIndexOffset;
+ if (a0->windowTopIndex + a0->visibleEntries > a0->listLength)
+ {
+ a0->selectedIndexOffset = a0->windowTopIndex + a0->visibleEntries - a0->listLength;
+ a0->windowTopIndex = a1->unk6 - a0->selectedIndexOffset;
}
else
{
@@ -1125,15 +953,11 @@ void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *
}
}
-u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3)
+bool32 sub_81C91AC(struct PokenavSub17Substruct *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3)
{
- register u32 raw_bg asm("r4") = ((a1->bg) << 30);
- u8 bg = raw_bg >> 30;
- u32 unknown = 0;
struct WindowTemplate window;
- u8 bg_again;
- a0->unk0.bg = bg;
+ a0->unk0.bg = a1->bg;
a0->unk0.unk6 = a3;
a0->unk34 = a2->unk10;
a0->unk38 = a2->unk14;
@@ -1142,8 +966,8 @@ u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *
a0->unk0.unk3 = a2->unkB;
a0->unk0.unk4 = a2->unkA;
a0->unk0.fontId = a2->unkE;
-
- window.bg = raw_bg >> 30;
+
+ window.bg = a1->bg;
window.tilemapLeft = a2->unk9;
window.tilemapTop = 0;
window.width = a2->unkA;
@@ -1153,15 +977,11 @@ u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *
a0->unk0.windowId = AddWindow(&window);
if (a0->unk0.windowId == 0xFF)
- {
- return 0;
- }
- else
- {
- a0->unk0.unkA = unknown;
- a0->rightArrow = NULL;
- a0->upArrow = NULL;
- a0->downArrow = NULL;
- return 1;
- }
+ return FALSE;
+
+ a0->unk0.unkA = 0;
+ a0->rightArrow = NULL;
+ a0->upArrow = NULL;
+ a0->downArrow = NULL;
+ return 1;
}
diff --git a/src/pokenav_unk_1.c b/src/pokenav_unk_1.c
index 96ecf9c8b..b5bbc4b74 100644
--- a/src/pokenav_unk_1.c
+++ b/src/pokenav_unk_1.c
@@ -55,7 +55,7 @@ static u8 GetPokenavMainMenuType(void)
return retVal;
}
-bool32 sub_81C9298(void)
+bool32 PokenavCallback_Init_0(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
@@ -69,7 +69,7 @@ bool32 sub_81C9298(void)
return TRUE;
}
-bool32 sub_81C92CC(void)
+bool32 PokenavCallback_Init_4(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
@@ -83,7 +83,7 @@ bool32 sub_81C92CC(void)
return TRUE;
}
-bool32 sub_81C9304(void)
+bool32 PokenavCallback_Init_5(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
@@ -96,7 +96,7 @@ bool32 sub_81C9304(void)
return TRUE;
}
-bool32 sub_81C9338(void)
+bool32 PokenavCallback_Init_2(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
@@ -110,7 +110,7 @@ bool32 sub_81C9338(void)
return TRUE;
}
-bool32 sub_81C9368(void)
+bool32 PokenavCallback_Init_3(void)
{
struct Pokenav1Struct *state = AllocSubstruct(1, sizeof(struct Pokenav1Struct));
if (!state)
@@ -459,7 +459,7 @@ int sub_81C98B4(void)
return state->descriptionId;
}
-int sub_81C98C4(void)
+u16 sub_81C98C4(void)
{
struct Pokenav1Struct *state = GetSubstructPtr(1);
return state->helpBarIndex;
diff --git a/src/pokenav_unk_10.c b/src/pokenav_unk_10.c
index dcdbacfb9..135ff24b3 100644
--- a/src/pokenav_unk_10.c
+++ b/src/pokenav_unk_10.c
@@ -1,67 +1,737 @@
#include "global.h"
#include "decompress.h"
#include "dynamic_placeholder_text_util.h"
+#include "graphics.h"
#include "international_string_util.h"
#include "pokenav.h"
+#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "text.h"
#include "trainer_pokemon_sprites.h"
#include "window.h"
+#include "constants/songs.h"
-struct Pokenav10Struct
+struct PokenavSub13
{
- u32 field_0[5];
- struct Sprite *field_14;
+ u8 filler0[0x8];
+ struct PokenavSub18 *field_8;
+ u16 field_C;
+ u16 field_E;
+ u16 field_10;
+ u16 field_12;
+ u32 field_14[25];
+ u32 field_78[8];
+ u32 (*field_98)(struct PokenavSub13 *structPtr);
};
-struct Pokenav10Struct2
+struct PokenavSub14
{
- u32 filler0[2];
+ u32 (*field_0)(void);
+ u32 loopedTaskId;
u16 field_8;
u16 field_A;
u16 field_C;
- u8 filler[2];
+ u16 field_E;
u16 field_10;
+ struct Sprite *field_14;
+ u32 filler;
+ u8 tilemapBuffers[2][BG_SCREEN_SIZE];
};
-// To do: move to C.
-extern const u16 gUnknown_08623FF8[];
-extern const u16 gUnknown_08624038[];
-extern const u16 gUnknown_08624018[];
-extern const u16 gUnknown_08624078[];
-extern const u16 gUnknown_08624058[];
-extern const u32 gUnknown_08624280[];
-extern const u8 gText_RibbonsF700[];
-extern const u8 *const gRibbonDescriptionPointers[][2];
-extern const u8 *const gGiftRibbonDescriptionPointers[][2];
-
-extern u32 gUnknown_030012C0;
-extern u32 gUnknown_030012C4;
-
-void sub_81D0E84(struct Pokenav10Struct2 *structPtr);
-void sub_81D0FF0(struct Pokenav10Struct2 *structPtr);
-void sub_81D10D0(struct Pokenav10Struct2 *structPtr);
+static u32 gUnknown_030012C0;
+static u32 gUnknown_030012C4;
+
+void sub_81D0E84(struct PokenavSub14 *structPtr);
+void sub_81D0FF0(struct PokenavSub14 *structPtr);
+void sub_81D10D0(struct PokenavSub14 *structPtr);
+void sub_81D1500(struct PokenavSub14 *structPtr);
+void sub_81D0EFC(struct PokenavSub14 *structPtr);
+void sub_81D1148(struct PokenavSub14 *structPtr);
+void sub_81D10A4(struct PokenavSub14 *structPtr);
+void sub_81D1178(struct PokenavSub14 *structPtr);
+void sub_81D11D8(struct PokenavSub14 *structPtr);
+void sub_81D11FC(struct PokenavSub14 *structPtr);
+void sub_81D0E60(struct PokenavSub14 *structPtr);
+void sub_81D1448(struct PokenavSub14 *structPtr);
+void sub_81D13FC(struct PokenavSub14 *structPtr);
+void sub_81D0FCC(struct PokenavSub14 *structPtr);
+void sub_81D12D8(struct PokenavSub14 *structPtr);
+bool32 sub_81D1524(struct PokenavSub14 *structPtr);
+bool32 sub_81D1234(struct PokenavSub14 *structPtr);
+void sub_81D0814(struct PokenavSub13 *structPtr);
+u32 sub_81D0548(struct PokenavSub13 *structPtr);
+u32 sub_81D04C4(struct PokenavSub13 *structPtr);
+u32 sub_81D05D4(struct PokenavSub13 *structPtr);
+bool32 sub_81D05DC(struct PokenavSub13 *structPtr);
+bool32 sub_81D0688(struct PokenavSub13 *structPtr);
+bool32 sub_81D0664(struct PokenavSub13 *structPtr);
+bool32 sub_81D061C(struct PokenavSub13 *structPtr);
+bool32 sub_81D0688(struct PokenavSub13 *structPtr);
+bool32 sub_81D0A58(void);
u32 sub_81D06C4(void);
-u32 sub_81D07D8(void);
u32 sub_81D06D4(void);
-void sub_81D06E4(u8 *nick, u8 *level, u8 *gender);
-void sub_81D0760(u16 *species, u32 *personality, u32 *otId);
u16 sub_81D1184(s32 unused0, s32 unused1);
void sub_81D1258(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3);
void sub_81D1284(struct Sprite *sprite);
-u32 *sub_81D0914(u32 *arg0);
-u32 *sub_81D092C(u32 *arg0);
void sub_81D1350(void);
void sub_81D13BC(u16 *dst, u32 id);
void sub_81D1370(u32 arg0, u32 id);
-u16 sub_81D0944(void);
-u32 sub_81D0954(void);
-void sub_81D1500(struct Pokenav10Struct *structPtr);
-bool32 sub_81D1524(struct Pokenav10Struct *structPtr);
void sub_81D1538(struct Sprite *sprite);
+u32 sub_81D0A6C(s32 state);
+u32 sub_81D0C84(s32 state);
+u32 sub_81D0D2C(s32 state);
+u32 sub_81D0D8C(s32 state);
+u32 sub_81D0E00(s32 state);
+u32 sub_81D0C54(s32 state);
+
+struct
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+} static const gUnknown_086237F8[] =
+{
+ {1, 1, 0, 0},
+ {3, 4, 1, 0},
+ {3, 4, 5, 0},
+ {3, 4, 9, 0},
+ {3, 4, 13, 0},
+ {3, 4, 17, 0},
+ {1, 1, 21, 0},
+ {1, 1, 22, 0},
+ {1, 1, 23, 0},
+ {1, 1, 24, 0},
+ {1, 1, 25, 1},
+ {1, 1, 26, 1},
+ {1, 1, 27, 1},
+ {1, 1, 28, 1},
+ {1, 1, 29, 1},
+ {1, 1, 30, 1},
+ {1, 1, 31, 1}
+};
+
+#include "data/text/ribbon_descriptions.h"
+#include "data/text/gift_ribbon_descriptions.h"
+
+static const u16 gUnknown_08623FF8[] = INCBIN_U16("graphics/pokenav/ribbons_icon1.gbapal");
+static const u16 gUnknown_08624018[] = INCBIN_U16("graphics/pokenav/ribbons_icon2.gbapal");
+static const u16 gUnknown_08624038[] = INCBIN_U16("graphics/pokenav/ribbons_icon3.gbapal");
+static const u16 gUnknown_08624058[] = INCBIN_U16("graphics/pokenav/ribbons_icon4.gbapal");
+static const u16 gUnknown_08624078[] = INCBIN_U16("graphics/pokenav/ribbons_icon5.gbapal");
+static const u16 gUnknown_08624098[] = INCBIN_U16("graphics/pokenav/8624098.gbapal");
+static const u32 gUnknown_086240B8[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz");
+static const u32 gUnknown_08624280[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz");
+
+static const struct BgTemplate gUnknown_08624B98[] =
+{
+ {
+ .bg = 1,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 0x07,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 0x06,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ }
+};
+
+static const LoopedTask gUnknown_08624BA0[] =
+{
+ NULL,
+ sub_81D0C84,
+ sub_81D0D2C,
+ sub_81D0D8C,
+ sub_81D0E00,
+ sub_81D0C54
+};
// code
+bool32 PokenavCallback_Init_13(void)
+{
+ struct PokenavSub13 *structPtr = AllocSubstruct(13, sizeof(struct PokenavSub13));
+ if (structPtr == NULL)
+ return FALSE;
+
+ structPtr->field_8 = GetSubstructPtr(18);
+ if (structPtr->field_8 == NULL)
+ return FALSE;
+
+ sub_81D0814(structPtr);
+ structPtr->field_98 = sub_81D04C4;
+ gKeyRepeatContinueDelay = 3;
+ gKeyRepeatStartDelay = 10;
+ return TRUE;
+}
+
+u32 sub_81D04A0(void)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ return structPtr->field_98(structPtr);
+}
+
+void sub_81D04B8(void)
+{
+ FreePokenavSubstruct(13);
+}
+
+u32 sub_81D04C4(struct PokenavSub13 *structPtr)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP && structPtr->field_8->unk2 != 0)
+ {
+ structPtr->field_8->unk2--;
+ structPtr->field_C = 0;
+ sub_81D0814(structPtr);
+ return 1;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN && structPtr->field_8->unk2 < structPtr->field_8->unk0 - 1)
+ {
+ structPtr->field_8->unk2++;
+ structPtr->field_C = 0;
+ sub_81D0814(structPtr);
+ return 1;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ structPtr->field_98 = sub_81D0548;
+ return 2;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ structPtr->field_98 = sub_81D05D4;
+ return 5;
+ }
+ return 0;
+}
+
+u32 sub_81D0548(struct PokenavSub13 *structPtr)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP && sub_81D05DC(structPtr))
+ return 3;
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN && sub_81D061C(structPtr))
+ return 3;
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT && sub_81D0664(structPtr))
+ return 3;
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT && sub_81D0688(structPtr))
+ return 3;
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ structPtr->field_98 = sub_81D04C4;
+ return 4;
+ }
+ return 0;
+}
+
+u32 sub_81D05D4(struct PokenavSub13 *structPtr)
+{
+ return 100014;
+}
+
+bool32 sub_81D05DC(struct PokenavSub13 *structPtr)
+{
+ if (structPtr->field_C < 25)
+ {
+ if (structPtr->field_C <= 8)
+ return FALSE;
+
+ structPtr->field_C -= 9;
+ return TRUE;
+ }
+ if (structPtr->field_10 != 0)
+ {
+ u32 var = structPtr->field_C - 27;
+ structPtr->field_C = var + structPtr->field_E;
+ if (structPtr->field_C >= structPtr->field_10)
+ structPtr->field_C = structPtr->field_10 - 1;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_81D061C(struct PokenavSub13 *structPtr)
+{
+ if (structPtr->field_C >= 25)
+ return FALSE;
+ if (structPtr->field_C < structPtr->field_E)
+ {
+ structPtr->field_C += 9;
+ if (structPtr->field_C >= structPtr->field_10)
+ structPtr->field_C = structPtr->field_10 - 1;
+ return TRUE;
+ }
+ if (structPtr->field_12 != 0)
+ {
+ int var = structPtr->field_C - structPtr->field_E;
+ if (var >= structPtr->field_12)
+ var = structPtr->field_12 - 1;
+
+ structPtr->field_C = var + 27;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool32 sub_81D0664(struct PokenavSub13 *structPtr)
+{
+ u16 var = structPtr->field_C % 9;
+ if (var != 0)
+ {
+ structPtr->field_C--;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool32 sub_81D0688(struct PokenavSub13 *structPtr)
+{
+ int r1 = structPtr->field_C % 9;
+
+ if (r1 >= 8)
+ return FALSE;
+
+ if (structPtr->field_C <= 26)
+ {
+ if (structPtr->field_C < structPtr->field_10 - 1)
+ {
+ structPtr->field_C++;
+ return TRUE;
+ }
+ }
+ else
+ {
+ if (r1 < structPtr->field_12 - 1)
+ {
+ structPtr->field_C++;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+u32 sub_81D06C4(void)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ return structPtr->field_8->unk2;
+}
+
+u32 sub_81D06D4(void)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ return structPtr->field_8->unk0;
+}
+
+static void GetCurrMonInfo1(u8 *nick, u8 *level, u8 *gender)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ struct PokenavSub18 *mons = structPtr->field_8;
+ struct PokenavMonList *monInfo = &mons->unk4[mons->unk2];
+
+ if (monInfo->boxId == TOTAL_BOXES_COUNT)
+ {
+ struct Pokemon *mon = &gPlayerParty[monInfo->monId];
+ GetMonData(mon, MON_DATA_NICKNAME, nick);
+ *level = GetLevelFromMonExp(mon);
+ *gender = GetMonGender(mon);
+ }
+ else
+ {
+ struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId);
+ *gender = GetBoxMonGender(boxMon);
+ *level = GetLevelFromBoxMonExp(boxMon);
+ GetBoxMonData(boxMon, MON_DATA_NICKNAME, nick);
+ }
+ StringGetEnd10(nick);
+}
+
+static void GetCurrMonInfo2(u16 *species, u32 *personality, u32 *otId)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ struct PokenavSub18 *mons = structPtr->field_8;
+ struct PokenavMonList *monInfo = &mons->unk4[mons->unk2];
+
+ if (monInfo->boxId == TOTAL_BOXES_COUNT)
+ {
+ struct Pokemon *mon = &gPlayerParty[monInfo->monId];
+ *species = GetMonData(mon, MON_DATA_SPECIES);
+ *personality = GetMonData(mon, MON_DATA_PERSONALITY);
+ *otId = GetMonData(mon, MON_DATA_OT_ID);
+ }
+ else
+ {
+ struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId);
+ *species = GetBoxMonData(boxMon, MON_DATA_SPECIES);
+ *personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY);
+ *otId = GetBoxMonData(boxMon, MON_DATA_OT_ID);
+ }
+}
+
+static u32 GetCurrMonRibbonCount(void)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ struct PokenavSub18 *mons = structPtr->field_8;
+ struct PokenavMonList *monInfo = &mons->unk4[mons->unk2];
+
+ if (monInfo->boxId == TOTAL_BOXES_COUNT)
+ return GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBON_COUNT);
+ else
+ return GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBON_COUNT);
+}
+
+void sub_81D0814(struct PokenavSub13 *structPtr)
+{
+ u32 ribbons;
+ s32 i, j;
+ struct PokenavSub18 *mons = structPtr->field_8;
+ struct PokenavMonList *monInfo = &mons->unk4[mons->unk2];
+
+ if (monInfo->boxId == TOTAL_BOXES_COUNT)
+ ribbons = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS);
+ else
+ ribbons = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS);
+
+ structPtr->field_10 = 0;
+ structPtr->field_12 = 0;
+ for (i = 0; i < ARRAY_COUNT(gUnknown_086237F8); i++)
+ {
+ s32 r4 = ((1 << gUnknown_086237F8[i].unk0) - 1) & ribbons;
+ if (gUnknown_086237F8[i].unk3 == 0)
+ {
+ for (j = 0; j < r4; j++)
+ structPtr->field_14[structPtr->field_10++] = gUnknown_086237F8[i].unk2 + j;
+ }
+ else
+ {
+ for (j = 0; j < r4; j++)
+ structPtr->field_78[structPtr->field_12++] = gUnknown_086237F8[i].unk2 + j;
+ }
+ ribbons >>= gUnknown_086237F8[i].unk0;
+ }
+
+ if (structPtr->field_10 != 0)
+ {
+ structPtr->field_E = ((structPtr->field_10 - 1) / 9) * 9;
+ structPtr->field_C = 0;
+ }
+ else
+ {
+ structPtr->field_E = 0;
+ structPtr->field_C = 27;
+ }
+}
+
+u32 *sub_81D0914(u32 *arg0)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ *arg0 = structPtr->field_10;
+ return structPtr->field_14;
+}
+
+u32 *sub_81D092C(u32 *arg0)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ *arg0 = structPtr->field_12;
+ return structPtr->field_78;
+}
+
+u16 sub_81D0944(void)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ return structPtr->field_C;
+}
+
+u32 sub_81D0954(void)
+{
+ struct PokenavSub13 *structPtr = GetSubstructPtr(13);
+ int var = structPtr->field_C;
+ if (var <= 24)
+ return structPtr->field_14[var];
+ else
+ return structPtr->field_78[var - 27];
+}
+
+bool32 sub_81D0978(void)
+{
+ struct PokenavSub14 *structPtr = AllocSubstruct(14, sizeof(struct PokenavSub14));
+ if (structPtr == NULL)
+ return FALSE;
+
+ structPtr->loopedTaskId = CreateLoopedTask(sub_81D0A6C, 1);
+ structPtr->field_0 = sub_81D0A58;
+ return TRUE;
+}
+
+void sub_81D09B0(s32 id)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ structPtr->loopedTaskId = CreateLoopedTask(gUnknown_08624BA0[id], 1);
+ structPtr->field_0 = sub_81D0A58;
+}
+
+u32 sub_81D09E0(void)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ return structPtr->field_0();
+}
+
+void sub_81D09F4(void)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ RemoveWindow(structPtr->field_A);
+ RemoveWindow(structPtr->field_8);
+ RemoveWindow(structPtr->field_C);
+ RemoveWindow(structPtr->field_E);
+ sub_81D1178(structPtr);
+ FreeSpriteTilesByTag(9);
+ FreeSpritePaletteByTag(0xF);
+ FreeSpritePaletteByTag(0x10);
+ FreeSpritePaletteByTag(0x11);
+ FreeSpritePaletteByTag(0x12);
+ FreeSpritePaletteByTag(0x13);
+ FreeSpriteOamMatrix(structPtr->field_14);
+ DestroySprite(structPtr->field_14);
+ FreePokenavSubstruct(14);
+}
+
+bool32 sub_81D0A58(void)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ return IsLoopedTaskActive(structPtr->loopedTaskId);
+}
+
+u32 sub_81D0A6C(s32 state)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ switch (state)
+ {
+ case 0:
+ InitBgTemplates(gUnknown_08624B98, ARRAY_COUNT(gUnknown_08624B98));
+ decompress_and_copy_tile_data_to_vram(2, gUnknown_08DDE030, 0, 0, 0);
+ SetBgTilemapBuffer(2, structPtr->tilemapBuffers[0]);
+ CopyToBgTilemapBuffer(2, gUnknown_08DDE12C, 0, 0);
+ CopyPaletteIntoBufferUnfaded(gUnknown_08DDE010, 0x10, 0x20);
+ CopyBgTilemapBufferToVram(2);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (!free_temp_tile_data_buffers_if_possible())
+ {
+ sub_8199DF0(1, 0, 0, 1);
+ decompress_and_copy_tile_data_to_vram(1, gUnknown_086240B8, 0, 1, 0);
+ SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]);
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20);
+ CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0);
+ CopyPaletteIntoBufferUnfaded(gUnknown_08624098, 0xA0, 0x20);
+ CopyBgTilemapBufferToVram(1);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 2:
+ if (!free_temp_tile_data_buffers_if_possible())
+ {
+ sub_81D0E60(structPtr);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 3:
+ if (!free_temp_tile_data_buffers_if_possible())
+ {
+ sub_81D0FCC(structPtr);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 4:
+ if (!free_temp_tile_data_buffers_if_possible())
+ {
+ sub_81D10A4(structPtr);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 5:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ CopyBgTilemapBufferToVram(2);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 6:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_81D1148(structPtr);
+ return LT_INC_AND_CONTINUE;
+ }
+ return LT_PAUSE;
+ case 7:
+ sub_81D12D8(structPtr);
+ sub_81C7BA4(10);
+ return LT_INC_AND_PAUSE;
+ case 8:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_81D13FC(structPtr);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ShowBg(1);
+ ShowBg(2);
+ HideBg(3);
+ sub_81C7AC0(1);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 9:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ return LT_FINISH;
+ }
+ return LT_FINISH;
+}
+
+u32 sub_81D0C54(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81C7AC0(0);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ return LT_FINISH;
+ }
+ return LT_FINISH;
+}
+
+u32 sub_81D0C84(s32 state)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81D11D8(structPtr);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (!sub_81D1234(structPtr))
+ {
+ sub_81D0FF0(structPtr);
+ return LT_INC_AND_CONTINUE;
+ }
+ return LT_PAUSE;
+ case 2:
+ sub_81D12D8(structPtr);
+ return LT_INC_AND_CONTINUE;
+ case 3:
+ sub_81D10D0(structPtr);
+ return LT_INC_AND_CONTINUE;
+ case 4:
+ sub_81D0E84(structPtr);
+ return LT_INC_AND_CONTINUE;
+ case 5:
+ if (!IsDma3ManagerBusyWithBgCopy())
+ {
+ sub_81D11FC(structPtr);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 6:
+ if (sub_81D1234(structPtr))
+ return LT_PAUSE;
+ return LT_FINISH;
+ }
+ return LT_FINISH;
+}
+
+u32 sub_81D0D2C(s32 state)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81D1448(structPtr);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (!sub_81D1524(structPtr))
+ {
+ sub_81D0EFC(structPtr);
+ sub_81C7BA4(11);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 2:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ }
+ return LT_FINISH;
+}
+
+u32 sub_81D0D8C(s32 state)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81D1500(structPtr);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (!sub_81D1524(structPtr))
+ {
+ sub_81D1448(structPtr);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 2:
+ if (!sub_81D1524(structPtr))
+ {
+ sub_81D0EFC(structPtr);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ }
+ return LT_FINISH;
+}
+
+u32 sub_81D0E00(s32 state)
+{
+ struct PokenavSub14 *structPtr = GetSubstructPtr(14);
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81D1500(structPtr);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (!sub_81D1524(structPtr))
+ {
+ sub_81D0E84(structPtr);
+ sub_81C7BA4(10);
+ return LT_INC_AND_PAUSE;
+ }
+ return LT_PAUSE;
+ case 2:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ }
+ return LT_FINISH;
+}
+
static const struct WindowTemplate gUnknown_08624BB8 =
{
.bg = 2,
@@ -73,18 +743,18 @@ static const struct WindowTemplate gUnknown_08624BB8 =
.baseBlock = 0x14,
};
-void sub_81D0E60(struct Pokenav10Struct2 *structPtr)
+void sub_81D0E60(struct PokenavSub14 *structPtr)
{
structPtr->field_A = AddWindow(&gUnknown_08624BB8);
PutWindowTilemap(structPtr->field_A);
sub_81D0E84(structPtr);
}
-void sub_81D0E84(struct Pokenav10Struct2 *structPtr)
+void sub_81D0E84(struct PokenavSub14 *structPtr)
{
u8 color[] = {4, 2, 3};
- ConvertIntToDecimalStringN(gStringVar1, sub_81D07D8(), STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar1, GetCurrMonRibbonCount(), STR_CONV_MODE_LEFT_ALIGN, 2);
DynamicPlaceholderTextUtil_Reset();
DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_RibbonsF700);
@@ -93,7 +763,7 @@ void sub_81D0E84(struct Pokenav10Struct2 *structPtr)
CopyWindowToVram(structPtr->field_A, 2);
}
-void sub_81D0EFC(struct Pokenav10Struct2 *structPtr)
+void sub_81D0EFC(struct PokenavSub14 *structPtr)
{
s32 i;
u32 ribbonId = sub_81D0954();
@@ -130,7 +800,7 @@ static const struct WindowTemplate gUnknown_08624BC4 =
.baseBlock = 0x54,
};
-void sub_81D0FCC(struct Pokenav10Struct2 *structPtr)
+void sub_81D0FCC(struct PokenavSub14 *structPtr)
{
structPtr->field_8 = AddWindow(&gUnknown_08624BC4);
PutWindowTilemap(structPtr->field_8);
@@ -141,7 +811,7 @@ static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE
static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
static const u8 sGenderlessIconString[] = _("{UNK_SPACER}");
-void sub_81D0FF0(struct Pokenav10Struct2 *structPtr)
+void sub_81D0FF0(struct PokenavSub14 *structPtr)
{
const u8 *genderTxt;
u8 *txtPtr;
@@ -149,7 +819,7 @@ void sub_81D0FF0(struct Pokenav10Struct2 *structPtr)
u16 windowId = structPtr->field_8;
FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
- sub_81D06E4(gStringVar3, &level, &gender);
+ GetCurrMonInfo1(gStringVar3, &level, &gender);
AddTextPrinterParameterized(windowId, 1, gStringVar3, 0, 1, TEXT_SPEED_FF, NULL);
switch (gender)
{
@@ -187,7 +857,7 @@ static const struct WindowTemplate gUnknown_08624BE8[] =
{},
};
-void sub_81D10A4(struct Pokenav10Struct2 *structPtr)
+void sub_81D10A4(struct PokenavSub14 *structPtr)
{
structPtr->field_C = AddWindow(gUnknown_08624BE8);
FillWindowPixelBuffer(structPtr->field_C, PIXEL_FILL(1));
@@ -195,7 +865,7 @@ void sub_81D10A4(struct Pokenav10Struct2 *structPtr)
sub_81D10D0(structPtr);
}
-void sub_81D10D0(struct Pokenav10Struct2 *structPtr)
+void sub_81D10D0(struct PokenavSub14 *structPtr)
{
s32 x;
u8 *txtPtr;
@@ -210,18 +880,18 @@ void sub_81D10D0(struct Pokenav10Struct2 *structPtr)
CopyWindowToVram(structPtr->field_C, 2);
}
-void sub_81D1148(struct Pokenav10Struct2 *structPtr)
+void sub_81D1148(struct PokenavSub14 *structPtr)
{
u16 species;
u32 personality, otId;
- sub_81D0760(&species, &personality, &otId);
+ GetCurrMonInfo2(&species, &personality, &otId);
ResetAllPicSprites();
structPtr->field_10 = sub_81D1184(40, 104);
sub_81C7990(15, 0);
}
-void sub_81D1178(struct Pokenav10Struct2 *structPtr)
+void sub_81D1178(struct PokenavSub14 *structPtr)
{
FreeAndDestroyMonPicSprite(structPtr->field_10);
}
@@ -231,25 +901,25 @@ u16 sub_81D1184(s32 unused0, s32 unused1)
u16 species, spriteId;
u32 personality, otId;
- sub_81D0760(&species, &personality, &otId);
+ GetCurrMonInfo2(&species, &personality, &otId);
spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 40, 104, 15, 0xFFFF);
gSprites[spriteId].oam.priority = 0;
return spriteId;
}
-void sub_81D11D8(struct Pokenav10Struct2 *structPtr)
+void sub_81D11D8(struct PokenavSub14 *structPtr)
{
sub_81D1258(&gSprites[structPtr->field_10], 40, -32, 6);
}
-void sub_81D11FC(struct Pokenav10Struct2 *structPtr)
+void sub_81D11FC(struct PokenavSub14 *structPtr)
{
FreeAndDestroyMonPicSprite(structPtr->field_10);
structPtr->field_10 = sub_81D1184(-32, 104);
sub_81D1258(&gSprites[structPtr->field_10], -32, 40, 6);
}
-bool32 sub_81D1234(struct Pokenav10Struct2 *structPtr)
+bool32 sub_81D1234(struct PokenavSub14 *structPtr)
{
return (gSprites[structPtr->field_10].callback != SpriteCallbackDummy);
}
@@ -286,7 +956,7 @@ void sub_81D1284(struct Sprite *sprite)
}
}
-void sub_81D12D8(void)
+void sub_81D12D8(struct PokenavSub14 *structPtr)
{
u32 *ptr;
@@ -439,7 +1109,7 @@ static const struct SpriteTemplate gUnknown_08624D04 =
.callback = SpriteCallbackDummy,
};
-void sub_81D13FC(struct Pokenav10Struct *structPtr)
+void sub_81D13FC(struct PokenavSub14 *structPtr)
{
u8 spriteId;
@@ -451,7 +1121,7 @@ void sub_81D13FC(struct Pokenav10Struct *structPtr)
structPtr->field_14->invisible = TRUE;
}
-void sub_81D1448(struct Pokenav10Struct *structPtr)
+void sub_81D1448(struct PokenavSub14 *structPtr)
{
u32 ribbonId;
s32 r4 = sub_81D0944();
@@ -471,14 +1141,14 @@ void sub_81D1448(struct Pokenav10Struct *structPtr)
structPtr->field_14->callback = sub_81D1538;
}
-void sub_81D1500(struct Pokenav10Struct *structPtr)
+void sub_81D1500(struct PokenavSub14 *structPtr)
{
structPtr->field_14->data[0] = 1;
StartSpriteAffineAnim(structPtr->field_14, 2);
structPtr->field_14->callback = sub_81D1538;
}
-bool32 sub_81D1524(struct Pokenav10Struct *structPtr)
+bool32 sub_81D1524(struct PokenavSub14 *structPtr)
{
return (structPtr->field_14->callback != SpriteCallbackDummy);
}
diff --git a/src/pokenav_unk_2.c b/src/pokenav_unk_2.c
index 3aec4685e..1c40e146f 100644
--- a/src/pokenav_unk_2.c
+++ b/src/pokenav_unk_2.c
@@ -1,18 +1,1275 @@
#include "global.h"
-#include "gym_leader_rematch.h"
+#include "alloc.h"
+#include "decompress.h"
+#include "bg.h"
+#include "palette.h"
+#include "trig.h"
+#include "gpu_regs.h"
+#include "menu.h"
+#include "window.h"
#include "pokenav.h"
+#include "graphics.h"
+#include "sound.h"
+#include "gym_leader_rematch.h"
+#include "window.h"
+#include "strings.h"
+#include "scanline_effect.h"
+#include "constants/songs.h"
+#include "constants/rgb.h"
+
+// Top Menu
+
+struct Pokenav2Struct
+{
+ bool32 (*callback)(void);
+ u32 loopedTaskId;
+ u16 optionDescriptionWindowId;
+ u8 bg3ScrollTaskId;
+ u8 cursorPos;
+ bool8 otherIconsInMotion;
+ u8 field_00d;
+ bool32 iconVisible[6];
+ struct Sprite * field_028;
+ struct Sprite * iconSprites[6][4];
+ u16 bg1TilemapBuffer[0x400];
+};
+
+static struct Pokenav2Struct * sub_81C9958(void);
+static bool32 sub_81C99FC(void);
+static u32 sub_81C9A10(s32 state);
+static u32 sub_81C9C6C(s32 state);
+static u32 sub_81C9CA8(s32 state);
+static u32 sub_81C9D44(s32 state);
+static u32 sub_81C9DD8(s32 state);
+static u32 sub_81C9E58(s32 state);
+static u32 sub_81C9EC8(s32 state);
+static u32 sub_81C9EF8(s32 state);
+static u32 sub_81C9F28(s32 state);
+static void sub_81C9FC4(void);
+static void sub_81C9FEC(void);
+static void sub_81CA02C(void);
+static void sub_81CA094(void);
+static void sub_81CA0C8(void);
+static void sub_81CA0EC(const u16 *const * a0, s32 a1, s32 a2);
+static void sub_81CA20C(void);
+static void sub_81CA278(void);
+static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3);
+static void sub_81CA3B4(struct Sprite ** sprites);
+static void sub_81CA2DC(void);
+static bool32 sub_81CA324(void);
+static void sub_81CA448(struct Sprite ** sprites, bool32 a1);
+static void sub_81CA474(struct Sprite * sprite);
+static void sub_81CA4AC(struct Sprite * sprite);
+static void sub_81CA580(u8 taskId);
+static void sub_81CA640(void);
+static void sub_81CA6AC(struct Sprite * sprite);
+static void sub_81CA698(void);
+static void sub_81CA6E0(void);
+static void sub_81CA714(void);
+static void sub_81CA770(void);
+static bool32 sub_81CA7C4(void);
+static void sub_81CA7D4(void);
+static void sub_81CA7F4(void);
+static void sub_81CA808(u8 taskId);
+static void sub_81CA818(void);
+static void sub_81CA850(void);
+static void sub_81CA864(void);
+static bool32 sub_81CA89C(void);
+static void sub_81CA8B0(u8 taskId);
+static void sub_81CA92C(void);
+static void sub_81CA994(void);
+static void sub_81CA9C8(void);
+static void sub_81CA9D8(void);
+static void sub_81CA9EC(u8 taskId);
+static void sub_81CAA3C(void);
+
+static const u16 gUnknown_0861FC78[] = INCBIN_U16("graphics/pokenav/bg.gbapal");
+static const u32 gUnknown_0861FC98[] = INCBIN_U32("graphics/pokenav/bg.4bpp.lz");
+static const u32 gUnknown_0861FCAC[] = INCBIN_U32("graphics/pokenav/bg.bin.lz");
+static const u16 gUnknown_0861FD4C[] = INCBIN_U16("graphics/pokenav/outline.gbapal");
+static const u32 gUnknown_0861FD6C[] = INCBIN_U32("graphics/pokenav/outline.4bpp.lz");
+static const u32 gUnknown_0861FFF4[] = INCBIN_U32("graphics/pokenav/outline_map.bin.lz");
+static const u16 gUnknown_08620104[] = INCBIN_U16("graphics/pokenav/blue_light.gbapal");
+static const u32 gUnknown_08620124[] = INCBIN_U32("graphics/pokenav/blue_light.4bpp.lz");
+
+static const struct BgTemplate gUnknown_08620194[] = {
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 15,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0x000
+ }, {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 23,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x000
+ }, {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0x000
+ }
+};
+
+static const LoopedTask gUnknown_086201A0[] = {
+ NULL,
+ sub_81C9C6C,
+ sub_81C9CA8,
+ sub_81C9D44,
+ sub_81C9DD8,
+ sub_81C9E58,
+ sub_81C9EC8,
+ sub_81C9EF8,
+ sub_81C9F28
+};
+
+static const struct CompressedSpriteSheet gUnknown_086201C4[] =
+{
+ {
+ .data = gPokenavOptions_Gfx,
+ .size = 0x3400,
+ .tag = 0x0003
+ },
+ {
+ .data = gUnknown_08620124,
+ .size = 0x0100,
+ .tag = 0x0001
+ }
+};
+
+static const struct SpritePalette gUnknown_086201D4[] =
+{
+ {gPokenavOptions_Pal + 0x00, 4},
+ {gPokenavOptions_Pal + 0x10, 5},
+ {gPokenavOptions_Pal + 0x20, 6},
+ {gPokenavOptions_Pal + 0x30, 7},
+ {gPokenavOptions_Pal + 0x40, 8},
+ {gUnknown_08620104, 3},
+ {}
+};
+
+static const u16 gUnknown_0862020C[] = {0, 0};
+static const u16 gUnknown_08620210[] = {0x20, 1};
+static const u16 gUnknown_08620214[] = {0x40, 4};
+static const u16 gUnknown_08620218[] = {0x60, 2};
+static const u16 gUnknown_0862021C[] = {0x80, 3};
+static const u16 gUnknown_08620220[] = {0xA0, 1};
+static const u16 gUnknown_08620224[] = {0xC0, 1};
+static const u16 gUnknown_08620228[] = {0xE0, 4};
+static const u16 gUnknown_0862022C[] = {0x100, 1};
+static const u16 gUnknown_08620230[] = {0x120, 2};
+static const u16 gUnknown_08620234[] = {0x140, 0};
+static const u16 gUnknown_08620238[] = {0x160, 0};
+static const u16 gUnknown_0862023C[] = {0x180, 3};
+
+struct UnkStruct_08620240
+{
+ u16 unk0;
+ u16 unk2;
+ const u16 *unk4[6];
+};
+
+static const struct UnkStruct_08620240 gUnknown_08620240[5] =
+{
+ {
+ 0x2A,
+ 0x14,
+ {gUnknown_0862020C, gUnknown_08620210, gUnknown_0862021C}
+ },
+ {
+ 0x2A,
+ 0x14,
+ {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_0862021C}
+ },
+ {
+ 0x2A,
+ 0x14,
+ {gUnknown_0862020C, gUnknown_08620210, gUnknown_08620214, gUnknown_08620218, gUnknown_0862021C}
+ },
+ {
+ 0x38,
+ 0x14,
+ {gUnknown_08620220, gUnknown_08620224, gUnknown_0862023C}
+ },
+ {
+ 0x28,
+ 0x10,
+ {gUnknown_08620228, gUnknown_0862022C, gUnknown_08620230, gUnknown_08620234, gUnknown_08620238, gUnknown_0862023C}
+ },
+};
+
+static const struct WindowTemplate gUnknown_086202CC =
+{
+ .bg = 1,
+ .tilemapLeft = 3,
+ .tilemapTop = 17,
+ .width = 0x18,
+ .height = 0x2,
+ .paletteNum = 1,
+ .baseBlock = 8
+};
+
+static const u8 *const gUnknown_086202D4[] =
+{
+ gUnknown_085EBCC5,
+ gUnknown_085EBCE8,
+ gUnknown_085EBD01,
+ gUnknown_085EBD1C,
+ gUnknown_085EBD34,
+ gUnknown_085EBD83,
+ gUnknown_085EBDA2,
+ gUnknown_085EBDBF,
+ gUnknown_085EBDDB,
+ gUnknown_085EBDEE,
+ gUnknown_085EBE06,
+ gUnknown_085EBE19,
+ gUnknown_085EBE2D,
+ gUnknown_085EBE41
+};
+
+static const u8 gUnknown_0862030C[] = {6, 8, 7};
+
+static const u8 gUnknown_0862030F[] = {6, 8, 7, 0, 0};
+
+static const struct OamData gUnknown_08620314 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+static const union AffineAnimCmd gUnknown_0862031C[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd gUnknown_0862032C[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0x12),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const gUnknown_08620344[] =
+{
+ gUnknown_0862031C,
+ gUnknown_0862032C
+};
+
+static const struct SpriteTemplate gUnknown_0862034C =
+{
+ .tileTag = 3,
+ .paletteTag = 4,
+ .oam = &gUnknown_08620314,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gUnknown_08620344,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData gUnknown_08620364 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+static const struct SpriteTemplate gUnknown_0862036C =
+{
+ .tileTag = 1,
+ .paletteTag = 3,
+ .oam = &gUnknown_08620364,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct ScanlineEffectParams gUnknown_08620384 =
+{
+ (void *)REG_ADDR_WIN0H,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
+ 1,
+ 0
+};
-bool32 sub_81C98D4(void)
+static bool32 sub_81C98D4(void)
{
s32 i;
for (i = 0; i < REMATCH_TABLE_ENTRIES; i++)
{
if (sub_81CB0C8(i) == gMapHeader.regionMapSectionId
- && sub_81CAE08(i)
- && gSaveBlock1Ptr->trainerRematches[i])
+ && sub_81CAE08(i)
+ && gSaveBlock1Ptr->trainerRematches[i])
return TRUE;
}
return FALSE;
}
+
+bool32 sub_81C9924(void)
+{
+ struct Pokenav2Struct * unk = sub_81C9958();
+
+ if (unk == NULL)
+ return FALSE;
+
+ unk->field_00d = 0;
+ return TRUE;
+}
+
+bool32 sub_81C9940(void)
+{
+ struct Pokenav2Struct * unk = sub_81C9958();
+
+ if (unk == NULL)
+ return FALSE;
+
+ unk->field_00d = 1;
+ return TRUE;
+}
+
+static struct Pokenav2Struct * sub_81C9958(void)
+{
+ struct Pokenav2Struct * unk = AllocSubstruct(2, sizeof(struct Pokenav2Struct));
+
+ if (unk != NULL)
+ {
+ unk->otherIconsInMotion = FALSE;
+ unk->loopedTaskId = CreateLoopedTask(sub_81C9A10, 1);
+ unk->callback = sub_81C99FC;
+ }
+
+ return unk;
+}
+
+
+void sub_81C9990(s32 ltIdx)
+{
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ unk->loopedTaskId = CreateLoopedTask(gUnknown_086201A0[ltIdx], 1);
+ unk->callback = sub_81C99FC;
+}
+
+bool32 sub_81C99C0(void)
+{
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ return unk->callback();
+}
+
+void sub_81C99D4(void)
+{
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ sub_81CA7F4();
+ RemoveWindow(unk->optionDescriptionWindowId);
+ sub_81C9FEC();
+ sub_81CA994();
+ FreePokenavSubstruct(2);
+}
+
+static bool32 sub_81C99FC(void)
+{
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ return IsLoopedTaskActive(unk->loopedTaskId);
+}
+
+static u32 sub_81C9A10(s32 state)
+{
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ switch (state)
+ {
+ case 0:
+ InitBgTemplates(gUnknown_08620194, ARRAY_COUNT(gUnknown_08620194));
+ decompress_and_copy_tile_data_to_vram(1, gPokenavMessageBox_Gfx, 0, 0, 0);
+ SetBgTilemapBuffer(1, unk->bg1TilemapBuffer);
+ CopyToBgTilemapBuffer(1, gPokenavMessageBox_Tilemap, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyPaletteIntoBufferUnfaded(gPokenavMessageBox_Pal, 0x10, 0x20);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ decompress_and_copy_tile_data_to_vram(2, gUnknown_0861FD6C, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(2, gUnknown_0861FFF4, 0, 0, 1);
+ CopyPaletteIntoBufferUnfaded(gUnknown_0861FD4C, 0x20, 0x20);
+ return LT_INC_AND_PAUSE;
+ case 2:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FC98, 0, 0, 0);
+ decompress_and_copy_tile_data_to_vram(3, gUnknown_0861FCAC, 0, 0, 1);
+ CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78, 0x30, 0x20);
+ if (sub_81C9894() == 3 || sub_81C9894() == 4)
+ sub_81CA850();
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ sub_81CA6E0();
+ sub_81CA7D4();
+ return LT_INC_AND_CONTINUE;
+ case 4:
+ sub_81C9FC4();
+ return LT_INC_AND_CONTINUE;
+ case 5:
+ sub_81CA714();
+ sub_81CA02C();
+ sub_81CA640();
+ sub_81CA0C8();
+ return LT_INC_AND_PAUSE;
+ case 6:
+ if (sub_81CA7C4())
+ return LT_PAUSE;
+ return LT_INC_AND_CONTINUE;
+ case 7:
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+ if (unk->field_00d)
+ sub_81C7AC0(1);
+ else
+ {
+ PlaySE(SE_PN_ON);
+ sub_81C7AC0(3);
+ }
+ switch (sub_81C9894())
+ {
+ case 4:
+ LoadLeftHeaderGfxForIndex(7);
+ // fallthrough
+ case 3:
+ LoadLeftHeaderGfxForIndex(1);
+ break;
+ default:
+ LoadLeftHeaderGfxForIndex(0);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 8:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ switch (sub_81C9894())
+ {
+ case 4:
+ sub_81C7FA0(7, FALSE, FALSE);
+ // fallthrough
+ case 3:
+ sub_81C7FA0(1, FALSE, FALSE);
+ break;
+ default:
+ sub_81C7FA0(0, FALSE, FALSE);
+ break;
+ }
+ sub_81CA20C();
+ sub_81CA92C();
+ return LT_INC_AND_CONTINUE;
+ case 9:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9C6C(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_81CAA3C();
+ sub_81CA278();
+ sub_81CA714();
+ PlaySE(SE_SELECT);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81CA7C4())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9CA8(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_81CA9C8();
+ sub_81CA2DC();
+ sub_81C7FC4(0, 0);
+ PlaySE(SE_SELECT);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ sub_81CA0C8();
+ LoadLeftHeaderGfxForIndex(1);
+ return LT_INC_AND_PAUSE;
+ case 2:
+ sub_81CA20C();
+ sub_81C7FA0(1, FALSE, FALSE);
+ sub_81CA818();
+ sub_81CA714();
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ if (sub_81CA89C())
+ return LT_PAUSE;
+ if (sub_81CA7C4())
+ return LT_PAUSE;
+ sub_81CA9D8();
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9D44(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_81CA9C8();
+ sub_81CA2DC();
+ sub_81C7FC4(1, 0);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ sub_81CA0C8();
+ LoadLeftHeaderGfxForIndex(0);
+ return LT_INC_AND_PAUSE;
+ case 2:
+ sub_81CA20C();
+ sub_81C7FA0(0, FALSE, FALSE);
+ sub_81CA864();
+ sub_81CA714();
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ if (sub_81CA89C())
+ return LT_PAUSE;
+ if (sub_81CA7C4())
+ return LT_PAUSE;
+ sub_81CA9D8();
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9DD8(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_81CA9C8();
+ sub_81CA2DC();
+ PlaySE(SE_SELECT);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ LoadLeftHeaderGfxForIndex(7);
+ sub_81CA0C8();
+ return LT_INC_AND_PAUSE;
+ case 2:
+ sub_81CA20C();
+ sub_81C7FA0(7, FALSE, FALSE);
+ sub_81CA714();
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ if (sub_81CA89C())
+ return LT_PAUSE;
+ sub_81CA9D8();
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9E58(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_81CA9C8();
+ sub_81CA2DC();
+ sub_81C7FC4(7, 0);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ sub_81CA0C8();
+ return LT_INC_AND_PAUSE;
+ case 2:
+ sub_81CA20C();
+ sub_81CA714();
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81CA89C())
+ return LT_PAUSE;
+ sub_81CA9D8();
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9EC8(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_HAZURE);
+ sub_81CA770();
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9EF8(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81CA714();
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81C9F28(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_81C7BA4(sub_81C98C4());
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsDma3ManagerBusyWithBgCopy_())
+ return LT_PAUSE;
+ sub_81C7880();
+ sub_81CA9C8();
+ sub_81CA2DC();
+ switch (sub_81C9894())
+ {
+ case 4:
+ sub_81C7FC4(7, FALSE);
+ // fallthrough
+ case 3:
+ sub_81C7FC4(1, FALSE);
+ break;
+ default:
+ sub_81C7FC4(0, FALSE);
+ break;
+ }
+ PlaySE(SE_SELECT);
+ return LT_INC_AND_PAUSE;
+ case 2:
+ if (sub_81CA324())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ sub_81C7AC0(0);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static void sub_81C9FC4(void)
+{
+ s32 i;
+
+ for (i = 0; i < NELEMS(gUnknown_086201C4); i++)
+ LoadCompressedSpriteSheet(&gUnknown_086201C4[i]);
+ Pokenav_AllocAndLoadPalettes(gUnknown_086201D4);
+}
+
+static void sub_81C9FEC(void)
+{
+ FreeSpriteTilesByTag(3);
+ FreeSpriteTilesByTag(1);
+ FreeSpritePaletteByTag(4);
+ FreeSpritePaletteByTag(5);
+ FreeSpritePaletteByTag(6);
+ FreeSpritePaletteByTag(7);
+ FreeSpritePaletteByTag(8);
+ FreeSpritePaletteByTag(3);
+ sub_81CA094();
+ sub_81CA698();
+}
+
+static void sub_81CA02C(void)
+{
+ s32 i, j;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ for (i = 0; i < 6; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ u8 spriteId = CreateSprite(&gUnknown_0862034C, 0x8c, 20 * i + 40, 3);
+ unk->iconSprites[i][j] = &gSprites[spriteId];
+ gSprites[spriteId].pos2.x = 32 * j;
+ }
+ }
+}
+
+static void sub_81CA094(void)
+{
+ s32 i, j;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ for (i = 0; i < 6; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ FreeSpriteOamMatrix(unk->iconSprites[i][j]);
+ DestroySprite(unk->iconSprites[i][j]);
+ }
+ }
+}
+
+static void sub_81CA0C8(void)
+{
+ s32 r0 = sub_81C9894();
+ sub_81CA0EC(gUnknown_08620240[r0].unk4, gUnknown_08620240[r0].unk0, gUnknown_08620240[r0].unk2);
+}
+
+static void sub_81CA0EC(const u16 *const *a0, s32 a1, s32 a2)
+{
+ s32 i, j;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+ s32 sp04 = GetSpriteTileStartByTag(3);
+
+ for (i = 0; i < 6; i++)
+ {
+ if (*a0 != NULL)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ unk->iconSprites[i][j]->oam.tileNum = (*a0)[0] + sp04 + 8 * j;
+ unk->iconSprites[i][j]->oam.paletteNum = IndexOfSpritePaletteTag((*a0)[1] + 4);
+ unk->iconSprites[i][j]->invisible = TRUE;
+ unk->iconSprites[i][j]->pos1.y = a1;
+ unk->iconSprites[i][j]->pos1.x = 0x8c;
+ unk->iconSprites[i][j]->pos2.x = 32 * j;
+ }
+ unk->iconVisible[i] = TRUE;
+ }
+ else
+ {
+ for (j = 0; j < 4; j++)
+ {
+ unk->iconSprites[i][j]->invisible = TRUE;
+ }
+ unk->iconVisible[i] = FALSE;
+ }
+ a0++;
+ a1 += a2;
+ }
+}
+
+static void sub_81CA20C(void)
+{
+ s32 i;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+ s32 r8 = sub_81C98A4();
+ s32 r7 = 0;
+ s32 r2;
+
+ for (i = 0; i < 6; i++)
+ {
+ if (unk->iconVisible[i])
+ {
+ if (r7++ == r8)
+ {
+ r2 = 0x82;
+ unk->cursorPos = i;
+ }
+ else
+ r2 = 0x8c;
+ sub_81CA35C(unk->iconSprites[i], 0x100, r2, 0xC);
+ sub_81CA448(unk->iconSprites[i], FALSE);
+ }
+ else
+ sub_81CA448(unk->iconSprites[i], TRUE);
+ }
+}
+
+static void sub_81CA278(void)
+{
+ s32 i;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+ s32 r3 = sub_81C98A4();
+ s32 r5;
+
+ for (i = 0, r5 = 0; i < 6; i++)
+ {
+ if (unk->iconVisible[i])
+ {
+ if (r5 == r3)
+ {
+ r5 = i;
+ break;
+ }
+ r5++;
+ }
+ }
+
+ sub_81CA35C(unk->iconSprites[unk->cursorPos], 0x82, 0x8c, 0x4);
+ sub_81CA35C(unk->iconSprites[r5], 0x8c, 0x82, 0x4);
+ unk->cursorPos = r5;
+}
+
+static void sub_81CA2DC(void)
+{
+ s32 i;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ for (i = 0; i < 6; i++)
+ {
+ if (unk->iconVisible[i])
+ {
+ if (unk->cursorPos != i)
+ sub_81CA35C(unk->iconSprites[i], 0x8C, 0x100, 0x8);
+ else
+ sub_81CA3B4(unk->iconSprites[i]);
+ }
+ }
+}
+
+static bool32 sub_81CA324(void)
+{
+ s32 i;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+
+ for (i = 0; i < 6; i++)
+ {
+ if (unk->iconSprites[i][0]->callback != SpriteCallbackDummy)
+ return TRUE;
+ }
+
+ if (unk->otherIconsInMotion)
+ return TRUE;
+
+ return FALSE;
+}
+
+static void sub_81CA35C(struct Sprite ** sprites, s32 a1, s32 a2, s32 a3)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ (*sprites)->pos1.x = a1;
+ (*sprites)->data[0] = a3;
+ (*sprites)->data[1] = 16 * (a2 - a1) / a3;
+ (*sprites)->data[2] = 16 * a1;
+ (*sprites)->data[7] = a2;
+ (*sprites)->callback = sub_81CA474;
+ sprites++;
+ }
+}
+
+static void sub_81CA3B4(struct Sprite ** sprites)
+{
+ s32 i;
+ struct Pokenav2Struct * unk = GetSubstructPtr(2);
+ u8 taskId;
+
+ for (i = 0; i < 4; i++)
+ {
+ (*sprites)->oam.objMode = ST_OAM_OBJ_BLEND;
+ (*sprites)->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ (*sprites)->callback = sub_81CA4AC;
+ (*sprites)->data[0] = 8;
+ (*sprites)->data[1] = 0;
+ (*sprites)->data[7] = i;
+ InitSpriteAffineAnim(sprites[0]);
+ StartSpriteAffineAnim(sprites[0], 0);
+ sprites++;
+ }
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x00));
+ taskId = CreateTask(sub_81CA580, 3);
+ gTasks[taskId].data[0] = 8;
+ unk->otherIconsInMotion++;
+}
+
+static void sub_81CA448(struct Sprite ** sprites, bool32 a1)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ (*sprites)->invisible = a1;
+ sprites++;
+ }
+}
+
+static void sub_81CA474(struct Sprite * sprite)
+{
+ sprite->data[0]--;
+ if (sprite->data[0] != -1)
+ {
+ sprite->data[2] += sprite->data[1];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ }
+ else
+ {
+ sprite->pos1.x = sprite->data[7];
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_81CA4AC(struct Sprite * sprite)
+{
+ s32 r0;
+ s32 r1;
+ if (sprite->data[0] == 0)
+ {
+ if (sprite->data[1] == 0)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[1]++;
+ sprite->data[2] = 0x100;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ sprite->data[2] += 16;
+ r0 = sprite->data[2];
+ r1 = r0 >> 3;
+ r1 = (r1 - 32) / 2;
+ switch (sprite->data[7])
+ {
+ case 0:
+ sprite->pos2.x = -r1 * 3;
+ break;
+ case 1:
+ sprite->pos2.x = -r1;
+ break;
+ case 2:
+ sprite->pos2.x = r1;
+ break;
+ case 3:
+ sprite->pos2.x = r1 * 3;
+ break;
+ }
+ if (sprite->affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0);
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
+ sprite->oam.objMode = ST_OAM_OBJ_NORMAL;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ }
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+static void sub_81CA580(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ switch (data[1])
+ {
+ case 0:
+ data[2] = 16;
+ data[3] = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x10, 0x00));
+ data[1]++;
+ break;
+ case 1:
+ if (data[4] & 1)
+ {
+ data[2] -= 3;
+ if (data[2] < 0)
+ data[2] = 0;
+ }
+ else
+ {
+ data[3] += 3;
+ if (data[3] > 16)
+ data[3] = 16;
+ }
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(data[2], data[3]));
+ data[4]++;
+ if (data[4] == 12)
+ {
+ ((struct Pokenav2Struct *)GetSubstructPtr(2))->otherIconsInMotion--;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0x00, 0x10));
+ DestroyTask(taskId);
+ }
+ break;
+ }
+ }
+ else
+ data[0]--;
+}
+
+static void sub_81CA640(void)
+{
+ struct Pokenav2Struct * ptr = GetSubstructPtr(2);
+ u8 spriteId = CreateSprite(&gUnknown_0862036C, 0x10, 0x60, 4);
+ ptr->field_028 = &gSprites[spriteId];
+ if (sub_81C98D4())
+ ptr->field_028->callback = sub_81CA6AC;
+ else
+ ptr->field_028->invisible = TRUE;
+}
+
+static void sub_81CA698(void)
+{
+ struct Pokenav2Struct * ptr = GetSubstructPtr(2);
+ DestroySprite(ptr->field_028);
+}
+
+static void sub_81CA6AC(struct Sprite * sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] > 8)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible ^= 1;
+ }
+}
+
+static void sub_81CA6E0(void)
+{
+ struct Pokenav2Struct * ptr = GetSubstructPtr(2);
+
+ ptr->optionDescriptionWindowId = AddWindow(&gUnknown_086202CC);
+ PutWindowTilemap(ptr->optionDescriptionWindowId);
+ FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6));
+ CopyWindowToVram(ptr->optionDescriptionWindowId, 3);
+}
+
+static void sub_81CA714(void)
+{
+ struct Pokenav2Struct * ptr = GetSubstructPtr(2);
+ int i = sub_81C98B4();
+ const u8 * s = gUnknown_086202D4[i];
+ u32 width = GetStringWidth(1, s, -1);
+ FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6));
+ AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, gUnknown_0862030C, 0, s);
+}
+
+
+static void sub_81CA770(void)
+{
+ struct Pokenav2Struct * ptr = GetSubstructPtr(2);
+ const u8 * s = gText_NoRibbonWinners;
+ u32 width = GetStringWidth(1, s, -1);
+ FillWindowPixelBuffer(ptr->optionDescriptionWindowId, PIXEL_FILL(6));
+ AddTextPrinterParameterized3(ptr->optionDescriptionWindowId, 1, (192 - width) / 2, 1, gUnknown_0862030F, 0, s);
+}
+
+static bool32 sub_81CA7C4(void)
+{
+ return IsDma3ManagerBusyWithBgCopy();
+}
+
+static void sub_81CA7D4(void)
+{
+ struct Pokenav2Struct * ptr = GetSubstructPtr(2);
+ ptr->bg3ScrollTaskId = CreateTask(sub_81CA808, 2);
+}
+
+static void sub_81CA7F4(void)
+{
+ struct Pokenav2Struct * ptr = GetSubstructPtr(2);
+ DestroyTask(ptr->bg3ScrollTaskId);
+}
+
+static void sub_81CA808(u8 taskId)
+{
+ ChangeBgX(3, 0x80, 1);
+}
+
+static void sub_81CA818(void)
+{
+ u8 taskId = CreateTask(sub_81CA8B0, 3);
+ SetWordTaskArg(taskId, 1, (uintptr_t)(gUnknown_0861FC78 + 1));
+ SetWordTaskArg(taskId, 3, (uintptr_t)(gUnknown_0861FC78 + 7));
+}
+
+static void sub_81CA850(void)
+{
+ CopyPaletteIntoBufferUnfaded(gUnknown_0861FC78 + 7, 0x31, 4);
+}
+
+static void sub_81CA864(void)
+{
+ u8 taskId = CreateTask(sub_81CA8B0, 3);
+ SetWordTaskArg(taskId, 1, (uintptr_t)(gUnknown_0861FC78 + 7));
+ SetWordTaskArg(taskId, 3, (uintptr_t)(gUnknown_0861FC78 + 1));
+}
+
+static bool32 sub_81CA89C(void)
+{
+ return FuncIsActiveTask(sub_81CA8B0);
+}
+
+static void sub_81CA8B0(u8 taskId)
+{
+ u16 sp8[2];
+ s16 * data = gTasks[taskId].data;
+ const u16 * pal1 = (const u16 *)GetWordTaskArg(taskId, 1);
+ const u16 * pal2 = (const u16 *)GetWordTaskArg(taskId, 3);
+
+ sub_81C79BC(pal1, pal2, 2, 12, ++data[0], sp8);
+ LoadPalette(sp8, 0x31, 4);
+ if (data[0] == 12)
+ DestroyTask(taskId);
+}
+
+static void sub_81CA914(void)
+{
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+static void sub_81CA92C(void)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuRegBits(REG_OFFSET_WININ, 0x3F);
+ SetGpuRegBits(REG_OFFSET_WINOUT, 0x1F);
+ SetGpuRegBits(REG_OFFSET_WIN0V, 0xA0);
+ ScanlineEffect_Stop();
+ sub_81CAA3C();
+ ScanlineEffect_SetParams(gUnknown_08620384);
+ SetVBlankCallback_(sub_81CA914);
+ CreateTask(sub_81CA9EC, 3);
+}
+
+static void sub_81CA994(void)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ ScanlineEffect_Stop();
+ DestroyTask(FindTaskIdByFunc(sub_81CA9EC));
+ SetPokenavVBlankCallback();
+}
+
+static void sub_81CA9C8(void)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void sub_81CA9D8(void)
+{
+ sub_81CAA3C();
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN);
+}
+
+static void sub_81CA9EC(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ data[0]++;
+ if (data[0] > 0)
+ {
+ data[0] = 0;
+ data[1] += 3;
+ data[1] &= 0x7F;
+ SetGpuReg(REG_OFFSET_BLDY, gSineTable[data[1]] >> 5);
+ }
+}
+
+static void sub_81CAA3C(void)
+{
+ int i = sub_81C9894();
+ int j = sub_81C98A4();
+ int r4 = gUnknown_08620240[i].unk2 * j + gUnknown_08620240[i].unk0 - 8;
+ CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140);
+ CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140);
+ CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[0][r4], 0x20);
+ CpuFill16(RGB(16, 23, 28), &gScanlineEffectRegBuffers[1][r4], 0x20);
+}
+
+void sub_81CAADC(void)
+{
+ sub_81CA9C8();
+}
diff --git a/src/pokenav_unk_3.c b/src/pokenav_unk_3.c
index 404743345..c66434192 100755
--- a/src/pokenav_unk_3.c
+++ b/src/pokenav_unk_3.c
@@ -26,7 +26,7 @@ struct Pokenav3Struct
u32 unk10;
u32 unk14;
u32 (*callback)(struct Pokenav3Struct*);
- struct Pokenav3Struct_Unk1C unk1C[99];
+ struct PokenavMonList unk1C[99];
};
static u32 sub_81CAB44(struct Pokenav3Struct *);
@@ -34,14 +34,15 @@ static u32 sub_81CABFC(struct Pokenav3Struct *);
static u32 sub_81CAC04(struct Pokenav3Struct *);
static u32 sub_81CACB8(struct Pokenav3Struct *);
static u32 sub_81CACF8(struct Pokenav3Struct *);
-static u32 sub_81CAD20(int);
+static u32 sub_81CAD20(s32);
static bool32 sub_81CB1D0(void);
-extern const u8 gUnknown_08622508[];
-extern const u8 gUnknown_0862250A[];
-extern const u8 *const gUnknown_08622028[][4];
+#include "data/text/match_call_messages.h"
-bool32 sub_81CAAE8(void)
+const u8 gUnknown_08622508[] = {0, 2};
+const u8 gUnknown_0862250A[] = {0, 1, 2};
+
+bool32 PokenavCallback_Init_11(void)
{
struct Pokenav3Struct *state = AllocSubstruct(5, sizeof(struct Pokenav3Struct));
if (!state)
@@ -83,7 +84,7 @@ static u32 sub_81CAB44(struct Pokenav3Struct *state)
state->callback = sub_81CAC04;
state->unk0 = 0;
selectedMatchCall = GetSelectedMatchCall();
- if (!state->unk1C[selectedMatchCall].unk0 || sub_81D17E8(state->unk1C[selectedMatchCall].unk2))
+ if (!state->unk1C[selectedMatchCall].boxId || MatchCall_HasCheckPage(state->unk1C[selectedMatchCall].unk6))
{
state->unk4 = gUnknown_0862250A;
state->unk2 = 2;
@@ -190,7 +191,7 @@ static u32 sub_81CACF8(struct Pokenav3Struct *state)
return 0;
}
-static u32 sub_81CAD20(int taskState)
+static u32 sub_81CAD20(s32 taskState)
{
int i, j;
struct Pokenav3Struct *state = GetSubstructPtr(5);
@@ -205,13 +206,13 @@ static u32 sub_81CAD20(int taskState)
{
if (MatchCallFlagGetByIndex(j))
{
- state->unk1C[state->unkA].unk2 = j;
- state->unk1C[state->unkA].unk0 = 1;
- state->unk1C[state->unkA].unk1 = sub_81D16DC(j);
+ state->unk1C[state->unkA].unk6 = j;
+ state->unk1C[state->unkA].boxId = 1;
+ state->unk1C[state->unkA].monId = MatchCallMapSecGetByIndex(j);
state->unkA++;
}
- if (++state->unk8 >= 21) // TODO: This is the size of sMatchCallHeaders
+ if (++state->unk8 >= MC_HEADER_COUNT)
{
state->unkC = state->unk8;
state->unk8 = 0;
@@ -225,9 +226,9 @@ static u32 sub_81CAD20(int taskState)
{
if (!sub_81D1BF8(state->unk8) && sub_81CAE08(state->unk8))
{
- state->unk1C[state->unkA].unk2 = state->unk8;
- state->unk1C[state->unkA].unk0 = 0;
- state->unk1C[state->unkA].unk1 = sub_81CB0C8(j);
+ state->unk1C[state->unkA].unk6 = state->unk8;
+ state->unk1C[state->unkA].boxId = 0;
+ state->unk1C[state->unkA].monId = sub_81CB0C8(j);
state->unkA++;
}
@@ -283,10 +284,10 @@ int unref_sub_81CAE6C(int arg0)
if (arg0 >= state->unkA)
return REMATCH_TABLE_ENTRIES;
- return state->unk1C[arg0].unk2;
+ return state->unk1C[arg0].unk6;
}
-struct Pokenav3Struct_Unk1C *sub_81CAE94(void)
+struct PokenavMonList *sub_81CAE94(void)
{
struct Pokenav3Struct *state = GetSubstructPtr(5);
return state->unk1C;
@@ -295,16 +296,16 @@ struct Pokenav3Struct_Unk1C *sub_81CAE94(void)
u16 sub_81CAEA4(int index)
{
struct Pokenav3Struct *state = GetSubstructPtr(5);
- return state->unk1C[index].unk1;
+ return state->unk1C[index].monId;
}
bool32 sub_81CAEBC(int index)
{
struct Pokenav3Struct *state = GetSubstructPtr(5);
- if (!state->unk1C[index].unk0)
- index = state->unk1C[index].unk2;
+ if (!state->unk1C[index].boxId)
+ index = state->unk1C[index].unk6;
else
- index = MatchCall_GetRematchTableIdx(state->unk1C[index].unk2);
+ index = MatchCall_GetRematchTableIdx(state->unk1C[index].unk6);
if (index == REMATCH_TABLE_ENTRIES)
return FALSE;
@@ -316,13 +317,13 @@ int sub_81CAF04(int index)
{
int var0;
struct Pokenav3Struct *state = GetSubstructPtr(5);
- if (!state->unk1C[index].unk0)
+ if (!state->unk1C[index].boxId)
{
- index = GetTrainerIdxByRematchIdx(state->unk1C[index].unk2);
+ index = GetTrainerIdxByRematchIdx(state->unk1C[index].unk6);
return gTrainers[index].trainerPic;
}
- var0 = state->unk1C[index].unk2;
+ var0 = state->unk1C[index].unk6;
index = MatchCall_GetRematchTableIdx(var0);
if (index != REMATCH_TABLE_ENTRIES)
{
@@ -330,7 +331,7 @@ int sub_81CAF04(int index)
return gTrainers[index].trainerPic;
}
- index = sub_81D1BD0(var0);
+ index = MatchCall_GetOverrideFacilityClass(var0);
return gFacilityClassToPicIndex[index];
}
@@ -341,10 +342,10 @@ const u8 *sub_81CAF78(int index, u8 *arg1)
if (!Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType))
return gText_CallCantBeMadeHere;
- if (!state->unk1C[index].unk0)
- *arg1 = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->unk1C[index].unk2), gStringVar4);
+ if (!state->unk1C[index].boxId)
+ *arg1 = SelectMatchCallMessage(GetTrainerIdxByRematchIdx(state->unk1C[index].unk6), gStringVar4);
else
- MatchCall_GetMessage(state->unk1C[index].unk2, gStringVar4);
+ MatchCall_GetMessage(state->unk1C[index].unk6, gStringVar4);
return gStringVar4;
}
@@ -353,18 +354,18 @@ const u8 *sub_81CAFD8(int index, int textType)
{
int var0;
struct Pokenav3Struct *state = GetSubstructPtr(5);
- if (state->unk1C[index].unk0)
+ if (state->unk1C[index].boxId)
{
- var0 = MatchCall_GetRematchTableIdx(state->unk1C[index].unk2);
+ var0 = MatchCall_GetRematchTableIdx(state->unk1C[index].unk6);
if (var0 == REMATCH_TABLE_ENTRIES)
- return sub_81D1B40(state->unk1C[index].unk2, textType);
+ return MatchCall_GetOverrideFlavorText(state->unk1C[index].unk6, textType);
}
else
{
- var0 = state->unk1C[index].unk2;
+ var0 = state->unk1C[index].unk6;
}
- return gUnknown_08622028[var0][textType];
+ return gMatchCallMessages[var0][textType];
}
u16 sub_81CB01C(void)
@@ -382,14 +383,13 @@ u16 sub_81CB02C(int arg0)
return state->unk4[arg0];
}
-void sub_81CB050(u32 arg0, u8 *str)
+void sub_81CB050(struct PokenavMonList * arg0, u8 *str)
{
- struct Pokenav3Struct_Unk1C *var0 = (struct Pokenav3Struct_Unk1C *)arg0;
const u8 *trainerName;
const u8 *className;
- if (!var0->unk0)
+ if (!arg0->boxId)
{
- int index = GetTrainerIdxByRematchIdx(var0->unk2);
+ int index = GetTrainerIdxByRematchIdx(arg0->unk6);
const struct Trainer *trainer = &gTrainers[index];
int class = trainer->trainerClass;
className = gTrainerClassNames[class];
@@ -397,7 +397,7 @@ void sub_81CB050(u32 arg0, u8 *str)
}
else
{
- sub_81D1A78(var0->unk2, &className, &trainerName);
+ sub_81D1A78(arg0->unk6, &className, &trainerName);
}
if (className && trainerName)
@@ -424,9 +424,9 @@ int sub_81CB0E4(int index)
int count = 1;
while (++index < state->unkA)
{
- if (!state->unk1C[index].unk0)
+ if (!state->unk1C[index].boxId)
return count;
- if (sub_81D17E8(state->unk1C[index].unk2))
+ if (MatchCall_HasCheckPage(state->unk1C[index].unk6))
return count;
count++;
@@ -441,9 +441,9 @@ int sub_81CB128(int index)
int count = -1;
while (--index >= 0)
{
- if (!state->unk1C[index].unk0)
+ if (!state->unk1C[index].boxId)
return count;
- if (sub_81D17E8(state->unk1C[index].unk2))
+ if (MatchCall_HasCheckPage(state->unk1C[index].unk6))
return count;
count--;
@@ -462,7 +462,7 @@ bool32 unref_sub_81CB16C(void)
return TRUE;
}
- for (i = 0; i < 21; i++) // TODO: This is the size of sMatchCallHeaders
+ for (i = 0; i < MC_HEADER_COUNT; i++)
{
if (MatchCallFlagGetByIndex(i))
{
@@ -479,17 +479,17 @@ static bool32 sub_81CB1D0(void)
{
struct Pokenav3Struct *state = GetSubstructPtr(5);
int index = GetSelectedMatchCall();
- if (!state->unk1C[index].unk0)
+ if (!state->unk1C[index].boxId)
{
if (sub_81CAEA4(index) == gMapHeader.regionMapSectionId)
{
- if (!gSaveBlock1Ptr->trainerRematches[state->unk1C[index].unk2])
+ if (!gSaveBlock1Ptr->trainerRematches[state->unk1C[index].unk6])
return TRUE;
}
}
else
{
- if (state->unk1C[index].unk2 == 11)
+ if (state->unk1C[index].unk6 == 11)
{
if (sub_81CAEA4(index) == gMapHeader.regionMapSectionId
&& FlagGet(FLAG_BADGE05_GET) == TRUE)
diff --git a/src/pokenav_unk_4.c b/src/pokenav_unk_4.c
index 6fa76daf2..0f05c6f5d 100755
--- a/src/pokenav_unk_4.c
+++ b/src/pokenav_unk_4.c
@@ -50,7 +50,7 @@ struct Pokenav4Struct
};
static bool32 sub_81CB310(void);
-static u32 sub_81CB324(int);
+static u32 sub_81CB324(s32);
static void sub_81CBBB8(void);
static void sub_81CBC1C(void);
static void sub_81CC2B4(void);
@@ -93,27 +93,191 @@ static void sub_81CC330(struct Pokenav4Struct *);
static struct Sprite *sub_81CC370(void);
static void sub_81CC440(struct Sprite *sprite);
static void sub_81CC4A4(struct Sprite *sprite);
+void sub_81CC34C(struct Sprite *sprite);
+u32 sub_81CB510(s32);
+u32 sub_81CB588(s32);
+u32 sub_81CB600(s32);
+u32 sub_81CB678(s32);
+u32 sub_81CB6F0(s32);
+u32 sub_81CB734(s32);
+u32 sub_81CB75C(s32);
+u32 sub_81CB7A0(s32);
+u32 sub_81CB824(s32);
+u32 sub_81CB888(s32);
+u32 sub_81CB93C(s32);
+u32 sub_81CBAD4(s32);
+u32 sub_81CB9C8(s32);
+u32 sub_81CBA68(s32);
+u32 sub_81CBB74(s32);
-extern const LoopedTask gUnknown_08622798[];
-extern const struct BgTemplate gUnknown_0862278C[3];
-extern const u16 gUnknown_08622510[];
-extern const u32 gUnknown_08622530[];
-extern const u32 gUnknown_08622760[];
-extern const u16 gUnknown_08622700[];
-extern const u16 gUnknown_08622720[];
-extern const u8 gUnknown_086225D4[];
-extern const u16 gUnknown_086226E0[];
-extern const struct BgTemplate gUnknown_08622794;
-extern const struct WindowTemplate gUnknown_086227D8;
-extern const struct WindowTemplate gUnknown_086227E0;
-extern const u8 *const gUnknown_086227E8[];
extern const struct WindowTemplate gUnknown_08622808;
-extern const u8 gUnknown_086227F4[];
-extern const struct CompressedSpriteSheet gUnknown_08622810[1];
-extern const struct SpritePalette gUnknown_08622818[];
extern const struct SpriteTemplate gUnknown_08622830;
extern const struct SpriteTemplate gUnknown_08622850;
+const u16 gUnknown_08622510[] = INCBIN_U16("graphics/pokenav/ui_matchcall.gbapal");
+const u32 gUnknown_08622530[] = INCBIN_U32("graphics/pokenav/ui_matchcall.4bpp.lz");
+const u32 gUnknown_086225D4[] = INCBIN_U32("graphics/pokenav/ui_matchcall.bin.lz");
+const u16 gUnknown_08622698[] = INCBIN_U16("graphics/pokenav/arrow2.gbapal");
+const u32 gUnknown_086226B8[] = INCBIN_U32("graphics/pokenav/arrow2.4bpp.lz");
+const u16 gUnknown_086226E0[] = INCBIN_U16("graphics/pokenav/86226E0.gbapal");
+const u16 gUnknown_08622700[] = INCBIN_U16("graphics/pokenav/8622700.gbapal");
+const u16 gUnknown_08622720[] = INCBIN_U16("graphics/pokenav/pokeball_matchcall.gbapal");
+const u32 gUnknown_08622760[] = INCBIN_U32("graphics/pokenav/pokeball_matchcall.4bpp.lz");
+
+const struct BgTemplate gUnknown_0862278C[3] =
+{
+ {
+ .bg = 1,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 0x1F,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 0x06,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x80
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 0x07,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+const LoopedTask gUnknown_08622798[] =
+{
+ NULL,
+ sub_81CB510,
+ sub_81CB588,
+ sub_81CB600,
+ sub_81CB678,
+ sub_81CB6F0,
+ sub_81CB734,
+ sub_81CB75C,
+ sub_81CB7A0,
+ sub_81CB824,
+ sub_81CB888,
+ sub_81CB93C,
+ sub_81CBAD4,
+ sub_81CB9C8,
+ sub_81CBA68,
+ sub_81CBB74
+};
+
+const struct WindowTemplate gUnknown_086227D8 =
+{
+ .bg = 2,
+ .tilemapLeft = 0,
+ .tilemapTop = 5,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 2,
+ .baseBlock = 16
+};
+
+const struct WindowTemplate gUnknown_086227E0 =
+{
+ .bg = 2,
+ .tilemapLeft = 0,
+ .tilemapTop = 9,
+ .width = 11,
+ .height = 8,
+ .paletteNum = 2,
+ .baseBlock = 38
+};
+
+const u8 *const gUnknown_086227E8[] =
+{
+ gUnknown_085EC017,
+ gUnknown_085EC01C,
+ gUnknown_085EC022
+};
+
+const u8 gUnknown_086227F4[] = _("·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·{PAUSE 0x04}·\p");
+
+const struct WindowTemplate gUnknown_08622808 =
+{
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 12,
+ .width = 0x1C,
+ .height = 0x04,
+ .paletteNum = 1,
+ .baseBlock = 10
+};
+
+const struct CompressedSpriteSheet gUnknown_08622810[1] =
+{
+ {gUnknown_086226B8, 0x40, 7}
+};
+
+const struct SpritePalette gUnknown_08622818[] =
+{
+ {gUnknown_08622698, 12},
+ {}
+};
+
+const struct OamData gUnknown_08622828 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+};
+
+const struct SpriteTemplate gUnknown_08622830 =
+{
+ .tileTag = 7,
+ .paletteTag = 12,
+ .oam = &gUnknown_08622828,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_81CC34C,
+};
+
+const struct OamData gUnknown_08622848 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+};
+
+const struct SpriteTemplate gUnknown_08622850 =
+{
+ .tileTag = 8,
+ .paletteTag = 13,
+ .oam = &gUnknown_08622848,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
bool32 sub_81CB260(void)
{
struct Pokenav4Struct *state = AllocSubstruct(6, sizeof(struct Pokenav4Struct));
@@ -126,7 +290,7 @@ bool32 sub_81CB260(void)
return TRUE;
}
-void sub_81CB29C(int index)
+void sub_81CB29C(s32 index)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
state->unk4 = CreateLoopedTask(gUnknown_08622798[index], 1);
@@ -156,7 +320,7 @@ static bool32 sub_81CB310(void)
return IsLoopedTaskActive(state->unk4);
}
-static u32 sub_81CB324(int taskState)
+static u32 sub_81CB324(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -229,7 +393,7 @@ static u32 sub_81CB324(int taskState)
}
}
-u32 sub_81CB510(int taskState)
+u32 sub_81CB510(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -266,7 +430,7 @@ u32 sub_81CB510(int taskState)
return 4;
}
-u32 sub_81CB588(int taskState)
+u32 sub_81CB588(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -303,7 +467,7 @@ u32 sub_81CB588(int taskState)
return 4;
}
-u32 sub_81CB600(int taskState)
+u32 sub_81CB600(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -340,7 +504,7 @@ u32 sub_81CB600(int taskState)
return 4;
}
-u32 sub_81CB678(int taskState)
+u32 sub_81CB678(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -377,7 +541,7 @@ u32 sub_81CB678(int taskState)
return 4;
}
-u32 sub_81CB6F0(int taskState)
+u32 sub_81CB6F0(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -396,7 +560,7 @@ u32 sub_81CB6F0(int taskState)
return 4;
}
-u32 sub_81CB734(int taskState)
+u32 sub_81CB734(s32 taskState)
{
struct Pokenav4Struct *state;
u16 var0;
@@ -408,7 +572,7 @@ u32 sub_81CB734(int taskState)
return 4;
}
-u32 sub_81CB75C(int taskState)
+u32 sub_81CB75C(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -427,7 +591,7 @@ u32 sub_81CB75C(int taskState)
return 4;
}
-u32 sub_81CB7A0(int taskState)
+u32 sub_81CB7A0(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -459,7 +623,7 @@ u32 sub_81CB7A0(int taskState)
return 4;
}
-u32 sub_81CB824(int taskState)
+u32 sub_81CB824(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -485,7 +649,7 @@ u32 sub_81CB824(int taskState)
return 4;
}
-u32 sub_81CB888(int taskState)
+u32 sub_81CB888(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
u32 result = 0;
@@ -549,7 +713,7 @@ u32 sub_81CB888(int taskState)
return result;
}
-u32 sub_81CB93C(int taskState)
+u32 sub_81CB93C(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -578,7 +742,7 @@ u32 sub_81CB93C(int taskState)
return 4;
}
-u32 sub_81CB9C8(int taskState)
+u32 sub_81CB9C8(s32 taskState)
{
int index;
int var0;
@@ -617,7 +781,7 @@ u32 sub_81CB9C8(int taskState)
return 4;
}
-u32 sub_81CBA68(int taskState)
+u32 sub_81CBA68(s32 taskState)
{
struct Pokenav4Struct *state = GetSubstructPtr(6);
switch (taskState)
@@ -643,7 +807,7 @@ u32 sub_81CBA68(int taskState)
return 4;
}
-u32 sub_81CBAD4(int taskState)
+u32 sub_81CBAD4(s32 taskState)
{
int index;
int var0;
@@ -682,7 +846,7 @@ u32 sub_81CBAD4(int taskState)
return 4;
}
-u32 sub_81CBB74(int taskState)
+u32 sub_81CBB74(s32 taskState)
{
switch (taskState)
{
@@ -706,7 +870,7 @@ u32 sub_81CBB74(int taskState)
static void sub_81CBBB8(void)
{
struct MatchCallListTemplate template;
- template.unk0 = (u32)sub_81CAE94();
+ template.unk0 = sub_81CAE94();
template.unk4 = sub_81CAE38();
template.unk8 = 4;
template.unk6 = 0;
@@ -718,7 +882,7 @@ static void sub_81CBBB8(void)
template.unkE = 7;
template.unk10 = sub_81CB050;
template.unk14 = sub_81CBCEC;
- sub_81C81D4(&gUnknown_08622794, &template, 2);
+ sub_81C81D4(&gUnknown_0862278C[2], &template, 2);
CreateTask(sub_81CBC64, 7);
}
diff --git a/src/pokenav_unk_5.c b/src/pokenav_unk_5.c
index eccc200d5..03ac05d4d 100755
--- a/src/pokenav_unk_5.c
+++ b/src/pokenav_unk_5.c
@@ -32,18 +32,18 @@ struct Pokenav5Struct_2
u8 cityZoomPics[22][0xC8];
};
-struct CityZoomPic
+struct CityMapEntry
{
u16 mapSecId;
- u16 unk2;
- const u32 *data;
+ u16 index;
+ const u32 *tilemap;
};
static u32 sub_81CC568(struct Pokenav5Struct *);
static u32 sub_81CC5B4(struct Pokenav5Struct *);
static u32 sub_81CC5DC(struct Pokenav5Struct *);
-static u32 sub_81CC6F4(int);
-static u32 sub_81CCD34(int);
+static u32 sub_81CC6F4(s32);
+static u32 sub_81CCD34(s32);
static bool32 sub_81CC6BC(void);
static void sub_81CC9EC(void);
static void sub_81CC9C0(void);
@@ -61,19 +61,112 @@ static void sub_81CCDE8(struct Pokenav5Struct_2 *, int, int);
static void sub_81CCFA4(int);
static void sub_81CCC9C(u8 taskId);
static void sub_81CCF78(void);
+void sub_81CCEF4(struct Sprite *sprite);
+u32 sub_81CC848(s32);
+u32 sub_81CC878(s32);
+u32 sub_81CC8D8(s32);
+u32 sub_81CC95C(s32);
-extern const LoopedTask gUnknown_086230E4[];
-extern const struct BgTemplate gUnknown_086230D8[2];
-extern const struct CompressedSpriteSheet gUnknown_086230F8[1];
-extern const struct SpritePalette gUnknown_08623100[];
-extern const struct WindowTemplate gUnknown_08623110;
-extern const u32 gUnknown_08622888[];
-extern const u16 gUnknown_08622868[];
extern const u16 gHoennMapZoomIcons_Pal[];
-extern const struct CityZoomPic gUnknown_08623118[22];
extern const struct SpriteTemplate gUnknown_086231D0;
+extern const u32 gHoennMapZoomIcons_Gfx[];
-u32 sub_81CC4D4(void)
+const u16 gUnknown_08622868[] = INCBIN_U16("graphics/pokenav/8622868.gbapal");
+const u32 gUnknown_08622888[] = INCBIN_U32("graphics/pokenav/zoom_tiles.4bpp.lz");
+
+#include "data/region_map/city_map_tilemaps.h"
+
+
+const struct BgTemplate gUnknown_086230D8[3] =
+{
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 0x1F,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 0x06,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 0x00,
+ .screenSize = 2,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+};
+
+const LoopedTask gUnknown_086230E4[] =
+{
+ NULL,
+ sub_81CC848,
+ sub_81CC878,
+ sub_81CC8D8,
+ sub_81CC95C
+};
+
+const struct CompressedSpriteSheet gUnknown_086230F8[1] =
+{
+ {gHoennMapZoomIcons_Gfx, 0x800, 6}
+};
+
+const struct SpritePalette gUnknown_08623100[] =
+{
+ {gHoennMapZoomIcons_Pal, 11},
+ {}
+};
+
+const struct WindowTemplate gUnknown_08623110 =
+{
+ .bg = 1,
+ .tilemapLeft = 17,
+ .tilemapTop = 4,
+ .width = 12,
+ .height = 13,
+ .paletteNum = 1,
+ .baseBlock = 0x4C
+};
+
+#include "data/region_map/city_map_entries.h"
+
+const struct OamData gUnknown_086231C8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+};
+
+const struct SpriteTemplate gUnknown_086231D0 =
+{
+ .tileTag = 6,
+ .paletteTag = 11,
+ .oam = &gUnknown_086231C8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_81CCEF4,
+};
+
+u32 PokenavCallback_Init_6(void)
{
struct Pokenav5Struct *state = AllocSubstruct(3, sizeof(struct Pokenav5Struct));
if (!state)
@@ -101,7 +194,7 @@ void sub_81CC524(void)
u32 sub_81CC554(void)
{
struct Pokenav5Struct *state = GetSubstructPtr(3);
- state->unk10(state);
+ return state->unk10(state);
}
static u32 sub_81CC568(struct Pokenav5Struct *state)
@@ -155,7 +248,7 @@ bool32 sub_81CC5F4(void)
return TRUE;
}
-void sub_81CC62C(int index)
+void sub_81CC62C(s32 index)
{
struct Pokenav5Struct_2 *state = GetSubstructPtr(4);
state->unk4 = CreateLoopedTask(gUnknown_086230E4[index], 1);
@@ -202,7 +295,7 @@ static bool8 sub_81CC6D0(void)
return gSaveBlock2Ptr->regionMapZoom == 1;
}
-static u32 sub_81CC6F4(int taskState)
+static u32 sub_81CC6F4(s32 taskState)
{
int var0;
struct RegionMap *regionMap;
@@ -215,7 +308,7 @@ static u32 sub_81CC6F4(int taskState)
HideBg(2);
HideBg(3);
SetBgMode(1);
- InitBgTemplates(gUnknown_086230D8, ARRAY_COUNT(gUnknown_086230D8));
+ InitBgTemplates(gUnknown_086230D8, ARRAY_COUNT(gUnknown_086230D8) - 1);
regionMap = GetSubstructPtr(16);
sub_8122CF8(regionMap, &gUnknown_086230D8[1], sub_81CC6D0());
sub_81CC9C0();
@@ -278,7 +371,7 @@ static u32 sub_81CC6F4(int taskState)
}
}
-u32 sub_81CC848(int taskState)
+u32 sub_81CC848(s32 taskState)
{
struct Pokenav5Struct_2 *state = GetSubstructPtr(4);
switch (taskState)
@@ -295,7 +388,7 @@ u32 sub_81CC848(int taskState)
return 4;
}
-u32 sub_81CC878(int taskState)
+u32 sub_81CC878(s32 taskState)
{
switch (taskState)
{
@@ -321,7 +414,7 @@ u32 sub_81CC878(int taskState)
return 4;
}
-u32 sub_81CC8D8(int taskState)
+u32 sub_81CC8D8(s32 taskState)
{
struct Pokenav5Struct_2 *state = GetSubstructPtr(4);
switch (taskState)
@@ -354,7 +447,7 @@ u32 sub_81CC8D8(int taskState)
return 4;
}
-u32 sub_81CC95C(int taskState)
+u32 sub_81CC95C(s32 taskState)
{
switch (taskState)
{
@@ -518,12 +611,12 @@ static bool32 sub_81CCD24(void)
return FuncIsActiveLoopedTask(sub_81CCD34);
}
-static u32 sub_81CCD34(int taskState)
+static u32 sub_81CCD34(s32 taskState)
{
struct Pokenav5Struct_2 *state = GetSubstructPtr(4);
- if (taskState < (int)ARRAY_COUNT(gUnknown_08623118))
+ if (taskState < (int)ARRAY_COUNT(gPokenavCityMaps))
{
- LZ77UnCompWram(gUnknown_08623118[taskState].data, state->cityZoomPics[taskState]);
+ LZ77UnCompWram(gPokenavCityMaps[taskState].tilemap, state->cityZoomPics[taskState]);
return 1;
}
@@ -533,10 +626,10 @@ static u32 sub_81CCD34(int taskState)
static void sub_81CCD70(struct Pokenav5Struct_2 *state, int mapSecId, int pos)
{
int i;
- for (i = 0; i < (int)ARRAY_COUNT(gUnknown_08623118) && (gUnknown_08623118[i].mapSecId != mapSecId || gUnknown_08623118[i].unk2 != pos); i++)
+ for (i = 0; i < (int)ARRAY_COUNT(gPokenavCityMaps) && (gPokenavCityMaps[i].mapSecId != mapSecId || gPokenavCityMaps[i].index != pos); i++)
;
- if (i == ARRAY_COUNT(gUnknown_08623118))
+ if (i == ARRAY_COUNT(gPokenavCityMaps))
return;
FillBgTilemapBufferRect_Palette0(1, 0x1041, 17, 6, 12, 11);
diff --git a/src/pokenav_unk_6.c b/src/pokenav_unk_6.c
new file mode 100644
index 000000000..ac8237793
--- /dev/null
+++ b/src/pokenav_unk_6.c
@@ -0,0 +1,625 @@
+#include "global.h"
+#include "data.h"
+#include "decompress.h"
+#include "main.h"
+#include "menu_specialized.h"
+#include "mon_markings.h"
+#include "pokenav.h"
+#include "pokemon.h"
+#include "pokemon_storage_system.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "text.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+
+struct PokenavSub11
+{
+ u32 monPal[3][0x20];
+ u8 fill[0x180];
+ u32 monPicGfx[3][0x800];
+ u8 unk6300;
+ s16 unk6302;
+ u32 (*unk6304)(struct PokenavSub11 *);
+ u8 fill2[0x6320 - 0x6308];
+ u8 unk6320[3][24];
+ u8 unk6368[3][64];
+ struct UnknownStruct_81D1ED4 unk6428;
+ u8 unk6780[3];
+ u8 unk6783[3];
+ s8 unk6786;
+ s8 unk6787;
+ s8 unk6788;
+ s8 unk6789;
+ u8 unk678A;
+};
+
+void sub_81CD970(void);
+void sub_81CD9F8(void);
+u32 sub_81CD08C(struct PokenavSub11 *structPtr);
+u32 sub_81CD19C(struct PokenavSub11 *structPtr);
+u32 sub_81CD110(struct PokenavSub11 *structPtr);
+u8 sub_81CD1E4(struct PokenavSub11 *structPtr);
+u8 sub_81CD258(u8 arg0);
+void sub_81CD824(s16 arg0, u8 arg1);
+void sub_81CDA1C(s16 arg0, u8 arg1);
+void sub_81CDB98(s16 arg0, u8 arg1);
+
+// code
+bool32 PokenavCallback_Init_7(void)
+{
+ struct PokenavSub11 *structPtr = AllocSubstruct(11, sizeof(struct PokenavSub11));
+
+ if (structPtr == NULL)
+ return FALSE;
+
+ sub_81D1ED4(&structPtr->unk6428);
+ sub_81CD970();
+ gKeyRepeatStartDelay = 20;
+ structPtr->unk6304 = sub_81CD08C;
+ return TRUE;
+}
+
+bool32 PokenavCallback_Init_9(void)
+{
+ struct PokenavSub11 *structPtr = AllocSubstruct(11, sizeof(struct PokenavSub11));
+
+ if (structPtr == NULL)
+ return FALSE;
+
+ sub_81D1ED4(&structPtr->unk6428);
+ sub_81CD9F8();
+ gKeyRepeatStartDelay = 20;
+ structPtr->unk6304 = sub_81CD08C;
+ return TRUE;
+}
+
+u32 sub_81CD070(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+
+ return structPtr->unk6304(structPtr);
+}
+
+u32 sub_81CD08C(struct PokenavSub11 *structPtr)
+{
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+ u32 ret = sub_81CD1E4(structPtr);
+
+ if (ret == 0)
+ {
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ structPtr->unk6304 = sub_81CD19C;
+ ret = 2;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (structPtr->unk6300 == 0)
+ {
+ if (unkPtr->unk2 == unkPtr->unk0 - 1)
+ {
+ PlaySE(SE_SELECT);
+ structPtr->unk6304 = sub_81CD19C;
+ ret = 2;
+ }
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ ret = 5;
+ structPtr->unk6304 = sub_81CD110;
+ }
+ }
+ }
+
+ return ret;
+}
+
+u32 sub_81CD110(struct PokenavSub11 *structPtr)
+{
+ struct PokenavSub18 *unkPtr;
+ u8 markings;
+ u32 ret = 0, boxId, monId;
+
+ if (!sub_811FBA4())
+ {
+ structPtr->unk6783[structPtr->unk6786] = sub_81CEF14();
+ unkPtr = GetSubstructPtr(18);
+ boxId = unkPtr->unk4[unkPtr->unk2].boxId;
+ monId = unkPtr->unk4[unkPtr->unk2].monId;
+ markings = structPtr->unk6783[structPtr->unk6786];
+
+ if (boxId == TOTAL_BOXES_COUNT)
+ SetMonData(&gPlayerParty[monId], MON_DATA_MARKINGS, &markings);
+ else
+ SetBoxMonDataAt(boxId, monId, MON_DATA_MARKINGS, &markings);
+
+ structPtr->unk6304 = sub_81CD08C;
+ ret = 6;
+ }
+
+ return ret;
+}
+
+u32 sub_81CD19C(struct PokenavSub11 *structPtr)
+{
+ if (structPtr->unk6300 == 0)
+ return 100002;
+ else
+ return 100010;
+}
+
+void sub_81CD1C0(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ if (structPtr->unk6300 == 0)
+ FreePokenavSubstruct(18);
+
+ FreePokenavSubstruct(11);
+}
+
+u8 sub_81CD1E4(struct PokenavSub11 *structPtr)
+{
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+ u8 ret = 0;
+
+ if (gMain.heldKeys & DPAD_UP)
+ {
+ if (structPtr->unk6300 == 0 || unkPtr->unk2 != 0)
+ {
+ PlaySE(SE_SELECT);
+ ret = sub_81CD258(1);
+ }
+ }
+ else if (gMain.heldKeys & DPAD_DOWN)
+ {
+ if (structPtr->unk6300 == 0 || unkPtr->unk2 < unkPtr->unk0 - 1)
+ {
+ PlaySE(SE_SELECT);
+ ret = sub_81CD258(0);
+ }
+ }
+
+ return ret;
+}
+
+u8 sub_81CD258(u8 arg0)
+{
+ u16 r7;
+ bool8 r6, r0;
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+
+ r7 = (arg0) ? structPtr->unk6788 : structPtr->unk6787;
+ sub_81D1F84(&structPtr->unk6428, structPtr->unk6428.unk14[structPtr->unk6786], structPtr->unk6428.unk14[r7]);
+ r6 = (unkPtr->unk2 != ((sub_81CDD5C() != 0) ? unkPtr->unk0 : unkPtr->unk0 - 1));
+ if (arg0)
+ {
+ structPtr->unk6788 = structPtr->unk6787;
+ structPtr->unk6787 = structPtr->unk6786;
+ structPtr->unk6786 = r7;
+ structPtr->unk6789 = structPtr->unk6788;
+
+ unkPtr->unk2 = (unkPtr->unk2 == 0) ? unkPtr->unk0 - 1 : unkPtr->unk2 - 1;
+ structPtr->unk6302 = (unkPtr->unk2 != 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1;
+ }
+ else
+ {
+ structPtr->unk6787 = structPtr->unk6788;
+ structPtr->unk6788 = structPtr->unk6786;
+ structPtr->unk6786 = r7;
+ structPtr->unk6789 = structPtr->unk6787;
+
+ unkPtr->unk2 = (unkPtr->unk2 < unkPtr->unk0 - 1) ? unkPtr->unk2 + 1 : 0;
+ structPtr->unk6302 = (unkPtr->unk2 < unkPtr->unk0 - 1) ? unkPtr->unk2 + 1 : 0;
+ }
+
+ r0 = (unkPtr->unk2 != ((sub_81CDD5C() != 0) ? unkPtr->unk0 : unkPtr->unk0 - 1));
+
+ if (!r6)
+ return 3;
+ else if (!r0)
+ return 4;
+ else
+ return 1;
+}
+
+bool32 sub_81CD3C4(void)
+{
+ s32 var;
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+
+ switch (structPtr->unk678A)
+ {
+ case 0:
+ sub_81CD824(unkPtr->unk2, 0);
+ break;
+ case 1:
+ sub_81CDA1C(unkPtr->unk2, 0);
+ break;
+ case 2:
+ sub_81CDB98(unkPtr->unk2, 0);
+ break;
+ case 3:
+ if (unkPtr->unk0 == 1)
+ {
+ structPtr->unk6786 = 0;
+ structPtr->unk6787 = 0;
+ structPtr->unk6788 = 0;
+ structPtr->unk678A = 0;
+ return TRUE;
+ }
+ else
+ {
+ structPtr->unk6786 = 0;
+ structPtr->unk6787 = 1;
+ structPtr->unk6788 = 2;
+ }
+ break;
+ // These were probably ternaries just like cases 7-9, but couldn't match it any other way.
+ case 4:
+ var = unkPtr->unk2 + 1;
+ if (var >= unkPtr->unk0)
+ var = 0;
+ sub_81CD824(var, 1);
+ break;
+ case 5:
+ var = unkPtr->unk2 + 1;
+ if (var >= unkPtr->unk0)
+ var = 0;
+ sub_81CDA1C(var, 1);
+ break;
+ case 6:
+ var = unkPtr->unk2 + 1;
+ if (var >= unkPtr->unk0)
+ var = 0;
+ sub_81CDB98(var, 1);
+ break;
+ case 7:
+ sub_81CD824((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2);
+ break;
+ case 8:
+ sub_81CDA1C((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2);
+ break;
+ case 9:
+ sub_81CDB98((unkPtr->unk2 - 1 >= 0) ? unkPtr->unk2 - 1 : unkPtr->unk0 - 1, 2);
+ structPtr->unk678A = 0;
+ return TRUE;
+ }
+
+ structPtr->unk678A++;
+ return FALSE;
+}
+
+bool32 sub_81CD548(u8 arg0)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+
+ switch (arg0)
+ {
+ case 0:
+ sub_81CD824(structPtr->unk6302, structPtr->unk6789);
+ break;
+ case 1:
+ sub_81CDA1C(structPtr->unk6302, structPtr->unk6789);
+ break;
+ case 2:
+ sub_81CDB98(structPtr->unk6302, structPtr->unk6789);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+u8 *sub_81CD5CC(u8 *dst, const u8 *src, s16 n)
+{
+ while (*src != EOS)
+ *dst++ = *src++, n--;
+
+ while (n-- > 0)
+ *dst++ = CHAR_SPACE;
+
+ *dst = EOS;
+ return dst;
+}
+
+u8 *sub_81CD624(u8 *str, u16 id, bool8 arg3)
+{
+ u16 boxId, monId, gender, species, level, lvlDigits;
+ struct BoxPokemon *boxMon;
+ u8 *txtPtr, *str_;
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+
+ boxId = unkPtr->unk4[id].boxId;
+ monId = unkPtr->unk4[id].monId;
+ *(str++) = EXT_CTRL_CODE_BEGIN;
+ *(str++) = 4;
+ *(str++) = 8;
+ *(str++) = 0;
+ *(str++) = 9;
+
+ if (GetBoxOrPartyMonData(boxId, monId, MON_DATA_IS_EGG, NULL))
+ return StringCopyPadded(str, gText_EggNickname, CHAR_SPACE, 12);
+
+ GetBoxOrPartyMonData(boxId, monId, MON_DATA_NICKNAME, str);
+ StringGetEnd10(str);
+ species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES, NULL);
+ if (boxId == TOTAL_BOXES_COUNT)
+ {
+ level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
+ gender = GetMonGender(&gPlayerParty[monId]);
+ }
+ else
+ {
+ boxMon = GetBoxedMonPtr(boxId, monId);
+ gender = GetBoxMonGender(boxMon);
+ level = GetLevelFromBoxMonExp(boxMon);
+ }
+
+ if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && !StringCompare(str, gSpeciesNames[species]))
+ gender = MON_GENDERLESS;
+
+ str_ = str; // For some reason, a variable is needed to match.
+ while (*str_ != EOS)
+ (str_++);
+
+ *(str_++) = EXT_CTRL_CODE_BEGIN;
+ *(str_++) = 0x12;
+ *(str_++) = 0x3C;
+ switch (gender)
+ {
+ default:
+ *(str_++) = 0x77;
+ break;
+ case MON_MALE:
+ *(str_++) = EXT_CTRL_CODE_BEGIN;
+ *(str_++) = EXT_CTRL_CODE_COLOR;
+ *(str_++) = 4;
+ *(str_++) = EXT_CTRL_CODE_BEGIN;
+ *(str_++) = 3;
+ *(str_++) = 5;
+ *(str_++) = CHAR_MALE;
+ break;
+ case MON_FEMALE:
+ *(str_++) = EXT_CTRL_CODE_BEGIN;
+ *(str_++) = EXT_CTRL_CODE_COLOR;
+ *(str_++) = 6;
+ *(str_++) = EXT_CTRL_CODE_BEGIN;
+ *(str_++) = 3;
+ *(str_++) = 7;
+ *(str_++) = CHAR_FEMALE;
+ break;
+ }
+
+ *(str_++) = EXT_CTRL_CODE_BEGIN;
+ *(str_++) = 4;
+ *(str_++) = 8;
+ *(str_++) = 0;
+ *(str_++) = 9;
+ *(str_++) = CHAR_SLASH;
+ *(str_++) = CHAR_SPECIAL_F9;
+ *(str_++) = 5;
+ txtPtr = str_;
+ str_ = ConvertIntToDecimalStringN(str_, level, STR_CONV_MODE_LEFT_ALIGN, 3);
+ lvlDigits = str_ - txtPtr;
+ *(str_++) = CHAR_SPACE;
+ if (!arg3)
+ {
+ lvlDigits = 3 - lvlDigits;
+ while (lvlDigits-- != 0)
+ *(str_++) = CHAR_SPACE;
+ }
+
+ *str_ = EOS;
+ return str_;
+}
+
+void sub_81CD824(s16 arg0, u8 arg1)
+{
+ u16 boxId, i;
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+
+ if (arg0 != (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1))
+ {
+ sub_81CD624(structPtr->unk6368[arg1], arg0, FALSE);
+ boxId = unkPtr->unk4[arg0].boxId;
+ structPtr->unk6320[arg1][0] = EXT_CTRL_CODE_BEGIN;
+ structPtr->unk6320[arg1][1] = 4;
+ structPtr->unk6320[arg1][2] = 8;
+ structPtr->unk6320[arg1][3] = 0;
+ structPtr->unk6320[arg1][4] = 9;
+ if (boxId == TOTAL_BOXES_COUNT)
+ sub_81CD5CC(&structPtr->unk6320[arg1][5], gText_InParty, 8);
+ else
+ sub_81CD5CC(&structPtr->unk6320[arg1][5], GetBoxNamePtr(boxId), 8);
+ }
+ else
+ {
+ for (i = 0; i < 12; i++)
+ structPtr->unk6368[arg1][i] = CHAR_SPACE;
+ structPtr->unk6368[arg1][i] = EOS;
+
+ for (i = 0; i < 8; i++)
+ structPtr->unk6320[arg1][i] = CHAR_SPACE;
+ structPtr->unk6320[arg1][i] = EOS;
+ }
+}
+
+void sub_81CD970(void)
+{
+ u16 i, count;
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ struct PokenavSub18 *unkPtr = AllocSubstruct(18, sizeof(struct PokenavSub18));
+
+ structPtr->unk6300 = 0;
+ for (i = 0, count = 0; i < CalculatePlayerPartyCount(); i++)
+ {
+ if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
+ {
+ unkPtr->unk4[count].boxId = TOTAL_BOXES_COUNT;
+ unkPtr->unk4[count].monId = i;
+ unkPtr->unk4[count].unk6 = 0;
+ count++;
+ }
+ }
+
+ unkPtr->unk4[count].boxId = 0;
+ unkPtr->unk4[count].monId = 0;
+ unkPtr->unk4[count].unk6 = 0;
+ unkPtr->unk2 = 0;
+ unkPtr->unk0 = count + 1;
+ structPtr->unk678A = 0;
+}
+
+void sub_81CD9F8(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ structPtr->unk6300 = 1;
+ structPtr->unk678A = 0;
+}
+
+void sub_81CDA1C(s16 arg0, u8 arg1)
+{
+ u16 boxId, monId, i;
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+
+ if (arg0 != (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1))
+ {
+ boxId = unkPtr->unk4[arg0].boxId;
+ monId = unkPtr->unk4[arg0].monId;
+ structPtr->unk6428.unk0[arg1][0] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_COOL, NULL);
+ structPtr->unk6428.unk0[arg1][1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_TOUGH, NULL);
+ structPtr->unk6428.unk0[arg1][2] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SMART, NULL);
+ structPtr->unk6428.unk0[arg1][3] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_CUTE, NULL);
+ structPtr->unk6428.unk0[arg1][4] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_BEAUTY, NULL);
+ structPtr->unk6780[arg1] = (GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) != 255)
+ ? GetBoxOrPartyMonData(boxId, monId, MON_DATA_SHEEN, NULL) / 29u
+ : 9;
+ structPtr->unk6783[arg1] = GetBoxOrPartyMonData(boxId, monId, MON_DATA_MARKINGS, NULL);
+ sub_81D2754(structPtr->unk6428.unk0[arg1], structPtr->unk6428.unk14[arg1]);
+ }
+ else
+ {
+ for (i = 0; i < 5; i++)
+ {
+ structPtr->unk6428.unk0[arg1][i] = 0;
+ structPtr->unk6428.unk14[arg1][i].unk0 = 155;
+ structPtr->unk6428.unk14[arg1][i].unk2 = 91;
+ }
+ }
+}
+
+void sub_81CDB98(s16 arg0, u8 arg1)
+{
+ u16 boxId, monId, species;
+ u32 personality, tid;
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+
+ if (arg0 == (sub_81CDD5C() != 0 ? unkPtr->unk0 : unkPtr->unk0 - 1))
+ return;
+
+ boxId = unkPtr->unk4[arg0].boxId;
+ monId = unkPtr->unk4[arg0].monId;
+ species = GetBoxOrPartyMonData(boxId, monId, MON_DATA_SPECIES2, NULL);
+ tid = GetBoxOrPartyMonData(boxId, monId, MON_DATA_OT_ID, NULL);
+ personality = GetBoxOrPartyMonData(boxId, monId, MON_DATA_PERSONALITY, NULL);
+ LoadSpecialPokePic(&gMonFrontPicTable[species], structPtr->monPicGfx[arg1], species, personality, TRUE);
+ LZ77UnCompWram(GetMonSpritePalFromSpeciesAndPersonality(species, tid, personality), structPtr->monPal[arg1]);
+}
+
+u16 sub_81CDC50(void)
+{
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+ return unkPtr->unk0;
+}
+
+u16 sub_81CDC60(void)
+{
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+ return unkPtr->unk2;
+}
+
+struct UnknownStruct_81D1ED4 *sub_81CDC70(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return &structPtr->unk6428;
+}
+
+u8 sub_81CDC84(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->unk6786;
+}
+
+u8 sub_81CDC9C(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->unk6302;
+}
+
+void *sub_81CDCB4(u8 id)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->monPicGfx[id];
+}
+
+void *sub_81CDCD4(u8 id)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->monPal[id];
+}
+
+u8 sub_81CDCEC(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->unk6789;
+}
+
+u8 *sub_81CDD04(u8 id)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->unk6368[id];
+}
+
+u8 *sub_81CDD24(u8 id)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->unk6320[id];
+}
+
+u16 sub_81CDD48(void)
+{
+ struct PokenavSub18 *unkPtr = GetSubstructPtr(18);
+ return unkPtr->unk4[unkPtr->unk2].unk6;
+}
+
+bool32 sub_81CDD5C(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ if (structPtr->unk6300 == 1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 sub_81CDD7C(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ if (structPtr->unk6300 == 1)
+ return structPtr->unk6783[structPtr->unk6786];
+ else
+ return 0;
+}
+
+u8 sub_81CDDB0(void)
+{
+ struct PokenavSub11 *structPtr = GetSubstructPtr(11);
+ return structPtr->unk6780[structPtr->unk6786];
+}
diff --git a/src/pokenav_unk_7.c b/src/pokenav_unk_7.c
new file mode 100644
index 000000000..34432a077
--- /dev/null
+++ b/src/pokenav_unk_7.c
@@ -0,0 +1,884 @@
+#include "global.h"
+#include "bg.h"
+#include "window.h"
+#include "pokenav.h"
+#include "decompress.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "menu.h"
+#include "menu_specialized.h"
+#include "mon_markings.h"
+#include "palette.h"
+#include "pokenav.h"
+#include "scanline_effect.h"
+#include "string_util.h"
+#include "strings.h"
+#include "text.h"
+
+u32 sub_81CE37C(s32);
+u32 sub_81CE2D0(s32);
+u32 sub_81CE4D8(s32);
+u32 sub_81CE5E4(s32);
+u32 sub_81CE6BC(s32);
+u32 sub_81CE700(s32);
+
+BSS_DATA u8 gUnknown_030012BC;
+
+const u16 gUnknown_086231E8[] = INCBIN_U16("graphics/pokenav/86231E8.gbapal");
+const u16 gUnknown_08623208[] = INCBIN_U16("graphics/pokenav/8623208.gbapal");
+const u32 gUnknown_08623228[] = INCBIN_U32("graphics/pokenav/8623228.4bpp.lz");
+const u32 gUnknown_0862323C[] = INCBIN_U32("graphics/pokenav/862323C.bin.lz");
+const u16 gUnknown_08623338[] = INCBIN_U16("graphics/pokenav/8623338.gbapal");
+
+const struct BgTemplate gUnknown_08623358[3] =
+{
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 0x1F,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 0x1D,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 0x1E,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+const struct WindowTemplate gUnknown_08623364 =
+{
+ .bg = 1,
+ .tilemapLeft = 13,
+ .tilemapTop = 1,
+ .width = 13,
+ .height = 4,
+ .paletteNum = 15,
+ .baseBlock = 2
+};
+
+const struct WindowTemplate gUnknown_0862336C =
+{
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x36
+};
+
+const struct WindowTemplate gUnknown_08623374 =
+{
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 0x1C,
+ .width = 5,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x44
+};
+
+const struct WindowTemplate gUnknown_0862337C =
+{
+ .bg = 1,
+ .tilemapLeft = 13,
+ .tilemapTop = 0x1C,
+ .width = 3,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x44
+};
+
+const LoopedTask gUnknown_08623384[] =
+{
+ NULL,
+ sub_81CE37C,
+ sub_81CE2D0,
+ sub_81CE4D8,
+ sub_81CE5E4,
+ sub_81CE6BC,
+ sub_81CE700
+};
+
+struct Pokenav7Struct
+{
+ u32 loopedTaskId;
+ u8 tilemapBuffers[3][BG_SCREEN_SIZE];
+ u8 filler[2];
+ u8 unk1806[10];
+ u32 (*unk1810)(void);
+ s16 unk1814;
+ u8 unk1816;
+ u16 unk1818;
+ u16 unk181A;
+ void *unk181C;
+ u8 unk1820;
+ u8 unk1821;
+ u8 unk1822;
+ u8 unk1823;
+ struct PokemonMarkMenu monMarks;
+ struct Sprite *unk28dc;
+ struct Sprite *unk28e0[10];
+ u8 unk2908;
+ u8 filler2[0x38ac - 0x2909];
+};
+
+extern s8 sub_81CDC84(void); // This function's declaration here is different than its definition in pokenav_unk_6. u8/s8
+
+u32 sub_81CDE94(s32 state);
+u32 sub_81CDE80(void);
+void sub_81CED30(u8 var);
+void sub_81CE9E4(void);
+void sub_81CE934(void);
+bool32 sub_81CE754(u8 a0, u16 a1, bool8 a2);
+void sub_81CEE44(void);
+void sub_81CEE90(void);
+void sub_81CEEC8(void);
+void sub_81CEE68(void);
+void sub_81CEE74(bool8 showBg);
+
+// code
+bool32 sub_81CDDD4(void)
+{
+ struct Pokenav7Struct *structPtr = AllocSubstruct(0xC, sizeof(struct Pokenav7Struct));
+
+ if (structPtr == NULL)
+ return FALSE;
+
+ structPtr->unk1816 = 0xFF;
+ structPtr->loopedTaskId = CreateLoopedTask(sub_81CDE94, 1);
+ structPtr->unk1810 = sub_81CDE80;
+ structPtr->unk2908 = 0;
+ return TRUE;
+}
+
+void sub_81CDE2C(s32 id)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+ structPtr->loopedTaskId = CreateLoopedTask(gUnknown_08623384[id], 1);
+ structPtr->unk1810 = sub_81CDE80;
+}
+
+u32 sub_81CDE64(void)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+ return structPtr->unk1810();
+}
+
+u32 sub_81CDE80(void)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+ return IsLoopedTaskActive(structPtr->loopedTaskId);
+}
+
+u32 sub_81CDE94(s32 state)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ switch (state)
+ {
+ case 0:
+ if (sub_81CD3C4() != TRUE)
+ return 2;
+ return 0;
+ case 1:
+ InitBgTemplates(gUnknown_08623358, ARRAY_COUNT(gUnknown_08623358));
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4));
+ decompress_and_copy_tile_data_to_vram(3, gPokenavCondition_Gfx, 0, 0, 0);
+ return 0;
+ case 2:
+ if (free_temp_tile_data_buffers_if_possible())
+ return 2;
+ decompress_and_copy_tile_data_to_vram(2, gUnknown_08623228, 0, 0, 0);
+ return 0;
+ case 3:
+ if (free_temp_tile_data_buffers_if_possible())
+ return 2;
+
+ LZ77UnCompVram(gPokenavCondition_Tilemap, structPtr->tilemapBuffers[0]);
+ SetBgTilemapBuffer(3, structPtr->tilemapBuffers[0]);
+ if (sub_81CDD5C() == TRUE)
+ CopyToBgTilemapBufferRect(3, gPokenavOptions_Tilemap, 0, 5, 9, 4);
+
+ CopyBgTilemapBufferToVram(3);
+ CopyPaletteIntoBufferUnfaded(gPokenavCondition_Pal, 0x10, 0x20);
+ CopyPaletteIntoBufferUnfaded(gUnknown_08623208, 0xF0, 0x20);
+ structPtr->unk1814 = -80;
+ return 0;
+ case 4:
+ if (free_temp_tile_data_buffers_if_possible())
+ return 2;
+
+ LZ77UnCompVram(gUnknown_0862323C, structPtr->tilemapBuffers[2]);
+ SetBgTilemapBuffer(2, structPtr->tilemapBuffers[2]);
+ CopyBgTilemapBufferToVram(2);
+ CopyPaletteIntoBufferUnfaded(gUnknown_086231E8, 0x30, 0x20);
+ sub_81D21DC(2);
+ return 0;
+ case 5:
+ sub_8199DF0(1, 0, 0, 1);
+ sub_8199DF0(1, 17, 1, 1);
+ CpuFill32(0, structPtr->tilemapBuffers[1], BG_SCREEN_SIZE);
+ SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]);
+ return 0;
+ case 6:
+ if (free_temp_tile_data_buffers_if_possible())
+ return 2;
+
+ structPtr->unk1820 = AddWindow(&gUnknown_08623364);
+ if (sub_81CDD5C() == TRUE)
+ {
+ structPtr->unk1821 = AddWindow(&gUnknown_0862336C);
+ structPtr->unk1822 = AddWindow(&gUnknown_08623374);
+ structPtr->unk1823 = AddWindow(&gUnknown_0862337C);
+ }
+ DeactivateAllTextPrinters();
+ return 0;
+ case 7:
+ sub_81CED30(0);
+ return 0;
+ case 8:
+ sub_81CE9E4();
+ return 0;
+ case 9:
+ if (sub_81CDD5C() == TRUE)
+ sub_81CE934();
+ return 0;
+ case 10:
+ sub_81CE754(0, sub_81CDC84(), TRUE);
+ return 0;
+ case 11:
+ sub_81CE754(1, sub_81CDC84(), TRUE);
+ return 0;
+ case 12:
+ sub_81CE754(2, sub_81CDC84(), TRUE);
+ return 0;
+ case 13:
+ if (sub_81CE754(3, sub_81CDC84(), TRUE) != TRUE)
+ return 2;
+ PutWindowTilemap(structPtr->unk1820);
+ if (sub_81CDD5C() == TRUE)
+ {
+ PutWindowTilemap(structPtr->unk1821);
+ PutWindowTilemap(structPtr->unk1822);
+ PutWindowTilemap(structPtr->unk1823);
+ }
+ return 0;
+ case 14:
+ ShowBg(1);
+ HideBg(2);
+ ShowBg(3);
+ if (sub_81CDD5C() == TRUE)
+ sub_81C7BA4(4);
+ return 0;
+ case 15:
+ sub_81C7AC0(1);
+ if (!sub_81CDD5C())
+ {
+ LoadLeftHeaderGfxForIndex(6);
+ sub_81C7FA0(1, TRUE, 0);
+ sub_81C7FA0(6, TRUE, 0);
+ }
+ return 0;
+ case 16:
+ if (IsPaletteFadeActive())
+ return 2;
+ if (!sub_81CDD5C() && sub_81C8010())
+ return 2;
+ SetVBlankCallback_(sub_81CEE44);
+ return 0;
+ case 17:
+ sub_81CEE90();
+ sub_81D20AC(sub_81CDC70());
+ return 0;
+ case 18:
+ if (sub_81D20BC(sub_81CDC70()))
+ return 2;
+ return 0;
+ case 19:
+ sub_81CEE74(TRUE);
+ return 0;
+ case 20:
+ if (!sub_81D3178(sub_81CDC70(), &structPtr->unk1814))
+ {
+ sub_81D3464(structPtr->unk28e0);
+ if (sub_81CDD5C() == TRUE || sub_81CDC60() != sub_81CDC50())
+ sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0());
+
+ return 4;
+ }
+ return 2;
+ }
+
+ return 4;
+}
+
+u32 sub_81CE2D0(s32 state)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ switch (state)
+ {
+ case 0:
+ sub_81CEEC8();
+ sub_81D3520(structPtr->unk28e0);
+ return 1;
+ case 1:
+ if (sub_81D31A4(sub_81CDC70(), &structPtr->unk1814))
+ return 2;
+ sub_81CEE74(FALSE);
+ return 1;
+ case 2:
+ sub_81C7AC0(0);
+ if (!sub_81CDD5C())
+ sub_81C78A0();
+ return 0;
+ case 3:
+ if (IsPaletteFadeActive() || MainMenuLoopedTaskIsBusy())
+ return 2;
+ sub_81D354C(structPtr->unk28e0);
+ HideBg(1);
+ HideBg(2);
+ HideBg(3);
+ return 1;
+ }
+
+ return 4;
+}
+
+u32 sub_81CE37C(s32 state)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+ struct UnknownStruct_81D1ED4 *unkPtr = sub_81CDC70();
+
+ switch (state)
+ {
+ case 0:
+ sub_81CD548(0);
+ return 1;
+ case 1:
+ sub_81CD548(1);
+ return 1;
+ case 2:
+ sub_81CD548(2);
+ sub_81D3520(structPtr->unk28e0);
+ return 1;
+ case 3:
+ sub_81D2074(unkPtr);
+ return 1;
+ case 4:
+ if (!sub_81D3150(&structPtr->unk1814))
+ {
+ sub_81CED30(sub_81CDC84());
+ return 1;
+ }
+ return 2;
+ case 5:
+ sub_81CE754(0, sub_81CDC84(), FALSE);
+ return 1;
+ case 6:
+ sub_81CE754(1, sub_81CDC84(), FALSE);
+ return 1;
+ case 7:
+ sub_81CE754(2, sub_81CDC84(), FALSE);
+ return 1;
+ case 8:
+ if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE)
+ return 1;
+ return 2;
+ case 9:
+ unkPtr = sub_81CDC70();
+ if (!sub_81D3178(unkPtr, &structPtr->unk1814))
+ {
+ sub_81D3464(structPtr->unk28e0);
+ if (sub_81CDD5C() != TRUE && sub_81CDC60() == sub_81CDC50())
+ return 1;
+
+ sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0());
+ return 1;
+ }
+ return 2;
+ }
+
+ return 4;
+}
+
+u32 sub_81CE4D8(s32 state)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ switch (state)
+ {
+ case 0:
+ sub_81CD548(0);
+ return 1;
+ case 1:
+ sub_81CD548(1);
+ return 1;
+ case 2:
+ sub_81CD548(2);
+ return 1;
+ case 3:
+ sub_81CED30(sub_81CDC84());
+ return 1;
+ case 4:
+ sub_81CE754(0, sub_81CDC84(), FALSE);
+ return 1;
+ case 5:
+ sub_81CE754(1, sub_81CDC84(), FALSE);
+ return 1;
+ case 6:
+ sub_81CE754(2, sub_81CDC84(), FALSE);
+ return 1;
+ case 7:
+ if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE)
+ return 1;
+ return 2;
+ case 8:
+ if (!sub_81D3178(sub_81CDC70(), &structPtr->unk1814))
+ {
+ sub_81D3464(structPtr->unk28e0);
+ sub_81D3480(structPtr->unk28e0, structPtr->unk1816, sub_81CDDB0());
+ return 1;
+ }
+ return 2;
+ }
+
+ return 4;
+}
+
+u32 sub_81CE5E4(s32 state)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ switch (state)
+ {
+ case 0:
+ sub_81CD548(0);
+ return 1;
+ case 1:
+ sub_81CD548(1);
+ return 1;
+ case 2:
+ sub_81CD548(2);
+ sub_81D3520(structPtr->unk28e0);
+ return 1;
+ case 3:
+ if (!sub_81D31A4(sub_81CDC70(), &structPtr->unk1814))
+ return 1;
+ return 2;
+ case 4:
+ sub_81CE754(0, sub_81CDC84(), FALSE);
+ return 1;
+ case 5:
+ sub_81CE754(1, sub_81CDC84(), FALSE);
+ return 1;
+ case 6:
+ sub_81CE754(2, sub_81CDC84(), FALSE);
+ return 1;
+ case 7:
+ if (sub_81CE754(3, sub_81CDC84(), FALSE) == TRUE)
+ return 1;
+ return 2;
+ }
+
+ return 4;
+}
+
+u32 sub_81CE6BC(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_811FAA4(sub_81CDD7C(), 0xb0, 0x20);
+ return 1;
+ case 1:
+ sub_81C7BA4(5);
+ return 1;
+ case 2:
+ if (IsDma3ManagerBusyWithBgCopy_() == TRUE)
+ return 2;
+ return 1;
+ }
+
+ return 4;
+}
+
+u32 sub_81CE700(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ sub_811FAF8();
+ return 1;
+ case 1:
+ sub_81C7BA4(4);
+ return 1;
+ case 2:
+ if (IsDma3ManagerBusyWithBgCopy_() == TRUE)
+ return 2;
+ return 1;
+ }
+
+ return 4;
+}
+
+u8 *sub_81CE738(u8 *dst, u16 num)
+{
+ u8 *txtPtr = ConvertIntToDecimalStringN(dst, num, STR_CONV_MODE_RIGHT_ALIGN, 4);
+ txtPtr = StringCopy(txtPtr, gText_Number2);
+
+ return txtPtr;
+}
+
+bool32 sub_81CE754(u8 a0, u16 a1, bool8 a2)
+{
+ u8 text[32];
+ const u8 *str;
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ switch (a0)
+ {
+ case 0:
+ FillWindowPixelBuffer(structPtr->unk1820, 0);
+ if (sub_81CDD5C() == TRUE)
+ FillWindowPixelBuffer(structPtr->unk1821, 0);
+ break;
+ case 1:
+ if (sub_81CDC60() != sub_81CDC50() - 1 || sub_81CDD5C() == TRUE)
+ {
+ str = sub_81CDD04(a1);
+ AddTextPrinterParameterized(structPtr->unk1820, 1, str, 0, 1, 0, NULL);
+ }
+ break;
+ case 2:
+ if (sub_81CDD5C() == TRUE)
+ {
+ str = sub_81CDD24(a1);
+ AddTextPrinterParameterized(structPtr->unk1820, 1, str, 0, 17, 0, NULL);
+ text[0] = EXT_CTRL_CODE_BEGIN;
+ text[1] = 4;
+ text[2] = 8;
+ text[3] = 0;
+ text[4] = 9;
+ StringCopy(text + 5, gText_Number2);
+ AddTextPrinterParameterized(structPtr->unk1821, 1, text, 4, 1, 0, NULL);
+ ConvertIntToDecimalStringN(text + 5, sub_81CDD48(), STR_CONV_MODE_RIGHT_ALIGN, 4);
+ AddTextPrinterParameterized(structPtr->unk1821, 1, text, 28, 1, 0, NULL);
+ }
+ break;
+ case 3:
+ switch (structPtr->unk2908)
+ {
+ case 0:
+ if (a2)
+ CopyWindowToVram(structPtr->unk1820, 3);
+ else
+ CopyWindowToVram(structPtr->unk1820, 2);
+
+ if (sub_81CDD5C() == TRUE)
+ {
+ structPtr->unk2908++;
+ return FALSE;
+ }
+ else
+ {
+ structPtr->unk2908 = 0;
+ return TRUE;
+ }
+ case 1:
+ if (a2)
+ CopyWindowToVram(structPtr->unk1821, 3);
+ else
+ CopyWindowToVram(structPtr->unk1821, 2);
+
+ structPtr->unk2908 = 0;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void sub_81CE934(void)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ CopyWindowToVram(structPtr->unk1822, 3);
+ CopyWindowToVram(structPtr->unk1823, 3);
+}
+
+void sub_81CE964(struct Sprite *sprite)
+{
+ if (sprite->data[0] == sub_81CDC60())
+ StartSpriteAnim(sprite, 0);
+ else
+ StartSpriteAnim(sprite, 1);
+}
+
+void sub_81CE990(struct Sprite *sprite)
+{
+ if (sub_81CDC60() == sub_81CDC50() - 1)
+ sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x65);
+ else
+ sprite->oam.paletteNum = IndexOfSpritePaletteTag(0x66);
+}
+
+void sub_81CE9C8(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, sub_81CDD7C());
+}
+
+void sub_81CE9E4(void)
+{
+ struct SpriteSheet sprSheets[4];
+ struct SpriteTemplate sprTemplate;
+ struct SpritePalette sprPals[3];
+ struct SpriteSheet sprSheet;
+ struct Sprite *sprite;
+ u16 i, spriteId;
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ sub_81D321C(sprSheets, &sprTemplate, sprPals);
+ if (sub_81CDD5C() == TRUE)
+ {
+ structPtr->monMarks.baseTileTag = 0x6A;
+ structPtr->monMarks.basePaletteTag = 0x6A;
+ sub_811F90C(&structPtr->monMarks);
+ sub_811FA90();
+ sprite = sub_811FF94(0x69, 0x69, gUnknown_08623338);
+ sprite->oam.priority = 3;
+ sprite->pos1.x = 192;
+ sprite->pos1.y = 32;
+ sprite->callback = sub_81CE9C8;
+ structPtr->unk28dc = sprite;
+ sub_81C7990(IndexOfSpritePaletteTag(0x69), 0);
+ }
+ else
+ {
+ LoadSpriteSheets(sprSheets);
+ Pokenav_AllocAndLoadPalettes(sprPals);
+ for (i = 0; i < sub_81CDC50() - 1; i++)
+ {
+ spriteId = CreateSprite(&sprTemplate, 226, (i * 20) + 8, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ structPtr->unk1806[i] = spriteId;
+ gSprites[spriteId].data[0] = i;
+ gSprites[spriteId].callback = sub_81CE964;
+ }
+ else
+ {
+ structPtr->unk1806[i] = 0xFF;
+ }
+ }
+
+ sprTemplate.tileTag = 0x67;
+ sprTemplate.callback = SpriteCallbackDummy;
+ for (; i < 6; i++)
+ {
+ spriteId = CreateSprite(&sprTemplate, 230, (i * 20) + 8, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ structPtr->unk1806[i] = spriteId;
+ gSprites[spriteId].oam.size = 0;
+ }
+ else
+ {
+ structPtr->unk1806[i] = 0xFF;
+ }
+ }
+
+ sprTemplate.tileTag = 0x66;
+ sprTemplate.callback = sub_81CE990;
+ spriteId = CreateSprite(&sprTemplate, 222, (i * 20) + 8, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ structPtr->unk1806[i] = spriteId;
+ gSprites[spriteId].oam.shape = 1;
+ gSprites[spriteId].oam.size = 2;
+ }
+ else
+ {
+ structPtr->unk1806[i] = 0xFF;
+ }
+ }
+
+ sub_81D32B0(&sprSheet, &sprPals[0]);
+ LoadSpriteSheet(&sprSheet);
+ sprPals[1].data = NULL;
+ Pokenav_AllocAndLoadPalettes(sprPals);
+}
+
+void sub_81CEBF4(struct Pokenav7Struct *structPtr)
+{
+ u8 i;
+
+ if (sub_81CDD5C() == TRUE)
+ {
+ DestroySprite(structPtr->unk28dc);
+ FreeSpriteTilesByTag(0x6A);
+ FreeSpriteTilesByTag(0x69);
+ FreeSpritePaletteByTag(0x6A);
+ FreeSpritePaletteByTag(0x69);
+ }
+ else
+ {
+ for (i = 0; i < 7; i++)
+ DestroySprite(&gSprites[structPtr->unk1806[i]]);
+
+ FreeSpriteTilesByTag(0x65);
+ FreeSpriteTilesByTag(0x66);
+ FreeSpriteTilesByTag(0x67);
+ FreeSpritePaletteByTag(0x65);
+ FreeSpritePaletteByTag(0x66);
+ }
+
+ if (structPtr->unk1816 != 0xFF)
+ {
+ DestroySprite(&gSprites[structPtr->unk1816]);
+ FreeSpriteTilesByTag(0x64);
+ FreeSpritePaletteByTag(0x64);
+ }
+}
+
+void sub_81CECA0(void)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ RemoveWindow(structPtr->unk1820);
+ if (sub_81CDD5C() == TRUE)
+ {
+ RemoveWindow(structPtr->unk1821);
+ RemoveWindow(structPtr->unk1822);
+ RemoveWindow(structPtr->unk1823);
+ }
+ else
+ {
+ sub_81C7FDC();
+ }
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP);
+ sub_81CEBF4(structPtr);
+ sub_81CEE68();
+ FreePokenavSubstruct(0xC);
+}
+
+void sub_81CED10(struct Sprite *sprite)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+ sprite->pos1.x = structPtr->unk1814 + 38;
+}
+
+void sub_81CED30(u8 var)
+{
+ struct SpriteTemplate sprTemplate;
+ struct SpriteSheet sprSheet;
+ struct SpritePalette sprPal;
+ u8 spriteId;
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ if (structPtr->unk1816 == 0xFF)
+ {
+ sub_81D31D0(&sprSheet, &sprTemplate, &sprPal);
+ sprSheet.data = sub_81CDCB4(var);
+ sprPal.data = sub_81CDCD4(var);
+ structPtr->unk1818 = LoadSpritePalette(&sprPal);
+ structPtr->unk181A = LoadSpriteSheet(&sprSheet);
+ spriteId = CreateSprite(&sprTemplate, 38, 104, 0);
+ structPtr->unk1816 = spriteId;
+ if (spriteId == MAX_SPRITES)
+ {
+ FreeSpriteTilesByTag(0x64);
+ FreeSpritePaletteByTag(0x64);
+ structPtr->unk1816 = 0xFF;
+ }
+ else
+ {
+ structPtr->unk1816 = spriteId;
+ gSprites[structPtr->unk1816].callback = sub_81CED10;
+ structPtr->unk181C = (void*)(VRAM) + 0x10000 + (structPtr->unk181A * 32);
+ structPtr->unk1818 = (structPtr->unk1818 * 16) + 0x100;
+ }
+ }
+ else
+ {
+ DmaCopy16Defvars(3, sub_81CDCB4(var), structPtr->unk181C, 0x800);
+ LoadPalette(sub_81CDCD4(var), structPtr->unk1818, 0x20);
+ }
+}
+
+void sub_81CEE44(void)
+{
+ struct UnknownStruct_81D1ED4 *unk = sub_81CDC70();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_81D2108(unk);
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+void sub_81CEE68(void)
+{
+ SetPokenavVBlankCallback();
+}
+
+void sub_81CEE74(bool8 showBg)
+{
+ if (showBg)
+ ShowBg(2);
+ else
+ HideBg(2);
+}
+
+void sub_81CEE90(void)
+{
+ struct UnknownStruct_81D1ED4 *unk = sub_81CDC70();
+ u8 id = sub_81CDC84();
+
+ gUnknown_030012BC = id;
+ sub_81D1F84(unk, unk->unk14[3], unk->unk14[id]);
+ sub_81D2074(unk);
+}
+
+void sub_81CEEC8(void)
+{
+ struct UnknownStruct_81D1ED4 *unk = sub_81CDC70();
+
+ if (sub_81CDD5C() || sub_81CDC60() != sub_81CDC50() - 1)
+ sub_81D1F84(unk, unk->unk14[sub_81CDC84()], unk->unk14[3]);
+}
+
+u8 sub_81CEF14(void)
+{
+ struct Pokenav7Struct *structPtr = GetSubstructPtr(0xC);
+
+ if (sub_81CDD5C() == 1)
+ return structPtr->monMarks.markings;
+ else
+ return 0;
+}
diff --git a/src/pokenav_unk_8.c b/src/pokenav_unk_8.c
new file mode 100644
index 000000000..c52932a79
--- /dev/null
+++ b/src/pokenav_unk_8.c
@@ -0,0 +1,710 @@
+#include "global.h"
+#include "pokenav.h"
+#include "bg.h"
+#include "menu.h"
+#include "window.h"
+#include "sound.h"
+#include "dynamic_placeholder_text_util.h"
+#include "strings.h"
+#include "string_util.h"
+#include "international_string_util.h"
+#include "constants/songs.h"
+
+struct PokenavSub7
+{
+ u32 (*unk0)(struct PokenavSub7 *);
+ u32 loopedTaskId;
+ u8 fill1[4];
+ s32 unkC;
+ s32 unk10;
+ u32 unk14;
+ u32 unk18;
+ u32 unk1C;
+ struct PokenavSub18 *unkPtr;
+};
+
+struct PokenavSub8
+{
+ bool32 (*callback)(void);
+ u32 ltid;
+ u16 winid;
+ bool32 unkC;
+ u8 buff[BG_SCREEN_SIZE];
+}; // size: 0x810
+
+static u32 sub_81CF010(struct PokenavSub7 *structPtr);
+static u32 sub_81CF030(struct PokenavSub7 *structPtr);
+static u32 sub_81CF0B8(struct PokenavSub7 *structPtr);
+static u32 sub_81CF0B0(struct PokenavSub7 *structPtr);
+static u32 sub_81CF11C(s32 state);
+static u32 sub_81CF134(s32 state);
+static u32 sub_81CF1C4(s32 state);
+static u32 sub_81CF1D8(s32 state);
+static u32 sub_81CF278(s32 state);
+static u32 sub_81CF578(s32 state);
+static u32 sub_81CF5F0(s32 state);
+static u32 sub_81CF668(s32 state);
+static u32 sub_81CF6E0(s32 state);
+static u32 sub_81CF758(s32 state);
+static u32 sub_81CF798(s32 state);
+static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item);
+static bool32 sub_81CF3E4(void);
+static u32 sub_81CF418(s32 state);
+static void sub_81CF7C8(struct PokenavSub8 *);
+static void sub_81CF7F4(struct PokenavSub8 *);
+static void sub_81CF88C(void);
+static void sub_81CF8E4(struct PokenavMonList *, u8 *);
+
+static const u32 gUnknown_086233A0[] = {0x16, 0x17, 0x18, 0x21, 0x2F};
+
+static const LoopedTask gUnknown_086233B4[] =
+{
+ sub_81CF134,
+ sub_81CF1C4,
+ sub_81CF1D8,
+ sub_81CF278
+};
+
+static const u16 gUnknown_086233C4[] = INCBIN_U16("graphics/pokenav/condition_search2.gbapal");
+static const u32 gUnknown_086233E4[] = INCBIN_U32("graphics/pokenav/condition_search2.4bpp.lz");
+static const u32 gUnknown_086234AC[] = INCBIN_U32("graphics/pokenav/condition_search2.bin.lz");
+static const u16 gUnknown_08623570[] = INCBIN_U16("graphics/pokenav/8623570.gbapal");
+
+static const struct BgTemplate gUnknown_08623590[] =
+{
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 0x06,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ }, {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 0x07,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const LoopedTask gUnknown_08623598[] =
+{
+ NULL,
+ sub_81CF578,
+ sub_81CF5F0,
+ sub_81CF668,
+ sub_81CF6E0,
+ sub_81CF758,
+ sub_81CF798
+};
+
+static const struct WindowTemplate gUnknown_086235B4 =
+{
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 1,
+ .baseBlock = 20
+};
+
+static const u8 gUnknown_086235BC[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
+static const u8 gUnknown_086235C8[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
+static const u8 gUnknown_086235D4[] = _("{UNK_SPACER}");
+
+bool32 PokenavCallback_Init_8(void)
+{
+ struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7));
+ if (structPtr == NULL)
+ return FALSE;
+
+ structPtr->unkPtr = AllocSubstruct(18, sizeof(struct PokenavSub18));
+ if (structPtr->unkPtr == NULL)
+ return FALSE;
+
+ structPtr->unk0 = sub_81CF010;
+ structPtr->loopedTaskId = CreateLoopedTask(sub_81CF11C, 1);
+ structPtr->unk18 = 0;
+ structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()];
+ return TRUE;
+}
+
+bool32 PokenavCallback_Init_10(void)
+{
+ struct PokenavSub7 *structPtr = AllocSubstruct(7, sizeof(struct PokenavSub7));
+ if (structPtr == NULL)
+ return FALSE;
+
+ structPtr->unkPtr = GetSubstructPtr(18);
+ structPtr->unk0 = sub_81CF030;
+ structPtr->unk18 = 1;
+ structPtr->unk14 = gUnknown_086233A0[sub_81C76AC()];
+ return TRUE;
+}
+
+u32 sub_81CEFDC(void)
+{
+ struct PokenavSub7 *structPtr = GetSubstructPtr(7);
+ return structPtr->unk0(structPtr);
+}
+
+void sub_81CEFF0(void)
+{
+ struct PokenavSub7 *structPtr = GetSubstructPtr(7);
+ if (structPtr->unk1C == 0)
+ FreePokenavSubstruct(18);
+ FreePokenavSubstruct(7);
+}
+
+static bool32 sub_81CF010(struct PokenavSub7 *structPtr)
+{
+ if (!IsLoopedTaskActive(structPtr->loopedTaskId))
+ structPtr->unk0 = sub_81CF030;
+ return FALSE;
+}
+
+static u32 sub_81CF030(struct PokenavSub7 *structPtr)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ return 1;
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ return 2;
+ else if (gMain.newKeys & DPAD_LEFT)
+ return 3;
+ else if (gMain.newKeys & DPAD_RIGHT)
+ return 4;
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ structPtr->unk1C = 0;
+ structPtr->unk0 = sub_81CF0B0;
+ return 5;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ structPtr->unkPtr->unk2 = GetSelectedMatchCall();
+ structPtr->unk1C = 1;
+ structPtr->unk0 = sub_81CF0B8;
+ return 6;
+ }
+ else
+ return 0;
+}
+
+static u32 sub_81CF0B0(struct PokenavSub7 *structPtr)
+{
+ return 100003;
+}
+
+static u32 sub_81CF0B8(struct PokenavSub7 *structPtr)
+{
+ return 100009;
+}
+
+static u32 sub_81CF0C0(void)
+{
+ struct PokenavSub7 *structPtr = GetSubstructPtr(7);
+ return structPtr->unk18;
+}
+
+static struct PokenavMonList * sub_81CF0D0(void)
+{
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+ return ptr->unkPtr->unk4;
+}
+
+static u16 sub_81CF0E0(void)
+{
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+ return ptr->unkPtr->unk0;
+}
+
+static s32 sub_81CF0F0(void)
+{
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+ s32 i = GetSelectedMatchCall();
+ return ptr->unkPtr->unk4[i].unk6;
+}
+
+static u16 sub_81CF10C(void)
+{
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+ return ptr->unkPtr->unk2;
+}
+
+static u32 sub_81CF11C(s32 state)
+{
+ return gUnknown_086233B4[state](state);
+}
+
+static u32 sub_81CF134(s32 state)
+{
+ s32 i;
+ struct PokenavMonList item;
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+
+ ptr->unkPtr->unk0 = 0;
+ ptr->unkPtr->unk2 = 0;
+ item.boxId = 14;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon * pokemon = &gPlayerParty[i];
+ if (!GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES))
+ return LT_INC_AND_CONTINUE;
+ if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG))
+ {
+ item.monId = i;
+ item.unk6 = GetMonData(pokemon, ptr->unk14);
+ sub_81CF2C4(ptr, &item);
+ }
+ }
+
+ return LT_INC_AND_CONTINUE;
+}
+
+static u32 sub_81CF1C4(s32 state)
+{
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+ ptr->unk10 = 0;
+ ptr->unkC = 0;
+ return LT_INC_AND_CONTINUE;
+}
+
+static u32 sub_81CF1D8(s32 state)
+{
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+ s32 boxId = ptr->unkC;
+ s32 monId = ptr->unk10;
+ s32 boxCount = 0;
+ struct PokenavMonList item;
+
+ while (boxId < TOTAL_BOXES_COUNT)
+ {
+ while (monId < IN_BOX_COUNT)
+ {
+ if (CheckBoxMonSanityAt(boxId, monId))
+ {
+ item.boxId = boxId;
+ item.monId = monId;
+ item.unk6 = GetBoxMonDataAt(boxId, monId, ptr->unk14);
+ sub_81CF2C4(ptr, &item);
+ }
+ boxCount++;
+ monId++;
+ if (boxCount > 14)
+ {
+ ptr->unkC = boxId;
+ ptr->unk10 = monId;
+ return LT_CONTINUE;
+ }
+ }
+ monId = 0;
+ boxId++;
+ }
+
+ return LT_INC_AND_CONTINUE;
+}
+
+static u32 sub_81CF278(s32 state)
+{
+ struct PokenavSub7 * ptr = GetSubstructPtr(7);
+ s32 r6 = ptr->unkPtr->unk0;
+ s32 r4 = ptr->unkPtr->unk4[0].unk6;
+ s32 i;
+ ptr->unkPtr->unk4[0].unk6 = 1;
+ for (i = 1; i < r6; i++)
+ {
+ if (ptr->unkPtr->unk4[i].unk6 == r4)
+ {
+ ptr->unkPtr->unk4[i].unk6 = ptr->unkPtr->unk4[i - 1].unk6;
+ }
+ else
+ {
+ r4 = ptr->unkPtr->unk4[i].unk6;
+ ptr->unkPtr->unk4[i].unk6 = i + 1;
+ }
+ }
+ ptr->unk18 = 1;
+ return LT_FINISH;
+}
+
+static void sub_81CF2C4(struct PokenavSub7 *structPtr, struct PokenavMonList *item)
+{
+ u32 left = 0;
+ u32 right = structPtr->unkPtr->unk0;
+ u32 insertionIdx = left + (right - left) / 2;
+
+ while (right != insertionIdx)
+ {
+ if (item->unk6 > structPtr->unkPtr->unk4[insertionIdx].unk6)
+ right = insertionIdx;
+ else
+ left = insertionIdx + 1;
+ insertionIdx = left + (right - left) / 2;
+ }
+ for (right = structPtr->unkPtr->unk0; right > insertionIdx; right--)
+ structPtr->unkPtr->unk4[right] = structPtr->unkPtr->unk4[right - 1];
+ structPtr->unkPtr->unk4[insertionIdx] = *item;
+ structPtr->unkPtr->unk0++;
+}
+
+bool32 sub_81CF330(void)
+{
+ struct PokenavSub8 * unk = AllocSubstruct(8, sizeof(struct PokenavSub8));
+ if (unk == NULL)
+ return FALSE;
+ unk->ltid = CreateLoopedTask(sub_81CF418, 1);
+ unk->callback = sub_81CF3E4;
+ unk->unkC = FALSE;
+ return TRUE;
+}
+
+bool32 sub_81CF368(void)
+{
+ struct PokenavSub8 * unk = AllocSubstruct(8, sizeof(struct PokenavSub8));
+ if (unk == NULL)
+ return FALSE;
+ unk->ltid = CreateLoopedTask(sub_81CF418, 1);
+ unk->callback = sub_81CF3E4;
+ unk->unkC = TRUE;
+ return TRUE;
+}
+
+void sub_81CF3A0(s32 idx)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ unk->ltid = CreateLoopedTask(gUnknown_08623598[idx], 1);
+ unk->callback = sub_81CF3E4;
+}
+
+bool32 sub_81CF3D0(void)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ return unk->callback();
+}
+
+bool32 sub_81CF3E4(void)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ return IsLoopedTaskActive(unk->ltid);
+}
+
+void sub_81CF3F8(void)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ sub_81C8234();
+ RemoveWindow(unk->winid);
+ FreePokenavSubstruct(8);
+}
+
+static u32 sub_81CF418(s32 state)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ switch (state)
+ {
+ case 0:
+ InitBgTemplates(gUnknown_08623590, NELEMS(gUnknown_08623590));
+ decompress_and_copy_tile_data_to_vram(1, gUnknown_086233E4, 0, 0, 0);
+ SetBgTilemapBuffer(1, unk->buff);
+ CopyToBgTilemapBuffer(1, gUnknown_086234AC, 0, 0);
+ CopyBgTilemapBufferToVram(1);
+ CopyPaletteIntoBufferUnfaded(gUnknown_086233C4, 0x10, 0x20);
+ CopyBgTilemapBufferToVram(1);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ if (!sub_81CF0C0())
+ return LT_PAUSE;
+ return LT_INC_AND_PAUSE;
+ case 2:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ CopyPaletteIntoBufferUnfaded(gUnknown_08623570, 0x20, 0x20);
+ sub_81CF88C();
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (sub_81C8224())
+ return LT_PAUSE;
+ sub_81CF7C8(unk);
+ sub_81C7BA4(3);
+ return LT_INC_AND_PAUSE;
+ case 4:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ShowBg(1);
+ ShowBg(2);
+ HideBg(3);
+ if (!unk->unkC)
+ {
+ u8 r4 = sub_81C76AC() + 8;
+ LoadLeftHeaderGfxForIndex(r4);
+ sub_81C7FA0(r4, 1, 0);
+ sub_81C7FA0(1, 1, 0);
+ }
+ sub_81C7AC0(1);
+ return LT_INC_AND_PAUSE;
+ case 5:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81CF578(s32 state)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_MoveCursorUp())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81CF7F4(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81CF5F0(s32 state)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_MoveCursorDown())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81CF7F4(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81CF668(s32 state)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_PageUp())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81CF7F4(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81CF6E0(s32 state)
+{
+ struct PokenavSub8 * unk = GetSubstructPtr(8);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_PageDown())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81CF7F4(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81CF758(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81C7AC0(0);
+ sub_81C78A0();
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ if (MainMenuLoopedTaskIsBusy())
+ return LT_PAUSE;
+ sub_81C7FDC();
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81CF798(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81C7AC0(0);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static void sub_81CF7C8(struct PokenavSub8 * ptr)
+{
+ ptr->winid = AddWindow(&gUnknown_086235B4);
+ PutWindowTilemap(ptr->winid);
+ CopyWindowToVram(ptr->winid, 1);
+ sub_81CF7F4(ptr);
+}
+
+static void sub_81CF7F4(struct PokenavSub8 * ptr)
+{
+ s32 r7 = sub_81CF0F0();
+ DynamicPlaceholderTextUtil_Reset();
+ DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1);
+ *gStringVar1 = EOS;
+ DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar2, gText_NumberF700);
+ AddTextPrinterParameterized(ptr->winid, 1, gStringVar2, 4, 1, 0xFF, NULL);
+ ConvertIntToDecimalStringN(gStringVar1, r7, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ AddTextPrinterParameterized(ptr->winid, 1, gStringVar1, 34, 1, 0xFF, NULL);
+ CopyWindowToVram(ptr->winid, 2);
+}
+
+static void sub_81CF88C(void)
+{
+ struct MatchCallListTemplate template;
+ template.unk0 = sub_81CF0D0();
+ template.unk4 = sub_81CF0E0();
+ template.unk8 = 4;
+ template.unk6 = sub_81CF10C();
+ template.unk9 = 13;
+ template.unkA = 17;
+ template.unkB = 1;
+ template.unkC = 8;
+ template.unkD = 2;
+ template.unkE = 1;
+ template.unk10 = sub_81CF8E4;
+ template.unk14 = NULL;
+ sub_81C81D4(&gUnknown_08623590[1], &template, 0);
+}
+
+static void sub_81CF8E4(struct PokenavMonList * item, u8 * dest)
+{
+ u8 gender;
+ u8 level;
+ u8 * s;
+ const u8 * genderStr;
+ if (item->boxId == 14)
+ {
+ struct Pokemon * mon = &gPlayerParty[item->monId];
+ gender = GetMonGender(mon);
+ level = GetLevelFromMonExp(mon);
+ GetMonData(mon, MON_DATA_NICKNAME, gStringVar3);
+ }
+ else
+ {
+ struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId);
+ gender = GetBoxMonGender(mon);
+ level = GetLevelFromBoxMonExp(mon);
+ GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3);
+ }
+ StringGetEnd10(gStringVar3);
+ dest = sub_81DB494(dest, 1, gStringVar3, 60);
+ switch (gender)
+ {
+ default:
+ genderStr = gUnknown_086235D4;
+ break;
+ case MON_MALE:
+ genderStr = gUnknown_086235BC;
+ break;
+ case MON_FEMALE:
+ genderStr = gUnknown_086235C8;
+ break;
+ }
+ s = StringCopy(gStringVar1, genderStr);
+ *s++ = CHAR_SLASH;
+ *s++ = CHAR_SPECIAL_F9;
+ *s++ = 5; // LV
+ ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3);
+ sub_81DB494(dest, 1, gStringVar1, 40);
+}
diff --git a/src/pokenav_unk_9.c b/src/pokenav_unk_9.c
new file mode 100644
index 000000000..05d590a87
--- /dev/null
+++ b/src/pokenav_unk_9.c
@@ -0,0 +1,726 @@
+#include "global.h"
+#include "pokenav.h"
+#include "bg.h"
+#include "menu.h"
+#include "window.h"
+#include "sound.h"
+#include "string_util.h"
+#include "international_string_util.h"
+#include "constants/songs.h"
+
+struct PokenavSub9
+{
+ u32 (*unk0)(struct PokenavSub9*);
+ u32 loopedTaskId;
+ u16 winid;
+ s32 unkC;
+ s32 unk10;
+ u32 unk14;
+ u32 unk18;
+ struct PokenavSub18 *unk1C;
+};
+
+struct PokenavSub10
+{
+ bool32 (*callback)(void);
+ u32 ltid;
+ u16 winid;
+ bool32 unkC;
+ u8 buff[BG_SCREEN_SIZE];
+};
+
+static u32 sub_81CFA68(struct PokenavSub9 *structPtr);
+static u32 sub_81CFA88(struct PokenavSub9 *structPtr);
+static u32 sub_81CFB08(struct PokenavSub9 *structPtr);
+static u32 sub_81CFB10(struct PokenavSub9 *structPtr);
+static u32 sub_81CFB8C(s32 state);
+static u32 sub_81CFC2C(s32 state);
+static u32 sub_81CFC40(s32 state);
+static u32 sub_81CFB74(s32 state);
+static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item);
+static u32 sub_81CFEB8(s32 state);
+static bool32 sub_81CFE84(void);
+static u32 sub_81CFFFC(s32 state);
+static u32 sub_81D0074(s32 state);
+static u32 sub_81D00EC(s32 state);
+static u32 sub_81D0164(s32 state);
+static u32 sub_81D01DC(s32 state);
+static u32 sub_81D021C(s32 state);
+static void sub_81D02B0(s32 windowId, s32 val1, s32 val2);
+static void sub_81D024C(struct PokenavSub10 *ptr);
+static void sub_81D0288(struct PokenavSub10 *ptr);
+static void sub_81D0304(void);
+static void sub_81D035C(struct PokenavMonList *, u8 *);
+
+static const LoopedTask gUnknown_086235D8[] =
+{
+ sub_81CFB8C,
+ sub_81CFC2C,
+ sub_81CFC40
+};
+
+static const u16 gUnknown_086235E4[] = INCBIN_U16("graphics/pokenav/ui_ribbons.gbapal");
+static const u32 gUnknown_08623604[] = INCBIN_U32("graphics/pokenav/ui_ribbons.4bpp.lz");
+static const u32 gUnknown_086236CC[] = INCBIN_U32("graphics/pokenav/ui_ribbons.bin.lz");
+static const u16 gUnknown_08623790[] = INCBIN_U16("graphics/pokenav/8623790.gbapal");
+
+static const struct BgTemplate gUnknown_086237B0[] =
+{
+ {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 0x06,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0
+ }, {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 0x07,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+static const LoopedTask gUnknown_086237B8[] =
+{
+ NULL,
+ sub_81CFFFC,
+ sub_81D0074,
+ sub_81D00EC,
+ sub_81D0164,
+ sub_81D01DC,
+ sub_81D021C
+};
+
+static const struct WindowTemplate gUnknown_086237D4 =
+{
+ .bg = 1,
+ .tilemapLeft = 1,
+ .tilemapTop = 6,
+ .width = 7,
+ .height = 2,
+ .paletteNum = 1,
+ .baseBlock = 20
+};
+
+static const u8 gUnknown_086237DC[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
+static const u8 gUnknown_086237E8[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}");
+static const u8 gUnknown_086237F4[] = _("{UNK_SPACER}");
+
+bool32 PokenavCallback_Init_12(void)
+{
+ struct PokenavSub9 *structPtr = AllocSubstruct(9, sizeof(struct PokenavSub9));
+ if (structPtr == NULL)
+ return FALSE;
+
+ structPtr->unk1C = AllocSubstruct(18, sizeof(struct PokenavSub18));
+ if (structPtr->unk1C == NULL)
+ return FALSE;
+
+ structPtr->unk0 = sub_81CFA68;
+ structPtr->loopedTaskId = CreateLoopedTask(sub_81CFB74, 1);
+ structPtr->unk14 = 0;
+ return TRUE;
+}
+
+bool32 PokenavCallback_Init_14(void)
+{
+ struct PokenavSub9 *structPtr = AllocSubstruct(9, sizeof(struct PokenavSub9));
+ if (structPtr == NULL)
+ return FALSE;
+
+ structPtr->unk1C = GetSubstructPtr(18);
+ structPtr->unk0 = sub_81CFA88;
+ structPtr->unk14 = 1;
+ return TRUE;
+}
+
+u32 sub_81CFA34(void)
+{
+ struct PokenavSub9 *structPtr = GetSubstructPtr(9);
+ return structPtr->unk0(structPtr);
+}
+
+void sub_81CFA48(void)
+{
+ struct PokenavSub9 *structPtr = GetSubstructPtr(9);
+ if (!structPtr->unk18)
+ FreePokenavSubstruct(18);
+ FreePokenavSubstruct(9);
+}
+
+static u32 sub_81CFA68(struct PokenavSub9 *structPtr)
+{
+ if (!IsLoopedTaskActive(structPtr->loopedTaskId))
+ structPtr->unk0 = sub_81CFA88;
+ return 0;
+}
+
+static u32 sub_81CFA88(struct PokenavSub9 *structPtr)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ return 1;
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ return 2;
+ if (gMain.newKeys & DPAD_LEFT)
+ return 3;
+ if (gMain.newKeys & DPAD_RIGHT)
+ return 4;
+ if (gMain.newKeys & B_BUTTON)
+ {
+ structPtr->unk18 = 0;
+ structPtr->unk0 = sub_81CFB08;
+ return 5;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ structPtr->unk1C->unk2 = GetSelectedMatchCall();
+ structPtr->unk18 = 1;
+ structPtr->unk0 = sub_81CFB10;
+ return 6;
+ }
+ return 0;
+}
+
+static u32 sub_81CFB08(struct PokenavSub9 *structPtr)
+{
+ return 100005;
+}
+
+static u32 sub_81CFB10(struct PokenavSub9 *structPtr)
+{
+ return 100013;
+}
+
+static u32 sub_81CFB18(void)
+{
+ struct PokenavSub9 *structPtr = GetSubstructPtr(9);
+ return structPtr->unk14;
+}
+
+static struct PokenavMonList * sub_81CFB28(void)
+{
+ struct PokenavSub9 * ptr = GetSubstructPtr(9);
+ return ptr->unk1C->unk4;
+}
+
+static s32 sub_81CFB38(void)
+{
+ struct PokenavSub9 * ptr = GetSubstructPtr(9);
+ return ptr->unk1C->unk0;
+}
+
+static s32 sub_81CFB48(void)
+{
+ struct PokenavSub9 * ptr = GetSubstructPtr(9);
+ s32 idx = GetSelectedMatchCall();
+ return ptr->unk1C->unk4[idx].unk6;
+}
+
+static s32 sub_81CFB64(void)
+{
+ struct PokenavSub9 * ptr = GetSubstructPtr(9);
+ return ptr->unk1C->unk2;
+}
+
+static u32 sub_81CFB74(s32 state)
+{
+ return gUnknown_086235D8[state](state);
+}
+
+static u32 sub_81CFB8C(s32 state)
+{
+ s32 i;
+ struct PokenavMonList item;
+ struct PokenavSub9 * ptr = GetSubstructPtr(9);
+
+ ptr->unk1C->unk0 = 0;
+ ptr->unk1C->unk2 = 0;
+ item.boxId = 14;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon * pokemon = &gPlayerParty[i];
+ if (!GetMonData(pokemon, MON_DATA_SANITY_HAS_SPECIES))
+ return LT_INC_AND_CONTINUE;
+ if (!GetMonData(pokemon, MON_DATA_SANITY_IS_EGG) && !GetMonData(pokemon, MON_DATA_SANITY_IS_BAD_EGG))
+ {
+ u32 ribbonCount = GetMonData(pokemon, MON_DATA_RIBBON_COUNT);
+ if (ribbonCount != 0)
+ {
+ item.monId = i;
+ item.unk6 = ribbonCount;
+ sub_81CFCEC(ptr, &item);
+ }
+ }
+ }
+
+ return LT_INC_AND_CONTINUE;
+}
+
+static u32 sub_81CFC2C(s32 state)
+{
+ struct PokenavSub9 * ptr = GetSubstructPtr(9);
+ ptr->unk10 = 0;
+ ptr->unkC = 0;
+ return LT_INC_AND_CONTINUE;
+}
+
+static u32 sub_81CFC40(s32 state)
+{
+ struct PokenavSub9 * ptr = GetSubstructPtr(9);
+ s32 boxId = ptr->unkC;
+ s32 monId = ptr->unk10;
+ s32 boxCount = 0;
+ struct PokenavMonList item;
+
+ while (boxId < TOTAL_BOXES_COUNT)
+ {
+ while (monId < IN_BOX_COUNT)
+ {
+ if (CheckBoxMonSanityAt(boxId, monId))
+ {
+ u32 ribbonCount = GetBoxMonDataAt(boxId, monId, MON_DATA_RIBBON_COUNT);
+ if (ribbonCount != 0)
+ {
+ item.boxId = boxId;
+ item.monId = monId;
+ item.unk6 = ribbonCount;
+ sub_81CFCEC(ptr, &item);
+ }
+ }
+ boxCount++;
+ monId++;
+ if (boxCount > 14)
+ {
+ ptr->unkC = boxId;
+ ptr->unk10 = monId;
+ return LT_CONTINUE;
+ }
+ }
+ monId = 0;
+ boxId++;
+ }
+
+ ptr->unk14 = 1;
+ return LT_FINISH;
+}
+
+static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *item)
+{
+ u32 left = 0;
+ u32 right = structPtr->unk1C->unk0;
+ u32 insertionIdx = left + (right - left) / 2;
+
+ while (right != insertionIdx)
+ {
+ if (item->unk6 > structPtr->unk1C->unk4[insertionIdx].unk6)
+ right = insertionIdx;
+ else
+ left = insertionIdx + 1;
+ insertionIdx = left + (right - left) / 2;
+ }
+ for (right = structPtr->unk1C->unk0; right > insertionIdx; right--)
+ structPtr->unk1C->unk4[right] = structPtr->unk1C->unk4[right - 1];
+ structPtr->unk1C->unk4[insertionIdx] = *item;
+ structPtr->unk1C->unk0++;
+}
+
+static bool32 sub_81CFD58(void)
+{
+ s32 i, j;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon * mon = &gPlayerParty[i];
+ if (!GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES))
+ continue;
+ if (GetMonData(mon, MON_DATA_SANITY_IS_EGG))
+ continue;
+ if (GetMonData(mon, MON_DATA_RIBBONS))
+ return TRUE;
+ }
+
+ for (i = 0; i < TOTAL_BOXES_COUNT; i++)
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (!CheckBoxMonSanityAt(i, j))
+ continue;
+ if (GetBoxMonDataAt(i, j, MON_DATA_RIBBONS))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool32 sub_81CFDD0(void)
+{
+ struct PokenavSub10 * ptr = AllocSubstruct(10, sizeof(struct PokenavSub10));
+ if (ptr == NULL)
+ return FALSE;
+ ptr->ltid = CreateLoopedTask(sub_81CFEB8, 1);
+ ptr->callback = sub_81CFE84;
+ ptr->unkC = FALSE;
+ return TRUE;
+}
+
+bool32 sub_81CFE08(void)
+{
+ struct PokenavSub10 * ptr = AllocSubstruct(10, sizeof(struct PokenavSub10));
+ if (ptr == NULL)
+ return FALSE;
+ ptr->ltid = CreateLoopedTask(sub_81CFEB8, 1);
+ ptr->callback = sub_81CFE84;
+ ptr->unkC = TRUE;
+ return TRUE;
+}
+
+void sub_81CFE40(s32 idx)
+{
+ struct PokenavSub10 * ptr = GetSubstructPtr(10);
+ ptr->ltid = CreateLoopedTask(gUnknown_086237B8[idx], 1);
+ ptr->callback = sub_81CFE84;
+}
+
+bool32 sub_81CFE70(void)
+{
+ struct PokenavSub10 * ptr = GetSubstructPtr(10);
+ return ptr->callback();
+}
+
+bool32 sub_81CFE84(void)
+{
+ struct PokenavSub10 * ptr = GetSubstructPtr(10);
+ return IsLoopedTaskActive(ptr->ltid);
+}
+
+void sub_81CFE98(void)
+{
+ struct PokenavSub10 * ptr = GetSubstructPtr(10);
+ sub_81C8234();
+ RemoveWindow(ptr->winid);
+ FreePokenavSubstruct(10);
+}
+
+static u32 sub_81CFEB8(s32 state)
+{
+ struct PokenavSub10 * unk = GetSubstructPtr(10);
+ switch (state)
+ {
+ case 0:
+ InitBgTemplates(gUnknown_086237B0, NELEMS(gUnknown_086237B0));
+ decompress_and_copy_tile_data_to_vram(1, gUnknown_08623604, 0, 0, 0);
+ SetBgTilemapBuffer(1, unk->buff);
+ CopyToBgTilemapBuffer(1, gUnknown_086236CC, 0, 0);
+ CopyPaletteIntoBufferUnfaded(gUnknown_086235E4, 0x10, 0x20);
+ CopyBgTilemapBufferToVram(1);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ if (!sub_81CFB18())
+ return LT_PAUSE;
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ShowBg(1);
+ return LT_INC_AND_PAUSE;
+ case 2:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ CopyPaletteIntoBufferUnfaded(gUnknown_08623790, 0x20, 0x20);
+ sub_81D0304();
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (sub_81C8224())
+ return LT_PAUSE;
+ sub_81D024C(unk);
+ return LT_INC_AND_PAUSE;
+ case 4:
+ if (free_temp_tile_data_buffers_if_possible())
+ return LT_PAUSE;
+ ShowBg(2);
+ HideBg(3);
+ sub_81C7BA4(9);
+ sub_81C7AC0(1);
+ if (!unk->unkC)
+ {
+ LoadLeftHeaderGfxForIndex(2);
+ sub_81C7FA0(2, 1, 0);
+ }
+ return LT_INC_AND_PAUSE;
+ case 5:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ if (sub_81C8010())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81CFFFC(s32 state)
+{
+ struct PokenavSub10 * unk = GetSubstructPtr(10);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_MoveCursorUp())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81D0288(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81D0074(s32 state)
+{
+ struct PokenavSub10 * unk = GetSubstructPtr(10);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_MoveCursorDown())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81D0288(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81D00EC(s32 state)
+{
+ struct PokenavSub10 * unk = GetSubstructPtr(10);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_PageUp())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81D0288(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81D0164(s32 state)
+{
+ struct PokenavSub10 * unk = GetSubstructPtr(10);
+ switch (state)
+ {
+ case 0:
+ switch (MatchCall_PageDown())
+ {
+ case 0:
+ return LT_FINISH;
+ case 1:
+ PlaySE(SE_SELECT);
+ return LT_SET_STATE(2);
+ case 2:
+ PlaySE(SE_SELECT);
+ break;
+ }
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (sub_81C8630())
+ return LT_PAUSE;
+ // fallthrough
+ case 2:
+ sub_81D0288(unk);
+ return LT_INC_AND_PAUSE;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81D01DC(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81C7AC0(0);
+ sub_81C78A0();
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ if (MainMenuLoopedTaskIsBusy())
+ return LT_PAUSE;
+ sub_81C7FDC();
+ break;
+ }
+ return LT_FINISH;
+}
+
+static u32 sub_81D021C(s32 state)
+{
+ switch (state)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_81C7AC0(0);
+ return LT_INC_AND_PAUSE;
+ case 1:
+ if (IsPaletteFadeActive())
+ return LT_PAUSE;
+ break;
+ }
+ return LT_FINISH;
+}
+
+static void sub_81D024C(struct PokenavSub10 * ptr)
+{
+ s32 r2;
+ ptr->winid = AddWindow(&gUnknown_086237D4);
+ PutWindowTilemap(ptr->winid);
+ r2 = sub_81CFB38();
+ sub_81D02B0(ptr->winid, 0, r2);
+ CopyWindowToVram(ptr->winid, 1);
+ sub_81D0288(ptr);
+}
+
+static void sub_81D0288(struct PokenavSub10 * ptr)
+{
+ s32 r4 = GetSelectedMatchCall();
+ s32 r2 = sub_81CFB38();
+ sub_81D02B0(ptr->winid, r4 + 1, r2);
+ CopyWindowToVram(ptr->winid, 2);
+}
+
+static void sub_81D02B0(s32 windowId, s32 val1, s32 val2)
+{
+ u8 strbuf[16];
+ u32 x;
+
+ u8 * ptr = strbuf;
+ ptr = ConvertIntToDecimalStringN(ptr, val1, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ *ptr++ = CHAR_SLASH;
+ ConvertIntToDecimalStringN(ptr, val2, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ x = GetStringCenterAlignXOffset(1, strbuf, 56);
+ AddTextPrinterParameterized(windowId, 1, strbuf,x, 1, 0xFF, NULL);
+}
+
+static void sub_81D0304(void)
+{
+ struct MatchCallListTemplate template;
+ template.unk0 = sub_81CFB28();
+ template.unk4 = sub_81CFB38();
+ template.unk8 = 4;
+ template.unk6 = sub_81CFB64();
+ template.unk9 = 13;
+ template.unkA = 17;
+ template.unkB = 1;
+ template.unkC = 8;
+ template.unkD = 2;
+ template.unkE = 1;
+ template.unk10 = sub_81D035C;
+ template.unk14 = NULL;
+ sub_81C81D4(&gUnknown_086237B0[1], &template, 0);
+}
+
+static void sub_81D035C(struct PokenavMonList * item0, u8 * dest)
+{
+ u8 gender;
+ u8 level;
+ u8 * s;
+ const u8 * genderStr;
+ struct PokenavMonList * item = item0;
+ if (item->boxId == 14)
+ {
+ struct Pokemon * mon = &gPlayerParty[item->monId];
+ gender = GetMonGender(mon);
+ level = GetLevelFromMonExp(mon);
+ GetMonData(mon, MON_DATA_NICKNAME, gStringVar3);
+ }
+ else
+ {
+ struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId);
+ gender = GetBoxMonGender(mon);
+ level = GetLevelFromBoxMonExp(mon);
+ GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3);
+ }
+ StringGetEnd10(gStringVar3);
+ dest = sub_81DB494(dest, 1, gStringVar3, 60);
+ switch (gender)
+ {
+ default:
+ genderStr = gUnknown_086237F4;
+ break;
+ case MON_MALE:
+ genderStr = gUnknown_086237DC;
+ break;
+ case MON_FEMALE:
+ genderStr = gUnknown_086237E8;
+ break;
+ }
+ s = StringCopy(gStringVar1, genderStr);
+ *s++ = CHAR_SLASH;
+ *s++ = CHAR_SPECIAL_F9;
+ *s++ = 5; // LV
+ ConvertIntToDecimalStringN(s, level, STR_CONV_MODE_LEFT_ALIGN, 3);
+ dest = sub_81DB494(dest, 1, gStringVar1, 54);
+ ConvertIntToDecimalStringN(dest, item->unk6, STR_CONV_MODE_RIGHT_ALIGN, 2);
+}
diff --git a/src/random.c b/src/random.c
index f0b2d9e5f..b570a7bc3 100644
--- a/src/random.c
+++ b/src/random.c
@@ -8,8 +8,8 @@ EWRAM_DATA static u8 sUnknown = 0;
EWRAM_DATA static u32 sRandCount = 0;
// IWRAM common
-IWRAM_DATA u32 gRngValue;
-IWRAM_DATA u32 gRng2Value;
+u32 gRngValue;
+u32 gRng2Value;
u16 Random(void)
{
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 85b52e478..32e0404b9 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -82,21 +82,21 @@ union PlayerRecords
// Static RAM declarations
-static IWRAM_DATA bool8 gUnknown_03001130;
-static IWRAM_DATA struct SecretBase *sSecretBasesSave;
-static IWRAM_DATA TVShow *sTvShowsSave;
-static IWRAM_DATA PokeNews *sPokeNewsSave;
-static IWRAM_DATA OldMan *sOldManSave;
-static IWRAM_DATA struct EasyChatPair *sEasyChatPairsSave;
-static IWRAM_DATA struct RecordMixingDayCareMail *gUnknown_03001148;
-static IWRAM_DATA void *sBattleTowerSave;
-static IWRAM_DATA LilycoveLady *sLilycoveLadySave;
-static IWRAM_DATA void *sApprenticesSave;
-static IWRAM_DATA void *sBattleTowerSave_Duplicate;
-static IWRAM_DATA u32 sRecordStructSize;
-static IWRAM_DATA u8 gUnknown_03001160;
-static IWRAM_DATA u32 filler_03001164;
-static IWRAM_DATA struct PlayerHallRecords *gUnknown_03001168[3];
+static bool8 gUnknown_03001130;
+static struct SecretBase *sSecretBasesSave;
+static TVShow *sTvShowsSave;
+static PokeNews *sPokeNewsSave;
+static OldMan *sOldManSave;
+static struct EasyChatPair *sEasyChatPairsSave;
+static struct RecordMixingDayCareMail *gUnknown_03001148;
+static void *sBattleTowerSave;
+static LilycoveLady *sLilycoveLadySave;
+static void *sApprenticesSave;
+static void *sBattleTowerSave_Duplicate;
+static u32 sRecordStructSize;
+static u8 gUnknown_03001160;
+static u32 filler_03001164;
+static struct PlayerHallRecords *gUnknown_03001168[3];
static EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02039F9C = {0};
static EWRAM_DATA union PlayerRecords *sReceivedRecords = NULL;
@@ -701,10 +701,10 @@ static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSiz
}
memcpy(sLilycoveLadySave, (void *)lilycoveLady + recordSize * mixIndices[which], sizeof(LilycoveLady));
- sub_818DA78();
+ ResetLilycoveLadyForRecordMix();
if (dest != NULL)
{
- sub_818E570(dest);
+ QuizLadyClearQuestionForRecordMix(dest);
free(dest);
}
}
diff --git a/src/recorded_battle.c b/src/recorded_battle.c
index ac97dfcd6..9e03d57f6 100644
--- a/src/recorded_battle.c
+++ b/src/recorded_battle.c
@@ -100,8 +100,8 @@ EWRAM_DATA static u8 sApprenticeId = 0;
EWRAM_DATA static u16 sEasyChatSpeech[6] = {0};
EWRAM_DATA static u8 sBattleOutcome = 0;
-IWRAM_DATA static u8 sRecordMixFriendLanguage;
-IWRAM_DATA static u8 sApprenticeLanguage;
+static u8 sRecordMixFriendLanguage;
+static u8 sApprenticeLanguage;
// this file's functions
static u8 sub_8185278(u8 *arg0, u8 *arg1, u8 *arg2);
diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c
index d675c49d1..1fe9f2279 100644
--- a/src/reset_rtc_screen.c
+++ b/src/reset_rtc_screen.c
@@ -142,7 +142,7 @@ static const union AnimCmd sSpriteAnim_85104CC[] =
static const union AnimCmd sSpriteAnim_85104D4[] =
{
- ANIMCMD_FRAME(0, 158, .vFlip = TRUE),
+ ANIMCMD_FRAME(0, 30, .vFlip = TRUE),
ANIMCMD_JUMP(0),
};
diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c
index 95d63a323..beba742f5 100644
--- a/src/reset_save_heap.c
+++ b/src/reset_save_heap.c
@@ -14,7 +14,7 @@ void sub_81700F8(void)
imeBackup = REG_IME;
REG_IME = 0;
- RegisterRamReset(0x00000001);
+ RegisterRamReset(RESET_EWRAM);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
REG_IME = imeBackup;
gMain.inBattle = FALSE;
diff --git a/src/roamer.c b/src/roamer.c
index be45642e0..8a67234e3 100644
--- a/src/roamer.c
+++ b/src/roamer.c
@@ -67,7 +67,7 @@ static void CreateInitialRoamerMon(bool16 createLatios)
else
(&gSaveBlock1Ptr->roamer)->species = SPECIES_LATIOS;
- CreateMon(&gEnemyParty[0], (&gSaveBlock1Ptr->roamer)->species, 40, 0x20, 0, 0, 0, 0);
+ CreateMon(&gEnemyParty[0], (&gSaveBlock1Ptr->roamer)->species, 40, 0x20, 0, 0, OT_ID_PLAYER_ID, 0);
(&gSaveBlock1Ptr->roamer)->level = 40;
(&gSaveBlock1Ptr->roamer)->status = 0;
(&gSaveBlock1Ptr->roamer)->active = TRUE;
diff --git a/src/rock.c b/src/rock.c
index f05816362..6f6e20955 100644
--- a/src/rock.c
+++ b/src/rock.c
@@ -508,7 +508,7 @@ void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
sprite->pos1.x = 304;
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
sprite->data[5] = 1;
- sprite->oam.matrixNum = 8;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
}
else
{
diff --git a/src/rom_8034C54.c b/src/rom_8034C54.c
index a3707017e..42817fc2b 100644
--- a/src/rom_8034C54.c
+++ b/src/rom_8034C54.c
@@ -43,9 +43,9 @@ static bool32 SharesPalWithAnyActive(u32 id);
static void sub_8035648(void);
// iwram
-static IWRAM_DATA s32 gUnknown_03000DD4;
-static IWRAM_DATA s32 gUnknown_03000DD8;
-static IWRAM_DATA s32 gUnknown_03000DDC;
+static s32 gUnknown_03000DD4;
+static s32 gUnknown_03000DD8;
+static s32 gUnknown_03000DDC;
// ewram
static EWRAM_DATA struct UnkStruct1 *gUnknown_02022E10 = {0};
diff --git a/src/roulette.c b/src/roulette.c
index 25c079cda..662522aae 100644
--- a/src/roulette.c
+++ b/src/roulette.c
@@ -3994,8 +3994,8 @@ static void sub_8144514(struct Sprite *sprite)
if (gUnknown_0203AB88->var94 > 40.f)
return;
- gUnknown_0203AB88->var98 = -(4.0f / (float)gUnknown_0203AB88->var86);
- gUnknown_0203AB88->var90 = -(gUnknown_0203AB88->var8C / (float)gUnknown_0203AB88->var86);
+ gUnknown_0203AB88->var98 = -(4.0f / (float)(gUnknown_0203AB88->var86));
+ gUnknown_0203AB88->var90 = -(gUnknown_0203AB88->var8C / (float)(gUnknown_0203AB88->var86));
sprite->animNum = 2;
sprite->animBeginning = TRUE;
sprite->animEnded = FALSE;
@@ -4010,8 +4010,8 @@ static void sub_81445D8(struct Sprite *sprite)
return;
m4aSongNumStartOrChange(SE_TAMAKORO_E);
- gUnknown_0203AB88->var98 = -(20.0f / (float)gUnknown_0203AB88->var84);
- gUnknown_0203AB88->var90 = ((1.0f - gUnknown_0203AB88->var8C) / (float)gUnknown_0203AB88->var84);
+ gUnknown_0203AB88->var98 = -(20.0f / (float)(gUnknown_0203AB88->var84));
+ gUnknown_0203AB88->var90 = ((1.0f - gUnknown_0203AB88->var8C) / (float)(gUnknown_0203AB88->var84));
sprite->animNum = 1;
sprite->animBeginning = TRUE;
sprite->animEnded = FALSE;
diff --git a/src/roulette_util.c b/src/roulette_util.c
index 9531302d9..f1f04a73a 100755
--- a/src/roulette_util.c
+++ b/src/roulette_util.c
@@ -408,7 +408,8 @@ void UpdatePulseBlend(struct PulseBlend *pulseBlend)
}
}
break;
- case 2: // Flip back and forth
+ case (MODERN ? -2 : 2): // Flip back and forth
+ // This code is never reached in vanilla
if (pulseBlendPalette->fadeDirection)
pulseBlendPalette->blendCoeff = 0;
else
diff --git a/src/rtc.c b/src/rtc.c
index 37a06fe7e..b135a675a 100644
--- a/src/rtc.c
+++ b/src/rtc.c
@@ -4,10 +4,10 @@
#include "text.h"
// iwram bss
-IWRAM_DATA static u16 sErrorStatus;
-IWRAM_DATA static struct SiiRtcInfo sRtc;
-IWRAM_DATA static u8 sProbeResult;
-IWRAM_DATA static u16 sSavedIme;
+static u16 sErrorStatus;
+static struct SiiRtcInfo sRtc;
+static u8 sProbeResult;
+static u16 sSavedIme;
// iwram common
struct Time gLocalTime;
diff --git a/src/save.c b/src/save.c
index 45a75b5dc..cdfd2ae1d 100644
--- a/src/save.c
+++ b/src/save.c
@@ -626,7 +626,10 @@ static u16 CalculateChecksum(void *data, u16 size)
u32 checksum = 0;
for (i = 0; i < (size / 4); i++)
- checksum += *((u32 *)data)++;
+ {
+ checksum += *((u32 *)data);
+ data += sizeof(u32);
+ }
return ((checksum >> 16) + checksum);
}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 8d597b887..0326a56a4 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -62,7 +62,7 @@ static EWRAM_DATA u16 sMovingNpcMapBank = 0;
static EWRAM_DATA u16 sMovingNpcMapId = 0;
static EWRAM_DATA u16 sFieldEffectScriptId = 0;
-IWRAM_DATA u8 gUnknown_03000F30;
+static u8 gBrailleWindowId;
extern const SpecialFunc gSpecials[];
extern const u8 *gStdScripts[];
@@ -466,6 +466,9 @@ bool8 ScrCmd_addvar(struct ScriptContext *ctx)
{
u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx));
*ptr += ScriptReadHalfword(ctx);
+ // Note: addvar doesn't support adding from a variable in vanilla. If you were to
+ // add a VarGet() to the above, make sure you change the `addvar VAR_0x8006, 65535`
+ // in the contest scripts to `subvar VAR_0x8006, 1`, else contests will break.
return FALSE;
}
@@ -1102,7 +1105,7 @@ bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx)
+bool8 ScrCmd_copyobjectxytoperm(struct ScriptContext *ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
@@ -1515,13 +1518,13 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
yText = (yText - yWindow - 1) * 8;
winTemplate = CreateWindowTemplate(0, xWindow, yWindow + 1, width, height, 0xF, 0x1);
- gUnknown_03000F30 = AddWindow(&winTemplate);
- LoadUserWindowBorderGfx(gUnknown_03000F30, 0x214, 0xE0);
- DrawStdWindowFrame(gUnknown_03000F30, 0);
- PutWindowTilemap(gUnknown_03000F30);
- FillWindowPixelBuffer(gUnknown_03000F30, PIXEL_FILL(1));
- AddTextPrinterParameterized(gUnknown_03000F30, 6, gStringVar4, xText, yText, 0xFF, 0x0);
- CopyWindowToVram(gUnknown_03000F30, 3);
+ gBrailleWindowId = AddWindow(&winTemplate);
+ LoadUserWindowBorderGfx(gBrailleWindowId, 0x214, 0xE0);
+ DrawStdWindowFrame(gBrailleWindowId, 0);
+ PutWindowTilemap(gBrailleWindowId);
+ FillWindowPixelBuffer(gBrailleWindowId, PIXEL_FILL(1));
+ AddTextPrinterParameterized(gBrailleWindowId, 6, gStringVar4, xText, yText, 0xFF, 0x0);
+ CopyWindowToVram(gBrailleWindowId, 3);
return FALSE;
}
@@ -1630,7 +1633,7 @@ bool8 ScrCmd_buffercontesttype(struct ScriptContext *ctx)
u8 stringVarIndex = ScriptReadByte(ctx);
u16 index = VarGet(ScriptReadHalfword(ctx));
- sub_818E868(sScriptStringVars[stringVarIndex], index);
+ BufferContestName(sScriptStringVars[stringVarIndex], index);
return FALSE;
}
@@ -2254,8 +2257,8 @@ bool8 ScrCmd_setmonmetlocation(struct ScriptContext *ctx)
void sub_809BDB4(void)
{
- ClearStdWindowAndFrame(gUnknown_03000F30, 1);
- RemoveWindow(gUnknown_03000F30);
+ ClearStdWindowAndFrame(gBrailleWindowId, 1);
+ RemoveWindow(gBrailleWindowId);
}
bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx)
diff --git a/src/script.c b/src/script.c
index 27476dba3..34484561c 100644
--- a/src/script.c
+++ b/src/script.c
@@ -10,12 +10,12 @@
extern const u8* gUnknown_020375C0;
// ewram bss
-IWRAM_DATA static u8 sScriptContext1Status;
-IWRAM_DATA static u32 sUnusedVariable1;
-IWRAM_DATA static struct ScriptContext sScriptContext1;
-IWRAM_DATA static u32 sUnusedVariable2;
-IWRAM_DATA static struct ScriptContext sScriptContext2;
-IWRAM_DATA static bool8 sScriptContext2Enabled;
+static u8 sScriptContext1Status;
+static u32 sUnusedVariable1;
+static struct ScriptContext sScriptContext1;
+static u32 sUnusedVariable2;
+static struct ScriptContext sScriptContext2;
+static bool8 sScriptContext2Enabled;
extern ScrCmdFunc gScriptCmdTable[];
extern ScrCmdFunc gScriptCmdTableEnd[];
diff --git a/src/script_menu.c b/src/script_menu.c
index 082253e35..b0e0ec920 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -41,11 +41,11 @@ const struct MenuAction MultichoiceList_003[] =
const struct MenuAction MultichoiceList_004[] =
{
- {gUnknown_085EADA4, NULL},
- {gUnknown_085EADB5, NULL},
- {gUnknown_085EADC4, NULL},
- {gUnknown_085EADD5, NULL},
- {gUnknown_085EADE7, NULL},
+ {gText_CoolnessContest, NULL},
+ {gText_BeautyContest, NULL},
+ {gText_CutenessContest, NULL},
+ {gText_SmartnessContest, NULL},
+ {gText_ToughnessContest, NULL},
{gText_Exit, NULL},
};
@@ -1017,8 +1017,8 @@ const u8 *const gUnknown_0858BBEC[] =
EWRAM_DATA u8 gUnknown_02039F90 = 0;
-IWRAM_DATA u8 gUnknown_03001124[7];
-IWRAM_DATA u32 filler_0300112c;
+static u8 gUnknown_03001124[7];
+static u32 filler_0300112c;
static void Task_HandleMultichoiceInput(u8);
static void Task_HandleYesNoInput(u8);
diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c
index 2c7a9c775..51bd73b1c 100755
--- a/src/script_pokemon_util_80F87D8.c
+++ b/src/script_pokemon_util_80F87D8.c
@@ -551,7 +551,7 @@ u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 u
u8 heldItem[2];
struct Pokemon mon;
- CreateMon(&mon, species, level, 32, 0, 0, 0, 0);
+ CreateMon(&mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);
heldItem[0] = item;
heldItem[1] = item >> 8;
SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem);
@@ -624,7 +624,7 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item)
u8 heldItem[2];
ZeroEnemyPartyMons();
- CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0);
+ CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, OT_ID_PLAYER_ID, 0);
if (item)
{
heldItem[0] = item;
diff --git a/src/secret_base.c b/src/secret_base.c
index ac35a090a..12cb8cd61 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -71,7 +71,7 @@ static EWRAM_DATA struct SecretBaseRegistryMenu *sRegistryMenu = NULL;
static void Task_ShowSecretBaseRegistryMenu(u8 taskId);
static void BuildRegistryMenuItems(u8 taskId);
-static void RegistryMenu_OnCursorMove(int unused, bool8 flag, struct ListMenu *menu);
+static void RegistryMenu_OnCursorMove(s32 unused, bool8 flag, struct ListMenu *menu);
static void FinalizeRegistryMenu(u8 taskId);
static void AddRegistryMenuScrollArrows(u8 taskId);
static void HandleRegistryMenuInput(u8 taskId);
@@ -932,7 +932,7 @@ static void BuildRegistryMenuItems(u8 taskId)
gMultiuseListMenuTemplate.maxShowed = data[3];
}
-static void RegistryMenu_OnCursorMove(int unused, bool8 flag, struct ListMenu *menu)
+static void RegistryMenu_OnCursorMove(s32 unused, bool8 flag, struct ListMenu *menu)
{
if (flag != TRUE)
PlaySE(SE_SELECT);
diff --git a/src/shop.c b/src/shop.c
index 7f1a8f27e..bf15568fb 100755
--- a/src/shop.c
+++ b/src/shop.c
@@ -87,8 +87,8 @@ static void Task_ReturnToItemListAfterItemPurchase(u8 taskId);
static void Task_ReturnToItemListAfterDecorationPurchase(u8 taskId);
static void Task_HandleShopMenuBuy(u8 taskId);
static void Task_HandleShopMenuSell(u8 taskId);
-static void BuyMenuPrintItemDescriptionAndShowItemIcon(int item, bool8 onInit, struct ListMenu *list);
-static void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y);
+static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, struct ListMenu *list);
+static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y);
static const struct YesNoFuncTable sShopPurchaseYesNoFuncs =
{
@@ -521,7 +521,7 @@ static void BuyMenuSetListEntry(struct ListMenuItem *menuItem, u16 item, u8 *nam
menuItem->id = item;
}
-static void BuyMenuPrintItemDescriptionAndShowItemIcon(int item, bool8 onInit, struct ListMenu *list)
+static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, struct ListMenu *list)
{
const u8 *description;
if (onInit != TRUE)
@@ -550,7 +550,7 @@ static void BuyMenuPrintItemDescriptionAndShowItemIcon(int item, bool8 onInit, s
BuyMenuPrint(2, description, 3, 1, 0, 0);
}
-static void BuyMenuPrintPriceInList(u8 windowId, int item, u8 y)
+static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y)
{
u8 x;
diff --git a/src/slot_machine.c b/src/slot_machine.c
index b853daa39..003ac3327 100644
--- a/src/slot_machine.c
+++ b/src/slot_machine.c
@@ -350,7 +350,7 @@ static EWRAM_DATA struct SpriteSheet *sUnknown_0203AB30 = NULL;
static EWRAM_DATA struct SlotMachineEwramStruct *sSlotMachine = NULL;
// IWRAM bss
-static IWRAM_DATA struct SpriteFrameImage *gUnknown_03001188[26];
+static struct SpriteFrameImage *gUnknown_03001188[26];
// Const rom data.
extern const struct UnkStruct1 *const gUnknown_083ED048[];
diff --git a/src/sound.c b/src/sound.c
index 16f024858..dba4354df 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -19,11 +19,11 @@ EWRAM_DATA struct MusicPlayerInfo* gMPlay_PokemonCry = NULL;
EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0;
// iwram bss
-IWRAM_DATA static u16 sCurrentMapMusic;
-IWRAM_DATA static u16 sNextMapMusic;
-IWRAM_DATA static u8 sMapMusicState;
-IWRAM_DATA static u8 sMapMusicFadeInSpeed;
-IWRAM_DATA static u16 sFanfareCounter;
+static u16 sCurrentMapMusic;
+static u16 sNextMapMusic;
+static u8 sMapMusicState;
+static u8 sMapMusicFadeInSpeed;
+static u16 sFanfareCounter;
// iwram common
bool8 gDisableMusic;
diff --git a/src/sprite.c b/src/sprite.c
index d2ea7889c..e25eac62e 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -285,10 +285,10 @@ static const struct OamDimensions sOamDimensions[3][4] =
};
// iwram bss
-IWRAM_DATA static u16 sSpriteTileRangeTags[MAX_SPRITES];
-IWRAM_DATA static u16 sSpriteTileRanges[MAX_SPRITES * 2];
-IWRAM_DATA static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT];
-IWRAM_DATA static u16 sSpritePaletteTags[16];
+static u16 sSpriteTileRangeTags[MAX_SPRITES];
+static u16 sSpriteTileRanges[MAX_SPRITES * 2];
+static struct AffineAnimState sAffineAnimStates[OAM_MATRIX_COUNT];
+static u16 sSpritePaletteTags[16];
// iwram common
u32 gOamMatrixAllocBitmap;
diff --git a/src/starter_choose.c b/src/starter_choose.c
index 886daa45a..5524d407b 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -51,7 +51,7 @@ void sub_81346DC(struct Sprite *sprite);
void sub_813473C(struct Sprite *sprite);
void StarterPokemonSpriteCallback(struct Sprite *sprite);
-static IWRAM_DATA u16 sStarterChooseWindowId;
+static u16 sStarterChooseWindowId;
// .rodata
const u16 gBirchBagGrassPal[][16] =
diff --git a/src/strings.c b/src/strings.c
index 8463cfacb..ebc995f13 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -610,11 +610,11 @@ const u8 gUnknown_085EAD72[] = _("What's a CONTEST?");
const u8 gUnknown_085EAD84[] = _("Types of CONTESTS");
const u8 gUnknown_085EAD96[] = _("Ranks");
const u8 gUnknown_085EAD9C[] = _("Judging");
-const u8 gUnknown_085EADA4[] = _("COOLNESS CONTEST");
-const u8 gUnknown_085EADB5[] = _("BEAUTY CONTEST");
-const u8 gUnknown_085EADC4[] = _("CUTENESS CONTEST");
-const u8 gUnknown_085EADD5[] = _("SMARTNESS CONTEST");
-const u8 gUnknown_085EADE7[] = _("TOUGHNESS CONTEST");
+const u8 gText_CoolnessContest[] = _("COOLNESS CONTEST");
+const u8 gText_BeautyContest[] = _("BEAUTY CONTEST");
+const u8 gText_CutenessContest[] = _("CUTENESS CONTEST");
+const u8 gText_SmartnessContest[] = _("SMARTNESS CONTEST");
+const u8 gText_ToughnessContest[] = _("TOUGHNESS CONTEST");
const u8 gUnknown_085EADF9[] = _("DECORATION");
const u8 gUnknown_085EAE04[] = _("PACK UP");
const u8 gUnknown_085EAE0C[] = _("COUNT");
@@ -1591,23 +1591,23 @@ const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}'s nickname?");
const u8 gText_TellHimTheWords[] = _("Tell him the words.");
const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK");
const u8 gText_CallCantBeMadeHere[] = _("A call can't be made from here.");
-const u8 gUnknown_085EEB2B[] = _("HANDSOME");
-const u8 gUnknown_085EEB34[] = _("VINNY");
-const u8 gUnknown_085EEB3A[] = _("MOREME");
-const u8 gUnknown_085EEB41[] = _("IRONHARD");
-const u8 gUnknown_085EEB4A[] = _("MUSCLE");
-const u8 gUnknown_085EEB51[] = _("coolness");
-const u8 gUnknown_085EEB5A[] = _("beauty");
-const u8 gUnknown_085EEB61[] = _("cuteness");
-const u8 gUnknown_085EEB6A[] = _("smartness");
-const u8 gUnknown_085EEB74[] = _("toughness");
-const u8 gText_Lady2[] = _("Lady");
-const u8 gUnknown_085EEB83[] = _("slippery");
-const u8 gUnknown_085EEB8C[] = _("roundish");
-const u8 gUnknown_085EEB95[] = _("wham-ish");
-const u8 gUnknown_085EEB9E[] = _("shiny");
-const u8 gUnknown_085EEBA4[] = _("sticky");
-const u8 gUnknown_085EEBAB[] = _("pointy");
+const u8 gText_ContestLady_Handsome[] = _("HANDSOME");
+const u8 gText_ContestLady_Vinny[] = _("VINNY");
+const u8 gText_ContestLady_Moreme[] = _("MOREME");
+const u8 gText_ContestLady_Ironhard[] = _("IRONHARD");
+const u8 gText_ContestLady_Muscle[] = _("MUSCLE");
+const u8 gText_ContestLady_Coolness[] = _("coolness");
+const u8 gText_ContestLady_Beauty[] = _("beauty");
+const u8 gText_ContestLady_Cuteness[] = _("cuteness");
+const u8 gText_ContestLady_Smartness[] = _("smartness");
+const u8 gText_ContestLady_Toughness[] = _("toughness");
+const u8 gText_QuizLady_Lady[] = _("Lady");
+const u8 gText_FavorLady_Slippery[] = _("slippery");
+const u8 gText_FavorLady_Roundish[] = _("roundish");
+const u8 gText_FavorLady_Whamish[] = _("wham-ish");
+const u8 gText_FavorLady_Shiny[] = _("shiny");
+const u8 gText_FavorLady_Sticky[] = _("sticky");
+const u8 gText_FavorLady_Pointy[] = _("pointy");
const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON");
const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON.");
const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON.");
diff --git a/src/text.c b/src/text.c
index 43834eab4..7e4fa7104 100644
--- a/src/text.c
+++ b/src/text.c
@@ -197,7 +197,7 @@ bool16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u8 speed, voi
gTempTextPrinter.textSpeed = 0;
for (j = 0; j < 0x400; ++j)
{
- if ((u32)RenderFont(&gTempTextPrinter) == 1)
+ if (RenderFont(&gTempTextPrinter) == 1)
break;
}
@@ -462,6 +462,108 @@ u8 GetLastTextColor(u8 colorType)
}
}
+#ifdef NONMATCHING
+
+#define GLYPH_COPY(fromY_, toY_, fromX_, toX_, unk) \
+{ \
+ u32 i, j, *ptr, toY, fromX, toX, r5, toOrr, bits; \
+ u8 *dst; \
+ \
+ j = fromX_; \
+ i = fromY_; \
+ ptr = unk; \
+ toX = toX_; \
+ toY = toY_; \
+ fromX = fromX_; \
+ \
+ for (; i < toY; i++) \
+ { \
+ r5 = *(ptr++); \
+ for (j = fromX; j < toX; j++) \
+ { \
+ toOrr = r5 & 0xF; \
+ if (toOrr) \
+ { \
+ dst = windowTiles + ((j / 8) * 32) + ((j & 7) / 2) + ((i / 8) * widthOffset) + ((i & 7) * 4); \
+ bits = ((j & 1) << 2); \
+ *dst = ((toOrr << bits) | (*dst & (0xF0 >> bits))); \
+ } \
+ r5 >>= 4; \
+ } \
+ } \
+}
+
+void CopyGlyphToWindow(struct TextPrinter *textPrinter)
+{
+ struct Window *win;
+ struct WindowTemplate *winTempl;
+ struct Struct_03002F90 *unkStruct;
+ u32 currX, widthOffset, currY;
+ s32 r4, r0;
+ u8 *windowTiles;
+
+ win = &gWindows[textPrinter->printerTemplate.windowId];
+ winTempl = &win->window;
+
+ r4 = (winTempl->width * 8) - textPrinter->printerTemplate.currentX;
+ if (r4 > gUnknown_03002F90.unk80)
+ r4 = gUnknown_03002F90.unk80;
+
+ r0 = (winTempl->height * 8) - textPrinter->printerTemplate.currentY;
+ if (r0 > gUnknown_03002F90.unk81)
+ r0 = gUnknown_03002F90.unk81;
+
+ currX = textPrinter->printerTemplate.currentX;
+ currY = textPrinter->printerTemplate.currentY;
+ unkStruct = &gUnknown_03002F90;
+ windowTiles = win->tileData;
+ widthOffset = winTempl->width * 32;
+
+ if (r4 <= 8)
+ {
+ if (r0 <= 8)
+ {
+ GLYPH_COPY(currY, currY + r0, currX, currX + r4, unkStruct->unk0);
+ }
+ else
+ {
+ u32 temp;
+ GLYPH_COPY(currY, currY + 8, currX, currX + r4, unkStruct->unk0);
+
+ temp = currY + 8;
+ GLYPH_COPY(temp, (temp - 8) + r0, currX, currX + r4, unkStruct->unk40);
+ }
+ }
+ else
+ {
+ if (r0 <= 8)
+ {
+ u32 temp;
+ GLYPH_COPY(currY, currY + r0, currX, currX + 8, unkStruct->unk0);
+
+ temp = currX + 8;
+ GLYPH_COPY(currY, currY + r0, temp, (temp - 8) + r4, unkStruct->unk20);
+ }
+ else
+ {
+ u32 temp;
+ GLYPH_COPY(currY, currY + 8, currX, currX + 8, unkStruct->unk0);
+
+ temp = currX + 8;
+ GLYPH_COPY(currY, currY + 8, temp, temp - 8 + r4, unkStruct->unk20);
+
+ temp = currY + 8;
+ GLYPH_COPY(temp, temp - 8 + r0, currX, currX + 8, unkStruct->unk40);
+ {
+ u32 tempX, tempY;
+ tempX = currX + 8;
+ tempY = currY + 8;
+ GLYPH_COPY(tempY, tempY - 8 + r0, tempX, tempX - 8 + r4, unkStruct->unk60);
+ }
+ }
+ }
+}
+#else
NAKED
void CopyGlyphToWindow(struct TextPrinter *x)
{
@@ -1164,6 +1266,7 @@ _080052AA:\n\
bx r0\n\
.pool");
}
+#endif // NONMATCHING
void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
{
diff --git a/src/trade.c b/src/trade.c
index f7650ff03..d95e4ebf5 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -158,6 +158,9 @@ static EWRAM_DATA struct {
/*0xFE*/ u8 unk_FE;
} *gUnknown_020322A0 = {NULL};
+#if !defined(NONMATCHING) && MODERN
+#define static
+#endif
static bool32 sub_8077260(void);
static void sub_80773D0(void);
static void sub_807811C(void);
@@ -1548,7 +1551,7 @@ static void sub_80773D0(void)
for (i = 0; i < PARTY_SIZE; i++)
{
- CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, 0, 0);
+ CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0);
}
sub_807A19C(0);
@@ -2779,7 +2782,7 @@ static void sub_8079398(void)
}
}
-static void DisplayMessageAndContinueTask(void)
+static void Wait2SecondsAndCreateYesNoMenu(void)
{
gUnknown_0203229C->unk_A8++;
@@ -2918,7 +2921,7 @@ static void sub_80795AC(void)
sub_80781C8();
break;
case 14:
- DisplayMessageAndContinueTask();
+ Wait2SecondsAndCreateYesNoMenu();
break;
case 15:
sub_8079034();
@@ -5829,7 +5832,7 @@ static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade)
u8 isMail;
struct Pokemon *pokemon = &gEnemyParty[0];
- CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId);
+ CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, OT_ID_PRESET, inGameTrade->otId);
SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]);
SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]);
diff --git a/src/trainer_hill.c b/src/trainer_hill.c
index 650a748cb..77c8fcb53 100644
--- a/src/trainer_hill.c
+++ b/src/trainer_hill.c
@@ -915,7 +915,7 @@ void SetHillTrainerFlag(void)
}
}
-const u8 *sub_81D62AC(void)
+const u8 *GetTrainerHillTrainerScript(void)
{
return EventScript_2C83F0;
}
diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c
index 6824e8747..047783a85 100644
--- a/src/trainer_pokemon_sprites.c
+++ b/src/trainer_pokemon_sprites.c
@@ -104,7 +104,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8
if (paletteTag == 0xFFFF)
{
sCreatingSpriteTemplate.paletteTag = 0xFFFF;
- LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20);
+ LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20);
}
else
{
@@ -130,7 +130,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8
static void LoadPicPaletteBySlot(u16 species, u32 otId, u32 personality, u8 paletteSlot, bool8 isTrainer)
{
if (!isTrainer)
- LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), paletteSlot * 0x10, 0x20);
+ LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, otId, personality), paletteSlot * 0x10, 0x20);
else
LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, paletteSlot * 0x10, 0x20);
}
diff --git a/src/trainer_see.c b/src/trainer_see.c
index 9925aa6bc..22b256a99 100644
--- a/src/trainer_see.c
+++ b/src/trainer_see.c
@@ -235,7 +235,7 @@ static u8 CheckTrainer(u8 eventObjectId)
u8 approachDistance;
if (InTrainerHill() == TRUE)
- scriptPtr = sub_81D62AC();
+ scriptPtr = GetTrainerHillTrainerScript();
else
scriptPtr = GetEventObjectScriptPointerByEventObjectId(eventObjectId);
diff --git a/src/tv.c b/src/tv.c
index dfd26fd0d..ef826a4af 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -56,9 +56,9 @@ struct {
u16 move;
} sTV_SecretBaseVisitMonsTemp[10];
-IWRAM_DATA u8 sTVShowMixingNumPlayers;
-IWRAM_DATA u8 sTVShowNewsMixingNumPlayers;
-IWRAM_DATA s8 sTVShowMixingCurSlot;
+static u8 sTVShowMixingNumPlayers;
+static u8 sTVShowNewsMixingNumPlayers;
+static s8 sTVShowMixingCurSlot;
EWRAM_DATA u16 sPokemonAnglerSpecies = 0;
EWRAM_DATA u16 sPokemonAnglerAttemptCounters = 0;
@@ -69,10 +69,9 @@ EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0;
EWRAM_DATA u8 sTVSecretBaseSecretsRandomValues[3] = {};
// Static ROM declarations
-
-extern const u8 *const sTVBravoTrainerTextGroup[];
-extern const u8 *const sTVBravoTrainerBattleTowerTextGroup[];
-
+#if !defined(NONMATCHING) && MODERN
+#define static
+#endif
void ClearPokemonNews(void);
u8 GetTVChannelByShowType(u8 kind);
u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void);
@@ -1658,12 +1657,12 @@ void PutLilycoveContestLadyShowOnTheAir(void)
if (gSpecialVar_Result != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
- sub_818E848(&show->contestLiveUpdates2.language);
+ BufferContestLadyLanguage(&show->contestLiveUpdates2.language);
show->contestLiveUpdates2.pokemonNameLanguage = LANGUAGE_ENGLISH;
show->contestLiveUpdates2.kind = TVSHOW_CONTEST_LIVE_UPDATES_2;
show->contestLiveUpdates2.active = TRUE;
- sub_818E81C(show->contestLiveUpdates2.playerName);
- sub_818E7E0(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname);
+ BufferContestLadyPlayerName(show->contestLiveUpdates2.playerName);
+ BufferContestLadyMonName(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname);
show->contestLiveUpdates2.pokeblockState = sub_818E880();
tv_store_id_2x(show);
}
@@ -5601,7 +5600,7 @@ static void DoTVShowPokemonContestLiveUpdates(void)
switch (state)
{
case 0:
- sub_818E868(gStringVar1, show->contestLiveUpdates.category);
+ BufferContestName(gStringVar1, show->contestLiveUpdates.category);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
if (show->contestLiveUpdates.round1Rank == show->contestLiveUpdates.round2Rank)
@@ -7721,7 +7720,7 @@ static void DoTVShowPokemonContestLiveUpdates2(void)
switch (state)
{
case 0:
- sub_818E868(gStringVar1, show->contestLiveUpdates2.contestCategory);
+ BufferContestName(gStringVar1, show->contestLiveUpdates2.contestCategory);
if (show->contestLiveUpdates2.pokeblockState == 1)
{
sTVShowState = 1;
diff --git a/src/union_room.c b/src/union_room.c
index 6e7c0965d..01288c8cc 100644
--- a/src/union_room.c
+++ b/src/union_room.c
@@ -1,53 +1,54 @@
#include "global.h"
-#include "window.h"
+#include "alloc.h"
+#include "battle.h"
+#include "berry_crush.h"
#include "bg.h"
-#include "random.h"
-#include "string_util.h"
-#include "task.h"
+#include "cable_club.h"
+#include "data.h"
+#include "decompress.h"
+#include "dodrio_berry_picking.h"
+#include "dynamic_placeholder_text_util.h"
+#include "easy_chat.h"
#include "event_data.h"
+#include "event_obj_lock.h"
+#include "field_control_avatar.h"
+#include "field_player_avatar.h"
+#include "field_screen_effect.h"
+#include "field_weather.h"
+#include "international_string_util.h"
+#include "librfu.h"
#include "link.h"
#include "link_rfu.h"
-#include "librfu.h"
-#include "alloc.h"
-#include "menu.h"
#include "list_menu.h"
+#include "load_save.h"
+#include "menu.h"
#include "menu_helpers.h"
-#include "script.h"
-#include "sound.h"
-#include "constants/songs.h"
-#include "constants/game_stat.h"
-#include "constants/maps.h"
-#include "constants/species.h"
-#include "constants/rgb.h"
-#include "constants/battle_frontier.h"
-#include "trade.h"
-#include "trainer_card.h"
+#include "mevent.h"
+#include "mystery_gift.h"
#include "overworld.h"
-#include "battle.h"
-#include "load_save.h"
-#include "cable_club.h"
-#include "field_control_avatar.h"
-#include "party_menu.h"
-#include "field_weather.h"
#include "palette.h"
-#include "decompress.h"
-#include "start_menu.h"
-#include "data.h"
-#include "field_screen_effect.h"
+#include "party_menu.h"
+#include "pokemon_jump.h"
+#include "random.h"
+#include "script.h"
#include "script_pokemon_util_80F87D8.h"
-#include "international_string_util.h"
-#include "field_player_avatar.h"
+#include "sound.h"
+#include "start_menu.h"
+#include "string_util.h"
#include "strings.h"
-#include "mevent.h"
-#include "dynamic_placeholder_text_util.h"
+#include "task.h"
+#include "trade.h"
+#include "trainer_card.h"
#include "union_room.h"
-#include "easy_chat.h"
-#include "event_obj_lock.h"
#include "union_room_chat.h"
-#include "berry_crush.h"
-#include "mystery_gift.h"
#include "union_room_player_avatar.h"
-#include "pokemon_jump.h"
+#include "window.h"
+#include "constants/battle_frontier.h"
+#include "constants/game_stat.h"
+#include "constants/maps.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+#include "constants/species.h"
EWRAM_DATA u8 gUnknown_02022C20[12] = {};
EWRAM_DATA u8 gUnknown_02022C2C = 0;
@@ -60,9 +61,9 @@ EWRAM_DATA u8 gUnknown_02022C3E = 0;
EWRAM_DATA struct TradeUnkStruct gUnknown_02022C40 = {};
// IWRAM vars
-IWRAM_DATA struct UnkStruct_Leader *gUnknown_03000DA0;
-IWRAM_DATA struct UnkStruct_Group *gUnknown_03000DA4;
-IWRAM_DATA struct UnkStruct_URoom *gUnknown_03000DA8;
+static struct UnkStruct_Leader *gUnknown_03000DA0;
+static struct UnkStruct_Group *gUnknown_03000DA4;
+static struct UnkStruct_URoom *gUnknown_03000DA8;
// this file's functions
void sub_80173E0(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5);
@@ -98,7 +99,6 @@ bool32 sub_8017678(struct UnkStruct_Shared *arg0, struct UnkStruct_Shared *arg1)
u32 sub_8018120(struct TradeUnkStruct *arg0, u8 multiplayerId);
void sub_801807C(struct TradeUnkStruct *arg0);
void sub_801AC54(void);
-void sub_802493C(u8 monId, MainCallback callback);
void sub_80149D8(void);
void MG_DrawTextBorder(u8 windowId);
s8 mevent_message_print_and_prompt_yes_no(u8 *textState, u8 *arg1, u8 arg2, const u8 *str);
diff --git a/src/union_room_battle.c b/src/union_room_battle.c
index 321b49092..79d12291d 100644
--- a/src/union_room_battle.c
+++ b/src/union_room_battle.c
@@ -40,7 +40,7 @@ struct UnkStruct_2022C6C
s16 a0;
};
-IWRAM_DATA struct UnkStruct_3000DAC * gUnknown_03000DAC;
+static struct UnkStruct_3000DAC * gUnknown_03000DAC;
EWRAM_DATA struct UnkStruct_2022C6C * gUnknown_02022C6C = NULL;
diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c
index f28b651cc..655f38def 100644
--- a/src/use_pokeblock.c
+++ b/src/use_pokeblock.c
@@ -85,6 +85,10 @@ struct UsePokeblockStruct
/*0x7FD0*/ struct UsePokeblockSubStruct info;
};
+#define TAG_TILE_CONDITION_UP_DOWN 0
+#define TAG_PAL_CONDITION_UP_DOWN 0
+#define TAG_PAL_POKEBLOCK_CONDITION 1
+
extern void sub_81D21DC(u8);
// this file's functions
@@ -130,26 +134,12 @@ static u8 sub_8168048(void);
void sub_8168180(struct Sprite *sprite);
void sub_81681B4(struct Sprite *sprite);
void sub_8168168(struct Sprite *sprite);
+void sub_8168374(struct Sprite *sprite);
-extern const struct BgTemplate gUnknown_085DFCCC[4];
-extern const struct WindowTemplate gUnknown_085DFCDC[];
-extern const struct WindowTemplate sUsePokeblockYesNoWinTemplate[];
-extern const u8* sContestStatNames[];
-extern const u32 gUnknown_085DFCB0[];
-extern const u8 gUnknown_085DFCC4[];
-extern const struct SpriteSheet gSpriteSheet_ConditionUpDown;
-extern const struct SpritePalette gSpritePalette_ConditionUpDown;
-extern const struct SpriteTemplate gSpriteTemplate_085DFD5C;
-extern const s16 gUnknown_085DFD28[][2];
-extern const u32 gUnknown_085DFB60[];
-extern const u32 gUnknown_085DFA80[];
-extern const u32 gUnknown_085DFA60[];
-extern const u32 gUnknown_085DFC0C[];
extern const u16 gUnknown_086231E8[];
extern const u16 gUnknown_08623208[];
-extern const u8 gUnknown_085DFCC9[];
-extern const struct SpritePalette gUnknown_085DFDB8;
-extern const struct SpriteTemplate gUnknown_085DFDA0;
+extern const struct SpritePalette gSpritePalette_085DFDB8;
+extern const struct SpriteTemplate gSpriteTemplate_085DFDA0;
// ram variables
EWRAM_DATA struct UsePokeblockSubStruct *gUnknown_0203BC90 = NULL;
@@ -165,6 +155,245 @@ EWRAM_DATA struct UsePokeblockStruct *gUnknown_0203BCAC = NULL;
// const rom data
// todo: make it static once the file is decompiled
+const u32 gUnknown_085DFA60[] = INCBIN_U32("graphics/interface/85DFA60.bin");
+const u32 gUnknown_085DFA80[] = INCBIN_U32("graphics/interface/85DFA80.4bpp");
+const u32 gUnknown_085DFB60[] = INCBIN_U32("graphics/interface/85DFB60.bin");
+const u32 gUnknown_085DFC0C[] = INCBIN_U32("graphics/interface/85DFC0C.bin");
+
+const u32 gUnknown_085DFCB0[] =
+{
+ MON_DATA_COOL,
+ MON_DATA_TOUGH,
+ MON_DATA_SMART,
+ MON_DATA_CUTE,
+ MON_DATA_BEAUTY
+};
+
+const u8 gUnknown_085DFCC4[] =
+{
+ 0, // Spicy/Cool
+ 4, // Dry/Beauty
+ 3, // Sweet/Cute
+ 2, // Bitter/Smart
+ 1 // Sour/Tough
+};
+
+const u8 gUnknown_085DFCC9[] =
+{
+ 0,
+ 8,
+ 1
+};
+
+const struct BgTemplate gUnknown_085DFCCC[4] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 0x1F,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 0x1E,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 3,
+ .baseTile = 0
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 0x1D,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 2,
+ .baseTile = 0x100
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 0x17,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0
+ }
+};
+
+const struct WindowTemplate gUnknown_085DFCDC[] =
+{
+ {
+ .bg = 0,
+ .tilemapLeft = 0xD,
+ .tilemapTop = 1,
+ .width = 0xD,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 1
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 0,
+ .tilemapTop = 0xE,
+ .width = 0xB,
+ .height = 2,
+ .paletteNum = 0xF,
+ .baseBlock = 0x35
+ },
+ {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 0x11,
+ .width = 0x1C,
+ .height = 2,
+ .paletteNum = 0xF,
+ .baseBlock = 0x4B
+ },
+ DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate sUsePokeblockYesNoWinTemplate =
+{
+ .bg = 0,
+ .tilemapLeft = 0x18,
+ .tilemapTop = 0xB,
+ .width = 5,
+ .height = 4,
+ .paletteNum = 0xF,
+ .baseBlock = 0x83
+};
+
+const u8 *const sContestStatNames[] =
+{
+ gText_Coolness,
+ gText_Toughness,
+ gText_Smartness,
+ gText_Cuteness,
+ gText_Beauty3
+};
+
+const struct SpriteSheet gSpriteSheet_ConditionUpDown =
+{
+ gUsePokeblockUpDown_Gfx, 0x200, TAG_TILE_CONDITION_UP_DOWN
+};
+
+const struct SpritePalette gSpritePalette_ConditionUpDown =
+{
+ gUsePokeblockUpDown_Pal, TAG_PAL_CONDITION_UP_DOWN
+};
+
+const s16 gUnknown_085DFD28[][2] =
+{
+ {0x9C, 0x24},
+ {0x75, 0x3B},
+ {0x75, 0x76},
+ {0xC5, 0x76},
+ {0xC5, 0x3B}
+};
+
+const struct OamData gOamData_085DFD3C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+};
+
+const union AnimCmd gSpriteAnim_085DFD44[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_085DFD4C[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_085DFD54[] =
+{
+ gSpriteAnim_085DFD44,
+ gSpriteAnim_085DFD4C
+};
+
+const struct SpriteTemplate gSpriteTemplate_085DFD5C =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gOamData_085DFD3C,
+ .anims = gSpriteAnimTable_085DFD54,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct OamData gOamData_085DFD74 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+};
+
+const union AnimCmd gSpriteAnim_085DFD7C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_085DFD84[] =
+{
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_085DFD8C[] =
+{
+ ANIMCMD_FRAME(64, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_085DFD94[] =
+{
+ gSpriteAnim_085DFD7C,
+ gSpriteAnim_085DFD84,
+ gSpriteAnim_085DFD8C
+};
+
+const struct SpriteTemplate gSpriteTemplate_085DFDA0 =
+{
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &gOamData_085DFD74,
+ .anims = gSpriteAnimTable_085DFD94,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8168374,
+};
+
+const struct SpritePalette gSpritePalette_085DFDB8 =
+{
+ gUsePokeblockCondition_Pal, TAG_PAL_POKEBLOCK_CONDITION
+};
+
// code
void ChooseMonToGivePokeblock(struct Pokeblock *pokeblock, void (*callback)(void))
{
@@ -618,7 +847,7 @@ void sub_8166D44(void)
AddTextPrinterParameterized(2, 1, gStringVar4, 0, 1, 0, NULL);
PutWindowTilemap(2);
CopyWindowToVram(2, 3);
- CreateYesNoMenu(sUsePokeblockYesNoWinTemplate, 151, 14, 0);
+ CreateYesNoMenu(&sUsePokeblockYesNoWinTemplate, 151, 14, 0);
}
s8 sub_8166DE4(void)
@@ -1373,7 +1602,7 @@ static void sub_8168248(void)
struct CompressedSpriteSheet spriteSheet;
struct SpritePalette spritePalette;
- spritePalette = gUnknown_085DFDB8;
+ spritePalette = gSpritePalette_085DFDB8;
spriteSheet.data = gUsePokeblockCondition_Gfx;
spriteSheet.size = 0x800;
spriteSheet.tag = 1;
@@ -1388,7 +1617,7 @@ static void sub_8168294(void)
int yStart = 17;
int var = 8;
struct Sprite **sprites = gUnknown_0203BCAC->field_7B44;
- const struct SpriteTemplate *template = &gUnknown_085DFDA0;
+ const struct SpriteTemplate *template = &gSpriteTemplate_085DFDA0;
for (i = 0, xDiff = 64, xStart = -96; i < 2; i++)
{