summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_anim_effects_1.c14
-rwxr-xr-xsrc/battle_anim_effects_2.c4
-rwxr-xr-xsrc/battle_anim_effects_3.c8
-rw-r--r--src/battle_interface.c2
-rw-r--r--src/contest_painting.c2
-rw-r--r--src/crt0.s199
-rw-r--r--src/data/lilycove_lady.h470
-rw-r--r--src/easy_chat.c30
-rw-r--r--src/electric.c4
-rw-r--r--src/fight.c4
-rw-r--r--src/flying.c2
-rw-r--r--src/ghost.c2
-rwxr-xr-xsrc/item_menu.c24
-rw-r--r--src/libagbsyscall.s116
-rw-r--r--src/libgcnmultiboot.s550
-rw-r--r--src/lilycove_lady.c947
-rw-r--r--src/m4a_1.s1934
-rw-r--r--src/new_game.c2
-rwxr-xr-xsrc/party_menu.c2
-rw-r--r--src/pokenav_match_call_data.c116
-rwxr-xr-xsrc/pokenav_unk_3.c14
-rw-r--r--src/record_mixing.c4
-rw-r--r--src/rock.c2
-rw-r--r--src/scrcmd.c2
-rw-r--r--src/script_menu.c10
-rw-r--r--src/strings.c44
-rw-r--r--src/tv.c10
27 files changed, 3801 insertions, 717 deletions
diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c
index b3a67a509..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;
@@ -5387,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
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 5d79a9e6b..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;
}
@@ -4167,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
@@ -4317,7 +4317,7 @@ 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;
}
@@ -4545,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_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/contest_painting.c b/src/contest_painting.c
index 66127cbbc..1b95e1ed9 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -292,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);
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/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/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/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/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/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/ghost.c b/src/ghost.c
index dd29fb7ca..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
{
diff --git a/src/item_menu.c b/src/item_menu.c
index 5b47a567b..12f03b328 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -118,9 +118,9 @@ 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);
@@ -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;
}
@@ -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/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/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/new_game.c b/src/new_game.c
index ee67da9be..b4d9ba9b3 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -198,7 +198,7 @@ void NewGameInitData(void)
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
ResetMiniGamesResults();
copy_strings_to_sav1();
- SetLilycoveLady();
+ InitLilycoveLady();
ResetAllApprenticeData();
ClearRankingHallRecords();
InitMatchCallCounters();
diff --git a/src/party_menu.c b/src/party_menu.c
index dd0a4dabd..f4b749bde 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -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/pokenav_match_call_data.c b/src/pokenav_match_call_data.c
index d2d89babf..5379ee88e 100644
--- a/src/pokenav_match_call_data.c
+++ b/src/pokenav_match_call_data.c
@@ -6,7 +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
@@ -94,11 +96,11 @@ typedef union {
const struct MatchCallStruct5 *type5;
} match_call_t;
-struct UnkStruct_08625388 {
+struct MatchCallOverride {
u16 idx;
- u16 v2;
- u32 v4;
- const u8 *v8[4];
+ u16 facilityClass;
+ u32 flag;
+ const u8 *flavorTexts[4];
};
// Static RAM declarations
@@ -123,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);
@@ -423,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,
@@ -452,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,
@@ -727,27 +729,27 @@ 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) = {
@@ -774,12 +776,12 @@ static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = {
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) = {
@@ -806,11 +808,11 @@ static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8
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
@@ -981,7 +983,7 @@ 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;
@@ -990,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++)
{
@@ -1000,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;
}
@@ -1210,7 +1212,7 @@ static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const
*name = trainer->trainerName;
}
-const u8 *sub_81D1B40(u32 idx, u32 offset)
+const u8 *MatchCall_GetOverrideFlavorText(u32 idx, u32 offset)
{
u32 i;
@@ -1224,24 +1226,24 @@ const u8 *sub_81D1B40(u32 idx, u32 offset)
break;
if (sMatchCallCheckPageOverrides[i + 1].idx != idx)
break;
- if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4))
+ if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].flag))
break;
i++;
}
- return sMatchCallCheckPageOverrides[i].v8[offset];
+ return sMatchCallCheckPageOverrides[i].flavorTexts[offset];
}
}
return NULL;
}
-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_unk_3.c b/src/pokenav_unk_3.c
index ffb1e0a4a..c66434192 100755
--- a/src/pokenav_unk_3.c
+++ b/src/pokenav_unk_3.c
@@ -84,7 +84,7 @@ static u32 sub_81CAB44(struct Pokenav3Struct *state)
state->callback = sub_81CAC04;
state->unk0 = 0;
selectedMatchCall = GetSelectedMatchCall();
- if (!state->unk1C[selectedMatchCall].boxId || sub_81D17E8(state->unk1C[selectedMatchCall].unk6))
+ if (!state->unk1C[selectedMatchCall].boxId || MatchCall_HasCheckPage(state->unk1C[selectedMatchCall].unk6))
{
state->unk4 = gUnknown_0862250A;
state->unk2 = 2;
@@ -212,7 +212,7 @@ static u32 sub_81CAD20(s32 taskState)
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;
@@ -331,7 +331,7 @@ int sub_81CAF04(int index)
return gTrainers[index].trainerPic;
}
- index = sub_81D1BD0(var0);
+ index = MatchCall_GetOverrideFacilityClass(var0);
return gFacilityClassToPicIndex[index];
}
@@ -358,7 +358,7 @@ const u8 *sub_81CAFD8(int index, int textType)
{
var0 = MatchCall_GetRematchTableIdx(state->unk1C[index].unk6);
if (var0 == REMATCH_TABLE_ENTRIES)
- return sub_81D1B40(state->unk1C[index].unk6, textType);
+ return MatchCall_GetOverrideFlavorText(state->unk1C[index].unk6, textType);
}
else
{
@@ -426,7 +426,7 @@ int sub_81CB0E4(int index)
{
if (!state->unk1C[index].boxId)
return count;
- if (sub_81D17E8(state->unk1C[index].unk6))
+ if (MatchCall_HasCheckPage(state->unk1C[index].unk6))
return count;
count++;
@@ -443,7 +443,7 @@ int sub_81CB128(int index)
{
if (!state->unk1C[index].boxId)
return count;
- if (sub_81D17E8(state->unk1C[index].unk6))
+ 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))
{
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 6cb145c80..32e0404b9 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -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/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/scrcmd.c b/src/scrcmd.c
index e31be848a..0326a56a4 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1633,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;
}
diff --git a/src/script_menu.c b/src/script_menu.c
index b17d3df38..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},
};
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/tv.c b/src/tv.c
index b4c8463fd..ef826a4af 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -1657,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);
}
@@ -5600,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)
@@ -7720,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;